diff -ruN 1.5.2/readme.html 2.0.4/readme.html
--- 1.5.2/readme.html	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/readme.html	2005-12-21 23:05:52.000000000 -0600
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>WordPress &rsaquo; ReadMe</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css" media="screen">
+	<!--
+	html {
+		background: #eee;
+	}
+	body {
+		background: #fff;
+		color: #000;
+		font-family: Georgia, "Times New Roman", Times, serif;
+		margin-left: 25%;
+		margin-right: 25%;
+		padding: .2em 2em;
+	}
+	
+	h1 {
+		color: #006;
+		font-size: 18px;
+		font-weight: lighter;
+	}
+	
+	h2 {
+		font-size: 16px;
+	}
+	
+	p, li, dt {
+		line-height: 140%;
+		padding-bottom: 2px;
+	}
+
+	ul, ol {
+		padding: 5px 5px 5px 20px;
+	}
+	-->
+	</style>
+</head>
+<body>
+<h1 style="text-align: center"><img alt="WordPress" src="http://wordpress.org/images/wordpress.gif" /> <br />
+	Version 2.0</h1>
+<p style="text-align: center"> Semantic Personal Publishing Platform </p>
+<h1>First Things First</h1>
+<p>Welcome. WordPress is a very special project to me. Every developer and contributor adds something unique to the mix, and together we create something beautiful that I'm proud to be a part of. Thousands of hours have gone into WordPress, and we're dedicated to making it better every day. Thank you for making it part of your world.</p>
+<p style="text-align: right;">&#8212; Matt Mullenweg </p>
+
+<h1 id="installation">Installation: Famous 5-minute install</h1>
+<ol>
+	<li>Unzip the package in an empty directory</li>
+	<li>Open up <code>wp-config-sample.php</code> with a text editor like WordPad or similar and fill in your database connection details</li>
+	<li>Save the file as <code>wp-config.php</code> </li>
+	<li>Upload everything.</li>
+	<li>Open <span class="file"><a href="wp-admin/install.php">/wp-admin/install.php</a></span> in your browser. This should setup the tables needed for your blog. If there is an error, double check your <span class="file">wp-config.php</span> file, and try again. If it fails again, please go to the <a href="http://wordpress.org/support/">support forums</a> with as much data as you can gather. </li>
+	<li><strong>Note the password given to you.</strong></li>
+	<li> The install script should then send you to the <a href="wp-login.php">login page</a>. Sign in with the username <code>admin</code> and the password generated during the installation. You can then click on 'Profile' to change the password.</li>
+</ol>
+
+<h1>Upgrading</h1>
+<p>Before you upgrade anything, make sure you have backup copies of any files you may have modified such as <code>index.php</code>.</p>
+<h2>Upgrading from any previous WordPress to 2.0:</h2>
+<ol>
+	<li>Delete your old WP files, saving ones you've modified </li>
+	<li>Upload the new files</li>
+	<li>Point your browser to <span class="file"><a href="wp-admin/upgrade.php">/wp-admin/upgrade.php</a></span></li>
+	<li>You wanted more, perhaps? That's it!</li>
+</ol>
+<h2>Template Changes</h2>
+<p>If you have customized your templates you will probably have to make some changes to them. If you're converting your 1.2 or earlier templates, <a href="http://codex.wordpress.org/Upgrade_1.2_to_1.5">we've created a special guide for you</a>. </p>
+<h1>Online Resources</h1>
+<p>If you have any questions that aren't addressed in this document, please take advantage of WordPress' numerous online resources:</p>
+<dl>
+	<dt><a href="http://codex.wordpress.org/">The WordPress Codex </a></dt>
+	<dd>The Codex is the encyclopedia of all things WordPress. It is the most comprehensive source of information for WordPress available. </dd>
+	<dt><a href="http://wordpress.org/development/">The Development Blog</a></dt>
+	<dd>This is where you'll find the latest updates and news related to WordPress. Bookmark and check often. </dd>
+	<dt><a href="http://planet.wordpress.org/">WordPress Planet </a></dt>
+	<dd>The WordPress Planet is a news aggregator that brings together posts from WordPress blogs around the web. </dd>
+	<dt><a href="http://wordpress.org/support/">WordPress Support Forums</a></dt>
+	<dd>If you've looked everywhere and still can't find an answer, the support forums are very active and have a large community ready to help. To help them help you be sure to use a descriptive thread title and describe your question in as much detail as possible. </dd>
+	<dt><a href="http://codex.wordpress.org/IRC">WordPress IRC Channel</a></dt>
+	<dd>Finally, there is an online chat channel that is used for discussion amoung people who use WordPress and occasionally support topics. The above wiki page should point you in the right direction. (irc.freenode.net #wordpresss) </dd>
+</dl>
+
+<h1 id="requirements">System Recommendations</h1>
+<ul>
+	<li>PHP version <strong>4.1</strong> or higher</li>
+	<li>MySQL version <strong>3.23.23</strong> or higher</li>
+	<li>... and a link to <a href="http://wordpress.org/">http://wordpress.org</a> on your site.</li>
+</ul>
+<p>WordPress is the official continuation of <a href="http://cafelog.com/">b2/caf&eacute;log</a>, which came from Michel V. The work has been continued by the <a href="http://wordpress.org/about/">WordPress developers</a>. If you would like to support WordPress, please consider <a href="http://wordpress.org/donate/">donating</a>. </p>
+
+<h1>Upgrading from another system</h1>
+<p>WordPress can <a href="http://codex.wordpress.org/Importing_from_other_blogging_software">import from a number of systems</a>. First you need to get WordPress installed and working as described above.</p>
+
+<h1 id="templates">XML-RPC Interface</h1>
+<p>You can now post to your WordPress blog with tools like <a href="http://ecto.kung-foo.tv/">Ecto</a>, <a href="http://blogbuddy.sourceforge.net">BlogBuddy</a>, <a href="http://bloggar.com/">Bloggar</a>, <a href="http://www.ubique.ch/wapblogger/">WapBlogger</a> (post from your Wap cellphone!), <a href="http://radio.userland.com">Radio Userland</a> (which means you can use Radio's email-to-blog feature), <a href="http://www.zempt.com/">Zempt</a>, <a href="http://www.newzcrawler.com/">NewzCrawler</a>, and other tools that support the Blogging APIs! :) You can read more about <a href="http://codex.wordpress.org/XML-RPC_Support">XML-RPC support on the Codex</a>.</p>
+
+<h1>Post via Email</h1>
+<p>You can post from an email client! To set this up go to your &quot;Writing&quot; options screen and fill in the connection details for your secret POP3 account. Then you need to set up <code>wp-mail.php</code> to execute periodically to check the mailbox for new posts. You can do it with Cron-jobs, or if your host doesn't support it you can look into the various website-monitoring services, and make them check your <code>wp-mail.php</code> URL. </p>
+<p> Posting is easy: Any email sent to the address you specify will be posted, with the subject as the title. It is best to keep the address dicrete. The script will <i>delete</i> emails that are successfully posted. </p>
+<h1 id="roles">User Roles </h1>
+
+<p>We've eliminated user levels in order to make way for the much more flexible roles system introduced in 2.0. You can <a href="http://codex.wordpress.org/Roles_and_Capabilities">read more about Roles and Capabilities on the Codex</a>.</p>
+
+<h1> Final notes</h1>
+<ul>
+	<li>If you have any suggestions, ideas, comments, or if you (gasp!) found a bug, join us in the <a href="http://wordpress.org/support/">Support Forums</a></li>
+	<li>WordPress now has a robust plugin API that makes extending the code easy. If you are a developer interested in utilizing this see the <a href="http://codex.wordpress.org/Plugin_API">plugin documentation in the Codex</a>. In most all cases you shouldn't modify any of the core code.</li>
+</ul>
+
+<h1>Share the Love</h1>
+<p>WordPress has no multi-million dollar marketing campaign or celebrity sponsors, but we do have something even better&#8212;you. If you enjoy WordPress please consider telling a friend, setting it up for someone less knowledgable than yourself, or writing the author of a media article that overlooks us.</p>
+
+<h1>Copyright</h1>
+<p>WordPress is released under the <abbr title="GNU Public License">GPL</abbr> (see <a href="license.txt">license.txt</a>).</p>
+
+</body>
+</html>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/admin-db.php 2.0.4/wp-admin/admin-db.php
--- 1.5.2/wp-admin/admin-db.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/admin-db.php	2006-07-23 13:27:00.000000000 -0500
@@ -0,0 +1,353 @@
+<?php
+
+function get_users_drafts( $user_id ) {
+	global $wpdb;
+	$user_id = (int) $user_id;
+	$query = "SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = $user_id ORDER BY ID DESC";
+	$query = apply_filters('get_users_drafts', $query);
+	return $wpdb->get_results( $query );
+}
+
+function get_others_drafts( $user_id ) {
+	global $wpdb;
+	$user = get_userdata( $user_id );
+	$level_key = $wpdb->prefix . 'user_level';
+
+	$editable = get_editable_user_ids( $user_id );
+	
+	if( !$editable ) {
+		$other_drafts = '';
+	} else {
+		$editable = join(',', $editable);
+		$other_drafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author IN ($editable) AND post_author != '$user_id' ");
+	}
+
+	return apply_filters('get_others_drafts', $other_drafts);
+}
+
+function get_editable_authors( $user_id ) {
+	global $wpdb;
+
+	$editable = get_editable_user_ids( $user_id );
+
+	if( !$editable ) {
+		return false;
+	} else {
+		$editable = join(',', $editable);
+		$authors = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($editable)" );
+	}
+
+	return apply_filters('get_editable_authors', $authors);
+}
+
+function get_editable_user_ids( $user_id, $exclude_zeros = true ) {
+	global $wpdb;
+	
+	$user = new WP_User( $user_id );
+	
+	if ( ! $user->has_cap('edit_others_posts') ) {
+		if ( $user->has_cap('edit_posts') || $exclude_zeros == false )
+			return array($user->id);
+		else 
+			return false;
+	}
+
+	$level_key = $wpdb->prefix . 'user_level';
+
+	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key'";
+	if ( $exclude_zeros )
+		$query .= " AND meta_value != '0'";
+		
+	return $wpdb->get_col( $query );
+}
+
+function get_author_user_ids() {
+	global $wpdb;
+	$level_key = $wpdb->prefix . 'user_level';
+
+	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key' AND meta_value != '0'";
+
+	return $wpdb->get_col( $query );
+}
+
+function get_nonauthor_user_ids() {
+	global $wpdb;
+	$level_key = $wpdb->prefix . 'user_level';
+
+	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key' AND meta_value = '0'";
+
+	return $wpdb->get_col( $query );
+}
+
+function wp_insert_category($catarr) {
+	global $wpdb;
+
+	extract($catarr);
+
+	$cat_ID = (int) $cat_ID;
+
+	// Are we updating or creating?
+	if (!empty ($cat_ID))
+		$update = true;
+	else
+		$update = false;
+
+	$cat_name = apply_filters('pre_category_name', $cat_name);
+	
+	if (empty ($category_nicename))
+		$category_nicename = sanitize_title($cat_name);
+	else
+		$category_nicename = sanitize_title($category_nicename);
+	$category_nicename = apply_filters('pre_category_nicename', $category_nicename);
+
+	if (empty ($category_description))
+		$category_description = '';
+	$category_description = apply_filters('pre_category_description', $category_description);
+
+	$category_parent = (int) $category_parent;
+	if (empty ($category_parent))
+		$category_parent = 0;
+
+	if (!$update) {
+		$wpdb->query("INSERT INTO $wpdb->categories (cat_ID, cat_name, category_nicename, category_description, category_parent) VALUES ('0', '$cat_name', '$category_nicename', '$category_description', '$category_parent')");
+		$cat_ID = $wpdb->insert_id;
+	} else {
+		$wpdb->query ("UPDATE $wpdb->categories SET cat_name = '$cat_name', category_nicename = '$category_nicename', category_description = '$category_description', category_parent = '$category_parent' WHERE cat_ID = '$cat_ID'");
+	}
+	
+	if ( $category_nicename == '' ) {
+		$category_nicename = sanitize_title($cat_name, $cat_ID );
+		$wpdb->query( "UPDATE $wpdb->categories SET category_nicename = '$category_nicename' WHERE cat_ID = '$cat_ID'" );
+	}
+
+	wp_cache_delete($cat_ID, 'category');
+
+	if ($update) {
+		do_action('edit_category', $cat_ID);
+	} else {
+		wp_cache_delete('all_category_ids', 'category');
+		do_action('create_category', $cat_ID);
+		do_action('add_category', $cat_ID);
+	}
+
+	return $cat_ID;
+}
+
+function wp_update_category($catarr) {
+	global $wpdb;
+
+	$cat_ID = (int) $catarr['cat_ID'];
+
+	// First, get all of the original fields
+	$category = get_category($cat_ID, ARRAY_A);
+
+	// Escape data pulled from DB.
+	$category = add_magic_quotes($category);
+
+	// Merge old and new fields with new fields overwriting old ones.
+	$catarr = array_merge($category, $catarr);
+
+	return wp_insert_category($catarr);
+}
+
+function wp_delete_category($cat_ID) {
+	global $wpdb;
+
+	$cat_ID = (int) $cat_ID;
+
+	// Don't delete the default cat.
+	if ($cat_ID == get_option('default_category'))
+		return 0;
+
+	$category = get_category($cat_ID);
+
+	$parent = $category->category_parent;
+
+	// Delete the category.
+	$wpdb->query("DELETE FROM $wpdb->categories WHERE cat_ID = '$cat_ID'");
+
+	// Update children to point to new parent.
+	$wpdb->query("UPDATE $wpdb->categories SET category_parent = '$parent' WHERE category_parent = '$cat_ID'");
+
+	// TODO: Only set categories to general if they're not in another category already
+	$default_cat = get_option('default_category');
+	$wpdb->query("UPDATE $wpdb->post2cat SET category_id='$default_cat' WHERE category_id='$cat_ID'");
+
+	wp_cache_delete($cat_ID, 'category');
+	wp_cache_delete('all_category_ids', 'category');
+
+	do_action('delete_category', $cat_ID);
+
+	return 1;
+}
+
+function wp_create_category($cat_name) {
+	$cat_array = compact('cat_name');
+	return wp_insert_category($cat_array);
+}
+
+function wp_create_categories($categories, $post_id = '') {
+	$cat_ids = array ();
+	foreach ($categories as $category) {
+		if ($id = category_exists($category))
+			$cat_ids[] = $id;
+		else
+			if ($id = wp_create_category($category))
+				$cat_ids[] = $id;
+	}
+
+	if ($post_id)
+		wp_set_post_cats('', $post_id, $cat_ids);
+
+	return $cat_ids;
+}
+
+function category_exists($cat_name) {
+	global $wpdb;
+	if (!$category_nicename = sanitize_title($cat_name))
+		return 0;
+
+	return $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE category_nicename = '$category_nicename'");
+}
+
+function wp_delete_user($id, $reassign = 'novalue') {
+	global $wpdb;
+
+	$id = (int) $id;
+	$user = get_userdata($id);
+
+	if ($reassign == 'novalue') {
+		$post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_author = $id");
+
+		if ($post_ids) {
+			foreach ($post_ids as $post_id)
+				wp_delete_post($post_id);
+		}
+
+		// Clean links
+		$wpdb->query("DELETE FROM $wpdb->links WHERE link_owner = $id");
+	} else {
+		$reassign = (int) $reassign;
+		$wpdb->query("UPDATE $wpdb->posts SET post_author = {$reassign} WHERE post_author = {$id}");
+		$wpdb->query("UPDATE $wpdb->links SET link_owner = {$reassign} WHERE link_owner = {$id}");
+	}
+
+	// FINALLY, delete user
+	$wpdb->query("DELETE FROM $wpdb->users WHERE ID = $id");
+	$wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$id'");
+
+	wp_cache_delete($id, 'users');
+	wp_cache_delete($user->user_login, 'userlogins');
+
+	do_action('delete_user', $id);
+
+	return true;
+}
+
+function get_link($link_id, $output = OBJECT) {
+	global $wpdb;
+	
+	$link = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = '$link_id'");
+
+	if ( $output == OBJECT ) {
+		return $link;
+	} elseif ( $output == ARRAY_A ) {
+		return get_object_vars($link);
+	} elseif ( $output == ARRAY_N ) {
+		return array_values(get_object_vars($link));
+	} else {
+		return $link;
+	}
+}
+
+function wp_insert_link($linkdata) {
+	global $wpdb, $current_user;
+	
+	extract($linkdata);
+
+	$update = false;
+	if ( !empty($link_id) )
+		$update = true;
+
+	if ( empty($link_rating) )
+		$link_rating = 0;	
+
+	if ( empty($link_target) )
+		$link_target = '';	
+
+	if ( empty($link_visible) )
+		$link_visible = 'Y';
+		
+	if ( empty($link_owner) )
+		$link_owner = $current_user->id;
+
+	if ( empty($link_notes) )
+		$link_notes = '';
+
+	if ( $update ) {
+		$wpdb->query("UPDATE $wpdb->links SET link_url='$link_url',
+			link_name='$link_name', link_image='$link_image',
+			link_target='$link_target', link_category='$link_category',
+			link_visible='$link_visible', link_description='$link_description',
+			link_rating='$link_rating', link_rel='$link_rel',
+			link_notes='$link_notes', link_rss = '$link_rss'
+			WHERE link_id='$link_id'");
+	} else {
+		$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_image, link_target, link_category, link_description, link_visible, link_owner, link_rating, link_rel, link_notes, link_rss) VALUES('$link_url','$link_name', '$link_image', '$link_target', '$link_category', '$link_description', '$link_visible', '$link_owner', '$link_rating', '$link_rel', '$link_notes', '$link_rss')");
+		$link_id = $wpdb->insert_id;
+	}
+	
+	if ( $update )
+		do_action('edit_link', $link_id);
+	else
+		do_action('add_link', $link_id);
+
+	return $link_id;
+}
+
+function wp_update_link($linkdata) {
+	global $wpdb;
+
+	$link_id = (int) $linkdata['link_id'];
+	
+	$link = get_link($link_id, ARRAY_A);
+	
+	// Escape data pulled from DB.
+	$link = add_magic_quotes($link);
+	
+	// Merge old and new fields with new fields overwriting old ones.
+	$linkdata = array_merge($link, $linkdata);
+
+	return wp_insert_link($linkdata);
+}
+
+function wp_delete_link($link_id) {
+	global $wpdb;
+
+	do_action('delete_link', $link_id);
+	return $wpdb->query("DELETE FROM $wpdb->links WHERE link_id = '$link_id'");	
+}
+
+function post_exists($title, $content = '', $post_date = '') {
+	global $wpdb;
+
+	if (!empty ($post_date))
+		$post_date = "AND post_date = '$post_date'";
+
+	if (!empty ($title))
+		return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' $post_date");
+	else
+		if (!empty ($content))
+			return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_content = '$content' $post_date");
+
+	return 0;
+}
+
+function comment_exists($comment_author, $comment_date) {
+	global $wpdb;
+
+	return $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments
+			WHERE comment_author = '$comment_author' AND comment_date = '$comment_date'");
+}
+
+?>
diff -ruN 1.5.2/wp-admin/admin-footer.php 2.0.4/wp-admin/admin-footer.php
--- 1.5.2/wp-admin/admin-footer.php	2005-04-20 14:19:07.000000000 -0500
+++ 2.0.4/wp-admin/admin-footer.php	2006-01-28 18:12:14.000000000 -0600
@@ -1,13 +1,19 @@
 
-<div id="footer"><p><a href="http://wordpress.org/"><img src="../wp-images/wp-small.png" alt="WordPress" /></a><br />
-<?php bloginfo('version'); ?> <br /> 
+<div id="footer"><p><a href="http://wordpress.org/" id="wordpress-logo"><img src="images/wordpress-logo.png" alt="WordPress" /></a></p>
+<p>
 <a href="http://codex.wordpress.org/"><?php _e('Documentation'); ?></a> &#8212; <a href="http://wordpress.org/support/"><?php _e('Support Forums'); ?></a> <br />
-<?php printf(__('%s seconds'), number_format(timer_stop(), 2)); ?>
+<?php bloginfo('version'); ?> &#8212; <?php printf(__('%s seconds'), number_format(timer_stop(), 2)); ?>
 </p>
 
 </div>
-
 <?php do_action('admin_footer', ''); ?>
+<script type="text/javascript">if(typeof wpOnload=='function')wpOnload();</script>
+
+<?php
+if ( (substr(php_sapi_name(), 0, 3) == 'cgi') && spawn_pinger() ) {
+	echo '<iframe id="pingcheck" src="' . get_settings('siteurl') .'/wp-admin/execute-pings.php?time=' . time() . '" style="border:none;width:1px;height:1px;"></iframe>';
+}
+?>
 
 </body>
-</html>
\ No newline at end of file
+</html>
diff -ruN 1.5.2/wp-admin/admin-functions.php 2.0.4/wp-admin/admin-functions.php
--- 1.5.2/wp-admin/admin-functions.php	2005-05-09 13:26:53.000000000 -0500
+++ 2.0.4/wp-admin/admin-functions.php	2006-07-26 17:56:56.000000000 -0500
@@ -1,112 +1,591 @@
 <?php
 
-function url_shorten ($url) {
+// Creates a new post from the "Write Post" form using $_POST information.
+function write_post() {
+	global $user_ID;
+
+	if (!current_user_can('edit_posts'))
+		die(__('You are not allowed to create posts or drafts on this blog.'));
+
+	// Rename.
+	$_POST['post_content'] = $_POST['content'];
+	$_POST['post_excerpt'] = $_POST['excerpt'];
+	$_POST['post_parent'] = $_POST['parent_id'];
+	$_POST['to_ping'] = $_POST['trackback_url'];
+
+	if (!empty ($_POST['post_author_override'])) {
+		$_POST['post_author'] = (int) $_POST['post_author_override'];
+	} else
+		if (!empty ($_POST['post_author'])) {
+			$_POST['post_author'] = (int) $_POST['post_author'];
+		} else {
+			$_POST['post_author'] = (int) $_POST['user_ID'];
+		}
+
+	if (($_POST['post_author'] != $_POST['user_ID']) && !current_user_can('edit_others_posts'))
+		die(__('You cannot post as this user.'));
+
+	// What to do based on which button they pressed
+	if ('' != $_POST['saveasdraft'])
+		$_POST['post_status'] = 'draft';
+	if ('' != $_POST['saveasprivate'])
+		$_POST['post_status'] = 'private';
+	if ('' != $_POST['publish'])
+		$_POST['post_status'] = 'publish';
+	if ('' != $_POST['advanced'])
+		$_POST['post_status'] = 'draft';
+	if ('' != $_POST['savepage'])
+		$_POST['post_status'] = 'static';
+
+	if ('publish' == $_POST['post_status'] && !current_user_can('publish_posts'))
+		$_POST['post_status'] = 'draft';
+
+	if ('static' == $_POST['post_status'] && !current_user_can('edit_pages'))
+		die(__('This user cannot edit pages.'));
+
+	if (!isset ($_POST['comment_status']))
+		$_POST['comment_status'] = 'closed';
+
+	if (!isset ($_POST['ping_status']))
+		$_POST['ping_status'] = 'closed';
+
+	if (!empty ($_POST['edit_date'])) {
+		$aa = $_POST['aa'];
+		$mm = $_POST['mm'];
+		$jj = $_POST['jj'];
+		$hh = $_POST['hh'];
+		$mn = $_POST['mn'];
+		$ss = $_POST['ss'];
+		$jj = ($jj > 31) ? 31 : $jj;
+		$hh = ($hh > 23) ? $hh -24 : $hh;
+		$mn = ($mn > 59) ? $mn -60 : $mn;
+		$ss = ($ss > 59) ? $ss -60 : $ss;
+		$_POST['post_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
+		$_POST['post_date_gmt'] = get_gmt_from_date("$aa-$mm-$jj $hh:$mn:$ss");
+	}
+
+	// Create the post.
+	$post_ID = wp_insert_post($_POST);
+	add_meta($post_ID);
+
+	// Reunite any orphaned attachments with their parent
+	if ( $_POST['temp_ID'] )
+		relocate_children($_POST['temp_ID'], $post_ID);
+
+	// Now that we have an ID we can fix any attachment anchor hrefs
+	fix_attachment_links($post_ID);
+
+	return $post_ID;
+}
+
+// Move child posts to a new parent
+function relocate_children($old_ID, $new_ID) {
+	global $wpdb;
+	$old_ID = (int) $old_ID;
+	$new_ID = (int) $new_ID;
+	return $wpdb->query("UPDATE $wpdb->posts SET post_parent = $new_ID WHERE post_parent = $old_ID");
+}
+
+// Replace hrefs of attachment anchors with up-to-date permalinks.
+function fix_attachment_links($post_ID) {
+	global $wp_rewrite;
+
+	$post = & get_post($post_ID, ARRAY_A);
+
+	$search = "#<a[^>]+rel=('|\")[^'\"]*attachment[^>]*>#ie";
+
+	// See if we have any rel="attachment" links
+	if ( 0 == preg_match_all($search, $post['post_content'], $anchor_matches, PREG_PATTERN_ORDER) )
+		return;
+
+	$i = 0;
+	$search = "# id=(\"|')p(\d+)\\1#i";
+	foreach ( $anchor_matches[0] as $anchor ) {
+		if ( 0 == preg_match($search, $anchor, $id_matches) )
+			continue;
+
+		$id = $id_matches[2];
+
+		// While we have the attachment ID, let's adopt any orphans.
+		$attachment = & get_post($id, ARRAY_A);
+		if ( ! empty($attachment) && ! is_object(get_post($attachment['post_parent'])) ) {
+			$attachment['post_parent'] = $post_ID;
+			// Escape data pulled from DB.
+			$attachment = add_magic_quotes($attachment);
+			wp_update_post($attachment);
+		}
+
+		$post_search[$i] = $anchor;
+		$post_replace[$i] = preg_replace("#href=(\"|')[^'\"]*\\1#e", "stripslashes('href=\\1').get_attachment_link($id).stripslashes('\\1')", $anchor);
+		++$i;
+	}
+
+	$post['post_content'] = str_replace($post_search, $post_replace, $post['post_content']);
+
+	// Escape data pulled from DB.
+	$post = add_magic_quotes($post);
+
+	return wp_update_post($post);
+}
+
+// Update an existing post with values provided in $_POST.
+function edit_post() {
+	global $user_ID;
+
+	$post_ID = (int) $_POST['post_ID'];
+
+	if (!current_user_can('edit_post', $post_ID))
+		die(__('You are not allowed to edit this post.'));
+
+	// Rename.
+	$_POST['ID'] = (int) $_POST['post_ID'];
+	$_POST['post_content'] = $_POST['content'];
+	$_POST['post_excerpt'] = $_POST['excerpt'];
+	$_POST['post_parent'] = $_POST['parent_id'];
+	$_POST['to_ping'] = $_POST['trackback_url'];
+
+	if (!empty ($_POST['post_author_override'])) {
+		$_POST['post_author'] = (int) $_POST['post_author_override'];
+	} else
+		if (!empty ($_POST['post_author'])) {
+			$_POST['post_author'] = (int) $_POST['post_author'];
+		} else {
+			$_POST['post_author'] = (int) $_POST['user_ID'];
+		}
+
+	if (($_POST['post_author'] != $_POST['user_ID']) && !current_user_can('edit_others_posts'))
+		die(__('You cannot post as this user.'));
+
+	// What to do based on which button they pressed
+	if ('' != $_POST['saveasdraft'])
+		$_POST['post_status'] = 'draft';
+	if ('' != $_POST['saveasprivate'])
+		$_POST['post_status'] = 'private';
+	if ('' != $_POST['publish'])
+		$_POST['post_status'] = 'publish';
+	if ('' != $_POST['advanced'])
+		$_POST['post_status'] = 'draft';
+	if ('' != $_POST['savepage'])
+		$_POST['post_status'] = 'static';
+
+	if ('publish' == $_POST['post_status'] && !current_user_can('publish_posts'))
+		$_POST['post_status'] = 'draft';
+
+	if ('static' == $_POST['post_status'] && !current_user_can('edit_pages'))
+		die(__('This user cannot edit pages.'));
+
+	if (!isset ($_POST['comment_status']))
+		$_POST['comment_status'] = 'closed';
+
+	if (!isset ($_POST['ping_status']))
+		$_POST['ping_status'] = 'closed';
+
+	if (!empty ($_POST['edit_date'])) {
+		$aa = $_POST['aa'];
+		$mm = $_POST['mm'];
+		$jj = $_POST['jj'];
+		$hh = $_POST['hh'];
+		$mn = $_POST['mn'];
+		$ss = $_POST['ss'];
+		$jj = ($jj > 31) ? 31 : $jj;
+		$hh = ($hh > 23) ? $hh -24 : $hh;
+		$mn = ($mn > 59) ? $mn -60 : $mn;
+		$ss = ($ss > 59) ? $ss -60 : $ss;
+		$_POST['post_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
+		$_POST['post_date_gmt'] = get_gmt_from_date("$aa-$mm-$jj $hh:$mn:$ss");
+	}
+
+	// Meta Stuff
+	if ($_POST['meta']) {
+		foreach ($_POST['meta'] as $key => $value)
+			update_meta($key, $value['key'], $value['value']);
+	}
+	
+	if ($_POST['deletemeta']) {
+		foreach ($_POST['deletemeta'] as $key => $value)
+			delete_meta($key);
+	}
+
+	add_meta($post_ID);
+
+	wp_update_post($_POST);
+
+	// Now that we have an ID we can fix any attachment anchor hrefs
+	fix_attachment_links($post_ID);
+
+	return $post_ID;
+}
+
+function edit_comment() {
+	global $user_ID;
+
+	$comment_ID = (int) $_POST['comment_ID'];
+	$comment_post_ID = (int) $_POST['comment_post_ID'];
+
+	if (!current_user_can('edit_post', $comment_post_ID))
+		die(__('You are not allowed to edit comments on this post, so you cannot edit this comment.'));
+
+	$_POST['comment_author'] = $_POST['newcomment_author'];
+	$_POST['comment_author_email'] = $_POST['newcomment_author_email'];
+	$_POST['comment_author_url'] = $_POST['newcomment_author_url'];
+	$_POST['comment_approved'] = $_POST['comment_status'];
+	$_POST['comment_content'] = $_POST['content'];
+	$_POST['comment_ID'] = (int) $_POST['comment_ID'];
+
+	if (!empty ($_POST['edit_date'])) {
+		$aa = $_POST['aa'];
+		$mm = $_POST['mm'];
+		$jj = $_POST['jj'];
+		$hh = $_POST['hh'];
+		$mn = $_POST['mn'];
+		$ss = $_POST['ss'];
+		$jj = ($jj > 31) ? 31 : $jj;
+		$hh = ($hh > 23) ? $hh -24 : $hh;
+		$mn = ($mn > 59) ? $mn -60 : $mn;
+		$ss = ($ss > 59) ? $ss -60 : $ss;
+		$_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
+	}
+
+	wp_update_comment($_POST);
+}
+
+// Get an existing post and format it for editing.
+function get_post_to_edit($id) {
+	global $richedit;
+	$richedit = ( 'true' == get_user_option('rich_editing') ) ? true : false;
+
+	$post = get_post($id);
+
+	$post->post_content = format_to_edit($post->post_content, $richedit);
+	$post->post_content = apply_filters('content_edit_pre', $post->post_content);
+
+	$post->post_excerpt = format_to_edit($post->post_excerpt);
+	$post->post_excerpt = apply_filters('excerpt_edit_pre', $post->post_excerpt);
+
+	$post->post_title = format_to_edit($post->post_title);
+	$post->post_title = apply_filters('title_edit_pre', $post->post_title);
+
+	if ($post->post_status == 'static')
+		$post->page_template = get_post_meta($id, '_wp_page_template', true);
+
+	return $post;
+}
+
+// Default post information to use when populating the "Write Post" form.
+function get_default_post_to_edit() {
+	if ( !empty($_REQUEST['post_title']) )
+		$post_title = wp_specialchars(stripslashes($_REQUEST['post_title']));
+	else if ( !empty($_REQUEST['popuptitle']) ) {
+		$post_title = wp_specialchars(stripslashes($_REQUEST['popuptitle']));
+		$post_title = funky_javascript_fix($post_title);
+	} else {
+		$post_title = '';
+	}
+
+	if ( !empty($_REQUEST['content']) )
+		$post_content = wp_specialchars(stripslashes($_REQUEST['content']));
+	else if ( !empty($post_title) ) {
+		$text       = wp_specialchars(stripslashes(urldecode($_REQUEST['text'])));
+		$text       = funky_javascript_fix($text);
+		$popupurl   = wp_specialchars($_REQUEST['popupurl']);
+        $post_content = '<a href="'.$popupurl.'">'.$post_title.'</a>'."\n$text";
+    }
+
+	if ( !empty($_REQUEST['excerpt']) )
+		$post_excerpt = wp_specialchars(stripslashes($_REQUEST['excerpt']));
+	else
+		$post_excerpt = '';
+
+	$post->post_status = 'draft';
+	$post->comment_status = get_settings('default_comment_status');
+	$post->ping_status = get_settings('default_ping_status');
+	$post->post_pingback = get_settings('default_pingback_flag');
+	$post->post_category = get_settings('default_category');
+	$post->post_content = apply_filters('default_content', $post_content);
+	$post->post_title = apply_filters('default_title', $post_title);
+	$post->post_excerpt = apply_filters('default_excerpt', $post_excerpt);
+	$post->page_template = 'default';
+	$post->post_parent = 0;
+	$post->menu_order = 0;
+
+	return $post;
+}
+
+function get_comment_to_edit($id) {
+	global $richedit;
+	$richedit = ( 'true' == get_user_option('rich_editing') ) ? true : false;
+
+	$comment = get_comment($id);
+
+	$comment->comment_content = format_to_edit($comment->comment_content, $richedit);
+	$comment->comment_content = apply_filters('comment_edit_pre', $comment->comment_content);
+
+	$comment->comment_author = format_to_edit($comment->comment_author);
+	$comment->comment_author_email = format_to_edit($comment->comment_author_email);
+	$comment->comment_author_url = format_to_edit($comment->comment_author_url);
+
+	return $comment;
+}
+
+function get_category_to_edit($id) {
+	$category = get_category($id);
+
+	return $category;
+}
+
+// Creates a new user from the "Users" form using $_POST information.
+
+function add_user() {
+	return edit_user();
+}
+
+function edit_user($user_id = 0) {
+	global $current_user, $wp_roles, $wpdb;
+
+	if ($user_id != 0) {
+		$update = true;
+		$user->ID = $user_id;
+		$userdata = get_userdata($user_id);
+		$user->user_login = $wpdb->escape($userdata->user_login);
+	} else {
+		$update = false;
+		$user = '';
+	}
+
+	if (isset ($_POST['user_login']))
+		$user->user_login = wp_specialchars(trim($_POST['user_login']));
+
+	$pass1 = $pass2 = '';
+	if (isset ($_POST['pass1']))
+		$pass1 = $_POST['pass1'];
+	if (isset ($_POST['pass2']))
+		$pass2 = $_POST['pass2'];
+
+	if (isset ($_POST['role']) && current_user_can('edit_users')) {
+		if($user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap('edit_users'))
+			$user->role = $_POST['role'];
+	}
+
+	if (isset ($_POST['email']))
+		$user->user_email = wp_specialchars(trim($_POST['email']));
+	if (isset ($_POST['url'])) {
+		$user->user_url = wp_specialchars(trim($_POST['url']));
+		$user->user_url = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $user->user_url) ? $user->user_url : 'http://'.$user->user_url;
+	}
+	if (isset ($_POST['first_name']))
+		$user->first_name = wp_specialchars(trim($_POST['first_name']));
+	if (isset ($_POST['last_name']))
+		$user->last_name = wp_specialchars(trim($_POST['last_name']));
+	if (isset ($_POST['nickname']))
+		$user->nickname = wp_specialchars(trim($_POST['nickname']));
+	if (isset ($_POST['display_name']))
+		$user->display_name = wp_specialchars(trim($_POST['display_name']));
+	if (isset ($_POST['description']))
+		$user->description = wp_specialchars(trim($_POST['description']));
+	if (isset ($_POST['jabber']))
+		$user->jabber = wp_specialchars(trim($_POST['jabber']));
+	if (isset ($_POST['aim']))
+		$user->aim = wp_specialchars(trim($_POST['aim']));
+	if (isset ($_POST['yim']))
+		$user->yim = wp_specialchars(trim($_POST['yim']));
+
+	$errors = array ();
+
+	/* checking that username has been typed */
+	if ($user->user_login == '')
+		$errors['user_login'] = __('<strong>ERROR</strong>: Please enter a username.');
+
+	/* checking the password has been typed twice */
+	do_action('check_passwords', array ($user->user_login, & $pass1, & $pass2));
+
+	if (!$update) {
+		if ($pass1 == '' || $pass2 == '')
+			$errors['pass'] = __('<strong>ERROR</strong>: Please enter your password twice.');
+	} else {
+		if ((empty ($pass1) && !empty ($pass2)) || (empty ($pass2) && !empty ($pass1)))
+			$errors['pass'] = __("<strong>ERROR</strong>: you typed your new password only once.");
+	}
+
+	/* Check for "\" in password */
+	if( strpos( " ".$pass1, "\\" ) )
+		$errors['pass'] = __('<strong>ERROR</strong>: Passwords may not contain the character "\\".');
+
+	/* checking the password has been typed twice the same */
+	if ($pass1 != $pass2)
+		$errors['pass'] = __('<strong>ERROR</strong>: Please type the same password in the two password fields.');
+
+	if (!empty ($pass1))
+		$user->user_pass = $pass1;
+
+	if ( !validate_username($user->user_login) )
+		$errors['user_login'] = __('<strong>ERROR</strong>: This username is invalid.  Please enter a valid username.');
+
+	if (!$update && username_exists($user->user_login))
+		$errors['user_login'] = __('<strong>ERROR</strong>: This username is already registered, please choose another one.');
+
+	/* checking e-mail address */
+	if (empty ($user->user_email)) {
+		$errors['user_email'] = __("<strong>ERROR</strong>: please type an e-mail address");
+	} else
+		if (!is_email($user->user_email)) {
+			$errors['user_email'] = __("<strong>ERROR</strong>: the email address isn't correct");
+		}
+
+	if (count($errors) != 0)
+		return $errors;
+
+	if ($update) {
+		$user_id = wp_update_user(get_object_vars($user));
+	} else {
+		$user_id = wp_insert_user(get_object_vars($user));
+		wp_new_user_notification($user_id);
+	}
+
+	return $errors;
+}
+
+
+function get_link_to_edit($link_id) {
+	$link = get_link($link_id);
+	
+	$link->link_url = wp_specialchars($link->link_url, 1);
+	$link->link_name = wp_specialchars($link->link_name, 1);
+	$link->link_description = wp_specialchars($link->link_description);
+	$link->link_notes = wp_specialchars($link->link_notes);
+	$link->link_rss = wp_specialchars($link->link_rss);
+	
+	return $link;
+}
+
+function get_default_link_to_edit() {
+	if ( isset($_GET['linkurl']) )
+		$link->link_url = wp_specialchars($_GET['linkurl'], 1);
+	else
+		$link->link_url = '';
+	
+	if ( isset($_GET['name']) )
+		$link->link_name = wp_specialchars($_GET['name'], 1);
+	else
+		$link->link_name = '';
+		
+	return $link;
+}
+
+function add_link() {
+	return edit_link();	
+}
+
+function edit_link($link_id = '') {
+	if (!current_user_can('manage_links'))
+		die(__("Cheatin' uh ?"));
+
+	$_POST['link_url'] = wp_specialchars($_POST['link_url']);
+	$_POST['link_url'] = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $_POST['link_url']) ? $_POST['link_url'] : 'http://' . $_POST['link_url'];
+	$_POST['link_name'] = wp_specialchars($_POST['link_name']);
+	$_POST['link_image'] = wp_specialchars($_POST['link_image']);
+	$_POST['link_rss'] = wp_specialchars($_POST['link_rss']);
+	$auto_toggle = get_autotoggle($_POST['link_category']);
+	
+	// if we are in an auto toggle category and this one is visible then we
+	// need to make the others invisible before we add this new one.
+	// FIXME Add category toggle func.
+	//if (($auto_toggle == 'Y') && ($link_visible == 'Y')) {
+	//	$wpdb->query("UPDATE $wpdb->links set link_visible = 'N' WHERE link_category = $link_category");
+	//}
+
+	if ( !empty($link_id) ) {
+		$_POST['link_id'] = $link_id;
+		return wp_update_link($_POST);
+	} else {
+		return wp_insert_link($_POST);
+	}
+}
+
+function url_shorten($url) {
 	$short_url = str_replace('http://', '', stripslashes($url));
 	$short_url = str_replace('www.', '', $short_url);
 	if ('/' == substr($short_url, -1))
 		$short_url = substr($short_url, 0, -1);
 	if (strlen($short_url) > 35)
-		$short_url =  substr($short_url, 0, 32).'...';
+		$short_url = substr($short_url, 0, 32).'...';
 	return $short_url;
 }
 
 function selected($selected, $current) {
-	if ($selected == $current) echo ' selected="selected"';
+	if ($selected == $current)
+		echo ' selected="selected"';
 }
 
 function checked($checked, $current) {
-	if ($checked == $current) echo ' checked="checked"';
+	if ($checked == $current)
+		echo ' checked="checked"';
 }
 
-function return_categories_list( $parent = 0, $sortbyname = FALSE )
-{
-        /*
-         * This function returns an list of all categories
-         * that have $parent as their parent
-         * if no parent is specified we will assume top level caegories
-         * are required.
-         */
-        global $wpdb;
-
-        // select sort order
-        $sort = "cat_id";
-        if( TRUE == $sortbyname )
-        {
-                $sort = "cat_name";
-        }
-
-        // First query the database
-        $cats_tmp = $wpdb->get_results("SELECT cat_ID FROM $wpdb->categories WHERE category_parent = $parent ORDER BY $sort");
-
-        // Now strip this down to a simple array of IDs
-        $cats = array();
-        if( count($cats_tmp) > 0 )
-        {
-                foreach( $cats_tmp as $cat )
-                {
-                        $cats[] = $cat->cat_ID;
-                }
-        }
+function return_categories_list($parent = 0) {
+	global $wpdb;
+	return $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories WHERE category_parent = $parent ORDER BY category_count DESC");
+}
 
-        // Return the list of categories
-        return $cats;
+function sort_cats($cat1, $cat2) {
+	return strcasecmp($cat1['cat_name'], $cat2['cat_name']);
 }
 
 function get_nested_categories($default = 0, $parent = 0) {
- global $post_ID, $mode, $wpdb;
+	global $post_ID, $mode, $wpdb;
 
- if ($post_ID) {
-   $checked_categories = $wpdb->get_col("
-     SELECT category_id
-     FROM $wpdb->categories, $wpdb->post2cat
-     WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_ID'
-     ");
-
-   if(count($checked_categories) == 0)
-   {
-     // No selected categories, strange
-     $checked_categories[] = $default;
-   }
-
- } else {
-   $checked_categories[] = $default;
- }
-
- $cats = return_categories_list($parent, TRUE);
- $result = array();
-
- foreach($cats as $cat)
- {
-   $result[$cat]['children'] = get_nested_categories($default, $cat);
-   $result[$cat]['cat_ID'] = $cat;
-   $result[$cat]['checked'] = in_array($cat, $checked_categories);
-   $result[$cat]['cat_name'] = get_the_category_by_ID($cat);
- }
+	if ($post_ID) {
+		$checked_categories = $wpdb->get_col("
+		     SELECT category_id
+		     FROM $wpdb->categories, $wpdb->post2cat
+		     WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_ID'
+		     ");
+
+		if (count($checked_categories) == 0) {
+			// No selected categories, strange
+			$checked_categories[] = $default;
+		}
+
+	} else {
+		$checked_categories[] = $default;
+	}
+
+	$cats = return_categories_list($parent);
+	$result = array ();
+
+	if (is_array($cats)) {
+		foreach ($cats as $cat) {
+			$result[$cat]['children'] = get_nested_categories($default, $cat);
+			$result[$cat]['cat_ID'] = $cat;
+			$result[$cat]['checked'] = in_array($cat, $checked_categories);
+			$result[$cat]['cat_name'] = get_the_category_by_ID($cat);
+		}
+	}
+	
+	usort($result, 'sort_cats');
 
- return $result;
+	return $result;
 }
 
 function write_nested_categories($categories) {
- foreach($categories as $category) {
-   echo '<label for="category-', $category['cat_ID'], '" class="selectit"><input value="', $category['cat_ID'],
-     '" type="checkbox" name="post_category[]" id="category-', $category['cat_ID'], '"',
-     ($category['checked'] ? ' checked="checked"' : ""), '/> ', wp_specialchars($category['cat_name']), "</label>\n";
-
-   if(isset($category['children'])) {
-     echo "\n<span class='cat-nest'>\n";
-     write_nested_categories($category['children']);
-     echo "</span>\n";
-   }
- }
+	foreach ($categories as $category) {
+		echo '<label for="category-', $category['cat_ID'], '" class="selectit"><input value="', $category['cat_ID'], '" type="checkbox" name="post_category[]" id="category-', $category['cat_ID'], '"', ($category['checked'] ? ' checked="checked"' : ""), '/> ', wp_specialchars($category['cat_name']), "</label>\n";
+
+		if (isset ($category['children'])) {
+			echo "\n<span class='cat-nest'>\n";
+			write_nested_categories($category['children']);
+			echo "</span>\n";
+		}
+	}
 }
 
 function dropdown_categories($default = 0) {
- write_nested_categories(get_nested_categories($default));
-} 
+	write_nested_categories(get_nested_categories($default));
+}
 
 // Dandy new recursive multiple category stuff.
 function cat_rows($parent = 0, $level = 0, $categories = 0) {
-	global $wpdb, $class, $user_level;
+	global $wpdb, $class;
+
 	if (!$categories)
 		$categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_name");
 
@@ -114,20 +593,26 @@
 		foreach ($categories as $category) {
 			if ($category->category_parent == $parent) {
 				$category->cat_name = wp_specialchars($category->cat_name);
-				$count = $wpdb->get_var("SELECT COUNT(post_id) FROM $wpdb->post2cat WHERE category_id = $category->cat_ID");
 				$pad = str_repeat('&#8212; ', $level);
-				if ( $user_level > 3 )
-					$edit = "<a href='categories.php?action=edit&amp;cat_ID=$category->cat_ID' class='edit'>" . __('Edit') . "</a></td><td><a href='categories.php?action=delete&amp;cat_ID=$category->cat_ID' onclick=\"return confirm('".  sprintf(__("You are about to delete the category \'%s\'.  All of its posts will go to the default category.\\n  \'OK\' to delete, \'Cancel\' to stop."), addslashes($category->cat_name)) . "')\" class='delete'>" .  __('Delete') . "</a>";
+				if ( current_user_can('manage_categories') ) {
+					$edit = "<a href='categories.php?action=edit&amp;cat_ID=$category->cat_ID' class='edit'>".__('Edit')."</a></td>";
+					$default_cat_id = get_option('default_category');
+
+					if ($category->cat_ID != $default_cat_id)
+						$edit .= "<td><a href='" . wp_nonce_url("categories.php?action=delete&amp;cat_ID=$category->cat_ID", 'delete-category_' . $category->cat_ID ) . "' onclick=\"return deleteSomething( 'cat', $category->cat_ID, '" . sprintf(__("You are about to delete the category &quot;%s&quot;.  All of its posts will go to the default category.\\n&quot;OK&quot; to delete, &quot;Cancel&quot; to stop."), js_escape($category->cat_name))."' );\" class='delete'>".__('Delete')."</a>";
+					else
+						$edit .= "<td style='text-align:center'>".__("Default");
+				}
 				else
 					$edit = '';
-				
+
 				$class = ('alternate' == $class) ? '' : 'alternate';
-				echo "<tr class='$class'><th scope='row'>$category->cat_ID</th><td>$pad $category->cat_name</td>
-				<td>$category->category_description</td>
-				<td>$count</td>
-				<td>$edit</td>
-				</tr>";
-				cat_rows($category->cat_ID, $level + 1, $categories);
+				echo "<tr id='cat-$category->cat_ID' class='$class'><th scope='row'>$category->cat_ID</th><td>$pad $category->cat_name</td>
+								<td>$category->category_description</td>
+								<td>$category->category_count</td>
+								<td>$edit</td>
+								</tr>";
+				cat_rows($category->cat_ID, $level +1, $categories);
 			}
 		}
 	} else {
@@ -135,20 +620,21 @@
 	}
 }
 
-function page_rows( $parent = 0, $level = 0, $pages = 0 ) {
-	global $wpdb, $class, $user_level, $post;
+function page_rows($parent = 0, $level = 0, $pages = 0) {
+	global $wpdb, $class, $post;
 	if (!$pages)
 		$pages = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'static' ORDER BY menu_order");
 
 	if ($pages) {
-		foreach ($pages as $post) { start_wp();
+		foreach ($pages as $post) {
+			start_wp();
 			if ($post->post_parent == $parent) {
 				$post->post_title = wp_specialchars($post->post_title);
 				$pad = str_repeat('&#8212; ', $level);
 				$id = $post->ID;
 				$class = ('alternate' == $class) ? '' : 'alternate';
 ?>
-  <tr class='<?php echo $class; ?>'> 
+  <tr id='page-<?php echo $id; ?>' class='<?php echo $class; ?>'> 
     <th scope="row"><?php echo $post->ID; ?></th> 
     <td>
       <?php echo $pad; ?><?php the_title() ?> 
@@ -156,12 +642,13 @@
     <td><?php the_author() ?></td>
     <td><?php echo mysql2date('Y-m-d g:i a', $post->post_modified); ?></td> 
 	<td><a href="<?php the_permalink(); ?>" rel="permalink" class="edit"><?php _e('View'); ?></a></td>
-    <td><?php if (($user_level > $authordata->user_level) or ($user_login == $authordata->user_login)) { echo "<a href='post.php?action=edit&amp;post=$id' class='edit'>" . __('Edit') . "</a>"; } ?></td> 
-    <td><?php if (($user_level > $authordata->user_level) or ($user_login == $authordata->user_login)) { echo "<a href='post.php?action=delete&amp;post=$id' class='delete' onclick=\"return confirm('" . sprintf(__("You are about to delete this post \'%s\'\\n  \'OK\' to delete, \'Cancel\' to stop."), the_title('','',0)) . "')\">" . __('Delete') . "</a>"; } ?></td> 
+    <td><?php if ( current_user_can('edit_pages') ) { echo "<a href='post.php?action=edit&amp;post=$id' class='edit'>" . __('Edit') . "</a>"; } ?></td> 
+    <td><?php if ( current_user_can('edit_pages') ) { echo "<a href='" . wp_nonce_url("post.php?action=delete&amp;post=$id", 'delete-post_' . $id) .  "' class='delete' onclick=\"return deleteSomething( 'page', " . $id . ", '" . sprintf(__("You are about to delete the &quot;%s&quot; page.\\n&quot;OK&quot; to delete, &quot;Cancel&quot; to stop."), js_escape(get_the_title()) ) . "' );\">" . __('Delete') . "</a>"; } ?></td> 
   </tr> 
 
 <?php
-				page_rows($id, $level + 1, $pages);
+
+				page_rows($id, $level +1, $pages);
 			}
 		}
 	} else {
@@ -175,106 +662,132 @@
 		$categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_name");
 	}
 	if ($categories) {
-		foreach ($categories as $category) { if ($currentcat != $category->cat_ID && $parent == $category->category_parent) {
-			$count = $wpdb->get_var("SELECT COUNT(post_id) FROM $wpdb->post2cat WHERE category_id = $category->cat_ID");
-			$pad = str_repeat('&#8211; ', $level);
-			$category->cat_name = wp_specialchars($category->cat_name);
-			echo "\n\t<option value='$category->cat_ID'";
-			if ($currentparent == $category->cat_ID)
-				echo " selected='selected'";
-			echo ">$pad$category->cat_name</option>";
-			wp_dropdown_cats($currentcat, $currentparent, $category->cat_ID, $level + 1, $categories);
-		} }
+		foreach ($categories as $category) {
+			if ($currentcat != $category->cat_ID && $parent == $category->category_parent) {
+				$count = $wpdb->get_var("SELECT COUNT(post_id) FROM $wpdb->post2cat WHERE category_id = $category->cat_ID");
+				$pad = str_repeat('&#8211; ', $level);
+				$category->cat_name = wp_specialchars($category->cat_name);
+				echo "\n\t<option value='$category->cat_ID'";
+				if ($currentparent == $category->cat_ID)
+					echo " selected='selected'";
+				echo ">$pad$category->cat_name</option>";
+				wp_dropdown_cats($currentcat, $currentparent, $category->cat_ID, $level +1, $categories);
+			}
+		}
 	} else {
 		return false;
 	}
 }
 
+function link_category_dropdown($fieldname, $selected = 0) {
+	global $wpdb;
+	
+	$results = $wpdb->get_results("SELECT cat_id, cat_name, auto_toggle FROM $wpdb->linkcategories ORDER BY cat_id");
+	echo "\n<select name='$fieldname' size='1'>\n";
+	foreach ($results as $row) {
+		echo "\n\t<option value='$row->cat_id'";
+		if ($row->cat_id == $selected)
+			echo " selected='selected'";
+		echo ">$row->cat_id : " . wp_specialchars($row->cat_name);
+		if ($row->auto_toggle == 'Y')
+			echo ' (auto toggle)';
+		echo "</option>";
+	}
+	echo "\n</select>\n";
+}
+
 function wp_create_thumbnail($file, $max_side, $effect = '') {
 
-    // 1 = GIF, 2 = JPEG, 3 = PNG
+		// 1 = GIF, 2 = JPEG, 3 = PNG
+
+	if (file_exists($file)) {
+		$type = getimagesize($file);
+
+		// if the associated function doesn't exist - then it's not
+		// handle. duh. i hope.
+
+		if (!function_exists('imagegif') && $type[2] == 1) {
+			$error = __('Filetype not supported. Thumbnail not created.');
+		}
+		elseif (!function_exists('imagejpeg') && $type[2] == 2) {
+			$error = __('Filetype not supported. Thumbnail not created.');
+		}
+		elseif (!function_exists('imagepng') && $type[2] == 3) {
+			$error = __('Filetype not supported. Thumbnail not created.');
+		} else {
+
+			// create the initial copy from the original file
+			if ($type[2] == 1) {
+				$image = imagecreatefromgif($file);
+			}
+			elseif ($type[2] == 2) {
+				$image = imagecreatefromjpeg($file);
+			}
+			elseif ($type[2] == 3) {
+				$image = imagecreatefrompng($file);
+			}
 
-    if(file_exists($file)) {
-        $type = getimagesize($file);
-        
-        // if the associated function doesn't exist - then it's not
-        // handle. duh. i hope.
-        
-        if(!function_exists('imagegif') && $type[2] == 1) {
-            $error = __('Filetype not supported. Thumbnail not created.');
-        }elseif(!function_exists('imagejpeg') && $type[2] == 2) {
-            $error = __('Filetype not supported. Thumbnail not created.');
-        }elseif(!function_exists('imagepng') && $type[2] == 3) {
-            $error = __('Filetype not supported. Thumbnail not created.');
-        } else {
-        
-            // create the initial copy from the original file
-            if($type[2] == 1) {
-                $image = imagecreatefromgif($file);
-            } elseif($type[2] == 2) {
-                $image = imagecreatefromjpeg($file);
-            } elseif($type[2] == 3) {
-                $image = imagecreatefrompng($file);
-            }
-            
 			if (function_exists('imageantialias'))
-	            imageantialias($image, TRUE);
-            
-            $image_attr = getimagesize($file);
-            
-            // figure out the longest side
-            
-            if($image_attr[0] > $image_attr[1]) {
-                $image_width = $image_attr[0];
-                $image_height = $image_attr[1];
-                $image_new_width = $max_side;
-                
-                $image_ratio = $image_width/$image_new_width;
-                $image_new_height = $image_height/$image_ratio;
-                //width is > height
-            } else {
-                $image_width = $image_attr[0];
-                $image_height = $image_attr[1];
-                $image_new_height = $max_side;
-                
-                $image_ratio = $image_height/$image_new_height;
-                $image_new_width = $image_width/$image_ratio;
-                //height > width
-            }
-            
-            $thumbnail = imagecreatetruecolor($image_new_width, $image_new_height);
-            @imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $image_new_width, $image_new_height, $image_attr[0], $image_attr[1]);
-            
-            // move the thumbnail to it's final destination
-            
-            $path = explode('/', $file);
-            $thumbpath = substr($file, 0, strrpos($file, '/')) . '/thumb-' . $path[count($path)-1];
-            
-            if($type[2] == 1) {
-                if(!imagegif($thumbnail, $thumbpath)) {
-                    $error = __("Thumbnail path invalid");
-                }
-            } elseif($type[2] == 2) {
-                if(!imagejpeg($thumbnail, $thumbpath)) {
-                    $error = __("Thumbnail path invalid");
-                }
-            } elseif($type[2] == 3) {
-                if(!imagepng($thumbnail, $thumbpath)) {
-                    $error = __("Thumbnail path invalid");
-                }
-            }
-            
-        }
-    }
-    
-    if(!empty($error))
-    {
-        return $error;
-    }
-    else
-    {
-        return 1;
-    }
+				imageantialias($image, TRUE);
+
+			$image_attr = getimagesize($file);
+
+			// figure out the longest side
+
+			if ($image_attr[0] > $image_attr[1]) {
+				$image_width = $image_attr[0];
+				$image_height = $image_attr[1];
+				$image_new_width = $max_side;
+
+				$image_ratio = $image_width / $image_new_width;
+				$image_new_height = $image_height / $image_ratio;
+				//width is > height
+			} else {
+				$image_width = $image_attr[0];
+				$image_height = $image_attr[1];
+				$image_new_height = $max_side;
+
+				$image_ratio = $image_height / $image_new_height;
+				$image_new_width = $image_width / $image_ratio;
+				//height > width
+			}
+
+			$thumbnail = imagecreatetruecolor($image_new_width, $image_new_height);
+			@ imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $image_new_width, $image_new_height, $image_attr[0], $image_attr[1]);
+
+			// If no filters change the filename, we'll do a default transformation.
+			if ( basename($file) == $thumb = apply_filters('thumbnail_filename', basename($file)) )
+				$thumb = preg_replace('!(\.[^.]+)?$!', __('.thumbnail').'$1', basename($file), 1);
+
+			$thumbpath = str_replace(basename($file), $thumb, $file);
+
+			// move the thumbnail to it's final destination
+			if ($type[2] == 1) {
+				if (!imagegif($thumbnail, $thumbpath)) {
+					$error = __("Thumbnail path invalid");
+				}
+			}
+			elseif ($type[2] == 2) {
+				if (!imagejpeg($thumbnail, $thumbpath)) {
+					$error = __("Thumbnail path invalid");
+				}
+			}
+			elseif ($type[2] == 3) {
+				if (!imagepng($thumbnail, $thumbpath)) {
+					$error = __("Thumbnail path invalid");
+				}
+			}
+
+		}
+	} else {
+		$error = __('File not found');
+	}
+
+	if (!empty ($error)) {
+		return $error;
+	} else {
+		return $thumbpath;
+	}
 }
 
 // Some postmeta stuff
@@ -282,17 +795,18 @@
 	global $wpdb;
 
 	return $wpdb->get_results("
-		SELECT meta_key, meta_value, meta_id, post_id
-		FROM $wpdb->postmeta
-		WHERE post_id = '$postid'
-		ORDER BY meta_key,meta_id",ARRAY_A);
+			SELECT meta_key, meta_value, meta_id, post_id
+			FROM $wpdb->postmeta
+			WHERE post_id = '$postid'
+			ORDER BY meta_key,meta_id", ARRAY_A);
 
 }
 
 function list_meta($meta) {
-	global $post_ID;	
+	global $post_ID;
 	// Exit if no meta
-	if (!$meta) return;
+	if (!$meta)
+		return;
 	$count = 0;
 ?>
 <table id='meta-list' cellpadding="3">
@@ -302,49 +816,53 @@
 		<th colspan='2'><?php _e('Action') ?></th>
 	</tr>
 <?php
-		
+
+
 	foreach ($meta as $entry) {
-		++$count;
-		if ( $count % 2 ) $style = 'alternate';
-		else $style = '';
-		if ( '_' == $entry['meta_key']{0} ) $style .= ' hidden';
+		++ $count;
+		if ($count % 2)
+			$style = 'alternate';
+		else
+			$style = '';
+		if ('_' == $entry['meta_key'] { 0 })
+			$style .= ' hidden';
 		echo "
-	<tr class='$style'>
-		<td valign='top'><input name='meta[{$entry['meta_id']}][key]' tabindex='6' type='text' size='20' value='{$entry['meta_key']}' /></td>
-		<td><textarea name='meta[{$entry['meta_id']}][value]' tabindex='6' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>
-		<td align='center' width='10%'><input name='updatemeta' type='submit' class='updatemeta' tabindex='6' value='" . __('Update') ."' /></td>
-		<td align='center' width='10%'><input name='deletemeta[{$entry['meta_id']}]' type='submit' class='deletemeta' tabindex='6' value='" . __('Delete') ."' /></td>
-	</tr>
-";
+			<tr class='$style'>
+				<td valign='top'><input name='meta[{$entry['meta_id']}][key]' tabindex='6' type='text' size='20' value='{$entry['meta_key']}' /></td>
+				<td><textarea name='meta[{$entry['meta_id']}][value]' tabindex='6' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>
+				<td align='center'><input name='updatemeta' type='submit' class='updatemeta' tabindex='6' value='".__('Update')."' /><br />
+				<input name='deletemeta[{$entry['meta_id']}]' type='submit' class='deletemeta' tabindex='6' value='".__('Delete')."' /></td>
+			</tr>
+		";
 	}
 	echo "
-	</table>
-";
+		</table>
+	";
 }
 
 // Get a list of previously defined keys
 function get_meta_keys() {
 	global $wpdb;
-	
+
 	$keys = $wpdb->get_col("
-		SELECT meta_key
-		FROM $wpdb->postmeta
-		GROUP BY meta_key
-		ORDER BY meta_key");
-	
+			SELECT meta_key
+			FROM $wpdb->postmeta
+			GROUP BY meta_key
+			ORDER BY meta_key");
+
 	return $keys;
 }
 
 function meta_form() {
 	global $wpdb;
 	$keys = $wpdb->get_col("
-		SELECT meta_key
-		FROM $wpdb->postmeta
-		GROUP BY meta_key
-		ORDER BY meta_id DESC
-		LIMIT 10");
+			SELECT meta_key
+			FROM $wpdb->postmeta
+			GROUP BY meta_key
+			ORDER BY meta_id DESC
+			LIMIT 10");
 ?>
-<h3><?php _e('Add a new custom field to this post:') ?></h3>
+<h3><?php _e('Add a new custom field:') ?></h3>
 <table cellspacing="3" cellpadding="3">
 	<tr>
 <th colspan="2"><?php _e('Key') ?></th>
@@ -356,7 +874,8 @@
 <select id="metakeyselect" name="metakeyselect" tabindex="7">
 <option value="#NONE#"><?php _e('- Select -'); ?></option>
 <?php
-	foreach($keys as $key) {
+
+	foreach ($keys as $key) {
 		echo "\n\t<option value='$key'>$key</option>";
 	}
 ?>
@@ -370,30 +889,31 @@
 </table>
 <p class="submit"><input type="submit" name="updatemeta" tabindex="9" value="<?php _e('Add Custom Field &raquo;') ?>" /></p>
 <?php
+
 }
 
 function add_meta($post_ID) {
 	global $wpdb;
-	
-	$metakeyselect = $wpdb->escape( stripslashes( trim($_POST['metakeyselect']) ) );
-	$metakeyinput  = $wpdb->escape( stripslashes( trim($_POST['metakeyinput']) ) );
-	$metavalue     = $wpdb->escape( stripslashes( trim($_POST['metavalue']) ) );
 
-	if (!empty($metavalue) && ((('#NONE#' != $metakeyselect) && !empty($metakeyselect)) || !empty($metakeyinput))) {
+	$metakeyselect = $wpdb->escape(stripslashes(trim($_POST['metakeyselect'])));
+	$metakeyinput = $wpdb->escape(stripslashes(trim($_POST['metakeyinput'])));
+	$metavalue = $wpdb->escape(stripslashes(trim($_POST['metavalue'])));
+
+	if ( ('0' === $metavalue || !empty ($metavalue)) && ((('#NONE#' != $metakeyselect) && !empty ($metakeyselect)) || !empty ($metakeyinput)) ) {
 		// We have a key/value pair. If both the select and the 
 		// input for the key have data, the input takes precedence:
 
 		if ('#NONE#' != $metakeyselect)
 			$metakey = $metakeyselect;
-				
+
 		if ($metakeyinput)
 			$metakey = $metakeyinput; // default
 
 		$result = $wpdb->query("
-				INSERT INTO $wpdb->postmeta 
-				(post_id,meta_key,meta_value) 
-				VALUES ('$post_ID','$metakey','$metavalue')
-			");
+						INSERT INTO $wpdb->postmeta 
+						(post_id,meta_key,meta_value) 
+						VALUES ('$post_ID','$metakey','$metavalue')
+					");
 	}
 } // add_meta
 
@@ -410,18 +930,15 @@
 }
 
 function touch_time($edit = 1, $for_post = 1) {
-	global $month, $postdata, $commentdata;
-	if ( $for_post && ('draft' == $postdata->post_status) ) {
-		$checked = 'checked="checked" ';
-		$edit = false;
-	} else {
-		$checked = ' ';
-	}
+	global $month, $post, $comment;
+
+	if ( $for_post )
+		$edit = ( ('draft' == $post->post_status) && (!$post->post_date || '0000-00-00 00:00:00' == $post->post_date) ) ? false : true;
+ 
+	echo '<fieldset><legend><input type="checkbox" class="checkbox" name="edit_date" value="1" id="timestamp" /> <label for="timestamp">'.__('Edit timestamp').'</label></legend>';
 
-	echo '<fieldset><legend><input type="checkbox" class="checkbox" name="edit_date" value="1" id="timestamp" '.$checked.'/> <label for="timestamp">' . __('Edit timestamp') . '</label></legend>';
-	
 	$time_adj = time() + (get_settings('gmt_offset') * 3600);
-	$post_date = ($for_post) ? $postdata->post_date : $commentdata['comment_date'];
+	$post_date = ($for_post) ? $post->post_date : $comment->comment_date;
 	$jj = ($edit) ? mysql2date('d', $post_date) : gmdate('d', $time_adj);
 	$mm = ($edit) ? mysql2date('m', $post_date) : gmdate('m', $time_adj);
 	$aa = ($edit) ? mysql2date('Y', $post_date) : gmdate('Y', $time_adj);
@@ -430,50 +947,36 @@
 	$ss = ($edit) ? mysql2date('s', $post_date) : gmdate('s', $time_adj);
 
 	echo "<select name=\"mm\">\n";
-	for ($i=1; $i < 13; $i=$i+1) {
+	for ($i = 1; $i < 13; $i = $i +1) {
 		echo "\t\t\t<option value=\"$i\"";
 		if ($i == $mm)
-		echo " selected='selected'";
+			echo " selected='selected'";
 		if ($i < 10) {
 			$ii = "0".$i;
 		} else {
 			$ii = "$i";
 		}
 		echo ">".$month["$ii"]."</option>\n";
-	} 
-
+	}
 ?>
 </select>
-<input type="text" name="jj" value="<?php echo $jj; ?>" size="2" maxlength="2" />
-<input type="text" name="aa" value="<?php echo $aa ?>" size="4" maxlength="5" /> @ 
-<input type="text" name="hh" value="<?php echo $hh ?>" size="2" maxlength="2" /> : 
-<input type="text" name="mn" value="<?php echo $mn ?>" size="2" maxlength="2" /> 
-<input type="hidden" name="ss" value="<?php echo $ss ?>" size="2" maxlength="2" /> 
-<?php _e('Existing timestamp'); ?>: 
-	<?php
-		// We might need to readjust to display proper existing timestamp
-		if ( $for_post && ('draft' == $postdata->post_status) ) {
-			$jj = mysql2date('d', $post_date);
-			$mm = mysql2date('m', $post_date);
-			$aa = mysql2date('Y', $post_date);
-			$hh = mysql2date('H', $post_date);
-			$mn = mysql2date('i', $post_date);
-			$ss = mysql2date('s', $post_date);
-		}
-		echo "{$month[$mm]} $jj, $aa @ $hh:$mn"; ?>
+<input type="text" id="jj" name="jj" value="<?php echo $jj; ?>" size="2" maxlength="2" />
+<input type="text" id="aa" name="aa" value="<?php echo $aa ?>" size="4" maxlength="5" /> @ 
+<input type="text" id="hh" name="hh" value="<?php echo $hh ?>" size="2" maxlength="2" /> : 
+<input type="text" id="mn" name="mn" value="<?php echo $mn ?>" size="2" maxlength="2" /> 
+<input type="hidden" id="ss" name="ss" value="<?php echo $ss ?>" size="2" maxlength="2" /> 
+<?php
+	if ( $edit ) {
+		_e('Existing timestamp');
+		echo ": {$month[$mm]} $jj, $aa @ $hh:$mn";
+	}
+?>
 </fieldset>
 	<?php
-}
 
-function check_admin_referer() {
-	$adminurl = strtolower( get_settings('siteurl') ) . '/wp-admin';
-	$referer = strtolower( $_SERVER['HTTP_REFERER'] );
-	if ( !strstr($referer, $adminurl) )
-		die(__('Sorry, you need to <a href="http://codex.wordpress.org/Enable_Sending_Referrers">enable sending referrers</a> for this feature to work.'));
-	do_action('check_admin_referer');
 }
 
-// insert_with_markers: Owen Winkler
+// insert_with_markers: Owen Winkler, fixed by Eric Anderson
 // Inserts an array of strings into a file (.htaccess), placing it between
 // BEGIN and END markers.  Replaces existing marked info.  Retains surrounding
 // data.  Creates file if none exists.
@@ -490,24 +993,27 @@
 		$foundit = false;
 		if ($markerdata) {
 			$state = true;
-			$newline = '';
-			foreach($markerdata as $markerline) {
-				if (strstr($markerline, "# BEGIN {$marker}")) $state = false;
-				if ($state) fwrite($f, "{$newline}{$markerline}");
+			foreach ($markerdata as $markerline) {
+				if (strstr($markerline, "# BEGIN {$marker}"))
+					$state = false;
+				if ($state)
+					fwrite($f, "{$markerline}\n");
 				if (strstr($markerline, "# END {$marker}")) {
-					fwrite($f, "{$newline}# BEGIN {$marker}");
-					if(is_array($insertion)) foreach($insertion as $insertline) fwrite($f, "{$newline}{$insertline}");
-					fwrite($f, "{$newline}# END {$marker}");
+					fwrite($f, "# BEGIN {$marker}\n");
+					if (is_array($insertion))
+						foreach ($insertion as $insertline)
+							fwrite($f, "{$insertline}\n");
+					fwrite($f, "# END {$marker}\n");
 					$state = true;
 					$foundit = true;
 				}
-				$newline = "\n";
 			}
 		}
 		if (!$foundit) {
 			fwrite($f, "# BEGIN {$marker}\n");
-			foreach($insertion as $insertline) fwrite($f, "{$insertline}\n");
-			fwrite($f, "# END {$marker}");				
+			foreach ($insertion as $insertline)
+				fwrite($f, "{$insertline}\n");
+			fwrite($f, "# END {$marker}\n");
 		}
 		fclose($f);
 		return true;
@@ -516,94 +1022,117 @@
 	}
 }
 
-// insert_with_markers: Owen Winkler
+// extract_from_markers: Owen Winkler
 // Returns an array of strings from a file (.htaccess) from between BEGIN
 // and END markers.
 function extract_from_markers($filename, $marker) {
-	$result = array();
+	$result = array ();
 
 	if (!file_exists($filename)) {
 		return $result;
 	}
 
-	if($markerdata = explode("\n", implode('', file($filename))));
+	if ($markerdata = explode("\n", implode('', file($filename))));
 	{
 		$state = false;
-		foreach($markerdata as $markerline) {
-			if(strstr($markerline, "# END {$marker}"))	$state = false;
-			if($state) $result[] = $markerline;
-			if(strstr($markerline, "# BEGIN {$marker}")) $state = true;
+		foreach ($markerdata as $markerline) {
+			if (strstr($markerline, "# END {$marker}"))
+				$state = false;
+			if ($state)
+				$result[] = $markerline;
+			if (strstr($markerline, "# BEGIN {$marker}"))
+				$state = true;
 		}
 	}
 
 	return $result;
 }
 
+function got_mod_rewrite() {
+	global $is_apache;
+
+	// take 3 educated guesses as to whether or not mod_rewrite is available
+	if ( !$is_apache )
+		return false;
+
+	if ( function_exists('apache_get_modules') ) {
+		if ( !in_array('mod_rewrite', apache_get_modules()) )
+			return false;
+	}
+
+	return true;
+}
+
 function save_mod_rewrite_rules() {
 	global $is_apache, $wp_rewrite;
 	$home_path = get_home_path();
 
-	if (! $wp_rewrite->using_mod_rewrite_permalinks())
+	if (!$wp_rewrite->using_mod_rewrite_permalinks())
 		return;
 
-	if ( ! ((!file_exists($home_path.'.htaccess') && is_writable($home_path)) || is_writable($home_path.'.htaccess')) )
+	if (!((!file_exists($home_path.'.htaccess') && is_writable($home_path)) || is_writable($home_path.'.htaccess')))
 		return;
 
-	if (! $is_apache)
+	if (! got_mod_rewrite())
 		return;
 
 	$rules = explode("\n", $wp_rewrite->mod_rewrite_rules());
 	insert_with_markers($home_path.'.htaccess', 'WordPress', $rules);
 }
 
-function generate_page_rewrite_rules() {
-	global $wpdb;
-	$posts = $wpdb->get_results("SELECT ID, post_name FROM $wpdb->posts WHERE post_status = 'static' ORDER BY post_parent DESC");
-
-	$page_rewrite_rules = array();
-	
-	if ($posts) {
-		foreach ($posts as $post) {
-			// URI => page name
-			$uri = get_page_uri($post->ID);
-			
-			$page_rewrite_rules[$uri] = $post->post_name;
-		}
-		
-		update_option('page_uris', $page_rewrite_rules);
-		
-		save_mod_rewrite_rules();
+function the_quicktags() {
+	// Browser detection sucks, but until Safari supports the JS needed for this to work people just assume it's a bug in WP
+	if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Safari'))
+		echo '
+		<div id="quicktags">
+			<script src="../wp-includes/js/quicktags.js" type="text/javascript"></script>
+			<script type="text/javascript">if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 ) edToolbar();</script>
+		</div>
+';
+	else echo '
+<script type="text/javascript">
+function edInsertContent(myField, myValue) {
+	//IE support
+	if (document.selection) {
+		myField.focus();
+		sel = document.selection.createRange();
+		sel.text = myValue;
+		myField.focus();
+	}
+	//MOZILLA/NETSCAPE support
+	else if (myField.selectionStart || myField.selectionStart == "0") {
+		var startPos = myField.selectionStart;
+		var endPos = myField.selectionEnd;
+		myField.value = myField.value.substring(0, startPos)
+		              + myValue 
+                      + myField.value.substring(endPos, myField.value.length);
+		myField.focus();
+		myField.selectionStart = startPos + myValue.length;
+		myField.selectionEnd = startPos + myValue.length;
+	} else {
+		myField.value += myValue;
+		myField.focus();
 	}
 }
-
-function the_quicktags () {
-// Browser detection sucks, but until Safari supports the JS needed for this to work people just assume it's a bug in WP
-if ( !strstr($_SERVER['HTTP_USER_AGENT'], 'Safari') ) :
-	echo '
-	<div id="quicktags">
-	<a href="http://wordpress.org/docs/reference/post/#quicktags" title="' .  __('Help with quicktags') . '">' . __('Quicktags') . '</a>:
-	<script src="quicktags.js" type="text/javascript"></script>
-	<script type="text/javascript">edToolbar();</script>
+</script>
 ';
-	echo '</div>';
-endif;
 }
 
 function validate_current_theme() {
 	$theme_loc = 'wp-content/themes';
-	$theme_root = ABSPATH . $theme_loc;
+	$theme_root = ABSPATH.$theme_loc;
 
 	$template = get_settings('template');
 	$stylesheet = get_settings('stylesheet');
 
-	if (($template != 'default') && (! file_exists("$theme_root/$template/index.php"))) {
+	if (($template != 'default') && (!file_exists("$theme_root/$template/index.php"))) {
 		update_option('template', 'default');
 		update_option('stylesheet', 'default');
 		do_action('switch_theme', 'Default');
 		return false;
 	}
 
-	if (($stylesheet != 'default') && (! file_exists("$theme_root/$stylesheet/style.css"))) {
+	if (($stylesheet != 'default') && (!file_exists("$theme_root/$stylesheet/style.css"))) {
 		update_option('template', 'default');
 		update_option('stylesheet', 'default');
 		do_action('switch_theme', 'Default');
@@ -624,18 +1153,18 @@
 	$themes = get_themes();
 	$theme = get_current_theme();
 	$templates = $themes[$theme]['Template Files'];
-	$page_templates = array();
+	$page_templates = array ();
 
-	if( is_array( $templates ) ) {
+	if (is_array($templates)) {
 		foreach ($templates as $template) {
-			$template_data = implode('', file(ABSPATH . $template));
+			$template_data = implode('', file(ABSPATH.$template));
 			preg_match("|Template Name:(.*)|i", $template_data, $name);
 			preg_match("|Description:(.*)|i", $template_data, $description);
 
 			$name = $name[1];
 			$description = $description[1];
 
-			if (! empty($name)) {
+			if (!empty ($name)) {
 				$page_templates[trim($name)] = basename($template);
 			}
 		}
@@ -646,11 +1175,13 @@
 
 function page_template_dropdown($default = '') {
 	$templates = get_page_templates();
-	foreach (array_keys($templates) as $template) :
-		if ($default == $templates[$template]) $selected = " selected='selected'";
-		else $selected = '';
-		echo "\n\t<option value='" . $templates[$template] . "' $selected>$template</option>";
-		endforeach;
+	foreach (array_keys($templates) as $template)
+		: if ($default == $templates[$template])
+			$selected = " selected='selected'";
+		else
+			$selected = '';
+	echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
+	endforeach;
 }
 
 function parent_dropdown($default = 0, $parent = 0, $level = 0) {
@@ -660,7 +1191,7 @@
 	if ($items) {
 		foreach ($items as $item) {
 			// A page cannot be it's own parent.
-			if (!empty($post_ID)) {
+			if (!empty ($post_ID)) {
 				if ($item->ID == $post_ID) {
 					continue;
 				}
@@ -672,7 +1203,7 @@
 				$current = '';
 
 			echo "\n\t<option value='$item->ID'$current>$pad $item->post_title</option>";
-			parent_dropdown($default, $item->ID, $level + 1);
+			parent_dropdown($default, $item->ID, $level +1);
 		}
 	} else {
 		return false;
@@ -683,14 +1214,14 @@
 	global $pagenow;
 	global $menu;
 	global $submenu;
-	global $user_level;
+	global $plugin_page;
 
 	$parent = get_admin_page_parent();
 
 	foreach ($menu as $menu_array) {
 		//echo "parent array: " . $menu_array[2];
 		if ($menu_array[2] == $parent) {
-			if ($user_level < $menu_array[1]) {
+			if (!current_user_can($menu_array[1])) {
 				return false;
 			} else {
 				break;
@@ -698,18 +1229,26 @@
 		}
 	}
 
-	if (isset($submenu[$parent])) {
-		foreach ($submenu[$parent] as $submenu_array) {
+	if (isset ($submenu[$parent])) {
+		if ( isset($plugin_page) ) {
+			foreach ($submenu[$parent] as $submenu_array) {
+				if ( $submenu_array[2] == $plugin_page ) {
+					if (!current_user_can($submenu_array[1]))
+						return false;
+				}
+			}
+		}
+
+		foreach ($submenu[$parent] as $submenu_array) {		
 			if ($submenu_array[2] == $pagenow) {
-				if ($user_level < $submenu_array[1]) {
+				if (!current_user_can($submenu_array[1]))
 					return false;
-				} else {
+				else
 					return true;
-				}
 			}
 		}
 	}
-	
+
 	return true;
 }
 
@@ -720,34 +1259,38 @@
 	global $pagenow;
 	global $plugin_page;
 
-	if (isset($title) && ! empty($title)) {
+	if (isset ($title) && !empty ($title)) {
 		return $title;
 	}
 
-	$parent = get_admin_page_parent();
-	if (empty($parent)) {
+	$hook = get_plugin_page_hook($plugin_page, $pagenow);
+
+	$parent = $parent1 = get_admin_page_parent();
+	if (empty ($parent)) {
 		foreach ($menu as $menu_array) {
-			if (isset($menu_array[3])) {
+			if (isset ($menu_array[3])) {
 				if ($menu_array[2] == $pagenow) {
 					$title = $menu_array[3];
 					return $menu_array[3];
-				} else if (isset($plugin_page) && ($plugin_page == $menu_array[2])) {
-					$title = $menu_array[3];
-					return $menu_array[3];
-				}
+				} else
+					if (isset ($plugin_page) && ($plugin_page == $menu_array[2]) && ($hook == $menu_array[3])) {
+						$title = $menu_array[3];
+						return $menu_array[3];
+					}
 			}
 		}
 	} else {
 		foreach (array_keys($submenu) as $parent) {
 			foreach ($submenu[$parent] as $submenu_array) {
-				if (isset($submenu_array[3])) {
+				if (isset ($submenu_array[3])) {
 					if ($submenu_array[2] == $pagenow) {
 						$title = $submenu_array[3];
 						return $submenu_array[3];
-					} else if (isset($plugin_page) && ($plugin_page == $submenu_array[2])) {
-						$title = $submenu_array[3];
-						return $submenu_array[3];
-					}
+					} else
+						if (isset ($plugin_page) && ($plugin_page == $submenu_array[2]) && (($parent == $pagenow) || ($parent == $plugin_page) || ($plugin_page == $hook) || (($pagenow == 'admin.php') && ($parent1 != $submenu_array[2])))) {
+							$title = $submenu_array[3];
+							return $submenu_array[3];
+						}
 				}
 			}
 		}
@@ -763,11 +1306,11 @@
 	global $pagenow;
 	global $plugin_page;
 
-	if (isset($parent_file) && ! empty($parent_file)) {
+	if (isset ($parent_file) && !empty ($parent_file)) {
 		return $parent_file;
 	}
 
-	if ($pagenow == 'admin.php' && isset($plugin_page)) {
+	if ($pagenow == 'admin.php' && isset ($plugin_page)) {
 		foreach ($menu as $parent_menu) {
 			if ($parent_menu[2] == $plugin_page) {
 				$parent_file = $plugin_page;
@@ -775,16 +1318,17 @@
 			}
 		}
 	}
-		
+
 	foreach (array_keys($submenu) as $parent) {
 		foreach ($submenu[$parent] as $submenu_array) {
 			if ($submenu_array[2] == $pagenow) {
 				$parent_file = $parent;
 				return $parent;
-			} else if (isset($plugin_page) && ($plugin_page == $submenu_array[2])) {
-				$parent_file = $parent;
-				return $parent;
-			}
+			} else
+				if (isset ($plugin_page) && ($plugin_page == $submenu_array[2])) {
+					$parent_file = $parent;
+					return $parent;
+				}
 		}
 	}
 
@@ -792,21 +1336,17 @@
 	return '';
 }
 
-function plugin_basename($file) {
-	return preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', $file);
-}
-
 function add_menu_page($page_title, $menu_title, $access_level, $file, $function = '') {
 	global $menu, $admin_page_hooks;
 
 	$file = plugin_basename($file);
 
-	$menu[] = array($menu_title, $access_level, $file, $page_title);
+	$menu[] = array ($menu_title, $access_level, $file, $page_title);
 
 	$admin_page_hooks[$file] = sanitize_title($menu_title);
 
 	$hookname = get_plugin_page_hookname($file, '');
-	if ( !empty($function) && !empty($hookname) )
+	if (!empty ($function) && !empty ($hookname))
 		add_action($hookname, $function);
 
 	return $hookname;
@@ -823,18 +1363,18 @@
 	// as the first item in the submenu.  If the submenu file is the same as the
 	// parent file someone is trying to link back to the parent manually.  In
 	// this case, don't automatically add a link back to avoid duplication.
-	if (! isset($submenu[$parent]) && $file != $parent) {
+	if (!isset ($submenu[$parent]) && $file != $parent) {
 		foreach ($menu as $parent_menu) {
 			if ($parent_menu[2] == $parent) {
 				$submenu[$parent][] = $parent_menu;
 			}
 		}
 	}
-	
-	$submenu[$parent][] = array($menu_title, $access_level, $file, $page_title);
+
+	$submenu[$parent][] = array ($menu_title, $access_level, $file, $page_title);
 
 	$hookname = get_plugin_page_hookname($file, $parent);
-	if ( !empty($function) && !empty($hookname) )
+	if (!empty ($function) && !empty ($hookname))
 		add_action($hookname, $function);
 
 	return $hookname;
@@ -848,14 +1388,18 @@
 	return add_submenu_page('edit.php', $page_title, $menu_title, $access_level, $file, $function);
 }
 
+function add_theme_page($page_title, $menu_title, $access_level, $file, $function = '') {
+	return add_submenu_page('themes.php', $page_title, $menu_title, $access_level, $file, $function);
+}
+
 function validate_file($file, $allowed_files = '') {
-	if ( false !== strpos($file, './'))
+	if (false !== strpos($file, './'))
 		return 1;
-	
-	if (':' == substr($file,1,1))
+
+	if (':' == substr($file, 1, 1))
 		return 2;
 
-	if ( !empty($allowed_files) && (! in_array($file, $allowed_files)) )
+	if (!empty ($allowed_files) && (!in_array($file, $allowed_files)))
 		return 3;
 
 	return 0;
@@ -866,28 +1410,28 @@
 
 	$code = validate_file($file, $allowed_files);
 
-	if (! $code)
+	if (!$code)
 		return $file;
 
 	switch ($code) {
-	case 1:
-		die (__('Sorry, can&#8217;t edit files with ".." in the name. If you are trying to edit a file in your WordPress home directory, you can just type the name of the file in.'));
-	
-	case 2:
-		die (__('Sorry, can&#8217;t call files with their real path.'));
+		case 1 :
+			die(__('Sorry, can&#8217;t edit files with ".." in the name. If you are trying to edit a file in your WordPress home directory, you can just type the name of the file in.'));
+
+		case 2 :
+			die(__('Sorry, can&#8217;t call files with their real path.'));
 
-	case 3:
-		die (__('Sorry, that file cannot be edited.'));
+		case 3 :
+			die(__('Sorry, that file cannot be edited.'));
 	}
 }
 
 function get_home_path() {
 	$home = get_settings('home');
-	if ( $home != '' && $home != get_settings('siteurl') ) {
+	if ($home != '' && $home != get_settings('siteurl')) {
 		$home_path = parse_url($home);
 		$home_path = $home_path['path'];
 		$root = str_replace($_SERVER["PHP_SELF"], '', $_SERVER["SCRIPT_FILENAME"]);
-		$home_path = trailingslashit($root . $home_path);
+		$home_path = trailingslashit($root.$home_path);
 	} else {
 		$home_path = ABSPATH;
 	}
@@ -896,51 +1440,32 @@
 }
 
 function get_real_file_to_edit($file) {
-	if ('index.php' == $file ||
-			 '.htaccess' == $file) {
-		$real_file = get_home_path() . $file;
+	if ('index.php' == $file || '.htaccess' == $file) {
+		$real_file = get_home_path().$file;
 	} else {
-		$real_file = ABSPATH . $file;
+		$real_file = ABSPATH.$file;
 	}
 
 	return $real_file;
 }
 
-$wp_file_descriptions = 
-	array(
-	'index.php' => __('Main Template'),
-	'style.css' => __('Stylesheet'),
-	'comments.php' => __('Comments Template'),
-	'comments-popup.php' => __('Popup Comments Template'),
-	'footer.php' => __('Footer Template'),
-	'header.php' => __('Header Template'),
-	'sidebar.php' => __('Sidebar Template'),
-	'archive.php' => __('Archive Template'),
-	'category.php' => __('Category Template'),
-	'page.php' => __('Page Template'),
-	'search.php' => __('Search Template'),
-	'single.php' => __('Post Template'),
-	'404.php' => __('404 Template'),
-	'my-hacks.php' => __('my-hacks.php (legacy hacks support)'),
-	'.htaccess' => __('.htaccess (for rewrite rules)'),
+$wp_file_descriptions = array ('index.php' => __('Main Index Template'), 'style.css' => __('Stylesheet'), 'comments.php' => __('Comments'), 'comments-popup.php' => __('Popup Comments'), 'footer.php' => __('Footer'), 'header.php' => __('Header'), 'sidebar.php' => __('Sidebar'), 'archive.php' => __('Archives'), 'category.php' => __('Category Template'), 'page.php' => __('Page Template'), 'search.php' => __('Search Results'), 'single.php' => __('Single Post'), '404.php' => __('404 Template'), 'my-hacks.php' => __('my-hacks.php (legacy hacks support)'), '.htaccess' => __('.htaccess (for rewrite rules)'),
 	// Deprecated files
-	'wp-layout.css' => __('Stylesheet'),
-	'wp-comments.php' => __('Comments Template'),
-	'wp-comments-popup.php' => __('Popup Comments Template')
-	);
+	'wp-layout.css' => __('Stylesheet'), 'wp-comments.php' => __('Comments Template'), 'wp-comments-popup.php' => __('Popup Comments Template'));
 
 function get_file_description($file) {
 	global $wp_file_descriptions;
 
-	if ( isset($wp_file_descriptions[basename($file)] ) ) {
+	if (isset ($wp_file_descriptions[basename($file)])) {
 		return $wp_file_descriptions[basename($file)];
-	} elseif ( file_exists( ABSPATH . $file ) ) {
-		$template_data = implode('', file(ABSPATH . $file));
-		if ( preg_match("|Template Name:(.*)|i", $template_data, $name) )
+	}
+	elseif (file_exists(ABSPATH.$file)) {
+		$template_data = implode('', file(ABSPATH.$file));
+		if (preg_match("|Template Name:(.*)|i", $template_data, $name))
 			return $name[1];
 	}
 
-	return basename( $file );
+	return basename($file);
 }
 
 function update_recently_edited($file) {
@@ -950,7 +1475,7 @@
 		$oldfiles[] = $file;
 		$oldfiles = array_reverse($oldfiles);
 		$oldfiles = array_unique($oldfiles);
-		if ( 5 < count($oldfiles) )
+		if (5 < count($oldfiles))
 			array_pop($oldfiles);
 	} else {
 		$oldfiles[] = $file;
@@ -965,58 +1490,58 @@
 	preg_match("|Description:(.*)|i", $plugin_data, $description);
 	preg_match("|Author:(.*)|i", $plugin_data, $author_name);
 	preg_match("|Author URI:(.*)|i", $plugin_data, $author_uri);
-	if ( preg_match("|Version:(.*)|i", $plugin_data, $version) )
-		$version = $version[1];
+	if (preg_match("|Version:(.*)|i", $plugin_data, $version))
+		$version = trim($version[1]);
 	else
-		$version ='';
+		$version = '';
 
-	$description = wptexturize($description[1]);
+	$description = wptexturize(trim($description[1]));
 
 	$name = $plugin_name[1];
 	$name = trim($name);
 	$plugin = $name;
 	if ('' != $plugin_uri[1] && '' != $name) {
-		$plugin = '<a href="' . $plugin_uri[1] . '" title="' . __('Visit plugin homepage') . '">' . $plugin . '</a>';
+		$plugin = '<a href="' . trim($plugin_uri[1]) . '" title="'.__('Visit plugin homepage').'">'.$plugin.'</a>';
 	}
 
 	if ('' == $author_uri[1]) {
-		$author = $author_name[1];
+		$author = trim($author_name[1]);
 	} else {
-		$author = '<a href="' . $author_uri[1] . '" title="' . __('Visit author homepage') . '">' . $author_name[1] . '</a>';
+		$author = '<a href="' . trim($author_uri[1]) . '" title="'.__('Visit author homepage').'">' . trim($author_name[1]) . '</a>';
 	}
 
-	return array('Name' => $name, 'Title' => $plugin, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template[1]);
+	return array ('Name' => $name, 'Title' => $plugin, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template[1]);
 }
 
 function get_plugins() {
 	global $wp_plugins;
 
-	if (isset($wp_plugins)) {
+	if (isset ($wp_plugins)) {
 		return $wp_plugins;
 	}
 
-	$wp_plugins = array();
+	$wp_plugins = array ();
 	$plugin_loc = 'wp-content/plugins';
-	$plugin_root = ABSPATH . $plugin_loc;
+	$plugin_root = ABSPATH.$plugin_loc;
 
 	// Files in wp-content/plugins directory
 	$plugins_dir = @ dir($plugin_root);
 	if ($plugins_dir) {
-		while(($file = $plugins_dir->read()) !== false) {
-			if ( preg_match('|^\.+$|', $file) )
+		while (($file = $plugins_dir->read()) !== false) {
+			if (preg_match('|^\.+$|', $file))
 				continue;
-			if (is_dir($plugin_root . '/' . $file)) {
-				$plugins_subdir = @ dir($plugin_root . '/' . $file);
+			if (is_dir($plugin_root.'/'.$file)) {
+				$plugins_subdir = @ dir($plugin_root.'/'.$file);
 				if ($plugins_subdir) {
-					while(($subfile = $plugins_subdir->read()) !== false) {
-						if ( preg_match('|^\.+$|', $subfile) )
+					while (($subfile = $plugins_subdir->read()) !== false) {
+						if (preg_match('|^\.+$|', $subfile))
 							continue;
-						if ( preg_match('|\.php$|', $subfile) )
+						if (preg_match('|\.php$|', $subfile))
 							$plugin_files[] = "$file/$subfile";
 					}
 				}
 			} else {
-				if ( preg_match('|\.php$|', $file) ) 
+				if (preg_match('|\.php$|', $file))
 					$plugin_files[] = $file;
 			}
 		}
@@ -1028,10 +1553,13 @@
 
 	sort($plugin_files);
 
-	foreach($plugin_files as $plugin_file) {
+	foreach ($plugin_files as $plugin_file) {
+		if ( !is_readable("$plugin_root/$plugin_file"))
+			continue;
+
 		$plugin_data = get_plugin_data("$plugin_root/$plugin_file");
-	  
-		if (empty($plugin_data['Name'])) {
+
+		if (empty ($plugin_data['Name'])) {
 			continue;
 		}
 
@@ -1046,40 +1574,282 @@
 
 	$parent = get_admin_page_parent();
 
-	if ( empty($parent_page) || 'admin.php' == $parent_page ) {
-		if ( isset($admin_page_hooks[$plugin_page]) )
+	if (empty ($parent_page) || 'admin.php' == $parent_page) {
+		if (isset ($admin_page_hooks[$plugin_page]))
 			$page_type = 'toplevel';
-		else if ( isset($admin_page_hooks[$parent]) )
-			$page_type = $admin_page_hooks[$parent];
-	} else if ( isset($admin_page_hooks[$parent_page]) ) {
-		$page_type = $admin_page_hooks[$parent_page];
-	} else {
-		$page_type = 'admin';
-	}
+		else
+			if (isset ($admin_page_hooks[$parent]))
+				$page_type = $admin_page_hooks[$parent];
+	} else
+		if (isset ($admin_page_hooks[$parent_page])) {
+			$page_type = $admin_page_hooks[$parent_page];
+		} else {
+			$page_type = 'admin';
+		}
 
 	$plugin_name = preg_replace('!\.php!', '', $plugin_page);
 
-	return $page_type . '_page_' . $plugin_name;
+	return $page_type.'_page_'.$plugin_name;
 }
 
 function get_plugin_page_hook($plugin_page, $parent_page) {
 	global $wp_filter;
-	
+
 	$hook = get_plugin_page_hookname($plugin_page, $parent_page);
-	if ( isset($wp_filter[$hook]) )
+	if (isset ($wp_filter[$hook]))
 		return $hook;
 	else
 		return '';
 }
 
-function pimp_firefox() {
-	if ( strstr( $_SERVER['HTTP_USER_AGENT'], 'Firefox' ) )
-		return;
-	$getit = __('WordPress recommends the open-source Firefox browser');
+function browse_happy() {
+	$getit = __('WordPress recommends a better browser');
 	echo '
-	<p id="firefoxlink" style="text-align: center;"><a href="http://spreadfirefox.com/community/?q=affiliates&amp;id=2490&amp;t=1" title="' . $getit . '"><img src="../wp-images/get-firefox.png" alt="Get Firefox" /></a></p>
-	';
+		<p id="bh" style="text-align: center;"><a href="http://browsehappy.com/" title="'.$getit.'"><img src="images/browse-happy.gif" alt="Browse Happy" /></a></p>
+		';
+}
+if (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
+	add_action('admin_footer', 'browse_happy');
+
+function documentation_link($for) {
+	return;
+}
+
+function register_importer($id, $name, $description, $callback) {
+	global $wp_importers;
+
+	$wp_importers[$id] = array ($name, $description, $callback);
+}
+
+function get_importers() {
+	global $wp_importers;
+
+	return $wp_importers;
+}
+
+function current_theme_info() {
+	$themes = get_themes();
+	$current_theme = get_current_theme();
+	$ct->name = $current_theme;
+	$ct->title = $themes[$current_theme]['Title'];
+	$ct->version = $themes[$current_theme]['Version'];
+	$ct->parent_theme = $themes[$current_theme]['Parent Theme'];
+	$ct->template_dir = $themes[$current_theme]['Template Dir'];
+	$ct->stylesheet_dir = $themes[$current_theme]['Stylesheet Dir'];
+	$ct->template = $themes[$current_theme]['Template'];
+	$ct->stylesheet = $themes[$current_theme]['Stylesheet'];
+	$ct->screenshot = $themes[$current_theme]['Screenshot'];
+	$ct->description = $themes[$current_theme]['Description'];
+	$ct->author = $themes[$current_theme]['Author'];
+	return $ct;
+}
+
+
+// array wp_handle_upload ( array &file [, array overrides] )
+// file: reference to a single element of $_FILES. Call the function once for each uploaded file.
+// overrides: an associative array of names=>values to override default variables with extract($overrides, EXTR_OVERWRITE).
+// On success, returns an associative array of file attributes.
+// On failure, returns $overrides['upload_error_handler'](&$file, $message) or array('error'=>$message).
+function wp_handle_upload(&$file, $overrides = false) {
+	// The default error handler.
+	if (! function_exists('wp_handle_upload_error') ) {
+		function wp_handle_upload_error(&$file, $message) {
+			return array('error'=>$message);
+		}
+	}
+
+	// You may define your own function and pass the name in $overrides['upload_error_handler']
+	$upload_error_handler = 'wp_handle_upload_error';
+
+	// $_POST['action'] must be set and its value must equal $overrides['action'] or this:
+	$action = 'wp_handle_upload';
+
+	// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
+	$upload_error_strings = array(false,
+		__("The uploaded file exceeds the <code>upload_max_filesize</code> directive in <code>php.ini</code>."),
+		__("The uploaded file exceeds the <em>MAX_FILE_SIZE</em> directive that was specified in the HTML form."),
+		__("The uploaded file was only partially uploaded."),
+		__("No file was uploaded."),
+		__("Missing a temporary folder."),
+		__("Failed to write file to disk."));
+
+	// All tests are on by default. Most can be turned off by $override[{test_name}] = false;
+	$test_form = true;
+	$test_size = true;
+
+	// If you override this, you must provide $ext and $type!!!!
+	$test_type = true;
+
+	// Install user overrides. Did we mention that this voids your warranty?
+	if ( is_array($overrides) )
+		extract($overrides, EXTR_OVERWRITE);
+
+	// A correct form post will pass this test.
+	if ( $test_form && (!isset($_POST['action']) || ($_POST['action'] != $action)) )
+		return $upload_error_handler($file, __('Invalid form submission.'));
+
+	// A successful upload will pass this test. It makes no sense to override this one.
+	if ( $file['error'] > 0 )
+		return $upload_error_handler($file, $upload_error_strings[$file['error']]);
+
+	// A non-empty file will pass this test.
+	if ( $test_size && !($file['size'] > 0) )
+		return $upload_error_handler($file, __('File is empty. Please upload something more substantial.'));
+
+	// A properly uploaded file will pass this test. There should be no reason to override this one.
+	if (! @ is_uploaded_file($file['tmp_name']) )
+		return $upload_error_handler($file, __('Specified file failed upload test.'));
+
+	// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.
+	if ( $test_type ) {
+		$wp_filetype = wp_check_filetype($file['name'], $mimes);
+
+		extract($wp_filetype);
+
+		if ( !$type || !$ext )
+			return $upload_error_handler($file, __('File type does not meet security guidelines. Try another.'));
+	}
+
+	// A writable uploads dir will pass this test. Again, there's no point overriding this one.
+	if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )
+		return $upload_error_handler($file, $uploads['error']);
+
+	// Increment the file number until we have a unique file to save in $dir. Use $override['unique_filename_callback'] if supplied.
+	if ( isset($unique_filename_callback) && function_exists($unique_filename_callback) ) {
+		$filename = $unique_filename_callback($uploads['path'], $file['name']);
+	} else {
+		$number = '';
+		$filename = str_replace('#', '_', $file['name']);
+		$filename = str_replace(array('\\', "'"), '', $filename);
+		if ( empty($ext) )
+			$ext = '';
+		else
+			$ext = ".$ext";
+		while ( file_exists($uploads['path'] . "/$filename") ) {
+			if ( '' == "$number$ext" )
+				$filename = $filename . ++$number . $ext;
+			else
+				$filename = str_replace("$number$ext", ++$number . $ext, $filename);
+		}
+		$filename = str_replace($ext, '', $filename);
+		$filename = sanitize_title_with_dashes($filename) . $ext;
+	}
+
+	// Move the file to the uploads dir
+	$new_file = $uploads['path'] . "/$filename";
+	if ( false === @ move_uploaded_file($file['tmp_name'], $new_file) )
+		die(printf(__('The uploaded file could not be moved to %s.'), $file['path']));
+
+	// Set correct file permissions
+	$stat = stat(dirname($new_file));
+	$perms = $stat['mode'] & 0000666;
+	@ chmod($new_file, $perms);
+
+	// Compute the URL
+	$url = $uploads['url'] . "/$filename";
+
+	return array('file' => $new_file, 'url' => $url, 'type' => $type);
+}
+
+function wp_shrink_dimensions($width, $height, $wmax = 128, $hmax = 96) {
+	if ( $height <= $hmax && $width <= $wmax )
+		return array($width, $height);
+	elseif ( $width / $height > $wmax / $hmax )
+		return array($wmax, (int) ($height / $width * $wmax));
+	else
+		return array((int) ($width / $height * $hmax), $hmax);
+}
+
+function wp_import_cleanup($id) {
+	wp_delete_attachment($id);
+}
+
+function wp_import_upload_form($action) {
+?>
+<script type="text/javascript">
+function cancelUpload() {
+o = document.getElementById('uploadForm');
+o.method = 'GET';
+o.action.value = 'view';
+o.submit();
+}
+</script>
+<form enctype="multipart/form-data" id="uploadForm" method="post" action="<?php echo $action ?>">
+<label for="upload"><?php _e('File:'); ?></label><input type="file" id="upload" name="import" />
+<input type="hidden" name="action" value="save" />
+<div id="buttons">
+<input type="submit" value="<?php _e('Import'); ?>" />
+<input type="button" value="<?php _e('Cancel'); ?>" onclick="cancelUpload()" />
+</div>
+</form>
+<?php	
+}
+
+function wp_import_handle_upload() {
+	$overrides = array('test_form' => false, 'test_type' => false);
+	$file = wp_handle_upload($_FILES['import'], $overrides);
+
+	if ( isset($file['error']) )
+		return $file;
+
+	$url = $file['url'];
+	$file = $file['file'];
+	$filename = basename($file);
+
+	// Construct the object array
+	$object = array(
+		'post_title' => $filename,
+		'post_content' => $url,
+		'post_mime_type' => 'import',
+		'guid' => $url
+	);
+
+	// Save the data
+	$id = wp_insert_attachment($object, $file);
+
+	return array('file' => $file, 'id' => $id);
+}
+
+function user_can_richedit() {
+	if ( 'true' != get_user_option('rich_editing') )
+		return false;
+
+	if ( preg_match('!opera[ /][2-8]|konqueror|safari!i', $_SERVER['HTTP_USER_AGENT']) )
+		return false;
+
+	return true; // Best guess
+}
+
+function the_attachment_links($id = false) {
+	$id = (int) $id;
+	$post = & get_post($id);
+
+	if ( $post->post_status != 'attachment' )
+		return false;
+
+	$icon = get_attachment_icon($post->ID);
+
+?>
+<p><?php _e('Text linked to file') ?><br />
+<textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo $post->guid ?>" class="attachmentlink"><?php echo basename($post->guid) ?></a></textarea></p>
+<p><?php _e('Text linked to subpost') ?><br />
+<textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link($post->ID) ?>" rel="attachment" id="<?php echo $post->ID ?>"><?php echo $post->post_title ?></a></textarea></p>
+<?php if ( $icon ) : ?>
+<p><?php _e('Thumbnail linked to file') ?><br />
+<textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo $post->guid ?>" class="attachmentlink"><?php echo $icon ?></a></textarea></p>
+<p><?php _e('Thumbnail linked to subpost') ?><br />
+<textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link($post->ID) ?>" rel="attachment" id="<?php echo $post->ID ?>"><?php echo $icon ?></a></textarea></p>
+<?php endif; ?>
+<?php
 }
-add_action('admin_footer', 'pimp_firefox');
 
-?>
\ No newline at end of file
+function get_udims($width, $height) {
+	if ( $height <= 96 && $width <= 128 )
+		return array($width, $height);
+	elseif ( $width / $height > 4 / 3 )
+		return array(128, (int) ($height / $width * 128));
+	else
+		return array((int) ($width / $height * 96), 96);
+}
+
+?>
diff -ruN 1.5.2/wp-admin/admin-header.php 2.0.4/wp-admin/admin-header.php
--- 1.5.2/wp-admin/admin-header.php	2005-04-20 14:19:07.000000000 -0500
+++ 2.0.4/wp-admin/admin-header.php	2006-02-19 04:52:03.000000000 -0600
@@ -1,93 +1,67 @@
 <?php 
 @header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
-if (!isset($_GET["page"])) require_once('admin.php'); ?>
+if (!isset($_GET["page"])) require_once('admin.php');
+if ( $editing ) {
+	$dbx_js = true;
+	if ( current_user_can('manage_categories') )
+		$cat_js = true;
+}
+if ( $list_js || $cat_js )
+	$sack_js = true;
+?>
 <?php get_admin_page_title(); ?>
 <!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>
+<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_settings('blog_charset'); ?>" />
 <title><?php bloginfo('name') ?> &rsaquo; <?php echo $title; ?> &#8212; WordPress</title>
 <link rel="stylesheet" href="<?php echo get_settings('siteurl') ?>/wp-admin/wp-admin.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_settings('blog_charset'); ?>" />
-
 <script type="text/javascript">
 //<![CDATA[
-
-function customToggleLink() {
-	// TODO: Only show link if there's a hidden row
-	document.write('<small>(<a href="javascript:;" id="customtoggle" onclick="toggleHidden()"><?php _e('Show hidden'); ?></a>)</small>');
-	// TODO: Rotate link to say "show" or "hide"
-	// TODO: Use DOM
-}
-
-function toggleHidden() {
-	var allElements = document.getElementsByTagName('tr');
-	for (i = 0; i < allElements.length; i++) {
-		if ( allElements[i].className.indexOf('hidden') != -1 ) {
-			 allElements[i].className = allElements[i].className.replace('hidden', '');
-		}
-	}
-}
-
-<?php if ( isset($xfn) ) : ?>
-
-function GetElementsWithClassName(elementName, className) {
-	var allElements = document.getElementsByTagName(elementName);
-	var elemColl = new Array();
-	for (i = 0; i < allElements.length; i++) {
-		if (allElements[i].className == className) {
-			elemColl[elemColl.length] = allElements[i];
-		}
-	}
-	return elemColl;
-}
-
-function meChecked() {
-  var undefined;
-  var eMe = document.getElementById('me');
-  if (eMe == undefined) return false;
-  else return eMe.checked;
-}
-
-function upit() {
-	var isMe = meChecked(); //document.getElementById('me').checked;
-	var inputColl = GetElementsWithClassName('input', 'valinp');
-	var results = document.getElementById('rel');
-	var linkText, linkUrl, inputs = '';
-	for (i = 0; i < inputColl.length; i++) {
-		 inputColl[i].disabled = isMe;
-		 inputColl[i].parentNode.className = isMe ? 'disabled' : '';
-		 if (!isMe && inputColl[i].checked && inputColl[i].value != '') {
-			inputs += inputColl[i].value + ' ';
-				}
-		 }
-	inputs = inputs.substr(0,inputs.length - 1);
-	if (isMe) inputs='me';
-	results.value = inputs;
-	}
-
-function blurry() {
-	if (!document.getElementById) return;
-
-	var aInputs = document.getElementsByTagName('input');
-
-	for (var i = 0; i < aInputs.length; i++) {		
-		 aInputs[i].onclick = aInputs[i].onkeyup = upit;
-	}
-}
-
-window.onload = blurry;
-<?php endif; ?>
-
+function addLoadEvent(func) {if ( typeof wpOnload!='function'){wpOnload=func;}else{ var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}}
 //]]>
 </script>
-
-<?php do_action('admin_head', ''); ?>
+<script type="text/javascript" src="../wp-includes/js/fat.js"></script>
+<?php if ( $xfn_js ) { ?>
+<script type="text/javascript" src="xfn.js"></script>
+<?php } ?>
+<?php if ( $sack_js ) { ?>
+<script type="text/javascript" src="../wp-includes/js/tw-sack.js"></script>
+<?php } ?>
+<?php if ( $list_js ) { ?>
+<script type="text/javascript" src="list-manipulation.js"></script>
+<?php } ?>
+<?php if ( $dbx_js ) { ?>
+<script type="text/javascript" src="../wp-includes/js/dbx.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+addLoadEvent( function() {
+<?php switch ( $pagenow ) : case 'post.php' : ?>
+var manager = new dbxManager('postmeta');
+<?php break; case 'page-new.php' : ?>
+var manager = new dbxManager('pagemeta');
+<?php break; endswitch; ?>
+});
+//]]>
+</script>
+<script type="text/javascript" src="../wp-includes/js/dbx-key.js"></script>
+<?php } ?>
+<?php if ( $editing && user_can_richedit() ) { ?>
+<script type="text/javascript" src="../wp-includes/js/tinymce/tiny_mce_gzip.php?ver=20051211"></script>
+<?php } ?>
+<?php if ( $cat_js ) { ?>
+<script type="text/javascript" src="cat-js.php"></script>
+<?php } ?>
+<?php if ( ($parent_file != 'link-manager.php') && ($parent_file != 'options-general.php') ) : ?>
+<style type="text/css">* html { overflow-x: hidden; }</style>
+<?php endif; ?>
+<?php do_action('admin_head'); ?>
 </head>
 <body>
-
 <div id="wphead">
 <h1><?php echo wptexturize(get_settings(('blogname'))); ?> <span>(<a href="<?php echo get_settings('home') . '/'; ?>"><?php _e('View site') ?> &raquo;</a>)</span></h1>
 </div>
+<div id="user_info"><p><?php printf(__('Howdy, <strong>%s</strong>.'), $user_identity) ?> [<a href="<?php echo get_settings('siteurl'); ?>/wp-login.php?action=logout" title="<?php _e('Log out of this account') ?>"><?php _e('Sign Out'); ?></a>, <a href="profile.php"><?php _e('My Account'); ?></a>] </p></div>
 
 <?php
 require(ABSPATH . '/wp-admin/menu-header.php');
diff -ruN 1.5.2/wp-admin/admin.php 2.0.4/wp-admin/admin.php
--- 1.5.2/wp-admin/admin.php	2005-05-09 06:06:45.000000000 -0500
+++ 2.0.4/wp-admin/admin.php	2006-07-26 17:56:56.000000000 -0500
@@ -3,18 +3,21 @@
 	require_once( ABSPATH . 'wp-config.php');
 else
     require_once('../wp-config.php');
+
+if ( get_option('db_version') != $wp_db_version )
+	die (sprintf(__("Your database is out-of-date.  Please <a href='%s'>upgrade</a>."), get_option('siteurl') . '/wp-admin/upgrade.php'));
     
 require_once(ABSPATH . 'wp-admin/admin-functions.php');
+require_once(ABSPATH . 'wp-admin/admin-db.php');
+require_once(ABSPATH . WPINC . '/registration-functions.php');
+
 auth_redirect();
 
-header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-header('Cache-Control: no-cache, must-revalidate, max-age=0');
-header('Pragma: no-cache');
+nocache_headers();
 
 update_category_cache();
 
-get_currentuserinfo();
+wp_get_current_user();
 
 $posts_per_page = get_settings('posts_per_page');
 $what_to_show = get_settings('what_to_show');
@@ -37,11 +40,17 @@
     }
 }
 
+$xfn_js = $sack_js = $list_js = $cat_js = $dbx_js = $editing = false;
+
+if (isset($_GET['page'])) {
+	$plugin_page = stripslashes($_GET['page']);
+	$plugin_page = plugin_basename($plugin_page);
+}
+
 require(ABSPATH . '/wp-admin/menu.php');
 
 // Handle plugin admin pages.
-if (isset($_GET['page'])) {
-	$plugin_page = plugin_basename($_GET['page']);
+if (isset($plugin_page)) {
 	$page_hook = get_plugin_page_hook($plugin_page, $pagenow);
 
 	if ( $page_hook ) {
@@ -55,7 +64,7 @@
 		}
 		
 		if (! file_exists(ABSPATH . "wp-content/plugins/$plugin_page"))
-			die(sprintf(__('Cannot load %s.'), $plugin_page));
+			die(sprintf(__('Cannot load %s.'), htmlentities($plugin_page)));
 
 		if (! isset($_GET['noheader']))
 			require_once(ABSPATH . '/wp-admin/admin-header.php');
@@ -66,6 +75,38 @@
 	include(ABSPATH . 'wp-admin/admin-footer.php');
 
 	exit();
+} else if (isset($_GET['import'])) {
+	
+	$importer = $_GET['import'];
+
+	if ( ! current_user_can('import') )
+		wp_die(__('You are not allowed to import.'));
+
+	if ( validate_file($importer) ) {
+		die(__('Invalid importer.'));
+	}
+		
+	if (! file_exists(ABSPATH . "wp-admin/import/$importer.php"))
+		die(__('Cannot load importer.'));
+	
+	include(ABSPATH . "wp-admin/import/$importer.php");
+
+	$parent_file = 'import.php';
+	$title = __('Import');
+	
+	if (! isset($_GET['noheader']))
+		require_once(ABSPATH . 'wp-admin/admin-header.php');
+
+	require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
+
+	define('WP_IMPORTING', true);
+	kses_init_filters();  // Always filter imported data with kses.
+
+	call_user_func($wp_importers[$importer][2]);
+			
+	include(ABSPATH . 'wp-admin/admin-footer.php');
+
+	exit();
 }
 
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-admin/bookmarklet.php 2.0.4/wp-admin/bookmarklet.php
--- 1.5.2/wp-admin/bookmarklet.php	2005-02-14 18:48:36.000000000 -0600
+++ 2.0.4/wp-admin/bookmarklet.php	2005-10-28 03:43:23.000000000 -0500
@@ -2,11 +2,10 @@
 $mode = 'bookmarklet';
 require_once('admin.php');
 
-if ($user_level == 0)
+if ( ! current_user_can('edit_posts') )
 	die ("Cheatin' uh?");
 
-if ('b' == $a) {
-
+if ('b' == $a):
 ?><!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>
@@ -19,33 +18,32 @@
 <body></body>
 </html>
 <?php
-} else {
-	$popuptitle = wp_specialchars(stripslashes($popuptitle));
-	$text       = wp_specialchars(stripslashes(urldecode($text)));
+exit;
+endif;
+
+$post = get_default_post_to_edit();
+
+$popuptitle = wp_specialchars(stripslashes($popuptitle));
+$text       = wp_specialchars(stripslashes(urldecode($text)));
 	
-	$popuptitle = funky_javascript_fix($popuptitle);
-	$text       = funky_javascript_fix($text);
+$popuptitle = funky_javascript_fix($popuptitle);
+$text       = funky_javascript_fix($text);
 	
-	$post_title = wp_specialchars($_REQUEST['post_title']);
-	if (!empty($post_title)) {
-		$post_title =  stripslashes($post_title);
-	} else {
-		$post_title = $popuptitle;
-	}
+$post_title = wp_specialchars($_REQUEST['post_title']);
+if (!empty($post_title))
+	$post->post_title =  stripslashes($post_title);
+else
+	$post->post_title = $popuptitle;
 	
-	$edited_post_title = wp_specialchars($post_title);
-
-// $post_pingback needs to be set in any file that includes edit-form.php
-    $post_pingback = get_settings('default_pingback_flag');
-    
-    $content  = wp_specialchars($_REQUEST['content']);
-	$popupurl = wp_specialchars($_REQUEST['popupurl']);
+  
+$content  = wp_specialchars($_REQUEST['content']);
+$popupurl = wp_specialchars($_REQUEST['popupurl']);
     if ( !empty($content) ) {
-        $content = wp_specialchars( stripslashes($_REQUEST['content']) );
+        $post->post_content = wp_specialchars( stripslashes($_REQUEST['content']) );
     } else {
-        $content = '<a href="'.$popupurl.'">'.$popuptitle.'</a>'."\n$text";
+        $post->post_content = '<a href="'.$popupurl.'">'.$popuptitle.'</a>'."\n$text";
     }
-    
+
     /* /big funky fixes */
 
 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -103,6 +101,4 @@
 <?php do_action('admin_footer', ''); ?>
 
 </body>
-</html><?php
-}
-?>
+</html>
diff -ruN 1.5.2/wp-admin/categories.php 2.0.4/wp-admin/categories.php
--- 1.5.2/wp-admin/categories.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/wp-admin/categories.php	2006-07-23 13:27:00.000000000 -0500
@@ -3,6 +3,7 @@
 
 $title = __('Categories');
 $parent_file = 'edit.php';
+$list_js = true;
 
 $wpvarstoreset = array('action','cat');
 for ($i=0; $i<count($wpvarstoreset); $i += 1) {
@@ -23,44 +24,33 @@
 switch($action) {
 
 case 'addcat':
-	if ($user_level < 3)
+
+	check_admin_referer('add-category');
+
+	if ( !current_user_can('manage_categories') )
 		die (__('Cheatin&#8217; uh?'));
 	
-	$cat_name= wp_specialchars($_POST['cat_name']);
-	$id_result = $wpdb->get_row("SHOW TABLE STATUS LIKE '$wpdb->categories'");
-	$cat_ID = $id_result->Auto_increment;
-	$category_nicename = sanitize_title($cat_name, $cat_ID);
-	$category_description = $_POST['category_description'];
-	$cat = intval($_POST['cat']);
-	
-	$wpdb->query("INSERT INTO $wpdb->categories (cat_ID, cat_name, category_nicename, category_description, category_parent) VALUES ('0', '$cat_name', '$category_nicename', '$category_description', '$cat')");
-	do_action('add_category', $wpdb->insert_id);
-	
-	header('Location: categories.php?message=1#addcat');
+	wp_insert_category($_POST);
+
+	wp_redirect('categories.php?message=1#addcat');
 break;
 
 case 'delete':
+	$cat_ID = (int) $_GET['cat_ID'];
+	check_admin_referer('delete-category_' .  $cat_ID);
 
-	check_admin_referer();
+	if ( !current_user_can('manage_categories') )
+		die (__('Cheatin&#8217; uh?'));
 
-	$cat_ID = (int) $_GET['cat_ID'];
 	$cat_name = get_catname($cat_ID);
-	$category = $wpdb->get_row("SELECT * FROM $wpdb->categories WHERE cat_ID = '$cat_ID'");
-	$cat_parent = $category->category_parent;
 
-	if ( 1 == $cat_ID )
+	// Don't delete the default cats.
+	if ( $cat_ID == get_option('default_category') )
 		die(sprintf(__("Can't delete the <strong>%s</strong> category: this is the default one"), $cat_name));
 
-	if ( $user_level < 3 )
-		die (__('Cheatin&#8217; uh?'));
-
-	$wpdb->query("DELETE FROM $wpdb->categories WHERE cat_ID = '$cat_ID'");
-	$wpdb->query("UPDATE $wpdb->categories SET category_parent = '$cat_parent' WHERE category_parent = '$cat_ID'");
-	// TODO: Only set categories to general if they're not in another category already
-	$wpdb->query("UPDATE $wpdb->post2cat SET category_id='1' WHERE category_id='$cat_ID'");
-	do_action('delete_category', $cat_ID);
+	wp_delete_category($cat_ID);
 
-	header('Location: categories.php?message=2');
+	wp_redirect('categories.php?message=2');
 
 break;
 
@@ -68,18 +58,18 @@
 
     require_once ('admin-header.php');
     $cat_ID = (int) $_GET['cat_ID'];
-    $category = $wpdb->get_row("SELECT * FROM $wpdb->categories WHERE cat_ID = '$cat_ID'");
-    $cat_name = $category->cat_name;
+    $category = get_category_to_edit($cat_ID);
     ?>
 
 <div class="wrap">
  <h2><?php _e('Edit Category') ?></h2>
  <form name="editcat" action="categories.php" method="post">
+	  <?php wp_nonce_field('update-category_' .  $category->cat_ID); ?>
 	  <table class="editform" width="100%" cellspacing="2" cellpadding="5">
 		<tr>
 		  <th width="33%" scope="row"><?php _e('Category name:') ?></th>
-		  <td width="67%"><input name="cat_name" type="text" value="<?php echo wp_specialchars($cat_name); ?>" size="40" /> <input type="hidden" name="action" value="editedcat" />
-<input type="hidden" name="cat_ID" value="<?php echo $cat_ID ?>" /></td>
+		  <td width="67%"><input name="cat_name" type="text" value="<?php echo wp_specialchars($category->cat_name); ?>" size="40" /> <input type="hidden" name="action" value="editedcat" />
+<input type="hidden" name="cat_ID" value="<?php echo $category->cat_ID ?>" /></td>
 		</tr>
 		<tr>
 			<th scope="row"><?php _e('Category slug:') ?></th>
@@ -88,7 +78,7 @@
 		<tr>
 			<th scope="row"><?php _e('Category parent:') ?></th>
 			<td>        
-			<select name='cat'>
+			<select name='category_parent'>
 	  <option value='0' <?php if (!$category->category_parent) echo " selected='selected'"; ?>><?php _e('None') ?></option>
 	  <?php wp_dropdown_cats($category->cat_ID, $category->category_parent); ?>
 	  </select></td>
@@ -107,17 +97,15 @@
 break;
 
 case 'editedcat':
-	if ($user_level < 3)
-		die (__('Cheatin&#8217; uh?'));
-	
-	$cat_name = wp_specialchars($_POST['cat_name']);
 	$cat_ID = (int) $_POST['cat_ID'];
-	$category_nicename = sanitize_title($_POST['category_nicename'], $cat_ID);
-	$category_description = $_POST['category_description'];
+	check_admin_referer('update-category_' . $cat_ID);
+
+	if ( !current_user_can('manage_categories') )
+		die (__('Cheatin&#8217; uh?'));
 	
-	$wpdb->query("UPDATE $wpdb->categories SET cat_name = '$cat_name', category_nicename = '$category_nicename', category_description = '$category_description', category_parent = '$cat' WHERE cat_ID = '$cat_ID'");
+	wp_update_category($_POST);
 
-	header('Location: categories.php?message=3');
+	wp_redirect('categories.php?message=3');
 break;
 
 default:
@@ -130,16 +118,16 @@
 ?>
 
 <?php if (isset($_GET['message'])) : ?>
-<div class="updated"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
 <?php endif; ?>
 
 <div class="wrap">
-<?php if ( $user_level > 3 ) : ?>
+<?php if ( current_user_can('manage_categories') ) : ?>
 	<h2><?php printf(__('Categories (<a href="%s">add new</a>)'), '#addcat') ?> </h2>
 <?php else : ?>
 	<h2><?php _e('Categories') ?> </h2>
 <?php endif; ?>
-<table width="100%" cellpadding="3" cellspacing="3">
+<table id="the-list-x" width="100%" cellpadding="3" cellspacing="3">
 	<tr>
 		<th scope="col"><?php _e('ID') ?></th>
         <th scope="col"><?php _e('Name') ?></th>
@@ -152,22 +140,23 @@
 ?>
 </table>
 
+<div id="ajax-response"></div>
+
 </div>
 
-<?php if ( $user_level > 3 ) : ?>
+<?php if ( current_user_can('manage_categories') ) : ?>
 <div class="wrap">
-    <p><?php printf(__('<strong>Note:</strong><br />Deleting a category does not delete posts from that category, it will just set them back to the default category <strong>%s</strong>.'), get_catname(1)) ?>
-  </p>
+<p><?php printf(__('<strong>Note:</strong><br />Deleting a category does not delete posts from that category, it will just set them back to the default category <strong>%s</strong>.'), get_catname(get_option('default_category'))) ?></p>
 </div>
 
 <div class="wrap">
     <h2><?php _e('Add New Category') ?></h2>
     <form name="addcat" id="addcat" action="categories.php" method="post">
-        
+    <?php wp_nonce_field('add-category'); ?>
         <p><?php _e('Name:') ?><br />
         <input type="text" name="cat_name" value="" /></p>
         <p><?php _e('Category parent:') ?><br />
-        <select name='cat' class='postform'>
+        <select name='category_parent' class='postform'>
         <option value='0'><?php _e('None') ?></option>
         <?php wp_dropdown_cats(0); ?>
         </select></p>
diff -ruN 1.5.2/wp-admin/cat-js.php 2.0.4/wp-admin/cat-js.php
--- 1.5.2/wp-admin/cat-js.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/cat-js.php	2006-04-21 16:18:32.000000000 -0500
@@ -0,0 +1,178 @@
+<?php
+require_once('admin.php');
+header('Content-type: text/javascript; charset=' . get_settings('blog_charset'), true);
+?>
+var ajaxCat = new sack();
+var newcat;
+ 
+function newCatAddIn() {
+	if ( !document.getElementById('jaxcat') ) return false;
+	var ajaxcat = document.createElement('span');
+	ajaxcat.id = 'ajaxcat';
+
+	newcat = document.createElement('input');
+	newcat.type = 'text';
+	newcat.name = 'newcat';
+	newcat.id = 'newcat';
+	newcat.size = '16';
+	newcat.setAttribute('autocomplete', 'off');
+	newcat.onkeypress = ajaxNewCatKeyPress;
+
+	var newcatSub = document.createElement('input');
+	newcatSub.type = 'button';
+	newcatSub.name = 'Button';
+	newcatSub.id = 'catadd';
+	newcatSub.value = '<?php echo addslashes(__('Add')); ?>';
+	newcatSub.onclick = ajaxNewCat;
+
+	ajaxcat.appendChild(newcat);
+	ajaxcat.appendChild(newcatSub);
+	document.getElementById('jaxcat').appendChild(ajaxcat);
+
+	howto = document.createElement('span');
+	howto.innerHTML = '<?php echo addslashes(__('Separate multiple categories with commas.')); ?>';
+	howto.id = 'howto';
+	ajaxcat.appendChild(howto);
+}
+
+addLoadEvent(newCatAddIn);
+
+function getResponseElement() {
+	var p = document.getElementById('ajaxcatresponse');
+	if (!p) {
+		p = document.createElement('span');
+		document.getElementById('jaxcat').appendChild(p);
+		p.id = 'ajaxcatresponse';
+	}
+	return p;
+}
+
+function newCatLoading() {
+	var p = getResponseElement();
+	p.innerHTML = '<?php echo addslashes(__('Sending Data...')); ?>';
+}
+
+function newCatLoaded() {
+	var p = getResponseElement();
+	p.innerHTML = '<?php echo addslashes(__('Data Sent...')); ?>';
+}
+
+function newCatInteractive() {
+	var p = getResponseElement();
+	p.innerHTML = '<?php echo addslashes(__('Processing Request...')); ?>';
+}
+
+function newCatCompletion() {
+	var p = getResponseElement();
+	var id    = 0;
+	var ids   = new Array();
+	var names = new Array();
+	
+	ids   = myPload( ajaxCat.response );
+	names = myPload( newcat.value );
+	for ( i = 0; i < ids.length; i++ ) {
+		id = ids[i].replace(/[\n\r]+/g, "");
+		if ( id == '-1' ) {
+			p.innerHTML = "<?php echo addslashes(__("You don't have permission to do that.")); ?>";
+			return;
+		}
+		if ( id == '0' ) {
+			p.innerHTML = "<?php echo addslashes(__('That category name is invalid.  Try something else.')); ?>";
+			return;
+		}
+		
+		var exists = document.getElementById('category-' + id);
+		
+		if (exists) {
+			var moveIt = exists.parentNode;
+			var container = moveIt.parentNode;
+			container.removeChild(moveIt);
+			container.insertBefore(moveIt, container.firstChild);
+			moveIt.id = 'new-category-' + id;
+			exists.checked = 'checked';
+			var nowClass = moveIt.className;
+			moveIt.className = nowClass + ' fade';
+			Fat.fade_all();
+			moveIt.className = nowClass;
+		} else {
+			var catDiv = document.getElementById('categorychecklist');
+			var newLabel = document.createElement('label');
+			newLabel.setAttribute('for', 'category-' + id);
+			newLabel.id = 'new-category-' + id;
+			newLabel.className = 'selectit fade';
+	
+			var newCheck = document.createElement('input');
+			newCheck.type = 'checkbox';
+			newCheck.value = id;
+			newCheck.name = 'post_category[]';
+			newCheck.id = 'category-' + id;
+			newLabel.appendChild(newCheck);
+	
+			var newLabelText = document.createTextNode(' ' + names[i]);
+			newLabel.appendChild(newLabelText);
+	
+			catDiv.insertBefore(newLabel, catDiv.firstChild);
+			newCheck.checked = 'checked';
+	
+			Fat.fade_all();
+			newLabel.className = 'selectit';
+		}
+		newcat.value = '';
+	}
+	p.parentNode.removeChild(p);
+//	var id = parseInt(ajaxCat.response, 10);
+}
+
+function ajaxNewCatKeyPress(e) {
+	if (!e) {
+		if (window.event) {
+			e = window.event;
+		} else {
+			return;
+		}
+	}
+	if (e.keyCode == 13) {
+		ajaxNewCat();
+		e.returnValue = false;
+		e.cancelBubble = true;
+		return false;
+	}
+}
+
+function ajaxNewCat() {
+	var newcat = document.getElementById('newcat');
+	var split_cats = new Array(1);
+	var catString = '';
+
+	catString = ajaxCat.encVar('ajaxnewcat', newcat.value) + '&' + ajaxCat.encVar('cookie', document.cookie);
+	ajaxCat.requestFile = 'edit-form-ajax-cat.php';
+	ajaxCat.method = 'POST';
+	ajaxCat.onLoading = newCatLoading;
+	ajaxCat.onLoaded = newCatLoaded;
+	ajaxCat.onInteractive = newCatInteractive;
+	ajaxCat.onCompletion = newCatCompletion;
+	ajaxCat.runAJAX(catString);
+}
+
+function myPload( str ) {
+	var fixedExplode = new Array();
+	var comma = new String(',');
+	var count = 0;
+	var currentElement = '';
+
+	for( x=0; x < str.length; x++) {
+		andy = str.charAt(x);
+		if ( comma.indexOf(andy) != -1 ) {
+			currentElement = currentElement.replace(new RegExp('^\\s*(.*?)\\s*$', ''), '$1'); // trim
+			fixedExplode[count] = currentElement;
+			currentElement = "";
+			count++;
+		} else {
+			currentElement += andy;
+		}
+	}
+
+	if ( currentElement != "" )
+		fixedExplode[count] = currentElement;
+	return fixedExplode;
+}
diff -ruN 1.5.2/wp-admin/edit-comments.php 2.0.4/wp-admin/edit-comments.php
--- 1.5.2/wp-admin/edit-comments.php	2005-02-10 20:00:38.000000000 -0600
+++ 2.0.4/wp-admin/edit-comments.php	2006-06-30 21:05:34.000000000 -0500
@@ -3,6 +3,7 @@
 
 $title = __('Edit Comments');
 $parent_file = 'edit.php';
+$list_js = true;
 
 require_once('admin-header.php');
 if (empty($_GET['mode'])) $mode = 'view';
@@ -38,13 +39,15 @@
 <p><a href="?mode=view"><?php _e('View Mode') ?></a> | <a href="?mode=edit"><?php _e('Mass Edit Mode') ?></a></p>
 <?php
 if ( !empty( $_POST['delete_comments'] ) ) :
+	check_admin_referer('bulk-comments');
+
 	$i = 0;
 	foreach ($_POST['delete_comments'] as $comment) : // Check the permissions on each
 		$comment = (int) $comment;
 		$post_id = $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID = $comment");
 		$authordata = get_userdata( $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = $post_id") );
-		if ( user_can_delete_post_comments($user_ID, $post_id) ) :
-			$wpdb->query("DELETE FROM $wpdb->comments WHERE comment_ID = $comment");
+		if ( current_user_can('edit_post', $post_id) ) :
+			wp_set_comment_status($comment, "delete");
 			++$i;
 		endif;
 	endforeach;
@@ -76,7 +79,7 @@
 		else
 			$start = '';
 
-		echo "<ol class='commentlist' $start>";
+		echo "<ol id='the-list' class='commentlist' $start>";
 		$i = 0;
 		foreach ($comments as $comment) {
 		++$i; $class = '';
@@ -86,24 +89,22 @@
 				$class .= ' unapproved';
 			if ($i % 2)
 				$class .= ' alternate';
-			echo "<li class='$class'>";
+			echo "<li id='comment-$comment->comment_ID' class='$class'>";
 ?>		
-        <p><strong><?php _e('Name:') ?></strong> <?php comment_author() ?> <?php if ($comment->comment_author_email) { ?>| <strong><?php _e('E-mail:') ?></strong> <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url) { ?> | <strong><?php _e('URI:') ?></strong> <?php comment_author_url_link() ?> <?php } ?>| <strong><?php _e('IP:') ?></strong> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
+        <p><strong><?php _e('Name:') ?></strong> <?php comment_author() ?> <?php if ($comment->comment_author_email) { ?>| <strong><?php _e('E-mail:') ?></strong> <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url ) { ?> | <strong><?php _e('URI:') ?></strong> <?php comment_author_url_link() ?> <?php } ?>| <strong><?php _e('IP:') ?></strong> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
 		
 		<?php comment_text() ?>
 
         <p><?php _e('Posted'); echo ' '; comment_date('M j, g:i A');  
-			if ( user_can_edit_post_comments($user_ID, $comment->comment_post_ID) ) {
+			if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
 				echo " | <a href=\"post.php?action=editcomment&amp;comment=".$comment->comment_ID."\">" . __('Edit Comment') . "</a>";
-			}
-			if ( user_can_delete_post_comments($user_ID, $comment->comment_post_ID) ) {
-				echo " | <a href=\"post.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID."\" onclick=\"return confirm('" . sprintf(__("You are about to delete this comment by \'%s\'\\n  \'Cancel\' to stop, \'OK\' to delete."), $comment->comment_author) . "')\">" . __('Delete Comment') . "</a> &#8212; ";
+				echo ' | <a href="' . wp_nonce_url('post.php?action=deletecomment&amp;p=' . $comment->comment_post_ID . '&amp;comment=' . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . '" onclick="return deleteSomething( \'comment\', ' . $comment->comment_ID . ', \'' . __("You are about to delete this comment.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete.") . "' );\">" . __('Delete Comment') . '</a> ';
 			} // end if any comments to show
 			// Get post title
-			if ( user_can_edit_post($user_ID, $comment->comment_post_ID) ) {
+			if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
 				$post_title = $wpdb->get_var("SELECT post_title FROM $wpdb->posts WHERE ID = $comment->comment_post_ID");
 				$post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;
-				?> <a href="post.php?action=edit&amp;post=<?php echo $comment->comment_post_ID; ?>"><?php printf(__('Edit Post &#8220;%s&#8221;'), stripslashes($post_title)); ?></a>
+				?> | <a href="post.php?action=edit&amp;post=<?php echo $comment->comment_post_ID; ?>"><?php printf(__('Edit Post &#8220;%s&#8221;'), stripslashes($post_title)); ?></a>
 				<?php } ?>
 			 | <a href="<?php echo get_permalink($comment->comment_post_ID); ?>"><?php _e('View Post') ?></a></p>
 		</li>
@@ -111,6 +112,8 @@
 <?php } // end foreach ?>
 </ol>
 
+<div id="ajax-response"></div>
+
 <?php
 	} else {
 
@@ -123,8 +126,9 @@
 } elseif ('edit' == $mode) {
 
 	if ($comments) {
-		echo '<form name="deletecomments" id="deletecomments" action="" method="post"> 
-		<table width="100%" cellpadding="3" cellspacing="3">
+		echo '<form name="deletecomments" id="deletecomments" action="" method="post"> ';
+		wp_nonce_field('bulk-comments');
+		echo '<table width="100%" cellpadding="3" cellspacing="3">
   <tr>
     <th scope="col">*</th>
     <th scope="col">' .  __('Name') . '</th>
@@ -138,22 +142,22 @@
 		$class = ('alternate' == $class) ? '' : 'alternate';
 ?>
   <tr class='<?php echo $class; ?>'>
-    <td><?php if (user_can_delete_post_comments($user_ID, $comment->comment_post_ID) ) { ?><input type="checkbox" name="delete_comments[]" value="<?php echo $comment->comment_ID; ?>" /><?php } ?></td>
+    <td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) { ?><input type="checkbox" name="delete_comments[]" value="<?php echo $comment->comment_ID; ?>" /><?php } ?></td>
     <td><?php comment_author_link() ?></td>
     <td><?php comment_author_email_link() ?></td>
     <td><a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></td>
     <td><?php comment_excerpt(); ?></td>
     <td><a href="<?php echo get_permalink($comment->comment_post_ID); ?>#comment-<?php comment_ID() ?>" class="edit"><?php _e('View') ?></a></td>
-    <td><?php if ( user_can_edit_post_comments($user_ID, $comment->comment_post_ID) ) {
+    <td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
 	echo "<a href='post.php?action=editcomment&amp;comment=$comment->comment_ID' class='edit'>" .  __('Edit') . "</a>"; } ?></td>
-    <td><?php if ( user_can_delete_post_comments($user_ID, $comment->comment_post_ID) ) {
-            echo "<a href=\"post.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID."\" onclick=\"return confirm('" . sprintf(__("You are about to delete this comment by \'%s\'\\n  \'Cancel\' to stop, \'OK\' to delete."), $comment->comment_author) . "')\"    class='delete'>" . __('Delete') . "</a>"; } ?></td>
+    <td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
+            echo "<a href=\"" . wp_nonce_url("post.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return confirm('" . __("You are about to delete this comment.\\n  \'Cancel\' to stop, \'OK\' to delete.") . "')\"    class='delete'>" . __('Delete') . "</a>"; } ?></td>
   </tr>
 		<?php 
 		} // end foreach
 	?></table>
     <p><a href="javascript:;" onclick="checkAll(document.getElementById('deletecomments')); return false; "><?php _e('Invert Checkbox Selection') ?></a></p>
-            <p class="submit"><input type="submit" name="Submit" value="<?php _e('Delete Checked Comments') ?> &raquo;" onclick="return confirm('<?php _e("You are about to delete these comments permanently \\n  \'Cancel\' to stop, \'OK\' to delete.") ?>')" />	</p>
+            <p class="submit"><input type="submit" name="Submit" value="<?php _e('Delete Checked Comments') ?> &raquo;" onclick="return confirm('<?php _e("You are about to delete these comments permanently.\\n  \'Cancel\' to stop, \'OK\' to delete.") ?>')" />	</p>
   </form>
 <?php
 	} else {
@@ -168,4 +172,4 @@
 
 </div>
 
-<?php include('admin-footer.php'); ?>
\ No newline at end of file
+<?php include('admin-footer.php'); ?>
diff -ruN 1.5.2/wp-admin/edit-form-advanced.php 2.0.4/wp-admin/edit-form-advanced.php
--- 1.5.2/wp-admin/edit-form-advanced.php	2005-04-16 13:47:37.000000000 -0500
+++ 2.0.4/wp-admin/edit-form-advanced.php	2006-07-06 01:35:28.000000000 -0500
@@ -4,187 +4,267 @@
 $messages[3] = __('Custom field deleted.');
 ?>
 <?php if (isset($_GET['message'])) : ?>
-<div class="updated"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
 <?php endif; ?>
 
 <form name="post" action="post.php" method="post" id="post">
+<?php if ( (isset($mode) && 'bookmarklet' == $mode) || 
+            isset($_GET['popupurl']) ): ?>
+<input type="hidden" name="mode" value="bookmarklet" />
+<?php endif; ?>
 
 <div class="wrap">
-<h2><?php _e('Write Post'); ?></h2>
+<h2 id="write-post"><?php _e('Write Post'); ?><?php if ( 0 != $post_ID ) : ?>
+ <small class="quickjump"><a href="#preview-post"><?php _e('preview &darr;'); ?></a></small><?php endif; ?></h2>
 <?php
 
 if (0 == $post_ID) {
 	$form_action = 'post';
+	$temp_ID = -1 * time();
+	$form_extra = "<input type='hidden' name='temp_ID' value='$temp_ID' />";
+	wp_nonce_field('add-post');
 } else {
 	$form_action = 'editpost';
 	$form_extra = "<input type='hidden' name='post_ID' value='$post_ID' />";
+	wp_nonce_field('update-post_' .  $post_ID);
 }
 
 $form_pingback = '<input type="hidden" name="post_pingback" value="' . get_option('default_pingback_flag') . '" id="post_pingback" />';
 
-$form_prevstatus = '<input type="hidden" name="prev_status" value="'.$post_status.'" />';
+$form_prevstatus = '<input type="hidden" name="prev_status" value="' . $post->post_status . '" />';
 
-$form_trackback = '<input type="text" name="trackback_url" style="width: 415px" id="trackback" tabindex="7" value="'. str_replace("\n", ' ', $to_ping) .'" />';
+$form_trackback = '<input type="text" name="trackback_url" style="width: 415px" id="trackback" tabindex="7" value="'. str_replace("\n", ' ', $post->to_ping) .'" />';
 
-if ('' != $pinged) {
-	$pings .= '<p>'. __('Already pinged:') . '</p><ul>';
-	$already_pinged = explode("\n", trim($pinged));
+if ('' != $post->pinged) {
+	$pings = '<p>'. __('Already pinged:') . '</p><ul>';
+	$already_pinged = explode("\n", trim($post->pinged));
 	foreach ($already_pinged as $pinged_url) {
 		$pings .= "\n\t<li>$pinged_url</li>";
 	}
 	$pings .= '</ul>';
 }
 
-$saveasdraft = '<input name="save" type="submit" id="save" tabindex="6" value="' . __('Save and Continue Editing') . '" />';
+$saveasdraft = '<input name="save" type="submit" id="save" tabindex="3" value="' . __('Save and Continue Editing') . '" />';
 
-if (empty($post_status)) $post_status = 'draft';
+if (empty($post->post_status)) $post->post_status = 'draft';
 
 ?>
 
 <input type="hidden" name="user_ID" value="<?php echo $user_ID ?>" />
 <input type="hidden" name="action" value="<?php echo $form_action ?>" />
-<input type="hidden" name="post_author" value="<?php echo $post_author ?>" />
+<input type="hidden" name="post_author" value="<?php echo $post->post_author ?>" />
 
 <?php echo $form_extra ?>
 <?php if (isset($_GET['message']) && 2 > $_GET['message']) : ?>
 <script type="text/javascript">
-<!--
 function focusit() {
 	// focus on first input field
 	document.post.title.focus();
 }
-window.onload = focusit;
-//-->
+addLoadEvent(focusit);
 </script>
 <?php endif; ?>
 <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 $edited_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(get_settings('default_category')); ?></div>
-    </fieldset>
-
-    <fieldset id="commentstatusdiv">
-      <legend><a href="http://wordpress.org/docs/reference/post/#comments" title="<?php _e('Help on comment status') ?>"><?php _e('Discussion') ?></a></legend> 
-	  <div>
-	  <input name="advanced_view" type="hidden" value="1" />
-	  <label for="comment_status" class="selectit">
-	      <input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($comment_status, 'open'); ?> />
-         <?php _e('Allow Comments') ?></label> 
-		 <label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label>
-</div>
-</fieldset>
-    <fieldset id="postpassworddiv">
-      <legend><a href="http://wordpress.org/docs/reference/post/#post_password" title="<?php _e('Help on post password') ?>"><?php _e('Post Password') ?></a></legend> 
-	  <div><input name="post_password" type="text" size="13" id="post_password" value="<?php echo $post_password ?>" /></div>
-    </fieldset>
-
-<br />
-<fieldset id="postexcerpt">
-<legend><a href="http://wordpress.org/docs/reference/post/#excerpt" title="<?php _e('Help with excerpts') ?>"><?php _e('Excerpt') ?></a></legend>
-<div><textarea rows="1" cols="40" name="excerpt" tabindex="4" id="excerpt"><?php echo $excerpt ?></textarea></div>
+
+<div id="moremeta">
+<div id="grabit" class="dbx-group">
+
+<fieldset id="commentstatusdiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Discussion') ?></h3>
+<div class="dbx-content">
+<input name="advanced_view" type="hidden" value="1" />
+<label for="comment_status" class="selectit">
+<input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($post->comment_status, 'open'); ?> />
+<?php _e('Allow Comments') ?></label> 
+<label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($post->ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label>
+</div>
 </fieldset>
-<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 the_quicktags(); ?>
+
+<fieldset id="passworddiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Password-Protect Post') ?></h3> 
+<div class="dbx-content"><input name="post_password" type="text" size="13" id="post_password" value="<?php echo $post->post_password ?>" /></div>
+</fieldset>
+
+<fieldset id="slugdiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Post slug') ?></h3> 
+<div class="dbx-content"><input name="post_name" type="text" size="13" id="post_name" value="<?php echo $post->post_name ?>" /></div>
+</fieldset>
+
+<fieldset id="categorydiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Categories') ?></h3>
+<div class="dbx-content">
+<p id="jaxcat"></p>
+<div id="categorychecklist"><?php dropdown_categories(get_settings('default_category')); ?></div></div>
+</fieldset>
+
+<fieldset class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Post Status') ?></h3> 
+<div class="dbx-content"><?php if ( current_user_can('publish_posts') ) : ?>
+<label for="post_status_publish" class="selectit"><input id="post_status_publish" name="post_status" type="radio" value="publish" <?php checked($post->post_status, 'publish'); ?> /> <?php _e('Published') ?></label>
+<?php endif; ?>
+	  <label for="post_status_draft" class="selectit"><input id="post_status_draft" name="post_status" type="radio" value="draft" <?php checked($post->post_status, 'draft'); ?> /> <?php _e('Draft') ?></label>
+	  <label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="radio" value="private" <?php checked($post->post_status, 'private'); ?> /> <?php _e('Private') ?></label></div>
+</fieldset>
+
+<?php if ( current_user_can('edit_posts') ) : ?>
+<fieldset class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Post Timestamp'); ?>:</h3>
+<div class="dbx-content"><?php touch_time(($action == 'edit')); ?></div>
+</fieldset>
+<?php endif; ?>
+
+<?php if ( $authors = get_editable_authors( $current_user->id ) ) : // TODO: ROLE SYSTEM ?>
+<fieldset id="authordiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Post author'); ?>:</h3>
+<div class="dbx-content">
+<select name="post_author_override" id="post_author_override">
+<?php 
+foreach ($authors as $o) :
+$o = get_userdata( $o->ID );
+if ( $post->post_author == $o->ID || ( empty($post_ID) && $user_ID == $o->ID ) ) $selected = 'selected="selected"';
+else $selected = '';
+echo "<option value='$o->ID' $selected>$o->display_name</option>";
+endforeach;
+?>
+</select>
+</div>
+</fieldset>
+<?php endif; ?>
+
+<?php do_action('dbx_post_sidebar'); ?>
+
+</div>
+</div>
+
+<fieldset id="titlediv">
+  <legend><?php _e('Title') ?></legend> 
+  <div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo $post->post_title; ?>" id="title" /></div>
+</fieldset>
+
+<fieldset id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>">
+<legend><?php _e('Post') ?></legend>
+
 <?php
  $rows = get_settings('default_post_edit_rows');
  if (($rows < 3) || ($rows > 100)) {
-     $rows = 10;
+     $rows = 12;
  }
 ?>
-<div><textarea rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="5" id="content"><?php echo $content ?></textarea></div>
+<?php the_quicktags(); ?>
+
+<div><textarea <?php if ( user_can_richedit() ) echo 'title="true" '; ?>rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="2" id="content"><?php echo user_can_richedit() ? wp_richedit_pre($post->post_content) : $post->post_content; ?></textarea></div>
 </fieldset>
-<?php
-?>
+
 <script type="text/javascript">
-<!--
+// <![CDATA[
 edCanvas = document.getElementById('content');
-//-->
+<?php if ( user_can_richedit() ) : ?>
+// This code is meant to allow tabbing from Title to Post (TinyMCE).
+if ( tinyMCE.isMSIE )
+	document.getElementById('title').onkeydown = function (e)
+		{
+			e = e ? e : window.event;
+			if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
+				var i = tinyMCE.selectedInstance;
+				if(typeof i ==  'undefined')
+					return true;
+                                tinyMCE.execCommand("mceStartTyping");
+				this.blur();
+				i.contentWindow.focus();
+				e.returnValue = false;
+				return false;
+			}
+		}
+else
+	document.getElementById('title').onkeypress = function (e)
+		{
+			e = e ? e : window.event;
+			if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
+				var i = tinyMCE.selectedInstance;
+				if(typeof i ==  'undefined')
+					return true;
+                                tinyMCE.execCommand("mceStartTyping");
+				this.blur();
+				i.contentWindow.focus();
+				e.returnValue = false;
+				return false;
+			}
+		}
+<?php endif; ?>
+// ]]>
 </script>
 
 <?php echo $form_pingback ?>
 <?php echo $form_prevstatus ?>
 
 
-<p class="submit"><?php echo $saveasdraft; ?> <input type="submit" name="submit" value="<?php _e('Save') ?>" style="font-weight: bold;" tabindex="6" /> 
+<p class="submit"><?php echo $saveasdraft; ?> <input type="submit" name="submit" value="<?php _e('Save') ?>" style="font-weight: bold;" tabindex="4" /> 
 <?php 
-if ('publish' != $post_status || 0 == $post_ID) {
+if ('publish' != $post->post_status || 0 == $post_ID) {
 ?>
-<?php if ( user_can_create_post($user_ID) ) : ?>
-	<input name="publish" type="submit" id="publish" tabindex="10" value="<?php _e('Publish') ?>" /> 
+<?php if ( current_user_can('publish_posts') ) : ?>
+	<input name="publish" type="submit" id="publish" tabindex="5" accesskey="p" value="<?php _e('Publish') ?>" /> 
 <?php endif; ?>
 <?php
 }
 ?>
-	<input name="referredby" type="hidden" id="referredby" value="<?php echo wp_specialchars($_SERVER['HTTP_REFERER']); ?>" />
-</p>
+<input name="referredby" type="hidden" id="referredby" value="<?php 
+if ( !empty($_REQUEST['popupurl']) )
+	echo wp_specialchars($_REQUEST['popupurl']);
+else if ( url_to_postid(wp_get_referer()) == $post_ID )
+	echo 'redo';
+else
+	echo wp_specialchars(wp_get_referer());
+?>" /></p>
 
-<?php do_action('edit_form_advanced', ''); ?>
-</div>
+<?php do_action('edit_form_advanced'); ?>
+
+<?php
+if (current_user_can('upload_files')) {
+	$uploading_iframe_ID = (0 == $post_ID ? $temp_ID : $post_ID);
+	$uploading_iframe_src = wp_nonce_url("inline-uploading.php?action=view&amp;post=$uploading_iframe_ID", 'inlineuploading');
+	$uploading_iframe_src = apply_filters('uploading_iframe_src', $uploading_iframe_src);
+	if ( false != $uploading_iframe_src )
+		echo '<iframe id="uploading" border="0" src="' . $uploading_iframe_src . '">' . __('This feature requires iframe support.') . '</iframe>';
+}
+?>
+
+<div id="advancedstuff" class="dbx-group" >
 
+<div class="dbx-box-wrapper">
+<fieldset id="postexcerpt" class="dbx-box">
+<div class="dbx-handle-wrapper">
+<h3 class="dbx-handle"><?php _e('Optional Excerpt') ?></h3>
+</div>
+<div class="dbx-content-wrapper">
+<div class="dbx-content"><textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"><?php echo $post->post_excerpt ?></textarea></div>
+</div>
+</fieldset>
 </div>
 
-<div class="wrap">
-<h2><?php _e('Advanced'); ?></h2>
+<div class="dbx-box-wrapper">
+<fieldset class="dbx-box">
+<div class="dbx-handle-wrapper">
+<h3 class="dbx-handle"><?php _e('Trackbacks') ?></h3>
+</div>
+<div class="dbx-content-wrapper">
+<div class="dbx-content"><?php _e('Send trackbacks to'); ?>: <?php echo $form_trackback; ?> (<?php _e('Separate multiple URIs with spaces'); ?>)
+<?php 
+if ( ! empty($pings) )
+	echo $pings;
+?>
+</div>
+</div>
+</fieldset>
+</div>
 
-<table width="100%" cellspacing="2" cellpadding="5" class="editform">
-	<tr>
-		<th scope="row" valign="top"><?php _e('Post Status') ?>:</th>
-		<td><?php if ( user_can_create_post($user_ID) ) : ?>
-<label for="post_status_publish" class="selectit"><input id="post_status_publish" name="post_status" type="radio" value="publish" <?php checked($post_status, 'publish'); ?> /> <?php _e('Published') ?></label><br />
-<?php endif; ?>
-	  <label for="post_status_draft" class="selectit"><input id="post_status_draft" name="post_status" type="radio" value="draft" <?php checked($post_status, 'draft'); ?> /> <?php _e('Draft') ?></label><br />
-	  <label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="radio" value="private" <?php checked($post_status, 'private'); ?> /> <?php _e('Private') ?></label></td>
-	</tr>
-	<tr>
-		<th scope="row" valign="top"><?php _e('Send trackbacks to'); ?>:</th>
-		<td><?php echo $form_trackback; ?> <br />
-		<?php _e('Separate multiple URIs with spaces'); ?></td>
-	</tr>
-	<tr valign="top">
-		<th scope="row" width="25%"><?php _e('Post slug') ?>:</th>
-		<td><input name="post_name" type="text" size="25" id="post_name" value="<?php echo $post_name ?>" /></td>
-	</tr>
-<?php if ($user_level > 7 && $users = $wpdb->get_results("SELECT ID, user_login, user_firstname, user_lastname FROM $wpdb->users WHERE user_level <= $user_level AND user_level > 0") ) : ?>
-	<tr>
-		<th scope="row"><?php _e('Post author'); ?>:</th>
-		<td>
-		<select name="post_author_override" id="post_author_override">
-		<?php 
-		foreach ($users as $o) :
-			if ( $post_author == $o->ID || ( empty($post_ID) && $user_ID == $o->ID ) ) $selected = 'selected="selected"';
-			else $selected = '';
-			echo "<option value='$o->ID' $selected>$o->user_login ($o->user_firstname $o->user_lastname)</option>";
-		endforeach;
-		?>
-		</select>
-		</td>
-	</tr>
-<?php endif; ?>
-<?php if ($user_level > 4) : ?>
-	<tr>
-		<th scope="row"><?php _e('Edit time'); ?>:</th>
-		<td><?php touch_time(($action == 'edit')); ?></td>
-	</tr>
-<?php endif; ?>
-<?php if ('edit' == $action) : ?>
-	<tr>
-		<th scope="row"><?php _e('Delete'); ?>:</th>
-		<td>
-		<input name="deletepost" class="button" type="submit" id="deletepost" tabindex="10" value="<?php _e('Delete this post') ?>" <?php echo "onclick=\"return confirm('" . sprintf(__("You are about to delete this post \'%s\'\\n  \'Cancel\' to stop, \'OK\' to delete."), addslashes($edited_post_title) ) . "')\""; ?> />
-</td>
-<?php endif; ?>
-	</tr>
-</table>
-
-<fieldset id="postcustom">
-<legend><?php _e('Custom Fields') ?></legend>
-<div id="postcustomstuff">
+<div class="dbx-box-wrapper">
+<fieldset id="postcustom" class="dbx-box">
+<div class="dbx-handle-wrapper">
+<h3 class="dbx-handle"><?php _e('Custom Fields') ?></h3>
+</div>
+<div class="dbx-content-wrapper">
+<div id="postcustomstuff" class="dbx-content">
 <?php 
 if($metadata = has_meta($post_ID)) {
 ?>
@@ -197,10 +277,18 @@
 ?>
 </div>
 </fieldset>
-<?php 
-if ('' != $pinged)
-	echo $pings;
-?>
 </div>
 
-</form>
\ No newline at end of file
+<?php do_action('dbx_post_advanced'); ?>
+
+</div>
+
+<?php if ('edit' == $action) : $delete_nonce = wp_create_nonce( 'delete-post_' . $post_ID ); ?>
+<input name="deletepost" class="button" type="submit" id="deletepost" tabindex="10" value="<?php _e('Delete this post') ?>" <?php echo "onclick=\"if ( confirm('" . sprintf(__("You are about to delete this post \'%s\'\\n  \'Cancel\' to stop, \'OK\' to delete."), js_escape($post->post_title) ) . "') ) { document.forms.post._wpnonce.value = '$delete_nonce'; return true;}return false;\""; ?> />
+<?php endif; ?>
+
+</div>
+
+</div>
+
+</form>
diff -ruN 1.5.2/wp-admin/edit-form-ajax-cat.php 2.0.4/wp-admin/edit-form-ajax-cat.php
--- 1.5.2/wp-admin/edit-form-ajax-cat.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/edit-form-ajax-cat.php	2006-05-11 18:05:45.000000000 -0500
@@ -0,0 +1,37 @@
+<?php
+require_once('../wp-config.php');
+require_once('admin-functions.php');
+require_once('admin-db.php');
+
+if ( !current_user_can('manage_categories') )
+	die('-1');
+if ( !check_ajax_referer() )
+	die('-1');
+
+function get_out_now() { exit; }
+
+add_action('shutdown', 'get_out_now', -1);
+
+$names = explode(',', rawurldecode($_POST['ajaxnewcat']) );
+$ids   = array();
+
+foreach ($names as $cat_name) {
+	$cat_name = trim( $cat_name );
+	
+	if ( !$category_nicename = sanitize_title($cat_name) )
+		continue;
+	if ( $already = category_exists($cat_name) ) {
+		$ids[] = (string) $already;
+		continue;
+	}
+	
+	$new_cat_id = wp_create_category($cat_name);
+	
+	$ids[] = (string) $new_cat_id;
+}
+
+$return = join(',', $ids);
+
+die( (string) $return );
+
+?>
diff -ruN 1.5.2/wp-admin/edit-form-comment.php 2.0.4/wp-admin/edit-form-comment.php
--- 1.5.2/wp-admin/edit-form-comment.php	2005-03-10 03:50:26.000000000 -0600
+++ 2.0.4/wp-admin/edit-form-comment.php	2006-06-24 16:37:24.000000000 -0500
@@ -1,61 +1,95 @@
 <?php
 $submitbutton_text = __('Edit Comment &raquo;');
-$toprow_title = sprintf(__('Editing Comment # %s'), $commentdata['comment_ID']);
+$toprow_title = sprintf(__('Editing Comment # %s'), $comment->comment_ID);
 $form_action = 'editedcomment';
-$form_extra = "' />\n<input type='hidden' name='comment_ID' value='$comment' />\n<input type='hidden' name='comment_post_ID' value='".$commentdata["comment_post_ID"];
+$form_extra = "' />\n<input type='hidden' name='comment_ID' value='" . $comment->comment_ID . "' />\n<input type='hidden' name='comment_post_ID' value='".$comment->comment_post_ID;
 ?>
 
 <form name="post" action="post.php" method="post" id="post">
+<?php wp_nonce_field('update-comment_' . $comment->comment_ID) ?>
 <div class="wrap">
 <input type="hidden" name="user_ID" value="<?php echo $user_ID ?>" />
 <input type="hidden" name="action" value='<?php echo $form_action . $form_extra ?>' />
 
 <script type="text/javascript">
-function focusit() {
-	// focus on first input field
+function focusit() { // focus on first input field
 	document.post.name.focus();
 }
-window.onload = focusit;
+addLoadEvent(focusit);
 </script>
 <fieldset id="namediv">
     <legend><?php _e('Name:') ?></legend>
 	<div>
-	  <input type="text" name="newcomment_author" size="22" value="<?php echo format_to_edit($commentdata['comment_author']) ?>" tabindex="1" id="name" />
+	  <input type="text" name="newcomment_author" size="22" value="<?php echo $comment->comment_author ?>" tabindex="1" id="name" />
     </div>
 </fieldset>
 <fieldset id="emaildiv">
         <legend><?php _e('E-mail:') ?></legend>
 		<div>
-		  <input type="text" name="newcomment_author_email" size="30" value="<?php echo format_to_edit($commentdata['comment_author_email']) ?>" tabindex="2" id="email" />
+		  <input type="text" name="newcomment_author_email" size="30" value="<?php echo $comment->comment_author_email ?>" tabindex="2" id="email" />
     </div>
 </fieldset>
 <fieldset id="uridiv">
         <legend><?php _e('URI:') ?></legend>
 		<div>
-		  <input type="text" name="newcomment_author_url" size="35" value="<?php echo format_to_edit($commentdata['comment_author_url']) ?>" tabindex="3" id="URL" />
+		  <input type="text" id="newcomment_author_url" name="newcomment_author_url" size="35" value="<?php echo $comment->comment_author_url ?>" tabindex="3" id="URL" />
     </div>
 </fieldset>
 
 <fieldset style="clear: both;">
         <legend><?php _e('Comment') ?></legend>
 <?php the_quicktags(); ?>
+
 <?php
  $rows = get_settings('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" style="width: 99%"><?php echo $content ?></textarea></div>
+<div><textarea title="true" rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="4" id="content" style="width: 99%"><?php echo user_can_richedit() ? wp_richedit_pre($comment->comment_content) : $comment->comment_content; ?></textarea></div>
 </fieldset>
 
 <script type="text/javascript">
 <!--
 edCanvas = document.getElementById('content');
+<?php if ( user_can_richedit() ) : ?>
+// This code is meant to allow tabbing from Author URL to Post (TinyMCE).
+if ( tinyMCE.isMSIE )
+	document.getElementById('newcomment_author_url').onkeydown = function (e)
+		{
+			e = e ? e : window.event;
+			if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
+				var i = tinyMCE.selectedInstance;
+				if(typeof i ==  'undefined')
+					return true;
+                                tinyMCE.execCommand("mceStartTyping");
+				this.blur();
+				i.contentWindow.focus();
+				e.returnValue = false;
+				return false;
+			}
+		}
+else
+	document.getElementById('newcomment_author_url').onkeypress = function (e)
+		{
+			e = e ? e : window.event;
+			if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
+				var i = tinyMCE.selectedInstance;
+				if(typeof i ==  'undefined')
+					return true;
+                                tinyMCE.execCommand("mceStartTyping");
+				this.blur();
+				i.contentWindow.focus();
+				e.returnValue = false;
+				return false;
+			}
+		}
+<?php endif; ?>
 //-->
 </script>
 
 <p class="submit"><input type="submit" name="editcomment" id="editcomment" value="<?php echo $submitbutton_text ?>" style="font-weight: bold;" tabindex="6" />
-  <input name="referredby" type="hidden" id="referredby" value="<?php echo $_SERVER['HTTP_REFERER']; ?>" />
+  <input name="referredby" type="hidden" id="referredby" value="<?php echo wp_get_referer(); ?>" />
 </p>
 
 </div>
@@ -66,12 +100,12 @@
 <table width="100%" cellspacing="2" cellpadding="5" class="editform">
 	<tr>
 		<th scope="row" valign="top"><?php _e('Comment Status') ?>:</th>
-		<td><label for="comment_status_approved" class="selectit"><input id="comment_status_approved" name="comment_status" type="radio" value="1" <?php checked($comment_status, '1'); ?> /> <?php _e('Approved') ?></label><br />
-	  <label for="comment_status_moderated" class="selectit"><input id="comment_status_moderated" name="comment_status" type="radio" value="0" <?php checked($comment_status, '0'); ?> /> <?php _e('Moderated') ?></label><br />
-	  <label for="comment_status_spam" class="selectit"><input id="comment_status_spam" name="comment_status" type="radio" value="spam" <?php checked($comment_status, 'spam'); ?> /> <?php _e('Spam') ?></label></td>
+		<td><label for="comment_status_approved" class="selectit"><input id="comment_status_approved" name="comment_status" type="radio" value="1" <?php checked($comment->comment_approved, '1'); ?> /> <?php _e('Approved') ?></label><br />
+	  <label for="comment_status_moderated" class="selectit"><input id="comment_status_moderated" name="comment_status" type="radio" value="0" <?php checked($comment->comment_approved, '0'); ?> /> <?php _e('Moderated') ?></label><br />
+	  <label for="comment_status_spam" class="selectit"><input id="comment_status_spam" name="comment_status" type="radio" value="spam" <?php checked($comment->comment_approved, 'spam'); ?> /> <?php _e('Spam') ?></label></td>
 	</tr>
 
-<?php if ($user_level > 4) : ?>
+<?php if ( current_user_can('edit_posts') ) : ?>
 	<tr>
 		<th scope="row"><?php _e('Edit time'); ?>:</th>
 		<td><?php touch_time(('editcomment' == $action), 0); ?></td>
@@ -80,7 +114,7 @@
 
 	<tr>
 		<th scope="row"><?php _e('Delete'); ?>:</th>
-		<td><p><a class="delete" href="post.php?action=confirmdeletecomment&amp;noredir=true&amp;comment=<?php echo $commentdata['comment_ID']; ?>&amp;p=<?php echo $commentdata['comment_post_ID']; ?>"><?php _e('Delete comment') ?></a></p></td>
+		<td><p><a class="delete" href="post.php?action=confirmdeletecomment&amp;noredir=true&amp;comment=<?php echo $comment->comment_ID; ?>&amp;p=<?php echo $comment->comment_post_ID; ?>"><?php _e('Delete comment') ?></a></p></td>
 	</tr>
 </table>
 
diff -ruN 1.5.2/wp-admin/edit-form.php 2.0.4/wp-admin/edit-form.php
--- 1.5.2/wp-admin/edit-form.php	2005-03-13 18:48:11.000000000 -0600
+++ 2.0.4/wp-admin/edit-form.php	2006-06-30 17:17:07.000000000 -0500
@@ -11,23 +11,22 @@
 
 <script type="text/javascript">
 <!--
-function focusit() {
-	// focus on first input field
+function focusit() { // focus on first input field
 	document.getElementById('title').focus();
 }
-window.onload = focusit;
+addLoadEvent(focusit);
 //-->
 </script>
 
 <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 $edited_post_title; ?>" id="title" /></div>
+	  <div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo $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($default_post_cat); ?></div>
+	  <div><?php dropdown_categories($post->post_category); ?></div>
     </fieldset>
 
 <br />
@@ -40,7 +39,7 @@
      $rows = 10;
  }
 ?>
-<div><textarea rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="4" id="content"><?php echo $content ?></textarea></div>
+<div><textarea rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="4" id="content"><?php echo $post->post_content ?></textarea></div>
 </fieldset>
 
 
@@ -58,14 +57,14 @@
 <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 ( user_can_create_post($user_ID) ) : ?>
+	 <?php if ( current_user_can('edit_posts') ) : ?>
   <input name="publish" type="submit" id="publish" tabindex="6" style="font-weight: bold;" value="<?php _e('Publish') ?>" /> 
 <?php endif; ?>
 
 <?php if ('bookmarklet' != $mode) {
       echo '<input name="advanced" type="submit" id="advancededit" tabindex="7" value="' .  __('Advanced Editing &raquo;') . '" />';
   } ?>
-  <input name="referredby" type="hidden" id="referredby" value="<?php if (isset($_SERVER['HTTP_REFERER'])) echo urlencode($_SERVER['HTTP_REFERER']); ?>" />
+  <input name="referredby" type="hidden" id="referredby" value="<?php if ( wp_get_referer() ) echo urlencode(wp_get_referer()); ?>" />
 </p>
 
 <?php do_action('simple_edit_form', ''); ?>
diff -ruN 1.5.2/wp-admin/edit-link-form.php 2.0.4/wp-admin/edit-link-form.php
--- 1.5.2/wp-admin/edit-link-form.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/edit-link-form.php	2006-07-05 12:09:32.000000000 -0500
@@ -0,0 +1,239 @@
+<?php
+if ( ! empty($link_id) ) {
+	$editing = true;
+	$heading = __('Edit a link:');
+	$submit_text = __('Save Changes &raquo;');
+	$form = '<form action="" method="post" name="editlink" id="editlink">'; 
+	$nonce_action = 'update-bookmark_' . $link_id;
+} else {
+	$editing = false;
+	$heading = __('<strong>Add</strong> a link:');
+	$submit_text = __('Add Link &raquo;');
+	$form = '<form name="addlink" method="post" action="link-manager.php">';
+	$nonce_action = 'add-bookmark';
+}
+
+function xfn_check($class, $value = '', $type = 'check') {
+	global $link;
+
+	$link_rel = $link->link_rel;
+	$rels = preg_split('/\s+/', $link_rel);
+
+	if ('' != $value && in_array($value, $rels) ) {
+		echo ' checked="checked"';
+	}
+
+	if ('' == $value) {
+		if ('family' == $class && !strstr($link_rel, 'child') && !strstr($link_rel, 'parent') && !strstr($link_rel, 'sibling') && !strstr($link_rel, 'spouse') && !strstr($link_rel, 'kin')) echo ' checked="checked"';
+		if ('friendship' == $class && !strstr($link_rel, 'friend') && !strstr($link_rel, 'acquaintance') && !strstr($link_rel, 'contact') ) echo ' checked="checked"';
+		if ('geographical' == $class && !strstr($link_rel, 'co-resident') && !strstr($link_rel, 'neighbor') ) echo ' checked="checked"';
+		if ('identity' == $class && in_array('me', $rels) ) echo ' checked="checked"';
+	}
+}
+
+?>
+
+<div class="wrap"> 
+  <?php echo $form ?>
+  <?php wp_nonce_field($nonce_action); ?>
+  <h2><?php echo $heading ?></h2>
+<fieldset class="options">
+    <legend><?php _e('Basics') ?></legend>
+        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
+         <tr>
+           <th width="33%" scope="row"><?php _e('URI:') ?></th>
+           <td width="67%"><input type="text" name="link_url" value="<?php echo $link->link_url; ?>" style="width: 95%;" /></td>
+         </tr>
+         <tr>
+           <th scope="row"><?php _e('Link Name:') ?></th>
+           <td><input type="text" name="link_name" value="<?php echo $link->link_name; ?>" style="width: 95%" /></td>
+         </tr>
+         <tr>
+            <th scope="row"><?php _e('Short description:') ?></th>
+         	<td><input type="text" name="link_description" value="<?php echo $link->link_description; ?>" style="width: 95%" /></td>
+         	</tr>
+        <tr>
+           <th scope="row"><?php _e('Category:') ?></th>
+           <td><?php link_category_dropdown('link_category', $link->link_category); ?></td>
+         </tr>
+</table>
+</fieldset>
+       <p class="submit">
+       <input type="submit" name="submit" value="<?php echo $submit_text ?>" />
+       </p>
+	<fieldset class="options">
+        <legend><?php _e('Link Relationship (XFN)') ?></legend>
+        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
+            <tr>
+                <th width="33%" scope="row"><?php _e('rel:') ?></th>
+            	<td width="67%"><input type="text" name="link_rel" id="link_rel" size="50" value="<?php echo $link->link_rel; ?>" /></td>
+           	</tr>
+            <tr>
+                <th scope="row"><?php _e('<a href="http://gmpg.org/xfn/">XFN</a> Creator:') ?></th>
+            	<td>
+					<table cellpadding="3" cellspacing="5">
+	          <tr>
+              <th scope="row"> <?php _e('identity') ?> </th>
+              <td>
+                <label for="me">
+                <input type="checkbox" name="identity" value="me" id="me" <?php xfn_check('identity', 'me'); ?> />
+          <?php _e('another web address of mine') ?></label>
+              </td>
+            </tr>
+            <tr>
+              <th scope="row"> <?php _e('friendship') ?> </th>
+              <td>
+			    <label for="contact">
+                <input class="valinp" type="radio" name="friendship" value="contact" id="contact" <?php xfn_check('friendship', 'contact', 'radio'); ?> /> <?php _e('contact') ?></label>
+                <label for="acquaintance">
+                <input class="valinp" type="radio" name="friendship" value="acquaintance" id="acquaintance" <?php xfn_check('friendship', 'acquaintance', 'radio'); ?> />  <?php _e('acquaintance') ?></label>
+                <label for="friend">
+                <input class="valinp" type="radio" name="friendship" value="friend" id="friend" <?php xfn_check('friendship', 'friend', 'radio'); ?> /> <?php _e('friend') ?></label>
+                <label for="friendship">
+                <input name="friendship" type="radio" class="valinp" value="" id="friendship" <?php xfn_check('friendship', '', 'radio'); ?> /> <?php _e('none') ?></label>
+              </td>
+            </tr>
+            <tr>
+              <th scope="row"> <?php _e('physical') ?> </th>
+              <td>
+                <label for="met">
+                <input class="valinp" type="checkbox" name="physical" value="met" id="met" <?php xfn_check('physical', 'met'); ?> />
+          <?php _e('met') ?></label>
+              </td>
+            </tr>
+            <tr>
+              <th scope="row"> <?php _e('professional') ?> </th>
+              <td>
+                <label for="co-worker">
+                <input class="valinp" type="checkbox" name="professional" value="co-worker" id="co-worker" <?php xfn_check('professional', 'co-worker'); ?> />
+          <?php _e('co-worker') ?></label>
+                <label for="colleague">
+                <input class="valinp" type="checkbox" name="professional" value="colleague" id="colleague" <?php xfn_check('professional', 'colleague'); ?> />
+          <?php _e('colleague') ?></label>
+              </td>
+            </tr>
+            <tr>
+              <th scope="row"> <?php _e('geographical') ?> </th>
+              <td>
+                <label for="co-resident">
+                <input class="valinp" type="radio" name="geographical" value="co-resident" id="co-resident" <?php xfn_check('geographical', 'co-resident', 'radio'); ?> />
+          <?php _e('co-resident') ?></label>
+                <label for="neighbor">
+                <input class="valinp" type="radio" name="geographical" value="neighbor" id="neighbor" <?php xfn_check('geographical', 'neighbor', 'radio'); ?> />
+          <?php _e('neighbor') ?></label>
+                <label for="geographical">
+                <input class="valinp" type="radio" name="geographical" value="" id="geographical" <?php xfn_check('geographical', '', 'radio'); ?> />
+          <?php _e('none') ?></label>
+              </td>
+            </tr>
+            <tr>
+              <th scope="row"> <?php _e('family') ?> </th>
+              <td>
+                <label for="child">
+                <input class="valinp" type="radio" name="family" value="child" id="child" <?php xfn_check('family', 'child', 'radio'); ?>  />
+          <?php _e('child') ?></label>
+                <label for="kin">
+                <input class="valinp" type="radio" name="family" value="kin" id="kin" <?php xfn_check('family', 'kin', 'radio'); ?>  />
+          <?php _e('kin') ?></label>
+                <label for="parent">
+                <input class="valinp" type="radio" name="family" value="parent" id="parent" <?php xfn_check('family', 'parent', 'radio'); ?> />
+          <?php _e('parent') ?></label>
+                <label for="sibling">
+                <input class="valinp" type="radio" name="family" value="sibling" id="sibling" <?php xfn_check('family', 'sibling', 'radio'); ?> />
+          <?php _e('sibling') ?></label>
+                <label for="spouse">
+                <input class="valinp" type="radio" name="family" value="spouse" id="spouse" <?php xfn_check('family', 'spouse', 'radio'); ?> />
+          <?php _e('spouse') ?></label>
+                <label for="family">
+                <input class="valinp" type="radio" name="family" value="" id="family" <?php xfn_check('family', '', 'radio'); ?> />
+          <?php _e('none') ?></label>
+              </td>
+            </tr>
+            <tr>
+              <th scope="row"> <?php _e('romantic') ?> </th>
+              <td>
+                <label for="muse">
+                <input class="valinp" type="checkbox" name="romantic" value="muse" id="muse" <?php xfn_check('romantic', 'muse'); ?> />
+         <?php _e('muse') ?></label>
+                <label for="crush">
+                <input class="valinp" type="checkbox" name="romantic" value="crush" id="crush" <?php xfn_check('romantic', 'crush'); ?> />
+         <?php _e('crush') ?></label>
+                <label for="date">
+                <input class="valinp" type="checkbox" name="romantic" value="date" id="date" <?php xfn_check('romantic', 'date'); ?> />
+         <?php _e('date') ?></label>
+                <label for="romantic">
+                <input class="valinp" type="checkbox" name="romantic" value="sweetheart" id="romantic" <?php xfn_check('romantic', 'sweetheart'); ?> />
+         <?php _e('sweetheart') ?></label>
+              </td>
+            </tr>
+        </table>
+		  </td>
+           	</tr>
+</table>
+</fieldset>
+       <p class="submit">
+       <input type="submit" name="submit" value="<?php echo $submit_text ?>" />
+       </p>
+<fieldset class="options">
+        <legend><?php _e('Advanced') ?></legend>
+        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
+         <tr>
+           <th width="33%" scope="row"><?php _e('Image URI:') ?></th>
+           <td width="67%"><input type="text" name="link_image" size="50" value="<?php echo $link->link_image; ?>" style="width: 95%" /></td>
+         </tr>
+<tr>
+           <th scope="row"><?php _e('RSS URI:') ?> </th>
+           <td><input name="link_rss" type="text" id="rss_uri" value="<?php echo $link->link_rss; ?>" size="50" style="width: 95%" /></td>
+         </tr>
+         <tr>
+           <th scope="row"><?php _e('Notes:') ?></th>
+           <td><textarea name="link_notes" cols="50" rows="10" style="width: 95%"><?php echo $link->link_notes; ?></textarea></td>
+         </tr>
+         <tr>
+           <th scope="row"><?php _e('Rating:') ?></th>
+           <td><select name="link_rating" size="1">
+<?php
+    for ($r = 0; $r < 10; $r++) {
+      echo('            <option value="'.$r.'" ');
+      if ($link->link_rating == $r)
+        echo 'selected="selected"';
+      echo('>'.$r.'</option>');
+    }
+?>
+           </select>
+         &nbsp;<?php _e('(Leave at 0 for no rating.)') ?> </td>
+         </tr>
+         <tr>
+           <th scope="row"><?php _e('Target') ?></th>
+           <td><label>
+          <input type="radio" name="link_target" value="_blank"   <?php echo(($link->link_target == '_blank') ? 'checked="checked"' : ''); ?> />
+          <code>_blank</code></label><br />
+<label>
+<input type="radio" name="link_target" value="_top" <?php echo(($link->link_target == '_top') ? 'checked="checked"' : ''); ?> />
+<code>_top</code></label><br />
+<label>
+<input type="radio" name="link_target" value=""     <?php echo(($link->link_target == '') ? 'checked="checked"' : ''); ?> />
+<?php _e('none') ?></label><br />
+<?php _e('(Note that the <code>target</code> attribute is illegal in XHTML 1.1 and 1.0 Strict.)') ?></td>
+         </tr>
+         <tr>
+           <th scope="row"><?php _e('Visible:') ?></th>
+           <td><label>
+             <input type="radio" name="link_visible" <?php if ($link->link_visible == 'Y') echo "checked='checked'"; ?> value="Y" />
+<?php _e('Yes') ?></label><br /><label>
+<input type="radio" name="link_visible" <?php if ($link->link_visible == 'N') echo "checked='checked'"; ?> value="N" />
+<?php _e('No') ?></label></td>
+         </tr>
+</table>
+</fieldset>
+<p class="submit"><input type="submit" name="submit" value="<?php echo $submit_text ?>" /></p>
+<?php if ( $editing ) : ?>
+          <input type="hidden" name="action" value="editlink" />
+          <input type="hidden" name="link_id" value="<?php echo (int) $link_id; ?>" />
+          <input type="hidden" name="order_by" value="<?php echo wp_specialchars($order_by, 1); ?>" />
+          <input type="hidden" name="cat_id" value="<?php echo (int) $cat_id ?>" />
+<?php else: ?>
+       	<input type="hidden" name="action" value="Add" />
+<?php endif; ?>
+</form> 
+</div>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/edit-page-form.php 2.0.4/wp-admin/edit-page-form.php
--- 1.5.2/wp-admin/edit-page-form.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/wp-admin/edit-page-form.php	2006-07-23 12:14:20.000000000 -0500
@@ -1,16 +1,20 @@
 
 <div class="wrap">
-<h2><?php _e('Write Page'); ?></h2>
+<h2 id="write-post"><?php _e('Write Page'); ?><?php if ( 0 != $post_ID ) : ?>
+<small class="quickjump"><a href="#preview-post"><?php _e('preview &darr;'); ?></a></small><?php endif; ?></h2>
 <?php
 if (0 == $post_ID) {
 	$form_action = 'post';
-	$form_extra = '';
+	$nonce_action = 'add-post';
+	$temp_ID = -1 * time();
+	$form_extra = "<input type='hidden' name='temp_ID' value='$temp_ID' />";
 } else {
 	$form_action = 'editpost';
-	$form_extra = "<input type='hidden' name='post_ID' value='$post_ID' />";
+	$nonce_action = 'update-post_' . $post_ID;
+	$form_extra = "<input type='hidden' id='post_ID' name='post_ID' value='$post_ID' />";
 }
 
-$sendto = $_SERVER['HTTP_REFERER'];
+$sendto = wp_get_referer();
 
 if ( 0 != $post_ID && $sendto == get_permalink($post_ID) )
  	$sendto = 'redo';
@@ -21,130 +25,183 @@
 <form name="post" action="post.php" method="post" id="post">
 
 <?php
+wp_nonce_field($nonce_action);
+
 if (isset($mode) && 'bookmarklet' == $mode) {
     echo '<input type="hidden" name="mode" value="bookmarklet" />';
 }
 ?>
 <input type="hidden" name="user_ID" value="<?php echo $user_ID ?>" />
-<input type="hidden" name="action" value='<?php echo $form_action ?>' />
+<input type="hidden" id="hiddenaction" name="action" value='<?php echo $form_action ?>' />
 <?php echo $form_extra ?>
 <input type="hidden" name="post_status" value="static" />
 
 <script type="text/javascript">
-<!--
-function focusit() {
-	// focus on first input field
+// <![CDATA[
+function focusit() { // focus on first input field
 	document.post.title.focus();
 }
-window.onload = focusit;
-//-->
+addLoadEvent(focusit);
+// ]]>
 </script>
-    <fieldset id="titlediv">
-      <legend><?php _e('Page Title') ?></legend> 
- 	  <div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo $edited_post_title; ?>" id="title" /></div>
-    </fieldset>
-<fieldset id="commentstatusdiv">
-      <legend><?php _e('Discussion') ?></legend> 
-	  <div>
-	  <input name="advanced_view" type="hidden" value="1" />
-	  <label for="comment_status" class="selectit">
-	      <input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($comment_status, 'open'); ?> />
-         <?php _e('Allow Comments') ?></label> 
-		 <label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label>
-	</div>
-</fieldset>
-    <fieldset id="postpassworddiv">
-      <legend><?php _e('Page Password') ?></legend> 
-	  <div><input name="post_password" type="text" size="13" id="post_password" value="<?php echo $post_password ?>" /></div>
-    </fieldset>
-    <fieldset id="pageparent">
-      <legend><?php _e('Page Parent') ?></legend> 
-	  <div><select name="parent_id">
-	  <option value='0'><?php _e('Main Page (no parent)'); ?></option>
-			<?php parent_dropdown($post_parent); ?>
-        </select>
-	  </div>
-    </fieldset>
-<fieldset id="postdiv">
+<div id="poststuff">
+
+<div id="moremeta">
+<div id="grabit" class="dbx-group">
+<fieldset id="commentstatusdiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Discussion') ?></h3>
+<div class="dbx-content">
+<input name="advanced_view" type="hidden" value="1" />
+<label for="comment_status" class="selectit">
+<input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($post->comment_status, 'open'); ?> />
+<?php _e('Allow Comments') ?></label> 
+<label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($post->ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label>
+</div>
+</fieldset>
+
+<fieldset id="passworddiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Password-Protect Post') ?></h3> 
+<div class="dbx-content"><input name="post_password" type="text" size="13" id="post_password" value="<?php echo $post->post_password ?>" /></div>
+</fieldset>
+
+<fieldset id="pageparent" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Page Parent') ?></h3> 
+<div class="dbx-content"><p><select name="parent_id">
+<option value='0'><?php _e('Main Page (no parent)'); ?></option>
+<?php parent_dropdown($post->post_parent); ?>
+</select></p>
+</div>
+</fieldset>
+
+<?php if ( 0 != count( get_page_templates() ) ) { ?>
+<fieldset id="pagetemplate" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Page Template:') ?></h3> 
+<div class="dbx-content"><p><select name="page_template">
+		<option value='default'><?php _e('Default Template'); ?></option>
+		<?php page_template_dropdown($post->page_template); ?>
+		</select></p>
+</div>
+</fieldset>
+<?php } ?>
+
+<fieldset id="slugdiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Post slug') ?></h3> 
+<div class="dbx-content"><input name="post_name" type="text" size="13" id="post_name" value="<?php echo $post->post_name ?>" /></div>
+</fieldset>
+
+<?php if ( $authors = get_editable_authors( $current_user->id ) ) : // TODO: ROLE SYSTEM ?>
+<fieldset id="authordiv" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Post author'); ?>:</h3>
+<div class="dbx-content">
+<select name="post_author_override" id="post_author_override">
+<?php 
+foreach ($authors as $o) :
+$o = get_userdata( $o->ID );
+if ( $post->post_author == $o->ID || ( empty($post_ID) && $user_ID == $o->ID ) ) $selected = 'selected="selected"';
+else $selected = '';
+echo "<option value='$o->ID' $selected>$o->display_name</option>";
+endforeach;
+?>
+</select>
+</div>
+</fieldset>
+<?php endif; ?>
+
+<fieldset id="pageorder" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Page Order') ?></h3> 
+<div class="dbx-content"><p><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo $post->menu_order ?>" /></p></div>
+</fieldset>
+
+<?php do_action('dbx_page_sidebar'); ?>
+
+</div>
+</div>
+
+<fieldset id="titlediv">
+  <legend><?php _e('Page Title') ?></legend> 
+  <div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo $post->post_title; ?>" id="title" /></div>
+</fieldset>
+
+
+<fieldset id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>">
     <legend><?php _e('Page Content') ?></legend>
-<?php the_quicktags(); ?>
 <?php
  $rows = get_settings('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 $content ?></textarea></div>
-</fieldset>
+<?php the_quicktags(); ?>
 
+<div><textarea title="true" rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="4" id="content"><?php echo user_can_richedit() ? wp_richedit_pre($post->post_content) : $post->post_content; ?></textarea></div>
+</fieldset>
 
 <script type="text/javascript">
 <!--
 edCanvas = document.getElementById('content');
+<?php if ( user_can_richedit() ) : ?>
+// This code is meant to allow tabbing from Title to Post (TinyMCE).
+if ( tinyMCE.isMSIE )
+	document.getElementById('title').onkeydown = function (e)
+		{
+			e = e ? e : window.event;
+			if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
+				var i = tinyMCE.selectedInstance;
+				if(typeof i ==  'undefined')
+					return true;
+                                tinyMCE.execCommand("mceStartTyping");
+				this.blur();
+				i.contentWindow.focus();
+				e.returnValue = false;
+				return false;
+			}
+		}
+else
+	document.getElementById('title').onkeypress = function (e)
+		{
+			e = e ? e : window.event;
+			if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
+				var i = tinyMCE.selectedInstance;
+				if(typeof i ==  'undefined')
+					return true;
+                                tinyMCE.execCommand("mceStartTyping");
+				this.blur();
+				i.contentWindow.focus();
+				e.returnValue = false;
+				return false;
+			}
+		}
+<?php endif; ?>
 //-->
 </script>
 
 <p class="submit">
 <?php if ( $post_ID ) : ?>
 <input name="save" type="submit" id="save" tabindex="5" value=" <?php _e('Save and Continue Editing'); ?> "/> 
-<input name="savepage" type="submit" id="savepage" tabindex="6" value="<?php $post_ID ? _e('Edit Page') : _e('Create New Page') ?> &raquo;" /> 
+<input name="savepage" type="submit" id="savepage" tabindex="6" value="<?php $post_ID ? _e('Save') : _e('Create New Page') ?> &raquo;" /> 
 <?php else : ?>
 <input name="savepage" type="submit" id="savepage" tabindex="6" value="<?php _e('Create New Page') ?> &raquo;" /> 
 <?php endif; ?>
 <input name="referredby" type="hidden" id="referredby" value="<?php echo $sendto; ?>" />
 </p>
 
-<fieldset id="pageoptions">
-	 <legend><?php _e('Page Options') ?></legend>
-<table width="100%" cellspacing="2" cellpadding="5" class="editform">
-<?php if ( 0 != count( get_page_templates() ) ) { ?>
-	<tr valign="top">
-		<th scope="row" width="30%"><?php _e('Page Template:') ?></th>
-		<td><div><select name="page_template">
-		<option value='default'><?php _e('Default Template'); ?></option>
-		<?php page_template_dropdown($page_template); ?>
-		</select>
-		
-		</div>
-		</td>
-	</tr>
-<?php } ?>
-	<tr valign="top">
-		<th scope="row" width="30%"><?php _e('Page slug') ?>:</th>
-		<td><input name="post_name" type="text" size="25" id="post_name" value="<?php echo $post_name ?>" /></td>
-	</tr>
-<?php if ($user_level > 7 && $users = $wpdb->get_results("SELECT ID, user_login, user_firstname, user_lastname FROM $wpdb->users WHERE user_level <= $user_level AND user_level > 0") ) : ?>
-	<tr>
-		<th scope="row" width="30%"><?php _e('Page owner'); ?>:</th>
-		<td>
-		<select name="post_author" id="post_author">
-		<?php 
-		foreach ($users as $o) :
-			if ( $post_author == $o->ID ) $selected = 'selected="selected"';
-			else $selected = '';
-			echo "<option value='$o->ID' $selected>$o->user_login ($o->user_firstname $o->user_lastname)</option>";
-		endforeach;
-		?>
-		</select>
-		</td>
-	</tr>
-<?php endif; ?>
-	<tr>
-		<th scope="row" width="25%"><?php _e('Page Order') ?>:</th>
-		<td><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo $menu_order ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Delete'); ?>:</th>
-		<td><?php if ('edit' == $action) : ?>
-		<input name="deletepost" class="delete" type="submit" id="deletepost" tabindex="10" value="<?php _e('Delete this page') ?>" <?php echo "onclick=\"return confirm('" . sprintf(__("You are about to delete this page \'%s\'\\n  \'Cancel\' to stop, \'OK\' to delete."), addslashes($edited_post_title) ) . "')\""; ?> />
-<?php endif; ?></td>
-	</tr>
-</table>
-</fieldset>
-
-<fieldset id="postcustom">
-<legend><?php _e('Custom Fields') ?> <script type="text/javascript">customToggleLink();</script></legend>
-<div id="postcustomstuff">
+<?php do_action('edit_page_form'); ?>
+
+<?php
+if (current_user_can('upload_files')) {
+	$uploading_iframe_ID = (0 == $post_ID ? $temp_ID : $post_ID);
+	$uploading_iframe_src = wp_nonce_url("inline-uploading.php?action=view&amp;post=$uploading_iframe_ID", 'inlineuploading');
+	$uploading_iframe_src = apply_filters('uploading_iframe_src', $uploading_iframe_src);
+	if ( false != $uploading_iframe_src )
+		echo '<iframe id="uploading" border="0" src="' . $uploading_iframe_src . '">' . __('This feature requires iframe support.') . '</iframe>';
+}
+?>
+
+<div id="advancedstuff" class="dbx-group">
+
+<fieldset id="postcustom" class="dbx-box">
+<h3 class="dbx-handle"><?php _e('Custom Fields') ?></h3>
+<div id="postcustomstuff" class="dbx-content">
 <?php 
 if($metadata = has_meta($post_ID)) {
 ?>
@@ -156,9 +213,19 @@
 	meta_form();
 ?>
 </div>
+<div id="ajax-response"></div>
 </fieldset>
 
-<?php do_action('edit_page_form', ''); ?>
+<?php do_action('dbx_page_advanced'); ?>
+
+</div>
+
+<?php if ('edit' == $action) :
+	$delete_nonce = wp_create_nonce( 'delete-page_' . $post_ID ); ?>
+	<input name="deletepost" class="button" type="submit" id="deletepost" tabindex="10" value="<?php _e('Delete this page') ?>" <?php echo "onclick=\"if ( confirm('" . sprintf(__("You are about to delete this page \'%s\'\\n  \'Cancel\' to stop, \'OK\' to delete."), js_escape($post->post_title) ) . "') ) { document.forms.post._wpnonce.value = '$delete_nonce'; return true;}return false;\""; ?> />
+<?php endif; ?>
 </form>
 
 </div>
+
+</div>
diff -ruN 1.5.2/wp-admin/edit-pages.php 2.0.4/wp-admin/edit-pages.php
--- 1.5.2/wp-admin/edit-pages.php	2005-02-10 20:27:45.000000000 -0600
+++ 2.0.4/wp-admin/edit-pages.php	2006-06-23 20:20:01.000000000 -0500
@@ -2,29 +2,34 @@
 require_once('admin.php');
 $title = __('Pages');
 $parent_file = 'edit.php';
+$list_js = true;
 require_once('admin-header.php');
-
-get_currentuserinfo();
 ?>
 
 <div class="wrap">
 <h2><?php _e('Page Management'); ?></h2>
+<p><?php _e('Pages are like posts except they live outside of the normal blog chronology and can be hierarchical. You can use pages to organize and manage any amount of content.'); ?> <a href="page-new.php"><?php _e('Create a new page'); ?> &raquo;</a></p>
+
+<form name="searchform" action="" method="get"> 
+  <fieldset> 
+  <legend><?php _e('Search Pages&hellip;') ?></legend>
+  <input type="text" name="s" value="<?php if (isset($_GET['s'])) echo wp_specialchars($_GET['s'], 1); ?>" size="17" /> 
+  <input type="submit" name="submit" value="<?php _e('Search') ?>"  /> 
+  </fieldset>
+</form>
 
 <?php
-if (isset($user_ID) && ('' != intval($user_ID))) {
-	$posts = $wpdb->get_results("
-	SELECT $wpdb->posts.*, $wpdb->users.user_level FROM $wpdb->posts
-	INNER JOIN $wpdb->users ON ($wpdb->posts.post_author = $wpdb->users.ID)
-	WHERE $wpdb->posts.post_status = 'static'
-	AND ($wpdb->users.user_level < $user_level OR $wpdb->posts.post_author = $user_ID)
-	");
-} else {
-    $posts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'static'");
-}
+
+$show_post_type = 'page';
+
+if ( isset($_GET['s']) )
+	wp();
+else
+	$posts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'static'");
 
 if ($posts) {
 ?>
-<table width="100%" cellpadding="3" cellspacing="3"> 
+<table id="the-list-x" width="100%" cellpadding="3" cellspacing="3"> 
   <tr> 
     <th scope="col"><?php _e('ID') ?></th> 
     <th scope="col"><?php _e('Title') ?></th> 
@@ -34,8 +39,31 @@
     <th scope="col"></th> 
     <th scope="col"></th> 
   </tr> 
-<?php page_rows(); ?>
+<?php
+if ( isset($_GET['s']) ) {
+foreach ( $posts as $post ) : 
+	$class = ('alternate' != $class) ? 'alternate' : ''; ?>
+  <tr id='page-<?php echo $post->ID; ?>' class='<?php echo $class; ?>'> 
+    <th scope="row"><?php echo $post->ID; ?></th> 
+    <td>
+      <?php echo $pad; ?><?php the_title() ?> 
+    </td> 
+    <td><?php the_author() ?></td>
+    <td><?php echo mysql2date('Y-m-d g:i a', $post->post_modified); ?></td> 
+	<td><a href="<?php the_permalink(); ?>" rel="permalink" class="edit"><?php _e('View'); ?></a></td>
+    <td><?php if ( current_user_can('edit_pages') ) { echo "<a href='post.php?action=edit&amp;post=$post->ID' class='edit'>" . __('Edit') . "</a>"; } ?></td> 
+    <td><?php if ( current_user_can('edit_pages') ) { echo "<a href='" . wp_nonce_url("post.php?action=delete&amp;post=$post->ID", 'delete-post_' . $post->ID) . "' class='delete' onclick=\"return deleteSomething( 'page', " . $id . ", '" . sprintf(__("You are about to delete the &quot;%s&quot; page.\\n&quot;OK&quot; to delete, &quot;Cancel&quot; to stop."), js_escape(get_the_title('','',0))) . "' );\">" . __('Delete') . "</a>"; } ?></td> 
+  </tr>
+<?php
+endforeach;
+} else {
+	page_rows();
+}
+?>
 </table> 
+
+<div id="ajax-response"></div>
+
 <?php
 } else {
 ?>
@@ -43,9 +71,9 @@
 <?php
 } // end if ($posts)
 ?> 
-<p><?php _e('Pages are like posts except they live outside of the normal blog chronology. You can use pages to organize and manage any amount of content.'); ?></p>
+
 <h3><a href="page-new.php"><?php _e('Create New Page'); ?> &raquo;</a></h3>
-</div> 
 
+</div>
 
 <?php include('admin-footer.php'); ?> 
diff -ruN 1.5.2/wp-admin/edit.php 2.0.4/wp-admin/edit.php
--- 1.5.2/wp-admin/edit.php	2005-04-19 23:06:37.000000000 -0500
+++ 2.0.4/wp-admin/edit.php	2006-05-26 18:31:24.000000000 -0500
@@ -3,24 +3,13 @@
 
 $title = __('Posts');
 $parent_file = 'edit.php';
+$list_js = true;
 require_once('admin-header.php');
 
 $_GET['m'] = (int) $_GET['m'];
 
-get_currentuserinfo();
-
-$drafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = $user_ID");
-if (1 < $user_level) {
-	$editable = $wpdb->get_col("SELECT ID FROM $wpdb->users WHERE user_level <= '$user_level' AND ID != $user_ID");
-	if( is_array( $editable ) == false )
-			$other_drafts = '';
-	else {
-		$editable = join(',', $editable);
-		$other_drafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author IN ($editable) ");
-	}
-} else {
-	$other_drafts = false;
-}
+$drafts = get_users_drafts( $user_ID );
+$other_drafts = get_others_drafts( $user_ID);
 
 if ($drafts || $other_drafts) {
 ?> 
@@ -70,14 +59,16 @@
 $posts_per_page = 15;
 $posts_per_archive_page = -1;
 
-include(ABSPATH.'wp-blog-header.php');
+wp();
 
 if ( is_month() ) {
 	single_month_title(' ');
 } elseif ( is_search() ) {
 	printf(__('Search for &#8220;%s&#8221;'), wp_specialchars($_GET['s']) );
 } else {
-	if ( ! is_paged() || get_query_var('paged') == 1 )
+	if ( is_single() )
+		printf(__('Comments on %s'), $post->post_title);
+	elseif ( ! is_paged() || get_query_var('paged') == 1 )
 		_e('Last 15 Posts');
 	else
 		_e('Previous Posts');
@@ -93,12 +84,15 @@
   </fieldset>
 </form>
 
+<?php $arc_result = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_date != '0000-00-00 00:00:00' ORDER BY post_date DESC");
+
+if ( count($arc_result) ) { ?>
+
 <form name="viewarc" action="" method="get" style="float: left; width: 20em; margin-bottom: 1em;">
 	<fieldset>
 	<legend><?php _e('Browse Month&hellip;') ?></legend>
     <select name='m'>
 	<?php
-		$arc_result=$wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts ORDER BY post_date DESC");
 		foreach ($arc_result as $arc_row) {			
 			$arc_year  = $arc_row->yyear;
 			$arc_month = $arc_row->mmonth;
@@ -118,6 +112,8 @@
 	</fieldset>
 </form>
 
+<?php } ?>
+
 <br style="clear:both;" />
 
 <?php
@@ -140,7 +136,7 @@
 
 ?>
 
-<table width="100%" cellpadding="3" cellspacing="3"> 
+<table id="the-list-x" width="100%" cellpadding="3" cellspacing="3"> 
 	<tr>
 
 <?php foreach($posts_columns as $column_display_name) { ?>
@@ -154,7 +150,7 @@
 foreach ($posts as $post) { start_wp();
 $class = ('alternate' == $class) ? '' : 'alternate';
 ?> 
-	<tr class='<?php echo $class; ?>'>
+	<tr id='post-<?php echo $id; ?>' class='<?php echo $class; ?>'>
 
 <?php
 
@@ -208,13 +204,13 @@
 
 	case 'control_edit':
 		?>
-		<td><?php if ( user_can_edit_post($user_ID,$post->ID) ) { echo "<a href='post.php?action=edit&amp;post=$id' class='edit'>" . __('Edit') . "</a>"; } ?></td>
+		<td><?php if ( current_user_can('edit_post',$post->ID) ) { echo "<a href='post.php?action=edit&amp;post=$id' class='edit'>" . __('Edit') . "</a>"; } ?></td>
 		<?php
 		break;
 
 	case 'control_delete':
 		?>
-		<td><?php if ( user_can_edit_post($user_ID,$post->ID) ) { echo "<a href='post.php?action=delete&amp;post=$id' class='delete' onclick=\"return confirm('" . sprintf(__("You are about to delete this post \'%s\'\\n  \'OK\' to delete, \'Cancel\' to stop."), wp_specialchars(get_the_title('', ''), 1) ) . "')\">" . __('Delete') . "</a>"; } ?></td>
+		<td><?php if ( current_user_can('edit_post',$post->ID) ) { echo "<a href='" . wp_nonce_url("post.php?action=delete&amp;post=$id", 'delete-post_' . $post->ID) . "' class='delete' onclick=\"return deleteSomething( 'post', " . $id . ", '" . sprintf(__("You are about to delete this post &quot;%s&quot;.\\n&quot;OK&quot; to delete, &quot;Cancel&quot; to stop."), js_escape(get_the_title())) . "' );\">" . __('Delete') . "</a>"; } ?></td>
 		<?php
 		break;
 
@@ -237,7 +233,9 @@
 <?php
 } // end if ($posts)
 ?> 
-</table> 
+</table>
+
+<div id="ajax-response"></div>
 
 <div class="navigation">
 <div class="alignleft"><?php next_posts_link(__('&laquo; Previous Entries')) ?></div>
@@ -262,14 +260,15 @@
   @
   <?php comment_time('g:m:s a') ?> 
   <?php 
-			if (($user_level > $authordata->user_level) or ($user_login == $authordata->user_login)) {
+			if ( current_user_can('edit_post', $post->ID) ) {
 				echo "[ <a href=\"post.php?action=editcomment&amp;comment=".$comment->comment_ID."\">" .  __('Edit') . "</a>";
-				echo " - <a href=\"post.php?action=deletecomment&amp;p=".$post->ID."&amp;comment=".$comment->comment_ID."\" onclick=\"return confirm('" . sprintf(__("You are about to delete this comment by \'%s\'\\n  \'OK\' to delete, \'Cancel\' to stop."), $comment->comment_author) . "')\">" . __('Delete') . "</a> ";
-				if ( ('none' != $comment_status) && ($user_level >= 3) ) {
+				echo ' - <a href="' . wp_nonce_url('post.php?action=deletecomment&amp;p=' . $post->ID . '&amp;comment=' . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . '" onclick="return confirm(\'' . __("You are about to delete this comment.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete.") . "');\">" . __('Delete') . '</a> ';
+
+				if ( ('none' != $comment_status) && ( current_user_can('moderate_comments') ) ) {
 					if ('approved' == wp_get_comment_status($comment->comment_ID)) {
-						echo " - <a href=\"post.php?action=unapprovecomment&amp;p=".$post->ID."&amp;comment=".$comment->comment_ID."\">" . __('Unapprove') . "</a> ";
+						echo ' - <a href="' . wp_nonce_url('post.php?action=unapprovecomment&amp;p=' . $post->ID . '&amp;comment=' . $comment->comment_ID, 'unapprove-comment_' . $comment->comment_ID) . '">' . __('Unapprove') . '</a> ';
 					} else {
-						echo " - <a href=\"post.php?action=approvecomment&amp;p=".$post->ID."&amp;comment=".$comment->comment_ID."\">" . __('Approve') . "</a> ";
+						echo ' - <a href="' . wp_nonce_url('post.php?action=approvecomment&amp;p=' . $post->ID . '&amp;comment=' . $comment->comment_ID, 'approve-comment_' . $comment->comment_ID) . '">' . __('Approve') . '</a> ';
 					}
 				}
 				echo "]";
diff -ruN 1.5.2/wp-admin/execute-pings.php 2.0.4/wp-admin/execute-pings.php
--- 1.5.2/wp-admin/execute-pings.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/execute-pings.php	2006-01-18 18:03:28.000000000 -0600
@@ -0,0 +1,25 @@
+<?php
+
+require_once('../wp-config.php');
+
+// Do pingbacks
+while ($ping = $wpdb->get_row("SELECT * FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_pingme' LIMIT 1")) {
+	$wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE post_id = {$ping->ID} AND meta_key = '_pingme';");
+	pingback($ping->post_content, $ping->ID);
+}
+
+// Do Enclosures
+while ($enclosure = $wpdb->get_row("SELECT * FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_encloseme' LIMIT 1")) {
+	$wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE post_id = {$enclosure->ID} AND meta_key = '_encloseme';");
+	do_enclose($enclosure->post_content, $enclosure->ID);
+}
+
+// Do Trackbacks
+$trackbacks = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE CHAR_LENGTH(TRIM(to_ping)) > 7 AND post_status != 'draft'");
+if ( is_array($trackbacks) ) {
+	foreach ( $trackbacks as $trackback ) {
+		do_trackbacks($trackback->ID);
+	}
+}
+
+?>
Files 1.5.2/wp-admin/images/box-bg.gif and 2.0.4/wp-admin/images/box-bg.gif differ
Files 1.5.2/wp-admin/images/box-bg-left.gif and 2.0.4/wp-admin/images/box-bg-left.gif differ
Files 1.5.2/wp-admin/images/box-bg-right.gif and 2.0.4/wp-admin/images/box-bg-right.gif differ
Files 1.5.2/wp-admin/images/box-butt.gif and 2.0.4/wp-admin/images/box-butt.gif differ
Files 1.5.2/wp-admin/images/box-butt-left.gif and 2.0.4/wp-admin/images/box-butt-left.gif differ
Files 1.5.2/wp-admin/images/box-butt-right.gif and 2.0.4/wp-admin/images/box-butt-right.gif differ
Files 1.5.2/wp-admin/images/box-head.gif and 2.0.4/wp-admin/images/box-head.gif differ
Files 1.5.2/wp-admin/images/box-head-left.gif and 2.0.4/wp-admin/images/box-head-left.gif differ
Files 1.5.2/wp-admin/images/box-head-right.gif and 2.0.4/wp-admin/images/box-head-right.gif differ
Files 1.5.2/wp-admin/images/browse-happy.gif and 2.0.4/wp-admin/images/browse-happy.gif differ
Files 1.5.2/wp-admin/images/fade-butt.png and 2.0.4/wp-admin/images/fade-butt.png differ
Files 1.5.2/wp-admin/images/notice.gif and 2.0.4/wp-admin/images/notice.gif differ
Files 1.5.2/wp-admin/images/toggle.gif and 2.0.4/wp-admin/images/toggle.gif differ
Files 1.5.2/wp-admin/images/wordpress-logo.png and 2.0.4/wp-admin/images/wordpress-logo.png differ
diff -ruN 1.5.2/wp-admin/import/blogger.php 2.0.4/wp-admin/import/blogger.php
--- 1.5.2/wp-admin/import/blogger.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/import/blogger.php	2006-06-27 18:10:02.000000000 -0500
@@ -0,0 +1,667 @@
+<?php
+
+class Blogger_Import {
+
+	var $lump_authors = false;
+	var $import = array();
+
+	// Shows the welcome screen and the magic iframe.
+	function greet() {
+		$title = __('Import Blogger');
+		$welcome = __('Howdy! This importer allows you to import posts and comments from your Blogger account into your WordPress blog.');
+		$noiframes = __('This feature requires iframe support.');
+		$warning = __('This will delete everything saved by the Blogger importer except your posts and comments. Are you sure you want to do this?');
+		$reset = __('Reset this importer');
+		$incompat = __('Your web server is not properly configured to use this importer. Please enable the CURL extension for PHP and then reload this page.');
+
+		echo "<div class='wrap'><h2>$title</h2><p>$welcome</p>";
+		if ( function_exists('curl_init') )
+			echo "<iframe src='admin.php?import=blogger&amp;noheader=true' height='350px' width = '99%'>$noiframes</iframe><p><a href='admin.php?import=blogger&amp;restart=true&amp;noheader=true' onclick='return confirm(\"$warning\")'>$reset</a></p>";
+		else
+			echo "<p>$incompat</p>";
+		echo "</div>\n";
+	}
+
+	// Deletes saved data and redirect.
+	function restart() {
+		delete_option('import-blogger');
+		wp_redirect("admin.php?import=blogger");
+		die();
+	}
+
+	// Generates a string that will make the page reload in a specified interval.
+	function refresher($msec) {
+		if ( $msec )
+			return "<html><head><script type='text/javascript'>window.onload=setTimeout('window.location.reload()', $msec);</script>\n</head>\n<body>\n";
+		else
+			return "<html><head><script type='text/javascript'>window.onload=window.location.reload();</script>\n</head>\n<body>\n";
+	}
+
+	// Returns associative array of code, header, cookies, body. Based on code from php.net.
+	function parse_response($this_response) {
+		// Split response into header and body sections
+		list($response_headers, $response_body) = explode("\r\n\r\n", $this_response, 2);
+		$response_header_lines = explode("\r\n", $response_headers);
+
+		// First line of headers is the HTTP response code
+		$http_response_line = array_shift($response_header_lines);
+		if(preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line, $matches)) { $response_code = $matches[1]; }
+
+		// put the rest of the headers in an array
+		$response_header_array = array();
+		foreach($response_header_lines as $header_line) {
+			list($header,$value) = explode(': ', $header_line, 2);
+			$response_header_array[$header] .= $value."\n";
+		}
+
+		$cookie_array = array();
+		$cookies = explode("\n", $response_header_array["Set-Cookie"]);
+		foreach($cookies as $this_cookie) { array_push($cookie_array, "Cookie: ".$this_cookie); }
+
+		return array("code" => $response_code, "header" => $response_header_array, "cookies" => $cookie_array, "body" => $response_body);
+	}
+
+	// Prints a form for the user to enter Blogger creds.
+	function login_form($text='') {
+		echo '<h1>' . __('Log in to Blogger') . "</h1>\n$text\n";
+		echo '<form method="post" action="admin.php?import=blogger&amp;noheader=true&amp;step=0"><table><tr><td>' . __('Username') . ':</td><td><input type="text" name="user" /></td></tr><tr><td>' . __('Password') . ':</td><td><input type="password" name="pass" /></td><td><input type="submit" value="' . __('Start') . '" /></td></tr></table></form>';
+		die;
+	}
+
+	// Sends creds to Blogger, returns the session cookies an array of headers.
+	function login_blogger($user, $pass) {
+		$_url = 'http://www.blogger.com/login.do';
+		$params = "username=$user&password=$pass";
+		$ch = curl_init();
+		curl_setopt($ch, CURLOPT_POST,1);
+		curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
+		curl_setopt($ch, CURLOPT_URL,$_url);
+		curl_setopt($ch, CURLOPT_USERAGENT, 'Blogger Exporter');
+		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
+		curl_setopt($ch, CURLOPT_HEADER,1);
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
+		$response = curl_exec ($ch);
+
+		$response = $this->parse_response($response);
+
+		sleep(1);
+
+		return $response['cookies'];
+	}
+
+	// Requests page from Blogger, returns the response array.
+	function get_blogger($url, $header = '', $user=false, $pass=false) {
+		$ch = curl_init();
+		if ($user && $pass) curl_setopt($ch, CURLOPT_USERPWD,"{$user}:{$pass}");
+		curl_setopt($ch, CURLOPT_URL,$url);
+		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
+		curl_setopt($ch, CURLOPT_USERAGENT, 'Blogger Exporter');
+		curl_setopt($ch, CURLOPT_HEADER,1);
+		if (is_array($header)) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+		$response = curl_exec ($ch);
+
+		$response = $this->parse_response($response);
+		$response['url'] = $url;
+
+		if (curl_errno($ch)) {
+			print curl_error($ch);
+		} else {
+			curl_close($ch);
+		}
+
+		return $response;
+	}
+
+	// Posts data to Blogger, returns response array.
+	function post_blogger($url, $header = false, $paramary = false, $parse=true) {
+		$params = '';
+		if ( is_array($paramary) ) {
+			foreach($paramary as $key=>$value)
+				if($key && $value != '')
+					$params.=$key."=".urlencode(stripslashes($value))."&";
+		}
+		if ($user && $pass) $params .= "username=$user&password=$pass";
+		$params = trim($params,'&');
+		$ch = curl_init();
+		curl_setopt($ch, CURLOPT_POST,1);
+		curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
+		if ($user && $pass) curl_setopt($ch, CURLOPT_USERPWD,"{$user}:{$pass}");
+		curl_setopt($ch, CURLOPT_URL,$url);
+		curl_setopt($ch, CURLOPT_USERAGENT, 'Blogger Exporter');
+		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
+		curl_setopt($ch, CURLOPT_HEADER,$parse);
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
+		if ($header) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+		$response = curl_exec ($ch);
+	
+		if ($parse) {
+			$response = $this->parse_response($response);
+			$response['url'] = $url;
+			return $response;
+		}
+	
+		return $response;
+	}
+
+	// Prints the list of blogs for import.
+	function show_blogs() {
+		global $import;
+		echo '<h1>' . __('Selecting a Blog') . "</h1>\n<ul>";
+		foreach ( $this->import['blogs'] as $blog ) {
+			if (9 == $blog['nextstep']) $status = "100%";
+			elseif (8 == $blog['nextstep']) $status = "90%";
+			elseif (7 == $blog['nextstep']) $status = "82.5%";
+			elseif (6 == $blog['nextstep']) $status = "75%";
+			elseif (5 == $blog['nextstep']) $status = "57%";
+			elseif (4 == $blog['nextstep']) $status = "28%";
+			elseif (3 == $blog['nextstep']) $status = "14%";
+			else $status = "0%";
+			echo "\t<li><a href='admin.php?import=blogger&amp;noheader=true&amp;blog={$blog['id']}'>{$blog['title']}</a> $status</li>\n";
+		}
+		die("</ul>\n");
+	}
+
+	// Publishes.
+	function publish_blogger($i, $text) {
+		$head = $this->refresher(2000) . "<h1>$text</h1>\n";
+		if ( ! strstr($this->import['blogs'][$_GET['blog']]['publish'][$i], 'http') ) {
+			// First call. Start the publish process with a fresh set of cookies.
+			$this->import['cookies'] = $this->login_blogger($this->import['user'], $this->import['pass']);
+			update_option('import-blogger', $this->import);
+			$paramary = array('blogID' => $_GET['blog'], 'all' => '1', 'republishAll' => 'Republish Entire Blog', 'publish' => '1', 'redirectUrl' => "/publish.do?blogID={$_GET['blog']}&inprogress=true");
+
+			$response = $this->post_blogger("http://www.blogger.com/publish.do?blogID={$_GET['blog']}", $this->import['cookies'], $paramary);
+			if ( $response['code'] == '302' ) {
+				$url = str_replace('publish.g', 'publish-body.g', $response['header']['Location']);
+				$this->import['blogs'][$_GET['blog']]['publish'][$i] = $url;
+				update_option('import-blogger', $this->import);
+				$response = $this->get_blogger($url, $this->import['cookies']);
+				preg_match('#<p class="progressIndicator">.*</p>#U', $response['body'], $matches);
+				$progress = $matches[0];
+				die($head . $progress);
+			} else {
+				$this->import['blogs'][$_GET['blog']]['publish'][$i] = false;
+				update_option('import-blogger', $this->import);
+				die($head);
+			}
+		} else {
+			// Subsequent call. Keep checking status until Blogger reports publish complete.
+			$url = $this->import['blogs'][$_GET['blog']]['publish'][$i];
+			$response = $this->get_blogger($url, $this->import['cookies']);
+			if ( preg_match('#<p class="progressIndicator">.*</p>#U', $response['body'], $matches) ) {
+				$progress = $matches[0];
+				if ( strstr($progress, '100%') ) {
+					$this->set_next_step($i);
+					$progress .= '<p>'.__('Moving on...').'</p>';
+				}
+				die($head . $progress);
+			} else {
+				$this->import['blogs'][$_GET['blog']]['publish'][$i] = false;
+				update_option('import-blogger', $this->import);
+				die("$head<p>" . __('Trying again...') . '</p>');
+			}
+		}
+	}
+
+	// Sets next step, saves options
+	function set_next_step($step) {
+		$this->import['blogs'][$_GET['blog']]['nextstep'] = $step;
+		update_option('import-blogger', $this->import);
+	}
+	
+	// Redirects to next step
+	function do_next_step() {
+		wp_redirect("admin.php?import=blogger&noheader=true&blog={$_GET['blog']}");
+		die();
+	}
+
+	// Step 0: Do Blogger login, get blogid/title pairs.
+	function do_login() {
+		if ( ( ! $this->import['user'] && ! is_array($this->import['cookies']) ) ) {
+			// The user must provide a Blogger username and password.
+			if ( ! ( $_POST['user'] && $_POST['pass'] ) ) {
+				$this->login_form(__('The script will log into your Blogger account, change some settings so it can read your blog, and restore the original settings when it\'s done. Here\'s what you do:').'</p><ol><li>'.__('Back up your Blogger template.').'</li><li>'.__('Back up any other Blogger settings you might need later.').'</li><li>'.__('Log out of Blogger').'</li><li>'.__('Log in <em>here</em> with your Blogger username and password.').'</li><li>'.__('On the next screen, click one of your Blogger blogs.').'</li><li>'.__('Do not close this window or navigate away until the process is complete.').'</li></ol>');
+			}
+		
+			// Try logging in. If we get an array of cookies back, we at least connected.		
+			$this->import['cookies'] = $this->login_blogger($_POST['user'], $_POST['pass']);
+			if ( !is_array( $this->import['cookies'] ) ) {
+				$this->login_form(__('Login failed. Please enter your credentials again.'));
+			}
+			
+			// Save the password so we can log the browser in when it's time to publish.
+			$this->import['pass'] = $_POST['pass'];
+			$this->import['user'] = $_POST['user'];
+
+			// Get the Blogger welcome page and scrape the blog numbers and names from it
+			$response = $this->get_blogger('http://www.blogger.com/home', $this->import['cookies']);
+			if (! stristr($response['body'], 'signed in as') ) $this->login_form(__('Login failed. Please re-enter your username and password.'));
+			$blogsary = array();
+			preg_match_all('#posts\.g\?blogID=(\d+)">([^<]+)</a>#U', $response['body'], $blogsary);
+			if ( ! count( $blogsary[1] < 1 ) )
+				die(__('No blogs found for this user.'));
+			$this->import['blogs'] = array();
+			$template = '<MainPage><br /><br /><br /><p>'.__('Are you looking for %title%? It is temporarily out of service. Please try again in a few minutes. Meanwhile, discover <a href="http://wordpress.org/">a better blogging tool</a>.').'</p><BloggerArchives><a class="archive" href="<$BlogArchiveURL$>"><$BlogArchiveName$></a><br /></BloggerArchives></MainPage><ArchivePage><Blogger><wordpresspost><$BlogItemDateTime$>|W|P|<$BlogItemAuthorNickname$>|W|P|<$BlogItemBody$>|W|P|<$BlogItemNumber$>|W|P|<$BlogItemTitle$>|W|P|<$BlogItemAuthorEmail$><BlogItemCommentsEnabled><BlogItemComments><wordpresscomment><$BlogCommentDateTime$>|W|P|<$BlogCommentAuthor$>|W|P|<$BlogCommentBody$></BlogItemComments></BlogItemCommentsEnabled></Blogger></ArchivePage>';
+			foreach ( $blogsary[1] as $key => $id ) {
+				// Define the required Blogger options.
+				$blog_opts = array(
+					'blog-options-basic' => false,
+					'blog-options-archiving' => array('archiveFrequency' => 'm'),
+					'blog-publishing' => array('publishMode'=>'0', 'blogID' => "$id", 'subdomain' => mt_rand().mt_rand(), 'pingWeblogs' => 'false'),
+					'blog-formatting' => array('timeStampFormat' => '0', 'encoding'=>'UTF-8', 'convertLineBreaks'=>'false', 'floatAlignment'=>'false'),
+					'blog-comments' => array('commentsTimeStampFormat' => '0'),
+					'template-edit' => array( 'templateText' =>  str_replace('%title%', trim($blogsary[2][$key]), $template) )
+				);
+
+				// Build the blog options array template
+				foreach ($blog_opts as $blog_opt => $modify)
+					$new_opts["$blog_opt"] = array('backup'=>false, 'modify' => $modify, 'error'=>false);
+
+				$this->import['blogs']["$id"] = array(
+					'id' => $id,
+					'title' => trim($blogsary[2][$key]),
+					'options' => $new_opts,
+					'url' => false,
+					'publish_cookies' => false,
+					'published' => false,
+					'archives' => false,
+					'lump_authors' => false,
+					'newusers' => array(),
+					'nextstep' => 2
+				);
+			}
+			update_option('import-blogger', $this->import);
+			wp_redirect("admin.php?import=blogger&noheader=true&step=1");
+		}
+		die();
+	}
+
+	// Step 1: Select one of the blogs belonging to the user logged in.
+	function select_blog() {
+		if ( is_array($this->import['blogs']) ) {
+			$this->show_blogs();
+			die();
+		} else {
+			$this->restart();
+		}
+	}
+
+	// Step 2: Backup the Blogger options pages, updating some of them.
+	function backup_settings() {
+		$output.= '<h1>'.__('Backing up Blogger options')."</h1>\n";
+		$form = false;
+		foreach ($this->import['blogs'][$_GET['blog']]['options'] as $blog_opt => $optary) {
+			if ( $blog_opt == $_GET['form'] ) {
+				// Save the posted form data
+				$this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['backup'] = $_POST;
+				update_option('import-blogger',$this->import);
+
+				// Post the modified form data to Blogger
+				if ( $optary['modify'] ) {
+					$posturl = "http://www.blogger.com/{$blog_opt}.do";
+					$headers = array_merge($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'], $this->import['cookies']);
+					if ( 'blog-publishing' == $blog_opt ) {
+						if ( $_POST['publishMode'] > 0 ) {
+							$response = $this->get_blogger("http://www.blogger.com/blog-publishing.g?blogID={$_GET['blog']}&publishMode=0", $headers);
+							if ( $response['code'] >= 400 )
+								die('<h2>'.__('Failed attempt to change publish mode from FTP to BlogSpot.').'</h2><pre>' . addslashes(print_r($headers, 1)) . addslashes(print_r($response, 1)) . '</pre>');
+							$this->import['blogs'][$_GET['blog']]['url'] = 'http://' . $optary['modify']['subdomain'] . '.blogspot.com/';
+							sleep(2);
+						} else {
+							$this->import['blogs'][$_GET['blog']]['url'] = 'http://' . $_POST['subdomain'] . '.blogspot.com/';
+							update_option('import-blogger', $this->import);
+							$output .= "<del><p>$blog_opt</p></del>\n";
+							continue;
+						}
+						$paramary = $optary['modify'];
+					} else {
+						$paramary = array_merge($_POST, $optary['modify']);
+					}
+					$response = $this->post_blogger($posturl, $headers, $paramary);
+					if ( $response['code'] >= 400 || strstr($response['body'], 'There are errors on this form') )
+						die('<p>'.__('Error on form submission. Retry or reset the importer.').'</p>' . addslashes(print_r($response, 1)));
+				}
+				$output .= "<del><p>$blog_opt</p></del>\n";
+			} elseif ( is_array($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['backup']) ) {
+				// This option set has already been backed up.
+				$output .= "<del><p>$blog_opt</p></del>\n";
+			} elseif ( ! $form ) {
+				// This option page needs to be downloaded and given to the browser for submission back to this script.
+				$response = $this->get_blogger("http://www.blogger.com/{$blog_opt}.g?blogID={$_GET['blog']}", $this->import['cookies']);
+				$this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'] = $response['cookies'];
+				update_option('import-blogger',$this->import);
+				$body = $response['body'];
+				$body = preg_replace("|\<!DOCTYPE.*\<body[^>]*>|ms","",$body);
+				$body = preg_replace("|/?{$blog_opt}.do|","admin.php?import=blogger&amp;noheader=true&amp;step=2&amp;blog={$_GET['blog']}&amp;form={$blog_opt}",$body);
+				$body = str_replace("name='submit'","name='supermit'",$body);
+				$body = str_replace('name="submit"','name="supermit"',$body);
+				$body = str_replace('</body>','',str_replace('</html>','',$body));
+				$form = "<div style='height:0px;width:0px;overflow:hidden;'>";
+				$form.= $body;
+				$form.= "</div><script type='text/javascript'>forms=document.getElementsByTagName('form');for(i=0;i<forms.length;i++){if(forms[i].action.search('{$blog_opt}')){forms[i].submit();break;}}</script>";
+				$output.= '<p>'.sprintf('<strong>%s</strong> in progress, please wait...', $blog_opt)."</p>\n";
+			} else {
+				$output.= "<p>$blog_opt</p>\n";
+			}
+		}
+		if ( $form )
+			die($output . $form);
+
+		$this->set_next_step(4);
+		$this->do_next_step();
+	}
+
+	// Step 3: Cancelled :-)
+
+	// Step 4: Publish with the new template and settings.
+	function publish_blog() {
+		$this->publish_blogger(5, __('Publishing with new template and options'));
+	}
+
+	// Step 5: Get the archive URLs from the new blog.
+	function get_archive_urls() {
+		$bloghtml = $this->get_blogger($this->import['blogs'][$_GET['blog']]['url']);
+		if (! strstr($bloghtml['body'], '<a class="archive"') )
+			die(__('Your Blogger blog did not take the new template or did not respond.'));
+		preg_match_all('#<a class="archive" href="([^"]*)"#', $bloghtml['body'], $archives);
+		foreach ($archives[1] as $archive) {
+			$this->import['blogs'][$_GET['blog']]['archives'][$archive] = false;
+		}
+		$this->set_next_step(6);
+		$this->do_next_step();
+	}
+
+	// Step 6: Get each monthly archive, import it, mark it done.
+	function get_archive() {
+		global $wpdb;
+		$output = '<h2>'.__('Importing Blogger archives into WordPress').'</h2>';
+		$did_one = false;
+		$post_array = $posts = array();
+		foreach ( $this->import['blogs'][$_GET['blog']]['archives'] as $url => $status ) {
+			$archivename = substr(basename($url),0,7);
+			if ( $status || $did_one ) {
+				$foo = 'bar';
+				// Do nothing.
+			} else {
+				// Import the selected month
+				$postcount = 0;
+				$skippedpostcount = 0;
+				$commentcount = 0;
+				$skippedcommentcount = 0;
+				$status = __('in progress...');
+				$this->import['blogs'][$_GET['blog']]['archives']["$url"] = $status;
+				update_option('import-blogger', $import);
+				$archive = $this->get_blogger($url);
+				if ( $archive['code'] > 200 )
+					continue;	
+				$posts = explode('<wordpresspost>', $archive['body']);
+				for ($i = 1; $i < count($posts); $i = $i + 1) {
+					$postparts = explode('<wordpresscomment>', $posts[$i]);
+					$postinfo = explode('|W|P|', $postparts[0]);
+					$post_date = $postinfo[0];
+					$post_content = $postinfo[2];
+					// Don't try to re-use the original numbers
+					// because the new, longer numbers are too
+					// big to handle as ints.
+					//$post_number = $postinfo[3];
+					$post_title = ( $postinfo[4] != '' ) ? $postinfo[4] : $postinfo[3];
+					$post_author_name = $wpdb->escape(trim($postinfo[1]));
+					$post_author_email = $postinfo[5] ? $postinfo[5] : 'user@wordpress.org';
+	
+					if ( $this->lump_authors ) {
+						// Ignore Blogger authors. Use the current user_ID for all posts imported.
+						$post_author = $GLOBALS['user_ID'];
+					} else {
+						// Add a user for each new author encountered.
+						if (! username_exists($post_author_name) ) {
+							$user_login = $wpdb->escape($post_author_name);
+							$user_email = $wpdb->escape($post_author_email);
+							$user_password = substr(md5(uniqid(microtime())), 0, 6);
+							$result = wp_create_user( $user_login, $user_password, $user_email );
+							$status.= sprintf('Registered user <strong>%s</strong>.', $user_login);
+							$this->import['blogs'][$_GET['blog']]['newusers'][] = $user_login;
+						}
+						$userdata = get_userdatabylogin( $post_author_name );
+						$post_author = $userdata->ID;
+					}
+					$post_date = explode(' ', $post_date);
+					$post_date_Ymd = explode('/', $post_date[0]);
+					$postyear = $post_date_Ymd[2];
+					$postmonth = zeroise($post_date_Ymd[0], 2);
+					$postday = zeroise($post_date_Ymd[1], 2);
+					$post_date_His = explode(':', $post_date[1]);
+					$posthour = zeroise($post_date_His[0], 2);
+					$postminute = zeroise($post_date_His[1], 2);
+					$postsecond = zeroise($post_date_His[2], 2);
+	
+					if (($post_date[2] == 'PM') && ($posthour != '12'))
+						$posthour = $posthour + 12;
+					else if (($post_date[2] == 'AM') && ($posthour == '12'))
+						$posthour = '00';
+	
+					$post_date = "$postyear-$postmonth-$postday $posthour:$postminute:$postsecond";
+	
+					$post_content = addslashes($post_content);
+					$post_content = str_replace(array('<br>','<BR>','<br/>','<BR/>','<br />','<BR />'), "\n", $post_content); // the XHTML touch... ;)
+	
+					$post_title = addslashes($post_title);
+			
+					$post_status = 'publish';
+	
+					if ( $ID = post_exists($post_title, '', $post_date) ) {
+						$post_array[$i]['ID'] = $ID;
+						$skippedpostcount++;
+					} else {
+						$post_array[$i]['post'] = compact('post_author', 'post_content', 'post_title', 'post_category', 'post_author', 'post_date', 'post_status');
+						$post_array[$i]['comments'] = false;
+					}
+
+					// Import any comments attached to this post.
+					if ($postparts[1]) :
+					for ($j = 1; $j < count($postparts); $j = $j + 1) {
+						$commentinfo = explode('|W|P|', $postparts[$j]);
+						$comment_date = explode(' ', $commentinfo[0]);
+						$comment_date_Ymd = explode('/', $comment_date[0]);
+						$commentyear = $comment_date_Ymd[2];
+						$commentmonth = zeroise($comment_date_Ymd[0], 2);
+						$commentday = zeroise($comment_date_Ymd[1], 2);
+						$comment_date_His = explode(':', $comment_date[1]);
+						$commenthour = zeroise($comment_date_His[0], 2);
+						$commentminute = zeroise($comment_date_His[1], 2);
+						$commentsecond = '00';
+						if (($comment_date[2] == 'PM') && ($commenthour != '12'))
+							$commenthour = $commenthour + 12;
+						else if (($comment_date[2] == 'AM') && ($commenthour == '12'))
+							$commenthour = '00';
+						$comment_date = "$commentyear-$commentmonth-$commentday $commenthour:$commentminute:$commentsecond";
+						$comment_author = addslashes(strip_tags($commentinfo[1]));
+						if ( strpos($commentinfo[1], 'a href') ) {
+							$comment_author_parts = explode('&quot;', htmlentities($commentinfo[1]));
+							$comment_author_url = $comment_author_parts[1];
+						} else $comment_author_url = '';
+						$comment_content = $commentinfo[2];
+						$comment_content = str_replace(array('<br>','<BR>','<br/>','<BR/>','<br />','<BR />'), "\n", $comment_content);
+						$comment_approved = 1;
+						if ( comment_exists($comment_author, $comment_date) ) {
+							$skippedcommentcount++;
+						} else {
+							$comment = compact('comment_author', 'comment_author_url', 'comment_date', 'comment_content', 'comment_approved');
+							$post_array[$i]['comments'][$j] = wp_filter_comment($comment);
+						}
+						$commentcount++;
+					}
+					endif;
+					$postcount++;
+				}
+				if ( count($post_array) ) {
+					krsort($post_array);
+					foreach($post_array as $post) {
+						if ( ! $comment_post_ID = $post['ID'] )
+							$comment_post_ID = wp_insert_post($post['post']);
+						if ( $post['comments'] ) {
+							foreach ( $post['comments'] as $comment ) {
+								$comment['comment_post_ID'] = $comment_post_ID;
+								wp_insert_comment($comment);
+							}
+						}
+					}
+				}
+				$status = sprintf(__('%s post(s) parsed, %s skipped...'), $postcount,  $skippedpostcount).' '.
+					sprintf(__('%s comment(s) parsed, %s skipped...'), $commentcoun, $skippedcommentcount).' '.
+					' <strong>'.__('Done').'</strong>';
+				$import = $this->import;
+				$import['blogs'][$_GET['blog']]['archives']["$url"] = $status;
+				update_option('import-blogger', $import);
+				$did_one = true;
+			}
+			$output.= "<p>$archivename $status</p>\n";
+ 		}
+		if ( ! $did_one )
+			$this->set_next_step(7);
+		die( $this->refresher(1000) . $output );
+	}
+
+	// Step 7: Restore the backed-up settings to Blogger
+	function restore_settings() {
+		$output = '<h1>'.__('Restoring your Blogger options')."</h1>\n";
+		$did_one = false;
+		// Restore options in reverse order.
+		if ( ! $this->import['reversed'] ) {
+			$this->import['blogs'][$_GET['blog']]['options'] = array_reverse($this->import['blogs'][$_GET['blog']]['options'], true);
+			$this->import['reversed'] = true;
+			update_option('import-blogger', $this->import);
+		}
+		foreach ( $this->import['blogs'][$_GET['blog']]['options'] as $blog_opt => $optary ) {
+			if ( $did_one ) {
+				$output .= "<p>$blog_opt</p>\n";
+			} elseif ( $optary['restored'] || ! $optary['modify'] ) {
+				$output .= "<p><del>$blog_opt</del></p>\n";
+			} else {
+				$posturl = "http://www.blogger.com/{$blog_opt}.do";
+				$headers = array_merge($this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['cookies'], $this->import['cookies']);
+				if ( 'blog-publishing' == $blog_opt) {
+					if ( $optary['backup']['publishMode'] > 0 ) {
+						$response = $this->get_blogger("http://www.blogger.com/blog-publishing.g?blogID={$_GET['blog']}&publishMode={$optary['backup']['publishMode']}", $headers);
+						sleep(2);
+						if ( $response['code'] >= 400 )
+							die('<h1>Error restoring publishMode.</h1><p>Please tell the devs.</p>' . addslashes(print_r($response, 1)) );
+					}
+				}
+				if ( $optary['backup'] != $optary['modify'] ) {
+					$response = $this->post_blogger($posturl, $headers, $optary['backup']);
+					if ( $response['code'] >= 400 || strstr($response['body'], 'There are errors on this form') ) {
+						$this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['error'] = true;
+						update_option('import-blogger', $this->import);
+						$output .= sprintf(__('%s failed. Trying again.'), "<p><strong>$blog_opt</strong> ").'</p>';
+					} else {
+						$this->import['blogs'][$_GET['blog']]['options']["$blog_opt"]['restored'] = true;
+						update_option('import-blogger', $this->import);
+						$output .= sprintf(__('%s restored.'), "<p><strong>$blog_opt</strong> ").'</p>';
+					}
+				}
+				$did_one = true;
+			}
+		}
+
+		if ( $did_one ) {
+			die( $this->refresher(1000) . $output );
+		} elseif ( $this->import['blogs'][$_GET['blog']]['options']['blog-publishing']['backup']['publishMode'] > 0 ) {
+			$this->set_next_step(9);
+		} else {
+			$this->set_next_step(8);
+		}
+
+		$this->do_next_step();
+	}
+
+	// Step 8: Republish, all back to normal
+	function republish_blog() {
+		$this->publish_blogger(9, __('Publishing with original template and options'));
+	}
+
+	// Step 9: Congratulate the user
+	function congrats() {
+		echo '<h1>'.__('Congratulations!').'</h1><p>'.__('Now that you have imported your Blogger blog into WordPress, what are you going to do? Here are some suggestions:').'</p><ul><li>'.__('That was hard work! Take a break.').'</li>';
+		if ( count($this->import['blogs']) > 1 )
+			echo '<li>'.__('In case you haven\'t done it already, you can import the posts from your other blogs:'). $this->show_blogs() . '</li>';
+		if ( $n = count($this->import['blogs'][$_GET['blog']]['newusers']) )
+			echo '<li>'.sprintf(__('Go to <a href="%s" target="%s">Authors &amp; Users</a>, where you can modify the new user(s) or delete them. If you want to make all of the imported posts yours, you will be given that option when you delete the new authors.'), 'users.php', '_parent').'</li>';
+		echo '<li>'.__('For security, click the link below to reset this importer. That will clear your Blogger credentials and options from the database.').'</li>';
+		echo '</ul>';
+	}
+
+	// Figures out what to do, then does it.
+	function start() {
+		if ( $_GET['restart'] == 'true' ) {
+			$this->restart();
+		}
+		
+		if ( isset($_GET['noheader']) ) {
+			header('Content-Type: text/html; charset=utf-8');
+
+			$this->import = get_settings('import-blogger');
+
+			if ( false === $this->import ) {
+				$step = 0;
+			} elseif ( isset($_GET['step']) ) {
+				$step = (int) $_GET['step'];
+			} elseif ( isset($_GET['blog']) && isset($this->import['blogs'][$_GET['blog']]['nextstep']) ) {
+				$step = $this->import['blogs'][$_GET['blog']]['nextstep'];
+			} elseif ( is_array($this->import['blogs']) ) {
+				$step = 1;
+			} else {
+				$step = 0;
+			}
+//echo "Step $step.";
+//die('<pre>'.print_r($this->import,1).'</pre');
+			switch ($step) {
+				case 0 :
+					$this->do_login();
+					break;
+				case 1 :
+					$this->select_blog();
+					break;
+				case 2 :
+					$this->backup_settings();
+					break;
+				case 3 :
+					$this->wait_for_blogger();
+					break;
+				case 4 :
+					$this->publish_blog();
+					break;
+				case 5 :
+					$this->get_archive_urls();
+					break;
+				case 6 :
+					$this->get_archive();
+					break;
+				case 7 :
+					$this->restore_settings();
+					break;
+				case 8 :
+					$this->republish_blog();
+					break;
+				case 9 :
+					$this->congrats();
+					break;
+			}
+			die;
+			
+		} else {
+			$this->greet();
+		}
+	}
+
+	function Blogger_Import() {
+		// This space intentionally left blank.
+	}
+}
+
+$blogger_import = new Blogger_Import();
+
+register_importer('blogger', 'Blogger', __('Import posts and comments from a Blogger account'), array ($blogger_import, 'start'));
+
+?>
diff -ruN 1.5.2/wp-admin/import/dotclear.php 2.0.4/wp-admin/import/dotclear.php
--- 1.5.2/wp-admin/import/dotclear.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/import/dotclear.php	2006-07-05 11:48:55.000000000 -0500
@@ -0,0 +1,741 @@
+<?php
+/**
+	Add These Functions to make our lives easier
+**/
+if(!function_exists('get_catbynicename'))
+{
+	function get_catbynicename($category_nicename) 
+	{
+	global $wpdb;
+	
+	$cat_id -= 0; 	// force numeric
+	$name = $wpdb->get_var('SELECT cat_ID FROM '.$wpdb->categories.' WHERE category_nicename="'.$category_nicename.'"');
+	
+	return $name;
+	}
+}
+
+if(!function_exists('get_comment_count'))
+{
+	function get_comment_count($post_ID)
+	{
+		global $wpdb;
+		return $wpdb->get_var('SELECT count(*) FROM '.$wpdb->comments.' WHERE comment_post_ID = '.$post_ID);
+	}
+}
+
+if(!function_exists('link_cat_exists'))
+{
+	function link_cat_exists($catname)
+	{
+		global $wpdb;
+		return $wpdb->get_var('SELECT cat_id FROM '.$wpdb->linkcategories.' WHERE cat_name = "'.$wpdb->escape($catname).'"');
+	}
+}
+
+if(!function_exists('link_exists'))
+{
+	function link_exists($linkname)
+	{
+		global $wpdb;
+		return $wpdb->get_var('SELECT link_id FROM '.$wpdb->links.' WHERE link_name = "'.$linkname.'"');
+	}
+}
+
+/*
+ Identify UTF-8 text
+ Taken from http://www.php.net/manual/fr/function.mb-detect-encoding.php#50087
+*/
+//
+//    utf8 encoding validation developed based on Wikipedia entry at:
+//    http://en.wikipedia.org/wiki/UTF-8
+//
+//    Implemented as a recursive descent parser based on a simple state machine
+//    copyright 2005 Maarten Meijer
+//
+//    This cries out for a C-implementation to be included in PHP core
+//
+   function valid_1byte($char) {
+       if(!is_int($char)) return false;
+       return ($char & 0x80) == 0x00;
+   }
+  
+   function valid_2byte($char) {
+       if(!is_int($char)) return false;
+       return ($char & 0xE0) == 0xC0;
+   }
+
+   function valid_3byte($char) {
+       if(!is_int($char)) return false;
+       return ($char & 0xF0) == 0xE0;
+   }
+
+   function valid_4byte($char) {
+       if(!is_int($char)) return false;
+       return ($char & 0xF8) == 0xF0;
+   }
+  
+   function valid_nextbyte($char) {
+       if(!is_int($char)) return false;
+       return ($char & 0xC0) == 0x80;
+   }
+  
+   function valid_utf8($string) {
+       $len = strlen($string);
+       $i = 0;   
+       while( $i < $len ) {
+           $char = ord(substr($string, $i++, 1));
+           if(valid_1byte($char)) {    // continue
+               continue;
+           } else if(valid_2byte($char)) { // check 1 byte
+               if(!valid_nextbyte(ord(substr($string, $i++, 1))))
+                   return false;
+           } else if(valid_3byte($char)) { // check 2 bytes
+               if(!valid_nextbyte(ord(substr($string, $i++, 1))))
+                   return false;
+               if(!valid_nextbyte(ord(substr($string, $i++, 1))))
+                   return false;
+           } else if(valid_4byte($char)) { // check 3 bytes
+               if(!valid_nextbyte(ord(substr($string, $i++, 1))))
+                   return false;
+               if(!valid_nextbyte(ord(substr($string, $i++, 1))))
+                   return false;
+               if(!valid_nextbyte(ord(substr($string, $i++, 1))))
+                   return false;
+           } // goto next char
+       }
+       return true; // done
+   }
+
+function csc ($s) {
+	if (valid_utf8 ($s)) {
+		return $s;
+	} else {
+		return iconv(get_option ("dccharset"),"UTF-8",$s);
+	}
+}
+
+function textconv ($s) {
+	return csc (preg_replace ('|(?<!<br />)\s*\n|', ' ', $s));
+}
+
+/**
+	The Main Importer Class
+**/
+class Dotclear_Import {
+
+	function header() 
+	{
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import Dotclear').'</h2>';
+		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'</p>';
+	}
+
+	function footer() 
+	{
+		echo '</div>';
+	}
+	
+	function greet() 
+	{
+		echo '<p>'.__('Howdy! This importer allows you to extract posts from a Dotclear database into your blog.  Mileage may vary.').'</p>';
+		echo '<p>'.__('Your Dotclear Configuration settings are as follows:').'</p>';
+		echo '<form action="admin.php?import=dotclear&amp;step=1" method="post">';
+		$this->db_form();
+		echo '<input type="submit" name="submit" value="'.__('Import Categories').'" />';
+		echo '</form>';
+	}
+
+	function get_dc_cats() 
+	{
+		global $wpdb;
+		// General Housekeeping
+		$dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Categories
+		return $dcdb->get_results('SELECT * FROM dc_categorie', ARRAY_A);
+	}
+	
+	function get_dc_users()
+	{
+		global $wpdb;
+		// General Housekeeping
+		$dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Users
+		
+		return $dcdb->get_results('SELECT * FROM dc_user', ARRAY_A);
+	}
+	
+	function get_dc_posts()
+	{
+		// General Housekeeping
+		$dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Posts
+		return $dcdb->get_results('SELECT dc_post.*, dc_categorie.cat_libelle_url AS post_cat_name
+						FROM dc_post INNER JOIN dc_categorie
+						  ON dc_post.cat_id = dc_categorie.cat_id', ARRAY_A);
+	}
+	
+	function get_dc_comments()
+	{
+		global $wpdb;
+		// General Housekeeping
+		$dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Comments
+		return $dcdb->get_results('SELECT * FROM dc_comment', ARRAY_A);
+	}
+	
+	function get_dc_links()
+	{
+		//General Housekeeping
+		$dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+
+		return $dcdb->get_results('SELECT * FROM dc_link ORDER BY position', ARRAY_A);
+	}
+	
+	function cat2wp($categories='') 
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$dccat2wpcat = array();
+		// Do the Magic
+		if(is_array($categories))
+		{
+			echo '<p>'.__('Importing Categories...').'<br /><br /></p>';
+			foreach ($categories as $category) 
+			{
+				$count++;
+				extract($category);
+				
+				// Make Nice Variables
+				$name = $wpdb->escape($cat_libelle_url);
+				$title = $wpdb->escape(csc ($cat_libelle));
+				$desc = $wpdb->escape(csc ($cat_desc));
+
+				if($cinfo = category_exists($name))
+				{
+					$ret_id = wp_insert_category(array('cat_ID' => $cinfo, 'category_nicename' => $name, 'cat_name' => $title, 'category_description' => $desc));
+				}
+				else
+				{
+					$ret_id = wp_insert_category(array('category_nicename' => $name, 'cat_name' => $title, 'category_description' => $desc));
+				}
+				$dccat2wpcat[$id] = $ret_id;
+			}
+			
+			// Store category translation for future use
+			add_option('dccat2wpcat',$dccat2wpcat);
+			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> categories imported.'), $count).'<br /><br /></p>';
+			return true;
+		}
+		echo __('No Categories to Import!');
+		return false;
+	}
+	
+	function users2wp($users='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$dcid2wpid = array();
+		
+		// Midnight Mojo
+		if(is_array($users))
+		{
+			echo '<p>'.__('Importing Users...').'<br /><br /></p>';
+			foreach($users as $user)
+			{
+				$count++;
+				extract($user);
+				
+				// Make Nice Variables
+				$name = $wpdb->escape(csc ($name));
+				$RealName = $wpdb->escape(csc ($user_pseudo));
+				
+				if($uinfo = get_userdatabylogin($name))
+				{
+					
+					$ret_id = wp_insert_user(array(
+								'ID'		=> $uinfo->ID,
+								'user_login'	=> $user_id,
+								'user_nicename'	=> $Realname,
+								'user_email'	=> $user_email,
+								'user_url'	=> 'http://',
+								'display_name'	=> $Realname)
+								);
+				}
+				else 
+				{
+					$ret_id = wp_insert_user(array(
+								'user_login'	=> $user_id,
+								'user_nicename'	=> csc ($user_pseudo),
+								'user_email'	=> $user_email,
+								'user_url'	=> 'http://',
+								'display_name'	=> $Realname)
+								);
+				}
+				$dcid2wpid[$user_id] = $ret_id;
+				
+				// Set Dotclear-to-WordPress permissions translation
+				
+				// Update Usermeta Data
+				$user = new WP_User($ret_id);
+				$wp_perms = $user_level + 1;
+				if(10 == $wp_perms) { $user->set_role('administrator'); }
+				else if(9  == $wp_perms) { $user->set_role('editor'); }
+				else if(5  <= $wp_perms) { $user->set_role('editor'); }
+				else if(4  <= $wp_perms) { $user->set_role('author'); }
+				else if(3  <= $wp_perms) { $user->set_role('contributor'); }
+				else if(2  <= $wp_perms) { $user->set_role('contributor'); }
+				else                     { $user->set_role('subscriber'); }
+				
+				update_usermeta( $ret_id, 'wp_user_level', $wp_perms);
+				update_usermeta( $ret_id, 'rich_editing', 'false');
+				update_usermeta( $ret_id, 'first_name', csc ($user_prenom));
+				update_usermeta( $ret_id, 'last_name', csc ($user_nom));
+			}// End foreach($users as $user)
+			
+			// Store id translation array for future use
+			add_option('dcid2wpid',$dcid2wpid);
+			
+			
+			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> users imported.'), $count).'<br /><br /></p>';
+			return true;
+		}// End if(is_array($users)
+		
+		echo __('No Users to Import!');
+		return false;
+		
+	}// End function user2wp()
+	
+	function posts2wp($posts='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$dcposts2wpposts = array();
+		$cats = array();
+
+		// Do the Magic
+		if(is_array($posts))
+		{
+			echo '<p>'.__('Importing Posts...').'<br /><br /></p>';
+			foreach($posts as $post)
+			{
+				$count++;
+				extract($post);
+				
+				// Set Dotclear-to-WordPress status translation
+				$stattrans = array(0 => 'draft', 1 => 'publish');
+				$comment_status_map = array (0 => 'closed', 1 => 'open');
+				
+				//Can we do this more efficiently?
+				$uinfo = ( get_userdatabylogin( $user_id ) ) ? get_userdatabylogin( $user_id ) : 1;
+				$authorid = ( is_object( $uinfo ) ) ? $uinfo->ID : $uinfo ;
+
+				$Title = $wpdb->escape(csc ($post_titre));
+				$post_content = textconv ($post_content);
+				if ($post_chapo != "") {
+					$post_excerpt = textconv ($post_chapo);
+					$post_content = $post_excerpt ."\n<!--more-->\n".$post_content;
+				}
+				$post_excerpt = $wpdb->escape ($post_excerpt);
+				$post_content = $wpdb->escape ($post_content);
+				$post_status = $stattrans[$post_pub];
+				
+				// Import Post data into WordPress
+				
+				if($pinfo = post_exists($Title,$post_content))
+				{
+					$ret_id = wp_insert_post(array(
+							'ID'			=> $pinfo,
+							'post_author'		=> $authorid,
+							'post_date'		=> $post_dt,
+							'post_date_gmt'		=> $post_dt,
+							'post_modified'		=> $post_upddt,
+							'post_modified_gmt'	=> $post_upddt,
+							'post_title'		=> $Title,
+							'post_content'		=> $post_content,
+							'post_excerpt'		=> $post_excerpt,
+							'post_status'		=> $post_status,
+							'post_name'		=> $post_titre_url,
+							'comment_status'	=> $comment_status_map[$post_open_comment],
+							'ping_status'		=> $comment_status_map[$post_open_tb],
+							'comment_count'		=> $post_nb_comment + $post_nb_trackback)
+							);
+				}
+				else 
+				{
+					$ret_id = wp_insert_post(array(
+							'post_author'		=> $authorid,
+							'post_date'		=> $post_dt,
+							'post_date_gmt'		=> $post_dt,
+							'post_modified'		=> $post_modified_gmt,
+							'post_modified_gmt'	=> $post_modified_gmt,
+							'post_title'		=> $Title,
+							'post_content'		=> $post_content,
+							'post_excerpt'		=> $post_excerpt,
+							'post_status'		=> $post_status,
+							'post_name'		=> $post_titre_url,
+							'comment_status'	=> $comment_status_map[$post_open_comment],
+							'ping_status'		=> $comment_status_map[$post_open_tb],
+							'comment_count'		=> $post_nb_comment + $post_nb_trackback)
+							);
+				}
+				$dcposts2wpposts[$post_id] = $ret_id;
+				
+				// Make Post-to-Category associations
+				$cats = array();
+				if($cat1 = get_catbynicename($post_cat_name)) { $cats[1] = $cat1; }
+
+				if(!empty($cats)) { wp_set_post_cats('', $ret_id, $cats); }
+			}
+		}
+		// Store ID translation for later use
+		add_option('dcposts2wpposts',$dcposts2wpposts);
+		
+		echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> posts imported.'), $count).'<br /><br /></p>';
+		return true;	
+	}
+	
+	function comments2wp($comments='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$dccm2wpcm = array();
+		$postarr = get_option('dcposts2wpposts');
+		
+		// Magic Mojo
+		if(is_array($comments))
+		{
+			echo '<p>'.__('Importing Comments...').'<br /><br /></p>';
+			foreach($comments as $comment)
+			{
+				$count++;
+				extract($comment);
+				
+				// WordPressify Data
+				$comment_ID = ltrim($comment_id, '0');
+				$comment_post_ID = $postarr[$post_id];
+				$comment_approved = "$comment_pub";
+				$name = $wpdb->escape(csc ($comment_auteur));
+				$email = $wpdb->escape($comment_email);
+				$web = "http://".$wpdb->escape($comment_site);
+				$message = $wpdb->escape(textconv ($comment_content));
+				
+				if($cinfo = comment_exists($name, $comment_dt))
+				{
+					// Update comments
+					$ret_id = wp_update_comment(array(
+							'comment_ID'		=> $cinfo,
+							'comment_post_ID'	=> $comment_post_ID,
+							'comment_author'	=> $name,
+							'comment_author_email'	=> $email,
+							'comment_author_url'	=> $web,
+							'comment_author_IP'	=> $comment_ip,
+							'comment_date'		=> $comment_dt,
+							'comment_date_gmt'	=> $comment_dt,
+							'comment_content'	=> $message,
+							'comment_approved'	=> $comment_approved)
+							);
+				}
+				else 
+				{
+					// Insert comments
+					$ret_id = wp_insert_comment(array(
+							'comment_post_ID'	=> $comment_post_ID,
+							'comment_author'	=> $name,
+							'comment_author_email'	=> $email,
+							'comment_author_url'	=> $web,
+							'comment_author_IP'	=> $comment_ip,
+							'comment_date'		=> $comment_dt,
+							'comment_date_gmt'	=> $comment_dt,
+							'comment_content'	=> $message,
+							'comment_approved'	=> $comment_approved)
+							);
+				}
+				$dccm2wpcm[$comment_ID] = $ret_id;
+			}
+			// Store Comment ID translation for future use
+			add_option('dccm2wpcm', $dccm2wpcm);			
+			
+			// Associate newly formed categories with posts
+			get_comment_count($ret_id);
+			
+			
+			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> comments imported.'), $count).'<br /><br /></p>';
+			return true;
+		}
+		echo __('No Comments to Import!');
+		return false;
+	}
+	
+	function links2wp($links='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		
+		// Deal with the links
+		if(is_array($links))
+		{
+			echo '<p>'.__('Importing Links...').'<br /><br /></p>';
+			foreach($links as $link)
+			{
+				$count++;
+				extract($link);
+				
+				if ($title != "") {
+					if ($cinfo = link_cat_exists (csc ($title))) {
+						$category = $cinfo;
+					} else {
+						$wpdb->query ("INSERT INTO $wpdb->linkcategories (cat_name) VALUES ('".
+							$wpdb->escape (csc ($title))."')");
+						$category = $wpdb->insert_id;
+					}
+				} else {
+					$linkname = $wpdb->escape(csc ($label));
+					$description = $wpdb->escape(csc ($title));
+				
+					if($linfo = link_exists($linkname)) {
+						$ret_id = wp_insert_link(array(
+									'link_id'		=> $linfo,
+									'link_url'		=> $href,
+									'link_name'		=> $linkname,
+									'link_category'		=> $category,
+									'link_description'	=> $description)
+									);
+					} else {
+						$ret_id = wp_insert_link(array(
+									'link_url'		=> $url,
+									'link_name'		=> $linkname,
+									'link_category'		=> $category,
+									'link_description'	=> $description)
+									);
+					}
+					$dclinks2wplinks[$link_id] = $ret_id;
+				}
+			}
+			add_option('dclinks2wplinks',$dclinks2wplinks);
+			echo '<p>';
+			printf(__('Done! <strong>%s</strong> links or link categories imported'), $count);
+			echo '<br /><br /></p>';
+			return true;
+		}
+		echo __('No Links to Import!');
+		return false;
+	}
+		
+	function import_categories() 
+	{	
+		// Category Import	
+		$cats = $this->get_dc_cats();
+		$this->cat2wp($cats);
+		add_option('dc_cats', $cats);
+		
+		
+			
+		echo '<form action="admin.php?import=dotclear&amp;step=2" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Users'));
+		echo '</form>';
+
+	}
+	
+	function import_users()
+	{
+		// User Import
+		$users = $this->get_dc_users(); 
+		$this->users2wp($users);
+		
+		echo '<form action="admin.php?import=dotclear&amp;step=3" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Posts'));
+		echo '</form>';
+	}
+	
+	function import_posts()
+	{
+		// Post Import
+		$posts = $this->get_dc_posts();
+		$this->posts2wp($posts);
+		
+		echo '<form action="admin.php?import=dotclear&amp;step=4" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Comments'));
+		echo '</form>';
+	}
+	
+	function import_comments()
+	{
+		// Comment Import
+		$comments = $this->get_dc_comments();
+		$this->comments2wp($comments);
+		
+		echo '<form action="admin.php?import=dotclear&amp;step=5" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Links'));
+		echo '</form>';
+	}
+	
+	function import_links()
+	{
+		//Link Import
+		$links = $this->get_dc_links();
+		$this->links2wp($links);
+		add_option('dc_links', $links);
+		
+		echo '<form action="admin.php?import=dotclear&amp;step=6" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Finish'));
+		echo '</form>';
+	}
+	
+	function cleanup_dcimport()
+	{
+		delete_option('tpre');
+		delete_option('dc_cats');
+		delete_option('dcid2wpid');
+		delete_option('dccat2wpcat');
+		delete_option('dcposts2wpposts');
+		delete_option('dccm2wpcm');
+		delete_option('dclinks2wplinks');
+		delete_option('dcuser');
+		delete_option('dcpass');
+		delete_option('dcname');
+		delete_option('dchost');
+		delete_option('dccharset');
+		$this->tips();
+	}
+	
+	function tips()
+	{
+		echo '<p>'.__('Welcome to WordPress.  We hope (and expect!) that you will find this platform incredibly rewarding!  As a new WordPress user coming from Dotclear, there are some things that we would like to point out.  Hopefully, they will help your transition go as smoothly as possible.').'</p>';
+		echo '<h3>'.__('Users').'</h3>';
+		echo '<p>'.sprintf(__('You have already setup WordPress and have been assigned an administrative login and password.  Forget it.  You didn\'t have that login in Dotclear, why should you have it here?  Instead we have taken care to import all of your users into our system.  Unfortunately there is one downside.  Because both WordPress and Dotclear uses a strong encryption hash with passwords, it is impossible to decrypt it and we are forced to assign temporary passwords to all your users.  <strong>Every user has the same username, but their passwords are reset to password123.</strong>  So <a href="%1$s">Login</a> and change it.'), '/wp-login.php').'</p>';
+		echo '<h3>'.__('Preserving Authors').'</h3>';
+		echo '<p>'.__('Secondly, we have attempted to preserve post authors.  If you are the only author or contributor to your blog, then you are safe.  In most cases, we are successful in this preservation endeavor.  However, if we cannot ascertain the name of the writer due to discrepancies between database tables, we assign it to you, the administrative user.').'</p>';
+		echo '<h3>'.__('Textile').'</h3>';
+		echo '<p>'.__('Also, since you\'re coming from Dotclear, you probably have been using Textile to format your comments and posts.  If this is the case, we recommend downloading and installing <a href="http://www.huddledmasses.org/2004/04/19/wordpress-plugin-textile-20/">Textile for WordPress</a>.  Trust me... You\'ll want it.').'</p>';
+		echo '<h3>'.__('WordPress Resources').'</h3>';
+		echo '<p>'.__('Finally, there are numerous WordPress resources around the internet.  Some of them are:').'</p>';
+		echo '<ul>';
+		echo '<li>'.__('<a href="http://www.wordpress.org">The official WordPress site</a>').'</li>';
+		echo '<li>'.__('<a href="http://wordpress.org/support/">The WordPress support forums').'</li>';
+		echo '<li>'.__('<a href="http://codex.wordpress.org">The Codex (In other words, the WordPress Bible)</a>').'</li>';
+		echo '</ul>';
+		echo '<p>'.sprintf(__('That\'s it! What are you waiting for? Go <a href="%1$s">login</a>!'), '/wp-login.php').'</p>';
+	}
+	
+	function db_form()
+	{
+		echo '<ul>';
+		printf('<li><label for="dbuser">%s</label> <input type="text" name="dbuser" id="dbuser" /></li>', __('Dotclear Database User:'));
+		printf('<li><label for="dbpass">%s</label> <input type="password" name="dbpass" id="dbpass" /></li>', __('Dotclear Database Password:'));
+		printf('<li><label for="dbname">%s</label> <input type="text" name="dbname" id="dbname" /></li>', __('Dotclear Database Name:'));
+		printf('<li><label for="dbhost">%s</label> <input type="text" name="dbhost" id="dbhost" value="localhost" /></li>', __('Dotclear Database Host:'));
+		/* printf('<li><label for="dbprefix">%s</label> <input type="text" name="dbprefix" /></li>', __('Dotclear Table prefix (if any):')); */
+		printf('<li><label for="dccharset">%s</label> <input type="text" id="dccharset" name="dccharset" value="ISO-8859-15"/></li>', __('Originating character set:'));
+		echo '</ul>';
+	}
+	
+	function dispatch() 
+	{
+
+		if (empty ($_GET['step']))
+			$step = 0;
+		else
+			$step = (int) $_GET['step'];
+		$this->header();
+		
+		if ( $step > 0 ) 
+		{
+			if($_POST['dbuser'])
+			{
+				if(get_option('dcuser'))
+					delete_option('dcuser');	
+				add_option('dcuser',$_POST['dbuser']);
+			}
+			if($_POST['dbpass'])
+			{
+				if(get_option('dcpass'))
+					delete_option('dcpass');	
+				add_option('dcpass',$_POST['dbpass']);
+			}
+			
+			if($_POST['dbname'])
+			{
+				if(get_option('dcname'))
+					delete_option('dcname');	
+				add_option('dcname',$_POST['dbname']);
+			}
+			if($_POST['dbhost'])
+			{
+				if(get_option('dchost'))
+					delete_option('dchost');
+				add_option('dchost',$_POST['dbhost']); 
+			}
+			if($_POST['dccharset'])
+			{
+				if(get_option('dccharset'))
+					delete_option('dccharset');
+				add_option('dccharset',$_POST['dccharset']); 
+			}			
+			if($_POST['dbprefix'])
+			{
+				if(get_option('tpre'))
+					delete_option('tpre');
+				add_option('tpre',$_POST['dbprefix']); 
+			}			
+
+
+		}
+
+		switch ($step) 
+		{
+			default:
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				$this->import_categories();
+				break;
+			case 2 :
+				$this->import_users();
+				break;
+			case 3 :
+				$this->import_posts();
+				break;
+			case 4 :
+				$this->import_comments();
+				break;
+			case 5 :
+				$this->import_links();
+				break;
+			case 6 :
+				$this->cleanup_dcimport();
+				break;
+		}
+		
+		$this->footer();
+	}
+
+	function Dotclear_Import() 
+	{
+		// Nothing.	
+	}
+}
+
+$dc_import = new Dotclear_Import();
+register_importer('dotclear', 'Dotclear', __('Import posts from a Dotclear Blog'), array ($dc_import, 'dispatch'));
+?>
diff -ruN 1.5.2/wp-admin/import/livejournal.php 2.0.4/wp-admin/import/livejournal.php
--- 1.5.2/wp-admin/import/livejournal.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/import/livejournal.php	2006-01-04 23:35:09.000000000 -0600
@@ -0,0 +1,171 @@
+<?php
+
+class LJ_Import {
+
+	var $file;
+
+	function header() {
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import LiveJournal').'</h2>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function unhtmlentities($string) { // From php.net for < 4.3 compat
+		$trans_tbl = get_html_translation_table(HTML_ENTITIES);
+		$trans_tbl = array_flip($trans_tbl);
+		return strtr($string, $trans_tbl);
+	}
+	
+	function greet() {
+		echo '<p>'.__('Howdy! This importer allows you to extract posts from LiveJournal XML export file into your blog.  Pick a LiveJournal file to upload and click Import.').'</p>';
+		wp_import_upload_form("admin.php?import=livejournal&amp;step=1");
+	}
+
+	function import_posts() {
+		global $wpdb, $current_user;
+		
+		set_magic_quotes_runtime(0);
+		$importdata = file($this->file); // Read the file into an array
+		$importdata = implode('', $importdata); // squish it
+		$importdata = str_replace(array ("\r\n", "\r"), "\n", $importdata);
+
+		preg_match_all('|<entry>(.*?)</entry>|is', $importdata, $posts);
+		$posts = $posts[1];
+		unset($importdata);
+		echo '<ol>';		
+		foreach ($posts as $post) {
+			flush();
+			preg_match('|<subject>(.*?)</subject>|is', $post, $post_title);
+			$post_title = $wpdb->escape(trim($post_title[1]));
+			if ( empty($post_title) ) {
+				preg_match('|<itemid>(.*?)</itemid>|is', $post, $post_title);
+				$post_title = $wpdb->escape(trim($post_title[1]));
+			}
+
+			preg_match('|<eventtime>(.*?)</eventtime>|is', $post, $post_date);
+			$post_date = strtotime($post_date[1]);
+			$post_date = gmdate('Y-m-d H:i:s', $post_date);
+
+			preg_match('|<event>(.*?)</event>|is', $post, $post_content);
+			$post_content = str_replace(array ('<![CDATA[', ']]>'), '', trim($post_content[1]));
+			$post_content = $this->unhtmlentities($post_content);
+
+			// Clean up content
+			$post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content);
+			$post_content = str_replace('<br>', '<br />', $post_content);
+			$post_content = str_replace('<hr>', '<hr />', $post_content);
+			$post_content = $wpdb->escape($post_content);
+
+			$post_author = $current_user->ID;
+			$post_status = 'publish';
+
+			echo '<li>';
+			if ($post_id = post_exists($post_title, $post_content, $post_date)) {
+				printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title));
+			} else {
+				printf(__('Importing post <i>%s</i>...'), stripslashes($post_title));
+				$postdata = compact('post_author', 'post_date', 'post_content', 'post_title', 'post_status');
+				$post_id = wp_insert_post($postdata);
+				if (!$post_id) {
+					_e("Couldn't get post ID");
+					echo '</li>';
+					break;
+				}
+			}
+
+			preg_match_all('|<comment>(.*?)</comment>|is', $post, $comments);
+			$comments = $comments[1];
+			
+			if ( $comments ) {
+				$comment_post_ID = $post_id;
+				$num_comments = 0;
+				foreach ($comments as $comment) {
+					preg_match('|<event>(.*?)</event>|is', $comment, $comment_content);
+					$comment_content = str_replace(array ('<![CDATA[', ']]>'), '', trim($comment_content[1]));
+					$comment_content = $this->unhtmlentities($comment_content);
+
+					// Clean up content
+					$comment_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $comment_content);
+					$comment_content = str_replace('<br>', '<br />', $comment_content);
+					$comment_content = str_replace('<hr>', '<hr />', $comment_content);
+					$comment_content = $wpdb->escape($comment_content);
+
+					preg_match('|<eventtime>(.*?)</eventtime>|is', $comment, $comment_date);
+					$comment_date = trim($comment_date[1]);
+					$comment_date = date('Y-m-d H:i:s', strtotime($comment_date));
+
+					preg_match('|<name>(.*?)</name>|is', $comment, $comment_author);
+					$comment_author = $wpdb->escape(trim($comment_author[1]));
+
+					preg_match('|<email>(.*?)</email>|is', $comment, $comment_author_email);
+					$comment_author_email = $wpdb->escape(trim($comment_author_email[1]));
+
+					$comment_approved = 1;
+					// Check if it's already there
+					if (!comment_exists($comment_author, $comment_date)) {
+						$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_date', 'comment_content', 'comment_approved');
+						$commentdata = wp_filter_comment($commentdata);
+						wp_insert_comment($commentdata);
+						$num_comments++;
+					}
+				}
+			}
+			if ( $num_comments ) {
+				echo ' ';
+				printf(__('(%s comments)'), $num_comments);
+			}
+			echo '</li>';
+			flush();
+			ob_flush();
+		}
+		echo '</ol>';
+	}
+
+	function import() {
+		$file = wp_import_handle_upload();
+		if ( isset($file['error']) ) {
+			echo $file['error'];
+			return;
+		}
+
+		$this->file = $file['file'];
+		$this->import_posts();
+		wp_import_cleanup($file['id']);
+		
+		echo '<h3>';
+		printf(__('All done. <a href="%s">Have fun!</a>'), get_option('home'));
+		echo '</h3>';
+	}
+
+	function dispatch() {
+		if (empty ($_GET['step']))
+			$step = 0;
+		else
+			$step = (int) $_GET['step'];
+
+		$this->header();
+		
+		switch ($step) {
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				$this->import();
+				break;
+		}
+		
+		$this->footer();
+	}
+
+	function LJ_Import() {
+		// Nothing.	
+	}
+}
+
+$livejournal_import = new LJ_Import();
+
+register_importer('livejournal', 'LiveJournal', __('Import posts from LiveJournal'), array ($livejournal_import, 'dispatch'));
+?>
diff -ruN 1.5.2/wp-admin/import/mt.php 2.0.4/wp-admin/import/mt.php
--- 1.5.2/wp-admin/import/mt.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/import/mt.php	2006-05-19 01:22:55.000000000 -0500
@@ -0,0 +1,430 @@
+<?php
+
+class MT_Import {
+
+	var $posts = array ();
+	var $file;
+	var $id;
+	var $mtnames = array ();
+	var $newauthornames = array ();
+	var $j = -1;
+
+	function header() {
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import Movable Type').'</h2>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function greet() {
+		$this->header();
+?>
+<p><?php _e('Howdy! We&#8217;re about to begin the process to import all of your Movable Type entries into WordPress. To begin, select a file to upload and click Import.'); ?></p>
+<?php wp_import_upload_form( add_query_arg('step', 1) ); ?>
+	<p><?php _e('The importer is smart enough not to import duplicates, so you can run this multiple times without worry if&#8212;for whatever reason&#8212;it doesn\'t finish. If you get an <strong>out of memory</strong> error try splitting up the import file into pieces.'); ?> </p>
+<?php
+		$this->footer();
+	}
+
+	function users_form($n) {
+		global $wpdb, $testing;
+		$users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY ID");
+?><select name="userselect[<?php echo $n; ?>]">
+	<option value="#NONE#">- Select -</option>
+	<?php
+
+
+		foreach ($users as $user) {
+			echo '<option value="'.$user->user_login.'">'.$user->user_login.'</option>';
+		}
+?>
+	</select>
+	<?php
+
+
+	}
+
+	//function to check the authorname and do the mapping
+	function checkauthor($author) {
+		global $wpdb;
+		//mtnames is an array with the names in the mt import file
+		$pass = 'changeme';
+		if (!(in_array($author, $this->mtnames))) { //a new mt author name is found
+			++ $this->j;
+			$this->mtnames[$this->j] = $author; //add that new mt author name to an array 
+			$user_id = username_exists($this->newauthornames[$this->j]); //check if the new author name defined by the user is a pre-existing wp user
+			if (!$user_id) { //banging my head against the desk now. 
+				if ($newauthornames[$this->j] == 'left_blank') { //check if the user does not want to change the authorname
+					$user_id = wp_create_user($author, $pass);
+					$this->newauthornames[$this->j] = $author; //now we have a name, in the place of left_blank.
+				} else {
+					$user_id = wp_create_user($this->newauthornames[$this->j], $pass);
+				}
+			} else {
+				return $user_id; // return pre-existing wp username if it exists
+			}
+		} else {
+			$key = array_search($author, $this->mtnames); //find the array key for $author in the $mtnames array
+			$user_id = username_exists($this->newauthornames[$key]); //use that key to get the value of the author's name from $newauthornames
+		}
+
+		return $user_id;
+	}
+
+	function get_entries() {
+		set_magic_quotes_runtime(0);
+		$importdata = file($this->file); // Read the file into an array
+		$importdata = implode('', $importdata); // squish it
+		$importdata = preg_replace("/(\r\n|\n|\r)/", "\n", $importdata);
+		$importdata = preg_replace("/\n--------\n/", "--MT-ENTRY--\n", $importdata);
+		$this->posts = explode("--MT-ENTRY--", $importdata);
+	}
+
+	function get_mt_authors() {
+		$temp = array ();
+		$i = -1;
+		foreach ($this->posts as $post) {
+			if ('' != trim($post)) {
+				++ $i;
+				preg_match("|AUTHOR:(.*)|", $post, $thematch);
+				$thematch = trim($thematch[1]);
+				array_push($temp, "$thematch"); //store the extracted author names in a temporary array
+			}
+		}
+
+		//we need to find unique values of author names, while preserving the order, so this function emulates the unique_value(); php function, without the sorting.
+		$authors[0] = array_shift($temp);
+		$y = count($temp) + 1;
+		for ($x = 1; $x < $y; $x ++) {
+			$next = array_shift($temp);
+			if (!(in_array($next, $authors)))
+				array_push($authors, "$next");
+		}
+
+		return $authors;
+	}
+
+	function get_authors_from_post() {
+		$formnames = array ();
+		$selectnames = array ();
+
+		foreach ($_POST['user'] as $key => $line) {
+			$newname = trim(stripslashes($line));
+			if ($newname == '')
+				$newname = 'left_blank'; //passing author names from step 1 to step 2 is accomplished by using POST. left_blank denotes an empty entry in the form.
+			array_push($formnames, "$newname");
+		} // $formnames is the array with the form entered names
+
+		foreach ($_POST['userselect'] as $user => $key) {
+			$selected = trim(stripslashes($key));
+			array_push($selectnames, "$selected");
+		}
+
+		$count = count($formnames);
+		for ($i = 0; $i < $count; $i ++) {
+			if ($selectnames[$i] != '#NONE#') { //if no name was selected from the select menu, use the name entered in the form
+				array_push($this->newauthornames, "$selectnames[$i]");
+			} else {
+				array_push($this->newauthornames, "$formnames[$i]");
+			}
+		}
+	}
+
+	function mt_authors_form() {
+?>
+<p><?php _e('To make it easier for you to edit and save the imported posts and drafts, you may want to change the name of the author of the posts. For example, you may want to import all the entries as <code>admin</code>s entries.'); ?></p>
+<p><?php _e('Below, you can see the names of the authors of the MovableType posts in <i>italics</i>. For each of these names, you can either pick an author in your WordPress installation from the menu, or enter a name for the author in the textbox.'); ?></p>
+<p><?php _e('If a new user is created by WordPress, the password will be set, by default, to "changeme". Quite suggestive, eh? ;)'); ?></p>
+	<?php
+
+
+		$authors = $this->get_mt_authors();
+		echo '<ol id="authors">';
+		echo '<form action="?import=mt&amp;step=2&amp;id=' . $this->id . '" method="post">';
+		$j = -1;
+		foreach ($authors as $author) {
+			++ $j;
+			echo '<li><i>'.$author.'</i><br />'.'<input type="text" value="'.$author.'" name="'.'user[]'.'" maxlength="30">';
+			$this->users_form($j);
+			echo '</li>';
+		}
+
+		echo '<input type="submit" value="Submit">'.'<br/>';
+		echo '</form>';
+		echo '</ol>';
+
+		flush();
+	}
+
+	function select_authors() {
+		$file = wp_import_handle_upload();
+		if ( isset($file['error']) ) {
+			echo $file['error'];
+			return;
+		}
+		$this->file = $file['file'];
+		$this->id = $file['id'];
+
+		$this->get_entries();
+		$this->mt_authors_form();
+	}
+
+	function process_posts() {
+		global $wpdb;
+		$i = -1;
+		echo "<ol>";
+		foreach ($this->posts as $post) {
+			if ('' != trim($post)) {
+				++ $i;
+				unset ($post_categories);
+
+				// Take the pings out first
+				preg_match("|(-----\n\nPING:.*)|s", $post, $pings);
+				$post = preg_replace("|(-----\n\nPING:.*)|s", '', $post);
+
+				// Then take the comments out
+				preg_match("|(-----\nCOMMENT:.*)|s", $post, $comments);
+				$post = preg_replace("|(-----\nCOMMENT:.*)|s", '', $post);
+
+				// We ignore the keywords
+				$post = preg_replace("|(-----\nKEYWORDS:.*)|s", '', $post);
+
+				// We want the excerpt
+				preg_match("|-----\nEXCERPT:(.*)|s", $post, $excerpt);
+				$post_excerpt = $wpdb->escape(trim($excerpt[1]));
+				$post = preg_replace("|(-----\nEXCERPT:.*)|s", '', $post);
+
+				// We're going to put extended body into main body with a more tag
+				preg_match("|-----\nEXTENDED BODY:(.*)|s", $post, $extended);
+				$extended = trim($extended[1]);
+				if ('' != $extended)
+					$extended = "\n<!--more-->\n$extended";
+				$post = preg_replace("|(-----\nEXTENDED BODY:.*)|s", '', $post);
+
+				// Now for the main body
+				preg_match("|-----\nBODY:(.*)|s", $post, $body);
+				$body = trim($body[1]);
+				$post_content = $wpdb->escape($body.$extended);
+				$post = preg_replace("|(-----\nBODY:.*)|s", '', $post);
+
+				// Grab the metadata from what's left
+				$metadata = explode("\n", $post);
+				foreach ($metadata as $line) {
+					preg_match("/^(.*?):(.*)/", $line, $token);
+					$key = trim($token[1]);
+					$value = trim($token[2]);
+					// Now we decide what it is and what to do with it
+					switch ($key) {
+						case '' :
+							break;
+						case 'AUTHOR' :
+							$post_author = $value;
+							break;
+						case 'TITLE' :
+							$post_title = $wpdb->escape($value);
+							break;
+						case 'STATUS' :
+							// "publish" and "draft" enumeration items match up; no change required
+							$post_status = $value;
+							if (empty ($post_status))
+								$post_status = 'publish';
+							break;
+						case 'ALLOW COMMENTS' :
+							$post_allow_comments = $value;
+							if ($post_allow_comments == 1) {
+								$comment_status = 'open';
+							} else {
+								$comment_status = 'closed';
+							}
+							break;
+						case 'CONVERT BREAKS' :
+							$post_convert_breaks = $value;
+							break;
+						case 'ALLOW PINGS' :
+							$ping_status = trim($meta[2][0]);
+							if ($ping_status == 1) {
+								$ping_status = 'open';
+							} else {
+								$ping_status = 'closed';
+							}
+							break;
+						case 'PRIMARY CATEGORY' :
+							if (! empty ($value) )
+								$post_categories[] = $wpdb->escape($value);
+							break;
+						case 'CATEGORY' :
+							if (! empty ($value) )
+								$post_categories[] = $wpdb->escape($value);
+							break;
+						case 'DATE' :
+							$post_modified = strtotime($value);
+							$post_modified = date('Y-m-d H:i:s', $post_modified);
+							$post_modified_gmt = get_gmt_from_date("$post_modified");
+							$post_date = $post_modified;
+							$post_date_gmt = $post_modified_gmt;
+							break;
+						default :
+							// echo "\n$key: $value";
+							break;
+					} // end switch
+				} // End foreach
+
+				// Let's check to see if it's in already
+				if ($post_id = post_exists($post_title, '', $post_date)) {
+					echo '<li>';
+					printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title));
+				} else {
+					echo '<li>';
+					printf(__('Importing post <i>%s</i>...'), stripslashes($post_title));
+
+					$post_author = $this->checkauthor($post_author); //just so that if a post already exists, new users are not created by checkauthor
+
+					$postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_modified', 'post_modified_gmt');
+					$post_id = wp_insert_post($postdata);
+					// Add categories.
+					if (0 != count($post_categories)) {
+						wp_create_categories($post_categories, $post_id);
+					}
+				}
+
+				$comment_post_ID = $post_id;
+				$comment_approved = 1;
+
+				// Now for comments
+				$comments = explode("-----\nCOMMENT:", $comments[0]);
+				$num_comments = 0;
+				foreach ($comments as $comment) {
+					if ('' != trim($comment)) {
+						// Author
+						preg_match("|AUTHOR:(.*)|", $comment, $comment_author);
+						$comment_author = $wpdb->escape(trim($comment_author[1]));
+						$comment = preg_replace('|(\n?AUTHOR:.*)|', '', $comment);
+						preg_match("|EMAIL:(.*)|", $comment, $comment_author_email);
+						$comment_author_email = $wpdb->escape(trim($comment_author_email[1]));
+						$comment = preg_replace('|(\n?EMAIL:.*)|', '', $comment);
+
+						preg_match("|IP:(.*)|", $comment, $comment_author_IP);
+						$comment_author_IP = trim($comment_author_IP[1]);
+						$comment = preg_replace('|(\n?IP:.*)|', '', $comment);
+
+						preg_match("|URL:(.*)|", $comment, $comment_author_url);
+						$comment_author_url = $wpdb->escape(trim($comment_author_url[1]));
+						$comment = preg_replace('|(\n?URL:.*)|', '', $comment);
+
+						preg_match("|DATE:(.*)|", $comment, $comment_date);
+						$comment_date = trim($comment_date[1]);
+						$comment_date = date('Y-m-d H:i:s', strtotime($comment_date));
+						$comment = preg_replace('|(\n?DATE:.*)|', '', $comment);
+
+						$comment_content = $wpdb->escape(trim($comment));
+						$comment_content = str_replace('-----', '', $comment_content);
+						// Check if it's already there
+						if (!comment_exists($comment_author, $comment_date)) {
+							$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_content', 'comment_approved');
+							$commentdata = wp_filter_comment($commentdata);
+							wp_insert_comment($commentdata);
+							$num_comments++;
+						}
+					}
+				}
+				if ( $num_comments )
+					printf(__('(%s comments)'), $num_comments);
+
+				// Finally the pings
+				// fix the double newline on the first one
+				$pings[0] = str_replace("-----\n\n", "-----\n", $pings[0]);
+				$pings = explode("-----\nPING:", $pings[0]);
+				$num_pings = 0;
+				foreach ($pings as $ping) {
+					if ('' != trim($ping)) {
+						// 'Author'
+						preg_match("|BLOG NAME:(.*)|", $ping, $comment_author);
+						$comment_author = $wpdb->escape(trim($comment_author[1]));
+						$ping = preg_replace('|(\n?BLOG NAME:.*)|', '', $ping);
+
+						preg_match("|IP:(.*)|", $ping, $comment_author_IP);
+						$comment_author_IP = trim($comment_author_IP[1]);
+						$ping = preg_replace('|(\n?IP:.*)|', '', $ping);
+
+						preg_match("|URL:(.*)|", $ping, $comment_author_url);
+						$comment_author_url = $wpdb->escape(trim($comment_author_url[1]));
+						$ping = preg_replace('|(\n?URL:.*)|', '', $ping);
+
+						preg_match("|DATE:(.*)|", $ping, $comment_date);
+						$comment_date = trim($comment_date[1]);
+						$comment_date = date('Y-m-d H:i:s', strtotime($comment_date));
+						$ping = preg_replace('|(\n?DATE:.*)|', '', $ping);
+
+						preg_match("|TITLE:(.*)|", $ping, $ping_title);
+						$ping_title = $wpdb->escape(trim($ping_title[1]));
+						$ping = preg_replace('|(\n?TITLE:.*)|', '', $ping);
+
+						$comment_content = $wpdb->escape(trim($ping));
+						$comment_content = str_replace('-----', '', $comment_content);
+
+						$comment_content = "<strong>$ping_title</strong>\n\n$comment_content";
+
+						$comment_type = 'trackback';
+
+						// Check if it's already there
+						if (!comment_exists($comment_author, $comment_date)) {
+							$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_content', 'comment_type', 'comment_approved');
+							$commentdata = wp_filter_comment($commentdata);
+							wp_insert_comment($commentdata);
+							$num_pings++;
+						}
+					}
+				}
+				if ( $num_pings )
+					printf(__('(%s pings)'), $num_pings);
+				
+				echo "</li>";
+			}
+			flush();
+		}
+
+		echo '</ol>';
+
+		wp_import_cleanup($this->id);
+
+		echo '<h3>'.sprintf(__('All done. <a href="%s">Have fun!</a>'), get_option('home')).'</h3>';
+	}
+
+	function import() {
+		$this->id = (int) $_GET['id'];
+		$this->file = get_attached_file($this->id);
+		$this->get_authors_from_post();
+		$this->get_entries();
+		$this->process_posts();
+	}
+
+	function dispatch() {
+		if (empty ($_GET['step']))
+			$step = 0;
+		else
+			$step = (int) $_GET['step'];
+
+		switch ($step) {
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				$this->select_authors();
+				break;
+			case 2:
+				$this->import();
+				break;
+		}
+	}
+
+	function MT_Import() {
+		// Nothing.	
+	}
+}
+
+$mt_import = new MT_Import();
+
+register_importer('mt', 'Movable Type', __('Import posts and comments from your Movable Type blog'), array ($mt_import, 'dispatch'));
+?>
diff -ruN 1.5.2/wp-admin/import/rss.php 2.0.4/wp-admin/import/rss.php
--- 1.5.2/wp-admin/import/rss.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/import/rss.php	2005-12-28 14:24:12.000000000 -0600
@@ -0,0 +1,171 @@
+<?php
+
+class RSS_Import {
+
+	var $posts = array ();
+	var $file;
+
+	function header() {
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import RSS').'</h2>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function unhtmlentities($string) { // From php.net for < 4.3 compat
+		$trans_tbl = get_html_translation_table(HTML_ENTITIES);
+		$trans_tbl = array_flip($trans_tbl);
+		return strtr($string, $trans_tbl);
+	}
+	
+	function greet() {
+		echo '<p>'.__('Howdy! This importer allows you to extract posts from any RSS 2.0 file into your blog. This is useful if you want to import your posts from a system that is not handled by a custom import tool. Pick an RSS file to upload and click Import.').'</p>';
+		wp_import_upload_form("admin.php?import=rss&amp;step=1");
+	}
+
+	function get_posts() {
+		global $wpdb;
+		
+		set_magic_quotes_runtime(0);
+		$datalines = file($this->file); // Read the file into an array
+		$importdata = implode('', $datalines); // squish it
+		$importdata = str_replace(array ("\r\n", "\r"), "\n", $importdata);
+
+		preg_match_all('|<item>(.*?)</item>|is', $importdata, $this->posts);
+		$this->posts = $this->posts[1];
+		$index = 0;
+		foreach ($this->posts as $post) {
+			preg_match('|<title>(.*?)</title>|is', $post, $post_title);
+			$post_title = $wpdb->escape(trim($post_title[1]));
+
+			preg_match('|<pubdate>(.*?)</pubdate>|is', $post, $post_date);
+
+			if ($post_date) {
+				$post_date = strtotime($post_date[1]);
+			} else {
+				// if we don't already have something from pubDate
+				preg_match('|<dc:date>(.*?)</dc:date>|is', $post, $post_date);
+				$post_date = preg_replace('|([-+])([0-9]+):([0-9]+)$|', '\1\2\3', $post_date[1]);
+				$post_date = str_replace('T', ' ', $post_date);
+				$post_date = strtotime($post_date);
+			}
+
+			$post_date = gmdate('Y-m-d H:i:s', $post_date);
+
+			preg_match_all('|<category>(.*?)</category>|is', $post, $categories);
+			$categories = $categories[1];
+
+			if (!$categories) {
+				preg_match_all('|<dc:subject>(.*?)</dc:subject>|is', $post, $categories);
+				$categories = $categories[1];
+			}
+
+			$cat_index = 0;
+			foreach ($categories as $category) {
+				$categories[$cat_index] = $wpdb->escape($this->unhtmlentities($category));
+				$cat_index++;
+			}
+
+			preg_match('|<guid.+?>(.*?)</guid>|is', $post, $guid);
+			if ($guid)
+				$guid = $wpdb->escape(trim($guid[1]));
+			else
+				$guid = '';
+
+			preg_match('|<content:encoded>(.*?)</content:encoded>|is', $post, $post_content);
+			$post_content = str_replace(array ('<![CDATA[', ']]>'), '', $wpdb->escape(trim($post_content[1])));
+
+			if (!$post_content) {
+				// This is for feeds that put content in description
+				preg_match('|<description>(.*?)</description>|is', $post, $post_content);
+				$post_content = $wpdb->escape($this->unhtmlentities(trim($post_content[1])));
+			}
+
+			// Clean up content
+			$post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content);
+			$post_content = str_replace('<br>', '<br />', $post_content);
+			$post_content = str_replace('<hr>', '<hr />', $post_content);
+
+			$post_author = 1;
+			$post_status = 'publish';
+			$this->posts[$index] = compact('post_author', 'post_date', 'post_content', 'post_title', 'post_status', 'guid', 'categories');
+			$index++;
+		}
+	}
+
+	function import_posts() {
+		echo '<ol>';
+
+		foreach ($this->posts as $post) {
+			echo "<li>".__('Importing post...');
+
+			extract($post);
+
+			if ($post_id = post_exists($post_title, $post_content, $post_date)) {
+				_e('Post already imported');
+			} else {
+				$post_id = wp_insert_post($post);
+				if (!$post_id) {
+					_e("Couldn't get post ID");
+					return;
+				}
+
+				if (0 != count($categories))
+					wp_create_categories($categories, $post_id);
+				_e('Done !');
+			}
+			echo '</li>';
+		}
+
+		echo '</ol>';
+
+	}
+
+	function import() {
+		$file = wp_import_handle_upload();
+		if ( isset($file['error']) ) {
+			echo $file['error'];
+			return;
+		}
+
+		$this->file = $file['file'];
+		$this->get_posts();
+		$this->import_posts();
+		wp_import_cleanup($file['id']);
+		
+		echo '<h3>';
+		printf(__('All done. <a href="%s">Have fun!</a>'), get_option('home'));
+		echo '</h3>';
+	}
+
+	function dispatch() {
+		if (empty ($_GET['step']))
+			$step = 0;
+		else
+			$step = (int) $_GET['step'];
+
+		$this->header();
+		
+		switch ($step) {
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				$this->import();
+				break;
+		}
+		
+		$this->footer();
+	}
+
+	function RSS_Import() {
+		// Nothing.	
+	}
+}
+
+$rss_import = new RSS_Import();
+
+register_importer('rss', 'RSS', __('Import posts from an RSS feed'), array ($rss_import, 'dispatch'));
+?>
diff -ruN 1.5.2/wp-admin/import/textpattern.php 2.0.4/wp-admin/import/textpattern.php
--- 1.5.2/wp-admin/import/textpattern.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/import/textpattern.php	2006-07-05 11:48:55.000000000 -0500
@@ -0,0 +1,663 @@
+<?php
+/**
+	Add These Functions to make our lives easier
+**/
+if(!function_exists('get_catbynicename'))
+{
+	function get_catbynicename($category_nicename) 
+	{
+	global $wpdb;
+	
+	$cat_id -= 0; 	// force numeric
+	$name = $wpdb->get_var('SELECT cat_ID FROM '.$wpdb->categories.' WHERE category_nicename="'.$category_nicename.'"');
+	
+	return $name;
+	}
+}
+
+if(!function_exists('get_comment_count'))
+{
+	function get_comment_count($post_ID)
+	{
+		global $wpdb;
+		return $wpdb->get_var('SELECT count(*) FROM '.$wpdb->comments.' WHERE comment_post_ID = '.$post_ID);
+	}
+}
+
+if(!function_exists('link_exists'))
+{
+	function link_exists($linkname)
+	{
+		global $wpdb;
+		return $wpdb->get_var('SELECT link_id FROM '.$wpdb->links.' WHERE link_name = "'.$wpdb->escape($linkname).'"');
+	}
+}
+
+/**
+	The Main Importer Class
+**/
+class Textpattern_Import {
+
+	function header() 
+	{
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import Textpattern').'</h2>';
+		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'</p>';
+	}
+
+	function footer() 
+	{
+		echo '</div>';
+	}
+	
+	function greet() 
+	{
+		echo '<p>'.__('Howdy! This importer allows you to extract posts from any Textpattern 4.0.2+ into your blog. This has not been tested on previous versions of Textpattern.  Mileage may vary.').'</p>';
+		echo '<p>'.__('Your Textpattern Configuration settings are as follows:').'</p>';
+		echo '<form action="admin.php?import=textpattern&amp;step=1" method="post">';
+		$this->db_form();
+		echo '<input type="submit" name="submit" value="'.__('Import Categories').'" />';
+		echo '</form>';
+	}
+
+	function get_txp_cats()
+	{
+		global $wpdb;
+		// General Housekeeping
+		$txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Categories
+		return $txpdb->get_results('SELECT 
+										id,
+										name,
+										title
+							   		 FROM '.$prefix.'txp_category 
+							   		 WHERE type = "article"', 
+									 ARRAY_A);
+	}
+	
+	function get_txp_users()
+	{
+		global $wpdb;
+		// General Housekeeping
+		$txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Users
+		
+		return $txpdb->get_results('SELECT
+										user_id,
+										name,
+										RealName,
+										email,
+										privs
+							   		FROM '.$prefix.'txp_users', ARRAY_A);
+	}
+	
+	function get_txp_posts()
+	{
+		// General Housekeeping
+		$txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Posts
+		return $txpdb->get_results('SELECT 
+										ID,
+										Posted,
+										AuthorID,
+										LastMod,
+										Title,
+										Body,
+										Excerpt,
+										Category1,
+										Category2,
+										Status,
+										Keywords,
+										url_title,
+										comments_count
+							   		FROM '.$prefix.'textpattern
+							   		', ARRAY_A);
+	}
+	
+	function get_txp_comments()
+	{
+		global $wpdb;
+		// General Housekeeping
+		$txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		// Get Comments
+		return $txpdb->get_results('SELECT * FROM '.$prefix.'txp_discuss', ARRAY_A);
+	}
+	
+		function get_txp_links()
+	{
+		//General Housekeeping
+		$txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost'));
+		set_magic_quotes_runtime(0);
+		$prefix = get_option('tpre');
+		
+		return $txpdb->get_results('SELECT 
+										id,
+										date,
+										category,
+										url,
+										linkname,
+										description
+									  FROM '.$prefix.'txp_link', 
+									  ARRAY_A);						  
+	}
+	
+	function cat2wp($categories='') 
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$txpcat2wpcat = array();
+		// Do the Magic
+		if(is_array($categories))
+		{
+			echo '<p>'.__('Importing Categories...').'<br /><br /></p>';
+			foreach ($categories as $category) 
+			{
+				$count++;
+				extract($category);
+				
+				
+				// Make Nice Variables
+				$name = $wpdb->escape($name);
+				$title = $wpdb->escape($title);
+				
+				if($cinfo = category_exists($name))
+				{
+					$ret_id = wp_insert_category(array('cat_ID' => $cinfo, 'category_nicename' => $name, 'cat_name' => $title));
+				}
+				else
+				{
+					$ret_id = wp_insert_category(array('category_nicename' => $name, 'cat_name' => $title));
+				}
+				$txpcat2wpcat[$id] = $ret_id;
+			}
+			
+			// Store category translation for future use
+			add_option('txpcat2wpcat',$txpcat2wpcat);
+			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> categories imported.'), $count).'<br /><br /></p>';
+			return true;
+		}
+		echo __('No Categories to Import!');
+		return false;
+	}
+	
+	function users2wp($users='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$txpid2wpid = array();
+		
+		// Midnight Mojo
+		if(is_array($users))
+		{
+			echo '<p>'.__('Importing Users...').'<br /><br /></p>';
+			foreach($users as $user)
+			{
+				$count++;
+				extract($user);
+				
+				// Make Nice Variables
+				$name = $wpdb->escape($name);
+				$RealName = $wpdb->escape($RealName);
+				
+				if($uinfo = get_userdatabylogin($name))
+				{
+					
+					$ret_id = wp_insert_user(array(
+								'ID'			=> $uinfo->ID,
+								'user_login'	=> $name,
+								'user_nicename'	=> $RealName,
+								'user_email'	=> $email,
+								'user_url'		=> 'http://',
+								'display_name'	=> $name)
+								);
+				}
+				else 
+				{
+					$ret_id = wp_insert_user(array(
+								'user_login'	=> $name,
+								'user_nicename'	=> $RealName,
+								'user_email'	=> $email,
+								'user_url'		=> 'http://',
+								'display_name'	=> $name)
+								);
+				}
+				$txpid2wpid[$user_id] = $ret_id;
+				
+				// Set Textpattern-to-WordPress permissions translation
+				$transperms = array(1 => '10', 2 => '9', 3 => '5', 4 => '4', 5 => '3', 6 => '2', 7 => '0');
+				
+				// Update Usermeta Data
+				$user = new WP_User($ret_id);
+				if('10' == $transperms[$privs]) { $user->set_role('administrator'); }
+				if('9'  == $transperms[$privs]) { $user->set_role('editor'); }
+				if('5'  == $transperms[$privs]) { $user->set_role('editor'); }
+				if('4'  == $transperms[$privs]) { $user->set_role('author'); }
+				if('3'  == $transperms[$privs]) { $user->set_role('contributor'); }
+				if('2'  == $transperms[$privs]) { $user->set_role('contributor'); }
+				if('0'  == $transperms[$privs]) { $user->set_role('subscriber'); }
+				
+				update_usermeta( $ret_id, 'wp_user_level', $transperms[$privs] );
+				update_usermeta( $ret_id, 'rich_editing', 'false');
+			}// End foreach($users as $user)
+			
+			// Store id translation array for future use
+			add_option('txpid2wpid',$txpid2wpid);
+			
+			
+			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> users imported.'), $count).'<br /><br /></p>';
+			return true;
+		}// End if(is_array($users)
+		
+		echo __('No Users to Import!');
+		return false;
+		
+	}// End function user2wp()
+	
+	function posts2wp($posts='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$txpposts2wpposts = array();
+		$cats = array();
+
+		// Do the Magic
+		if(is_array($posts))
+		{
+			echo '<p>'.__('Importing Posts...').'<br /><br /></p>';
+			foreach($posts as $post)
+			{
+				$count++;
+				extract($post);
+				
+				// Set Textpattern-to-WordPress status translation
+				$stattrans = array(1 => 'draft', 2 => 'private', 3 => 'draft', 4 => 'publish', 5 => 'publish');
+				
+				//Can we do this more efficiently?
+				$uinfo = ( get_userdatabylogin( $AuthorID ) ) ? get_userdatabylogin( $AuthorID ) : 1;
+				$authorid = ( is_object( $uinfo ) ) ? $uinfo->ID : $uinfo ;
+
+				$Title = $wpdb->escape($Title);
+				$Body = $wpdb->escape($Body);
+				$Excerpt = $wpdb->escape($Excerpt);
+				$post_status = $stattrans[$Status];
+				
+				// Import Post data into WordPress
+				
+				if($pinfo = post_exists($Title,$Body))
+				{
+					$ret_id = wp_insert_post(array(
+							'ID'				=> $pinfo,
+							'post_date'			=> $Posted,
+							'post_date_gmt'		=> $post_date_gmt,
+							'post_author'		=> $authorid,
+							'post_modified'		=> $LastMod,
+							'post_modified_gmt' => $post_modified_gmt,
+							'post_title'		=> $Title,
+							'post_content'		=> $Body,
+							'post_excerpt'		=> $Excerpt,
+							'post_status'		=> $post_status,
+							'post_name'			=> $url_title,
+							'comment_count'		=> $comments_count)
+							);
+				}
+				else 
+				{
+					$ret_id = wp_insert_post(array(
+							'post_date'			=> $Posted,
+							'post_date_gmt'		=> $post_date_gmt,
+							'post_author'		=> $authorid,
+							'post_modified'		=> $LastMod,
+							'post_modified_gmt' => $post_modified_gmt,
+							'post_title'		=> $Title,
+							'post_content'		=> $Body,
+							'post_excerpt'		=> $Excerpt,
+							'post_status'		=> $post_status,
+							'post_name'			=> $url_title,
+							'comment_count'		=> $comments_count)
+							);
+				}
+				$txpposts2wpposts[$ID] = $ret_id;
+				
+				// Make Post-to-Category associations
+				$cats = array();
+				if($cat1 = get_catbynicename($Category1)) { $cats[1] = $cat1; }
+				if($cat2 = get_catbynicename($Category2)) { $cats[2] = $cat2; }
+
+				if(!empty($cats)) { wp_set_post_cats('', $ret_id, $cats); }
+			}
+		}
+		// Store ID translation for later use
+		add_option('txpposts2wpposts',$txpposts2wpposts);
+		
+		echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> posts imported.'), $count).'<br /><br /></p>';
+		return true;	
+	}
+	
+	function comments2wp($comments='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		$txpcm2wpcm = array();
+		$postarr = get_option('txpposts2wpposts');
+		
+		// Magic Mojo
+		if(is_array($comments))
+		{
+			echo '<p>'.__('Importing Comments...').'<br /><br /></p>';
+			foreach($comments as $comment)
+			{
+				$count++;
+				extract($comment);
+				
+				// WordPressify Data
+				$comment_ID = ltrim($discussid, '0');
+				$comment_post_ID = $postarr[$parentid];
+				$comment_approved = (1 == $visible) ? 1 : 0;
+				$name = $wpdb->escape($name);
+				$email = $wpdb->escape($email);
+				$web = $wpdb->escape($web);
+				$message = $wpdb->escape($message);
+				
+				if($cinfo = comment_exists($name, $posted))
+				{
+					// Update comments
+					$ret_id = wp_update_comment(array(
+							'comment_ID'			=> $cinfo,
+							'comment_post_ID'		=> $comment_post_ID,
+							'comment_author'		=> $name,
+							'comment_author_email'	=> $email,
+							'comment_author_url'	=> $web,
+							'comment_date'			=> $posted,
+							'comment_content'		=> $message,
+							'comment_approved'		=> $comment_approved)
+							);
+				}
+				else 
+				{
+					// Insert comments
+					$ret_id = wp_insert_comment(array(
+							'comment_post_ID'		=> $comment_post_ID,
+							'comment_author'		=> $name,
+							'comment_author_email'	=> $email,
+							'comment_author_url'	=> $web,
+							'comment_author_IP'		=> $ip,
+							'comment_date'			=> $posted,
+							'comment_content'		=> $message,
+							'comment_approved'		=> $comment_approved)
+							);
+				}
+				$txpcm2wpcm[$comment_ID] = $ret_id;
+			}
+			// Store Comment ID translation for future use
+			add_option('txpcm2wpcm', $txpcm2wpcm);			
+			
+			// Associate newly formed categories with posts
+			get_comment_count($ret_id);
+			
+			
+			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> comments imported.'), $count).'<br /><br /></p>';
+			return true;
+		}
+		echo __('No Comments to Import!');
+		return false;
+	}
+	
+	function links2wp($links='')
+	{
+		// General Housekeeping
+		global $wpdb;
+		$count = 0;
+		
+		// Deal with the links
+		if(is_array($links))
+		{
+			echo '<p>'.__('Importing Links...').'<br /><br /></p>';
+			foreach($links as $link)
+			{
+				$count++;
+				extract($link);
+				
+				// Make nice vars
+				$category = $wpdb->escape($category);
+				$linkname = $wpdb->escape($linkname);
+				$description = $wpdb->escape($description);
+				
+				if($linfo = link_exists($linkname))
+				{
+					$ret_id = wp_insert_link(array(
+								'link_id'			=> $linfo,
+								'link_url'			=> $url,
+								'link_name'			=> $linkname,
+								'link_category'		=> $category,
+								'link_description'	=> $description,
+								'link_updated'		=> $date)
+								);
+				}
+				else 
+				{
+					$ret_id = wp_insert_link(array(
+								'link_url'			=> $url,
+								'link_name'			=> $linkname,
+								'link_category'		=> $category,
+								'link_description'	=> $description,
+								'link_updated'		=> $date)
+								);
+				}
+				$txplinks2wplinks[$link_id] = $ret_id;
+			}
+			add_option('txplinks2wplinks',$txplinks2wplinks);
+			echo '<p>';
+			printf(__('Done! <strong>%s</strong> Links imported'), $count);
+			echo '<br /><br /></p>';
+			return true;
+		}
+		echo __('No Links to Import!');
+		return false;
+	}
+		
+	function import_categories() 
+	{	
+		// Category Import	
+		$cats = $this->get_txp_cats();
+		$this->cat2wp($cats);
+		add_option('txp_cats', $cats);
+		
+		
+			
+		echo '<form action="admin.php?import=textpattern&amp;step=2" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Users'));
+		echo '</form>';
+
+	}
+	
+	function import_users()
+	{
+		// User Import
+		$users = $this->get_txp_users(); 
+		$this->users2wp($users);
+		
+		echo '<form action="admin.php?import=textpattern&amp;step=3" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Posts'));
+		echo '</form>';
+	}
+	
+	function import_posts()
+	{
+		// Post Import
+		$posts = $this->get_txp_posts();
+		$this->posts2wp($posts);
+		
+		echo '<form action="admin.php?import=textpattern&amp;step=4" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Comments'));
+		echo '</form>';
+	}
+	
+	function import_comments()
+	{
+		// Comment Import
+		$comments = $this->get_txp_comments();
+		$this->comments2wp($comments);
+		
+		echo '<form action="admin.php?import=textpattern&amp;step=5" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Import Links'));
+		echo '</form>';
+	}
+	
+	function import_links()
+	{
+		//Link Import
+		$links = $this->get_txp_links();
+		$this->links2wp($links);
+		add_option('txp_links', $links);
+		
+		echo '<form action="admin.php?import=textpattern&amp;step=6" method="post">';
+		printf('<input type="submit" name="submit" value="%s" />', __('Finish'));
+		echo '</form>';
+	}
+	
+	function cleanup_txpimport()
+	{
+		delete_option('tpre');
+		delete_option('txp_cats');
+		delete_option('txpid2wpid');
+		delete_option('txpcat2wpcat');
+		delete_option('txpposts2wpposts');
+		delete_option('txpcm2wpcm');
+		delete_option('txplinks2wplinks');
+		delete_option('txpuser');
+		delete_option('txppass');
+		delete_option('txpname');
+		delete_option('txphost');
+		$this->tips();
+	}
+	
+	function tips()
+	{
+		echo '<p>'.__('Welcome to WordPress.  We hope (and expect!) that you will find this platform incredibly rewarding!  As a new WordPress user coming from Textpattern, there are some things that we would like to point out.  Hopefully, they will help your transition go as smoothly as possible.').'</p>';
+		echo '<h3>'.__('Users').'</h3>';
+		echo '<p>'.sprintf(__('You have already setup WordPress and have been assigned an administrative login and password.  Forget it.  You didn\'t have that login in Textpattern, why should you have it here?  Instead we have taken care to import all of your users into our system.  Unfortunately there is one downside.  Because both WordPress and Textpattern uses a strong encryption hash with passwords, it is impossible to decrypt it and we are forced to assign temporary passwords to all your users.  <strong>Every user has the same username, but their passwords are reset to password123.</strong>  So <a href="%1$s">Login</a> and change it.'), '/wp-login.php').'</p>';
+		echo '<h3>'.__('Preserving Authors').'</h3>';
+		echo '<p>'.__('Secondly, we have attempted to preserve post authors.  If you are the only author or contributor to your blog, then you are safe.  In most cases, we are successful in this preservation endeavor.  However, if we cannot ascertain the name of the writer due to discrepancies between database tables, we assign it to you, the administrative user.').'</p>';
+		echo '<h3>'.__('Textile').'</h3>';
+		echo '<p>'.__('Also, since you\'re coming from Textpattern, you probably have been using Textile to format your comments and posts.  If this is the case, we recommend downloading and installing <a href="http://www.huddledmasses.org/2004/04/19/wordpress-plugin-textile-20/">Textile for WordPress</a>.  Trust me... You\'ll want it.').'</p>';
+		echo '<h3>'.__('WordPress Resources').'</h3>';
+		echo '<p>'.__('Finally, there are numerous WordPress resources around the internet.  Some of them are:').'</p>';
+		echo '<ul>';
+		echo '<li>'.__('<a href="http://www.wordpress.org">The official WordPress site</a>').'</li>';
+		echo '<li>'.__('<a href="http://wordpress.org/support/">The WordPress support forums').'</li>';
+		echo '<li>'.__('<a href="http://codex.wordpress.org">The Codex (In other words, the WordPress Bible)</a>').'</li>';
+		echo '</ul>';
+		echo '<p>'.sprintf(__('That\'s it! What are you waiting for? Go <a href="%1$s">login</a>!'), '/wp-login.php').'</p>';
+	}
+	
+	function db_form()
+	{
+		echo '<ul>';
+		printf('<li><label for="dbuser">%s</label> <input type="text" name="dbuser" id="dbuser" /></li>', __('Textpattern Database User:'));
+		printf('<li><label for="dbpass">%s</label> <input type="password" name="dbpass" id="dbpass" /></li>', __('Textpattern Database Password:'));
+		printf('<li><label for="dbname">%s</label> <input type="text" id="dbname" name="dbname" /></li>', __('Textpattern Database Name:'));
+		printf('<li><label for="dbhost">%s</label> <input type="text" id="dbhost" name="dbhost" value="localhost" /></li>', __('Textpattern Database Host:'));
+		printf('<li><label for="dbprefix">%s</label> <input type="text" name="dbprefix" id="dbprefix"  /></li>', __('Textpattern Table prefix (if any):'));
+		echo '</ul>';
+	}
+	
+	function dispatch() 
+	{
+
+		if (empty ($_GET['step']))
+			$step = 0;
+		else
+			$step = (int) $_GET['step'];
+		$this->header();
+		
+		if ( $step > 0 ) 
+		{
+			if($_POST['dbuser'])
+			{
+				if(get_option('txpuser'))
+					delete_option('txpuser');	
+				add_option('txpuser',$_POST['dbuser']);
+			}
+			if($_POST['dbpass'])
+			{
+				if(get_option('txppass'))
+					delete_option('txppass');	
+				add_option('txppass',$_POST['dbpass']);
+			}
+			
+			if($_POST['dbname'])
+			{
+				if(get_option('txpname'))
+					delete_option('txpname');	
+				add_option('txpname',$_POST['dbname']);
+			}
+			if($_POST['dbhost'])
+			{
+				if(get_option('txphost'))
+					delete_option('txphost');
+				add_option('txphost',$_POST['dbhost']); 
+			}
+			if($_POST['dbprefix'])
+			{
+				if(get_option('tpre'))
+					delete_option('tpre');
+				add_option('tpre',$_POST['dbprefix']); 
+			}			
+
+
+		}
+
+		switch ($step) 
+		{
+			default:
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				$this->import_categories();
+				break;
+			case 2 :
+				$this->import_users();
+				break;
+			case 3 :
+				$this->import_posts();
+				break;
+			case 4 :
+				$this->import_comments();
+				break;
+			case 5 :
+				$this->import_links();
+				break;
+			case 6 :
+				$this->cleanup_txpimport();
+				break;
+		}
+		
+		$this->footer();
+	}
+
+	function Textpattern_Import() 
+	{
+		// Nothing.	
+	}
+}
+
+$txp_import = new Textpattern_Import();
+register_importer('textpattern', 'Textpattern', __('Import posts from a Textpattern Blog'), array ($txp_import, 'dispatch'));
+?>
diff -ruN 1.5.2/wp-admin/import-b2.php 2.0.4/wp-admin/import-b2.php
--- 1.5.2/wp-admin/import-b2.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-admin/import-b2.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,247 +0,0 @@
-<?php
-if (!file_exists('../wp-config.php')) die("There doesn't seem to be a wp-config.php file. Double check that you updated wp-config-sample.php with the proper database connection information and renamed it to wp-config.php.");
-require_once('../wp-config.php');
-require('upgrade-functions.php');
-$step = $_GET['step'];
-if (!$step) $step = 0;
-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">
-	<title>WordPress &#8212; b2 Conversion</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<style media="screen" type="text/css">
-	body {
-		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 15%;
-		margin-right: 15%;
-	}
-	#logo {
-		margin: 0;
-		padding: 0;
-		background-image: url(http://wordpress.org/images/wordpress.gif);
-		background-repeat: no-repeat;
-		height: 60px;
-		border-bottom: 4px solid #333;
-	}
-	#logo a {
-		display: block;
-		height: 60px;
-	}
-	#logo a span {
-		display: none;
-	}
-	p, li {
-		line-height: 140%;
-	}
-	</style>
-</head>
-<body>
-<h1 id="logo"><a href="http://wordpress.org"><span>WordPress</span></a></h1>
-<?php
-switch($step) {
-
-	case 0:
-?>
-<p>Welcome to WordPress. Since you&#8217;re upgrading from b2 everything should be relatively 
-  familiar to you. Here are some notes on upgrading:</p>
-<ul>
-  <li>If you&#8217;re using an older version of b2, it's probably a good idea to upgrade 
-    to at least .61 before making the leap to WordPress.</li>
-  <li>The templates are so much better, and there is so much more going on than 
-    before it&#8217;s probably worth it to start from scratch and work back to your 
-    design.</li>
-  <li>You need to transfer some of your settings from your old <code>b2config.php</code>
-    to <code>wp-config.php</code> file.</li>
-  <li>WordPress issues should be discussed in our <a href="http://wordpress.org/support/">support 
-    forums</a>.</li>
-  <li><strong>Back up</strong> your database before you do anything. Yes, you.</li>
-</ul>
-<p>Have you looked at the <a href="../readme.html">readme</a>? If 
-  you&#8217;re all ready, <a href="import-b2.php?step=1">let&#8217;s go</a>!</p>
-<?php
-	break;
-	
-	case 1:
-?>
-<h1>Step 1</h1>
-<p>Okay first we&#8217;re going to set up the links database. This will allow you to host your own blogroll, complete with Weblogs.com updates.</p>
-<?php
-
-$got_links = false;
-$got_cats = false;
-$got_row = false;
-?>
-<p>Installing WP-Links.</p>
-<p>Checking for tables...</p>
-<?php
-$result = mysql_list_tables(DB_NAME);
-if (!$result) {
-    print "DB Error, could not list tables\n";
-    print 'MySQL Error: ' . mysql_error();
-    exit;
-}
-
-while ($row = mysql_fetch_row($result)) {
-    if ($row[0] == $wpdb->links)
-        $got_links = true;
-    if ($row[0] == $wpdb->linkcategories)
-        $got_cats = true;
-    //print "Table: $row[0]<br />\n";
-}
-if (!$got_cats) {
-    echo "<p>Can't find table '$wpdb->linkcategories', gonna create it...</p>\n";
-    $sql = "CREATE TABLE $wpdb->linkcategories ( " .
-           " cat_id int(11) NOT NULL auto_increment, " .
-           " cat_name tinytext NOT NULL, ".
-           " auto_toggle enum ('Y','N') NOT NULL default 'N', ".
-           " PRIMARY KEY (cat_id) ".
-           ") ";
-    $result = mysql_query($sql) or print ("Can't create the table '$wpdb->linkcategories' in the database.<br />" . $sql . "<br />" . mysql_error());
-    if ($result != false) {
-        echo "<p>Table '$wpdb->linkcategories' created OK</p>\n";
-        $got_cats = true;
-    }
-} else {
-    echo "<p>Found table '$wpdb->linkcategories', don't need to create it...</p>\n";
-        $got_cats = true;
-}
-if (!$got_links) {
-    echo "<p>Can't find '$wpdb->links', gonna create it...</p>\n";
-    $sql = "CREATE TABLE $wpdb->links ( " .
-           " link_id int(11) NOT NULL auto_increment,           " .
-           " link_url varchar(255) NOT NULL default '',         " .
-           " link_name varchar(255) NOT NULL default '',        " .
-           " link_image varchar(255) NOT NULL default '',       " .
-           " link_target varchar(25) NOT NULL default '',       " .
-           " link_category int(11) NOT NULL default 0,          " .
-           " link_description varchar(255) NOT NULL default '', " .
-           " link_visible enum ('Y','N') NOT NULL default 'Y',  " .
-           " link_owner int NOT NULL DEFAULT '1',               " .
-           " link_rating int NOT NULL DEFAULT '0',              " .
-           " link_updated DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', " .
-           " link_rel varchar(255) NOT NULL default '',         " .
-           " link_notes MEDIUMTEXT NOT NULL default '',         " .
-           " PRIMARY KEY (link_id)                              " .
-           ") ";
-    $result = mysql_query($sql) or print ("Can't create the table '$wpdb->links' in the database.<br />" . $sql . "<br />" . mysql_error());
-	$links = mysql_query("INSERT INTO $wpdb->links VALUES ('', 'http://wordpress.org/', 'WordPress', '', '', 1, '', 'Y', 1, 0, '0000-00-00 00:00:00', '');");
-	$links = mysql_query("INSERT INTO $wpdb->links VALUES ('', 'http://photomatt.net/', 'Matt', '', '', 1, '', 'Y', 1, 0, '0000-00-00 00:00:00', '');");
-	$links = mysql_query("INSERT INTO $wpdb->links VALUES ('', 'http://zed1.com/b2/', 'Mike', '', '', 1, '', 'Y', 1, 0, '0000-00-00 00:00:00', '');");
-
-    if ($result != false) {
-        echo "<p>Table '$wpdb->links' created OK</p>\n";
-        $got_links = true;
-    }
-} else {
-    echo "<p>Found table '$wpdb->links', don't need to create it...</p>\n";
-    echo "<p>... may need to update it though. Looking for column link_updated...</p>\n";
-    $query = "SELECT link_updated FROM $wpdb->links LIMIT 1";
-    $q = @mysql_query($query);
-    if ($q != false) {
-        if ($row = mysql_fetch_object($q)) {
-            echo "<p>You have  column link_updated. Good!</p>\n";
-        }
-    } else {
-        $query = "ALTER TABLE $wpdb->links ADD COLUMN link_updated DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'";
-        $q = mysql_query($query) or mysql_doh("Doh, couldn't add column.", $query, mysql_error());
-        echo "<p>Added column link_updated...</p>\n";
-    }
-    echo "<p>Looking for column link_rel...</p>\n";
-    $query = "SELECT link_rel FROM $wpdb->links LIMIT 1";
-    $q = @mysql_query($query);
-    if ($q != false) {
-        if ($row = mysql_fetch_object($q)) {
-            echo "<p>You have column link_rel. Good!</p>\n";
-        }
-    } else {
-        $query = "ALTER TABLE $wpdb->links ADD COLUMN link_rel varchar(255) NOT NULL DEFAULT '' ";
-        $q = mysql_query($query) or mysql_doh("Doh, couldn't add column.", $query, mysql_error());
-        echo "<p>Added column link_rel...</p>\n";
-    }
-    $got_links = true;
-}
-
-if ($got_links && $got_cats) {
-    echo "<p>Looking for category 1...</p>\n";
-    $sql = "SELECT * FROM $wpdb->linkcategories WHERE cat_id=1 ";
-    $result = mysql_query($sql) or print ("Can't query '$wpdb->linkcategories'.<br />" . $sql . "<br />" . mysql_error());
-    if ($result != false) {
-        if ($row = mysql_fetch_object($result)) {
-            echo "<p>You have at least 1 category. Good!</p>\n";
-            $got_row = true;
-        } else {
-            echo "<p>Gonna insert category 1...</p>\n";
-            $sql = "INSERT INTO $wpdb->linkcategories (cat_id, cat_name) VALUES (1, 'General')";
-            $result = mysql_query($sql) or print ("Can't query insert category.<br />" . $sql . "<br />" . mysql_error());
-            if ($result != false) {
-                echo "<p>Inserted category Ok</p>\n";
-                $got_row = true;
-            }
-        }
-    }
-}
-
-if ($got_row) {
-    echo "<p>All done!</p>\n";
-}
-?>
-<p>Did you defeat the boss monster at the end? Good, then you&#8217;re ready for 
-  <a href="import-b2.php?step=2">Step 2</a>.</p>
-<?php
-	break;
-	case 2:
-?>
-<h1>Step 2</h1>
-<p>First we&#8217;re going to add excerpt, post, and password functionality...</p>
-
-<?php
-
-$query = "ALTER TABLE $wpdb->posts ADD COLUMN post_excerpt text NOT NULL;";
-$q = $wpdb->query($query);
-// 0.71 mods
-$query = "ALTER TABLE $wpdb->posts ADD post_status ENUM('publish','draft','private') NOT NULL,
-ADD comment_status ENUM('open','closed') NOT NULL,
-ADD ping_status ENUM('open','closed') NOT NULL,
-ADD post_password varchar(20) NOT NULL;";
-$q = $wpdb->query($query);
-?>
-
-<p>That went well! Now let's clean up the b2 database structure a bit...</p>
-
-<?php
-$query = "ALTER TABLE $wpdb->posts DROP INDEX ID";
-
-$q = $wpdb->query($query);
-
-?>
-
-<p>One down, two to go...</p>
-
-
-<p>So far so good.</p>
-<?php
-
-$query="ALTER TABLE $wpdb->posts DROP post_karma";
-$q = $wpdb->query($query);
-flush();
-?>
-
-<p>Almost there...</p>
-
-<?php
-
-$query = "ALTER TABLE $wpdb->users DROP INDEX ID";
-
-$q = $wpdb->query($query);
-upgrade_all();
-?>
-
-<p>Welcome to the family. <a href="../">Have fun</a>!</p>
-  <?php
-	break;
-}
-?>
-
-</body>
-</html>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/import-blogger.php 2.0.4/wp-admin/import-blogger.php
--- 1.5.2/wp-admin/import-blogger.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-admin/import-blogger.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,221 +0,0 @@
-<?php
-
-$wpvarstoreset = array('action');
-for ($i=0; $i<count($wpvarstoreset); $i += 1) {
-	$wpvar = $wpvarstoreset[$i];
-	if (!isset($$wpvar)) {
-		if (empty($_POST["$wpvar"])) {
-			if (empty($_GET["$wpvar"])) {
-				$$wpvar = '';
-			} else {
-				$$wpvar = $_GET["$wpvar"];
-			}
-		} else {
-			$$wpvar = $_POST["$wpvar"];
-		}
-	}
-}
-require_once('../wp-config.php');
-require('upgrade-functions.php');
-header( 'Content-Type: text/html; charset=utf-8' );
-switch ($action) {
-
-case "step1":
-?>
-<!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" xml:lang="en">
-	<title>Blogger to WordPress - Converting...</title>
-	<link rel="stylesheet" href="wp-admin.css" type="text/css">
-</head>
-<body>
-<div class="wrap">
-<h1>Blogger to <img src="../wp-images/wpminilogo.png" width="50" height="50" border="0" alt="WordPress" align="top" /></h1>
-<p>The importer is running...</p>
-<ul>
-	<li>Importing posts and users
-		<ul><?php
-
-	for($bgy=1999; $bgy<=(date('Y')); $bgy++) {
-		for($bgm=1; $bgm<13; $bgm++) {
-
-		$bgmm = zeroise($bgm,2);
-	
-		$archivefile = "../$bgy"."_"."$bgmm"."_01_wordpress.php";
-		
-		if (file_exists($archivefile)) {
-
-			$f = fopen($archivefile,"r");
-			$archive = fread($f, filesize($archivefile));
-			fclose($f);
-			echo "<li>$bgy/$bgmm ";
-
-			$posts = explode('<wordpresspost>', $archive);
-
-			for ($i = 1; $i < count($posts); $i = $i + 1) {
-
-			$postinfo = explode('|||', $posts[$i]);
-			$post_date = $postinfo[0];
-			$post_content = $postinfo[2];
-			// Don't try to re-use the original numbers
-			// because the new, longer numbers are too
-			// big to handle as ints.
-			//$post_number = $postinfo[3];
-			$post_title = $postinfo[4];
-
-			$post_author = trim(addslashes($postinfo[1]));
-			// we'll check the author is registered already
-			$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_login = '$post_author'");
-			if (!$user) { // seems s/he's not, so let's register
-				$user_ip = '127.0.0.1';
-				$user_domain = 'localhost';
-				$user_browser = 'server';
-				$user_joindate = '1979-06-06 00:41:00'; // that's my birthdate (gmt+1) - I could choose any other date. You could change the date too. Just remember the year must be >=1970 or the world would just randomly fall on your head (everything might look fine, and then blam! major headache!)
-				$user_login = addslashes($post_author);
-				$pass1 = addslashes('password');
-				$user_nickname = addslashes($post_author);
-				$user_email = addslashes('user@wordpress.org');
-				$user_url = addslashes('');
-				$user_joindate = addslashes($user_joindate);
-				$result = $wpdb->query("
-				INSERT INTO $wpdb->users (
-					user_login,
-					user_pass,
-					user_nickname,
-					user_email,
-					user_url,
-					user_ip,
-					user_domain,
-					user_browser,
-					user_registered,
-					user_level,
-					user_idmode
-				) VALUES (
-					'$user_login',
-					'$pass1',
-					'$user_nickname',
-					'$user_email',
-					'$user_url',
-					'$user_ip',
-					'$user_domain',
-					'$user_browser',
-					'$user_joindate',
-					'1',
-					'nickname'
-				)");
-
-				echo ": Registered user <strong>$user_login</strong>";
-			}
-
-			$post_author_ID = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '$post_author'");
-
-			$post_date = explode(' ', $post_date);
-			$post_date_Ymd = explode('/', $post_date[0]);
-			$postyear = $post_date_Ymd[2];
-			$postmonth = zeroise($post_date_Ymd[0], 2);
-			$postday = zeroise($post_date_Ymd[1], 2);
-			$post_date_His = explode(':', $post_date[1]);
-			$posthour = zeroise($post_date_His[0], 2);
-			$postminute = zeroise($post_date_His[1], 2);
-			$postsecond = zeroise($post_date_His[2], 2);
-
-			if (($post_date[2] == 'PM') && ($posthour != '12'))
-				$posthour = $posthour + 12;
-			else if (($post_date[2] == 'AM') && ($posthour == '12'))
-				$posthour = '00';
-
-			$post_date = "$postyear-$postmonth-$postday $posthour:$postminute:$postsecond";
-
-			$post_content = addslashes($post_content);
-			$post_content = str_replace('<br>', '<br />', $post_content); // the XHTML touch... ;)
-			
-			$post_title = addslashes($post_title);
-			
-			// Quick-n-dirty check for dups:
-			$dupcheck = $wpdb->get_results("SELECT ID,post_date,post_title FROM $wpdb->posts WHERE post_date='$post_date' AND post_title='$post_title' LIMIT 1",ARRAY_A);
-			if ($dupcheck[0]['ID']) {
-				print "<br />\nSkipping duplicate post, ID = '" . $dupcheck[0]['ID'] . "'<br />\n";
-				print "Timestamp: " . $post_date . "<br />\n";
-				print "Post Title: '" . stripslashes($post_title) . "'<br />\n";
-				continue;
-			}
-
-			$result = $wpdb->query("
-			INSERT INTO $wpdb->posts 
-				(post_author,post_date,post_content,post_title,post_category)
-			VALUES 
-				('$post_author_ID','$post_date','$post_content','$post_title','1')
-			");
-
-
-			} echo '... <strong>Done</strong></li>';
-			
-		}}
-	}
-
-	upgrade_all();
-	?>
-</ul>
-<strong>Done</strong>
-</li>
-</ul>
-<p>&nbsp;</p>
-<p>Completed Blogger to WordPress import!</p>
-<p>Now you can go and <a href="../wp-login.php">log in</a>, have fun!</p>
-</div>
-</body>
-</html>
-	<?php
-	break;
-
-default:
-
-	?>
-<!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" xml:lang="en">
-	<title>Blogger to WordPress Import Utility</title>
-	<link rel="stylesheet" href="wp-admin.css" type="text/css">
-</head>
-
-<body>
-<div class="wrap">
-<h1>Blogger to <img src="../wp-images/wpminilogo.png" width="50" height="50" border="0" alt="WordPress" align="top" /></h1>
-<p>This is a basic Blogger to WordPress import script.</p>
-<p>What it does:</p>
-<ul>
-	<li>Parses your archives to retrieve your blogger posts.</li>
-	<li>Adds an author whenever it sees a new nickname, all authors are imported at level 1, with a default profile and the password 'password'</li>
-</ul>
-<p>What it does not:</p>
-<ul>
-	<li>It sucks at making coffee.</li>
-	<li>It always forgets to call back.</li>
-</ul>
-
-<h2>First step: Install WordPress</h2>
-<p>Install the WordPress blog as explained in the <a href="../readme.html">read me</a>, then immediately come back here.</p>
-
-<h3>Second step: let's play with Blogger</h3>
-<p>Log into your Blogger account.<br />
-Go to the Settings, and make Blogger publish your files in the directory where your WordPress resides. Change the Date/Time format to be mm/dd/yyyy hh:mm:ss AM/PM (the first choice in the dropdown menu). In Archives: set the frequency to 'monthly' and the archive filename to 'wordpress.php' (without the quotes), set the ftp archive path to make Blogger publish the archives in your WordPress directory. Click 'save changes'.<br />
-Go to the Templates. Replace your existing template with this line (copy and paste):
-<blockquote>&lt;Blogger>&lt;wordpresspost>&lt;$BlogItemDateTime$>|||&lt;$BlogItemAuthorNickname$>|||&lt;$BlogItemBody$>|||&lt;$BlogItemNumber$>|||&lt;$BlogItemSubject$>&lt;/Blogger></blockquote>
-Go to the Archives, and click 'republish all'.<br />
-Check in your FTP that you've got the archive files published. They should look like this example: <code>2001_10_01_wordpress.php</code>. If they aren't there, redo the republish process.</p>
-<p>You're done with the hard part. :)</p>
-
-<form name="stepOne" method="get">
-<input type="hidden" name="action" value="step1" />
-<h3>Third step: w00t, let's click OK:</h3>
-<p>When you're ready, click OK to start importing: <input type="submit" name="submit" value="OK" /><br /><br />
-<i>Note: the script might take some time, like 1 second for 100 entries
-imported. DO NOT STOP IT or else you won't have a complete import.</i></p>
-</form>
-</div>
-</body>
-</html>
-	<?php
-	break;
-
-}
-
-?>
diff -ruN 1.5.2/wp-admin/import-greymatter.php 2.0.4/wp-admin/import-greymatter.php
--- 1.5.2/wp-admin/import-greymatter.php	2005-04-20 18:02:30.000000000 -0500
+++ 2.0.4/wp-admin/import-greymatter.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,322 +0,0 @@
-<?php
-if (!file_exists('../wp-config.php')) die("There doesn't seem to be a wp-config.php file. You must install WordPress before you import any entries.");
-
-require_once('../wp-config.php');
-require('upgrade-functions.php');
-
-$wpvarstoreset = array('action', 'gmpath', 'archivespath', 'lastentry');
-for ($i=0; $i<count($wpvarstoreset); $i += 1) {
-	$wpvar = $wpvarstoreset[$i];
-	if (!isset($$wpvar)) {
-		if (empty($_POST["$wpvar"])) {
-			if (empty($_GET["$wpvar"])) {
-				$$wpvar = '';
-			} else {
-				$$wpvar = $_GET["$wpvar"];
-			}
-		} else {
-			$$wpvar = $_POST["$wpvar"];
-		}
-	}
-}
-
-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">
-<title>WordPress &rsaquo; Import from GreyMatter</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<style media="screen" type="text/css">
-	body {
-		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 20%;
-		margin-right: 20%;
-	}
-	#logo {
-		margin: 0;
-		padding: 0;
-		background-image: url(http://wordpress.org/images/logo.png);
-		background-repeat: no-repeat;
-		height: 60px;
-		border-bottom: 4px solid #333;
-	}
-	#logo a {
-		display: block;
-		text-decoration: none;
-		text-indent: -100em;
-		height: 60px;
-	}
-	p {
-		line-height: 140%;
-	}
-	#authors li 	{
-		padding:3px;
-		border: 1px solid #ccc;
-		width: 40%;
-		margin-bottom:2px;
-	}
-	</style>
-</head><body> 
-<h1 id="logo"><a href="http://wordpress.org">WordPress</a></h1> 
-
-<?php
-switch ($action) {
-
-case "step1":
-
-	function gm2autobr($string) { // transforms GM's |*| into wp's <br />\n
-		$string = str_replace("|*|","<br />\n",$string);
-		return($string);
-	}
-
-	if (!@chdir($archivespath))
-		die("Wrong path, $archivespath\ndoesn't exist\non the server");
-
-	if (!@chdir($gmpath))
-		die("Wrong path, $gmpath\ndoesn't exist\non the server");
-?>
-
-<p>The importer is running...</p>
-<ul>
-<li>importing users... <ul><?php
-
-	chdir($gmpath);
-	$userbase = file("gm-authors.cgi");
-
-	foreach($userbase as $user) {
-		$userdata=explode("|", $user);
-
-		$user_ip="127.0.0.1";
-		$user_domain="localhost";
-		$user_browser="server";
-
-		$s=$userdata[4];
-		$user_joindate=substr($s,6,4)."-".substr($s,0,2)."-".substr($s,3,2)." 00:00:00";
-
-		$user_login=addslashes($userdata[0]);
-		$pass1=addslashes($userdata[1]);
-		$user_nickname=addslashes($userdata[0]);
-		$user_email=addslashes($userdata[2]);
-		$user_url=addslashes($userdata[3]);
-		$user_joindate=addslashes($user_joindate);
-
-		$loginthere = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '$user_login'");
-		if ($loginthere) {
-			echo "<li>user <i>$user_login</i>... <b>Already exists</b></li>";
-			continue;
-		}
-
-		$query = "INSERT INTO $wpdb->users (user_login,user_pass,user_nickname,user_email,user_url,user_ip,user_domain,user_browser,user_registered,user_level,user_idmode) VALUES ('$user_login','$pass1','$user_nickname','$user_email','$user_url','$user_ip','$user_domain','$user_browser','$user_joindate','1','nickname')";
-		$result = $wpdb->query($query);
-		if ($result==false) {
-			die ("<strong>ERROR</strong>: couldn't register an user!");
-		}
-		echo "<li>user <i>$user_login</i>... <b>Done</b></li>";
-
-	}
-
-?></ul><b>Done</b></li>
-<li>importing posts, comments, and karma...<br /><ul><?php
-
-	chdir($archivespath);
-	
-	for($i = 0; $i <= $lastentry; $i = $i + 1) {
-		
-		$entryfile = "";
-		
-		if ($i<10000000) {
-			$entryfile .= "0";
-			if ($i<1000000) {
-				$entryfile .= "0";
-				if ($i<100000) {
-					$entryfile .= "0";
-					if ($i<10000) {
-						$entryfile .= "0";
-						if ($i<1000) {
-							$entryfile .= "0";
-							if ($i<100) {
-								$entryfile .= "0";
-								if ($i<10) {
-									$entryfile .= "0";
-		}}}}}}}
-
-		$entryfile .= "$i";
-
-		if (is_file($entryfile.".cgi")) {
-
-			$entry=file($entryfile.".cgi");
-			echo "<li>entry # $entryfile ";
-			$postinfo=explode("|",$entry[0]);
-			$postmaincontent=gm2autobr($entry[2]);
-			$postmorecontent=gm2autobr($entry[3]);
-
-			$post_author=trim(addslashes($postinfo[1]));
-			// we'll check the author is registered, or if it's a deleted author
-			$sql = "SELECT * FROM $wpdb->users WHERE user_login = '$post_author'";
-			$result = $wpdb->query($sql);
-			if (! $result) { // if deleted from GM, we register the author as a level 0 user in wp
-				$user_ip="127.0.0.1";
-				$user_domain="localhost";
-				$user_browser="server";
-				$user_joindate="1979-06-06 00:41:00";
-				$user_login=addslashes($post_author);
-				$pass1=addslashes("password");
-				$user_nickname=addslashes($post_author);
-				$user_email=addslashes("user@deleted.com");
-				$user_url=addslashes("");
-				$user_joindate=addslashes($user_joindate);
-				$query = "INSERT INTO $wpdb->users (user_login,user_pass,user_nickname,user_email,user_url,user_ip,user_domain,user_browser,user_registered,user_level,user_idmode) VALUES ('$user_login','$pass1','$user_nickname','$user_email','$user_url','$user_ip','$user_domain','$user_browser','$user_joindate','0','nickname')";
-				$result = $wpdb->query($query);
-				if ($result==false) {
-					die ("<strong>ERROR</strong>: couldn't register an user!");
-				}
-				echo ": registered deleted user <i>$user_login</i> at level 0 ";
-			}
-
-			$sql = "SELECT ID FROM $wpdb->users WHERE user_login = '$post_author'";
-			$post_author_ID = $wpdb->get_var($sql);
-
-			$post_title=gm2autobr($postinfo[2]);
-			$post_title=addslashes($post_title);
-
-			$postyear=$postinfo[6];
-			$postmonth=zeroise($postinfo[4],2);
-			$postday=zeroise($postinfo[5],2);
-			$posthour=zeroise($postinfo[7],2);
-			$postminute=zeroise($postinfo[8],2);
-			$postsecond=zeroise($postinfo[9],2);
-
-			if (($postinfo[10]=="PM") && ($posthour!="12"))
-				$posthour=$posthour+12;
-
-			$post_date="$postyear-$postmonth-$postday $posthour:$postminute:$postsecond";
-
-			$post_content=$postmaincontent;
-			if (strlen($postmorecontent)>3)
-				$post_content .= "<!--more--><br /><br />".$postmorecontent;
-			$post_content=addslashes($post_content);
-
-			$post_karma=$postinfo[12];
-
-			$query = "INSERT INTO $wpdb->posts (post_author,post_date,post_content,post_title) VALUES ('$post_author_ID','$post_date','$post_content','$post_title')";
-			$result = $wpdb->query($query);
-
-			if (!$result)
-				die ("Error in posting...");
-			
-			$query = "SELECT ID FROM $wpdb->posts ORDER BY ID DESC LIMIT 1";
-			$post_ID = $wpdb->get_var($query);
-
-			// Grab a default category.
-			$post_category = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories LIMIT 1");
-
-			// Update the post2cat table.
-			$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_ID AND category_id = $post_category");
-			  
-			if (!$exists) {
-			  $wpdb->query("
-					INSERT INTO $wpdb->post2cat
-					(post_id, category_id)
-					VALUES
-					($post_ID, $post_category)
-					");
-			}
-
-			$c=count($entry);
-			if ($c>4) {
-				for ($j=4;$j<$c;$j++) {
-					$entry[$j]=gm2autobr($entry[$j]);
-					$commentinfo=explode("|",$entry[$j]);
-					$comment_post_ID=$post_ID;
-					$comment_author=addslashes($commentinfo[0]);
-					$comment_author_email=addslashes($commentinfo[2]);
-					$comment_author_url=addslashes($commentinfo[3]);
-					$comment_author_IP=addslashes($commentinfo[1]);
-
-					$commentyear=$commentinfo[7];
-					$commentmonth=zeroise($commentinfo[5],2);
-					$commentday=zeroise($commentinfo[6],2);
-					$commenthour=zeroise($commentinfo[8],2);
-					$commentminute=zeroise($commentinfo[9],2);
-					$commentsecond=zeroise($commentinfo[10],2);
-					if (($commentinfo[11]=="PM") && ($commenthour!="12"))
-						$commenthour=$commenthour+12;
-					$comment_date="$commentyear-$commentmonth-$commentday $commenthour:$commentminute:$commentsecond";
-
-					$comment_content=addslashes($commentinfo[12]);
-
-					$sql3 = "INSERT INTO $wpdb->comments (comment_post_ID,comment_author,comment_author_email,comment_author_url,comment_author_IP,comment_date,comment_content) VALUES ('$comment_post_ID','$comment_author','$comment_author_email','$comment_author_url','$comment_author_IP','$comment_date','$comment_content')";
-					$result3 = $wpdb->query($sql3);
-					if (!$result3)
-						die ("There is an error with the database, it can't store your comment..");
-				}
-				$comments=$c-4;
-				echo ": imported $comments comment";
-				if ($comments>1)
-					echo "s";
-			}
-			echo "... <b>Done</b></li>";
-		}
-	} 
-	upgrade_all();
-	?>
-</ul><b>Done</b></li></ul>
-<p>&nbsp;</p>
-<p>Completed GM 2 WordPress import !</p>
-<p>Now you can go and <a href="wp-login.php">log in</a>, have fun !</p>
-	<?php
-	break;
-
-default:
-?>
-
-<p>This is a basic GreyMatter to WordPress import script.</p>
-<p>What it does:</p>
-<ul>
-<li>parses gm-authors.cgi to import authors: everyone is imported at level 1</li>
-<li>parses the entries cgi files to import posts, comments, and karma on posts (although karma is not used on WordPress); if authors are found not to be in gm-authors.cgi, imports them at level 0</li>
-</ul>
-<p>What it does not:</p>
-<ul>
-<li>parse gm-counter.cgi (what's the use of that file ?), gm-banlist.cgi, gm-cplog.cgi (you can make a CP log hack if you really feel like it, but I question the need of a CP log)</li>
-<li>import gm-templates. you'll start with the basic template wp.php</li>
-<li>doesn't keep entries on top</li>
-</ul>
-
-<h3>First step: Install WordPress</h3>
-<p>Install the WordPress blog as explained in the <a href="../readme.html" target="_blank">ReadMe</a>, then immediately come back here.</p>
-
-<form name="stepOne" method="get">
-<input type="hidden" name="action" value="step1" />
-<h3>Second step: Provide GreyMatter details</h3>
-<table cellpadding="0">
-<tr>
-<td>Path to GM files:</td>
-<td><input type="text" style="width:300px" name="gmpath" value="/home/my/site/cgi-bin/greymatter/" /></td>
-</tr>
-<tr>
-<td>Path to GM entries:</td>
-<td><input type="text" style="width:300px" name="archivespath" value="/home/my/site/cgi-bin/greymatter/archives/" /></td>
-</tr>
-</table>
-
-<p>This importer will search for files 00000001.cgi to 000-whatever.cgi, so you need to enter the number of the last GM post here. (If you don't know that number, just log into your FTP and look it up in the entries' folder)</p>
-
-<table>
-<tr>
-<td>Last entry's number:</td>
-<td><input type="text" name="lastentry" value="00000001" /></td>
-</tr>
-</table>
-
-<p>When you're ready, click OK to start importing: <input type="submit" name="submit" value="OK" class="search" /></p>
-</form>
-
-</body>
-</html>
-	<?php
-	break;
-}
-
-?>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/import-livejournal.php 2.0.4/wp-admin/import-livejournal.php
--- 1.5.2/wp-admin/import-livejournal.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-admin/import-livejournal.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,124 +0,0 @@
-<?php
-define('XMLFILE', '');
-// Example:
-// define('XMLFILE', '/home/example/public_html/rss.xml');
-// or if it's in the same directory as import-rss.php
-// define('XMLFILE', 'rss.xml');
-
-$post_author = 1; // Author to import posts as author ID
-$timezone_offset = 0; // GMT offset of posts your importing
-
-
-$add_hours = intval($timezone_offset);
-$add_minutes = intval(60 * ($timezone_offset - $add_hours));
-
-if (!file_exists('../wp-config.php')) die("There doesn't seem to be a wp-config.php file. You must install WordPress before you import any entries.");
-require('../wp-config.php');
-
-$step = $_GET['step'];
-if (!$step) $step = 0;
-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">
-<title>WordPress &rsaquo; Import from RSS</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<style media="screen" type="text/css">
-	body {
-		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 20%;
-		margin-right: 20%;
-	}
-	#logo {
-		margin: 0;
-		padding: 0;
-		background-image: url(http://wordpress.org/images/logo.png);
-		background-repeat: no-repeat;
-		height: 60px;
-		border-bottom: 4px solid #333;
-	}
-	#logo a {
-		display: block;
-		text-decoration: none;
-		text-indent: -100em;
-		height: 60px;
-	}
-	p {
-		line-height: 140%;
-	}
-	</style>
-</head><body> 
-<h1 id="logo"><a href="http://wordpress.org/">WordPress</a></h1> 
-<?php
-switch($step) {
-
-	case 0:
-?> 
-<p>Howdy! This importer allows you to extract posts from a LiveJournal XML export file. To get started you must edit the following line in this file (<code>import-livejournal.php</code>) </p>
-<p><code>define('XMLFILE', '');</code></p>
-<p>You want to define where the XML file we'll be working with is, for example: </p>
-<p><code>define('XMLFILE', '2002-04.xml');</code></p>
-<p>You have to do this manually for security reasons.</p>
-<p>If you've done that and you&#8217;re all ready, <a href="import-livejournal.php?step=1">let's go</a>!</p>
-<?php
-	break;
-	
-	case 1:
-if ('' != XMLFILE && !file_exists(XMLFILE)) die("The file you specified does not seem to exist. Please check the path you've given.");
-if ('' == XMLFILE) die("You must edit the XMLFILE line as described on the <a href='import-rss.php'>previous page</a> to continue.");
-
-// Bring in the data
-set_magic_quotes_runtime(0);
-$datalines = file(XMLFILE); // Read the file into an array
-$importdata = implode('', $datalines); // squish it
-$importdata = str_replace(array("\r\n", "\r"), "\n", $importdata);
-
-preg_match_all('|<entry>(.*?)</entry>|is', $importdata, $posts);
-$posts = $posts[1];
-
-echo '<ol>';
-foreach ($posts as $post) :
-$title = $date = $categories = $content = $post_id =  '';
-echo "<li>Importing post... ";
-
-preg_match('|<subject>(.*?)</subject>|is', $post, $title);
-$title = addslashes( trim($title[1]) );
-$post_name = sanitize_title($title);
-
-preg_match('|<eventtime>(.*?)</eventtime>|is', $post, $date);
-$date = strtotime($date[1]);
-
-$post_date = date('Y-m-d H:i:s', $date);
-
-
-preg_match('|<event>(.*?)</event>|is', $post, $content);
-$content = str_replace( array('<![CDATA[', ']]>'), '', addslashes( trim($content[1]) ) );
-
-// Now lets put it in the DB
-if ($wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' AND post_date = '$post_date'")) :
-	echo 'Post already imported';
-else : 
-	
-	$wpdb->query("INSERT INTO $wpdb->posts 
-		(post_author, post_date, post_date_gmt, post_content, post_title,post_status, comment_status, ping_status, post_name)
-		VALUES 
-		('$post_author', '$post_date', DATE_ADD('$post_date', INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE), '$content', '$title', 'publish', '$comment_status', '$ping_status', '$post_name')");
-	$post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' AND post_date = '$post_date'");
-	if (!$post_id) die("couldn't get post ID");
-	$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_id AND category_id = 1");
-	if (!$exists) $wpdb->query("INSERT INTO $wpdb->post2cat (post_id, category_id) VALUES ($post_id, 1) ");
-	echo 'Done!</li>';
-endif;
-
-
-endforeach;
-?>
-</ol>
-
-<h3>All done. <a href="../">Have fun!</a></h3>
-<?php
-	break;
-}
-?> 
-</body>
-</html>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/import-mt.php 2.0.4/wp-admin/import-mt.php
--- 1.5.2/wp-admin/import-mt.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-admin/import-mt.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,418 +0,0 @@
-<?php
-define('MTEXPORT', '');
-// enter the relative path of the import.txt file containing the mt entries. If the file is called import.txt and it is /wp-admin, then this line
-//should be define('MTEXPORT', 'import.txt');
-
-if (!file_exists('../wp-config.php')) die("There doesn't seem to be a wp-config.php file. You must install WordPress before you import any entries.");
-require('../wp-config.php');
-require ('upgrade-functions.php');
-$step = $_GET['step'];
-if (!$step) $step = 0;
-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">
-<title>WordPress &rsaquo; Import from Movable Type</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<style media="screen" type="text/css">
-	body {
-		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 20%;
-		margin-right: 20%;
-	}
-	#logo {
-		margin: 0;
-		padding: 0;
-		background-image: url(http://wordpress.org/images/logo.png);
-		background-repeat: no-repeat;
-		height: 60px;
-		border-bottom: 4px solid #333;
-	}
-	#logo a {
-		display: block;
-		text-decoration: none;
-		text-indent: -100em;
-		height: 60px;
-	}
-	p {
-		line-height: 140%;
-	}
-	#authors li 	{
-		padding:3px;
-		border: 1px solid #ccc;
-		width: 40%;
-		margin-bottom:2px;
-	}
-	</style>
-</head><body> 
-<h1 id="logo"><a href="http://wordpress.org">WordPress</a></h1> 
-<?php
-switch($step) {
-
-	case 0:
-?> 
-<p>Howdy! We&#8217;re about to begin the process to import all of your Movable Type entries into WordPress. Before we get started, you need to edit this file (<code>import-mt.php</code>) and change one line so we know where to find your MT export file. To make this easy put the import file into the <code>wp-admin</code> directory. Look for the line that says:</p>
-<p><code>define('MTEXPORT', '');</code></p>
-<p>and change it to</p>
-<p><code>define('MTEXPORT', 'import.txt');</code></p>
-<p>You have to do this manually for security reasons.</p>
-<p>If you've done that and you&#8217;re all ready, <a href="import-mt.php?step=1">let's go</a>! Remember that the import process may take a minute or so if you have a large number of entries and comments. Think of all the rebuilding time you'll be saving once it's done. :)</p>
-<p>The importer is smart enough not to import duplicates, so you can run this multiple times without worry if&#8212;for whatever reason&#8212;it doesn't finish. If you get an <strong>out of memory</strong> error try splitting up the import file into pieces. </p>
-<?php
-	break;
-	
-	case 1:
-if ('' != MTEXPORT && !file_exists(MTEXPORT)) die("The file you specified does not seem to exist. Please check the path you've given.");
-if ('' == MTEXPORT) die("You must edit the MTEXPORT line as described on the <a href='import-mt.php'>previous page</a> to continue.");
-// Bring in the data
-set_magic_quotes_runtime(0);
-$importdata = file(MTEXPORT); // Read the file into an array
-$importdata = implode('', $importdata); // squish it
-$importdata = preg_replace("/(\r\n|\n|\r)/", "\n", $importdata);
-$importdata = preg_replace("/\n--------\n/", "--MT-ENTRY--\n", $importdata);
-$authors = array();
-$temp = array();
-$posts = explode("--MT-ENTRY--", $importdata);
-unset( $importdata ); // Free up memory
-
-function users_form($n) {
-	global $wpdb, $testing;
-	$users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY ID");
-	?><select name="userselect[<?php echo $n; ?>]">
-	<option value="#NONE#">- Select -</option>
-	<?php foreach($users as $user) {
-		echo '<option value="'.$user->user_login.'">'.$user->user_login.'</option>';
-		} ?>
-	</select>
-<?php }
-
-$i = -1;
-foreach ($posts as $post) { 
-	if ('' != trim($post)) {
-		++$i;
-		unset($post_categories);
-		preg_match("|AUTHOR:(.*)|", $post, $thematch);
-		$thematch = trim($thematch[1]);
-		array_push($temp,"$thematch"); //store the extracted author names in a temporary array
-		}
-	}//end of foreach
-//we need to find unique values of author names, while preserving the order, so this function emulates the unique_value(); php function, without the sorting.
-$authors[0] = array_shift($temp); 
-$y = count($temp) + 1;
-for ($x = 1; $x < $y; $x++) {
-	$next = array_shift($temp);
-	if (!(in_array($next,$authors))) array_push($authors, "$next");
-	}
-//by this point, we have all unique authors in the array $authors
-?><p><?php _e('To make it easier for you to edit and save the imported posts and drafts, you may want to change the name of the author of the posts. For example, you may want to import all the entries as <code>admin</code>s entries.'); ?></p>
-<p><?php _e('Below, you can see the names of the authors of the MovableType posts in <i>italics</i>. For each of these names, you can either pick an author in your WordPress installation from the menu, or enter a name for the author in the textbox.'); ?></p>
-<p><?php _e('If a new user is created by WordPress, the password will be set, by default, to "changeme". Quite suggestive, eh? ;)'); ?></p>
-	<?php
-	echo '<ol id="authors">';
-	echo '<form action="?step=2" method="post">';
-	$j = -1;
-	foreach ($authors as $author) {
-	++$j;
-	echo '<li><i>'.$author.'</i><br />'.'<input type="text" value="'.$author.'" name="'.'user[]'.'" maxlength="30">';
-	users_form($j);
-	echo '</li>';
-	}
-	echo '<input type="submit" value="Submit">'.'<br/>';
-	echo '</form>';
-	echo '</ol>';
-	
-	flush();
-
-	break;
-	
-	case 2:
-	$newauthornames = array();
-	$formnames = array();
-	$selectnames = array();
-	$mtnames = array();
-	foreach($_POST['user'] as $key => $line) { 
-	$newname = trim(stripslashes($line)); 
-	if ($newname == '') $newname = 'left_blank';//passing author names from step 1 to step 2 is accomplished by using POST. left_blank denotes an empty entry in the form.
-	array_push($formnames,"$newname");
-	}// $formnames is the array with the form entered names
-	foreach ($_POST['userselect'] as $user => $key) {
-	$selected = trim(stripslashes($key));
-	array_push($selectnames,"$selected");
-	}
-	$count = count($formnames);
-	for ($i = 0; $i < $count; $i++) {
-	if ( $selectnames[$i] != '#NONE#') {//if no name was selected from the select menu, use the name entered in the form
-	array_push($newauthornames,"$selectnames[$i]");
-	} 
-	else {
-	array_push($newauthornames,"$formnames[$i]");
-	}
-	}
-
-	$j = -1;
-	//function to check the authorname and do the mapping
-	function checkauthor($author) {
-	global $wpdb, $mtnames, $newauthornames, $j;//mtnames is an array with the names in the mt import file
-	$md5pass = md5(changeme);
-	if (!(in_array($author, $mtnames))) { //a new mt author name is found
-		++$j;
-		$mtnames[$j] = $author; //add that new mt author name to an array 
-		$user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '$newauthornames[$j]'"); //check if the new author name defined by the user is a pre-existing wp user
-		if (!$user_id) { //banging my head against the desk now. 
-			if ($newauthornames[$j] == 'left_blank') { //check if the user does not want to change the authorname
-				$wpdb->query("INSERT INTO $wpdb->users (user_level, user_login, user_pass, user_nickname) VALUES ('1', '$author', '$md5pass', '$author')"); // if user does not want to change, insert the authorname $author
-				$user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '$author'");
-				$newauthornames[$j] = $author; //now we have a name, in the place of left_blank.
-			} else {
-			$wpdb->query("INSERT INTO $wpdb->users (user_level, user_login, user_pass, user_nickname) VALUES ('1', '$newauthornames[$j]', '$md5pass', '$newauthornames[$j]')"); //if not left_blank, insert the user specified name
-			$user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '$newauthornames[$j]'");
-			}
-		} else return $user_id; // return pre-existing wp username if it exists
-    } else {
-    $key = array_search($author, $mtnames); //find the array key for $author in the $mtnames array
-    $user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_login = '$newauthornames[$key]'");//use that key to get the value of the author's name from $newauthornames
-	}
-	return $user_id;
-}//function checkauthor ends here
-
-	//bring in the posts now
-set_magic_quotes_runtime(0);
-$importdata = file(MTEXPORT); // Read the file into an array
-$importdata = implode('', $importdata); // squish it
-$importdata = preg_replace("/(\r\n|\n|\r)/", "\n", $importdata);
-$importdata = preg_replace("/\n--------\n/", "--MT-ENTRY--", $importdata);
-$authors = array();
-$temp = array();
-$posts = explode("--MT-ENTRY--", $importdata);
-unset( $importdata ); // Free up memory
-
-$i = -1;
-echo "<ol>";
-foreach ($posts as $post) { if ('' != trim($post)) {
-	++$i;
-	unset($post_categories);
-	echo "<li>Processing post... ";
-
-	// Take the pings out first
-	preg_match("|(-----\n\nPING:.*)|s", $post, $pings);
-	$post = preg_replace("|(-----\n\nPING:.*)|s", '', $post);
-
-	// Then take the comments out
-	preg_match("|(-----\nCOMMENT:.*)|s", $post, $comments);
-	$post = preg_replace("|(-----\nCOMMENT:.*)|s", '', $post);
-	
-	// We ignore the keywords
-	$post = preg_replace("|(-----\nKEYWORDS:.*)|s", '', $post);
-	
-	// We want the excerpt
-	preg_match("|-----\nEXCERPT:(.*)|s", $post, $excerpt);
-	$excerpt = addslashes(trim($excerpt[1]));
-	$post = preg_replace("|(-----\nEXCERPT:.*)|s", '', $post);
-	
-	// We're going to put extended body into main body with a more tag
-	preg_match("|-----\nEXTENDED BODY:(.*)|s", $post, $extended);
-	$extended = trim($extended[1]);
-	if ('' != $extended) $extended = "\n<!--more-->\n$extended";
-	$post = preg_replace("|(-----\nEXTENDED BODY:.*)|s", '', $post);
-	
-	// Now for the main body
-	preg_match("|-----\nBODY:(.*)|s", $post, $body);
-	$body = trim($body[1]);
-	$post_content = addslashes($body . $extended);
-	$post = preg_replace("|(-----\nBODY:.*)|s", '', $post);
-	
-	// Grab the metadata from what's left
-	$metadata = explode("\n", $post);
-	foreach ($metadata as $line) {
-		preg_match("/^(.*?):(.*)/", $line, $token);
-		$key = trim($token[1]);
-		$value = trim($token[2]);
-		// Now we decide what it is and what to do with it
-        switch($key) {
-			case '':
-				break;
-            case 'AUTHOR':
-                $post_author = $value;
-                break;
-            case 'TITLE':
-                $post_title = addslashes($value);
-				echo '<i>'.stripslashes($post_title).'</i>... ';
-				$post_name = sanitize_title($post_title);
-                break;
-            case 'STATUS':
-                // "publish" and "draft" enumeration items match up; no change required
-                $post_status = $value;
-				if (empty($post_status)) $post_status = 'publish';
-                break;
-            case 'ALLOW COMMENTS':
-                $post_allow_comments = $value;
-                if ($post_allow_comments == 1) {
-                    $comment_status = 'open';
-                } else {
-                    $comment_status = 'closed';
-                }
-                break;
-            case 'CONVERT BREAKS':
-                $post_convert_breaks = $value;
-                break;
-            case 'ALLOW PINGS':
-                $post_allow_pings = trim($meta[2][0]);
-                if ($post_allow_pings == 1) {
-                    $post_allow_pings = 'open';
-                } else {
-                    $post_allow_pings = 'closed';
-                }
-                break;
-            case 'PRIMARY CATEGORY':
-				$post_categories[] = addslashes($value);
-                break;
-            case 'CATEGORY':    
-				$post_categories[] = addslashes($value);
-                break;
-			case 'DATE':
-				$post_date = strtotime($value);
-				$post_date = date('Y-m-d H:i:s', $post_date);
-				$post_date_gmt = get_gmt_from_date("$post_date");
-				break;
-			default:
-//				echo "\n$key: $value";
-				break;
-        } // end switch
-	} // End foreach
-
-	// Let's check to see if it's in already
-	if ($wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$post_title' AND post_date = '$post_date'")) {
-		echo "Post already imported.";
-	} else {
-		$post_author = checkauthor($post_author);//just so that if a post already exists, new users are not created by checkauthor
-	    $wpdb->query("INSERT INTO $wpdb->posts (
-			post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt,  post_status, comment_status, ping_status, post_name, post_modified, post_modified_gmt)
-			VALUES 
-			('$post_author', '$post_date', '$post_date_gmt', '$post_content', '$post_title', '$excerpt', '$post_status', '$comment_status', '$ping_status', '$post_name','$post_date', '$post_date_gmt')");
-		$post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$post_title' AND post_date = '$post_date'");
-		if (0 != count($post_categories)) {
-			foreach ($post_categories as $post_category) {
-			// See if the category exists yet
-			$cat_id = $wpdb->get_var("SELECT cat_ID from $wpdb->categories WHERE cat_name = '$post_category'");
-			if (!$cat_id && '' != trim($post_category)) {
-				$cat_nicename = sanitize_title($post_category);
-				$wpdb->query("INSERT INTO $wpdb->categories (cat_name, category_nicename) VALUES ('$post_category', '$cat_nicename')");
-				$cat_id = $wpdb->get_var("SELECT cat_ID from $wpdb->categories WHERE cat_name = '$post_category'");
-			}
-			if ('' == trim($post_category)) $cat_id = 1;
-			// Double check it's not there already
-			$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_id AND category_id = $cat_id");
-
-			 if (!$exists) { 
-				$wpdb->query("
-				INSERT INTO $wpdb->post2cat
-				(post_id, category_id)
-				VALUES
-				($post_id, $cat_id)
-				");
-			}
-		} // end category loop
-		} else {
-			$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_id AND category_id = 1");
-			if (!$exists) $wpdb->query("INSERT INTO $wpdb->post2cat (post_id, category_id) VALUES ($post_id, 1) ");
-		}
-		echo " Post imported successfully...";
-		// Now for comments
-		$comments = explode("-----\nCOMMENT:", $comments[0]);
-		foreach ($comments as $comment) {
-		if ('' != trim($comment)) {
-			// Author
-			preg_match("|AUTHOR:(.*)|", $comment, $comment_author);
-			$comment_author = addslashes(trim($comment_author[1]));
-			$comment = preg_replace('|(\n?AUTHOR:.*)|', '', $comment);
-
-			preg_match("|EMAIL:(.*)|", $comment, $comment_email);
-			$comment_email = addslashes(trim($comment_email[1]));
-			$comment = preg_replace('|(\n?EMAIL:.*)|', '', $comment);
-
-			preg_match("|IP:(.*)|", $comment, $comment_ip);
-			$comment_ip = trim($comment_ip[1]);
-			$comment = preg_replace('|(\n?IP:.*)|', '', $comment);
-
-			preg_match("|URL:(.*)|", $comment, $comment_url);
-			$comment_url = addslashes(trim($comment_url[1]));
-			$comment = preg_replace('|(\n?URL:.*)|', '', $comment);
-
-			preg_match("|DATE:(.*)|", $comment, $comment_date);
-			$comment_date = trim($comment_date[1]);
-			$comment_date = date('Y-m-d H:i:s', strtotime($comment_date));
-			$comment = preg_replace('|(\n?DATE:.*)|', '', $comment);
-
-			$comment_content = addslashes(trim($comment));
-			$comment_content = str_replace('-----', '', $comment_content);
-
-			// Check if it's already there
-			if (!$wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_date = '$comment_date' AND comment_content = '$comment_content'")) {
-				$wpdb->query("INSERT INTO $wpdb->comments (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content, comment_approved)
-				VALUES
-				($post_id, '$comment_author', '$comment_email', '$comment_url', '$comment_ip', '$comment_date', '$comment_content', '1')");
-				echo " Comment added.";
-			}
-		}
-		}
-
-		// Finally the pings
-		// fix the double newline on the first one
-		$pings[0] = str_replace("-----\n\n", "-----\n", $pings[0]);
-		$pings = explode("-----\nPING:", $pings[0]);
-		foreach ($pings as $ping) {
-		if ('' != trim($ping)) {
-			// 'Author'
-			preg_match("|BLOG NAME:(.*)|", $ping, $comment_author);
-			$comment_author = addslashes(trim($comment_author[1]));
-			$ping = preg_replace('|(\n?BLOG NAME:.*)|', '', $ping);
-
-			$comment_email = '';
-
-			preg_match("|IP:(.*)|", $ping, $comment_ip);
-			$comment_ip = trim($comment_ip[1]);
-			$ping = preg_replace('|(\n?IP:.*)|', '', $ping);
-
-			preg_match("|URL:(.*)|", $ping, $comment_url);
-			$comment_url = addslashes(trim($comment_url[1]));
-			$ping = preg_replace('|(\n?URL:.*)|', '', $ping);
-
-			preg_match("|DATE:(.*)|", $ping, $comment_date);
-			$comment_date = trim($comment_date[1]);
-			$comment_date = date('Y-m-d H:i:s', strtotime($comment_date));
-			$ping = preg_replace('|(\n?DATE:.*)|', '', $ping);
-      
- 			preg_match("|TITLE:(.*)|", $ping, $ping_title);
-			$ping_title = addslashes(trim($ping_title[1]));
-			$ping = preg_replace('|(\n?TITLE:.*)|', '', $ping);
-
-			$comment_content = addslashes(trim($ping));
-			$comment_content = str_replace('-----', '', $comment_content);
-			
-			$comment_content = "<strong>$ping_title</strong>\n\n$comment_content";
-      
-			// Check if it's already there
-			if (!$wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_date = '$comment_date' AND comment_content = '$comment_content'")) {
-				$wpdb->query("INSERT INTO $wpdb->comments (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content, comment_approved, comment_type)
-				VALUES
-				($post_id, '$comment_author', '$comment_email', '$comment_url', '$comment_ip', '$comment_date', '$comment_content', '1', 'trackback')");
-				echo " Comment added.";
-			}
-
-		}
-		}
-	}
-	echo "</li>";
-	flush();
-
-} }
-upgrade_all();
-?>
-</ol>
-<h3>All done. <a href="../">Have fun!</a></h3>
-<?php
-	break;
-}
-?> 
-</body>
-</html>
diff -ruN 1.5.2/wp-admin/import.php 2.0.4/wp-admin/import.php
--- 1.5.2/wp-admin/import.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/import.php	2006-07-05 17:34:15.000000000 -0500
@@ -0,0 +1,62 @@
+<?php
+require_once ('admin.php');
+$title = __('Import');
+$parent_file = 'import.php';
+require_once ('admin-header.php');
+?>
+
+<div class="wrap">
+<h2><?php _e('Import'); ?></h2>
+<p><?php _e('If you have posts or comments in another system WordPress can import them into your current blog. To get started, choose a system to import from below:'); ?></p>
+
+<?php
+
+// Load all importers so that they can register.
+$import_loc = 'wp-admin/import';
+$import_root = ABSPATH.$import_loc;
+$imports_dir = @ dir($import_root);
+if ($imports_dir) {
+	while (($file = $imports_dir->read()) !== false) {
+		if (preg_match('|^\.+$|', $file))
+			continue;
+		if (preg_match('|\.php$|', $file))
+			require_once("$import_root/$file");
+	}
+}
+
+$importers = get_importers();
+
+if (empty ($importers)) {
+	echo '<p>'.__('No importers are available.').'</p>'; // TODO: make more helpful
+} else {
+?>
+<table width="100%" cellpadding="3" cellspacing="3">
+
+<?php
+	$style = '';
+	foreach ($importers as $id => $data) {
+		$style = ('class="alternate"' == $style || 'class="alternate active"' == $style) ? '' : 'alternate';
+		$action = "<a href='admin.php?import=$id' title='".wptexturize(strip_tags($data[1]))."'>{$data[0]}</a>";
+
+		if ($style != '')
+			$style = 'class="'.$style.'"';
+		echo "
+			<tr $style>
+				<td class=\"togl\">$action</td>
+				<td class=\"desc\">{$data[1]}</td>
+			</tr>";
+	}
+?>
+
+</table>
+<?php
+}
+?>
+
+</div>
+
+<?php
+
+include ('admin-footer.php');
+?>
+
diff -ruN 1.5.2/wp-admin/import-rss.php 2.0.4/wp-admin/import-rss.php
--- 1.5.2/wp-admin/import-rss.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-admin/import-rss.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,191 +0,0 @@
-<?php
-define('RSSFILE', '');
-// Example:
-// define('RSSFILE', '/home/example/public_html/rss.xml');
-// or if it's in the same directory as import-rss.php
-// define('RSSFILE', 'rss.xml');
-
-$post_author = 1; // Author to import posts as author ID
-$timezone_offset = 0; // GMT offset of posts your importing
-
-function unhtmlentities($string) { // From php.net for < 4.3 compat
-   $trans_tbl = get_html_translation_table(HTML_ENTITIES);
-   $trans_tbl = array_flip($trans_tbl);
-   return strtr($string, $trans_tbl);
-}
-
-$add_hours = intval($timezone_offset);
-$add_minutes = intval(60 * ($timezone_offset - $add_hours));
-
-if (!file_exists('../wp-config.php')) die("There doesn't seem to be a wp-config.php file. You must install WordPress before you import any entries.");
-require('../wp-config.php');
-
-$step = $_GET['step'];
-if (!$step) $step = 0;
-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">
-<title>WordPress &rsaquo; Import from RSS</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<style media="screen" type="text/css">
-	body {
-		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 20%;
-		margin-right: 20%;
-	}
-	#logo {
-		margin: 0;
-		padding: 0;
-		background-image: url(http://wordpress.org/images/logo.png);
-		background-repeat: no-repeat;
-		height: 60px;
-		border-bottom: 4px solid #333;
-	}
-	#logo a {
-		display: block;
-		text-decoration: none;
-		text-indent: -100em;
-		height: 60px;
-	}
-	p {
-		line-height: 140%;
-	}
-	</style>
-</head><body> 
-<h1 id="logo"><a href="http://wordpress.org/">WordPress</a></h1> 
-<?php
-switch($step) {
-
-	case 0:
-?> 
-<p>Howdy! This importer allows you to extract posts from any RSS 2.0 file into your blog. This is useful if you want to import your posts from a system that is not handled by a custom import tool. To get started you must edit the following line in this file (<code>import-rss.php</code>) </p>
-<p><code>define('RSSFILE', '');</code></p>
-<p>You want to define where the RSS file we'll be working with is, for example: </p>
-<p><code>define('RSSFILE', 'rss.xml');</code></p>
-<p>You have to do this manually for security reasons. When you're done reload this page and we'll take you to the next step.</p>
-<?php if ('' != RSSFILE) : ?>
-<h2 style="text-align: right;"><a href="import-rss.php?step=1">Begin RSS Import &raquo;</a></h2>
-<?php endif; ?>
-<?php
-	break;
-
-	case 1:
-
-// Bring in the data
-set_magic_quotes_runtime(0);
-$datalines = file(RSSFILE); // Read the file into an array
-$importdata = implode('', $datalines); // squish it
-$importdata = str_replace(array("\r\n", "\r"), "\n", $importdata);
-
-preg_match_all('|<item>(.*?)</item>|is', $importdata, $posts);
-$posts = $posts[1];
-
-echo '<ol>';
-foreach ($posts as $post) :
-$title = $date = $categories = $content = $post_id =  '';
-echo "<li>Importing post... ";
-
-preg_match('|<title>(.*?)</title>|is', $post, $title);
-$title = addslashes( trim($title[1]) );
-$post_name = sanitize_title($title);
-
-preg_match('|<pubdate>(.*?)</pubdate>|is', $post, $date);
-
-if ($date) :
-	$date = strtotime($date[1]);
-else : // if we don't already have something from pubDate
-	preg_match('|<dc:date>(.*?)</dc:date>|is', $post, $date);
-	$date = preg_replace('|([-+])([0-9]+):([0-9]+)$|', '\1\2\3', $date[1]);
-	$date = str_replace('T', ' ', $date);
-	$date = strtotime($date);
-endif;
-
-$post_date = gmdate('Y-m-d H:i:s', $date);
-
-preg_match_all('|<category>(.*?)</category>|is', $post, $categories);
-$categories = $categories[1];
-
-if (!$categories) :
-	preg_match_all('|<dc:subject>(.*?)</dc:subject>|is', $post, $categories);
-	$categories = $categories[1];
-endif;
-
-preg_match('|<guid.+?>(.*?)</guid>|is', $post, $guid);
-if ($guid) $guid = addslashes( trim($guid[1]) );
-else $guid = '';
-
-preg_match('|<content:encoded>(.*?)</content:encoded>|is', $post, $content);
-$content = str_replace( array('<![CDATA[', ']]>'), '', addslashes( trim($content[1]) ) );
-
-if (!$content) : // This is for feeds that put content in description
-	preg_match('|<description>(.*?)</description>|is', $post, $content);
-	$content = $wpdb->escape( unhtmlentities( trim($content[1]) ) );
-endif;
-
-// Clean up content
-$content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $content);
-$content = str_replace('<br>', '<br />', $content);
-$content = str_replace('<hr>', '<hr />', $content);
-
-// This can mess up on posts with no titles, but checking content is much slower
-// So we do it as a last resort
-if ('' == $title) : 
-	$dupe = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_content = '$content' AND post_date = '$post_date'");
-else :
-	$dupe = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' AND post_date = '$post_date'");
-endif;
-
-// Now lets put it in the DB
-if ($dupe) :
-	echo 'Post already imported';
-else : 
-	
-	$wpdb->query("INSERT INTO $wpdb->posts 
-		(post_author, post_date, post_date_gmt, post_content, post_title,post_status, comment_status, ping_status, post_name, guid)
-		VALUES 
-		('$post_author', '$post_date', DATE_ADD('$post_date', INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE), '$content', '$title', 'publish', '$comment_status', '$ping_status', '$post_name', '$guid')");
-	$post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' AND post_date = '$post_date'");
-	if (!$post_id) die("couldn't get post ID");
-	if (0 != count($categories)) :
-		foreach ($categories as $post_category) :
-		$post_category = unhtmlentities($post_category);
-		// See if the category exists yet
-		$cat_id = $wpdb->get_var("SELECT cat_ID from $wpdb->categories WHERE cat_name = '$post_category'");
-		if (!$cat_id && '' != trim($post_category)) {
-			$cat_nicename = sanitize_title($post_category);
-			$wpdb->query("INSERT INTO $wpdb->categories (cat_name, category_nicename) VALUES ('$post_category', '$cat_nicename')");
-			$cat_id = $wpdb->get_var("SELECT cat_ID from $wpdb->categories WHERE cat_name = '$post_category'");
-		}
-		if ('' == trim($post_category)) $cat_id = 1;
-		// Double check it's not there already
-		$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_id AND category_id = $cat_id");
-	
-		 if (!$exists) { 
-			$wpdb->query("
-			INSERT INTO $wpdb->post2cat
-			(post_id, category_id)
-			VALUES
-			($post_id, $cat_id)
-			");
-			}
-	endforeach;
-	else:
-		$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_id AND category_id = 1");
-		if (!$exists) $wpdb->query("INSERT INTO $wpdb->post2cat (post_id, category_id) VALUES ($post_id, 1) ");
-	endif;
-	echo 'Done!</li>';
-endif;
-
-
-endforeach;
-?>
-</ol>
-
-<h3>All done. <a href="../">Have fun!</a></h3>
-<?php
-	break;
-}
-?> 
-</body>
-</html>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/import-textpattern.php 2.0.4/wp-admin/import-textpattern.php
--- 1.5.2/wp-admin/import-textpattern.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-admin/import-textpattern.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,138 +0,0 @@
-<?php
-
-// For security reasons, fill in the connection details to your Textpattern database below:
-
-$tp_database_name = 'textpattern';
-$tp_database_username = 'username';
-$tp_database_password = 'password';
-$tp_database_host = 'localhost';
-
-if (!file_exists('../wp-config.php')) die("There doesn't seem to be a wp-config.php file. Double check that you updated wp-config-sample.php with the proper database connection information and renamed it to wp-config.php.");
-require('../wp-config.php');
-require('upgrade-functions.php');
-
-$step = $_GET['step'];
-if (!$step) $step = 0;
-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">
-<title>WordPress &rsaquo; Textpattern Import</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<style media="screen" type="text/css">
-	body {
-		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 15%;
-		margin-right: 15%;
-	}
-	#logo {
-		margin: 0;
-		padding: 0;
-		background-image: url(http://wordpress.org/images/wordpress.gif);
-		background-repeat: no-repeat;
-		height: 60px;
-		border-bottom: 4px solid #333;
-	}
-	#logo a {
-		display: block;
-		text-decoration: none;
-		text-indent: -100em;
-		height: 60px;
-	}
-	p {
-		line-height: 140%;
-	}
-	</style>
-</head><body> 
-<h1 id="logo"><a href="http://wordpress.org">WordPress</a></h1> 
-<?php
-switch($step) {
-
-	case 0:
-?> 
-<p>This script imports your entries from Textpattern into WordPress. It should be relatively painless, and we hope you're happy with the result.</p>
-<p>To run this, you first need to edit this file (<code>import-textpattern.php</code>) and enter your Textpattern database connection details. Let's check if the database connection information works...</p>
-<?php
-$connection = @mysql_connect($tp_database_host, $tp_database_username, $tp_database_password);
-$database = @mysql_select_db($tp_database_name);
-if ($connection && $database) {
-?>
-<p>Everything seems dandy so far, <a href="?step=1">let's get started</a>!</p>
-<?php
-} else {
-?>
-<p><em>It looks like your database information is incorrect. Please re-edit this file and double-check all the settings.</em></p>
-<?php
-}
-	break;
-	
-	case 1:
-?> 
-<h1>Step 1</h1> 
-<p>First let's get posts and comments.</p> 
-<?php
-// For people running this on .72
-$query = "ALTER TABLE `$wpdb->posts` ADD `post_name` VARCHAR(200) NOT NULL";
-maybe_add_column($wpdb->posts, 'post_name', $query);
-
-// Create post_name field
-$connection = @mysql_connect($tp_database_host, $tp_database_username, $tp_database_password);
-$database = @mysql_select_db($tp_database_name);
-
-// For now we're going to give everything the same author and same category
-$author = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_level = 10 LIMIT 1");
-$category = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories LIMIT 1");
-
-$posts = mysql_query('SELECT * FROM textpattern', $connection);
-
-while ($post = mysql_fetch_array($posts)) {
-	//  ID, AuthorID, LastMod, LastModID, Posted, Title, Body, Body_html, Abstract, Category1, Category2, Annotate, AnnotateInvite, Status, Listing1, Listing2, Section
-	$posted = $post['Posted'];
-	// 20030216162119
-	$year = substr($posted,0,4);
-	$month = substr($posted,4,2);
-	$day = substr($posted,6,2);
-	$hour = substr($posted,8,2);
-	$minute = substr($posted,10,2);
-	$second = substr($posted,12,2);
-	$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
-	$posted = date('Y-m-d H:i:s', $timestamp);
-	
-	$content = addslashes($post['Body_html']);
-	$title = addslashes($post['Title']);
-	$post_name = sanitize_title($title);
-
-	$wpdb->query("INSERT INTO $wpdb->posts
-		(post_author, post_date, post_content, post_title, post_category, post_name, post_status)
-		VALUES
-		('$author', '$posted', '$content', '$title', '$category', '$post_name', 'publish')");
-
-	// Get wordpress post id
-	$wp_post_ID = $wpdb->get_var("SELECT ID FROM $wpdb->posts ORDER BY ID DESC LIMIT 1");
-	
-	// Now let's insert comments if there are any for the TP post
-	$tp_id = $post['ID'];
-	$comments = mysql_query("SELECT * FROM txp_Discuss WHERE parentid = $tp_id");
-	if ($comments) {
-		while($comment = mysql_fetch_object($comments)) {
-			//  discussid, parentid, name, email, web, ip, posted, message
-			// For some reason here "posted" is a real MySQL date, so we don't have to do anything about it
-			//  comment_post_ID  	 comment_author  	 comment_author_email  	 comment_author_url  	 comment_author_IP  	 comment_date  	 comment_content  	 comment_karma
-			$wpdb->query("INSERT INTO $wpdb->comments
-				(comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content)
-				VALUES
-				($wp_post_ID, '$comment->name', '$comment->email', '$comment->web', '$comment->ip', '$comment->posted', '$comment->message')");
-		}
-	}
-}
-
-upgrade_all();
-?>
-<p><strong>All done.</strong> Wasn&#8217;t that fun? <a href="../">Have fun</a>.</p> 
-<?php
-break;
-}
-?> 
-
-</body>
-</html>
diff -ruN 1.5.2/wp-admin/index.php 2.0.4/wp-admin/index.php
--- 1.5.2/wp-admin/index.php	2005-04-21 19:16:48.000000000 -0500
+++ 2.0.4/wp-admin/index.php	2006-07-04 14:24:41.000000000 -0500
@@ -8,8 +8,57 @@
 ?>
 
 <div class="wrap">
+
+<h2><?php _e('Dashboard'); ?></h2>
+
 <div id="zeitgeist">
 <h2><?php _e('Latest Activity'); ?></h2>
+
+<?php
+$rss = @fetch_rss('http://feeds.technorati.com/cosmos/rss/?url='. trailingslashit(get_option('home')) .'&partner=wordpress');
+if ( isset($rss->items) && 0 != count($rss->items) ) {
+?>
+<div id="incominglinks">
+<h3><?php _e('Incoming Links'); ?> <cite><a href="http://www.technorati.com/search/<?php echo trailingslashit(get_option('home')); ?>?partner=wordpress"><?php _e('More'); ?> &raquo;</a></cite></h3>
+<ul>
+<?php
+$rss->items = array_slice($rss->items, 0, 10);
+foreach ($rss->items as $item ) {
+?>
+	<li><a href="<?php echo wp_filter_kses($item['link']); ?>"><?php echo wp_specialchars($item['title']); ?></a></li>
+<?php } ?>
+</ul>
+</div>
+<?php } ?>
+
+<?php
+$comments = $wpdb->get_results("SELECT comment_author, comment_author_url, comment_ID, comment_post_ID FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 5");
+$numcomments = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'");
+
+if ( $comments || $numcomments ) :
+?>
+<div>
+<h3><?php _e('Comments'); ?> <a href="edit-comments.php" title="<?php _e('More comments...'); ?>">&raquo;</a></h3>
+
+<?php if ( $numcomments ) : ?>
+<p><strong><a href="moderation.php"><?php echo sprintf(__('Comments in moderation (%s)'), number_format($numcomments) ); ?> &raquo;</a></strong></p>
+<?php endif; ?>
+
+<ul>
+<?php 
+if ( $comments ) {
+foreach ($comments as $comment) {
+	echo '<li>' . sprintf(__('%1$s on %2$s'), get_comment_author_link(), '<a href="'. get_permalink($comment->comment_post_ID) . '#comment-' . $comment->comment_ID . '">' . get_the_title($comment->comment_post_ID) . '</a>');
+	edit_comment_link(__("Edit"), ' <small>(', ')</small>'); 
+	echo '</li>';
+}
+}
+?>
+</ul>
+</div>
+<?php endif; ?>
+
+
 <?php
 if ( $recentposts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'publish' AND post_date_gmt < '$today' ORDER BY post_date DESC LIMIT 5") ) :
 ?>
@@ -30,7 +79,7 @@
 <?php endif; ?>
 
 <?php
-if ( $scheduled = $wpdb->get_results("SELECT ID, post_title, post_date_gmt FROM $wpdb->posts WHERE post_status = 'publish' AND post_date_gmt > '$today'") ) :
+if ( $scheduled = $wpdb->get_results("SELECT ID, post_title, post_date_gmt FROM $wpdb->posts WHERE post_status = 'publish' AND post_date_gmt > '$today' ORDER BY post_date ASC") ) :
 ?> 
 <div>
 <h3><?php _e('Scheduled Entries:') ?></h3>
@@ -46,29 +95,6 @@
 </div>
 <?php endif; ?>
 
-<?php
-if ( $comments = $wpdb->get_results("SELECT comment_author, comment_author_url, comment_ID, comment_post_ID FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 5") ) :
-?>
-<div>
-<h3><?php _e('Comments'); ?> <a href="edit-comments.php" title="<?php _e('More comments...'); ?>">&raquo;</a></h3>
-<ul>
-<?php 
-foreach ($comments as $comment) {
-	echo '<li>' . sprintf(__('%1$s on %2$s'), get_comment_author_link(), '<a href="'. get_permalink($comment->comment_post_ID) . '#comment-' . $comment->comment_ID . '">' . get_the_title($comment->comment_post_ID) . '</a>');
-	edit_comment_link(__("Edit"), ' <small>(', ')</small>'); 
-	echo '</li>';
-}
-?>
-</ul>
-<?php 
-if ( $numcomments = $wpdb->get_var("SELECT COUNT(*) FROM $tablecomments WHERE comment_approved = '0'") ) :
-?>
-<p><strong><a href="moderation.php"><?php echo sprintf(__('There are comments in moderation (%s)'), number_format($numcomments) ); ?> &raquo;</a></strong></p>
-<?php endif; ?>
-</div>
-
-<?php endif; ?>
-
 <div>
 <h3><?php _e('Blog Stats'); ?></h3>
 <?php
@@ -84,37 +110,31 @@
 <p><?php printf(__('There are currently %1$s <a href="%2$s" title="Posts">posts</a> and %3$s <a href="%4$s" title="Comments">comments</a>, contained within %5$s <a href="%6$s" title="categories">categories</a>.'), $numposts, 'edit.php',  $numcomms, 'edit-comments.php', $numcats, 'categories.php'); ?></p>
 </div>
 
-<?php
-$rss = @fetch_rss('http://feeds.technorati.com/cosmos/rss/?url='. trailingslashit(get_option('home')) .'&partner=wordpress');
-if ( isset($rss->items) && 0 != count($rss->items) ) {
-?>
-<div id="incominglinks">
-<h3><?php _e('Incoming Links'); ?> <cite><a href="http://www.technorati.com/cosmos/search.html?url=<?php echo trailingslashit(get_option('home')); ?>&amp;partner=wordpress"><?php _e('More'); ?> &raquo;</a></cite></h3>
-<ul>
-<?php
-$rss->items = array_slice($rss->items, 0, 10);
-foreach ($rss->items as $item ) {
-?>
-	<li><a href="<?php echo wp_filter_kses($item['link']); ?>"><?php echo wp_specialchars($item['title']); ?></a></li>
-<?php } ?>
-</ul>
+<?php do_action('activity_box_end'); ?>
 </div>
-<?php } ?>
 
-</div>
+<h3><?php _e('Welcome to WordPress'); ?></h3>
 
-<h2><?php _e('Dashboard'); ?></h2>
-<p><?php _e('Below is the latest news from the official WordPress development blog, click on a title to read the full entry.'); ?></p>
+<p><?php _e('Use these links to get started:'); ?></p>
+
+<ul>
+<li><a href="post.php"><?php _e('Write a post'); ?></a></li>
+<li><a href="profile.php"><?php _e('Update your profile or change your password'); ?></a></li>
+<li><a href="link-add.php"><?php _e('Add a link to your blogroll'); ?></a></li>
+<li><a href="themes.php"><?php _e('Change your site&#8217;s look or theme'); ?></a></li>
+</ul>
+
+<p><?php _e("Below is the latest news from the official WordPress development blog, click on a title to read the full entry. If you need help with WordPress please see our <a href='http://codex.wordpress.org/'>great documentation</a> or if that doesn't help visit the <a href='http://wordpress.org/support/'>support forums</a>."); ?></p>
 <?php
 $rss = @fetch_rss('http://wordpress.org/development/feed/');
 if ( isset($rss->items) && 0 != count($rss->items) ) {
 ?>
-<h3>WordPress Development Blog</h3>
+<h3><?php _e('WordPress Development Blog'); ?></h3>
 <?php
 $rss->items = array_slice($rss->items, 0, 3);
 foreach ($rss->items as $item ) {
 ?>
-<h4><a href='<?php echo wp_filter_kses($item['link']); ?>'><?php echo wp_specialchars($item['title']); ?></a> &#8212; <?php echo human_time_diff( strtotime($item['pubdate'], time() ) ); ?> <?php _e('ago'); ?></h4>
+<h4><a href='<?php echo wp_filter_kses($item['link']); ?>'><?php echo wp_specialchars($item['title']); ?></a> &#8212; <?php printf(__('%s ago'), human_time_diff(strtotime($item['pubdate'], time() ) ) ); ?></h4>
 <p><?php echo $item['description']; ?></p>
 <?php
 	}
@@ -146,28 +166,7 @@
 <br clear="all" />
 </div>
 </div>
-<?php
-$drafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = $user_ID");
-if ($drafts) {
-?>
-<div class="wrap">
 
-    <p><strong><?php _e('Your Drafts:') ?></strong> 
-    <?php
-	$i = 0;
-	foreach ($drafts as $draft) {
-		if (0 != $i)
-			echo ', ';
-		$draft->post_title = stripslashes($draft->post_title);
-		if ($draft->post_title == '')
-			$draft->post_title = sprintf(__('Post #%s'), $draft->ID);
-		echo "<a href='post.php?action=edit&amp;post=$draft->ID' title='" . __('Edit this draft') . "'>$draft->post_title</a>";
-		++$i;
-		}
-	?> 
-    .</p> 
-</div>
-<?php } ?>
 <?php
 require('./admin-footer.php');
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-admin/inline-uploading.php 2.0.4/wp-admin/inline-uploading.php
--- 1.5.2/wp-admin/inline-uploading.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/inline-uploading.php	2006-07-05 15:21:45.000000000 -0500
@@ -0,0 +1,722 @@
+<?php
+
+require_once('admin.php');
+
+header('Content-Type: text/html; charset=' . get_option('blog_charset'));
+
+if (!current_user_can('upload_files'))
+	die(__('You do not have permission to upload files.'));
+
+$wpvarstoreset = array('action', 'post', 'all', 'last', 'link', 'sort', 'start', 'imgtitle', 'descr', 'attachment');
+
+for ($i=0; $i<count($wpvarstoreset); $i += 1) {
+	$wpvar = $wpvarstoreset[$i];
+	if (!isset($$wpvar)) {
+		if (empty($_POST["$wpvar"])) {
+			if (empty($_GET["$wpvar"])) {
+				$$wpvar = '';
+			} else {
+			$$wpvar = $_GET["$wpvar"];
+			}
+		} else {
+			$$wpvar = $_POST["$wpvar"];
+		}
+	}
+}
+
+$post = (int) $post;
+$images_width = 1;
+
+switch($action) {
+case 'links':
+// Do not pass GO.
+break;
+
+case 'delete':
+
+check_admin_referer('inlineuploading');
+
+if ( !current_user_can('edit_post', (int) $attachment) )
+	die(__('You are not allowed to delete this attachment.').' <a href="'.basename(__FILE__)."?post=$post&amp;all=$all&amp;action=upload\">".__('Go back').'</a>');
+
+wp_delete_attachment($attachment);
+
+wp_redirect(basename(__FILE__) ."?post=$post&all=$all&action=view&start=$start");
+die;
+
+case 'save':
+
+check_admin_referer('inlineuploading');
+
+$overrides = array('action'=>'save');
+
+$file = wp_handle_upload($_FILES['image'], $overrides);
+
+if ( isset($file['error']) )
+	die($file['error'] . '<br /><a href="' . basename(__FILE__) . '?action=upload&post=' . $post . '">'.__('Back to Image Uploading').'</a>');
+
+$url = $file['url'];
+$type = $file['type'];
+$file = $file['file'];
+$filename = basename($file);
+
+// Construct the attachment array
+$attachment = array(
+	'post_title' => $imgtitle ? $imgtitle : $filename,
+	'post_content' => $descr,
+	'post_status' => 'attachment',
+	'post_parent' => $post,
+	'post_mime_type' => $type,
+	'guid' => $url
+	);
+
+// Save the data
+$id = wp_insert_attachment($attachment, $file, $post);
+
+if ( preg_match('!^image/!', $attachment['post_mime_type']) ) {
+	// Generate the attachment's postmeta.
+	$imagesize = getimagesize($file);
+	$imagedata['width'] = $imagesize['0'];
+	$imagedata['height'] = $imagesize['1'];
+	list($uwidth, $uheight) = get_udims($imagedata['width'], $imagedata['height']);
+	$imagedata['hwstring_small'] = "height='$uheight' width='$uwidth'";
+	$imagedata['file'] = $file;
+
+	add_post_meta($id, '_wp_attachment_metadata', $imagedata);
+
+	if ( $imagedata['width'] * $imagedata['height'] < 3 * 1024 * 1024 ) {
+		if ( $imagedata['width'] > 128 && $imagedata['width'] >= $imagedata['height'] * 4 / 3 )
+			$thumb = wp_create_thumbnail($file, 128);
+		elseif ( $imagedata['height'] > 96 )
+			$thumb = wp_create_thumbnail($file, 96);
+
+		if ( @file_exists($thumb) ) {
+			$newdata = $imagedata;
+			$newdata['thumb'] = basename($thumb);
+			update_post_meta($id, '_wp_attachment_metadata', $newdata, $imagedata);
+		} else {
+			$error = $thumb;
+		}
+	}
+} else {
+	add_post_meta($id, '_wp_attachment_metadata', array());
+}
+
+wp_redirect(basename(__FILE__) . "?post=$post&all=$all&action=view&start=0");
+die();
+
+case 'upload':
+
+$current_1 = ' class="current"';
+$back = $next = false;
+break;
+
+case 'view':
+
+// How many images do we show? How many do we query?
+$num = 5;
+$double = $num * 2;
+
+if ( $post && (empty($all) || $all == 'false') ) {
+	$and_post = "AND post_parent = '$post'";
+	$current_2 = ' class="current"';
+} else {
+	$current_3 = ' class="current"';
+}
+
+if (! current_user_can('edit_others_posts') )
+	$and_user = "AND post_author = " . $user_ID;
+
+if ( $last )
+	$start = $wpdb->get_var("SELECT count(ID) FROM $wpdb->posts WHERE post_status = 'attachment' $and_user $and_post") - $num;
+else
+	$start = (int) $start;
+
+if ( $start < 0 )
+	$start = 0;
+
+if ( '' == $sort )
+	$sort = "post_date_gmt DESC";
+
+$attachments = $wpdb->get_results("SELECT ID, post_date, post_title, post_mime_type, guid FROM $wpdb->posts WHERE post_status = 'attachment' $and_type $and_post $and_user ORDER BY $sort LIMIT $start, $double", ARRAY_A);
+
+if ( count($attachments) == 0 ) {
+	wp_redirect( basename(__FILE__) ."?post=$post&action=upload" );
+	die;
+} elseif ( count($attachments) > $num ) {
+	$next = $start + count($attachments) - $num;
+} else {
+	$next = false;
+}
+
+if ( $start > 0 ) {
+	$back = $start - $num;
+	if ( $back < 1 )
+		$back = '0';
+} else {
+	$back = false;
+}
+
+$uwidth_sum = 0;
+$html = '';
+$popups = '';
+$style = '';
+$script = '';
+if ( count($attachments) > 0 ) {
+	$attachments = array_slice( $attachments, 0, $num );
+	$__delete = __('Delete');
+	$__not_linked = __('Not Linked');
+	$__linked_to_page = __('Linked to Page');
+	$__linked_to_image = __('Linked to Image');
+	$__linked_to_file = __('Linked to File');
+	$__using_thumbnail = __('Using Thumbnail');
+	$__using_original = __('Using Original');
+	$__using_title = __('Using Title');
+	$__using_filename = __('Using Filename');
+	$__using_icon = __('Using Icon');
+	$__no_thumbnail = '<del>'.__('No Thumbnail').'</del>';
+	$__send_to_editor = __('Send to editor');
+	$__close = __('Close Options');
+	$__confirmdelete = __('Delete this file from the server?');
+	$__nothumb = __('There is no thumbnail associated with this photo.');
+	$script .= "notlinked = '$__not_linked';
+linkedtoimage = '$__linked_to_image';
+linkedtopage = '$__linked_to_page';
+linkedtofile = '$__linked_to_file';
+usingthumbnail = '$__using_thumbnail';
+usingoriginal = '$__using_original';
+usingtitle = '$__using_title';
+usingfilename = '$__using_filename';
+usingicon = '$__using_icon';
+var aa = new Array();
+var ab = new Array();
+var imga = new Array();
+var imgb = new Array();
+var srca = new Array();
+var srcb = new Array();
+var title = new Array();
+var filename = new Array();
+var icon = new Array();
+";
+	foreach ( $attachments as $key => $attachment ) {
+		$ID = $attachment['ID'];
+		$href = get_attachment_link($ID);
+		$meta = get_post_meta($ID, '_wp_attachment_metadata', true);
+		if (!is_array($meta)) {
+			$meta = get_post_meta($ID, 'imagedata', true); // Try 1.6 Alpha meta key
+			if (!is_array($meta)) {
+				$meta = array();
+			}
+			add_post_meta($ID, '_wp_attachment_metadata', $meta);
+		}
+		$attachment = array_merge($attachment, $meta);
+		$noscript = "<noscript>
+		<div class='caption'><a href=\"".basename(__FILE__)."?action=links&amp;attachment={$ID}&amp;post={$post}&amp;all={$all}&amp;start={$start}\">Choose Links</a></div>
+		</noscript>
+";
+		$send_delete_cancel = "<a onclick=\"sendToEditor({$ID});return false;\" href=\"javascript:void()\">$__send_to_editor</a>
+<a onclick=\"return confirm('$__confirmdelete')\" href=\"" . wp_nonce_url( basename(__FILE__) . "?action=delete&amp;attachment={$ID}&amp;all=$all&amp;start=$start&amp;post=$post", inlineuploading) . "\">$__delete</a>
+		<a onclick=\"popup.style.display='none';return false;\" href=\"javascript:void()\">$__close</a>
+";
+		$uwidth_sum += 128;
+		if ( preg_match('!^image/!', $attachment['post_mime_type'] ) ) {
+			$image = & $attachment;
+			if ( ($image['width'] > 128 || $image['height'] > 96) && !empty($image['thumb']) && file_exists(dirname($image['file']).'/'.$image['thumb']) ) {
+				$src = str_replace(basename($image['guid']), $image['thumb'], $image['guid']);
+				$script .= "srca[{$ID}] = '$src';
+srcb[{$ID}] = '{$image['guid']}';
+";
+				$thumb = 'true';
+				$thumbtext = $__using_thumbnail;
+			} else {
+				$src = $image['guid'];
+				$thumb = 'false';
+				$thumbtext = $__no_thumbnail;
+			}
+			list($image['uwidth'], $image['uheight']) = get_udims($image['width'], $image['height']);
+			$height_width = 'height="'.$image['uheight'].'" width="'.$image['uwidth'].'"';
+			$xpadding = (128 - $image['uwidth']) / 2;
+			$ypadding = (96 - $image['uheight']) / 2;
+			$style .= "#target{$ID} img { padding: {$ypadding}px {$xpadding}px; }\n";
+			$title = wp_specialchars($image['post_title'], ENT_QUOTES);
+			$script .= "aa[{$ID}] = '<a id=\"p{$ID}\" rel=\"attachment\" class=\"imagelink\" href=\"$href\" onclick=\"doPopup({$ID});return false;\" title=\"{$title}\">';
+ab[{$ID}] = '<a class=\"imagelink\" href=\"{$image['guid']}\" onclick=\"doPopup({$ID});return false;\" title=\"{$title}\">';
+imga[{$ID}] = '<img id=\"image{$ID}\" src=\"$src\" alt=\"{$title}\" $height_width />';
+imgb[{$ID}] = '<img id=\"image{$ID}\" src=\"{$image['guid']}\" alt=\"{$title}\" $height_width />';
+";
+			$html .= "<div id='target{$ID}' class='attwrap left'>
+	<div id='div{$ID}' class='imagewrap' onclick=\"doPopup({$ID});\">
+		<img id=\"image{$ID}\" src=\"$src\" alt=\"{$title}\" $height_width />
+	</div>
+	{$noscript}
+</div>
+";
+			$popups .= "<div id='popup{$ID}' class='popup'>
+	<a id=\"I{$ID}\" onclick=\"if($thumb)toggleImage({$ID});else alert('$__nothumb');return false;\" href=\"javascript:void()\">$thumbtext</a>
+	<a id=\"L{$ID}\" onclick=\"toggleLink({$ID});return false;\" href=\"javascript:void()\">$__not_linked</a>
+	{$send_delete_cancel}
+</div>
+";
+		} else {
+			$title = wp_specialchars($attachment['post_title'], ENT_QUOTES);
+			$filename = basename($attachment['guid']);
+			$icon = get_attachment_icon($ID);
+			$toggle_icon = "<a id=\"I{$ID}\" onclick=\"toggleOtherIcon({$ID});return false;\" href=\"javascript:void()\">$__using_title</a>";
+			$script .= "aa[{$ID}] = '<a id=\"p{$ID}\" rel=\"attachment\" href=\"$href\" onclick=\"doPopup({$ID});return false;\" title=\"{$title}\">';
+ab[{$ID}] = '<a id=\"p{$ID}\" href=\"{$filename}\" onclick=\"doPopup({$ID});return false;\" title=\"{$title}\">';
+title[{$ID}] = '{$title}';
+filename[{$ID}] = '{$filename}';
+icon[{$ID}] = '{$icon}';
+";
+			$html .= "<div id='target{$ID}' class='attwrap left'>
+	<div id='div{$ID}' class='otherwrap usingtext' onmousedown=\"selectLink({$ID})\" onclick=\"doPopup({$ID});return false;\">
+		<a id=\"p{$ID}\" href=\"{$attachment['guid']}\" onmousedown=\"selectLink({$ID});\" onclick=\"return false;\">{$title}</a>
+	</div>
+	{$noscript}
+</div>
+";
+			$popups .= "<div id='popup{$ID}' class='popup'>
+	<div class='filetype'>".__('File Type:').' '.str_replace('/',"/\n",$attachment['post_mime_type'])."</div>
+	<a id=\"L{$ID}\" onclick=\"toggleOtherLink({$ID});return false;\" href=\"javascript:void()\">$__linked_to_file</a>
+	{$toggle_icon}
+	{$send_delete_cancel}
+</div>
+";
+		}
+	}
+}
+
+$images_width = $uwidth_sum + ( count($images) * 6 ) + 35;
+
+break;
+
+default:
+die(__('This script was not meant to be called directly.'));
+}
+
+?>
+<!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>
+<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_settings('blog_charset'); ?>" />
+<title></title>
+<meta http-equiv="imagetoolbar" content="no" />
+<script type="text/javascript">
+// <![CDATA[
+/* Define any variables we'll need, such as alternate URLs. */
+<?php echo $script; ?>
+function htmldecode(st) {
+	o = document.getElementById('htmldecode');
+	if (! o) {
+		o = document.createElement("A");
+		o.id = "htmldecode"
+	}
+	o.innerHTML = st;
+	r = o.innerHTML;
+	return r;
+}
+function cancelUpload() {
+	o = document.getElementById('uploadForm');
+	o.method = 'GET';
+	o.action.value = 'view';
+	o.submit();
+}
+function doPopup(i) {
+	if ( popup )
+	popup.style.display = 'none';
+	target = document.getElementById('target'+i);
+	popup = document.getElementById('popup'+i);
+	popup.style.left = (target.offsetLeft) + 'px';
+	popup.style.top = (target.offsetTop) + 'px';
+	popup.style.display = 'block';
+}
+popup = false;
+function selectLink(n) {
+	o=document.getElementById('div'+n);
+	if ( typeof document.body.createTextRange == 'undefined' || typeof win.tinyMCE == 'undefined' || win.tinyMCE.configs.length < 1 )
+		return;
+	r = document.body.createTextRange();
+	if ( typeof r != 'undefined' ) {
+		r.moveToElementText(o);
+		r.select();
+	}
+}
+function toggleLink(n) {
+	ol=document.getElementById('L'+n);
+	if ( ol.innerHTML == htmldecode(notlinked) ) {
+		ol.innerHTML = linkedtoimage;
+	} else if ( ol.innerHTML == htmldecode(linkedtoimage) ) {
+		ol.innerHTML = linkedtopage;
+	} else {
+		ol.innerHTML = notlinked;
+	}
+	updateImage(n);
+}
+function toggleOtherLink(n) {
+	ol=document.getElementById('L'+n);
+	if ( ol.innerHTML == htmldecode(linkedtofile) ) {
+		ol.innerHTML = linkedtopage;
+	} else {
+		ol.innerHTML = linkedtofile;
+	}
+	updateOtherIcon(n);
+}
+function toggleImage(n) {
+	oi = document.getElementById('I'+n);
+	if ( oi.innerHTML == htmldecode(usingthumbnail) ) {
+		oi.innerHTML = usingoriginal;
+	} else {
+		oi.innerHTML = usingthumbnail;
+	}
+	updateImage(n);
+}
+function toggleOtherIcon(n) {
+	od = document.getElementById('div'+n);
+	oi = document.getElementById('I'+n);
+	if ( oi.innerHTML == htmldecode(usingtitle) ) {
+		oi.innerHTML = usingfilename;
+		od.className = 'otherwrap usingtext';
+	} else if ( oi.innerHTML == htmldecode(usingfilename) && icon[n] != '' ) {
+		oi.innerHTML = usingicon;
+		od.className = 'otherwrap usingicon';
+	} else {
+		oi.innerHTML = usingtitle;
+		od.className = 'otherwrap usingtext';
+	}
+	updateOtherIcon(n);
+}
+function updateImage(n) {
+	od=document.getElementById('div'+n);
+	ol=document.getElementById('L'+n);
+	oi=document.getElementById('I'+n);
+	if ( oi.innerHTML == htmldecode(usingthumbnail) ) {
+		img = imga[n];
+	} else {
+		img = imgb[n];
+	}
+	if ( ol.innerHTML == htmldecode(linkedtoimage) ) {
+		od.innerHTML = ab[n]+img+'</a>';
+	} else if ( ol.innerHTML == htmldecode(linkedtopage) ) {
+		od.innerHTML = aa[n]+img+'</a>';
+	} else {
+		od.innerHTML = img;
+	}
+}
+function updateOtherIcon(n) {
+	od=document.getElementById('div'+n);
+	ol=document.getElementById('L'+n);
+	oi=document.getElementById('I'+n);
+	if ( oi.innerHTML == htmldecode(usingfilename) ) {
+		txt = filename[n];
+	} else if ( oi.innerHTML == htmldecode(usingicon) ) {
+		txt = icon[n];
+	} else {
+		txt = title[n];
+	}
+	if ( ol.innerHTML == htmldecode(linkedtofile) ) {
+		od.innerHTML = ab[n]+txt+'</a>';
+	} else if ( ol.innerHTML == htmldecode(linkedtopage) ) {
+		od.innerHTML = aa[n]+txt+'</a>';
+	} else {
+		od.innerHTML = txt;
+	}
+}
+
+var win = window.opener ? window.opener : window.dialogArguments;
+if (!win) win = top;
+tinyMCE = win.tinyMCE;
+richedit = ( typeof tinyMCE == 'object' && tinyMCE.configs.length > 0 );
+function sendToEditor(n) {
+	o = document.getElementById('div'+n);
+	h = o.innerHTML.replace(new RegExp('^\\s*(.*?)\\s*$', ''), '$1'); // Trim
+	h = h.replace(new RegExp(' (class|title|width|height|id|onclick|onmousedown)=([^\'"][^ ]*)( |/|>)', 'g'), ' $1="$2"$3'); // Enclose attribs in quotes
+	h = h.replace(new RegExp(' (width|height)=".*?"', 'g'), ''); // Drop size constraints
+	h = h.replace(new RegExp(' on(click|mousedown)="[^"]*"', 'g'), ''); // Drop menu events
+	h = h.replace(new RegExp('<(/?)A', 'g'), '<$1a'); // Lowercase tagnames
+	h = h.replace(new RegExp('<IMG', 'g'), '<img'); // Lowercase again
+	h = h.replace(new RegExp('(<img .+?")>', 'g'), '$1 />'); // XHTML
+	if ( richedit )
+		win.tinyMCE.execCommand('mceInsertContent', false, h);
+	else
+		win.edInsertContent(win.edCanvas, h);
+}
+// ]]>
+</script>
+<style type="text/css">
+<?php if ( $action == 'links' ) : ?>
+* html { overflow-x: hidden; }
+<?php else : ?>
+* html { overflow-y: hidden; }
+<?php endif; ?>
+body {
+	font: 13px "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana;
+	border: none;
+	margin: 0px;
+	height: 150px;
+	background: #dfe8f1;
+}
+form {
+	margin: 3px 2px 0px 6px;
+}
+#wrap {
+	clear: both;
+	padding: 0px;
+	width: 100%;
+}
+#images {
+	position: absolute;
+	clear: both;
+	margin: 0px;
+	padding: 15px 15px;
+	width: <?php echo $images_width; ?>px;
+}
+#images img {
+	background-color: rgb(209, 226, 239);
+}
+<?php echo $style; ?>
+.attwrap, .attwrap * {
+	margin: 0px;
+	padding: 0px;
+	border: 0px;
+}
+.imagewrap {
+	margin-right: 5px;
+	overflow: hidden;
+	width: 128px;
+}
+.otherwrap {
+	margin-right: 5px;
+	overflow: hidden;
+	background-color: #f9fcfe;
+}
+.otherwrap a {
+	display: block;
+}
+.otherwrap a, .otherwrap a:hover, .otherwrap a:active, .otherwrap a:visited {
+	color: blue;
+}
+.usingicon {
+	padding: 0px;
+	height: 96px;
+	text-align: center;
+	width: 128px;
+}
+.usingtext {
+	padding: 3px;
+	height: 90px;
+	text-align: left;
+	width: 122px;
+}
+.filetype {
+	font-size: 80%;
+	border-bottom: 3px double #89a
+}
+.imagewrap, .imagewrap img, .imagewrap a, .imagewrap a img, .imagewrap a:hover img, .imagewrap a:visited img, .imagewrap a:active img {
+	text-decoration: none;
+}
+#upload-menu {
+	background: #fff;
+	margin: 0px;
+	padding: 0;
+	list-style: none;
+	height: 2em;
+	border-bottom: 1px solid #448abd;
+	width: 100%;
+}
+#upload-menu li {
+	float: left;
+	margin: 0 0 0 .75em;
+}
+#upload-menu a {
+	display: block;
+	padding: 5px;
+	text-decoration: none;
+	color: #000;
+	border-top: 3px solid #fff;
+}
+#upload-menu .current a {
+	background: #dfe8f1;
+	border-right: 2px solid #448abd;
+}
+#upload-menu a:hover {
+	background: #dfe8f1;
+	color: #000;
+}
+.tip {
+	color: rgb(68, 138, 189);
+	padding: 2px 1em;
+}
+.inactive {
+	color: #fff;
+	padding: 1px 3px;
+}
+.left {
+	float: left;
+}
+.right {
+	float: right;
+}
+.center {
+	text-align: center;
+}
+#upload-menu li.spacer {
+	margin-left: 40px;
+}
+#title, #descr {
+	width: 99%;
+	margin-top: 1px;
+}
+th {
+	width: 4.5em;
+}
+#descr {
+	height: 36px;
+}
+#buttons {
+	margin-top: 2px;
+	text-align: right;
+}
+.popup {
+	margin: 4px 4px;
+	padding: 1px;
+	position: absolute;
+	width: 114px;
+	display: none;
+	background-color: rgb(240, 240, 238);
+	border-top: 2px solid #fff;
+	border-right: 2px solid #ddd;
+	border-bottom: 2px solid #ddd;
+	border-left: 2px solid #fff;
+	text-align: center;
+}
+.imagewrap .popup {
+	opacity: .90;
+	filter:alpha(opacity=90);
+}
+.otherwrap .popup {
+	padding-top: 20px;
+}
+.popup a, .popup a:visited, .popup a:active {
+	background-color: transparent;
+	display: block;
+	width: 100%;
+	text-decoration: none;
+	color: #246;
+}
+.popup a:hover {
+	background-color: #fff;
+	color: #000;
+}
+.caption {
+	text-align: center;
+}
+#submit {
+	margin: 1px;
+	width: 99%;
+}
+#submit input, #submit input:focus {
+	background: url( images/fade-butt.png );
+	border: 3px double #999;
+	border-left-color: #ccc;
+	border-top-color: #ccc;
+	color: #333;
+	padding: 0.25em;
+}
+#submit input:active {
+	background: #f4f4f4;
+	border: 3px double #ccc;
+	border-left-color: #999;
+	border-top-color: #999;
+}
+.zerosize {
+	width: 0px;
+	height: 0px;
+	overflow: hidden;
+	position: absolute;
+}
+#links {
+	margin: 3px 8px;
+	line-height: 2em;
+}
+#links textarea {
+	width: 95%;
+	height: 4.5em;
+}
+</style>
+</head>
+<body>
+<ul id="upload-menu">
+<li<?php echo $current_1; ?>><a href="<?php echo basename(__FILE__) . "?action=upload&amp;post=$post&amp;all=$all&amp;start=$start"; ?>"><?php _e('Upload'); ?></a></li>
+<?php if ( $attachments = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_parent = '$post'") ) { ?>
+<li<?php echo $current_2; ?>><a href="<?php echo basename(__FILE__) . "?action=view&amp;post=$post&amp;all=false"; ?>"><?php _e('Browse'); ?></a></li>
+<?php } ?>
+<?php if ($wpdb->get_var("SELECT count(ID) FROM $wpdb->posts WHERE post_status = 'attachment'")) { ?>
+<li<?php echo $current_3; ?>><a href="<?php echo basename(__FILE__) . "?action=view&amp;post=$post&amp;all=true"; ?>"><?php _e('Browse All'); ?></a></li>
+<?php } ?>
+<li> </li>
+<?php if ( $action == 'view' ) { ?>
+<?php if ( false !== $back ) : ?>
+<li class="spacer"><a href="<?php echo basename(__FILE__) . "?action=$action&amp;post=$post&amp;all=$all&amp;start=0"; ?>" title="<?php _e('First'); ?>">|&laquo;</a></li>
+<li><a href="<?php echo basename(__FILE__) . "?action=$action&amp;post=$post&amp;all=$all&amp;start=$back"; ?>">&laquo; <?php _e('Back'); ?></a></li>
+<?php else : ?>
+<li class="inactive spacer">|&laquo;</li>
+<li class="inactive">&laquo; <?php _e('Back'); ?></li>
+<?php endif; ?>
+<?php if ( false !== $next ) : ?>
+<li><a href="<?php echo basename(__FILE__) . "?action=$action&amp;post=$post&amp;all=$all&amp;start=$next"; ?>"><?php _e('Next &raquo;'); ?></a></li>
+<li><a href="<?php echo basename(__FILE__) . "?action=$action&amp;post=$post&amp;all=$all&amp;last=true"; ?>" title="<?php _e('Last'); ?>">&raquo;|</a></li>
+<?php else : ?>
+<li class="inactive"><?php _e('Next'); ?> &raquo;</li>
+<li class="inactive">&raquo;|</li>
+<?php endif; ?>
+<?php } // endif not upload?>
+</ul>
+<?php if ( $action == 'view' ) : ?>
+<div id="wrap">
+<!--<div class="tip"><?php _e('You can drag and drop these items into your post. Click on one for more options.'); ?></div>-->
+<div id="images">
+<?php echo $html; ?>
+<?php echo $popups; ?>
+</div>
+</div>
+<?php elseif ( $action == 'upload' ) : ?>
+<div class="tip"></div>
+<form enctype="multipart/form-data" id="uploadForm" method="post" action="<?php echo basename(__FILE__); ?>">
+<table style="width:99%;">
+<tr>
+<th scope="row" align="right"><label for="upload"><?php _e('File:'); ?></label></th>
+<td><input type="file" id="upload" name="image" /></td>
+</tr>
+<tr>
+<th scope="row" align="right"><label for="title"><?php _e('Title:'); ?></label></th>
+<td><input type="text" id="title" name="imgtitle" /></td>
+</tr>
+<tr>
+<th scope="row" align="right"><label for="descr"><?php _e('Description:'); ?></label></th>
+<td><input type="textarea" name="descr" id="descr" value="" /></td>
+</tr>
+<tr id="buttons">
+<th></th>
+<td>
+<input type="hidden" name="action" value="save" />
+<input type="hidden" name="post" value="<?php echo $post; ?>" />
+<input type="hidden" name="all" value="<?php echo $all; ?>" />
+<input type="hidden" name="start" value="<?php echo $start; ?>" />
+<?php wp_nonce_field( 'inlineuploading' ); ?>
+<div id="submit">
+<input type="submit" value="<?php _e('Upload'); ?>" />
+<?php if ( !empty($all) ) : ?>
+<input type="button" value="<?php _e('Cancel'); ?>" onclick="cancelUpload()" />
+<?php endif; ?>
+</div>
+</td>
+</tr>
+</table>
+</form>
+<?php elseif ( $action == 'links' ) : ?>
+<div id="links">
+<?php the_attachment_links($attachment); ?>
+</div>
+<?php endif; ?>
+</body>
+</html>
diff -ruN 1.5.2/wp-admin/link-add.php 2.0.4/wp-admin/link-add.php
--- 1.5.2/wp-admin/link-add.php	2005-02-24 18:20:48.000000000 -0600
+++ 2.0.4/wp-admin/link-add.php	2006-01-09 23:16:17.000000000 -0600
@@ -5,38 +5,6 @@
 $this_file = 'link-manager.php';
 $parent_file = 'link-manager.php';
 
-function category_dropdown($fieldname, $selected = 0) {
-	global $wpdb;
-	
-	$results = $wpdb->get_results("SELECT cat_id, cat_name, auto_toggle FROM $wpdb->linkcategories ORDER BY cat_id");
-	echo "\n<select name='$fieldname' size='1'>\n";
-	foreach ($results as $row) {
-		echo "\n\t<option value='$row->cat_id'";
-		if ($row->cat_id == $selected)
-			echo " selected='selected'";
-		echo ">$row->cat_id : " . wp_specialchars($row->cat_name);
-		if ($row->auto_toggle == 'Y')
-			echo ' (auto toggle)';
-		echo "</option>";
-	}
-	echo "\n</select>\n";
-}
-
-function xfn_check($class, $value = '', $type = 'check') {
-	global $link_rel;
-	$rels = preg_split('/\s+/', $link_rel);
-
-	if ('' != $value && in_array($value, $rels) ) {
-		echo ' checked="checked"';
-	}
-
-	if ('' == $value) {
-		if ('family' == $class && !strstr($link_rel, 'child') && !strstr($link_rel, 'parent') && !strstr($link_rel, 'sibling') && !strstr($link_rel, 'spouse') && !strstr($link_rel, 'kin')) echo ' checked="checked"';
-		if ('friendship' == $class && !strstr($link_rel, 'friend') && !strstr($link_rel, 'acquaintance') && !strstr($link_rel, 'contact') ) echo ' checked="checked"';
-		if ('geographical' == $class && !strstr($link_rel, 'co-resident') && !strstr($link_rel, 'neighbor') ) echo ' checked="checked"';
-		if ('identity' == $class && in_array('me', $rels) ) echo ' checked="checked"';
-	}
-}
 
 $wpvarstoreset = array('action', 'cat_id', 'linkurl', 'name', 'image',
                        'description', 'visible', 'target', 'category', 'link_id',
@@ -56,212 +24,19 @@
         }
     }
 }
-$link_url = stripslashes($_GET['linkurl']);
-$link_name = htmlentities(stripslashes(urldecode($_GET['name'])));
-
 
-$xfn = true;
+$xfn_js = true;
 require('admin-header.php');
 ?>
 
 <?php if ($_GET['added']) : ?>
-<div class="updated"><p><?php _e('Link added.'); ?></p></div>
+<div id="message" class="updated fade"><p><?php _e('Link added.'); ?></p></div>
 <?php endif; ?>
-<div class="wrap">
-<h2><?php _e('<strong>Add</strong> a link:') ?></h2>
-     <form name="addlink" method="post" action="link-manager.php">
-<fieldset class="options">
-	<legend><?php _e('Basics') ?></legend>
-        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
-         <tr>
-           <th width="33%" scope="row"><?php _e('URI:') ?></th>
-           <td width="67%"><input type="text" name="linkurl" value="<?php echo wp_specialchars($_GET['linkurl'], 1); ?>" style="width: 95%;" /></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Link Name:') ?></th>
-           <td><input type="text" name="name" value="<?php echo wp_specialchars( urldecode($_GET['name']), 1 ); ?>" style="width: 95%" /></td>
-         </tr>
-         <tr>
-         	<th scope="row"><?php _e('Short description:') ?></th>
-         	<td><input type="text" name="description" value="" style="width: 95%" /></td>
-         	</tr>
-        <tr>
-           <th scope="row"><?php _e('Category:') ?></th>
-           <td><?php category_dropdown('category'); ?></td>
-         </tr>
-</table>
-</fieldset>
-       <p class="submit">
-         <input type="submit" name="submit" value="<?php _e('Add Link &raquo;') ?>" /> 
-       </p>
-	<fieldset class="options">
-	<legend><?php _e('Link Relationship (XFN)') ?></legend>
-        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
-            <tr>
-                <th width="33%" scope="row"><?php _e('rel:') ?></th>
-            	<td width="67%"><input type="text" name="rel" id="rel" size="50" value="<?php echo $link_rel; ?>" /></td>
-           	</tr>
-            <tr>
-                <th scope="row"><?php _e('<a href="http://gmpg.org/xfn/">XFN</a> Creator:') ?></th>
-            	<td>
-					<table cellpadding="3" cellspacing="5">
-	          <tr>
-              <th scope="row"> <?php _e('identity') ?> </th>
-              <td>
-                <label for="me">
-                <input type="checkbox" name="identity" value="me" id="me" <?php xfn_check('identity', 'me'); ?> />
-          <?php _e('another web address of mine') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('friendship') ?> </th>
-              <td>
-			    <label for="contact">
-                <input class="valinp" type="radio" name="friendship" value="contact" id="contact" <?php xfn_check('friendship', 'contact', 'radio'); ?> /> <?php _e('contact') ?></label>
-                <label for="acquaintance">
-                <input class="valinp" type="radio" name="friendship" value="acquaintance" id="acquaintance" <?php xfn_check('friendship', 'acquaintance', 'radio'); ?> />  <?php _e('acquaintance') ?></label>
-                <label id="friend">
-                <input class="valinp" type="radio" name="friendship" value="friend" id="friend" <?php xfn_check('friendship', 'friend', 'radio'); ?> /> <?php _e('friend') ?></label>
-                <label for="friendship">
-                <input name="friendship" type="radio" class="valinp" value="" id="friendship" <?php xfn_check('friendship', '', 'radio'); ?> /> <?php _e('none') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('physical') ?> </th>
-              <td>
-                <label for="met">
-                <input class="valinp" type="checkbox" name="physical" value="met" id="met" <?php xfn_check('physical', 'met'); ?> />
-          <?php _e('met') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('professional') ?> </th>
-              <td>
-                <label for="co-worker">
-                <input class="valinp" type="checkbox" name="professional" value="co-worker" id="co-worker" <?php xfn_check('professional', 'co-worker'); ?> />
-          <?php _e('co-worker') ?></label>
-                <label for="colleague">
-                <input class="valinp" type="checkbox" name="professional" value="colleague" id="colleague" <?php xfn_check('professional', 'colleague'); ?> />
-          <?php _e('colleague') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('geographical') ?> </th>
-              <td>
-                <label for="co-resident">
-                <input class="valinp" type="radio" name="geographical" value="co-resident" id="co-resident" <?php xfn_check('geographical', 'co-resident', 'radio'); ?> />
-          <?php _e('co-resident') ?></label>
-                <label for="neighbor">
-                <input class="valinp" type="radio" name="geographical" value="neighbor" id="neighbor" <?php xfn_check('geographical', 'neighbor', 'radio'); ?> />
-          <?php _e('neighbor') ?></label>
-                <label for="geographical">
-                <input class="valinp" type="radio" name="geographical" value="" id="geographical" <?php xfn_check('geographical', '', 'radio'); ?> />
-          <?php _e('none') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('family'); ?> </th>
-              <td>
-                <label for="child">
-                <input class="valinp" type="radio" name="family" value="child" id="child" <?php xfn_check('family', 'child', 'radio'); ?>  />
-          <?php _e('child') ?></label>
-                <label for="kin">
-                <input class="valinp" type="radio" name="family" value="kin" id="kin" <?php xfn_check('family', 'kin', 'radio'); ?>  />
-          <?php _e('kin') ?></label>
-                <label for="parent">
-                <input class="valinp" type="radio" name="family" value="parent" id="parent" <?php xfn_check('family', 'parent', 'radio'); ?> />
-          <?php _e('parent') ?></label>
-                <label for="sibling">
-                <input class="valinp" type="radio" name="family" value="sibling" id="sibling" <?php xfn_check('family', 'sibling', 'radio'); ?> />
-          <?php _e('sibling') ?></label>
-                <label for="spouse">
-                <input class="valinp" type="radio" name="family" value="spouse" id="spouse" <?php xfn_check('family', 'spouse', 'radio'); ?> />
-          <?php _e('spouse') ?></label>
-                <label for="family">
-                <input class="valinp" type="radio" name="family" value="" id="family" <?php xfn_check('family', '', 'radio'); ?> />
-          <?php _e('none') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('romantic') ?> </th>
-              <td>
-                <label for="muse">
-                <input class="valinp" type="checkbox" name="romantic" value="muse" id="muse" <?php xfn_check('romantic', 'muse'); ?> />
-         <?php _e('muse') ?></label>
-                <label for="crush">
-                <input class="valinp" type="checkbox" name="romantic" value="crush" id="crush" <?php xfn_check('romantic', 'crush'); ?> />
-         <?php _e('crush') ?></label>
-                <label for="date">
-                <input class="valinp" type="checkbox" name="romantic" value="date" id="date" <?php xfn_check('romantic', 'date'); ?> />
-         <?php _e('date') ?></label>
-                <label for="romantic">
-                <input class="valinp" type="checkbox" name="romantic" value="sweetheart" id="romantic" <?php xfn_check('romantic', 'sweetheart'); ?> />
-         <?php _e('sweetheart') ?></label>
-              </td>
-            </tr>
-        </table>
-		  </td>
-           	</tr>
-</table>
-</fieldset>
-       <p class="submit">
-         <input type="submit" name="submit" value="<?php _e('Add Link &raquo;') ?>" /> 
-       </p>
-<fieldset class="options">
-	<legend><?php _e('Advanced') ?></legend>
-        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
-         <tr>
-           <th width="33%" scope="row"><?php _e('Image URI:') ?></th>
-           <td width="67%"><input type="text" name="image" size="50" value="" style="width: 95%" /></td>
-         </tr>
-<tr>
-           <th scope="row"><?php _e('RSS URI:') ?> </th>
-           <td><input name="rss_uri" type="text" id="rss_uri" value="" size="50" style="width: 95%" /></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Notes:') ?></th>
-           <td><textarea name="notes" cols="50" rows="10" style="width: 95%"></textarea></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Rating:') ?></th>
-           <td><select name="rating" size="1">
-             <?php
-    for ($r = 0; $r < 10; $r++) {
-      echo('            <option value="'.$r.'">'.$r.'</option>');
-    }
-?>
-           </select>
-           &nbsp;<?php _e('(Leave at 0 for no rating.)') ?> </td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Target') ?></th>
-           <td><label>
-             <input type="radio" name="target" value="_blank" />
-             <code>_blank</code></label>
-<br />
-<label><input type="radio" name="target" value="_top" />
-<code>_top</code></label>
-<br />
-<label><input type="radio" name="target" value="" checked="checked" />
-<?php _e('none') ?></label>
-<?php _e('(Note that the <code>target</code> attribute is illegal in XHTML 1.1 and 1.0 Strict.)') ?></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Visible:') ?></th>
-           <td><label>
-             <input type="radio" name="visible" checked="checked" value="Y" />
-<?php _e('Yes') ?></label><br />
-<label><input type="radio" name="visible" value="N" /> <input type="hidden" name="action" value="Add" /> 
-<?php _e('No') ?></label></td>
-         </tr>
-</table>
-</fieldset>
 
-       <p class="submit">
-         <input type="submit" name="submit" value="<?php _e('Add Link &raquo;') ?>" /> 
-       </p>
-  </form>
-</div>
+<?php
+	$link = get_default_link_to_edit();
+	include('edit-link-form.php');
+?>
 
 <div class="wrap">
 <?php printf(__('<p>You can drag <a href="%s" title="Link add bookmarklet">Link This</a> to your toolbar and when you click it a window will pop up that will allow you to add whatever site you&#8217;re on to your links! Right now this only works on Mozilla or Netscape, but we&#8217;re working on it.</p>'), "javascript:void(linkmanpopup=window.open('" . get_settings('siteurl') . "/wp-admin/link-add.php?action=popup&amp;linkurl='+escape(location.href)+'&amp;name='+escape(document.title),'LinkManager','scrollbars=yes,width=750,height=550,left=15,top=15,status=yes,resizable=yes'));linkmanpopup.focus();window.focus();linkmanpopup.focus();") ?>
diff -ruN 1.5.2/wp-admin/link-categories.php 2.0.4/wp-admin/link-categories.php
--- 1.5.2/wp-admin/link-categories.php	2005-03-15 10:35:13.000000000 -0600
+++ 2.0.4/wp-admin/link-categories.php	2006-07-23 13:41:48.000000000 -0500
@@ -5,6 +5,7 @@
 $title = __('Link Categories');
 $this_file='link-categories.php';
 $parent_file = 'link-manager.php';
+$list_js = true;
 
 $wpvarstoreset = array('action', 'cat', 'auto_toggle');
 for ($i=0; $i<count($wpvarstoreset); $i += 1) {
@@ -25,7 +26,9 @@
 switch ($action) {
   case 'addcat':
   {
-      if ($user_level < 5)
+      check_admin_referer('add-link-category');
+
+      if ( !current_user_can('manage_links') )
           die (__("Cheatin' uh ?"));
 
       $cat_name = wp_specialchars($_POST['cat_name']);
@@ -60,9 +63,9 @@
       if ($sort_desc != 'Y') {
           $sort_desc = 'N';
       }
-      $text_before_link = addslashes($_POST['text_before_link']);
-      $text_after_link = addslashes($_POST['text_after_link']);
-      $text_after_all = addslashes($_POST['text_after_all']);
+      $text_before_link = $_POST['text_before_link'];
+      $text_after_link = $_POST['text_after_link'];
+      $text_after_all = $_POST['text_after_all'];
 
       $list_limit = $_POST['list_limit'];
       if ($list_limit == '')
@@ -74,24 +77,26 @@
              " '$show_rating', '$show_updated', '$sort_order', '$sort_desc', '$text_before_link', '$text_after_link', \n" .
              " '$text_after_all', $list_limit)");
 
-      header('Location: link-categories.php');
+      wp_redirect('link-categories.php');
     break;
   } // end addcat
   case 'Delete':
   {
-    $cat_id = (int) $_GET['cat_id'];
+   	$cat_id = (int) $_GET['cat_id'];
+    check_admin_referer('delete-link-category_' . $cat_id);
+
     $cat_name=get_linkcatname($cat_id);
 
     if ($cat_id=="1")
         die(sprintf(__("Can't delete the <strong>%s</strong> link category: this is the default one"), $cat_name));
 
-    if ($user_level < 5)
+    if ( !current_user_can('manage_links') )
       die (__("Cheatin' uh ?"));
 
     $wpdb->query("DELETE FROM $wpdb->linkcategories WHERE cat_id='$cat_id'");
     $wpdb->query("UPDATE $wpdb->links SET link_category=1 WHERE link_category='$cat_id'");
 
-    header('Location: link-categories.php');
+    wp_redirect('link-categories.php');
     break;
   } // end delete
   case 'Edit':
@@ -111,6 +116,7 @@
   <h2><?php printf(__('Edit &#8220%s&#8221; Category'), wp_specialchars($row->cat_name)); ?></h2>
 
   <form name="editcat" method="post">
+  <?php wp_nonce_field('update-link-category_' . $row->cat_id) ?>
       <input type="hidden" name="action" value="editedcat" />
       <input type="hidden" name="cat_id" value="<?php echo $row->cat_id ?>" />
 <fieldset class="options">
@@ -176,15 +182,15 @@
 <table class="editform" width="100%" cellspacing="2" cellpadding="5">
 <tr>
 	<th width="33%" scope="row"><?php _e('Before Link:') ?></th>
-	<td width="67%"><input type="text" name="text_before_link" size="45" value="<?php echo wp_specialchars($row->text_before_link)?>" /></td>
+	<td width="67%"><input type="text" name="text_before_link" size="45" value="<?php echo wp_specialchars($row->text_before_link,'double')?>" /></td>
 </tr>
 <tr>
 <th scope="row"><?php _e('Between Link and Description:') ?></th>
-<td><input type="text" name="text_after_link" size="45" value="<?php echo wp_specialchars($row->text_after_link)?>" /></td>
+<td><input type="text" name="text_after_link" size="45" value="<?php echo wp_specialchars($row->text_after_link,'double')?>" /></td>
 </tr>
 <tr>
 <th scope="row"><?php _e('After Link:') ?></th>
-<td><input type="text" name="text_after_all" size="45" value="<?php echo wp_specialchars($row->text_after_all)?>"/></td>
+<td><input type="text" name="text_after_all" size="45" value="<?php echo wp_specialchars($row->text_after_all,'double')?>"/></td>
 </tr>
 </table>
 </fieldset>
@@ -198,14 +204,15 @@
   } // end Edit
   case "editedcat":
   {
-    if ($user_level < 5)
+    $cat_id = (int)$_POST["cat_id"];
+    check_admin_referer('update-link-category_' . $cat_id);
+
+    if ( !current_user_can('manage_links') )
       die (__("Cheatin' uh ?"));
 
     $submit=$_POST["submit"];
     if (isset($submit)) {
 
-    $cat_id = (int)$_POST["cat_id"];
-
     $cat_name= wp_specialchars($_POST["cat_name"]);
     $auto_toggle = $_POST["auto_toggle"];
     if ($auto_toggle != 'Y') {
@@ -238,9 +245,9 @@
     if ($sort_desc != 'Y') {
         $sort_desc = 'N';
     }
-    $text_before_link = addslashes($_POST["text_before_link"]);
-    $text_after_link = addslashes($_POST["text_after_link"]);
-    $text_after_all = addslashes($_POST["text_after_all"]);
+    $text_before_link = $_POST["text_before_link"];
+    $text_after_link = $_POST["text_after_link"];
+    $text_after_all = $_POST["text_after_all"];
 
     $list_limit = $_POST["list_limit"];
     if ($list_limit == '')
@@ -264,20 +271,19 @@
     } // end if save
 
 
-    header("Location: link-categories.php");
+    wp_redirect("link-categories.php");
     break;
   } // end editcat
   default:
   {
     include_once ("admin-header.php");
-    if ($user_level < 5) {
+    if ( !current_user_can('manage_links') )
       die(__("You have do not have sufficient permissions to edit the link categories for this blog. :)"));
-    }
 ?>
 
 <div class="wrap">
             <h2><?php _e('Link Categories:') ?></h2>
-            <table width="100%" cellpadding="5" cellspacing="0" border="0">
+            <table id="the-list" width="100%" cellpadding="5" cellspacing="0" border="0">
               <tr>
  	        <th rowspan="2" valign="bottom"><?php _e('Name') ?></th>
                 <th rowspan="2" valign="bottom"><?php _e('ID') ?></th>
@@ -335,7 +341,7 @@
     		break;
     }
 ?>
-              <tr valign="middle" align="center" <?php echo $style ?> style="border-bottom: 1px dotted #9C9A9C;">
+              <tr id="link-category-<?php echo $row->cat_id; ?>" valign="middle" align="center" <?php echo $style ?> style="border-bottom: 1px dotted #9C9A9C;">
                 <td><?php echo wp_specialchars($row->cat_name)?></td>
 				<td ><?php echo $row->cat_id?></td>
                 <td><?php echo $row->auto_toggle == 'Y' ? __('Yes') : __('No') ?></td>
@@ -345,12 +351,12 @@
                 <td><?php echo $row->show_updated == 'Y' ? __('Yes') : __('No') ?></td>
                 <td><?php echo $row->sort_order ?></td>
                 <td><?php echo $row->sort_desc == 'Y' ? __('Yes') : __('No') ?></td>
-                <td nowrap="nowrap"><?php echo htmlentities($row->text_before_link)?>&nbsp;</td>
-                <td nowrap="nowrap"><?php echo htmlentities($row->text_after_link)?>&nbsp;</td>
-                <td nowrap="nowrap"><?php echo htmlentities($row->text_after_all)?></td>
+                <td nowrap="nowrap"><?php echo wp_specialchars($row->text_before_link)?>&nbsp;</td>
+                <td nowrap="nowrap"><?php echo wp_specialchars($row->text_after_link)?>&nbsp;</td>
+                <td nowrap="nowrap"><?php echo wp_specialchars($row->text_after_all)?></td>
                 <td><?php echo $row->list_limit ?></td>
                 <td><a href="link-categories.php?cat_id=<?php echo $row->cat_id?>&amp;action=Edit" class="edit"><?php _e('Edit') ?></a></td>
-                <td><a href="link-categories.php?cat_id=<?php echo $row->cat_id?>&amp;action=Delete" onclick="return confirm('<?php _e("You are about to delete this category.\\n  \'Cancel\' to stop, \'OK\' to delete.") ?>');" class="delete"><?php _e('Delete') ?></a></td>
+                <td><a href="<?php echo wp_nonce_url("link-categories.php?cat_id=$row->cat_id?>&amp;action=Delete", 'delete-link-category_' . $row->cat_id) ?>" onclick="return deleteSomething( 'link category', <?php echo $row->cat_id . ", '" . sprintf(__("You are about to delete the &quot;%s&quot; link category.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape($row->cat_name)); ?>' );" class="delete"><?php _e('Delete') ?></a></td>
               </tr>
 <?php
         ++$i;
@@ -359,10 +365,13 @@
             </table>
 <p><?php _e('These are the defaults for when you call a link category with no additional arguments. All of these settings may be overwritten.') ?></p>
 
+<div id="ajax-response"></div>
+
 </div>
 
 <div class="wrap">
-    <form name="addcat" method="post">
+    <form name="addcat" method="post" action="">
+    <?php wp_nonce_field('add-link-category'); ?>
       <input type="hidden" name="action" value="addcat" />
 	  <h2><?php _e('Add a Link Category:') ?></h2>
 <fieldset class="options">
@@ -443,7 +452,7 @@
 </div>
 <div class="wrap">
     <h3><?php _e('Note:') ?></h3>
-    <?php printf(__('<p>Deleting a link category does not delete links from that category.<br />It will just set them back to the default category <b>%s</b>.'), get_linkcatname(1)) ?></p>
+	<p><?php printf(__('Deleting a link category does not delete links from that category.<br />It will just set them back to the default category <strong>%s</strong>.'), get_linkcatname(1)) ?></p>
 </div>
 <?php
     break;
diff -ruN 1.5.2/wp-admin/link-import.php 2.0.4/wp-admin/link-import.php
--- 1.5.2/wp-admin/link-import.php	2005-03-15 10:38:59.000000000 -0600
+++ 2.0.4/wp-admin/link-import.php	2006-05-11 18:05:45.000000000 -0500
@@ -15,48 +15,48 @@
     case 0:
     {
         include_once('admin-header.php');
-        if ($user_level < 5)
+        if ( !current_user_can('manage_links') )
             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.'); ?>
+<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%; float: left;">
+<h3><?php _e('Specify an OPML URL:'); ?></h3>
+<input type="text" name="opml_url" size="50" style="width: 90%;" value="http://" />
+</div>
+
+<div style="width: 48%; float: left;">
+<h3><?php _e('Or choose from your local disk:'); ?></h3>
+<input id="userfile" name="userfile" type="file" size="30" />
+</div>
+
+
+</div>
+
+<p style="clear: both; margin-top: 1em;"><?php _e('Now select a category you want to put these links in.') ?><br />
+<?php _e('Category:') ?> <select name="cat_id">
+<?php
+$categories = $wpdb->get_results("SELECT cat_id, cat_name, auto_toggle FROM $wpdb->linkcategories ORDER BY cat_id");
+foreach ($categories as $category) {
+?>
+<option value="<?php echo $category->cat_id; ?>"><?php echo $category->cat_id.': '.$category->cat_name; ?></option>
+<?php
+} // end foreach
+?>
+</select></p>
 
-    <h2><?php _e('Import your blogroll from another system') ?> </h2>
-	<!-- <form name="blogroll" action="link-import.php" method="get"> -->
-	<form enctype="multipart/form-data" action="link-import.php" method="post" name="blogroll">
-
-	<ol>
-    <li><?php _e('Go to <a href="http://www.blogrolling.com">Blogrolling.com</a> and sign in. Once you&#8217;ve done that, click on <strong>Get Code</strong>, and then look for the <strong><abbr title="Outline Processor Markup Language">OPML</abbr> code</strong>') ?>.</li>
-    <li><?php _e('Or go to <a href="http://blo.gs">Blo.gs</a> and sign in. Once you&#8217;ve done that in the \'Welcome Back\' box on the right, click on <strong>share</strong>, and then look for the <strong><abbr title="Outline Processor Markup Language">OPML</abbr> link</strong> (favorites.opml).') ?></li>
-    <li><?php _e('Select that text and copy it or copy the link/shortcut into the box below.') ?><br />
-       <input type="hidden" name="step" value="1" />
-       <?php _e('Your OPML URL:') ?> <input type="text" name="opml_url" size="65" />
-	</li>
-    <li>
-	   <?php _e('<strong>or</strong> you can upload an OPML file from your desktop aggregator:') ?><br />
-       <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
-       <label><?php _e('Upload this file:') ?> <input name="userfile" type="file" /></label>
-    </li>
-
-    <li><?php _e('Now select a category you want to put these links in.') ?><br />
-	<?php _e('Category:') ?> <select name="cat_id">
-<?php
-	$categories = $wpdb->get_results("SELECT cat_id, cat_name, auto_toggle FROM $wpdb->linkcategories ORDER BY cat_id");
-	foreach ($categories as $category) {
-?>
-    <option value="<?php echo $category->cat_id; ?>"><?php echo $category->cat_id.': '.$category->cat_name; ?></option>
-<?php
-        } // end foreach
-?>
-    </select>
-
-	</li>
-
-    <li><input type="submit" name="submit" value="<?php _e('Import!') ?>" /></li>
-	</ol>
-    </form>
+<p class="submit"><input type="submit" name="submit" value="<?php _e('Import OPML File') ?> &raquo;" /></p>
+</form>
 
 </div>
 <?php
@@ -64,8 +64,10 @@
             } // end case 0
 
     case 1: {
+		check_admin_referer('import-bookmarks');
+
                 include_once('admin-header.php');
-                if ($user_level < 5)
+                if ( !current_user_can('manage_links') )
                     die (__("Cheatin' uh ?"));
 ?>
 <div class="wrap">
@@ -78,26 +80,24 @@
                 }
 
                 $opml_url = $_POST['opml_url'];
-                if (isset($opml_url) && $opml_url != '') {
+                if (isset($opml_url) && $opml_url != '' && $opml_url != 'http://') {
 					$blogrolling = true;
                 }
                 else // try to get the upload file.
 				{
-					$uploaddir = get_settings('fileupload_realpath');
-					$uploadfile = $uploaddir.'/'.$_FILES['userfile']['name'];
+					$overrides = array('test_form' => false, 'test_type' => false);
+					$file = wp_handle_upload($_FILES['userfile'], $overrides);
+
+					if ( isset($file['error']) )
+						die($file['error']);
 
-					if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
-					{
-						//echo "Upload successful.";
-						$blogrolling = false;
-						$opml_url = $uploadfile;
-					} else {
-						echo __("Upload error");
-					}
+					$url = $file['url'];
+					$opml_url = $file['file'];
+					$blogrolling = false;
 				}
 
                 if (isset($opml_url) && $opml_url != '') {
-                    $opml = implode('', file($opml_url));
+                    $opml = wp_remote_fopen($opml_url);
                     include_once('link-parse-opml.php');
 
                     $link_count = count($names);
@@ -106,10 +106,11 @@
                             $titles[$i] = '';
                         if ('http' == substr($titles[$i], 0, 4))
                             $titles[$i] = '';
+                        // FIXME:  Use wp_insert_link().
                         $query = "INSERT INTO $wpdb->links (link_url, link_name, link_target, link_category, link_description, link_owner, link_rss)
-                                VALUES('{$urls[$i]}', '".addslashes($names[$i])."', '', $cat_id, '".addslashes($descriptions[$i])."', $user_ID, '{$feeds[$i]}')\n";
+                                VALUES('{$urls[$i]}', '".$wpdb->escape($names[$i])."', '', $cat_id, '".$wpdb->escape($descriptions[$i])."', $user_ID, '{$feeds[$i]}')\n";
                         $result = $wpdb->query($query);
-                        echo sprintf(__("<p>Inserted <strong>%s</strong></p>"), $names[$i]);
+						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>
@@ -120,12 +121,15 @@
                     echo "<p>" . __("You need to supply your OPML url. Press back on your browser and try again") . "</p>\n";
                 } // end else
 
+				if ( ! $blogrolling )
+					@unlink($opml_url);
 ?>
 </div>
 <?php
                 break;
             } // end case 1
 } // end switch
+
+include('admin-footer.php');
+
 ?>
-</body>
-</html>
diff -ruN 1.5.2/wp-admin/link-manager.php 2.0.4/wp-admin/link-manager.php
--- 1.5.2/wp-admin/link-manager.php	2005-04-08 23:32:38.000000000 -0500
+++ 2.0.4/wp-admin/link-manager.php	2006-07-05 12:09:32.000000000 -0500
@@ -6,39 +6,7 @@
 
 $title = __('Manage Links');
 $this_file = $parent_file = 'link-manager.php';
-
-function xfn_check($class, $value = '', $type = 'check') {
-	global $link_rel;
-	$rels = preg_split('/\s+/', $link_rel);
-
-	if ('' != $value && in_array($value, $rels) ) {
-		echo ' checked="checked"';
-	}
-
-	if ('' == $value) {
-		if ('family' == $class && !strstr($link_rel, 'child') && !strstr($link_rel, 'parent') && !strstr($link_rel, 'sibling') && !strstr($link_rel, 'spouse') && !strstr($link_rel, 'kin')) echo ' checked="checked"';
-		if ('friendship' == $class && !strstr($link_rel, 'friend') && !strstr($link_rel, 'acquaintance') && !strstr($link_rel, 'contact') ) echo ' checked="checked"';
-		if ('geographical' == $class && !strstr($link_rel, 'co-resident') && !strstr($link_rel, 'neighbor') ) echo ' checked="checked"';
-		if ('identity' == $class && in_array('me', $rels) ) echo ' checked="checked"';
-	}
-}
-
-function category_dropdown($fieldname, $selected = 0) {
-	global $wpdb;
-	
-	$results = $wpdb->get_results("SELECT cat_id, cat_name, auto_toggle FROM $wpdb->linkcategories ORDER BY cat_id");
-	echo "\n<select name='$fieldname' size='1'>";
-	foreach ($results as $row) {
-		echo "\n\t<option value='$row->cat_id'";
-		if ($row->cat_id == $selected)
-			echo " selected='selected'";
-		echo ">$row->cat_id: ".wp_specialchars($row->cat_name);
-		if ('Y' == $row->auto_toggle)
-			echo ' (auto toggle)';
-		echo "</option>\n";
-	}
-	echo "\n</select>\n";
-}
+$list_js = true;
 
 $wpvarstoreset = array('action','cat_id', 'linkurl', 'name', 'image',
                        'description', 'visible', 'target', 'category', 'link_id',
@@ -71,45 +39,43 @@
 switch ($action) {
   case 'assign':
   {
-    check_admin_referer();
+	check_admin_referer('bulk-bookmarks');
 
     // check the current user's level first.
-    if ($user_level < 5)
+    if ( !current_user_can('manage_links') )
       die (__("Cheatin' uh ?"));
 
     //for each link id (in $linkcheck[]): if the current user level >= the
     //userlevel of the owner of the link then we can proceed.
 
     if (count($linkcheck) == 0) {
-        header('Location: ' . $this_file);
+        wp_redirect($this_file);
         exit;
     }
     $all_links = join(',', $linkcheck);
-    $results = $wpdb->get_results("SELECT link_id, link_owner, user_level FROM $wpdb->links LEFT JOIN $wpdb->users ON link_owner = ID WHERE link_id in ($all_links)");
+    $results = $wpdb->get_results("SELECT link_id, link_owner FROM $wpdb->links LEFT JOIN $wpdb->users ON link_owner = ID WHERE link_id in ($all_links)");
     foreach ($results as $row) {
-      if (($user_level >= $row->user_level)) { // ok to proceed
-        $ids_to_change[] = $row->link_id;
-      }
+       $ids_to_change[] = $row->link_id;
     }
 
     // should now have an array of links we can change
     $all_links = join(',', $ids_to_change);
     $q = $wpdb->query("update $wpdb->links SET link_owner='$newowner' WHERE link_id IN ($all_links)");
 
-    header('Location: ' . $this_file);
+    wp_redirect($this_file);
     break;
   }
   case 'visibility':
   {
-    check_admin_referer();
+  	check_admin_referer('bulk-bookmarks');
 
     // check the current user's level first.
-    if ($user_level < 5)
+    if ( !current_user_can('manage_links') )
       die (__("Cheatin' uh ?"));
 
     //for each link id (in $linkcheck[]): toggle the visibility
     if (count($linkcheck) == 0) {
-        header('Location: ' . $this_file);
+        wp_redirect($this_file);
         exit;
     }
     $all_links = join(',', $linkcheck);
@@ -133,131 +99,71 @@
         $q = $wpdb->query("update $wpdb->links SET link_visible='Y' WHERE link_id IN ($all_linkson)");
     }
 
-    header('Location: ' . $this_file);
+    wp_redirect($this_file);
     break;
   }
   case 'move':
   {
-    check_admin_referer();
+	check_admin_referer('bulk-bookmarks');
 
     // check the current user's level first.
-    if ($user_level < 5)
+    if ( !current_user_can('manage_links') )
       die (__("Cheatin' uh ?"));
 
     //for each link id (in $linkcheck[]) change category to selected value
     if (count($linkcheck) == 0) {
-        header('Location: ' . $this_file);
+        wp_redirect($this_file);
         exit;
     }
     $all_links = join(',', $linkcheck);
     // should now have an array of links we can change
     $q = $wpdb->query("update $wpdb->links SET link_category='$category' WHERE link_id IN ($all_links)");
 
-    header('Location: ' . $this_file);
+    wp_redirect($this_file);
     break;
   }
 
   case 'Add':
   {
-    check_admin_referer();
-
-    $link_url = wp_specialchars($_POST['linkurl']);
-    $link_url = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $link_url) ? $link_url : 'http://' . $link_url; 
-    $link_name = wp_specialchars($_POST['name']);
-    $link_image = wp_specialchars($_POST['image']);
-    $link_target = $_POST['target'];
-    $link_category = $_POST['category'];
-    $link_description = $_POST['description'];
-    $link_visible = $_POST['visible'];
-    $link_rating = $_POST['rating'];
-    $link_rel = $_POST['rel'];
-    $link_notes = $_POST['notes'];
-	$link_rss_uri =  wp_specialchars($_POST['rss_uri']);
-    $auto_toggle = get_autotoggle($link_category);
-
-    if ($user_level < 5)
-      die (__("Cheatin' uh ?"));
-
-    // if we are in an auto toggle category and this one is visible then we
-    // need to make the others invisible before we add this new one.
-    if (($auto_toggle == 'Y') && ($link_visible == 'Y')) {
-      $wpdb->query("UPDATE $wpdb->links set link_visible = 'N' WHERE link_category = $link_category");
-    }
-    $wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_image, link_target, link_category, link_description, link_visible, link_owner, link_rating, link_rel, link_notes, link_rss) " .
-      " VALUES('" . $link_url . "','"
-           . $link_name . "', '"
-           . $link_image . "', '$link_target', $link_category, '"
-           . $link_description . "', '$link_visible', $user_ID, $link_rating, '" . $link_rel . "', '" . $link_notes . "', '$link_rss_uri')");
+  	check_admin_referer('add-bookmark');
 
-    header('Location: ' . $_SERVER['HTTP_REFERER'] . '?added=true');
+	add_link();
+	
+    wp_redirect(wp_get_referer() . '?added=true');
     break;
   } // end Add
 
   case 'editlink':
   {
-    if (isset($submit)) {
-
-      if (isset($links_show_cat_id) && ($links_show_cat_id != ''))
-        $cat_id = $links_show_cat_id;
+	$link_id = (int) $_POST['link_id'];
+	check_admin_referer('update-bookmark_' . $link_id);
+ 	
+	if (isset($links_show_cat_id) && ($links_show_cat_id != ''))
+		$cat_id = $links_show_cat_id;
+
+	if (!isset($cat_id) || ($cat_id == '')) {
+		if (!isset($links_show_cat_id) || ($links_show_cat_id == ''))
+			$cat_id = 'All';
+	}
+	$links_show_cat_id = $cat_id;
 
-      if (!isset($cat_id) || ($cat_id == '')) {
-        if (!isset($links_show_cat_id) || ($links_show_cat_id == ''))
-          $cat_id = 'All';
-      }
-      $links_show_cat_id = $cat_id;
-
-      check_admin_referer();
-
-      $link_id = (int) $_POST['link_id'];
-      $link_url = wp_specialchars($_POST['linkurl']);
-      $link_url = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $link_url) ? $link_url : 'http://' . $link_url; 
-      $link_name = wp_specialchars($_POST['name']);
-      $link_image = wp_specialchars($_POST['image']);
-      $link_target = wp_specialchars($_POST['target']);
-      $link_category = $_POST['category'];
-      $link_description = $_POST['description'];
-      $link_visible = $_POST['visible'];
-      $link_rating = $_POST['rating'];
-      $link_rel = $_POST['rel'];
-      $link_notes = $_POST['notes'];
-	  $link_rss_uri =  $_POST['rss_uri'];
-      $auto_toggle = get_autotoggle($link_category);
-
-      if ($user_level < 5)
-        die (__("Cheatin' uh ?"));
-
-      // if we are in an auto toggle category and this one is visible then we
-      // need to make the others invisible before we update this one.
-      if (($auto_toggle == 'Y') && ($link_visible == 'Y')) {
-        $wpdb->query("UPDATE $wpdb->links set link_visible = 'N' WHERE link_category = $link_category");
-      }
-
-      $wpdb->query("UPDATE $wpdb->links SET link_url='" . $link_url . "',
-	  link_name='" . $link_name . "',\n link_image='" . $link_image . "',
-	  link_target='$link_target',\n link_category=$link_category,
-	  link_visible='$link_visible',\n link_description='" . $link_description . "',
-	  link_rating=$link_rating,
-	  link_rel='" . $link_rel . "',
-	  link_notes='" . $link_notes . "',
-	  link_rss = '$link_rss_uri'
-	  WHERE link_id=$link_id");
-    } // end if save
+	edit_link($link_id);
+	
     setcookie('links_show_cat_id_' . COOKIEHASH, $links_show_cat_id, time()+600);
     wp_redirect($this_file);
     break;
   } // end Save
 
-  case 'Delete':
+  case 'delete':
   {
-    check_admin_referer();
-
-    $link_id = (int) $_GET['link_id'];
+	$link_id = (int) $_GET['link_id'];
+	check_admin_referer('delete-bookmark_' . $link_id);
 
-    if ($user_level < 5)
+    if ( !current_user_can('manage_links') )
       die (__("Cheatin' uh ?"));
 
-    $wpdb->query("DELETE FROM $wpdb->links WHERE link_id = $link_id");
-
+	wp_delete_link($link_id);
+	
     if (isset($links_show_cat_id) && ($links_show_cat_id != ''))
         $cat_id = $links_show_cat_id;
 
@@ -272,233 +178,18 @@
   } // end Delete
 
   case 'linkedit': {
-	$xfn = true;
-    include_once ('admin-header.php');
-    if ($user_level < 5)
-      die(__('You do not have sufficient permissions to edit the links for this blog.'));
-
-    $link_id = (int) $_GET['link_id'];
-    $row = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = $link_id");
-
-    if ($row) {
-      $link_url = wp_specialchars($row->link_url, 1);
-      $link_name = wp_specialchars($row->link_name, 1);
-      $link_image = $row->link_image;
-      $link_target = $row->link_target;
-      $link_category = $row->link_category;
-      $link_description = wp_specialchars($row->link_description);
-      $link_visible = $row->link_visible;
-      $link_rating = $row->link_rating;
-      $link_rel = $row->link_rel;
-      $link_notes = wp_specialchars($row->link_notes);
-	  $link_rss_uri = wp_specialchars($row->link_rss);
-    } else {
-		die( __('Link not found.') ); 
-	}
-
-?>
-
-<div class="wrap"> 
-  <form action="" method="post" name="editlink" id="editlink"> 
-  <h2><?php _e('Edit a link:') ?></h2>
-<fieldset class="options">
-    <legend><?php _e('Basics') ?></legend>
-        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
-         <tr>
-           <th width="33%" scope="row"><?php _e('URI:') ?></th>
-           <td width="67%"><input type="text" name="linkurl" value="<?php echo $link_url; ?>" style="width: 95%;" /></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Link Name:') ?></th>
-           <td><input type="text" name="name" value="<?php echo $link_name; ?>" style="width: 95%" /></td>
-         </tr>
-         <tr>
-            <th scope="row"><?php _e('Short description:') ?></th>
-         	<td><input type="text" name="description" value="<?php echo $link_description; ?>" style="width: 95%" /></td>
-         	</tr>
-        <tr>
-           <th scope="row"><?php _e('Category:') ?></th>
-           <td><?php category_dropdown('category', $link_category); ?></td>
-         </tr>
-</table>
-</fieldset>
-       <p class="submit">
-       <input type="submit" name="submit" value="<?php _e('Save Changes &raquo;') ?>" />
-       </p>
-	<fieldset class="options">
-        <legend><?php _e('Link Relationship (XFN)') ?></legend>
-        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
-            <tr>
-                <th width="33%" scope="row"><?php _e('rel:') ?></th>
-            	<td width="67%"><input type="text" name="rel" id="rel" size="50" value="<?php echo $link_rel; ?>" /></td>
-           	</tr>
-            <tr>
-                <th scope="row"><?php _e('<a href="http://gmpg.org/xfn/">XFN</a> Creator:') ?></th>
-            	<td>
-					<table cellpadding="3" cellspacing="5">
-	          <tr>
-              <th scope="row"> <?php _e('identity') ?> </th>
-              <td>
-                <label for="me">
-                <input type="checkbox" name="identity" value="me" id="me" <?php xfn_check('identity', 'me'); ?> />
-          <?php _e('another web address of mine') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('friendship') ?> </th>
-              <td>
-			    <label for="contact">
-                <input class="valinp" type="radio" name="friendship" value="contact" id="contact" <?php xfn_check('friendship', 'contact', 'radio'); ?> /> <?php _e('contact') ?></label>
-                <label for="acquaintance">
-                <input class="valinp" type="radio" name="friendship" value="acquaintance" id="acquaintance" <?php xfn_check('friendship', 'acquaintance', 'radio'); ?> />  <?php _e('acquaintance') ?></label>
-                <label id="friend">
-                <input class="valinp" type="radio" name="friendship" value="friend" id="friend" <?php xfn_check('friendship', 'friend', 'radio'); ?> /> <?php _e('friend') ?></label>
-                <label for="friendship">
-                <input name="friendship" type="radio" class="valinp" value="" id="friendship" <?php xfn_check('friendship', '', 'radio'); ?> /> <?php _e('none') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('physical') ?> </th>
-              <td>
-                <label for="met">
-                <input class="valinp" type="checkbox" name="physical" value="met" id="met" <?php xfn_check('physical', 'met'); ?> />
-          <?php _e('met') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('professional') ?> </th>
-              <td>
-                <label for="co-worker">
-                <input class="valinp" type="checkbox" name="professional" value="co-worker" id="co-worker" <?php xfn_check('professional', 'co-worker'); ?> />
-          <?php _e('co-worker') ?></label>
-                <label for="colleague">
-                <input class="valinp" type="checkbox" name="professional" value="colleague" id="colleague" <?php xfn_check('professional', 'colleague'); ?> />
-          <?php _e('colleague') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('geographical') ?> </th>
-              <td>
-                <label for="co-resident">
-                <input class="valinp" type="radio" name="geographical" value="co-resident" id="co-resident" <?php xfn_check('geographical', 'co-resident', 'radio'); ?> />
-          <?php _e('co-resident') ?></label>
-                <label for="neighbor">
-                <input class="valinp" type="radio" name="geographical" value="neighbor" id="neighbor" <?php xfn_check('geographical', 'neighbor', 'radio'); ?> />
-          <?php _e('neighbor') ?></label>
-                <label for="geographical">
-                <input class="valinp" type="radio" name="geographical" value="" id="geographical" <?php xfn_check('geographical', '', 'radio'); ?> />
-          <?php _e('none') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('family') ?> </th>
-              <td>
-                <label for="child">
-                <input class="valinp" type="radio" name="family" value="child" id="child" <?php xfn_check('family', 'child', 'radio'); ?>  />
-          <?php _e('child') ?></label>
-                <label for="kin">
-                <input class="valinp" type="radio" name="family" value="kin" id="kin" <?php xfn_check('family', 'kin', 'radio'); ?>  />
-          <?php _e('kin') ?></label>
-                <label for="parent">
-                <input class="valinp" type="radio" name="family" value="parent" id="parent" <?php xfn_check('family', 'parent', 'radio'); ?> />
-          <?php _e('parent') ?></label>
-                <label for="sibling">
-                <input class="valinp" type="radio" name="family" value="sibling" id="sibling" <?php xfn_check('family', 'sibling', 'radio'); ?> />
-          <?php _e('sibling') ?></label>
-                <label for="spouse">
-                <input class="valinp" type="radio" name="family" value="spouse" id="spouse" <?php xfn_check('family', 'spouse', 'radio'); ?> />
-          <?php _e('spouse') ?></label>
-                <label for="family">
-                <input class="valinp" type="radio" name="family" value="" id="family" <?php xfn_check('family', '', 'radio'); ?> />
-          <?php _e('none') ?></label>
-              </td>
-            </tr>
-            <tr>
-              <th scope="row"> <?php _e('romantic') ?> </th>
-              <td>
-                <label for="muse">
-                <input class="valinp" type="checkbox" name="romantic" value="muse" id="muse" <?php xfn_check('romantic', 'muse'); ?> />
-         <?php _e('muse') ?></label>
-                <label for="crush">
-                <input class="valinp" type="checkbox" name="romantic" value="crush" id="crush" <?php xfn_check('romantic', 'crush'); ?> />
-         <?php _e('crush') ?></label>
-                <label for="date">
-                <input class="valinp" type="checkbox" name="romantic" value="date" id="date" <?php xfn_check('romantic', 'date'); ?> />
-         <?php _e('date') ?></label>
-                <label for="romantic">
-                <input class="valinp" type="checkbox" name="romantic" value="sweetheart" id="romantic" <?php xfn_check('romantic', 'sweetheart'); ?> />
-         <?php _e('sweetheart') ?></label>
-              </td>
-            </tr>
-        </table>
-		  </td>
-           	</tr>
-</table>
-</fieldset>
-       <p class="submit">
-       <input type="submit" name="submit" value="<?php _e('Save Changes &raquo;') ?>" />
-       </p>
-<fieldset class="options">
-        <legend><?php _e('Advanced') ?></legend>
-        <table class="editform" width="100%" cellspacing="2" cellpadding="5">
-         <tr>
-           <th width="33%" scope="row"><?php _e('Image URI:') ?></th>
-           <td width="67%"><input type="text" name="image" size="50" value="<?php echo $link_image; ?>" style="width: 95%" /></td>
-         </tr>
-<tr>
-           <th scope="row"><?php _e('RSS URI:') ?> </th>
-           <td><input name="rss_uri" type="text" id="rss_uri" value="<?php echo $link_rss_uri; ?>" size="50" style="width: 95%" /></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Notes:') ?></th>
-           <td><textarea name="notes" cols="50" rows="10" style="width: 95%"><?php echo $link_notes; ?></textarea></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Rating:') ?></th>
-           <td><select name="rating" size="1">
-<?php
-    for ($r = 0; $r < 10; $r++) {
-      echo('            <option value="'.$r.'" ');
-      if ($link_rating == $r)
-        echo 'selected="selected"';
-      echo('>'.$r.'</option>');
-    }
-?>
-           </select>
-         &nbsp;<?php _e('(Leave at 0 for no rating.)') ?> </td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Target') ?></th>
-           <td><label>
-          <input type="radio" name="target" value="_blank"   <?php echo(($link_target == '_blank') ? 'checked="checked"' : ''); ?> />
-          <code>_blank</code></label><br />
-<label>
-<input type="radio" name="target" value="_top" <?php echo(($link_target == '_top') ? 'checked="checked"' : ''); ?> />
-<code>_top</code></label><br />
-<label>
-<input type="radio" name="target" value=""     <?php echo(($link_target == '') ? 'checked="checked"' : ''); ?> />
-<?php _e('none') ?></label><br />
-<?php _e('(Note that the <code>target</code> attribute is illegal in XHTML 1.1 and 1.0 Strict.)') ?></td>
-         </tr>
-         <tr>
-           <th scope="row"><?php _e('Visible:') ?></th>
-           <td><label>
-             <input type="radio" name="visible" <?php if ($link_visible == 'Y') echo "checked='checked'"; ?> value="Y" />
-<?php _e('Yes') ?></label><br /><label>
-<input type="radio" name="visible" <?php if ($link_visible == 'N') echo "checked='checked'"; ?> value="N" />
-<?php _e('No') ?></label></td>
-         </tr>
-</table>
-</fieldset>
-<p class="submit"><input type="submit" name="submit" value="<?php _e('Save Changes &raquo;') ?>" />
-          <input type="hidden" name="action" value="editlink" />
-          <input type="hidden" name="link_id" value="<?php echo (int) $link_id; ?>" />
-          <input type="hidden" name="order_by" value="<?php echo wp_specialchars($order_by, 1); ?>" />
-          <input type="hidden" name="cat_id" value="<?php echo (int) $cat_id ?>" /></p>
-  </form> 
-</div>
-<?php
-    break;
+	$xfn_js = true;
+	include_once ('admin-header.php');
+	if ( !current_user_can('manage_links') )
+		die(__('You do not have sufficient permissions to edit the links for this blog.'));
+	
+	$link_id = (int) $_GET['link_id'];
+	
+	if ( !$link = get_link_to_edit($link_id) )
+		die( __('Link not found.') );
+	
+	include('edit-link-form.php');
+	break;
   } // end linkedit
   case __("Show"):
   {
@@ -540,9 +231,8 @@
     setcookie('links_show_cat_id_' . COOKIEHASH, $links_show_cat_id, time()+600);
     setcookie('links_show_order_' . COOKIEHASH, $links_show_order, time()+600);
     include_once ("./admin-header.php");
-    if ($user_level < 5) {
+    if ( !current_user_can('manage_links') )
       die(__("You do not have sufficient permissions to edit the links for this blog."));
-    }
 
     switch ($order_by)
     {
@@ -600,7 +290,7 @@
         echo " selected='selected'";
         echo ">".$row->cat_id.": ".wp_specialchars($row->cat_name);
         if ($row->auto_toggle == 'Y')
-            echo ' (auto toggle)';
+            echo ' '.__('(auto toggle)');
         echo "</option>\n";
     }
     echo "        </select>\n";
@@ -628,11 +318,12 @@
 <form name="links" id="links" method="post" action="">
 <div class="wrap">
 
+    <?php wp_nonce_field('bulk-bookmarks') ?>
     <input type="hidden" name="link_id" value="" />
     <input type="hidden" name="action" value="" />
     <input type="hidden" name="order_by" value="<?php echo wp_specialchars($order_by, 1); ?>" />
     <input type="hidden" name="cat_id" value="<?php echo (int) $cat_id ?>" />
-  <table width="100%" cellpadding="3" cellspacing="3">
+  <table id="the-list-x" width="100%" cellpadding="3" cellspacing="3">
     <tr>
       <th width="15%"><?php _e('Name') ?></th>
       <th><?php _e('URI') ?></th>
@@ -646,7 +337,7 @@
 <?php
     $sql = "SELECT link_url, link_name, link_image, link_description, link_visible,
             link_category AS cat_id, cat_name AS category, $wpdb->users.user_login, link_id,
-            link_rating, link_rel, $wpdb->users.user_level
+            link_rating, link_rel
             FROM $wpdb->links
             LEFT JOIN $wpdb->linkcategories ON $wpdb->links.link_category = $wpdb->linkcategories.cat_id
             LEFT JOIN $wpdb->users ON $wpdb->users.ID = $wpdb->links.link_owner ";
@@ -674,9 +365,9 @@
             $image = ($link->link_image != null) ? __('Yes') : __('No');
             $visible = ($link->link_visible == 'Y') ? __('Yes') : __('No');
             ++$i;
-            $style = ($i % 2) ? ' class="alternate"' : '';
+            $style = ($i % 2) ? '' : ' class="alternate"';
 ?>
-    <tr valign="middle" <?php echo $style; ?>>
+    <tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>>
 		<td><strong><?php echo $link->link_name; ?></strong><br />
 <?php			
         echo sprintf(__('Description: %s'), $link->link_description) . "</td>";
@@ -689,23 +380,22 @@
 LINKS;
             $show_buttons = 1; // default
 
-            if ($link->user_level > $user_level) {
-              $show_buttons = 0;
-            }
-
             if ($show_buttons) {
         echo '<td><a href="link-manager.php?link_id=' . $link->link_id . '&amp;action=linkedit" class="edit">' . __('Edit') . '</a></td>';
-        echo '<td><a href="link-manager.php?link_id=' . $link->link_id . '&amp;action=Delete"' .  " onclick=\"return confirm('" . __("You are about to delete this link.\\n  \'Cancel\' to stop, \'OK\' to delete.") .  "');" . '" class="delete">' . __('Delete') . '</a></td>';
+ 		echo '<td><a href="' . wp_nonce_url('link-manager.php?link_id='.$link->link_id.'&amp;action=delete', 'delete-bookmark_' . $link->link_id ) . '"'." class='delete' onclick=\"return deleteSomething( 'link', $link->link_id , '".sprintf(__("You are about to delete the &quot;%s&quot; bookmark to %s.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape($link->link_name), js_escape($link->link_url)).'\' );">'.__('Delete').'</a></td>';
         echo '<td><input type="checkbox" name="linkcheck[]" value="' . $link->link_id . '" /></td>';
             } else {
               echo "<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\n";
             }
-		echo "\n\t</tr>";
+
+		echo "\n    </tr>\n";
         }
     }
 ?>
 </table>
 
+<div id="ajax-response"></div>
+
 </div>
 
 <div class="wrap">
@@ -716,7 +406,7 @@
         <td>
           <?php _e('Assign ownership to:'); ?>
 <?php
-    $results = $wpdb->get_results("SELECT ID, user_login FROM $wpdb->users WHERE user_level > 0 ORDER BY ID");
+    $results = $wpdb->get_results("SELECT ID, user_login FROM $wpdb->users ORDER BY ID");
     echo "          <select name=\"newowner\" size=\"1\">\n";
     foreach ($results as $row) {
       echo "            <option value=\"".$row->ID."\"";
@@ -731,7 +421,7 @@
           <input name="visibility" type="submit" id="visibility" value="<?php _e('Toggle Visibility') ?>" />
         </td>
         <td>
-          <?php _e('Move to category:'); category_dropdown('category'); ?> <input name="move" type="submit" id="move" value="<?php _e('Go') ?>" />
+          <?php _e('Move to category:'); link_category_dropdown('category'); ?> <input name="move" type="submit" id="move" value="<?php _e('Go') ?>" />
         </td>
         <td align="right">
           <a href="#" onclick="checkAll(document.getElementById('links')); return false; "><?php _e('Toggle Checkboxes') ?></a>
diff -ruN 1.5.2/wp-admin/link-parse-opml.php 2.0.4/wp-admin/link-parse-opml.php
--- 1.5.2/wp-admin/link-parse-opml.php	2004-06-15 18:24:36.000000000 -0500
+++ 2.0.4/wp-admin/link-parse-opml.php	2005-12-12 16:48:30.000000000 -0600
@@ -55,11 +55,11 @@
 xml_set_element_handler($xml_parser, "startElement", "endElement");
 
 if (!xml_parse($xml_parser, $opml, true)) {
-    echo(sprintf("XML error: %s at line %d",
+    echo(sprintf(__('XML error: %1$s at line %2$s'),
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
 }
 
 // Free up memory used by the XML parser
 xml_parser_free($xml_parser);
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-admin/list-manipulation.js 2.0.4/wp-admin/list-manipulation.js
--- 1.5.2/wp-admin/list-manipulation.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/list-manipulation.js	2006-04-21 16:18:32.000000000 -0500
@@ -0,0 +1,96 @@
+var listItems;
+var reg_color = '#FFFFFF';
+var alt_color = '#F1F1F1';
+
+addLoadEvent(getListItems);
+
+function deleteSomething( what, id, message ) {
+	what.replace('-', ' ');
+	if (!message) message = 'Are you sure you want to delete this ' + what + '?';
+	if ( confirm(message) ) {
+		return ajaxDelete( what.replace(' ', '-'), id );
+	} else {
+		return false;
+	}
+}
+
+function getResponseElement() {
+	var p = document.getElementById('ajax-response-p');
+	if (!p) {
+		p = document.createElement('p');
+		p.id = 'ajax-response-p';
+		document.getElementById('ajax-response').appendChild(p);
+		return p;
+	}
+}
+
+function ajaxDelete(what, id) {
+	ajaxDel = new sack('list-manipulation.php');
+	if ( ajaxDel.failed ) return true;
+	ajaxDel.myResponseElement = getResponseElement();
+	ajaxDel.method = 'POST';
+	ajaxDel.onLoading = function() { ajaxDel.myResponseElement.innerHTML = 'Sending Data...'; };
+	ajaxDel.onLoaded = function() { ajaxDel.myResponseElement.innerHTML = 'Data Sent...'; };
+	ajaxDel.onInteractive = function() { ajaxDel.myResponseElement.innerHTML = 'Processing Data...'; };
+	ajaxDel.onCompletion = function() { removeThisItem( what + '-' + id ); };
+	ajaxDel.runAJAX('action=delete-' + what + '&id=' + id + '&' + ajaxDel.encVar('cookie', document.cookie));
+	return false;
+}
+
+function removeThisItem(id) {
+	var response = ajaxDel.response;
+	if ( isNaN(response) ) { ajaxDel.myResponseElement.innerHTML = response; return false; }
+	response = parseInt(response, 10);
+	if ( -1 == response ) { ajaxDel.myResponseElement.innerHTML = "You don't have permission to do that."; }
+	else if ( 0 == response ) { ajaxDel.myResponseElement.interHTML = "Something odd happened.  Try refreshing the page? Either that or what you tried to delete never existed in the first place."; }
+	else if ( 1 == response ) {
+		theItem = document.getElementById(id);
+		Fat.fade_element(id,null,700,'#FF3333');
+		setTimeout('theItem.parentNode.removeChild(theItem)', 705);
+		var pos = getListPos(id);
+		listItems.splice(pos,1);
+		recolorList(pos);
+		ajaxDel.myResponseElement.parentNode.removeChild(ajaxDel.myResponseElement);
+		
+	}
+}
+
+function getListPos(id) {
+	for (var i = 0; i < listItems.length; i++) {
+		if (id == listItems[i]) {
+			var pos = i;
+			break;
+		}
+	}
+	return pos;
+}	
+
+function getListItems() {
+	if (list) return;
+	listItems = new Array();
+	var extra = false;
+	var list = document.getElementById('the-list');
+	if (!list) { var list = document.getElementById('the-list-x'); extra = true; }
+	if (list) {
+		var items = list.getElementsByTagName('tr');
+		if (!items[0]) { items = list.getElementsByTagName('li'); }
+		for (var i=0; i<items.length; i++) { listItems.push(items[i].id); }
+		if (extra) { listItems.splice(0,1); }
+	}
+}
+
+function recolorList(pos,dur,from) {
+	if (!pos) pos = 0;
+
+	if (!from) {
+		reg_from = alt_color;
+		alt_from = reg_color;
+	} else {
+		reg_from = from;
+		alt_from = from;
+	}
+	for (var i = pos; i < listItems.length; i++) {
+		if (i % 2 == 1) Fat.fade_element(listItems[i],null,dur,reg_from,reg_color);
+		else Fat.fade_element(listItems[i],null,dur,alt_from,alt_color);
+	}
+}
diff -ruN 1.5.2/wp-admin/list-manipulation.php 2.0.4/wp-admin/list-manipulation.php
--- 1.5.2/wp-admin/list-manipulation.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/list-manipulation.php	2006-05-28 18:33:05.000000000 -0500
@@ -0,0 +1,81 @@
+<?php
+require_once('../wp-config.php');
+require_once('admin-functions.php');
+require_once('admin-db.php');
+header("Content-type: text/plain", true);
+
+if ( !is_user_logged_in() )
+	die('-1');
+if ( !check_ajax_referer() )
+	die('-1');
+
+function grab_results() {
+	global $ajax_results;
+	$ajax_results = func_get_arg(0);
+}
+
+function get_out_now() { exit; }
+add_action('shutdown', 'get_out_now', -1);
+
+switch ( $_POST['action'] ) :
+case 'delete-link' :
+	$id = (int) $_POST['id'];
+	if ( !current_user_can('manage_links') )
+		die ('-1');
+
+	if ( wp_delete_link($id) ) 
+		die('1');
+	else	die('0');
+	break;
+case 'delete-post' :
+case 'delete-page' :
+	$id = (int) $_POST['id'];
+	if ( !current_user_can('edit_post', $id) )	{
+		die('-1');
+	}
+
+	if ( wp_delete_post($id) ) {
+		die('1');
+	} else	die('0');
+	break;
+case 'delete-cat' :
+	if ( !current_user_can('manage_categories') )
+		die ('-1');
+
+	$id = (int) $_POST['id'];
+	$cat_name = get_catname($cat_ID);
+
+	if ( wp_delete_category($id) )
+		die('1');
+	else	die('0');
+	break;
+case 'delete-comment' :
+	$id = (int) $_POST['id'];
+
+	if ( !$comment = get_comment($id) )
+		die('0');
+	if ( !current_user_can('edit_post', $comment->comment_post_ID) )	
+		die('-1');
+
+	if ( wp_delete_comment($comment->comment_ID) ) {
+		die('1');
+	} else {
+		die('0');
+	}
+	break;
+case 'delete-link-category' :
+	$id = (int) $_POST['id'];
+	if ( 1 == $id )
+		die('0');
+	if ( !current_user_can('manage_links') )
+		die('-1');
+
+	if ( $wpdb->query("DELETE FROM $wpdb->linkcategories WHERE cat_id='$id'") ) {
+		$wpdb->query("UPDATE $wpdb->links SET link_category=1 WHERE link_category='$id'");
+		die('1');
+	} else {
+		die('0');
+	}
+	break;
+endswitch;		
+?>
diff -ruN 1.5.2/wp-admin/menu-header.php 2.0.4/wp-admin/menu-header.php
--- 1.5.2/wp-admin/menu-header.php	2005-03-20 22:18:16.000000000 -0600
+++ 2.0.4/wp-admin/menu-header.php	2006-03-01 21:08:56.000000000 -0600
@@ -8,10 +8,10 @@
 foreach ($menu as $item) {
 	$class = '';
 
-	// 0 = name, 1 = user_level, 2 = file
+	// 0 = name, 1 = capability, 2 = file
 	if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"';
     
-	if ($user_level >= $item[1]) {
+	if ( current_user_can($item[1]) ) {
 		if ( file_exists(ABSPATH . "wp-content/plugins/{$item[2]}") )
 			echo "\n\t<li><a href='" . get_settings('siteurl') . "/wp-admin/admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";			
 		else
@@ -20,20 +20,17 @@
 }
 
 ?>
-	<li class="last"><a href="<?php echo get_settings('siteurl')
-	 ?>/wp-login.php?action=logout" title="<?php _e('Log out of this account') ?>"><?php printf(__('Logout (%s)'), $user_nickname) ?></a></li>
 </ul>
 
 <?php
 // Sub-menu
 if ( isset($submenu["$parent_file"]) ) :
 ?>
-<ul id="adminmenu2">
+<ul id="submenu">
 <?php 
 foreach ($submenu["$parent_file"] as $item) : 
-	 if ($user_level < $item[1]) {
+	 if ( !current_user_can($item[1]) )
 		 continue;
-	 }
 
 if ( isset($submenu_file) ) {
 	if ( $submenu_file == $item[2] ) $class = ' class="current"';
@@ -55,4 +52,10 @@
 ?>
 
 </ul>
-<?php endif; ?>
\ No newline at end of file
+<?php
+
+endif; 
+
+do_action('admin_notices');
+
+?>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/menu.php 2.0.4/wp-admin/menu.php
--- 1.5.2/wp-admin/menu.php	2005-02-06 19:15:06.000000000 -0600
+++ 2.0.4/wp-admin/menu.php	2005-11-21 03:29:19.000000000 -0600
@@ -4,49 +4,50 @@
 // Menu item name
 // The minimum level the user needs to access the item: between 0 and 10
 // The URL of the item's file
-$menu[0] = array(__('Dashboard'), 0, 'index.php');
-$menu[5] = array(__('Write'), 1, 'post.php');
-$menu[10] = array(__('Manage'), 1, 'edit.php');
-$menu[20] = array(__('Links'), 5, 'link-manager.php');
-$menu[25] = array(__('Presentation'), 8, 'themes.php');
-$menu[30] = array(__('Plugins'), 8, 'plugins.php');
-$menu[35] = array(__('Users'), 0, 'profile.php');
-$menu[40] = array(__('Options'), 6, 'options-general.php');
-
-if ( get_option('use_fileupload') )
-	$menu[45] = array(__('Upload'), get_settings('fileupload_minlevel'), 'upload.php');
-
-$submenu['post.php'][5] = array(__('Write Post'), 1, 'post.php');
-$submenu['post.php'][10] = array(__('Write Page'), 5, 'page-new.php');
-
-$submenu['edit.php'][5] = array(__('Posts'), 1, 'edit.php');
-$submenu['edit.php'][10] = array(__('Pages'), 5, 'edit-pages.php');
-$submenu['edit.php'][15] = array(__('Categories'), 1, 'categories.php');
-$submenu['edit.php'][20] = array(__('Comments'), 1, 'edit-comments.php');
+$menu[0] = array(__('Dashboard'), 'read', 'index.php');
+$menu[5] = array(__('Write'), 'edit_posts', 'post.php');
+$menu[10] = array(__('Manage'), 'edit_posts', 'edit.php');
+$menu[20] = array(__('Links'), 'manage_links', 'link-manager.php');
+$menu[25] = array(__('Presentation'), 'switch_themes', 'themes.php');
+$menu[30] = array(__('Plugins'), 'activate_plugins', 'plugins.php');
+if ( current_user_can('edit_users') )
+	$menu[35] = array(__('Users'), 'read', 'profile.php');
+else
+	$menu[35] = array(__('Profile'), 'read', 'profile.php');
+$menu[40] = array(__('Options'), 'manage_options', 'options-general.php');
+$menu[45] = array(__('Import'), 'import', 'import.php');
+
+$submenu['post.php'][5] = array(__('Write Post'), 'edit_posts', 'post.php');
+$submenu['post.php'][10] = array(__('Write Page'), 'edit_pages', 'page-new.php');
+
+$submenu['edit.php'][5] = array(__('Posts'), 'edit_posts', 'edit.php');
+$submenu['edit.php'][10] = array(__('Pages'), 'edit_pages', 'edit-pages.php');
+$submenu['edit.php'][15] = array(__('Categories'), 'manage_categories', 'categories.php');
+$submenu['edit.php'][20] = array(__('Comments'), 'edit_posts', 'edit-comments.php');
 $awaiting_mod = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'");
-$submenu['edit.php'][25] = array(sprintf(__("Awaiting Moderation (%s)"), $awaiting_mod), 1, 'moderation.php');
-$submenu['edit.php'][30] = array(__('Files'), 8, 'templates.php');
+$submenu['edit.php'][25] = array(sprintf(__("Awaiting Moderation (%s)"), $awaiting_mod), 'edit_posts', 'moderation.php');
+$submenu['edit.php'][30] = array(__('Files'), 'edit_files', 'templates.php');
 
-$submenu['link-manager.php'][5] = array(__('Manage Links'), 5, 'link-manager.php');
-$submenu['link-manager.php'][10] = array(__('Add Link'), 5, 'link-add.php');
-$submenu['link-manager.php'][15] = array(__('Link Categories'), 5, 'link-categories.php');
-$submenu['link-manager.php'][20] = array(__('Import Links'), 5, 'link-import.php');
-
-$submenu['profile.php'][5] = array(__('Your Profile'), 0, 'profile.php');
-$submenu['profile.php'][10] = array(__('Authors &amp; Users'), 5, 'users.php');
-
-$submenu['options-general.php'][5] = array(__('General'), 6, 'options-general.php');
-$submenu['options-general.php'][10] = array(__('Writing'), 6, 'options-writing.php');
-$submenu['options-general.php'][15] = array(__('Reading'), 6, 'options-reading.php');
-$submenu['options-general.php'][20] = array(__('Discussion'), 6, 'options-discussion.php');
-$submenu['options-general.php'][25] = array(__('Permalinks'), 6, 'options-permalink.php');
-$submenu['options-general.php'][30] = array(__('Miscellaneous'), 6, 'options-misc.php');
+$submenu['link-manager.php'][5] = array(__('Manage Links'), 'manage_links', 'link-manager.php');
+$submenu['link-manager.php'][10] = array(__('Add Link'), 'manage_links', 'link-add.php');
+$submenu['link-manager.php'][15] = array(__('Link Categories'), 'manage_links', 'link-categories.php');
+$submenu['link-manager.php'][20] = array(__('Import Links'), 'manage_links', 'link-import.php');
+
+$submenu['profile.php'][5] = array(__('Your Profile'), 'read', 'profile.php');
+$submenu['profile.php'][10] = array(__('Authors &amp; Users'), 'edit_users', 'users.php');
+
+$submenu['options-general.php'][10] = array(__('General'), 'manage_options', 'options-general.php');
+$submenu['options-general.php'][15] = array(__('Writing'), 'manage_options', 'options-writing.php');
+$submenu['options-general.php'][20] = array(__('Reading'), 'manage_options', 'options-reading.php');
+$submenu['options-general.php'][25] = array(__('Discussion'), 'manage_options', 'options-discussion.php');
+$submenu['options-general.php'][30] = array(__('Permalinks'), 'manage_options', 'options-permalink.php');
+$submenu['options-general.php'][35] = array(__('Miscellaneous'), 'manage_options', 'options-misc.php');
 
-$submenu['plugins.php'][5] = array(__('Plugins'), 8, 'plugins.php');
-$submenu['plugins.php'][10] = array(__('Plugin Editor'), 8, 'plugin-editor.php');
+$submenu['plugins.php'][5] = array(__('Plugins'), 'activate_plugins', 'plugins.php');
+$submenu['plugins.php'][10] = array(__('Plugin Editor'), 'edit_plugins', 'plugin-editor.php');
 
-$submenu['themes.php'][5] = array(__('Themes'), 8, 'themes.php');
-$submenu['themes.php'][10] = array(__('Theme Editor'), 8, 'theme-editor.php');
+$submenu['themes.php'][5] = array(__('Themes'), 'switch_themes', 'themes.php');
+$submenu['themes.php'][10] = array(__('Theme Editor'), 'edit_themes', 'theme-editor.php');
 
 // Create list of page plugin hook names.
 foreach ($menu as $menu_page) {
diff -ruN 1.5.2/wp-admin/moderation.php 2.0.4/wp-admin/moderation.php
--- 1.5.2/wp-admin/moderation.php	2005-02-10 19:52:19.000000000 -0600
+++ 2.0.4/wp-admin/moderation.php	2006-07-05 15:21:45.000000000 -0500
@@ -3,6 +3,7 @@
 
 $title = __('Moderate comments');
 $parent_file = 'edit.php';
+$list_js = true;
 
 $wpvarstoreset = array('action', 'item_ignored', 'item_deleted', 'item_approved', 'item_spam', 'feelinglucky');
 for ($i=0; $i<count($wpvarstoreset); $i += 1) {
@@ -31,9 +32,10 @@
 
 case 'update':
 
-	if ($user_level < 3) {
-		die(__('<p>Your level is not high enough to moderate comments.</p>'));
-	}
+	check_admin_referer('moderate-comments');
+
+	if ( ! current_user_can('moderate_comments') )
+	die('<p>'.__('Your level is not high enough to moderate comments.').'</p>');
 
 	$item_ignored = 0;
 	$item_deleted = 0;
@@ -68,7 +70,7 @@
 	}
 
 	$file = basename(__FILE__);
-	header("Location: $file?ignored=$item_ignored&deleted=$item_deleted&approved=$item_approved&spam=$item_spam");
+	wp_redirect("$file?ignored=$item_ignored&deleted=$item_deleted&approved=$item_approved&spam=$item_spam");
 	exit();
 
 break;
@@ -78,37 +80,37 @@
 require_once('admin-header.php');
 
 if ( isset($_GET['deleted']) || isset($_GET['approved']) || isset($_GET['ignored']) ) {
-	echo "<div class='updated'>\n<p>";
+	echo "<div id='moderated' class='updated fade'>\n<p>";
 	$approved = (int) $_GET['approved'];
 	$deleted  = (int) $_GET['deleted'];
 	$ignored  = (int) $_GET['ignored'];
 	$spam     = (int) $_GET['spam'];
 	if ($approved) {
 		if ('1' == $approved) {
-		 echo __("1 comment approved <br />") . "\n";
+			echo __("1 comment approved") . " <br/>\n";
 		} else {
 		 echo sprintf(__("%s comments approved <br />"), $approved) . "\n";
 		}
 	}
 	if ($deleted) {
 		if ('1' == $deleted) {
-		echo __("1 comment deleted <br />") . "\n";
+			echo __("1 comment deleted") . " <br/>\n";
 		} else {
-		echo sprintf(__("%s comments deleted <br />"), $deleted) . "\n";
+			echo sprintf(__("%s comments deleted"), $deleted) . " <br/>\n";
 		}
 	}
  	if ($spam) {
  		if ('1' == $spam) {
- 		echo __("1 comment marked as spam <br />") . "\n";
+			echo __("1 comment marked as spam") . " <br/>\n";
  		} else {
- 		echo sprintf(__("%s comments marked as spam <br />"), $spam) . "\n";
+ 			echo sprintf(__("%s comments marked as spam"), $spam) . " <br/>\n";
  		}
  	}
 	if ($ignored) {
 		if ('1' == $ignored) {
-		echo __("1 comment unchanged <br />") . "\n";
+			echo __("1 comment unchanged") . " <br/>\n";
 		} else {
-		echo sprintf(__("%s comments unchanged <br />"), $ignored) . "\n";
+			echo sprintf(__("%s comments unchanged"), $ignored) . " <br/>\n";
 		}
 	}
 	echo "</p></div>\n";
@@ -119,7 +121,7 @@
 <div class="wrap">
 
 <?php
-if ($user_level > 3)
+if ( current_user_can('moderate_comments') )
 	$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = '0'");
 else
 	$comments = '';
@@ -130,8 +132,9 @@
 ?>
     <h2><?php _e('Moderation Queue') ?></h2>
     <form name="approval" action="moderation.php" method="post">
+    <?php wp_nonce_field('moderate-comments') ?>
     <input type="hidden" name="action" value="update" />
-    <ol id="comments" class="commentlist">
+    <ol id="the-list" class="commentlist">
 <?php
 $i = 0;
     foreach($comments as $comment) {
@@ -142,17 +145,17 @@
 	else $class = '';
 	echo "\n\t<li id='comment-$comment->comment_ID' $class>"; 
 	?>
-			<p><strong><?php _e('Name:') ?></strong> <?php comment_author_link() ?> <?php if ($comment->comment_author_email) { ?>| <strong><?php _e('E-mail:') ?></strong> <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_email) { ?> | <strong><?php _e('URI:') ?></strong> <?php comment_author_url_link() ?> <?php } ?>| <strong><?php _e('IP:') ?></strong> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
+	<p><strong><?php _e('Name:') ?></strong> <?php comment_author_link() ?> <?php if ($comment->comment_author_email) { ?>| <strong><?php _e('E-mail:') ?></strong> <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <strong><?php _e('URI:') ?></strong> <?php comment_author_url_link() ?> <?php } ?>| <strong><?php _e('IP:') ?></strong> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a> | <strong><?php _e('Date:') ?></strong> <?php comment_date(); ?></p>
 <?php comment_text() ?>
 <p><?php
 echo '<a href="post.php?action=editcomment&amp;comment='.$comment->comment_ID.'">' . __('Edit') . '</a> | ';?>
 <a href="<?php echo get_permalink($comment->comment_post_ID); ?>"><?php _e('View Post') ?></a> | 
 <?php 
-echo " <a href=\"post.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID."\" onclick=\"return confirm('" . sprintf(__("You are about to delete this comment by \'%s\'\\n  \'Cancel\' to stop, \'OK\' to delete."), $comment->comment_author) . "')\">" . __('Delete just this comment') . "</a> | "; ?>  <?php _e('Bulk action:') ?>
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment[<?php echo $comment->comment_ID; ?>]-approve" value="approve" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-approve"><?php _e('Approve') ?></label>
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment[<?php echo $comment->comment_ID; ?>]-spam" value="spam" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-spam"><?php _e('Spam') ?></label>
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment[<?php echo $comment->comment_ID; ?>]-delete" value="delete" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-delete"><?php _e('Delete') ?></label>
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment[<?php echo $comment->comment_ID; ?>]-nothing" value="later" checked="checked" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-nothing"><?php _e('Defer until later') ?></label>
+echo " <a href=\"" . wp_nonce_url("post.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return deleteSomething( 'comment', $comment->comment_ID, '" . __("You are about to delete this comment.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete.") . "' );\">" . __('Delete just this comment') . "</a> | "; ?>  <?php _e('Bulk action:') ?>
+	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-approve" value="approve" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-approve"><?php _e('Approve') ?></label>
+	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-spam" value="spam" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-spam"><?php _e('Spam') ?></label>
+	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-delete" value="delete" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-delete"><?php _e('Delete') ?></label>
+	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-nothing" value="later" checked="checked" /> <label for="comment[<?php echo $comment->comment_ID; ?>]-nothing"><?php _e('Defer until later') ?></label>
 	</p>
 
 	</li>
@@ -161,6 +164,8 @@
 ?>
     </ol>
 
+<div id="ajax-response"></div>
+
     <p class="submit"><input type="submit" name="submit" value="<?php _e('Moderate Comments &raquo;') ?>" /></p>
 <script type="text/javascript">
 // <![CDATA[
@@ -205,7 +210,7 @@
 <?php
 } else {
     // nothing to approve
-    echo __("<p>Currently there are no comments for you to moderate.</p>") . "\n";
+	echo '<p>'.__("Currently there are no comments for you to moderate.") . "</p>\n";
 }
 ?>
 
@@ -217,4 +222,4 @@
 }
 
 
-include('admin-footer.php') ?>
\ No newline at end of file
+include('admin-footer.php') ?>
diff -ruN 1.5.2/wp-admin/options-discussion.php 2.0.4/wp-admin/options-discussion.php
--- 1.5.2/wp-admin/options-discussion.php	2005-02-11 00:49:07.000000000 -0600
+++ 2.0.4/wp-admin/options-discussion.php	2006-05-11 18:05:45.000000000 -0500
@@ -19,82 +19,83 @@
 ?>
 
 <div class="wrap"> 
-	<h2><?php _e('Discussion Options') ?></h2> 
-	<form name="form1" method="post" action="options.php"> 
-		<input type="hidden" name="action" value="update" /> 
-		<input type="hidden" name="page_options" value="'default_pingback_flag','default_ping_status','default_comment_status','comments_notify','moderation_notify','comment_moderation','require_name_email','comment_whitelist','comment_max_links','moderation_keys','blacklist_keys','open_proxy_check'" /> 
+<h2><?php _e('Discussion Options') ?></h2> 
+<form method="post" action="options.php"> 
+<?php wp_nonce_field('update-options') ?>
 <fieldset class="options">
-        <legend><?php _e('Usual settings for an article: <em>(These settings may be overridden for individual articles.)</em>') ?></legend> 
-		<ul> 
-			<li> 
-				<label for="default_pingback_flag"> 
-				<input name="default_pingback_flag" type="checkbox" id="default_pingback_flag" value="1" <?php checked('1', get_settings('default_pingback_flag')); ?> /> 
-            <?php _e('Attempt to notify any Weblogs linked to from the article (slows down posting.)') ?></label> 
-			</li> 
-			<li> 
-				<label for="default_ping_status"> 
-				<input name="default_ping_status" type="checkbox" id="default_ping_status" value="open" <?php checked('open', get_settings('default_ping_status')); ?> /> 
-            <?php _e('Allow link notifications from other Weblogs (pingbacks and trackbacks.)') ?></label> 
-			</li> 
-			<li> 
-				<label for="default_comment_status"> 
-				<input name="default_comment_status" type="checkbox" id="default_comment_status" value="open" <?php checked('open', get_settings('default_comment_status')); ?> /> 
-            <?php _e('Allow people to post comments on the article') ?></label> 
-			</li> 
-		</ul> 
+<legend><?php _e('Usual settings for an article:<br /><small><em>(These settings may be overridden for individual articles.)</em></small>') ?></legend> 
+<ul> 
+<li> 
+<label for="default_pingback_flag"> 
+<input name="default_pingback_flag" type="checkbox" id="default_pingback_flag" value="1" <?php checked('1', get_settings('default_pingback_flag')); ?> /> 
+<?php _e('Attempt to notify any Weblogs linked to from the article (slows down posting.)') ?></label> 
+</li> 
+<li> 
+<label for="default_ping_status"> 
+<input name="default_ping_status" type="checkbox" id="default_ping_status" value="open" <?php checked('open', get_settings('default_ping_status')); ?> /> 
+<?php _e('Allow link notifications from other Weblogs (pingbacks and trackbacks.)') ?></label> 
+</li> 
+<li> 
+<label for="default_comment_status"> 
+<input name="default_comment_status" type="checkbox" id="default_comment_status" value="open" <?php checked('open', get_settings('default_comment_status')); ?> /> 
+<?php _e('Allow people to post comments on the article') ?></label> 
+</li> 
+</ul> 
 </fieldset>
 <fieldset class="options">
-        <legend><?php _e('E-mail me whenever:') ?></legend> 
-		<ul> 
-			<li> 
-				<label for="comments_notify"> 
-				<input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked('1', get_settings('comments_notify')); ?> /> 
-                <?php _e('Anyone posts a comment') ?> </label> 
-			</li> 
-			<li> 
-				<label for="moderation_notify"> 
-				<input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked('1', get_settings('moderation_notify')); ?> /> 
-				<?php _e('A comment is held for moderation') ?> </label> 
-			</li> 
-		</ul> 
+<legend><?php _e('E-mail me whenever:') ?></legend> 
+<ul> 
+<li> 
+<label for="comments_notify"> 
+<input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked('1', get_settings('comments_notify')); ?> /> 
+<?php _e('Anyone posts a comment') ?> </label> 
+</li> 
+<li> 
+<label for="moderation_notify"> 
+<input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked('1', get_settings('moderation_notify')); ?> /> 
+<?php _e('A comment is held for moderation') ?> </label> 
+</li> 
+</ul> 
 </fieldset>
 <fieldset class="options">
-        <legend><?php _e('Before a comment appears:') ?></legend> 
-		<ul>
-			<li>
-				<label for="comment_moderation"> 
-				<input name="comment_moderation" type="checkbox" id="comment_moderation" value="1" <?php checked('1', get_settings('comment_moderation')); ?> /> 
-				<?php _e('An administrator must approve the comment (regardless of any matches below)') ?> </label> 
-			</li> 
-			<li><label for="require_name_email"><input type="checkbox" name="require_name_email" id="require_name_email" value="1" <?php checked('1', get_settings('require_name_email')); ?> /> <?php _e('Comment author must fill out name and e-mail') ?></label></li> 
-			<li><label for="comment_whitelist"><input type="checkbox" name="comment_whitelist" id="comment_whitelist" value="1" <?php checked('1', get_settings('comment_whitelist')); ?> /> <?php _e('Comment author must have a previously approved comment') ?></label></li> 
-		</ul> 
+<legend><?php _e('Before a comment appears:') ?></legend> 
+<ul>
+<li>
+<label for="comment_moderation"> 
+<input name="comment_moderation" type="checkbox" id="comment_moderation" value="1" <?php checked('1', get_settings('comment_moderation')); ?> /> 
+<?php _e('An administrator must approve the comment (regardless of any matches below)') ?> </label> 
+</li> 
+<li><label for="require_name_email"><input type="checkbox" name="require_name_email" id="require_name_email" value="1" <?php checked('1', get_settings('require_name_email')); ?> /> <?php _e('Comment author must fill out name and e-mail') ?></label></li> 
+<li><label for="comment_whitelist"><input type="checkbox" name="comment_whitelist" id="comment_whitelist" value="1" <?php checked('1', get_settings('comment_whitelist')); ?> /> <?php _e('Comment author must have a previously approved comment') ?></label></li> 
+</ul> 
 </fieldset>
 <fieldset class="options">
-    <legend><?php _e('Comment Moderation') ?></legend>
-    <p><?php printf(__('Hold a comment in the queue if it contains more than %s links. (A common characteristic of comment spam is a large number of hyperlinks.)'), '<input name="comment_max_links" type="text" id="comment_max_links" size="3" value="' . get_settings('comment_max_links'). '" />' ) ?></p>
+<legend><?php _e('Comment Moderation') ?></legend>
+<p><?php printf(__('Hold a comment in the queue if it contains more than %s links. (A common characteristic of comment spam is a large number of hyperlinks.)'), '<input name="comment_max_links" type="text" id="comment_max_links" size="3" value="' . get_settings('comment_max_links'). '" />' ) ?></p>
 
-    <p><?php _e('When a comment contains any of these words in its content, name, URI, e-mail, or IP, hold it in the moderation queue: (Separate multiple words with new lines.) <a href="http://codex.wordpress.org/Spam_Words">Common spam words</a>.') ?></p>
-		<p> 
-			<textarea name="moderation_keys" cols="60" rows="4" id="moderation_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('moderation_keys'); ?></textarea> 
-		</p> 
-		<p>
-			<a id="retrospambutton" href="options-discussion.php?action=retrospam"><?php _e('Check past comments against moderation list'); ?></a>
- 		</p> 
+<p><?php _e('When a comment contains any of these words in its content, name, URI, e-mail, or IP, hold it in the moderation queue: (Separate multiple words with new lines.) <a href="http://codex.wordpress.org/Spam_Words">Common spam words</a>.') ?></p>
+<p> 
+<textarea name="moderation_keys" cols="60" rows="4" id="moderation_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('moderation_keys'); ?></textarea> 
+</p> 
+<p>
+<a id="retrospambutton" href="options-discussion.php?action=retrospam"><?php _e('Check past comments against moderation list'); ?></a>
+</p> 
 </fieldset>
 <fieldset class="options">
-    <legend><?php _e('Comment Blacklist') ?></legend>
-    <p><?php _e('This is a list of words that you want completely blacklisted from your blog. Be very careful what you add here, because if a comment matches something here it will be completely nuked and there will be no notification. Remember that partial words can match, so if there is any chance something here might match it would be better to put it in the moderation box above.') ?></p>
-		<p> 
-			<textarea name="blacklist_keys" cols="60" rows="4" id="blacklist_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('blacklist_keys'); ?></textarea> 
-		</p>
-		<p><label for="open_proxy_check"> 
-				<input name="open_proxy_check" type="checkbox" id="open_proxy_check" value="1" <?php checked('1', get_settings('open_proxy_check')); ?> /> 
-            <?php _e('Blacklist comments from open and insecure proxies.') ?></label></p>
+<legend><?php _e('Comment Blacklist') ?></legend>
+<p><?php _e('This is a list of words that you want completely blacklisted from your blog. Be very careful what you add here, because if a comment matches something here it will be completely nuked and there will be no notification. Remember that partial words can match, so if there is any chance something here might match it would be better to put it in the moderation box above.') ?></p>
+<p> 
+<textarea name="blacklist_keys" cols="60" rows="4" id="blacklist_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('blacklist_keys'); ?></textarea> 
+</p>
+<p><label for="open_proxy_check"> 
+<input name="open_proxy_check" type="checkbox" id="open_proxy_check" value="1" <?php checked('1', get_settings('open_proxy_check')); ?> /> 
+<?php _e('Blacklist comments from open and insecure proxies.') ?></label></p>
 </fieldset>
-		<p class="submit"> 
-    	<input type="submit" name="Submit" value="<?php _e('Update Options') ?>" /> 
-		</p> 
-	</form> 
+<p class="submit">
+<input type="hidden" name="action" value="update" /> 
+<input type="hidden" name="page_options" value="default_pingback_flag,default_ping_status,default_comment_status,comments_notify,moderation_notify,comment_moderation,require_name_email,comment_whitelist,comment_max_links,moderation_keys,blacklist_keys,open_proxy_check" /> 
+<input type="submit" name="Submit" value="<?php _e('Update Options') ?>" /> 
+</p> 
+</form> 
 </div>
-<?php include('./admin-footer.php'); ?>
\ No newline at end of file
+<?php include('./admin-footer.php'); ?>
diff -ruN 1.5.2/wp-admin/options-general.php 2.0.4/wp-admin/options-general.php
--- 1.5.2/wp-admin/options-general.php	2005-01-31 00:38:12.000000000 -0600
+++ 2.0.4/wp-admin/options-general.php	2006-05-11 18:05:45.000000000 -0500
@@ -1,99 +1,111 @@
 <?php
-require_once('admin.php');
+require_once('./admin.php');
 
 $title = __('General Options');
 $parent_file = 'options-general.php';
 
-include('admin-header.php');
+include('./admin-header.php');
 ?>
  
-<div class="wrap"> 
-  <h2><?php _e('General Options') ?></h2> 
-  <form name="form1" method="post" action="options.php"> 
-    <input type="hidden" name="action" value="update" /> 
-	<input type="hidden" name="action" value="update" /> <input type="hidden" name="page_options" value="'blogname','blogdescription','siteurl','admin_email','users_can_register','gmt_offset','date_format','time_format','home','start_of_week','comment_registration'" /> 
-    <table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
-      <tr valign="top"> 
-        <th width="33%" scope="row"><?php _e('Weblog title:') ?></th> 
-        <td><input name="blogname" type="text" id="blogname" value="<?php form_option('blogname'); ?>" size="40" /></td> 
-      </tr> 
-      <tr valign="top"> 
-        <th scope="row"><?php _e('Tagline:') ?></th> 
-        <td><input name="blogdescription" type="text" id="blogdescription" style="width: 95%" value="<?php form_option('blogdescription'); ?>" size="45" />
-        <br />
+<div class="wrap">
+<h2><?php _e('General Options') ?></h2>
+<form method="post" action="options.php"> 
+<?php wp_nonce_field('update-options') ?>
+<table class="optiontable"> 
+<tr valign="top"> 
+<th scope="row"><?php _e('Weblog title:') ?></th> 
+<td><input name="blogname" type="text" id="blogname" value="<?php form_option('blogname'); ?>" size="40" /></td> 
+</tr> 
+<tr valign="top"> 
+<th scope="row"><?php _e('Tagline:') ?></th> 
+<td><input name="blogdescription" type="text" id="blogdescription" style="width: 95%" value="<?php form_option('blogdescription'); ?>" size="45" />
+<br />
 <?php _e('In a few words, explain what this weblog is about.') ?></td> 
-      </tr> 
-      <tr valign="top"> 
-        <th scope="row"><?php _e('WordPress address (URI):') ?></th> 
-        <td><input name="siteurl" type="text" id="siteurl" value="<?php form_option('siteurl'); ?>" size="40" class="code" /></td> 
-      </tr> 
-      <tr valign="top">
-      	<th scope="row"><?php _e('Blog address (URI):') ?></th>
-      	<td><input name="home" type="text" id="home" value="<?php form_option('home'); ?>" size="40" class="code" /><br /><?php _e('If you want your blog homepage to be different than the directory you installed WordPress in, enter that address here. '); ?></td>
-      	</tr>
-      <tr valign="top"> 
-        <th scope="row"><?php _e('E-mail address:') ?> </th> 
-        <td><input name="admin_email" type="text" id="admin_email" value="<?php form_option('admin_email'); ?>" size="40" class="code" />
-        <br />
+</tr> 
+<tr valign="top"> 
+<th scope="row"><?php _e('WordPress address (URI):') ?></th> 
+<td><input name="siteurl" type="text" id="siteurl" value="<?php form_option('siteurl'); ?>" size="40" class="code" /></td> 
+</tr> 
+<tr valign="top">
+<th scope="row"><?php _e('Blog address (URI):') ?></th>
+<td><input name="home" type="text" id="home" value="<?php form_option('home'); ?>" size="40" class="code" /><br /><?php _e('If you want your blog homepage <a href="http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory">to be different than the directory</a> you installed WordPress in, enter that address here.'); ?></td>
+</tr>
+<tr valign="top"> 
+<th scope="row"><?php _e('E-mail address:') ?> </th> 
+<td><input name="admin_email" type="text" id="admin_email" value="<?php form_option('admin_email'); ?>" size="40" class="code" />
+<br />
 <?php _e('This address is used only for admin purposes.') ?></td> 
-      </tr>
-      <tr valign="top"> 
-        <th scope="row"><?php _e('Membership:') ?></th> 
-        <td> <label for="users_can_register"> 
-          <input name="users_can_register" type="checkbox" id="users_can_register" value="1" <?php checked('1', get_settings('users_can_register')); ?> /> 
-          <?php _e('Anyone can register') ?></label><br />
-		  <label for="comment_registration">
-			<input name="comment_registration" type="checkbox" id="comment_registration" value="1" <?php checked('1', get_settings('comment_registration')); ?> /> 
-				<?php _e('Users must be registered and logged in to comment') ?>
-			</label>
+</tr>
+<tr valign="top"> 
+<th scope="row"><?php _e('Membership:') ?></th> 
+<td> <label for="users_can_register"> 
+<input name="users_can_register" type="checkbox" id="users_can_register" value="1" <?php checked('1', get_settings('users_can_register')); ?> /> 
+<?php _e('Anyone can register') ?></label><br />
+<label for="comment_registration">
+<input name="comment_registration" type="checkbox" id="comment_registration" value="1" <?php checked('1', get_settings('comment_registration')); ?> /> 
+<?php _e('Users must be registered and logged in to comment') ?>
+</label>
 </td> 
-      </tr> 
-    </table> 
-    <fieldset class="options"> 
-    <legend><?php _e('Date and Time') ?></legend> 
-	    <table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
-      <tr> 
-          <th scope="row" width="33%"><?php _e('<abbr title="Coordinated Universal Time">UTC</abbr> time is:') ?> </th> 
-        <td><code><?php echo gmdate('Y-m-d g:i:s a'); ?></code></td> 
-      </tr>
-      <tr>
-        <th scope="row"><?php _e('Times in the weblog should differ by:') ?> </th>
-        <td><input name="gmt_offset" type="text" id="gmt_offset" size="2" value="<?php form_option('gmt_offset'); ?>" /> 
-        <?php _e('hours') ?> </td>
-      </tr>
-      <tr>
-      	<th scope="row">&nbsp;</th>
-      	<td><?php _e('The following use the same syntax as the <a href="http://php.net/date">PHP <code>date()</code> function</a>. Save option to update sample output.') ?> </td>
-      	</tr>
-      <tr>
-      	<th scope="row"><?php _e('Default date format:') ?></th>
-      	<td><input name="date_format" type="text" id="date_format" size="30" value="<?php form_option('date_format'); ?>" /><br />
+</tr> 
+<tr valign="top"> 
+<th scope="row"><?php _e('New User Default Role:') ?></th> 
+<td><label for="default_role"> 
+<select name="default_role" id="default_role"><?php 
+foreach($wp_roles->role_names as $role => $name) {
+	$selected = (get_settings('default_role') == $role) ? 'selected="selected"' : '';
+	echo "<option {$selected} value=\"{$role}\">{$name}</option>";
+}
+?></select></label>
+</td> 
+</tr> 
+</table> 
+<fieldset class="options"> 
+<legend><?php _e('Date and Time') ?></legend> 
+<table class="optiontable"> 
+<tr> 
+<th scope="row"><?php _e('<abbr title="Coordinated Universal Time">UTC</abbr> time is:') ?> </th> 
+<td><code><?php echo gmdate('Y-m-d g:i:s a'); ?></code></td> 
+</tr>
+<tr>
+<th scope="row"><?php _e('Times in the weblog should differ by:') ?> </th>
+<td><input name="gmt_offset" type="text" id="gmt_offset" size="2" value="<?php form_option('gmt_offset'); ?>" /> 
+<?php _e('hours') ?> </td>
+</tr>
+<tr>
+<th scope="row"><?php _e('Default date format:') ?></th>
+<td><input name="date_format" type="text" id="date_format" size="30" value="<?php form_option('date_format'); ?>" /><br />
 <?php _e('Output:') ?> <strong><?php echo mysql2date(get_settings('date_format'), current_time('mysql')); ?></strong></td>
-      	</tr>
-      <tr>
-        <th scope="row"><?php _e('Default time format:') ?></th>
-      	<td><input name="time_format" type="text" id="time_format" size="30" value="<?php form_option('time_format'); ?>" /><br />
+</tr>
+<tr>
+<th scope="row"><?php _e('Default time format:') ?></th>
+<td><input name="time_format" type="text" id="time_format" size="30" value="<?php form_option('time_format'); ?>" /><br />
 <?php _e('Output:') ?> <strong><?php echo gmdate(get_settings('time_format'), current_time('timestamp')); ?></strong></td>
-      	</tr> 
-      <tr>
-        <th scope="row"><?php _e('Weeks in the calendar should start on:') ?></th>
-        <td><select name="start_of_week" id="start_of_week">
-	<?php
+</tr> 
+<tr>
+<th scope="row">&nbsp;</th>
+<td><?php _e('<a href="http://codex.wordpress.org/Formatting_Date_and_Time">Documentation on date formatting</a>. Save option to update sample output.') ?> </td>
+</tr>
+<tr>
+<th scope="row"><?php _e('Weeks in the calendar should start on:') ?></th>
+<td><select name="start_of_week" id="start_of_week">
+<?php
 for ($day_index = 0; $day_index <= 6; $day_index++) :
-	if ($day_index == get_settings('start_of_week')) $selected = " selected='selected'";
-	else $selected = '';
+if ($day_index == get_settings('start_of_week')) $selected = " selected='selected'";
+else $selected = '';
 echo "\n\t<option value='$day_index' $selected>$weekday[$day_index]</option>";
 endfor;
 ?>
 </select></td>
-       		</tr>
-
+</tr>
 </table>
+</fieldset> 
+
+<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" />
+<input type="hidden" name="action" value="update" /> 
+<input type="hidden" name="page_options" value="blogname,blogdescription,siteurl,admin_email,users_can_register,gmt_offset,date_format,time_format,home,start_of_week,comment_registration,default_role" /> 
+</p>
+</form>
 
-    </fieldset> 
-    <p class="submit">
-      <input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" />
-    </p>
-  </form> 
 </div> 
-<?php include("admin-footer.php") ?>
+
+<?php include('./admin-footer.php') ?>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/options-head.php 2.0.4/wp-admin/options-head.php
--- 1.5.2/wp-admin/options-head.php	2004-10-18 22:03:06.000000000 -0500
+++ 2.0.4/wp-admin/options-head.php	2005-08-07 20:13:22.000000000 -0500
@@ -20,5 +20,5 @@
 <br clear="all" />
 
 <?php if (isset($_GET['updated'])) : ?>
-<div class="updated"><p><strong><?php _e('Options saved.') ?></strong></p></div>
+<div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div>
 <?php endif; ?>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/options-misc.php 2.0.4/wp-admin/options-misc.php
--- 1.5.2/wp-admin/options-misc.php	2005-02-13 21:20:29.000000000 -0600
+++ 2.0.4/wp-admin/options-misc.php	2006-05-11 18:05:45.000000000 -0500
@@ -10,62 +10,41 @@
  
 <div class="wrap"> 
 <h2><?php _e('Miscellaneous Options') ?></h2> 
-<form name="miscoptions" method="post" action="options.php"> 
-	<input type="hidden" name="action" value="update" />
-	<input type="hidden" name="page_options" value="'hack_file','use_fileupload','fileupload_realpath','fileupload_url','fileupload_allowedtypes','fileupload_maxk','fileupload_maxk','fileupload_minlevel','use_geo_positions','use_linksupdate'" /> 
-	<fieldset class="options">
-	<legend>
-	<input name="use_fileupload" type="checkbox" id="use_fileupload" value="1" <?php checked('1', get_settings('use_fileupload')); ?> />
-	<label for="use_fileupload"><?php _e('Allow File Uploads') ?></label></legend>
-	<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
-	<tr> 
-	<th width="33%" valign="top" scope="row"><?php _e('Destination directory:') ?> </th> 
-	<td>
-	<input name="fileupload_realpath" type="text" id="fileupload_realpath" value="<?php form_option('fileupload_realpath'); ?>" size="50" /><br />
-	<?php printf(__('Recommended: <code>%s</code>'), ABSPATH . 'wp-content') ?>
-	
-	</td> 
-	</tr> 
-	<tr>
-	<th valign="top" scope="row"><?php _e('URI of this directory:') ?> </th>
-	<td>          
-	<input name="fileupload_url" type="text" id="fileupload_url" value="<?php form_option('fileupload_url'); ?>" size="50" /><br />
-	<?php printf(__('Recommended: <code>%s</code>'), get_settings('siteurl') . '/wp-content') ?>
-	</td>
-	</tr>
-	<tr>
-	<th scope="row"><?php _e('Maximum size:') ?> </th>
-	<td><input name="fileupload_maxk" type="text" id="fileupload_maxk" value="<?php form_option('fileupload_maxk'); ?>" size="4" /> 
-	<?php _e('Kilobytes (KB)') ?></td>
-	</tr>
-	<tr>
-	<th valign="top" scope="row"><?php _e('Allowed file extensions:') ?></th>
-	<td><input name="fileupload_allowedtypes" type="text" id="fileupload_allowedtypes" value="<?php form_option('fileupload_allowedtypes'); ?>" size="40" />
-	<br />
-	<?php _e('Recommended: <code>jpg jpeg png gif</code>') ?></td>
-	</tr>
-	<tr>
-	<th scope="row"><?php _e('Minimum level to upload:') ?></th>
-	<td><select name="fileupload_minlevel" id="fileupload_minlevel">
-	<?php
-	for ($i = 1; $i < 11; $i++) {
-	if ($i == get_settings('fileupload_minlevel')) $selected = " selected='selected'";
-	else $selected = '';
-	echo "\n\t<option value='$i' $selected>$i</option>";
-	}
-	?>
-	</select></td>
-	</tr>
-	</table> 
-	</fieldset>
-	<p><input name="use_linksupdate" type="checkbox" id="use_linksupdate" value="1" <?php checked('1', get_settings('use_linksupdate')); ?> />
-	<label for="use_linksupdate"><?php _e('Track Links&#8217; Update Times') ?></label></p>
-	<p>
-	<label><input type="checkbox" name="hack_file" value="1" <?php checked('1', get_settings('hack_file')); ?> /> <?php _e('Use legacy <code>my-hacks.php</code> file support') ?></label>
-	</p>
-	<p class="submit">
-		<input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" />
-	</p>
+<form method="post" action="options.php">
+<?php wp_nonce_field('update-options') ?>
+<fieldset class="options">
+<legend><?php _e('Uploading'); ?></legend>
+<table class="editform optiontable">
+<tr valign="top">
+<th scope="row"><?php _e('Store uploads in this folder'); ?>:</th>
+<td><input name="upload_path" type="text" id="upload_path" class="code" value="<?php echo str_replace(ABSPATH, '', get_settings('upload_path')); ?>" size="40" />
+<br />
+<?php _e('Default is <code>wp-content/uploads</code>'); ?>
+</td>
+</tr>
+<tr>
+<td></td>
+<td>
+<label for="uploads_use_yearmonth_folders">
+<input name="uploads_use_yearmonth_folders" type="checkbox" id="uploads_use_yearmonth_folders" value="1" <?php checked('1', get_settings('uploads_use_yearmonth_folders')); ?> />
+<?php _e('Organize my uploads into month- and year-based folders'); ?>
+</label>
+</td>
+</tr>
+</table>
+</fieldset>
+
+<p><input name="use_linksupdate" type="checkbox" id="use_linksupdate" value="1" <?php checked('1', get_settings('use_linksupdate')); ?> />
+<label for="use_linksupdate"><?php _e('Track Links&#8217; Update Times') ?></label></p>
+<p>
+<label><input type="checkbox" name="hack_file" value="1" <?php checked('1', get_settings('hack_file')); ?> /> <?php _e('Use legacy <code>my-hacks.php</code> file support') ?></label>
+</p>
+
+<p class="submit">
+<input type="hidden" name="action" value="update" />
+<input type="hidden" name="page_options" value="hack_file,use_linksupdate,uploads_use_yearmonth_folders,upload_path" /> 
+<input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" />
+</p>
 </form> 
 </div>
 
diff -ruN 1.5.2/wp-admin/options-permalink.php 2.0.4/wp-admin/options-permalink.php
--- 1.5.2/wp-admin/options-permalink.php	2005-02-13 21:22:25.000000000 -0600
+++ 2.0.4/wp-admin/options-permalink.php	2006-05-11 18:05:45.000000000 -0500
@@ -4,11 +4,62 @@
 $title = __('Permalink Options');
 $parent_file = 'options-general.php';
 
+function add_js() {
+?>
+<script type="text/javascript">
+//<![CDATA[
+function GetElementsWithClassName(elementName, className) {
+var allElements = document.getElementsByTagName(elementName);
+var elemColl = new Array();
+for (i = 0; i < allElements.length; i++) {
+if (allElements[i].className == className) {
+elemColl[elemColl.length] = allElements[i];
+}
+}
+return elemColl;
+}
+
+function upit() {
+var inputColl = GetElementsWithClassName('input', 'tog');
+var structure = document.getElementById('permalink_structure');
+var inputs = '';
+for (i = 0; i < inputColl.length; i++) {
+if ( inputColl[i].checked && inputColl[i].value != '') {
+inputs += inputColl[i].value + ' ';
+}
+}
+inputs = inputs.substr(0,inputs.length - 1);
+if ( 'custom' != inputs )
+structure.value = inputs;
+}
+
+function blurry() {
+if (!document.getElementById) return;
+
+var structure = document.getElementById('permalink_structure');
+structure.onfocus = function () { document.getElementById('custom_selection').checked = 'checked'; }
+
+var aInputs = document.getElementsByTagName('input');
+
+for (var i = 0; i < aInputs.length; i++) {		
+aInputs[i].onclick = aInputs[i].onkeyup = upit;
+}
+}
+
+window.onload = blurry;
+//]]>
+</script>
+<?php
+}
+add_filter('admin_head', 'add_js');
+
 include('admin-header.php');
 
 $home_path = get_home_path();
 
-if ( isset($_POST) ) {
+if ( isset($_POST['permalink_structure']) || isset($_POST['category_base']) ) {
+	check_admin_referer('update-permalink');
+
 	if ( isset($_POST['permalink_structure']) ) {
 		$permalink_structure = $_POST['permalink_structure'];
 		if (! empty($permalink_structure) )
@@ -27,8 +78,6 @@
 $permalink_structure = get_settings('permalink_structure');
 $category_base = get_settings('category_base');
 
-generate_page_rewrite_rules();
-
 if ( (!file_exists($home_path.'.htaccess') && is_writable($home_path)) || is_writable($home_path.'.htaccess') )
 	$writable = true;
 else
@@ -39,11 +88,11 @@
 else
 	$usingpi = false;
 
-save_mod_rewrite_rules();
+$wp_rewrite->flush_rules();
 ?>
 
 <?php if (isset($_POST['submit'])) : ?>
-<div class="updated"><p><?php
+<div id="message" class="updated fade"><p><?php
 if ($writable)
 	_e('Permalink structure updated.');
 else
@@ -52,47 +101,60 @@
 <?php endif; ?>
 
 <div class="wrap"> 
-  <h2><?php _e('Edit Permalink Structure') ?></h2> 
-  <p><?php _e('By default WordPress uses web URIs which have question marks and lots of numbers in them, however WordPress offers you the ability to create a custom URI structure for your permalinks and archives. This can improve the aesthetics, usability, and longevity of your links. A <a href="http://codex.wordpress.org/Using_Permalinks">number of tags are available</a>, and here are some examples to get you started.'); ?></p>
+  <h2><?php _e('Customize Permalink Structure') ?></h2> 
+  <p><?php _e('By default WordPress uses web URIs which have question marks and lots of numbers in them, however WordPress offers you the ability to create a custom URI structure for your permalinks and archives. This can improve the aesthetics, usability, and forward-compatibility of your links. A <a href="http://codex.wordpress.org/Using_Permalinks">number of tags are available</a>, and here are some examples to get you started.'); ?></p>
 
-<?php if ($is_apache) : ?>
-<dl>
-<dt><?php _e('Structure'); ?>: <code>/%year%/%monthnum%/%day%/%postname%/</code></dt>
-	<strong>
-	<dd><?php _e('Result'); ?>: <code><?php echo get_settings('home') . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/sample-post/'; ?></code></dd>
-	</strong>
-	<dt><?php _e('Structure'); ?>: <code>/archives/%post_id%</code></dt>
-	<strong>
-	<dd><?php _e('Result'); ?>: <code><?php echo get_settings('home'); ?>/archives/123</code></dd>
-	</strong>
-	<dt></dt>
-</dl>
+<?php
+$prefix = '';
 
-<p><?php _e('For the above to work you must have something called <code>mod_rewrite</code> installed on your server. (Ask your host.) If that isn&#8217;t available, you can prefix the structure with <code>/index.php/</code> . This is the recommend method if you are on any web server but Apache.'); ?></p>
+if ( ! got_mod_rewrite() )
+	$prefix = '/index.php';
 
-<?php else : ?>
-<dl>
-<dt><?php _e('Structure'); ?>: <code>/index.php/%year%/%monthnum%/%day%/%postname%/</code></dt>
-	<strong>
-	<dd><?php _e('Result'); ?>: <code><?php echo get_settings('home') . '/index.php/' . date('Y') . '/' . date('m') . '/' . date('d') . '/sample-post/'; ?></code></dd>
-	</strong>
-	<dt><?php _e('Structure'); ?>: <code>/index.php/archives/%post_id%</code></dt>
-	<strong>
-	<dd><?php _e('Result'); ?>: <code><?php echo get_settings('home'); ?>/index.php/archives/123</code></dd>
-	</strong>
-	<dt></dt>
-</dl>
-<?php endif; ?>
+$structures = array(
+	'',
+	$prefix . '/%year%/%monthnum%/%day%/%postname%/',
+	$prefix . '/archives/%post_id%'
+	);
+?>
+<form name="form" action="options-permalink.php" method="post"> 
+<?php wp_nonce_field('update-permalink') ?>
+<h3><?php _e('Common options:'); ?></h3>
+<p>
+	<label>
+<input name="selection" type="radio" value="" class="tog" <?php checked('', $permalink_structure); ?> /> 
+<?php _e('Default'); ?><br /> <span> &raquo; <code><?php echo get_settings('home'); ?>/?p=123</code></span>
+   </label>
+</p>
+<p>
+	<label>
+<input name="selection" type="radio" value="<?php echo $structures[1]; ?>" class="tog" <?php checked($structures[1], $permalink_structure); ?> /> 
+<?php _e('Date and name based'); ?><br /> <span> &raquo; <code><?php echo get_settings('home') . $prefix . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/sample-post/'; ?></code></span>
+   </label>
+</p>
+<p>
+	<label>
+<input name="selection" type="radio" value="<?php echo $structures[2]; ?>" class="tog" <?php checked($structures[2], $permalink_structure); ?> /> 
+<?php _e('Numeric'); ?><br /> <span> &raquo; <code><?php echo get_settings('home') . $prefix  ; ?>/archives/123</code></span>
+   </label>
+</p>
+<p>
+<label>
+<input name="selection" id="custom_selection" type="radio" value="custom" class="tog"
+<?php if ( !in_array($permalink_structure, $structures) ) { ?>
+checked="checked"
+<?php } ?>
+ /> 
+<?php _e('Custom, specify below'); ?>	
+</label>
+<br />
+</p>
+<p id="customstructure"><?php _e('Custom structure'); ?>: <input name="permalink_structure" id="permalink_structure" type="text" class="code" style="width: 60%;" value="<?php echo $permalink_structure; ?>" size="50" /></p>
 
-  <form name="form" action="options-permalink.php" method="post"> 
-    <p><?php _e('Use the template tags above to create a virtual site structure:') ?></p>
-    <p> 
-      <?php _e('Structure'); ?>: <input name="permalink_structure" type="text" class="code" style="width: 60%;" value="<?php echo $permalink_structure; ?>" size="50" /> 
-    </p> 
+<h3><?php _e('Optional'); ?></h3>
 <?php if ($is_apache) : ?>
-	<p><?php _e('If you like, you may enter a custom prefix for your category URIs here. For example, <code>/taxonomy/categorias</code> would make your category links like <code>http://example.org/taxonomy/categorias/uncategorized/</code>. If you leave this blank the default will be used.') ?></p>
+	<p><?php _e('If you like, you may enter a custom prefix for your category URIs here. For example, <code>/taxonomy/tags</code> would make your category links like <code>http://example.org/taxonomy/tags/uncategorized/</code>. If you leave this blank the default will be used.') ?></p>
 <?php else : ?>
-	<p><?php _e('If you like, you may enter a custom prefix for your category URIs here. For example, <code>/index.php/taxonomy/categorias</code> would make your category links like <code>http://example.org/index.php/taxonomy/categorias/uncategorized/</code>. If you leave this blank the default will be used.') ?></p>
+	<p><?php _e('If you like, you may enter a custom prefix for your category URIs here. For example, <code>/index.php/taxonomy/tags</code> would make your category links like <code>http://example.org/index.php/taxonomy/tags/uncategorized/</code>. If you leave this blank the default will be used.') ?></p>
 <?php endif; ?>
 	<p> 
   <?php _e('Category base'); ?>: <input name="category_base" type="text" class="code"  value="<?php echo $category_base; ?>" size="30" /> 
@@ -102,8 +164,9 @@
     </p> 
   </form> 
 <?php if ( $permalink_structure && !$usingpi && !$writable ) : ?>
-  <p><?php _e('If your <code>.htaccess</code> was <a href="http://codex.wordpress.org/Make_a_Directory_Writable">writable</a> we could do this automatically, but it isn&#8217;t so these are the mod_rewrite rules you should have in your <code>.htaccess</code> file. Click in the field and press <kbd>CTRL + a</kbd> to select all.') ?></p>
+  <p><?php _e('If your <code>.htaccess</code> file were <a href="http://codex.wordpress.org/Make_a_Directory_Writable">writable</a>, we could do this automatically, but it isn&#8217;t so these are the mod_rewrite rules you should have in your <code>.htaccess</code> file. Click in the field and press <kbd>CTRL + a</kbd> to select all.') ?></p>
 <form action="options-permalink.php" method="post">
+<?php wp_nonce_field('update-permalink') ?>
    <p>
 <textarea rows="5" style="width: 98%;" name="rules"><?php echo $wp_rewrite->mod_rewrite_rules(); ?>
 </textarea>
@@ -113,4 +176,4 @@
 
 </div>
 
-<?php require('./admin-footer.php'); ?>
\ No newline at end of file
+<?php require('./admin-footer.php'); ?>
diff -ruN 1.5.2/wp-admin/options.php 2.0.4/wp-admin/options.php
--- 1.5.2/wp-admin/options.php	2005-04-23 12:36:33.000000000 -0500
+++ 2.0.4/wp-admin/options.php	2006-06-24 00:41:59.000000000 -0500
@@ -21,57 +21,53 @@
 	}
 }
 
-if ($user_level < 6)
+if ( !current_user_can('manage_options') )
 	die ( __('Cheatin&#8217; uh?') );
 
 switch($action) {
 
 case 'update':
 	$any_changed = 0;
-    
+	
+	check_admin_referer('update-options');
+
 	if (!$_POST['page_options']) {
 		foreach ($_POST as $key => $value) {
-			$option_names[] = "'$key'";
+			$options[] = $key;
 		}
-		$option_names = implode(',', $option_names);
 	} else {
-		$option_names = stripslashes($_POST['page_options']);
+		$options = explode(',', stripslashes($_POST['page_options']));
 	}
 
-    $options = $wpdb->get_results("SELECT $wpdb->options.option_id, option_name, option_type, option_value, option_admin_level FROM $wpdb->options WHERE option_name IN ($option_names)");
-
 	// Save for later.
 	$old_siteurl = get_settings('siteurl');
 	$old_home = get_settings('home');
 
-// HACK
-// Options that if not there have 0 value but need to be something like "closed"
-    $nonbools = array('default_ping_status', 'default_comment_status');
-    if ($options) {
-        foreach ($options as $option) {
-            // should we even bother checking?
-            if ($user_level >= $option->option_admin_level) {
-                $old_val = $option->option_value;
-                $new_val = trim($_POST[$option->option_name]);
-                if( in_array($option->option_name, $nonbools) && ( $new_val == '0' || $new_val == '') )
-					$new_val = 'closed';
-                if ($new_val !== $old_val) {
-                    $result = $wpdb->query("UPDATE $wpdb->options SET option_value = '$new_val' WHERE option_name = '$option->option_name'");
-					$any_changed++;
-				}
-            }
-        }
-        unset($cache_settings); // so they will be re-read
-        get_settings('siteurl'); // make it happen now
-    } // end if options
+	// HACK
+	// Options that if not there have 0 value but need to be something like "closed"
+	$nonbools = array('default_ping_status', 'default_comment_status');
+	if ($options) {
+		foreach ($options as $option) {
+			$option = trim($option);
+			$value = trim(stripslashes($_POST[$option]));
+				if( in_array($option, $nonbools) && ( $value == '0' || $value == '') )
+				$value = 'closed';
+			
+			if( $option == 'blogdescription' || $option == 'blogname' )
+				if (current_user_can('unfiltered_html') == false)
+					$value = wp_filter_post_kses( $value );
+			
+			if (update_option($option, $value) ) {
+				$any_changed++;
+			}
+		}
+	}
     
-    if ($any_changed) {
+	if ($any_changed) {
 			// If siteurl or home changed, reset cookies.
 			if ( get_settings('siteurl') != $old_siteurl || get_settings('home') != $old_home ) {
 				// If home changed, write rewrite rules to new location.
-				save_mod_rewrite_rules();
-				// Get currently logged in user and password.
-				get_currentuserinfo();
+				$wp_rewrite->flush_rules();
 				// Clear cookies for old paths.
 				wp_clearcookie();
 				// Set cookies for new paths.
@@ -81,10 +77,10 @@
 			//$message = sprintf(__('%d setting(s) saved... '), $any_changed);
     }
     
-		$referred = remove_query_arg('updated' , $_SERVER['HTTP_REFERER']);
-		$goback = add_query_arg('updated', 'true', $_SERVER['HTTP_REFERER']);
-		$goback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $goback);
-		wp_redirect($goback);
+	$referred = remove_query_arg('updated' , wp_get_referer());
+	$goback = add_query_arg('updated', 'true', wp_get_referer());
+	$goback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $goback);
+	wp_redirect($goback);
     break;
 
 default:
@@ -93,6 +89,7 @@
 <div class="wrap">
   <h2><?php _e('All options'); ?></h2>
   <form name="form" action="options.php" method="post">
+  <?php wp_nonce_field('update-options') ?>
   <input type="hidden" name="action" value="update" />
   <table width="98%">
 <?php
diff -ruN 1.5.2/wp-admin/options-reading.php 2.0.4/wp-admin/options-reading.php
--- 1.5.2/wp-admin/options-reading.php	2005-02-10 21:05:05.000000000 -0600
+++ 2.0.4/wp-admin/options-reading.php	2006-05-11 18:05:45.000000000 -0500
@@ -9,55 +9,57 @@
 
 <div class="wrap"> 
 <h2><?php _e('Reading Options') ?></h2> 
-<form name="form1" method="post" action="options.php"> 
-	<input type="hidden" name="action" value="update" /> 
-	<input type="hidden" name="page_options" value="'posts_per_page','what_to_show','posts_per_rss','rss_use_excerpt','blog_charset','gzipcompression' " /> 
-	<fieldset class="options"> 
-	<legend><?php _e('Blog Pages') ?></legend> 
-	<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
-		<tr valign="top"> 
-		<th width="33%" scope="row"><?php _e('Show at most:') ?></th> 
-		<td>
-		<input name="posts_per_page" type="text" id="posts_per_page" value="<?php form_option('posts_per_page'); ?>" size="3" /> 
-		<select name="what_to_show" id="what_to_show" > 
-			<option value="days" <?php selected('days', get_settings('what_to_show')); ?>><?php _e('days') ?></option> 
-			<option value="posts" <?php selected('posts', get_settings('what_to_show')); ?>><?php _e('posts') ?></option> 
-		</select>
-		</td> 
-		</tr> 
-	</table> 
-	</fieldset> 
+<form name="form1" method="post" action="options.php">
+<?php wp_nonce_field('update-options') ?>
 
-	<fieldset class="options"> 
-	<legend><?php _e('Syndication Feeds') ?></legend> 
-	<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
-		<tr valign="top"> 
-		<th width="33%" scope="row"><?php _e('Show the most recent:') ?></th> 
-		<td><input name="posts_per_rss" type="text" id="posts_per_rss" value="<?php form_option('posts_per_rss'); ?>" size="3" /> <?php _e('posts') ?></td> 
-		</tr>
-		<tr valign="top">
-		<th scope="row"><?php _e('For each article, show:') ?> </th>
-		<td>
-		<label><input name="rss_use_excerpt"  type="radio" value="0" <?php checked(0, get_settings('rss_use_excerpt')); ?>  /> <?php _e('Full text') ?></label><br />
-		<label><input name="rss_use_excerpt" type="radio" value="1" <?php checked(1, get_settings('rss_use_excerpt')); ?> /> <?php _e('Summary') ?></label>
-		</td>
-		</tr> 
-	</table> 
-	</fieldset> 
-	<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
-		<tr valign="top"> 
-		<th width="33%" scope="row"><?php _e('Encoding for pages and feeds:') ?></th> 
-		<td><input name="blog_charset" type="text" id="blog_charset" value="<?php form_option('blog_charset'); ?>" size="20" class="code" /><br />
-		<?php _e('The character encoding you write your blog in (UTF-8 is <a href="http://developer.apple.com/documentation/macos8/TextIntlSvcs/TextEncodingConversionManager/TEC1.5/TEC.b0.html">recommended</a>)') ?></td> 
-		</tr>
-	</table> 
-	<p>
-		<label><input type="checkbox" name="gzipcompression" value="1" <?php checked('1', get_settings('gzipcompression')); ?> /> 
-		 <?php _e('WordPress should compress articles (gzip) if browsers ask for them') ?></label>
-	</p>
-	<p class="submit"> 
-		<input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" /> 
-	</p> 
+<fieldset class="options"> 
+<legend><?php _e('Blog Pages') ?></legend> 
+<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
+<tr valign="top"> 
+<th width="33%" scope="row"><?php _e('Show at most:') ?></th> 
+<td>
+<input name="posts_per_page" type="text" id="posts_per_page" value="<?php form_option('posts_per_page'); ?>" size="3" /> 
+<select name="what_to_show" id="what_to_show" > 
+<option value="days" <?php selected('days', get_settings('what_to_show')); ?>><?php _e('days') ?></option> 
+<option value="posts" <?php selected('posts', get_settings('what_to_show')); ?>><?php _e('posts') ?></option> 
+</select>
+</td> 
+</tr> 
+</table> 
+</fieldset> 
+
+<fieldset class="options"> 
+<legend><?php _e('Syndication Feeds') ?></legend> 
+<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
+<tr valign="top"> 
+<th width="33%" scope="row"><?php _e('Show the most recent:') ?></th> 
+<td><input name="posts_per_rss" type="text" id="posts_per_rss" value="<?php form_option('posts_per_rss'); ?>" size="3" /> <?php _e('posts') ?></td> 
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('For each article, show:') ?> </th>
+<td>
+<label><input name="rss_use_excerpt"  type="radio" value="0" <?php checked(0, get_settings('rss_use_excerpt')); ?>  /> <?php _e('Full text') ?></label><br />
+<label><input name="rss_use_excerpt" type="radio" value="1" <?php checked(1, get_settings('rss_use_excerpt')); ?> /> <?php _e('Summary') ?></label>
+</td>
+</tr> 
+</table> 
+</fieldset> 
+<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
+<tr valign="top"> 
+<th width="33%" scope="row"><?php _e('Encoding for pages and feeds:') ?></th> 
+<td><input name="blog_charset" type="text" id="blog_charset" value="<?php form_option('blog_charset'); ?>" size="20" class="code" /><br />
+<?php _e('The character encoding you write your blog in (UTF-8 is <a href="http://developer.apple.com/documentation/macos8/TextIntlSvcs/TextEncodingConversionManager/TEC1.5/TEC.b0.html">recommended</a>)') ?></td> 
+</tr>
+</table> 
+<p>
+<label><input type="checkbox" name="gzipcompression" value="1" <?php checked('1', get_settings('gzipcompression')); ?> /> 
+<?php _e('WordPress should compress articles (gzip) if browsers ask for them') ?></label>
+</p>
+<p class="submit">
+<input type="hidden" name="action" value="update" /> 
+<input type="hidden" name="page_options" value="posts_per_page,what_to_show,posts_per_rss,rss_use_excerpt,blog_charset,gzipcompression" /> 
+<input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" /> 
+</p> 
 </form> 
 </div> 
 <?php include('./admin-footer.php'); ?>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/options-writing.php 2.0.4/wp-admin/options-writing.php
--- 1.5.2/wp-admin/options-writing.php	2005-03-21 22:52:50.000000000 -0600
+++ 2.0.4/wp-admin/options-writing.php	2006-05-11 18:05:45.000000000 -0500
@@ -8,81 +8,67 @@
 ?>
 
 <div class="wrap"> 
-  <h2><?php _e('Writing Options') ?></h2> 
-  <form name="form1" method="post" action="options.php"> 
-    <input type="hidden" name="action" value="update" /> 
-    <input type="hidden" name="page_options" value="'default_post_edit_rows','use_smilies','use_balanceTags','advanced_edit','ping_sites','mailserver_url', 'mailserver_port','mailserver_login','mailserver_pass','default_category','default_email_category','new_users_can_blog'" /> 
-    <table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
-      <tr valign="top">
-        <th scope="row"> <?php _e('When starting a post, show:') ?> </th>
-        <td><?php get_settings('advanced_edit') ?><label>
-          <input name="advanced_edit" type="radio" value="0" <?php checked('0', get_settings('advanced_edit')); ?> />
-<?php _e('Simple controls') ?></label>
-          <br />
-          <label for="advanced_edit">
-          <input name="advanced_edit" id="advanced_edit" type="radio" value="1" <?php checked('1', get_settings('advanced_edit')); ?> />
-<?php _e('Advanced controls') ?></label>
-		</td>
-      </tr>
-      <tr valign="top"> 
-        <th width="33%" scope="row"> <?php _e('Size of the writing box:') ?></th> 
-        <td><input name="default_post_edit_rows" type="text" id="default_post_edit_rows" value="<?php form_option('default_post_edit_rows'); ?>" size="2" style="width: 1.5em; " /> 
-         <?php _e('lines') ?></td> 
-      </tr> 
-      <tr valign="top">
-        <th scope="row"><?php _e('Formatting:') ?></th>
-        <td>          <label for="label">
-          <input name="use_smilies" type="checkbox" id="label" value="1" <?php checked('1', get_settings('use_smilies')); ?> />
-          <?php _e('Convert emoticons like <code>:-)</code> and <code>:-P</code> to graphics on display') ?></label> <br />          <label for="label2">
-  <input name="use_balanceTags" type="checkbox" id="label2" value="1" <?php checked('1', get_settings('use_balanceTags')); ?> />
-          <?php _e('WordPress should correct invalidly nested XHTML automatically') ?></label></td>
-      </tr>
-        	<tr valign="top">
-                <th scope="row"><?php _e('Default post category:') ?></th>
-        		<td><select name="default_category" id="default_category">
+<h2><?php _e('Writing Options') ?></h2> 
+<form method="post" action="options.php"> 
+<?php wp_nonce_field('update-options') ?>
+<table width="100%" cellspacing="2" cellpadding="5" class="editform"> 
+<tr valign="top"> 
+<th width="33%" scope="row"> <?php _e('Size of the post box:') ?></th> 
+<td><input name="default_post_edit_rows" type="text" id="default_post_edit_rows" value="<?php form_option('default_post_edit_rows'); ?>" size="2" style="width: 1.5em; " /> 
+<?php _e('lines') ?></td> 
+</tr> 
+<tr valign="top">
+<th scope="row"><?php _e('Formatting:') ?></th>
+<td>
+<label for="rich_editing">
+<input name="rich_editing" type="checkbox" id="rich_editing" value="true" <?php checked('true', get_settings('rich_editing')); ?> />
+<?php _e('Users should use the visual rich editor by default') ?></label><br />
+<label for="use_smilies">
+<input name="use_smilies" type="checkbox" id="use_smilies" value="1" <?php checked('1', get_settings('use_smilies')); ?> />
+<?php _e('Convert emoticons like <code>:-)</code> and <code>:-P</code> to graphics on display') ?></label><br />
+<label for="use_balanceTags"><input name="use_balanceTags" type="checkbox" id="use_balanceTags" value="1" <?php checked('1', get_settings('use_balanceTags')); ?> /> <?php _e('WordPress should correct invalidly nested XHTML automatically') ?></label>
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Default post category:') ?></th>
+<td><select name="default_category" id="default_category">
 <?php
 $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_name");
 foreach ($categories as $category) :
 if ($category->cat_ID == get_settings('default_category')) $selected = " selected='selected'";
 else $selected = '';
-	echo "\n\t<option value='$category->cat_ID' $selected>$category->cat_name</option>";
+echo "\n\t<option value='$category->cat_ID' $selected>$category->cat_name</option>";
 endforeach;
 ?>
-       			</select></td>
-	</tr>
-	<tr>
-        <th scope="row"><?php _e('Newly registered members:') ?></th> 
-        <td> <label for="new_users_can_blog0"><input name="new_users_can_blog" id="new_users_can_blog0" type="radio" value="0" <?php checked('0', get_settings('new_users_can_blog')); ?> /> <?php _e('Cannot write articles') ?></label><br />
-<label for="new_users_can_blog1"><input name="new_users_can_blog" id="new_users_can_blog1" type="radio" value="1" <?php checked('1', get_settings('new_users_can_blog')); ?> /> <?php _e('May submit drafts for review') ?></label><br />
-<label for="new_users_can_blog2"><input name="new_users_can_blog" id="new_users_can_blog2" type="radio" value="2" <?php checked('2', get_settings('new_users_can_blog')); ?> /> <?php _e('May publish articles') ?></label><br /></td> 
-	</tr> 
+</select></td>
+</tr>
 </table>
 
 <fieldset class="options">
-	<legend><?php _e('Writing by e-mail') ?></legend>
-	<p><?php printf(__('To post to WordPress by e-mail you must set up a secret e-mail account with POP3 access. Any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret. Here are three random strings you could use: <code>%s</code>, <code>%s</code>, <code>%s</code>.'), substr(md5(uniqid(microtime())),0,5), substr(md5(uniqid(microtime())),0,5), substr(md5(uniqid(microtime())),0,5)) ?></p>
-	
-	<table width="100%" cellspacing="2" cellpadding="5" class="editform">
-		<tr valign="top">
-			<th scope="row"><?php _e('Mail server:') ?></th>
-			<td><input name="mailserver_url" type="text" id="mailserver_url" value="<?php form_option('mailserver_url'); ?>" size="40" />
-			<label for="mailserver_port"><?php _e('Port:') ?></label> 
-			<input name="mailserver_port" type="text" id="mailserver_port" value="<?php form_option('mailserver_port'); ?>" size="6" />
-			</td>
-		</tr>
-		<tr valign="top">
-			<th width="33%" scope="row"><?php _e('Login name:') ?></th>
-			<td><input name="mailserver_login" type="text" id="mailserver_login" value="<?php form_option('mailserver_login'); ?>" size="40" /></td>
-		</tr>
-		<tr valign="top">
-			<th scope="row"><?php _e('Password:') ?></th>
-			<td>
-				<input name="mailserver_pass" type="text" id="mailserver_pass" value="<?php form_option('mailserver_pass'); ?>" size="40" />
-			</td>
-		</tr>
-		<tr valign="top">
-			<th scope="row"><?php _e('Default post by mail category:') ?></th>
-			<td><select name="default_email_category" id="default_email_category">
+<legend><?php _e('Writing by e-mail') ?></legend>
+<p><?php printf(__('To post to WordPress by e-mail you must set up a secret e-mail account with POP3 access. Any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret. Here are three random strings you could use: <code>%s</code>, <code>%s</code>, <code>%s</code>.'), substr(md5(uniqid(microtime())),0,5), substr(md5(uniqid(microtime())),0,5), substr(md5(uniqid(microtime())),0,5)) ?></p>
+
+<table width="100%" cellspacing="2" cellpadding="5" class="editform">
+<tr valign="top">
+<th scope="row"><?php _e('Mail server:') ?></th>
+<td><input name="mailserver_url" type="text" id="mailserver_url" value="<?php form_option('mailserver_url'); ?>" size="40" />
+<label for="mailserver_port"><?php _e('Port:') ?></label> 
+<input name="mailserver_port" type="text" id="mailserver_port" value="<?php form_option('mailserver_port'); ?>" size="6" />
+</td>
+</tr>
+<tr valign="top">
+<th width="33%" scope="row"><?php _e('Login name:') ?></th>
+<td><input name="mailserver_login" type="text" id="mailserver_login" value="<?php form_option('mailserver_login'); ?>" size="40" /></td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Password:') ?></th>
+<td>
+<input name="mailserver_pass" type="text" id="mailserver_pass" value="<?php form_option('mailserver_pass'); ?>" size="40" />
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Default post by mail category:') ?></th>
+<td><select name="default_email_category" id="default_email_category">
 <?php
 //Alreay have $categories from default_category
 foreach ($categories as $category) :
@@ -91,20 +77,22 @@
 echo "\n\t<option value='$category->cat_ID' $selected>$category->cat_name</option>";
 endforeach;
 ?>
-			</select></td>
-		</tr>
-	</table>
+</select></td>
+</tr>
+</table>
 </fieldset>
 
 <fieldset class="options">
-	<legend><?php _e('Update Services') ?></legend>
-          <p><?php _e('When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see <a href="http://codex.wordpress.org/Update_Services">Update Services</a> on the Codex. Separate multiple service URIs with line breaks.') ?></p>
-	
-	<textarea name="ping_sites" id="ping_sites" style="width: 98%;" rows="3" cols="50"><?php form_option('ping_sites'); ?></textarea>
+<legend><?php _e('Update Services') ?></legend>
+<p><?php _e('When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see <a href="http://codex.wordpress.org/Update_Services">Update Services</a> on the Codex. Separate multiple service URIs with line breaks.') ?></p>
+
+<textarea name="ping_sites" id="ping_sites" style="width: 98%;" rows="3" cols="50"><?php form_option('ping_sites'); ?></textarea>
 </fieldset>
 
-<p class="submit"> 
-	<input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" /> 
+<p class="submit">
+<input type="hidden" name="action" value="update" /> 
+<input type="hidden" name="page_options" value="default_post_edit_rows,use_smilies,rich_editing,ping_sites,mailserver_url,mailserver_port,mailserver_login,mailserver_pass,default_category,default_email_category,use_balanceTags" /> 
+<input type="submit" name="Submit" value="<?php _e('Update Options') ?> &raquo;" /> 
 </p>
 </form> 
 </div> 
diff -ruN 1.5.2/wp-admin/page-new.php 2.0.4/wp-admin/page-new.php
--- 1.5.2/wp-admin/page-new.php	2004-11-16 13:29:51.000000000 -0600
+++ 2.0.4/wp-admin/page-new.php	2006-05-11 18:05:45.000000000 -0500
@@ -2,26 +2,19 @@
 require_once('admin.php');
 $title = __('New Page');
 $parent_file = 'post.php';
+$editing = true;
 require_once('admin-header.php');
-
-get_currentuserinfo();
 ?>
 
 <?php if ( isset($_GET['saved']) ) : ?>
-<div class="updated"><p><strong><?php _e('Page saved.') ?> <a href="edit-pages.php"><?php _e('Manage pages'); ?> &raquo;</a></strong></p></div>
+<div id="message" class="updated fade"><p><strong><?php _e('Page saved.') ?> <a href="edit-pages.php"><?php _e('Manage pages'); ?> &raquo;</a></strong></p></div>
 <?php endif; ?>
 
 <?php
-if ($user_level > 0) {
+if ( current_user_can('edit_pages') ) {
 	$action = 'post';
-	get_currentuserinfo();
-	//set defaults
-	$post_status = 'static';
-	$comment_status = get_settings('default_comment_status');
-	$ping_status = get_settings('default_ping_status');
-	$post_pingback = get_settings('default_pingback_flag');
-	$post_parent = 0;
-	$page_template = 'default';
+	$post = get_default_post_to_edit();
+	$post->post_status = 'static';
 
 	include('edit-page-form.php');
 }
diff -ruN 1.5.2/wp-admin/plugin-editor.php 2.0.4/wp-admin/plugin-editor.php
--- 1.5.2/wp-admin/plugin-editor.php	2005-02-24 12:13:02.000000000 -0600
+++ 2.0.4/wp-admin/plugin-editor.php	2006-06-27 18:10:02.000000000 -0500
@@ -34,18 +34,19 @@
 
 case 'update':
 
-	if ($user_level < 5) {
-		die(__('<p>You have do not have sufficient permissions to edit templates for this blog.</p>'));
-	}
+	check_admin_referer('edit-plugin_' . $file);
+
+	if ( !current_user_can('edit_plugins') )
+	die('<p>'.__('You have do not have sufficient permissions to edit templates for this blog.').'</p>');
 
 	$newcontent = stripslashes($_POST['newcontent']);
 	if (is_writeable($real_file)) {
 		$f = fopen($real_file, 'w+');
 		fwrite($f, $newcontent);
 		fclose($f);
-		header("Location: plugin-editor.php?file=$file&a=te");
+		wp_redirect("plugin-editor.php?file=$file&a=te");
 	} else {
-		header("Location: plugin-editor.php?file=$file");
+		wp_redirect("plugin-editor.php?file=$file");
 	}
 
 	exit();
@@ -55,9 +56,8 @@
 default:
 	
 	require_once('admin-header.php');
-	if ($user_level <= 5) {
-		die(__('<p>You have do not have sufficient permissions to edit plugins for this blog.</p>'));
-	}
+	if ( !current_user_can('edit_plugins') )
+	die('<p>'.__('You have do not have sufficient permissions to edit plugins for this blog.').'</p>');
 
 	update_recently_edited("wp-content/plugins/$file");
 	
@@ -72,7 +72,7 @@
 
 	?>
 <?php if (isset($_GET['a'])) : ?>
- <div class="updated"><p><?php _e('File edited successfully.') ?></p></div>
+ <div id="message" class="updated fade"><p><?php _e('File edited successfully.') ?></p></div>
 <?php endif; ?>
  <div class="wrap"> 
   <?php
@@ -97,6 +97,7 @@
 </div>
 	<?php	if (!$error) { ?> 
   <form name="template" id="template" action="plugin-editor.php" method="post">
+  <?php wp_nonce_field('edit-plugin_' . $file) ?>
 		 <div><textarea cols="70" rows="25" name="newcontent" id="newcontent" tabindex="1"><?php echo $content ?></textarea> 
      <input type="hidden" name="action" value="update" /> 
      <input type="hidden" name="file" value="<?php echo $file ?>" /> 
@@ -108,14 +109,15 @@
 ?>
 </p>
 <?php else : ?>
-<p><em><?php _e('If this file was writable you could edit it.'); ?></em></p>
+<p><em><?php _e('If this file were writable you could edit it.'); ?></em></p>
 <?php endif; ?>
    </form> 
   <?php
 	} else {
 		echo '<div class="error"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>';
 	}
-	?> 
+	?>
+<div class="clear"> &nbsp; </div>
 </div> 
 <?php
 break;
diff -ruN 1.5.2/wp-admin/plugins.php 2.0.4/wp-admin/plugins.php
--- 1.5.2/wp-admin/plugins.php	2005-05-09 06:37:36.000000000 -0500
+++ 2.0.4/wp-admin/plugins.php	2006-06-27 18:10:02.000000000 -0500
@@ -2,24 +2,26 @@
 require_once('admin.php');
 
 if ( isset($_GET['action']) ) {
-	check_admin_referer();
-
 	if ('activate' == $_GET['action']) {
+		check_admin_referer('activate-plugin_' . $_GET['plugin']);
 		$current = get_settings('active_plugins');
 		if (!in_array($_GET['plugin'], $current)) {
 			$current[] = trim( $_GET['plugin'] );
+			sort($current);
+			update_option('active_plugins', $current);
+			include(ABSPATH . 'wp-content/plugins/' . trim( $_GET['plugin'] ));
+			do_action('activate_' . trim( $_GET['plugin'] ));
 		}
-		sort($current);
-		update_option('active_plugins', $current);
-		header('Location: plugins.php?activate=true');
-	}
-	
-	if ('deactivate' == $_GET['action']) {
+		wp_redirect('plugins.php?activate=true');
+	} else if ('deactivate' == $_GET['action']) {
+		check_admin_referer('deactivate-plugin_' . $_GET['plugin']);
 		$current = get_settings('active_plugins');
 		array_splice($current, array_search( $_GET['plugin'], $current), 1 ); // Array-fu!
 		update_option('active_plugins', $current);
-		header('Location: plugins.php?deactivate=true');
+		do_action('deactivate_' . trim( $_GET['plugin'] ));
+		wp_redirect('plugins.php?deactivate=true');
 	}
+	exit;
 }
 
 $title = __('Manage Plugins');
@@ -42,24 +44,27 @@
 foreach ($check_plugins as $check_plugin) {
 	if (!file_exists(ABSPATH . 'wp-content/plugins/' . $check_plugin)) {
 			$current = get_settings('active_plugins');
-			unset($current[$_GET['plugin']]);
-			update_option('active_plugins', $current);
+			$key = array_search($check_plugin, $current);
+			if ( false !== $key && NULL !== $key ) {
+				unset($current[$key]);
+				update_option('active_plugins', $current);
+			}
 	}
 }
 ?>
 
 <?php if (isset($_GET['activate'])) : ?>
-<div class="updated"><p><?php _e('Plugin <strong>activated</strong>.') ?></p>
+<div id="message" class="updated fade"><p><?php _e('Plugin <strong>activated</strong>.') ?></p>
 </div>
 <?php endif; ?>
 <?php if (isset($_GET['deactivate'])) : ?>
-<div class="updated"><p><?php _e('Plugin <strong>deactivated</strong>.') ?></p>
+<div id="message" class="updated fade"><p><?php _e('Plugin <strong>deactivated</strong>.') ?></p>
 </div>
 <?php endif; ?>
 
 <div class="wrap">
 <h2><?php _e('Plugin Management'); ?></h2>
-<p><?php _e('Plugins are files you usually download separately from WordPress that add functionality. To install a plugin you generally just need to put the plugin file into your <code>wp-content/plugins</code> directory. Once a plugin is installed, you may activate it or deactivate it here. If something goes wrong with a plugin and you can&#8217;t use WordPress, delete that plugin from the <code>wp-content/plugins</code> directory and it will be automatically deactivated.'); ?></p>
+<p><?php _e('Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.'); ?></p>
 <?php
 
 if ( get_settings('active_plugins') )
@@ -68,38 +73,45 @@
 $plugins = get_plugins();
 
 if (empty($plugins)) {
-	_e("<p>Couldn't open plugins directory or there are no plugins available.</p>"); // TODO: make more helpful
+	echo '<p>';
+	_e("Couldn't open plugins directory or there are no plugins available."); // TODO: make more helpful
+	echo '</p>';
 } else {
 ?>
 <table width="100%" cellpadding="3" cellspacing="3">
 	<tr>
 		<th><?php _e('Plugin'); ?></th>
 		<th><?php _e('Version'); ?></th>
-		<th><?php _e('Author'); ?></th>
 		<th><?php _e('Description'); ?></th>
 		<th><?php _e('Action'); ?></th>
 	</tr>
 <?php
 	$style = '';
+
+	function sort_plugins($plug1, $plug2) {
+		return strnatcasecmp($plug1['Name'], $plug2['Name']);
+	}
+	
+	uksort($plugins, 'sort_plugins');
+
 	foreach($plugins as $plugin_file => $plugin_data) {
 		$style = ('class="alternate"' == $style|| 'class="alternate active"' == $style) ? '' : 'alternate';
 
 		if (!empty($current_plugins) && in_array($plugin_file, $current_plugins)) {
-			$action = "<a href='plugins.php?action=deactivate&amp;plugin=$plugin_file' title='".__('Deactivate this plugin')."' class='delete'>".__('Deactivate')."</a>";
+			$action = "<a href='" . wp_nonce_url("plugins.php?action=deactivate&amp;plugin=$plugin_file", 'deactivate-plugin_' . $plugin_file) . "' title='".__('Deactivate this plugin')."' class='delete'>".__('Deactivate')."</a>";
 			$plugin_data['Title'] = "<strong>{$plugin_data['Title']}</strong>";
 			$style .= $style == 'alternate' ? ' active' : 'active';
 		} else {
-			$action = "<a href='plugins.php?action=activate&amp;plugin=$plugin_file' title='".__('Activate this plugin')."' class='edit'>".__('Activate')."</a>";
+			$action = "<a href='" . wp_nonce_url("plugins.php?action=activate&amp;plugin=$plugin_file", 'activate-plugin_' . $plugin_file) . "' title='".__('Activate this plugin')."' class='edit'>".__('Activate')."</a>";
 		}
 		$plugin_data['Description'] = wp_kses($plugin_data['Description'], array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array()) ); ;
 		if ($style != '') $style = 'class="' . $style . '"';
 		echo "
 	<tr $style>
-		<td class=\"name\">{$plugin_data['Title']}</td>
-		<td class=\"vers\">{$plugin_data['Version']}</td>
-		<td class=\"auth\">{$plugin_data['Author']}</td>
-		<td class=\"desc\">{$plugin_data['Description']}</td>
-		<td class=\"togl\">$action</td>
+		<td class='name'>{$plugin_data['Title']}</td>
+		<td class='vers'>{$plugin_data['Version']}</td>
+		<td class='desc'>{$plugin_data['Description']} <cite>".sprintf(__('By %s'), $plugin_data['Author']).".</cite></td>
+		<td class='togl'>$action</td>
 	</tr>";
 	}
 ?>
@@ -109,6 +121,8 @@
 }
 ?>
 
+<p><?php _e('If something goes wrong with a plugin and you can&#8217;t use WordPress, delete or rename that file in the <code>wp-content/plugins</code> directory and it will be automatically deactivated.'); ?></p>
+
 <h2><?php _e('Get More Plugins'); ?></h2>
 <p><?php _e('You can find additional plugins for your site in the <a href="http://wordpress.org/extend/plugins/">WordPress plugin directory</a>. To install a plugin you generally just need to upload the plugin file into your <code>wp-content/plugins</code> directory. Once a plugin is uploaded, you may activate it here.'); ?></p>
 
diff -ruN 1.5.2/wp-admin/post.php 2.0.4/wp-admin/post.php
--- 1.5.2/wp-admin/post.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/wp-admin/post.php	2006-07-28 17:09:09.000000000 -0500
@@ -22,133 +22,23 @@
 $action = "delete";
 }
 
-	// Fix submenu highlighting for pages.
-if (false !== strpos($_SERVER['HTTP_REFERER'], 'edit-pages.php')) $submenu_file = 'page-new.php';
+// Fix submenu highlighting for pages.
+if ( isset($_REQUEST['post']) && 'static' == get_post_status($_REQUEST['post']) )
+	$submenu_file = 'page-new.php';
 
 $editing = true;
 
 switch($action) {
 case 'post':
-
-	if ( !user_can_create_draft($user_ID) )
-		die( __('You are not allowed to create posts or drafts on this blog.') );
-
-	$post_pingback = (int) $_POST['post_pingback'];
-	$content         = apply_filters('content_save_pre',  $_POST['content']);
-	$excerpt         = apply_filters('excerpt_save_pre',  $_POST['excerpt']);
-	$post_title      = apply_filters('title_save_pre',    $_POST['post_title']);
-	$post_categories = apply_filters('category_save_pre', $_POST['post_category']);
-	$post_status     = apply_filters('status_save_pre',   $_POST['post_status']);
-	$post_name       = apply_filters('name_save_pre',     $_POST['post_name']);
-	$post_parent = 0;
-	$menu_order  = 0;
-	
-
-	if ( isset($_POST['parent_id']) )
-		$post_parent = (int) $_POST['parent_id'];
-
-	if ( isset($_POST['menu_order']) )
-		$menu_order = (int) $_POST['menu_order'];
-
-	if (! empty($_POST['post_author_override'])) {
-		$post_author = (int) $_POST['post_author_override'];
-	} else if (! empty($_POST['post_author'])) {
-		$post_author = (int) $_POST['post_author'];
-	} else {
-		$post_author = (int) $_POST['user_ID'];
-	}
-	if ( !user_can_edit_user($user_ID, $post_author) )
-		die( __('You cannot post as this user.') );
-
-	if ( empty($post_status) )
-		$post_status = 'draft';
-	// Double-check
-	if ( 'publish' == $post_status && (!user_can_create_post($user_ID)) )
-		$post_status = 'draft';
-		
-	$comment_status = $_POST['comment_status'];
-	if ( empty($comment_status) ) {
-		if ( !isset($_POST['advanced_view']) )
-			$comment_status = get_option('default_comment_status');
-		else
-			$comment_status = 'closed';
-		}
-
-	$ping_status = $_POST['ping_status'];
-	if ( empty($ping_status) ) {
-		if ( !isset($_POST['advanced_view']) )
-			$ping_status = get_option('default_ping_status');			
-		else
-			$ping_status = 'closed';
-		}
-
-	$post_password = $_POST['post_password'];
+	check_admin_referer('add-post');
 	
-	$trackback = $_POST['trackback_url'];
-	$trackback = preg_replace('|\s+|', "\n", $trackback);
-
-	if (user_can_set_post_date($user_ID) && (!empty($_POST['edit_date']))) {
-		$aa = $_POST['aa'];
-		$mm = $_POST['mm'];
-		$jj = $_POST['jj'];
-		$hh = $_POST['hh'];
-		$mn = $_POST['mn'];
-		$ss = $_POST['ss'];
-		$jj = ($jj > 31) ? 31 : $jj;
-		$hh = ($hh > 23) ? $hh - 24 : $hh;
-		$mn = ($mn > 59) ? $mn - 60 : $mn;
-		$ss = ($ss > 59) ? $ss - 60 : $ss;
-		$now = "$aa-$mm-$jj $hh:$mn:$ss";
-		$now_gmt = get_gmt_from_date("$aa-$mm-$jj $hh:$mn:$ss");
-	} else {
-		$now = current_time('mysql');
-		$now_gmt = current_time('mysql', 1);
-	}
-
-	// What to do based on which button they pressed
-	if ('' != $_POST['saveasdraft']) $post_status = 'draft';
-	if ('' != $_POST['saveasprivate']) $post_status = 'private';
-	if ('' != $_POST['publish']) $post_status = 'publish';
-	if ('' != $_POST['advanced']) $post_status = 'draft';
-	if ('' != $_POST['savepage']) $post_status = 'static';
-
-
-
-	$id_result = $wpdb->get_row("SHOW TABLE STATUS LIKE '$wpdb->posts'");
-	$post_ID = $id_result->Auto_increment;
-
-	if ( empty($post_name) ) {
-		if ( 'draft' != $post_status )
-			$post_name = sanitize_title($post_title, $post_ID);
-	} else {
-		$post_name = sanitize_title($post_name, $post_ID);
-	}
-
-	if ('publish' == $post_status) {
-		$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1");
-		if ($post_name_check) {
-			$suffix = 2;
-			while ($post_name_check) {
-				$alt_post_name = $post_name . "-$suffix";
-				$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1");
-				$suffix++;
-			}
-			$post_name = $alt_post_name;
-		}
-	}
-
-	$postquery ="INSERT INTO $wpdb->posts
-			(ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt,  post_status, comment_status, ping_status, post_password, post_name, to_ping, post_modified, post_modified_gmt, post_parent, menu_order)
-			VALUES
-			('$post_ID', '$post_author', '$now', '$now_gmt', '$content', '$post_title', '$excerpt', '$post_status', '$comment_status', '$ping_status', '$post_password', '$post_name', '$trackback', '$now', '$now_gmt', '$post_parent', '$menu_order')
-			";
-
-	$result = $wpdb->query($postquery);
+	$post_ID = write_post();
 
+	// Redirect.
 	if (!empty($_POST['mode'])) {
 	switch($_POST['mode']) {
 		case 'bookmarklet':
-			$location = 'bookmarklet.php?a=b';
+			$location = $_POST['referredby'];
 			break;
 		case 'sidebar':
 			$location = 'sidebar.php?a=b';
@@ -164,49 +54,10 @@
 	if ( 'static' == $_POST['post_status'] )
 		$location = "page-new.php?saved=true";
 
-	if ( '' != $_POST['advanced'] || isset($_POST['save']) )
+	if ( isset($_POST['save']) )
 		$location = "post.php?action=edit&post=$post_ID";
 
-	header("Location: $location"); // Send user on their way while we keep working
-
-	// Insert categories
-	// Check to make sure there is a category, if not just set it to some default
-	if (!$post_categories) $post_categories[] = get_option('default_category');
-	foreach ($post_categories as $post_category) {
-		// Double check it's not there already
-		$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_ID AND category_id = $post_category");
-
-		 if (!$exists) { 
-			$wpdb->query("
-			INSERT INTO $wpdb->post2cat
-			(post_id, category_id)
-			VALUES
-			($post_ID, $post_category)
-			");
-		}
-	}
-
-	add_meta($post_ID);
-
-	$wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
-
-	do_action('save_post', $post_ID);
-
-	if ('publish' == $post_status) {
-		do_action('publish_post', $post_ID);
-		if ($post_pingback)
-			register_shutdown_function('pingback', $content, $post_ID);
-		register_shutdown_function('do_enclose', $content, $post_ID );
-		register_shutdown_function('do_trackbacks', $post_ID);
-	}
-
-	if ($post_status == 'static') {
-		generate_page_rewrite_rules();
-		add_post_meta($post_ID, '_wp_page_template',  $_POST['page_template'], true);
-	}
-
-	require_once('admin-header.php');
-
+	wp_redirect($location);
 	exit();
 	break;
 
@@ -215,259 +66,98 @@
 
 	require_once('admin-header.php');
 
-	$post = $post_ID = $p = (int) $_GET['post'];
+	$post_ID = $p = (int) $_GET['post'];
 
-	if ( !user_can_edit_post($user_ID, $post_ID) )
+	if ( !current_user_can('edit_post', $post_ID) )
 		die ( __('You are not allowed to edit this post.') );
-		
-	$postdata = &get_post($post_ID);
-	$content = $postdata->post_content;
-	$content = format_to_edit($content);
-	$content = apply_filters('content_edit_pre', $content);
-	$excerpt = $postdata->post_excerpt;
-	$excerpt = format_to_edit($excerpt);
-	$excerpt = apply_filters('excerpt_edit_pre', $excerpt);
-	$edited_post_title = format_to_edit($postdata->post_title);
-	$edited_post_title = apply_filters('title_edit_pre', $edited_post_title);
-	$post_status = $postdata->post_status;
-	$comment_status = $postdata->comment_status;
-	$ping_status = $postdata->ping_status;
-	$post_password = $postdata->post_password;
-	$to_ping = $postdata->to_ping;
-	$pinged = $postdata->pinged;
-	$post_name = $postdata->post_name;
-	$post_parent = $postdata->post_parent;
-	$post_author = $postdata->post_author;
-	$menu_order = $postdata->menu_order;
-
-	if( 'private' == $postdata->post_status && $postdata->post_author != $user_ID )
-		die ( __('You are not allowed to view other users\' private posts.') );
 
-	if ($post_status == 'static') {
-		$page_template = get_post_meta($post_ID, '_wp_page_template', true);
+	$post = get_post_to_edit($post_ID);
+	
+	if ($post->post_status == 'static')
 		include('edit-page-form.php');
-	} else {
+	else
 		include('edit-form-advanced.php');
-	}
 
-	$post = &$postdata;
 	?>
 	<div id='preview' class='wrap'>
-	<h2><?php _e('Post Preview (updated when post is saved)'); ?></h2>
-	<h3 class="storytitle" id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__("Permanent Link: %s"), get_the_title()); ?>"><?php the_title(); ?></a></h3>
-	<div class="meta"><?php _e("Filed under:"); ?> <?php the_category(','); ?> &#8212; <?php the_author() ?> @ <?php the_time() ?></div>
-
-	<div class="storycontent">
-	<?php 
-	$content = apply_filters('the_content', $post->post_content);
-	echo $content;
-	?>
-	</div>
+	<h2 id="preview-post"><?php _e('Post Preview (updated when post is saved)'); ?> <small class="quickjump"><a href="#write-post"><?php _e('edit &uarr;'); ?></a></small></h2>
+		<iframe src="<?php echo add_query_arg('preview', 'true', get_permalink($post->ID)); ?>" width="100%" height="600" ></iframe>
 	</div>
 	<?php
 	break;
 
-case 'editpost':
-	// die(var_dump('<pre>', $_POST));
-	if (!isset($blog_ID)) {
-		$blog_ID = 1;
-	}
-	$post_ID = (int) $_POST['post_ID'];
-
-	if (!user_can_edit_post($user_ID, $post_ID, $blog_ID))
-		die( __('You are not allowed to edit this post.') );
+case 'editattachment':
+	$post_id = (int) $_POST['post_ID'];
 
-	$post_categories = $_POST['post_category'];
-	if (!$post_categories) $post_categories[] = 1;
-	$content = apply_filters('content_save_pre', $_POST['content']);
-	$excerpt = apply_filters('excerpt_save_pre', $_POST['excerpt']);
-	$post_title = $_POST['post_title'];
-	$prev_status = $_POST['prev_status'];
-	$post_status = $_POST['post_status'];
-	$menu_order = (int) $_POST['menu_order'];
-	if (! empty($_POST['post_author_override'])) {
-		$post_author = (int) $_POST['post_author_override'];
-	} else if (! empty($_POST['post_author'])) {
-		$post_author = (int) $_POST['post_author'];
-	} else {
-		$post_author = (int) $_POST['user_ID'];
-	}
-	if ( !user_can_edit_user($user_ID, $post_author) )
-		die( __('You cannot post as this user.') );
+	check_admin_referer('update-attachment_' . $post_id);
 
-	$comment_status = $_POST['comment_status'];
-	if (empty($comment_status)) $comment_status = 'closed';
-	//if (!$_POST['comment_status']) $comment_status = get_settings('default_comment_status');
+	// Don't let these be changed
+	unset($_POST['guid']);
+	$_POST['post_status'] = 'attachment';
+
+	// Update the thumbnail filename
+	$oldmeta = $newmeta = get_post_meta($post_id, '_wp_attachment_metadata', true);
+	$newmeta['thumb'] = $_POST['thumb'];
+
+	if ( '' !== $oldmeta )
+		update_post_meta($post_id, '_wp_attachment_metadata', $newmeta, $oldmeta);
+	else
+		add_post_meta($post_id, '_wp_attachment_metadata', $newmeta);
 
-	$ping_status = $_POST['ping_status'];
-	if (empty($ping_status)) $ping_status = 'closed';
-	//if (!$_POST['ping_status']) $ping_status = get_settings('default_ping_status');
-	$post_password = $_POST['post_password'];
-	$post_name = $_POST['post_name'];
-
-	$post_parent = 0;
-	if (isset($_POST['parent_id'])) {
-		$post_parent = (int) $_POST['parent_id'];
-	}
-
-	$trackback = $_POST['trackback_url'];
-	// Format trackbacks
-	$trackback = preg_replace('|\s+|', '\n', $trackback);
+case 'editpost':
+	$post_ID = (int) $_POST['post_ID'];
+	check_admin_referer('update-post_' . $post_ID);
 	
-	if (isset($_POST['publish'])) $post_status = 'publish';
-	// Double-check
-	if ( 'publish' == $post_status && (!user_can_create_post($user_ID)) )
-		$post_status = 'draft';
-
-	if ( empty($post_name) ) {
-		if ( 'draft' != $post_status )
-			$post_name = sanitize_title($post_title, $post_ID);
-	} else {
-		$post_name = sanitize_title($post_name, $post_ID);
-	}
-
-	if ('publish' == $post_status) {
-		$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1");
-		if ($post_name_check) {
-			$suffix = 2;
-			while ($post_name_check) {
-				$alt_post_name = $post_name . "-$suffix";
-				$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1");
-				$suffix++;
-			}
-			$post_name = $alt_post_name;
-		}
-	}
-
-	if (user_can_edit_post_date($user_ID, $post_ID) && (!empty($_POST['edit_date']))) {
-		$aa = $_POST['aa'];
-		$mm = $_POST['mm'];
-		$jj = $_POST['jj'];
-		$hh = $_POST['hh'];
-		$mn = $_POST['mn'];
-		$ss = $_POST['ss'];
-		$jj = ($jj > 31) ? 31 : $jj;
-		$hh = ($hh > 23) ? $hh - 24 : $hh;
-		$mn = ($mn > 59) ? $mn - 60 : $mn;
-		$ss = ($ss > 59) ? $ss - 60 : $ss;
-		$datemodif = ", post_date = '$aa-$mm-$jj $hh:$mn:$ss'";
-	$datemodif_gmt = ", post_date_gmt = '".get_gmt_from_date("$aa-$mm-$jj $hh:$mn:$ss")."'";
-	} else {
-		$datemodif = '';
-		$datemodif_gmt = '';
-	}
-
-	$now = current_time('mysql');
-	$now_gmt = current_time('mysql', 1);
-
-	$result = $wpdb->query("
-		UPDATE $wpdb->posts SET
-			post_content = '$content',
-			post_excerpt = '$excerpt',
-			post_title = '$post_title'"
-			.$datemodif_gmt
-			.$datemodif.",			
-			post_status = '$post_status',
-			comment_status = '$comment_status',
-			ping_status = '$ping_status',
-			post_author = '$post_author',
-			post_password = '$post_password',
-			post_name = '$post_name',
-			to_ping = '$trackback',
-			post_modified = '$now',
-			post_modified_gmt = '$now_gmt',
-			menu_order = '$menu_order',
-			post_parent = '$post_parent'
-		WHERE ID = $post_ID ");
+	$post_ID = edit_post();
 
+	$referredby = '';
+	if ( !empty($_POST['referredby']) )
+		$referredby = preg_replace('|https?://[^/]+|i', '', $_POST['referredby']);
+	$referer = preg_replace('|https?://[^/]+|i', '', wp_get_referer());
+	
 	if ($_POST['save']) {
-		$location = $_SERVER['HTTP_REFERER'];
+		$location = wp_get_referer();
 	} elseif ($_POST['updatemeta']) {
-		$location = $_SERVER['HTTP_REFERER'] . '&message=2#postcustom';
+		$location = wp_get_referer() . '&message=2#postcustom';
 	} elseif ($_POST['deletemeta']) {
-		$location = $_SERVER['HTTP_REFERER'] . '&message=3#postcustom';
-	} elseif (isset($_POST['referredby']) && $_POST['referredby'] != $_SERVER['HTTP_REFERER']) {
+		$location = wp_get_referer() . '&message=3#postcustom';
+	} elseif (!empty($referredby) && $referredby != $referer) {
 		$location = $_POST['referredby'];
 		if ( $_POST['referredby'] == 'redo' )
 			$location = get_permalink( $post_ID );
+	} elseif ($action == 'editattachment') {
+		$location = 'attachments.php';
 	} else {
 		$location = 'post.php';
 	}
-	header ('Location: ' . $location); // Send user on their way while we keep working
-
-	// Meta Stuff
-	if ($_POST['meta']) :
-		foreach ($_POST['meta'] as $key => $value) :
-			update_meta($key, $value['key'], $value['value']);
-		endforeach;
-	endif;
-
-	if ($_POST['deletemeta']) :
-		foreach ($_POST['deletemeta'] as $key => $value) :
-			delete_meta($key);
-		endforeach;
-	endif;
-
-	add_meta($post_ID);
-
-	// Now it's category time!
-	// First the old categories
-	$old_categories = $wpdb->get_col("SELECT category_id FROM $wpdb->post2cat WHERE post_id = $post_ID");
-	
-	// Delete any?
-	foreach ($old_categories as $old_cat) {
-		if (!in_array($old_cat, $post_categories)) // If a category was there before but isn't now
-			$wpdb->query("DELETE FROM $wpdb->post2cat WHERE category_id = $old_cat AND post_id = $post_ID LIMIT 1");
-	}
-	
-	// Add any?
-	foreach ($post_categories as $new_cat) {
-		if (!in_array($new_cat, $old_categories))
-			$wpdb->query("INSERT INTO $wpdb->post2cat (post_id, category_id) VALUES ($post_ID, $new_cat)");
-	}
 
-	if ($prev_status != 'publish' && $post_status == 'publish')
-		do_action('private_to_published', $post_ID);
-
-	do_action('edit_post', $post_ID);
-
-	if ($post_status == 'publish') {
-		do_action('publish_post', $post_ID);
-		register_shutdown_function('do_trackbacks', $post_ID);
-		register_shutdown_function('do_enclose', $content, $post_ID );
-		if ( get_option('default_pingback_flag') )
-			register_shutdown_function('pingback', $content, $post_ID);
-	}
-
-	if ($post_status == 'static') {
-		generate_page_rewrite_rules();
-
-		if ( ! update_post_meta($post_ID, '_wp_page_template',  $_POST['page_template'])) {
-			add_post_meta($post_ID, '_wp_page_template',  $_POST['page_template'], true);
-		}
-	}
+	wp_redirect($location); // Send user on their way while we keep working
 
 	exit();
 	break;
 
 case 'delete':
-	check_admin_referer();
-
 	$post_id = (isset($_GET['post']))  ? intval($_GET['post']) : intval($_POST['post_ID']);
+	check_admin_referer('delete-post_' . $post_id);
+
+	$post = & get_post($post_id);
 	
-	if (!user_can_delete_post($user_ID, $post_id)) {
+	if ( !current_user_can('edit_post', $post_id) )	
 		die( __('You are not allowed to delete this post.') );
-	}
 
-	if (! wp_delete_post($post_id))
-		die( __('Error in deleting...') );
+	if ( $post->post_status == 'attachment' ) {
+		if ( ! wp_delete_attachment($post_id) )
+			die( __('Error in deleting...') );
+	} else {
+		if ( !wp_delete_post($post_id) ) 
+			die( __('Error in deleting...') );
+	}
 
-	$sendback = $_SERVER['HTTP_REFERER'];
+	$sendback = wp_get_referer();
 	if (strstr($sendback, 'post.php')) $sendback = get_settings('siteurl') .'/wp-admin/post.php';
+	elseif (strstr($sendback, 'attachments.php')) $sendback = get_settings('siteurl') .'/wp-admin/attachments.php';
 	$sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback);
-	header ('Location: ' . $sendback);
-	generate_page_rewrite_rules();
-	do_action('delete_post', $post_id);
+	wp_redirect($sendback);
 	break;
 
 case 'editcomment':
@@ -478,17 +168,14 @@
 	get_currentuserinfo();
 
 	$comment = (int) $_GET['comment'];
-	$commentdata = get_commentdata($comment, 1, true) or die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'javascript:history.go(-1)'));
 
-	if (!user_can_edit_post_comments($user_ID, $commentdata['comment_post_ID'])) {
+	if ( ! $comment = get_comment($comment) )
+		die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'javascript:history.go(-1)'));
+
+	if ( !current_user_can('edit_post', $comment->comment_post_ID) )	
 		die( __('You are not allowed to edit comments on this post.') );
-	}
 
-	$content = $commentdata['comment_content'];
-	$content = format_to_edit($content);
-	$content = apply_filters('comment_edit_pre', $content);
-	
-	$comment_status = $commentdata['comment_approved'];
+	$comment = get_comment_to_edit($comment);
 
 	include('edit-form-comment.php');
 
@@ -500,40 +187,41 @@
 
 	$comment = (int) $_GET['comment'];
 	$p = (int) $_GET['p'];
-	$commentdata = get_commentdata($comment, 1, true) or die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
 
-	if (!user_can_delete_post_comments($user_ID, $commentdata['comment_post_ID'])) {
+	if ( ! $comment = get_comment($comment) )
+		die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
+
+	if ( !current_user_can('edit_post', $comment->comment_post_ID) )	
 		die( __('You are not allowed to delete comments on this post.') );
-	}
 
-	echo "<div class=\"wrap\">\n";
+	echo "<div class='wrap'>\n";
 	echo "<p>" . __('<strong>Caution:</strong> You are about to delete the following comment:') . "</p>\n";
-	echo "<table border=\"0\">\n";
-	echo "<tr><td>" . __('Author:') . "</td><td>" . $commentdata["comment_author"] . "</td></tr>\n";
-	echo "<tr><td>" . __('E-mail:') . "</td><td>" . $commentdata["comment_author_email"] . "</td></tr>\n";
-	echo "<tr><td>". __('URL:') . "</td><td>" . $commentdata["comment_author_url"] . "</td></tr>\n";
-	echo "<tr><td>". __('Comment:') . "</td><td>" . stripslashes($commentdata["comment_content"]) . "</td></tr>\n";
+	echo "<table border='0'>\n";
+	echo "<tr><td>" . __('Author:') . "</td><td>$comment->comment_author</td></tr>\n";
+	echo "<tr><td>" . __('E-mail:') . "</td><td>$comment->comment_author_email</td></tr>\n";
+	echo "<tr><td>". __('URL:') . "</td><td>$comment->comment_author_url</td></tr>\n";
+	echo "<tr><td>". __('Comment:') . "</td><td>$comment->comment_content</td></tr>\n";
 	echo "</table>\n";
 	echo "<p>" . __('Are you sure you want to do that?') . "</p>\n";
 
 	echo "<form action='".get_settings('siteurl')."/wp-admin/post.php' method='get'>\n";
-	echo "<input type=\"hidden\" name=\"action\" value=\"deletecomment\" />\n";
-	echo "<input type=\"hidden\" name=\"p\" value=\"$p\" />\n";
-	echo "<input type=\"hidden\" name=\"comment\" value=\"$comment\" />\n";
-	echo "<input type=\"hidden\" name=\"noredir\" value=\"1\" />\n";
-	echo "<input type=\"submit\" value=\"" . __('Yes') . "\" />";
+	echo "<input type='hidden' name='action' value='deletecomment' />\n";
+	echo "<input type='hidden' name='p' value='$p' />\n";
+	echo "<input type='hidden' name='comment' value='{$comment->comment_ID}' />\n";
+	echo "<input type='hidden' name='noredir' value='1' />\n";
+	wp_nonce_field('delete-comment_' .  $comment->comment_ID);
+	echo "<input type='submit' value='" . __('Yes') . "' />";
 	echo "&nbsp;&nbsp;";
-	echo "<input type=\"button\" value=\"" . __('No') . "\" onclick=\"self.location='". get_settings('siteurl') ."/wp-admin/edit.php?p=$p&amp;c=1#comments';\" />\n";
+	echo "<input type='button' value='" . __('No') . "' onclick=\"self.location='". get_settings('siteurl') ."/wp-admin/edit.php?p=$p&amp;c=1#comments';\" />\n";
 	echo "</form>\n";
 	echo "</div>\n";
 
 	break;
 
 case 'deletecomment':
-
-	check_admin_referer();
-
 	$comment = (int) $_GET['comment'];
+	check_admin_referer('delete-comment_' . $comment);
+
 	$p = (int) $_GET['p'];
 	if (isset($_GET['noredir'])) {
 		$noredir = true;
@@ -542,30 +230,28 @@
 	}
 
 	$postdata = get_post($p) or die(sprintf(__('Oops, no post with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
-	$commentdata = get_commentdata($comment, 1, true) or die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'post.php'));
 
-	if (!user_can_delete_post_comments($user_ID, $commentdata['comment_post_ID'])) {
+	if ( ! $comment = get_comment($comment) )
+			 die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'post.php'));
+
+	if ( !current_user_can('edit_post', $comment->comment_post_ID) )	
 		die( __('You are not allowed to edit comments on this post.') );
-	}
 
-	wp_set_comment_status($comment, "delete");
-	do_action('delete_comment', $comment);
+	wp_set_comment_status($comment->comment_ID, "delete");
+	do_action('delete_comment', $comment->comment_ID);
 
-	if (($_SERVER['HTTP_REFERER'] != "") && (false == $noredir)) {
-		header('Location: ' . $_SERVER['HTTP_REFERER']);
+	if ((wp_get_referer() != "") && (false == $noredir)) {
+		wp_redirect(wp_get_referer());
 	} else {
-		header('Location: '. get_settings('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
+		wp_redirect(get_settings('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
 	}
 
 	break;
 
 case 'unapprovecomment':
-
-	require_once('./admin-header.php');
-
-	check_admin_referer();
-
 	$comment = (int) $_GET['comment'];
+	check_admin_referer('unapprove-comment_' . $comment);
+
 	$p = (int) $_GET['p'];
 	if (isset($_GET['noredir'])) {
 		$noredir = true;
@@ -573,67 +259,69 @@
 		$noredir = false;
 	}
 
-	$commentdata = get_commentdata($comment) or die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
+	if ( ! $comment = get_comment($comment) )
+		die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
 
-	if (!user_can_edit_post_comments($user_ID, $commentdata['comment_post_ID'])) {
+	if ( !current_user_can('edit_post', $comment->comment_post_ID) )	
 		die( __('You are not allowed to edit comments on this post, so you cannot disapprove this comment.') );
-	}
 
-	wp_set_comment_status($comment, "hold");
+	wp_set_comment_status($comment->comment_ID, "hold");
 
-	if (($_SERVER['HTTP_REFERER'] != "") && (false == $noredir)) {
-		header('Location: ' . $_SERVER['HTTP_REFERER']);
+	if ((wp_get_referer() != "") && (false == $noredir)) {
+		wp_redirect(wp_get_referer());
 	} else {
-		header('Location: '. get_settings('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
+		wp_redirect(get_settings('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
 	}
 
 	break;
 
 case 'mailapprovecomment':
-
 	$comment = (int) $_GET['comment'];
+	check_admin_referer('approve-comment_' . $comment);
 
-	$commentdata = get_commentdata($comment, 1, true) or die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
+	if ( ! $comment = get_comment($comment) )
+			 die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
 
-	if (!user_can_edit_post_comments($user_ID, $commentdata['comment_post_ID'])) {
+	if ( !current_user_can('edit_post', $comment->comment_post_ID) )	
 		die( __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
-	}
 
-	if ('1' != $commentdata['comment_approved']) {
-		wp_set_comment_status($comment, 'approve');
+	if ('1' != $comment->comment_approved) {
+		wp_set_comment_status($comment->comment_ID, 'approve');
 		if (true == get_option('comments_notify'))
-			wp_notify_postauthor($comment);
+			wp_notify_postauthor($comment->comment_ID);
 	}
 
-	header('Location: ' . get_option('siteurl') . '/wp-admin/moderation.php?approved=1');
+	wp_redirect(get_option('siteurl') . '/wp-admin/moderation.php?approved=1');
 
 	break;
 
 case 'approvecomment':
-
 	$comment = (int) $_GET['comment'];
+	check_admin_referer('approve-comment_' . $comment);
+
 	$p = (int) $_GET['p'];
 	if (isset($_GET['noredir'])) {
 		$noredir = true;
 	} else {
 		$noredir = false;
 	}
-	$commentdata = get_commentdata($comment) or die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
 
-	if (!user_can_edit_post_comments($user_ID, $commentdata['comment_post_ID'])) {
+	if ( ! $comment = get_comment($comment) )
+		die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
+
+	if ( !current_user_can('edit_post', $comment->comment_post_ID) )	
 		die( __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
-	}
 
-	wp_set_comment_status($comment, "approve");
+	wp_set_comment_status($comment->comment_ID, "approve");
 	if (get_settings("comments_notify") == true) {
-		wp_notify_postauthor($comment);
+		wp_notify_postauthor($comment->comment_ID);
 	}
 
 
-	if (($_SERVER['HTTP_REFERER'] != "") && (false == $noredir)) {
-		header('Location: ' . $_SERVER['HTTP_REFERER']);
+	if ((wp_get_referer() != "") && (false == $noredir)) {
+		wp_redirect(wp_get_referer());
 	} else {
-		header('Location: '. get_settings('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
+		wp_redirect(get_settings('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
 	}
 
 	break;
@@ -641,50 +329,19 @@
 case 'editedcomment':
 
 	$comment_ID = (int) $_POST['comment_ID'];
-	$comment_post_ID = (int) $_POST['comment_post_ID'];
-	$newcomment_author = $_POST['newcomment_author'];
-	$newcomment_author_email = $_POST['newcomment_author_email'];
-	$newcomment_author_url = $_POST['newcomment_author_url'];
-	$comment_status = $_POST['comment_status'];
-
-	if (!user_can_edit_post_comments($user_ID, $comment_post_ID)) {
-		die( __('You are not allowed to edit comments on this post, so you cannot edit this comment.') );
-	}
-
-	if (user_can_edit_post_date($user_ID, $post_ID) && (!empty($_POST['edit_date']))) {
-		$aa = $_POST['aa'];
-		$mm = $_POST['mm'];
-		$jj = $_POST['jj'];
-		$hh = $_POST['hh'];
-		$mn = $_POST['mn'];
-		$ss = $_POST['ss'];
-		$jj = ($jj > 31) ? 31 : $jj;
-		$hh = ($hh > 23) ? $hh - 24 : $hh;
-		$mn = ($mn > 59) ? $mn - 60 : $mn;
-		$ss = ($ss > 59) ? $ss - 60 : $ss;
-		$datemodif = ", comment_date = '$aa-$mm-$jj $hh:$mn:$ss'";
-	} else {
-		$datemodif = '';
-	}
-	$content = apply_filters('comment_save_pre', $_POST['content']);
+	$comment_post_ID = (int)  $_POST['comment_post_ID'];
 
-	$result = $wpdb->query("
-		UPDATE $wpdb->comments SET
-			comment_content = '$content',
-			comment_author = '$newcomment_author',
-			comment_author_email = '$newcomment_author_email',
-			comment_approved = '$comment_status',
-			comment_author_url = '$newcomment_author_url'".$datemodif."
-		WHERE comment_ID = $comment_ID"
-		);
+	check_admin_referer('update-comment_' . $comment_ID);
+
+	edit_comment();
 
 	$referredby = $_POST['referredby'];
 	if (!empty($referredby)) {
-		header('Location: ' . $referredby);
+		wp_redirect($referredby);
 	} else {
-		header ("Location: edit.php?p=$comment_post_ID&c=1#comments");
+		wp_redirect("edit.php?p=$comment_post_ID&c=1#comments");
 	}
-	do_action('edit_comment', $comment_ID);
+
 	break;
 
 default:
@@ -692,65 +349,54 @@
 	require_once ('./admin-header.php');
 ?>
 <?php if ( isset($_GET['posted']) ) : ?>
-<div class="updated"><p><?php printf(__('Post saved. <a href="%s">View site &raquo;</a>'), get_bloginfo('home')); ?></p></div>
+<div id="message" class="updated fade"><p><?php printf(__('Post saved. <a href="%s">View site &raquo;</a>'), get_bloginfo('home') . '/'); ?></p></div>
 <?php endif; ?>
 <?php
-	if (user_can_create_draft($user_ID)) {
+	if ( current_user_can('edit_posts') ) {
 		$action = 'post';
 		get_currentuserinfo();
-		$drafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = $user_ID");
-		if ($drafts) {
+		if ( $drafts = get_users_drafts( $user_ID ) ) {
 			?>
 			<div class="wrap">
 			<p><strong><?php _e('Your Drafts:') ?></strong>
 			<?php
-			$i = 0;
-			foreach ($drafts as $draft) {
-				if (0 != $i)
+			$num_drafts = count($drafts);
+			if ( $num_drafts > 15 ) $num_drafts = 15;
+			for ( $i = 0; $i < $num_drafts; $i++ ) {
+				$draft = $drafts[$i];
+				if ( 0 != $i )
 					echo ', ';
 				$draft->post_title = stripslashes($draft->post_title);
-				if ($draft->post_title == '')
+				if ( empty($draft->post_title) )
 					$draft->post_title = sprintf(__('Post # %s'), $draft->ID);
 				echo "<a href='post.php?action=edit&amp;post=$draft->ID' title='" . __('Edit this draft') . "'>$draft->post_title</a>";
-				++$i;
-				}
-			?>.</p>
+			}
+			?>
+			<?php if ( 15 < count($drafts) ) { ?>
+			, <a href="edit.php"><?php echo sprintf(__('and %s more'), (count($drafts) - 15) ); ?> &raquo;</a>
+			<?php } ?>
+			.</p>
 			</div>
 			<?php
 		}
-		//set defaults
-		$post_status = 'draft';
-		$comment_status = get_settings('default_comment_status');
-		$ping_status = get_settings('default_ping_status');
-		$post_pingback = get_settings('default_pingback_flag');
-		$default_post_cat = get_settings('default_category');
-
-		$content = wp_specialchars($content);
-		$content = apply_filters('default_content', $content);
-		$edited_post_title = apply_filters('default_title', $edited_post_title);
-		$excerpt = apply_filters('default_excerpt', $excerpt);
-
-		if (get_settings('advanced_edit')) {
-			include('edit-form-advanced.php');
-		} else {
-			include('edit-form.php');
-		}
+
+		$post = get_default_post_to_edit();
+
+		include('edit-form-advanced.php');
 ?>
 <div class="wrap">
-<?php _e('<h3>WordPress bookmarklet</h3>
-<p>You can drag the following link to your links bar or add it to your bookmarks and when you "Press it" it will open up a popup window with information and a link to the site you&#8217;re currently browsing so you can make a quick post about it. Try it out:</p>') ?>
+<?php echo '<h3>'.__('WordPress bookmarklet').'</h3>
+<p>'.__('Right click on the following link and choose "Add to favorites" to create a posting shortcut.').'</p>'; ?>
 <p>
 
 <?php
-$bookmarklet_height= (get_settings('use_trackback')) ? 480 : 440;
-
 if ($is_NS4 || $is_gecko) {
 ?>
-<a href="javascript:if(navigator.userAgent.indexOf('Safari') >= 0){Q=getSelection();}else{Q=document.selection?document.selection.createRange().text:document.getSelection();}void(window.open('<?php echo get_settings('siteurl') ?>/wp-admin/bookmarklet.php?text='+encodeURIComponent(Q)+'&amp;popupurl='+encodeURIComponent(location.href)+'&amp;popuptitle='+encodeURIComponent(document.title),'<?php _e('WordPress bookmarklet') ?>','scrollbars=yes,width=600,height=460,left=100,top=150,status=yes'));"><?php printf(__('Press It - %s'), wp_specialchars(get_settings('blogname'))); ?></a> 
+<a href="javascript:if(navigator.userAgent.indexOf('Safari') >= 0){Q=getSelection();}else{Q=document.selection?document.selection.createRange().text:document.getSelection();}location.href='<?php echo get_settings('siteurl') ?>/wp-admin/post.php?text='+encodeURIComponent(Q)+'&amp;popupurl='+encodeURIComponent(location.href)+'&amp;popuptitle='+encodeURIComponent(document.title);"><?php printf(__('Press It - %s'), wp_specialchars(get_settings('blogname'))); ?></a> 
 <?php
 } else if ($is_winIE) {
 ?>
-<a href="javascript:Q='';if(top.frames.length==0)Q=document.selection.createRange().text;void(btw=window.open('<?php echo get_settings('siteurl') ?>/wp-admin/bookmarklet.php?text='+encodeURIComponent(Q)+'<?php echo $bookmarklet_tbpb ?>&amp;popupurl='+encodeURIComponent(location.href)+'&amp;popuptitle='+encodeURIComponent(document.title),'bookmarklet','scrollbars=yes,width=600,height=<?php echo $bookmarklet_height ?>,left=100,top=150,status=yes'));btw.focus();"><?php printf(__('Press it - %s'), get_settings('blogname')); ?></a>
+<a href="javascript:Q='';if(top.frames.length==0)Q=document.selection.createRange().text;location.href='<?php echo get_settings('siteurl') ?>/wp-admin/post.php?text='+encodeURIComponent(Q)+'&amp;popupurl='+encodeURIComponent(location.href)+'&amp;popuptitle='+encodeURIComponent(document.title);"><?php printf(__('Press it - %s'), get_settings('blogname')); ?></a>
 <script type="text/javascript">
 <!--
 function oneclickbookmarklet(blah) {
@@ -765,11 +411,11 @@
 <?php
 } else if ($is_opera) {
 ?>
-<a href="javascript:void(window.open('<?php echo get_settings('siteurl'); ?>/wp-admin/bookmarklet.php?popupurl='+escape(location.href)+'&popuptitle='+escape(document.title)+'<?php echo $bookmarklet_tbpb ?>','bookmarklet','scrollbars=yes,width=600,height=<?php echo $bookmarklet_height ?>,left=100,top=150,status=yes'));"><?php printf(__('Press it - %s'), get_settings('blogname')); ?></a> 
+<a href="javascript:location.href='<?php echo get_settings('siteurl'); ?>/wp-admin/post.php?popupurl='+escape(location.href)+'&popuptitle='+escape(document.title);"><?php printf(__('Press it - %s'), get_settings('blogname')); ?></a> 
 <?php
 } else if ($is_macIE) {
 ?>
-<a href="javascript:Q='';if(top.frames.length==0);void(btw=window.open('<?php echo get_settings('siteurl'); ?>/wp-admin/bookmarklet.php?text='+escape(document.getSelection())+'&popupurl='+escape(location.href)+'&popuptitle='+escape(document.title)+'<?php echo $bookmarklet_tbpb ?>','bookmarklet','scrollbars=yes,width=600,height=<?php echo $bookmarklet_height ?>,left=100,top=150,status=yes'));btw.focus();"><?php printf(__('Press it - %s'), get_settings('blogname')); ?></a> 
+<a href="javascript:Q='';location.href='<?php echo get_settings('siteurl'); ?>/wp-admin/bookmarklet.php?text='+escape(document.getSelection())+'&popupurl='+escape(location.href)+'&popuptitle='+escape(document.title);"><?php printf(__('Press it - %s'), get_settings('blogname')); ?></a> 
 <?php
 }
 ?>
diff -ruN 1.5.2/wp-admin/profile.php 2.0.4/wp-admin/profile.php
--- 1.5.2/wp-admin/profile.php	2005-03-13 11:29:33.000000000 -0600
+++ 2.0.4/wp-admin/profile.php	2006-05-26 18:31:24.000000000 -0500
@@ -1,282 +1,145 @@
 <?php 
 require_once('admin.php');
 
-$title = 'Profile';
-$parent_file = 'profile.php';
+$title = __('Profile');
 
-$wpvarstoreset = array('action', 'profile', 'user');
-for ($i=0; $i<count($wpvarstoreset); $i += 1) {
-	$wpvar = $wpvarstoreset[$i];
-	if (!isset($$wpvar)) {
-		if (empty($_POST["$wpvar"])) {
-			if (empty($_GET["$wpvar"])) {
-				$$wpvar = '';
-			} else {
-				$$wpvar = $_GET["$wpvar"];
-			}
-		} else {
-			$$wpvar = $_POST["$wpvar"];
-		}
-	}
-}
-
-require_once('../wp-config.php');
-auth_redirect();
-switch($action) {
-
-case 'update':
-
-	get_currentuserinfo();
-
-	/* checking the nickname has been typed */
-	if (empty($_POST["newuser_nickname"])) {
-		die (__("<strong>ERROR</strong>: please enter your nickname (can be the same as your username)"));
-		return false;
-	}
-
-	/* if the ICQ UIN has been entered, check to see if it has only numbers */
-	if (!empty($_POST["newuser_icq"])) {
-		if ((ereg("^[0-9]+$",$_POST["newuser_icq"]))==false) {
-			die (__("<strong>ERROR</strong>: your ICQ UIN can only be a number, no letters allowed"));
-			return false;
-		}
-	}
-
-	/* checking e-mail address */
-	if (empty($_POST["newuser_email"])) {
-		die (__("<strong>ERROR</strong>: please type your e-mail address"));
-		return false;
-	} else if (!is_email($_POST["newuser_email"])) {
-		die (__("<strong>ERROR</strong>: the e-mail address isn't correct"));
-		return false;
-	}
-
-	$pass1 = $_POST["pass1"];
-	$pass2 = $_POST["pass2"];
-	do_action('check_passwords', array($user_login, &$pass1, &$pass2));
-
-	if ( '' == $pass1 ) {
-		if ( '' != $pass2 )
-			die (__("<strong>ERROR</strong>: you typed your new password only once. Go back to type it twice."));
-		$updatepassword = "";
-	} else {
-		if ('' == $pass2)
-			die (__("<strong>ERROR</strong>: you typed your new password only once. Go back to type it twice."));
-		if ( $pass1 != $pass2 )
-			die (__("<strong>ERROR</strong>: you typed two different passwords. Go back to correct that."));
-		$newuser_pass = $pass1;
-		$updatepassword = "user_pass=MD5('$newuser_pass'), ";
-		wp_clearcookie();
-		wp_setcookie($user_login, $newuser_pass);
-	}
-
-	$newuser_firstname = wp_specialchars($_POST['newuser_firstname']);
-	$newuser_lastname = wp_specialchars($_POST['newuser_lastname']);
-	$newuser_nickname = $_POST['newuser_nickname'];
-	$newuser_nicename = sanitize_title($newuser_nickname);
-	$newuser_icq = wp_specialchars($_POST['newuser_icq']);
-	$newuser_aim = wp_specialchars($_POST['newuser_aim']);
-	$newuser_msn = wp_specialchars($_POST['newuser_msn']);
-	$newuser_yim = wp_specialchars($_POST['newuser_yim']);
-	$newuser_email = wp_specialchars($_POST['newuser_email']);
-	$newuser_url = wp_specialchars($_POST['newuser_url']);
-	$newuser_url = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $newuser_url) ? $newuser_url : 'http://' . $newuser_url; 
-	$newuser_idmode = wp_specialchars($_POST['newuser_idmode']);
-	$user_description = $_POST['user_description'];
-
-	$result = $wpdb->query("UPDATE $wpdb->users SET user_firstname='$newuser_firstname', $updatepassword user_lastname='$newuser_lastname', user_nickname='$newuser_nickname', user_icq='$newuser_icq', user_email='$newuser_email', user_url='$newuser_url', user_aim='$newuser_aim', user_msn='$newuser_msn', user_yim='$newuser_yim', user_idmode='$newuser_idmode', user_description = '$user_description', user_nicename = '$newuser_nicename' WHERE ID = $user_ID");
-
-	wp_redirect('profile.php?updated=true');
-break;
-
-case 'IErightclick':
-
-	$bookmarklet_height= 550;
-
-	?>
-
-	<div class="menutop">&nbsp;IE one-click bookmarklet</div>
-
-	<table width="100%" cellpadding="20">
-	<tr><td>
-
-	<p>To have a one-click bookmarklet, just copy and paste this<br />into a new text file:</p>
-	<?php
-	$regedit = "REGEDIT4\r\n[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Post To &WP : ". get_settings('blogname') ."]\r\n@=\"javascript:doc=external.menuArguments.document;Q=doc.selection.createRange().text;void(btw=window.open('". get_settings('siteurl') ."/wp-admin/bookmarklet.php?text='+escape(Q)+'".$bookmarklet_tbpb."&popupurl='+escape(doc.location.href)+'&popuptitle='+escape(doc.title),'bookmarklet','scrollbars=no,width=480,height=".$bookmarklet_height.",left=100,top=150,status=yes'));btw.focus();\"\r\n\"contexts\"=hex:31\"";
-	?>
-	<pre style="margin: 20px; background-color: #cccccc; border: 1px dashed #333333; padding: 5px; font-size: 12px;"><?php echo $regedit; ?></pre>
-	<p>Save it as wordpress.reg, and double-click on this file in an Explorer<br />
-	window. Answer Yes to the question, and restart Internet Explorer.<br /><br />
-	That's it, you can now right-click in an IE window and select <br />
-	'Post to WP' to make the bookmarklet appear. :)</p>
-
-	<p align="center">
-	  <form>
-		<input class="search" type="button" value="1" name="Close this window" />
-	  </form>
-	</p>
-	</td></tr>
-	</table>
-	<?php
-
-break;
-
-
-default:
-	$parent_file = 'profile.php';
-	include_once('admin-header.php');
-	$profiledata=get_userdata($user_ID);
+$parent_file = 'profile.php';
+include_once('admin-header.php');
+$profileuser = new WP_User($user_ID);
 
-	$bookmarklet_height= 440;
+$bookmarklet_height= 440;
+?>
 
-if (isset($updated)) { ?>
-<div class="updated">
+<?php if ( isset($_GET['updated']) ) { ?>
+<div id="message" class="updated fade">
 <p><strong><?php _e('Profile updated.') ?></strong></p>
 </div>
 <?php } ?>
+
 <div class="wrap">
-<h2><?php _e('Profile'); ?></h2>
-<form name="profile" id="profile" action="profile.php" method="post">
-	<p>
-    <input type="hidden" name="action" value="update" />
-    <input type="hidden" name="checkuser_id" value="<?php echo $user_ID ?>" />
-  </p>
+<h2><?php _e('Your Profile and Personal Options'); ?></h2>
+<form name="profile" id="your-profile" action="profile-update.php" method="post">
+<?php wp_nonce_field('update-profile_' . $user_ID) ?>
+<p>
+<input type="hidden" name="from" value="profile" />
+<input type="hidden" name="checkuser_id" value="<?php echo $user_ID ?>" />
+</p>
+
+<fieldset>
+<legend><?php _e('Name'); ?></legend>
+<p><label><?php _e('Username: (no editing)'); ?><br />
+<input type="text" name="user_login" value="<?php echo $profileuser->user_login; ?>" disabled="disabled" />
+</label></p>
+
+<p><label><?php _e('First name:') ?><br />
+<input type="text" name="first_name" value="<?php echo $profileuser->first_name ?>" /></label></p>
+
+<p><label><?php _e('Last name:') ?><br />
+<input type="text" name="last_name"  value="<?php echo $profileuser->last_name ?>" /></label></p>
+
+<p><label><?php _e('Nickname:') ?><br />
+<input type="text" name="nickname" value="<?php echo $profileuser->nickname ?>" /></label></p>
+
+<p><label><?php _e('Display name publicly as:') ?> <br />
+<select name="display_name">
+<option value="<?php echo $profileuser->display_name; ?>"><?php echo $profileuser->display_name; ?></option>
+<option value="<?php echo $profileuser->nickname ?>"><?php echo $profileuser->nickname ?></option>
+<option value="<?php echo $profileuser->user_login ?>"><?php echo $profileuser->user_login ?></option>
+<?php if ( !empty( $profileuser->first_name ) ) : ?>
+<option value="<?php echo $profileuser->first_name ?>"><?php echo $profileuser->first_name ?></option>
+<?php endif; ?>
+<?php if ( !empty( $profileuser->last_name ) ) : ?>
+<option value="<?php echo $profileuser->last_name ?>"><?php echo $profileuser->last_name ?></option>
+<?php endif; ?>
+<?php if ( !empty( $profileuser->first_name ) && !empty( $profileuser->last_name ) ) : ?>
+<option value="<?php echo $profileuser->first_name." ".$profileuser->last_name ?>"><?php echo $profileuser->first_name." ".$profileuser->last_name ?></option>
+<option value="<?php echo $profileuser->last_name." ".$profileuser->first_name ?>"><?php echo $profileuser->last_name." ".$profileuser->first_name ?></option>
+<?php endif; ?>
+</select></label></p>
+</fieldset>
+
+<fieldset>
+<legend><?php _e('Contact Info'); ?></legend>
+
+<p><label><?php _e('E-mail: (required)') ?><br />
+<input type="text" name="email" value="<?php echo $profileuser->user_email ?>" /></label></p>
+
+<p><label><?php _e('Website:') ?><br />
+<input type="text" name="url" value="<?php echo $profileuser->user_url ?>" />
+</label></p>
+
+<p><label><?php _e('AIM:') ?><br />
+<input type="text" name="aim" value="<?php echo $profileuser->aim ?>" />
+</label></p>
+
+<p><label><?php _e('Yahoo IM:') ?><br />
+<input type="text" name="yim" value="<?php echo $profileuser->yim ?>" />
+</label></p>
+
+<p><label><?php _e('Jabber / Google Talk:') ?>
+<input type="text" name="jabber" value="<?php echo $profileuser->jabber ?>" /></label>
+</p>
+</fieldset>
+<br clear="all" />
+<fieldset>
+<legend><?php _e('About yourself'); ?></legend>
+<p class="desc"><?php _e('Share a little biographical information to fill out your profile. This may be shown publicly.'); ?></p>
+<p><textarea name="description" rows="5" cols="30"><?php echo $profileuser->description ?></textarea></p>
+</fieldset>
 
-  <table width="99%"  border="0" cellspacing="2" cellpadding="3" class="editform">
-    <tr>
-      <th width="33%" scope="row"><?php _e('Username:') ?></th>
-      <td width="67%"><?php echo $profiledata->user_login; ?></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('Level:') ?></th>
-      <td><?php echo $profiledata->user_level; ?></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('Posts:') ?></th>
-      <td>    <?php
-	$posts = get_usernumposts($user_ID);
-	echo $posts;
-	?></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('First name:') ?></th>
-      <td><input type="text" name="newuser_firstname" id="newuser_firstname" value="<?php echo $profiledata->user_firstname ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('Last name:') ?></th>
-      <td><input type="text" name="newuser_lastname" id="newuser_lastname2" value="<?php echo $profiledata->user_lastname ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('Nickname:') ?></th>
-      <td><input type="text" name="newuser_nickname" id="newuser_nickname2" value="<?php echo $profiledata->user_nickname ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('How to display name:') ?> </th>
-      <td><select name="newuser_idmode">
-        <option value="nickname"<?php
-	if ($profiledata->user_idmode == 'nickname')
-	echo ' selected="selected"'; ?>><?php echo $profiledata->user_nickname ?></option>
-        <option value="login"<?php
-	if ($profiledata->user_idmode=="login")
-	echo ' selected="selected"'; ?>><?php echo $profiledata->user_login ?></option>
-	<?php if ( !empty( $profiledata->user_firstname ) ) : ?>
-        <option value="firstname"<?php
-	if ($profiledata->user_idmode=="firstname")
-	echo ' selected="selected"'; ?>><?php echo $profiledata->user_firstname ?></option>
-	<?php endif; ?>
-	<?php if ( !empty( $profiledata->user_lastname ) ) : ?>
-        <option value="lastname"<?php
-	if ($profiledata->user_idmode=="lastname")
-	echo ' selected="selected"'; ?>><?php echo $profiledata->user_lastname ?></option>
-	<?php endif; ?>
-	<?php if ( !empty( $profiledata->user_firstname ) && !empty( $profiledata->user_lastname ) ) : ?>
-        <option value="namefl"<?php
-	if ($profiledata->user_idmode=="namefl")
-	echo ' selected="selected"'; ?>><?php echo $profiledata->user_firstname." ".$profiledata->user_lastname ?></option>
-	<?php endif; ?>
-	<?php if ( !empty( $profiledata->user_firstname ) && !empty( $profiledata->user_lastname ) ) : ?>
-        <option value="namelf"<?php
-	if ($profiledata->user_idmode=="namelf")
-	echo ' selected="selected"'; ?>><?php echo $profiledata->user_lastname." ".$profiledata->user_firstname ?></option>
-	<?php endif; ?>
-      </select>        </td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('E-mail:') ?></th>
-      <td><input type="text" name="newuser_email" id="newuser_email2" value="<?php echo $profiledata->user_email ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('Website:') ?></th>
-      <td><input type="text" name="newuser_url" id="newuser_url2" value="<?php echo $profiledata->user_url ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('ICQ:') ?></th>
-      <td><input type="text" name="newuser_icq" id="newuser_icq2" value="<?php if ($profiledata->user_icq > 0) { echo $profiledata->user_icq; } ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('AIM:') ?></th>
-      <td><input type="text" name="newuser_aim" id="newuser_aim2" value="<?php echo $profiledata->user_aim ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('MSN IM:') ?> </th>
-      <td><input type="text" name="newuser_msn" id="newuser_msn2" value="<?php echo $profiledata->user_msn ?>" /></td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('Yahoo IM:') ?> </th>
-      <td>        <input type="text" name="newuser_yim" id="newuser_yim2" value="<?php echo $profiledata->user_yim ?>" />      </td>
-    </tr>
-    <tr>
-      <th scope="row"><?php _e('Profile:') ?></th>
-      <td><textarea name="user_description" rows="5" id="textarea2" style="width: 99%; "><?php echo $profiledata->user_description ?></textarea></td>
-    </tr>
 <?php
 $show_password_fields = apply_filters('show_password_fields', true);
 if ( $show_password_fields ) :
 ?>
-    <tr>
-      <th scope="row"><?php _e('New <strong>Password</strong> (Leave blank to stay the same.)') ?></th>
-      <td><input type="password" name="pass1" size="16" value="" />
-      	<br />
-        <input type="password" name="pass2" size="16" value="" /></td>
-    </tr>
+<fieldset>
+<legend><?php _e('Update Your Password'); ?></legend>
+<p class="desc"><?php _e('If you would like to change your password type a new one twice below. Otherwise leave this blank.'); ?></p>
+<p><label><?php _e('New Password:'); ?><br />
+<input type="password" name="pass1" size="16" value="" />
+</label></p>
+<p><label><?php _e('Type it one more time:'); ?><br />
+<input type="password" name="pass2" size="16" value="" />
+</label></p>
+</fieldset>
 <?php endif; ?>
+
+<?php do_action('show_user_profile'); ?>
+
+<br clear="all" />
+
+<h3><?php _e('Personal Options'); ?></h3>
+
+<p><label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="true" <?php checked('true', get_user_option('rich_editing')); ?> />
+<?php _e('Use the visual rich editor when writing') ?></label></p>
+
+<?php do_action('profile_personal_options'); ?>
+
+  <table width="99%"  border="0" cellspacing="2" cellpadding="3" class="editform">
+    <?php
+    if(count($profileuser->caps) > count($profileuser->roles)):
+    ?>
+    <tr>
+      <th scope="row"><?php _e('Additional Capabilities:') ?></th>
+      <td><?php 
+			$output = '';
+			foreach($profileuser->caps as $cap => $value) {
+				if(!$wp_roles->is_role($cap)) {
+					if($output != '') $output .= ', ';
+					$output .= $value ? $cap : "Denied: {$cap}";
+				}
+			}
+			echo $output;
+			?></td>
+    </tr>
+    <?php
+    endif;
+    ?>
   </table>
-  <p class="submit">
-    <input type="submit" value="<?php _e('Update Profile &raquo;') ?>" name="submit" />
-  </p>
+<p class="submit">
+<input type="submit" value="<?php _e('Update Profile &raquo;') ?>" name="submit" />
+</p>
 </form>
-</div>
 
-
-<?php if ($is_gecko && $profiledata->user_level != 0) { ?>
-<div class="wrap">
-    <script type="text/javascript">
-//<![CDATA[
-function addPanel()
-        {
-          if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function"))
-            window.sidebar.addPanel("WordPress Post: <?php echo get_settings('blogname'); ?>","<?php echo get_settings('siteurl'); ?>/wp-admin/sidebar.php","");
-          else
-            alert(<?php __("'No Sidebar found!  You must use Mozilla 0.9.4 or later!'") ?>);
-        }
-//]]>
-</script>
-    <strong><?php _e('SideBar') ?></strong><br />
-    <?php _e('Add the <a href="#" onclick="addPanel()">WordPress Sidebar</a>!') ?> 
-    <?php } elseif (($is_winIE) || ($is_macIE)) { ?>
-    <strong><?php _e('SideBar') ?></strong><br />
-    <?php __('Add this link to your favorites:') ?><br />
-<a href="javascript:Q='';if(top.frames.length==0)Q=document.selection.createRange().text;void(_search=open('<?php echo get_settings('siteurl');
-	 ?>/wp-admin/sidebar.php?text='+escape(Q)+'&popupurl='+escape(location.href)+'&popuptitle='+escape(document.title),'_search'))"><?php _e('WordPress Sidebar') ?></a>. 
-    
 </div>
-<?php } ?>
-</div>
-	<?php
-
-break;
-}
 
-/* </Profile | My Profile> */
-include('admin-footer.php');
- ?>
+<?php include('admin-footer.php'); ?>
diff -ruN 1.5.2/wp-admin/profile-update.php 2.0.4/wp-admin/profile-update.php
--- 1.5.2/wp-admin/profile-update.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/profile-update.php	2006-05-26 18:31:24.000000000 -0500
@@ -0,0 +1,33 @@
+<?php
+
+require_once('admin.php');
+
+check_admin_referer('update-profile_' . $user_ID);
+
+if ( !$_POST )
+	die( __('No post?') );
+
+$errors = edit_user($user_ID);
+
+if (count($errors) != 0) {
+	foreach ($errors as $id => $error) {
+		echo $error . '<br/>';
+	}
+	exit;
+}
+
+if ( !isset( $_POST['rich_editing'] ) )
+	$_POST['rich_editing'] = 'false';
+update_user_option( $current_user->id, 'rich_editing', $_POST['rich_editing'], true );
+
+do_action('personal_options_update');
+
+if ( 'profile' == $_POST['from'] )
+	$to = 'profile.php?updated=true';
+else
+	$to = 'profile.php?updated=true';
+
+wp_redirect( $to );
+exit;
+
+?>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/quicktags.js 2.0.4/wp-admin/quicktags.js
--- 1.5.2/wp-admin/quicktags.js	2005-05-13 16:47:39.000000000 -0500
+++ 2.0.4/wp-admin/quicktags.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,389 +0,0 @@
-// new edit toolbar used with permission
-// by Alex King
-// http://www.alexking.org/
-
-var edButtons = new Array();
-var edLinks = new Array();
-var edOpenTags = new Array();
-
-function edButton(id, display, tagStart, tagEnd, access, open) {
-	this.id = id;				// used to name the toolbar button
-	this.display = display;		// label on button
-	this.tagStart = tagStart; 	// open tag
-	this.tagEnd = tagEnd;		// close tag
-	this.access = access;		// access key
-	this.open = open;			// set to -1 if tag does not need to be closed
-}
-
-function zeroise(number, threshold) {
-	// FIXME: or we could use an implementation of printf in js here
-	var str = number.toString();
-	if (number < 0) { str = str.substr(1, str.length) }
-	while (str.length < threshold) { str = "0" + str }
-	if (number < 0) { str = '-' + str }
-	return str;
-}
-
-var now = new Date();
-var datetime = now.getUTCFullYear() + '-' + 
-zeroise(now.getUTCMonth() + 1, 2) + '-' +
-zeroise(now.getUTCDate(), 2) + 'T' + 
-zeroise(now.getUTCHours(), 2) + ':' + 
-zeroise(now.getUTCMinutes(), 2) + ':' + 
-zeroise(now.getUTCSeconds() ,2) +
-'+00:00';
-
-edButtons[edButtons.length] = 
-new edButton('ed_strong'
-,'b'
-,'<strong>'
-,'</strong>'
-,'b'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_em'
-,'i'
-,'<em>'
-,'</em>'
-,'i'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_link'
-,'link'
-,''
-,'</a>'
-,'a'
-); // special case
-
-edButtons[edButtons.length] = 
-new edButton('ed_block'
-,'b-quote'
-,'\n\n<blockquote>'
-,'</blockquote>\n\n'
-,'q'
-);
-
-
-edButtons[edButtons.length] = 
-new edButton('ed_del'
-,'del'
-,'<del datetime="' + datetime + '">'
-,'</del>'
-,'d'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_ins'
-,'ins'
-,'<ins datetime="' + datetime + '">'
-,'</ins>'
-,'s'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_img'
-,'img'
-,''
-,''
-,'m'
-,-1
-); // special case
-
-edButtons[edButtons.length] = 
-new edButton('ed_ul'
-,'ul'
-,'<ul>\n'
-,'</ul>\n\n'
-,'u'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_ol'
-,'ol'
-,'<ol>\n'
-,'</ol>\n\n'
-,'o'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_li'
-,'li'
-,'\t<li>'
-,'</li>\n'
-,'l'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_pre'
-,'code'
-,'<code>'
-,'</code>'
-,'c'
-);
-
-edButtons[edButtons.length] = 
-new edButton('ed_more'
-,'more'
-,'<!--more-->'
-,''
-,'t'
-,-1
-);
-/*
-edButtons[edButtons.length] = 
-new edButton('ed_next'
-,'page'
-,'<!--nextpage-->'
-,''
-,'p'
-,-1
-);
-*/
-function edLink() {
-	this.display = '';
-	this.URL = '';
-	this.newWin = 0;
-}
-
-edLinks[edLinks.length] = new edLink('WordPress'
-                                    ,'http://wordpress.org/'
-                                    );
-
-edLinks[edLinks.length] = new edLink('alexking.org'
-                                    ,'http://www.alexking.org/'
-                                    );
-
-function edShowButton(button, i) {
-	if (button.id == 'ed_img') {
-		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage(edCanvas);" value="' + button.display + '" />');
-	}
-	else if (button.id == 'ed_link') {
-		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
-	}
-	else {
-		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '"  />');
-	}
-}
-
-function edShowLinks() {
-	var tempStr = '<select onchange="edQuickLink(this.options[this.selectedIndex].value, this);"><option value="-1" selected>(Quick Links)</option>';
-	for (i = 0; i < edLinks.length; i++) {
-		tempStr += '<option value="' + i + '">' + edLinks[i].display + '</option>';
-	}
-	tempStr += '</select>';
-	document.write(tempStr);
-}
-
-function edAddTag(button) {
-	if (edButtons[button].tagEnd != '') {
-		edOpenTags[edOpenTags.length] = button;
-		document.getElementById(edButtons[button].id).value = '/' + document.getElementById(edButtons[button].id).value;
-	}
-}
-
-function edRemoveTag(button) {
-	for (i = 0; i < edOpenTags.length; i++) {
-		if (edOpenTags[i] == button) {
-			edOpenTags.splice(i, 1);
-			document.getElementById(edButtons[button].id).value = 		document.getElementById(edButtons[button].id).value.replace('/', '');
-		}
-	}
-}
-
-function edCheckOpenTags(button) {
-	var tag = 0;
-	for (i = 0; i < edOpenTags.length; i++) {
-		if (edOpenTags[i] == button) {
-			tag++;
-		}
-	}
-	if (tag > 0) {
-		return true; // tag found
-	}
-	else {
-		return false; // tag not found
-	}
-}	
-
-function edCloseAllTags() {
-	var count = edOpenTags.length;
-	for (o = 0; o < count; o++) {
-		edInsertTag(edCanvas, edOpenTags[edOpenTags.length - 1]);
-	}
-}
-
-function edQuickLink(i, thisSelect) {
-	if (i > -1) {
-		var newWin = '';
-		if (edLinks[i].newWin == 1) {
-			newWin = ' target="_blank"';
-		}
-		var tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>' 
-		            + edLinks[i].display
-		            + '</a>';
-		thisSelect.selectedIndex = 0;
-		edInsertContent(edCanvas, tempStr);
-	}
-	else {
-		thisSelect.selectedIndex = 0;
-	}
-}
-
-function edSpell(myField) {
-	var word = '';
-	if (document.selection) {
-		myField.focus();
-	    var sel = document.selection.createRange();
-		if (sel.text.length > 0) {
-			word = sel.text;
-		}
-	}
-	else if (myField.selectionStart || myField.selectionStart == '0') {
-		var startPos = myField.selectionStart;
-		var endPos = myField.selectionEnd;
-		if (startPos != endPos) {
-			word = myField.value.substring(startPos, endPos);
-		}
-	}
-	if (word == '') {
-		word = prompt('Enter a word to look up:', '');
-	}
-	if (word !== null && /^\w[\w ]*$/.test(word)) {
-		window.open('http://www.answers.com/' + escape(word));
-	}
-}
-
-function edToolbar() {
-	document.write('<div id="ed_toolbar">');
-	for (i = 0; i < edButtons.length; i++) {
-		edShowButton(edButtons[i], i);
-	}
-	document.write('<input type="button" id="ed_spell" class="ed_button" onclick="edSpell(edCanvas);" title="Dictionary lookup" value="lookup" />');
-	document.write('<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags();" title="Close all open tags" value="Close Tags" />');
-//	edShowLinks(); // disabled by default
-	document.write('</div>');
-}
-
-// insertion code
-
-function edInsertTag(myField, i) {
-	//IE support
-	if (document.selection) {
-		myField.focus();
-	    sel = document.selection.createRange();
-		if (sel.text.length > 0) {
-			sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
-		}
-		else {
-			if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
-				sel.text = edButtons[i].tagStart;
-				edAddTag(i);
-			}
-			else {
-				sel.text = edButtons[i].tagEnd;
-				edRemoveTag(i);
-			}
-		}
-		myField.focus();
-	}
-	//MOZILLA/NETSCAPE support
-	else if (myField.selectionStart || myField.selectionStart == '0') {
-		var startPos = myField.selectionStart;
-		var endPos = myField.selectionEnd;
-		var cursorPos = endPos;
-		var scrollTop = myField.scrollTop;
-
-		if (startPos != endPos) {
-			myField.value = myField.value.substring(0, startPos)
-			              + edButtons[i].tagStart
-			              + myField.value.substring(startPos, endPos) 
-			              + edButtons[i].tagEnd
-			              + myField.value.substring(endPos, myField.value.length);
-			cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
-		}
-		else {
-			if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
-				myField.value = myField.value.substring(0, startPos) 
-				              + edButtons[i].tagStart
-				              + myField.value.substring(endPos, myField.value.length);
-				edAddTag(i);
-				cursorPos = startPos + edButtons[i].tagStart.length;
-			}
-			else {
-				myField.value = myField.value.substring(0, startPos) 
-				              + edButtons[i].tagEnd
-				              + myField.value.substring(endPos, myField.value.length);
-				edRemoveTag(i);
-				cursorPos = startPos + edButtons[i].tagEnd.length;
-			}
-		}
-		myField.focus();
-		myField.selectionStart = cursorPos;
-		myField.selectionEnd = cursorPos;
-		myField.scrollTop = scrollTop;
-	}
-	else {
-		if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
-			myField.value += edButtons[i].tagStart;
-			edAddTag(i);
-		}
-		else {
-			myField.value += edButtons[i].tagEnd;
-			edRemoveTag(i);
-		}
-		myField.focus();
-	}
-}
-
-function edInsertContent(myField, myValue) {
-	//IE support
-	if (document.selection) {
-		myField.focus();
-		sel = document.selection.createRange();
-		sel.text = myValue;
-		myField.focus();
-	}
-	//MOZILLA/NETSCAPE support
-	else if (myField.selectionStart || myField.selectionStart == '0') {
-		var startPos = myField.selectionStart;
-		var endPos = myField.selectionEnd;
-		myField.value = myField.value.substring(0, startPos)
-		              + myValue 
-                      + myField.value.substring(endPos, myField.value.length);
-		myField.focus();
-		myField.selectionStart = startPos + myValue.length;
-		myField.selectionEnd = startPos + myValue.length;
-	} else {
-		myField.value += myValue;
-		myField.focus();
-	}
-}
-
-function edInsertLink(myField, i, defaultValue) {
-	if (!defaultValue) {
-		defaultValue = 'http://';
-	}
-	if (!edCheckOpenTags(i)) {
-		var URL = prompt('Enter the URL' ,defaultValue);
-		if (URL) {
-			edButtons[i].tagStart = '<a href="' + URL + '">';
-			edInsertTag(myField, i);
-		}
-	}
-	else {
-		edInsertTag(myField, i);
-	}
-}
-
-function edInsertImage(myField) {
-	var myValue = prompt('Enter the URL of the image', 'http://');
-	if (myValue) {
-		myValue = '<img src="' 
-				+ myValue 
-				+ '" alt="' + prompt('Enter a description of the image', '') 
-				+ '" />';
-		edInsertContent(myField, myValue);
-	}
-}
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/setup-config.php 2.0.4/wp-admin/setup-config.php
--- 1.5.2/wp-admin/setup-config.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-admin/setup-config.php	2006-07-04 21:30:36.000000000 -0500
@@ -1,17 +1,18 @@
 <?php
 define('WP_INSTALLING', true);
 
-if (file_exists('../wp-config.php')) 
-	die("The file 'wp-config.php' already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='install.php'>installing now</a>.");
-
 if (!file_exists('../wp-config-sample.php'))
     die('Sorry, I need a wp-config-sample.php file to work from. Please re-upload this file from your WordPress installation.');
+
 $configFile = file('../wp-config-sample.php');
 
 if (!is_writable('../')) die("Sorry, I can't write to the directory. You'll have to either change the permissions on your WordPress directory or create your wp-config.php manually.");
 
-$step = 0;
-if(isset($_GET['step'])) $step = $_GET['step'];
+
+if (isset($_GET['step']))
+	$step = $_GET['step'];
+else
+	$step = 0;
 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">
@@ -20,45 +21,74 @@
 <title>WordPress &rsaquo; Setup Configuration File</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <style media="screen" type="text/css">
-    <!--
+	<!--
+	html {
+		background: #eee;
+	}
 	body {
+		background: #fff;
+		color: #000;
 		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 15%;
-		margin-right: 15%;
+		margin-left: 20%;
+		margin-right: 20%;
+		padding: .2em 2em;
 	}
-	#logo {
-		margin: 0;
-		padding: 0;
-		background-image: url(http://wordpress.org/images/logo.png);
-		background-repeat: no-repeat;
-		height: 60px;
-		border-bottom: 4px solid #333;
-	}
-	#logo a {
-		display: block;
-		height: 60px;
+
+	h1 {
+		color: #006;
+		font-size: 18px;
+		font-weight: lighter;
 	}
-	#logo a span {
-		display: none;
+
+	h2 {
+		font-size: 16px;
 	}
-	p, li {
+
+	p, li, dt {
 		line-height: 140%;
+		padding-bottom: 2px;
 	}
-    -->
+
+	ul, ol {
+		padding: 5px 5px 5px 20px;
+	}
+	#logo {
+		margin-bottom: 2em;
+	}
+	.step a, .step input {
+		font-size: 2em;
+	}
+	td input {
+		font-size: 1.5em;
+	}
+	.step, th {
+		text-align: right;
+	}
+	#footer {
+		text-align: center;
+		border-top: 1px solid #ccc;
+		padding-top: 1em;
+		font-style: italic;
+	}
+	-->
 	</style>
 </head>
-<body> 
-<h1 id="logo"><a href="http://wordpress.org"><span>WordPress</span></a></h1> 
+<body>
+<h1 id="logo"><img alt="WordPress" src="images/wordpress-logo.png" /></h1>
 <?php
+// Check if wp-config.php has been created
+if (file_exists('../wp-config.php'))
+	die("<p>The file 'wp-config.php' already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='install.php'>installing now</a>.</p></body></html>");
 
 switch($step) {
 	case 0:
 ?> 
+
 <p>Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding.</p> 
 <ol> 
   <li>Database name</li> 
   <li>Database username</li> 
-  <li>Database password</li> 
+  <li>Database password</li>
   <li>Database host</li> 
   <li>Table prefix (if you want to run more than one WordPress in a single database) </li>
 </ol> 
@@ -70,46 +100,48 @@
 	case 1:
 	?> 
 </p> 
-<form method="post" action="setup-config.php?step=2"> 
+<form method="post" action="setup-config.php?step=2">
   <p>Below you should enter your database connection details. If you're not sure about these, contact your host. </p>
   <table> 
     <tr> 
       <th scope="row">Database Name</th> 
-      <td><input name="dbname" type="text" size="45" value="wordpress" /></td> 
+      <td><input name="dbname" type="text" size="25" value="wordpress" /></td>
       <td>The name of the database you want to run WP in. </td> 
     </tr> 
     <tr> 
       <th scope="row">User Name</th> 
-      <td><input name="uname" type="text" size="45" value="username" /></td> 
+      <td><input name="uname" type="text" size="25" value="username" /></td>
       <td>Your MySQL username</td> 
     </tr> 
     <tr> 
       <th scope="row">Password</th> 
-      <td><input name="pwd" type="text" size="45" value="password" /></td> 
+      <td><input name="pwd" type="text" size="25" value="password" /></td>
       <td>...and MySQL password.</td> 
     </tr> 
     <tr> 
       <th scope="row">Database Host</th> 
-      <td><input name="dbhost" type="text" size="45" value="localhost" /></td> 
+      <td><input name="dbhost" type="text" size="25" value="localhost" /></td>
       <td>99% chance you won't need to change this value.</td> 
     </tr>
     <tr>
       <th scope="row">Table Prefix</th>
-      <td><input name="prefix" type="text" id="prefix" value="wp_" size="45" /></td>
+      <td><input name="prefix" type="text" id="prefix" value="wp_" size="25" /></td>
       <td>If you want to run multiple WordPress installations in a single database, change this.</td>
     </tr> 
-  </table> 
-  <input name="submit" type="submit" value="Submit" /> 
+  </table>
+  <h2 class="step">
+  <input name="submit" type="submit" value="Submit" />
+  </h2>
 </form> 
 <?php
 	break;
-	
+
 	case 2:
-	$dbname = $_POST['dbname'];
-    $uname = $_POST['uname'];
-    $passwrd = $_POST['pwd'];
-    $dbhost = $_POST['dbhost'];
-	$prefix = $_POST['prefix'];
+	$dbname  = trim($_POST['dbname']);
+    $uname   = trim($_POST['uname']);
+    $passwrd = trim($_POST['pwd']);
+    $dbhost  = trim($_POST['dbhost']);
+	$prefix  = trim($_POST['prefix']);
 	if (empty($prefix)) $prefix = 'wp_';
 
     // Test the db connection.
@@ -149,8 +181,8 @@
 <p>All right sparky! You've made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to <a href="install.php">run the install!</a></p> 
 <?php
 	break;
-
 }
-?> 
+?>
+<p id="footer"><a href="http://wordpress.org/">WordPress</a>, personal publishing platform.</p>
 </body>
 </html>
diff -ruN 1.5.2/wp-admin/sidebar.php 2.0.4/wp-admin/sidebar.php
--- 1.5.2/wp-admin/sidebar.php	2005-03-03 13:27:39.000000000 -0600
+++ 2.0.4/wp-admin/sidebar.php	2006-07-05 15:16:54.000000000 -0500
@@ -3,9 +3,7 @@
 
 require_once('admin.php');
 
-get_currentuserinfo();
-
-if ($user_level == 0)
+if ( ! current_user_can('edit_posts') )
 	die ("Cheatin' uh ?");
 
 if ('b' == $_GET['a']) {
@@ -49,8 +47,8 @@
 </style>
 </head>
 <body id="sidebar">
-<h1 id="wphead"><a href="http://wordpress.org" rel="external">WordPress</a></h1>
-<form name="post" action="post.php" method="POST">
+<h1 id="wphead"><a href="http://wordpress.org/" rel="external">WordPress</a></h1>
+<form name="post" action="post.php" method="post">
 <div><input type="hidden" name="action" value="post" />
 <input type="hidden" name="user_ID" value="<?php echo $user_ID ?>" />
 <input type="hidden" name="mode" value="sidebar" />
@@ -68,8 +66,9 @@
 </p>
 <p>
     <input name="saveasdraft" type="submit" id="saveasdraft" tabindex="9" value="Save as Draft" /> 
+<?php if ( current_user_can('publish_posts') ) : ?>
     <input name="publish" type="submit" id="publish" tabindex="6" style="font-weight: bold;" value="Publish" /> 
-  
+<?php endif; ?>
 </p>
 </div>
 </form>
diff -ruN 1.5.2/wp-admin/templates.php 2.0.4/wp-admin/templates.php
--- 1.5.2/wp-admin/templates.php	2005-05-09 06:01:12.000000000 -0500
+++ 2.0.4/wp-admin/templates.php	2006-06-27 18:10:02.000000000 -0500
@@ -36,18 +36,23 @@
 
 case 'update':
 
-	if ($user_level < 5) {
-		die(__('<p>You have do not have sufficient permissions to edit templates for this blog.</p>'));
-	}
+	check_admin_referer('edit-file_' . $file);
+
+	if ( ! current_user_can('edit_files') )
+	die('<p>'.__('You have do not have sufficient permissions to edit templates for this blog.').'</p>');
 
 	$newcontent = stripslashes($_POST['newcontent']);
 	if (is_writeable($real_file)) {
-		$f = fopen($real_file, 'w+');
-		fwrite($f, $newcontent);
-		fclose($f);
-		header("Location: templates.php?file=$file&a=te");
+		$f = @ fopen($real_file, 'w+');
+		if ( $f ) {
+			fwrite($f, $newcontent);
+			fclose($f);
+			wp_redirect("templates.php?file=$file&a=te");
+		} else {
+			wp_redirect("templates.php?file=$file&a=err");
+		}
 	} else {
-		header("Location: templates.php?file=$file");
+		wp_redirect("templates.php?file=$file&a=err");
 	}
 
 	exit();
@@ -57,26 +62,35 @@
 default:
 
 	require_once('./admin-header.php');
-	if ( $user_level <= 5 )
-		die(__('<p>You have do not have sufficient permissions to edit templates for this blog.</p>'));
+	
+	if ( ! current_user_can('edit_files') )
+	die('<p>'.__('You have do not have sufficient permissions to edit templates for this blog.').'</p>');
 
 	if ( strstr( $file, 'wp-config.php' ) )
-		die( __('<p>The config file cannot be edited or viewed through the web interface. Sorry!</p>') );
+	die('<p>'.__('The config file cannot be edited or viewed through the web interface. Sorry!').'</p>');
 
 	update_recently_edited($file);
 
 	if (!is_file($real_file))
-		$error = 1;
+		$error = true;
 	
 	if (!$error) {
-		$f = fopen($real_file, 'r');
-		$content = fread($f, filesize($real_file));
-		$content = htmlspecialchars($content);
+		$f = @ fopen($real_file, 'r');
+		if ( $f ) {
+			$content = fread($f, filesize($real_file));
+			$content = htmlspecialchars($content);
+		} else {
+			$error = true;
+		}
 	}
 
 	?>
 <?php if (isset($_GET['a'])) : ?>
- <div class="updated"><p><?php _e('File edited successfully.') ?></p></div>
+	<?php if ( 'err' == $_GET['a'] ) : ?>
+ <div id="message" class="error"><p><?php _e('Could not save file.') ?></p></div>
+	<?php else: ?>
+ <div id="message" class="updated fade"><p><?php _e('File edited successfully.') ?></p></div>
+	<?php endif; ?>	
 <?php endif; ?>
  <div class="wrap"> 
 <?php
@@ -114,6 +128,7 @@
 </div>
 <?php if (!$error) { ?>
   <form name="template" id="template" action="templates.php" method="post"> 
+  <?php wp_nonce_field('edit-file_' . $file) ?>
      <div><textarea cols="70" rows="25" name="newcontent" id='newcontent' tabindex="1"><?php echo $content ?></textarea> 
      <input type="hidden" name="action" value="update" /> 
      <input type="hidden" name="file" value="<?php echo $file ?>" /> 
@@ -125,7 +140,7 @@
 ?>
 </p>
 <?php else : ?>
-<p><em><?php _e('If this file was writable you could edit it.'); ?></em></p>
+<p><em><?php _e('If this file were writable you could edit it.'); ?></em></p>
 <?php endif; ?>
    </form> 
   <?php
@@ -133,6 +148,7 @@
 		echo '<div class="error"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>';
 	}
 	?>
+<div class="clear"> &nbsp; </div>
 </div>
 <div class="wrap">
 <h2><?php _e('Other Files') ?></h2>
@@ -151,4 +167,4 @@
 }
 
 include("admin-footer.php");
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-admin/theme-editor.php 2.0.4/wp-admin/theme-editor.php
--- 1.5.2/wp-admin/theme-editor.php	2005-04-19 16:41:35.000000000 -0500
+++ 2.0.4/wp-admin/theme-editor.php	2006-06-27 18:10:02.000000000 -0500
@@ -41,13 +41,16 @@
 $file = validate_file_to_edit($file, $allowed_files);
 $real_file = get_real_file_to_edit($file);
 
+$file_show = basename( $file );
+
 switch($action) {
 
 case 'update':
 
-	if ($user_level < 5) {
-		die(__('<p>You have do not have sufficient permissions to edit templates for this blog.</p>'));
-	}
+	check_admin_referer('edit-theme_' . $file . $theme);
+
+	if ( !current_user_can('edit_themes') )
+	die('<p>'.__('You have do not have sufficient permissions to edit templates for this blog.').'</p>');
 
 	$newcontent = stripslashes($_POST['newcontent']);
 	$theme = urlencode($theme);
@@ -55,9 +58,9 @@
 		$f = fopen($real_file, 'w+');
 		fwrite($f, $newcontent);
 		fclose($f);
-		header("Location: theme-editor.php?file=$file&theme=$theme&a=te");
+		wp_redirect("theme-editor.php?file=$file&theme=$theme&a=te");
 	} else {
-		header("Location: theme-editor.php?file=$file&theme=$theme");
+		wp_redirect("theme-editor.php?file=$file&theme=$theme");
 	}
 
 	exit();
@@ -67,9 +70,8 @@
 default:
 	
 	require_once('admin-header.php');
-	if ($user_level <= 5) {
-		die(__('<p>You have do not have sufficient permissions to edit themes for this blog.</p>'));
-	}
+	if ( !current_user_can('edit_themes') )
+	die('<p>'.__('You have do not have sufficient permissions to edit themes for this blog.').'</p>');
 
 	update_recently_edited($file);
 	
@@ -84,7 +86,7 @@
 
 	?>
 <?php if (isset($_GET['a'])) : ?>
- <div class="updated"><p><?php _e('File edited successfully.') ?></p></div>
+ <div id="message" class="updated fade"><p><?php _e('File edited successfully.') ?></p></div>
 <?php endif; ?>
  <div class="wrap">
   <form name="theme" action="theme-editor.php" method="post"> 
@@ -106,10 +108,10 @@
 
  <div class="wrap"> 
   <?php
-	if (is_writeable($real_file)) {
-		echo '<h2>' . sprintf(__('Editing <code>%s</code>'), $file) . '</h2>';
+	if ( is_writeable($real_file) ) {
+		echo '<h2>' . sprintf(__('Editing <code>%s</code>'), $file_show) . '</h2>';
 	} else {
-		echo '<h2>' . sprintf(__('Browsing <code>%s</code>'), $file) . '</h2>';
+		echo '<h2>' . sprintf(__('Browsing <code>%s</code>'), $file_show) . '</h2>';
 	}
 	?>
 	<div id="templateside">
@@ -129,6 +131,7 @@
 	if (!$error) {
 	?> 
   <form name="template" id="template" action="theme-editor.php" method="post">
+  <?php wp_nonce_field('edit-theme_' . $file . $theme) ?>
 		 <div><textarea cols="70" rows="25" name="newcontent" id="newcontent" tabindex="1"><?php echo $content ?></textarea> 
      <input type="hidden" name="action" value="update" /> 
      <input type="hidden" name="file" value="<?php echo $file ?>" /> 
@@ -141,14 +144,15 @@
 ?>
 </p>
 <?php else : ?>
-<p><em><?php _e('If this file was writable you could edit it.'); ?></em></p>
+<p><em><?php _e('If this file were writable you could edit it.'); ?></em></p>
 <?php endif; ?>
    </form> 
   <?php
 	} else {
 		echo '<div class="error"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>';
 	}
-	?> 
+	?>
+<div class="clear"> &nbsp; </div>
 </div> 
 <?php
 break;
diff -ruN 1.5.2/wp-admin/themes.php 2.0.4/wp-admin/themes.php
--- 1.5.2/wp-admin/themes.php	2005-05-09 06:37:36.000000000 -0500
+++ 2.0.4/wp-admin/themes.php	2006-06-27 18:10:02.000000000 -0500
@@ -2,115 +2,94 @@
 require_once('admin.php');
 
 if ( isset($_GET['action']) ) {
-	check_admin_referer();
-
+	check_admin_referer('switch-theme_' . $_GET['template']);
+	
 	if ('activate' == $_GET['action']) {
-	  if (isset($_GET['template'])) {
-	    update_option('template', $_GET['template']);
-	  }
-
-	  if (isset($_GET['stylesheet'])) {
-	    update_option('stylesheet', $_GET['stylesheet']);
-	  }
-
+		if ( isset($_GET['template']) )
+			update_option('template', $_GET['template']);
+		
+		if ( isset($_GET['stylesheet']) )
+			update_option('stylesheet', $_GET['stylesheet']);
+		
 		do_action('switch_theme', get_current_theme());
-
-	  header('Location: themes.php?activated=true');
+		
+		wp_redirect('themes.php?activated=true');
+		exit;
 	}
- }
+}
 
 $title = __('Manage Themes');
 $parent_file = 'themes.php';
 require_once('admin-header.php');
 ?>
+
 <?php if ( ! validate_current_theme() ) : ?>
-<div class="updated"><p><?php _e('The active theme is broken.  Reverting to the default theme.'); ?></p></div>
-<?php elseif ( isset($activated) ) : ?>
-<div class="updated"><p><?php _e('New theme activated'); ?></p></div>
+<div id="message1" class="updated fade"><p><?php _e('The active theme is broken.  Reverting to the default theme.'); ?></p></div>
+<?php elseif ( isset($_GET['activated']) ) : ?>
+<div id="message2" class="updated fade"><p><?php printf(__('New theme activated. <a href="%s">View site &raquo;</a>'), get_bloginfo('home') . '/'); ?></p></div>
 <?php endif; ?>
 
 <?php
 $themes = get_themes();
-$current_theme = get_current_theme();
-$current_title = $themes[$current_theme]['Title'];
-$current_version = $themes[$current_theme]['Version'];
-$current_parent_theme = $themes[$current_theme]['Parent Theme'];
-$current_template_dir = $themes[$current_theme]['Template Dir'];
-$current_stylesheet_dir = $themes[$current_theme]['Stylesheet Dir'];
-$current_template = $themes[$current_theme]['Template'];
-$current_stylesheet = $themes[$current_theme]['Stylesheet'];
+$ct = current_theme_info();
 ?>
 
 <div class="wrap">
 <h2><?php _e('Current Theme'); ?></h2>
 <div id="currenttheme">
-<h3><?php printf(__('%1$s %2$s by %3$s'), $current_title, $current_version, $themes[$current_theme]['Author']) ; ?></h3>
-<p><?php echo $themes[$current_theme]['Description']; ?></p>
-<?php if ($current_parent_theme) { ?>
-	<p><?php printf(__('The active theme is <strong>%1$s</strong>.  The template files are located in <code>%2$s</code>.  The stylesheet files are located in <code>%3$s</code>.  <strong>%4$s</strong> uses templates from <strong>%5$s</strong>.  Changes made to the templates will affect both themes.'), $current_theme, $current_template_dir, $current_stylesheet_dir, $current_theme, $current_parent_theme); ?></p>
+<?php if ( $ct->screenshot ) : ?>
+<img src="<?php echo get_option('siteurl') . '/' . $ct->stylesheet_dir . '/' . $ct->screenshot; ?>" alt="<?php _e('Current theme preview'); ?>" />
+<?php endif; ?>
+<h3><?php printf(__('%1$s %2$s by %3$s'), $ct->title, $ct->version, $ct->author) ; ?></h3>
+<p><?php echo $ct->description; ?></p>
+<?php if ($ct->parent_theme) { ?>
+	<p><?php printf(__('The template files are located in <code>%2$s</code>.  The stylesheet files are located in <code>%3$s</code>.  <strong>%4$s</strong> uses templates from <strong>%5$s</strong>.  Changes made to the templates will affect both themes.'), $ct->title, $ct->template_dir, $ct->stylesheet_dir, $ct->title, $ct->parent_theme); ?></p>
 <?php } else { ?>
-	<p><?php printf(__('The active theme is <strong>%1$s</strong>.  The template files are located in <code>%2$s</code>.  The stylesheet files are located in <code>%3$s</code>.'), $current_theme, $current_template_dir, $current_stylesheet_dir); ?></p>
+	<p><?php printf(__('All of this theme&#8217;s files are located in <code>%2$s</code>.'), $ct->title, $ct->template_dir, $ct->stylesheet_dir); ?></p>
 <?php } ?>
 </div>
 
-<h2><?php _e('Themes Available'); ?></h2>
+<h2><?php _e('Available Themes'); ?></h2>
 <?php if ( 1 < count($themes) ) { ?>
-<table width="100%" cellpadding="3" cellspacing="3">
-	<tr>
-		<th><?php _e('Name'); ?></th>
-		<th><?php _e('Author'); ?></th>
-		<th><?php _e('Description'); ?></th>
-		<th></th>
-	</tr>
+
 <?php
-	$style = '';
+$style = '';
 
-	$theme_names = array_keys($themes);
-	natcasesort($theme_names);
+$theme_names = array_keys($themes);
+natcasesort($theme_names);
 
-	foreach ($theme_names as $theme_name) {
-		$template = $themes[$theme_name]['Template'];
-		$stylesheet = $themes[$theme_name]['Stylesheet'];
-		$title = $themes[$theme_name]['Title'];
-		$version = $themes[$theme_name]['Version'];
-		$description = $themes[$theme_name]['Description'];
-		$author = $themes[$theme_name]['Author'];
-
-		if ($template == $current_template && $stylesheet == $current_stylesheet) {
-			$action = '<strong>' . __('Active Theme') . '</strong>';
-			$current = true;
-		} else {
-			$action = "<a href='themes.php?action=activate&amp;template=$template&amp;stylesheet=$stylesheet' title='" . __('Select this theme') . "' class='edit'>" . __('Select') . '</a>';
-			$current = false;
-		}
-
-		$style = ('class="alternate"' == $style|| 'class="alternate active"' == $style) ? '' : 'alternate';
-		if ($current) $style .= $style == 'alternate' ? ' active' : 'active';
-		if ($style != '') $style = 'class="' . $style . '"';
+foreach ($theme_names as $theme_name) {
+	if ( $theme_name == $ct->name )
+		continue;
+	$template = $themes[$theme_name]['Template'];
+	$stylesheet = $themes[$theme_name]['Stylesheet'];
+	$title = $themes[$theme_name]['Title'];
+	$version = $themes[$theme_name]['Version'];
+	$description = $themes[$theme_name]['Description'];
+	$author = $themes[$theme_name]['Author'];
+	$screenshot = $themes[$theme_name]['Screenshot'];
+	$stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];
+	$activate_link = wp_nonce_url("themes.php?action=activate&amp;template=$template&amp;stylesheet=$stylesheet", 'switch-theme_' . $template);
+?>
+<div class="available-theme">
+<h3><a href="<?php echo $activate_link; ?>"><?php echo "$title $version"; ?></a></h3>
+
+<a href="<?php echo $activate_link; ?>" class="screenshot">
+<?php if ( $screenshot ) : ?>
+<img src="<?php echo get_option('siteurl') . '/' . $stylesheet_dir . '/' . $screenshot; ?>" alt="" />
+<?php endif; ?>
+</a>
 
-		echo "
-	  <tr $style>";
-if ( $current )
-	echo "<td><strong>$title $version</strong></td>";
-else
-	echo "<td>$title $version</td>";
-echo "
-	     <td class=\"auth\">$author</td>
-	     <td class=\"desc\">$description</td>
-	     <td class=\"togl\">$action</td>
-	  </tr>";
-	}
-?>
+<p><?php echo $description; ?></p>
+</div>
+<?php } // end foreach theme_names ?>
 
-</table>
-<?php
-}
-?>
+<?php } ?>
 
 <?php
 // List broken themes, if any.
 $broken_themes = get_broken_themes();
-if (count($broken_themes)) {
+if ( count($broken_themes) ) {
 ?>
 
 <h2><?php _e('Broken Themes'); ?></h2>
@@ -145,10 +124,8 @@
 ?>
 
 <h2><?php _e('Get More Themes'); ?></h2>
-<p><?php _e('You can find additional themes for your site in the <a href="http://wordpress.org/extend/themes/">WordPress theme directory</a>. To install a theme you generally just need to upload the theme folder into your <code>wp-content/themes</code> directory. Once a theme is uploaded, you may activate it here.'); ?></p>
+<p><?php _e('You can find additional themes for your site in the <a href="http://wordpress.org/extend/themes/">WordPress theme directory</a>. To install a theme you generally just need to upload the theme folder into your <code>wp-content/themes</code> directory. Once a theme is uploaded, you should see it on this page.'); ?></p>
 
 </div>
 
-<?php
-include('admin-footer.php');
-?>
\ No newline at end of file
+<?php require('admin-footer.php'); ?>
diff -ruN 1.5.2/wp-admin/update-links.php 2.0.4/wp-admin/update-links.php
--- 1.5.2/wp-admin/update-links.php	2005-03-29 10:58:30.000000000 -0600
+++ 2.0.4/wp-admin/update-links.php	2006-06-24 01:04:09.000000000 -0500
@@ -3,7 +3,7 @@
 require_once( ABSPATH . 'wp-includes/class-snoopy.php');
 
 if ( !get_option('use_linksupdate') )
-	die('Feature disabled.');
+	die(__('Feature disabled.'));
 
 $link_uris = $wpdb->get_col("SELECT link_url FROM $wpdb->links");
 
@@ -23,7 +23,7 @@
 $http_request .= $query_string;
 
 $response = '';
-if( false !== ( $fs = fsockopen('api.pingomatic.com', 80, $errno, $errstr, 5) ) ) {
+if ( false !== ( $fs = @fsockopen('api.pingomatic.com', 80, $errno, $errstr, 5) ) ) {
 	fwrite($fs, $http_request);
 	while ( !feof($fs) )
 		$response .= fgets($fs, 1160); // One TCP-IP packet
@@ -36,9 +36,9 @@
 	$returns = explode("\n", $body);
     
 	foreach ($returns as $return) :
-		$time = addslashes( substr($return, 0, 19) );
-		$uri = addslashes( preg_replace('/(.*?) | (.*?)/', '$2', $return) );
+		$time = $wpdb->escape( substr($return, 0, 19) );
+		$uri = $wpdb->escape( preg_replace('/(.*?) | (.*?)/', '$2', $return) );
 		$wpdb->query("UPDATE $wpdb->links SET link_updated = '$time' WHERE link_url = '$uri'");
 	endforeach;
 }
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-admin/upload.php 2.0.4/wp-admin/upload.php
--- 1.5.2/wp-admin/upload.php	2005-08-10 01:48:12.000000000 -0500
+++ 2.0.4/wp-admin/upload.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,230 +0,0 @@
-<?php
-require_once('admin.php');
-
-$title = 'Upload Image or File';
-
-require_once('admin-header.php');
-
-if ($user_level == 0) //Checks to see if user has logged in
-	die (__("Cheatin' uh ?"));
-
-if (!get_settings('use_fileupload')) //Checks if file upload is enabled in the config
-	die (__("The admin disabled this function"));
-
-if ( !get_settings('fileupload_minlevel') )
-	die (__("You are not allowed to upload files"));
-
-$allowed_types = explode(' ', trim(strtolower(get_settings('fileupload_allowedtypes'))));
-
-if ($_POST['submit']) {
-	$action = 'upload';
-} else {
-	$action = '';
-}
-
-if (!is_writable(get_settings('fileupload_realpath')))
-	$action = 'not-writable';
-?>
-
-<div class="wrap">
-
-<?php
-switch ($action) {
-case 'not-writable':
-?>
-<p><?php printf(__("It doesn't look like you can use the file upload feature at this time because the directory you have specified (<code>%s</code>) doesn't appear to be writable by WordPress. Check the permissions on the directory and for typos."), get_settings('fileupload_realpath')) ?></p>
-
-<?php
-break;
-case '':
-	foreach ($allowed_types as $type) {
-		$type_tags[] = "<code>$type</code>";
-	}
-	$i = implode(', ', $type_tags);
-?>
-<p><?php printf(__('You can upload files with the extension %1$s as long as they are no larger than %2$s <abbr title="Kilobytes">KB</abbr>. If you&#8217;re an admin you can configure these values under <a href="%3$s">options</a>.'), $i, get_settings('fileupload_maxk'), 'options-misc.php') ?></p>
-    <form action="upload.php" method="post" enctype="multipart/form-data">
-    <p>
-      <label for="img1"><?php _e('File:') ?></label>
-      <br />
-	<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo get_settings('fileupload_maxk') * 1024 ?>" />
-    <input type="file" name="img1" id="img1" size="35" class="uploadform" /></p>
-    <p>
-    <label for="imgdesc"><?php _e('Description:') ?></label><br />
-    <input type="text" name="imgdesc" id="imgdesc" size="30" class="uploadform" />
-    </p>
-	
-    <p><?php _e('Create a thumbnail?') ?></p>
-    <p>
-    <label for="thumbsize_no">
-    <input type="radio" name="thumbsize" value="none" checked="checked" id="thumbsize_no" />
-    <?php _e('No thanks') ?></label>
-    <br />
-        <label for="thumbsize_small">
-<input type="radio" name="thumbsize" value="small" id="thumbsize_small" />
-<?php _e('Small (200px largest side)') ?></label>
-        <br />
-        <label for="thumbsize_large">
-<input type="radio" name="thumbsize" value="large" id="thumbsize_large" />
-<?php _e('Large (400px largest side)') ?></label>
-        <br />
-        <label for="thumbsize_custom">
-        <input type="radio" name="thumbsize" value="custom" id="thumbsize_custom" />
-<?php _e('Custom size') ?></label>
-      : 
-      <input type="text" name="imgthumbsizecustom" size="4" />
-    <?php _e('px (largest side)') ?>    </p>
-	<p><input type="submit" name="submit" value="<?php _e('Upload File') ?>" /></p>
-    </form>
-</div><?php 
-break;
-case 'upload':
-
-	$imgalt = basename( (isset($_POST['imgalt'])) ? $_POST['imgalt'] : '' );
-
-	$img1_name = (strlen($imgalt)) ? $imgalt : basename( $_FILES['img1']['name'] );
-	$img1_name = preg_replace('/[^a-z0-9_.]/i', '', $img1_name); 
-	$img1_size = $_POST['img1_size'] ? intval($_POST['img1_size']) : intval($_FILES['img1']['size']);
-
-	$img1_type = (strlen($imgalt)) ? $_POST['img1_type'] : $_FILES['img1']['type'];
-	$imgdesc = htmlentities2($_POST['imgdesc']);
-
-	$pi = pathinfo($img1_name);
-	$imgtype = strtolower($pi['extension']);
-
-	if (in_array($imgtype, $allowed_types) == false)
-		die(sprintf(__('File %1$s of type %2$s is not allowed.') , $img1_name, $imgtype));
-
-    if (strlen($imgalt)) {
-        $pathtofile = get_settings('fileupload_realpath')."/".$imgalt;
-        $img1 = $_POST['img1'];
-    } else {
-        $pathtofile = get_settings('fileupload_realpath')."/".$img1_name;
-        $img1 = $_FILES['img1']['tmp_name'];
-    }
-
-    // makes sure not to upload duplicates, rename duplicates
-    $i = 1;
-    $pathtofile2 = $pathtofile;
-    $tmppathtofile = $pathtofile2;
-    $img2_name = $img1_name;
-
-    while ( file_exists($pathtofile2) ) {
-        $pos = strpos( strtolower($tmppathtofile), '.' . trim($imgtype) );
-        $pathtofile_start = substr($tmppathtofile, 0, $pos);
-        $pathtofile2 = $pathtofile_start.'_'.zeroise($i++, 2).'.'.trim($imgtype);
-        $img2_name = explode('/', $pathtofile2);
-        $img2_name = $img2_name[count($img2_name)-1];
-    }
-
-    if (file_exists($pathtofile) && !strlen($imgalt)) {
-        $i = explode(' ', get_settings('fileupload_allowedtypes'));
-        $i = implode(', ',array_slice($i, 1, count($i)-2));
-        $moved = move_uploaded_file($img1, $pathtofile2);
-        // if move_uploaded_file() fails, try copy()
-        if (!$moved) {
-            $moved = copy($img1, $pathtofile2);
-        }
-        if (!$moved) {
-            die(sprintf(__("Couldn't upload your file to %s."), $pathtofile2));
-        } else {
-			chmod($pathtofile2, 0666);
-            @unlink($img1);
-        }
-
-	// 
-    
-    // duplicate-renaming function contributed by Gary Lawrence Murphy
-    ?>
-    <p><strong><?php __('Duplicate File?') ?></strong></p>
-    <p><b><em><?php printf(__("The filename '%s' already exists!"), $img1_name); ?></em></b></p>
-    <p> <?php printf(__("Filename '%1\$s' moved to '%2\$s'"), $img1, "$pathtofile2 - $img2_name") ?></p>
-    <p><?php _e('Confirm or rename:') ?></p>
-    <form action="upload.php" method="post" enctype="multipart/form-data">
-    <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo  get_settings('fileupload_maxk') *1024 ?>" />
-    <input type="hidden" name="img1_type" value="<?php echo $img1_type;?>" />
-    <input type="hidden" name="img1_name" value="<?php echo $img2_name;?>" />
-    <input type="hidden" name="img1_size" value="<?php echo $img1_size;?>" />
-    <input type="hidden" name="img1" value="<?php echo $pathtofile2;?>" />
-    <input type="hidden" name="thumbsize" value="<?php echo $_REQUEST['thumbsize'];?>" />
-    <input type="hidden" name="imgthumbsizecustom" value="<?php echo $_REQUEST['imgthumbsizecustom'];?>" />
-    <?php _e('Alternate name:') ?><br /><input type="text" name="imgalt" size="30" class="uploadform" value="<?php echo $img2_name;?>" /><br />
-    <br />
-    <?php _e('Description:') ?><br /><input type="text" name="imgdesc" size="30" class="uploadform" value="<?php echo $imgdesc;?>" />
-    <br />
-    <input type="submit" name="submit" value="<?php _e('Rename') ?>" class="search" />
-    </form>
-</div>
-<?php 
-
-require('admin-footer.php');
-die();
-
-    }
-
-    if (!strlen($imgalt)) {
-        @$moved = move_uploaded_file($img1, $pathtofile); //Path to your images directory, chmod the dir to 777
-        // move_uploaded_file() can fail if open_basedir in PHP.INI doesn't
-        // include your tmp directory. Try copy instead?
-        if(!$moved) {
-            $moved = copy($img1, $pathtofile);
-        }
-        // Still couldn't get it. Give up.
-        if (!$moved) {
-            die(sprintf(__("Couldn't upload your file to %s."), $pathtofile));
-        } else {
-			chmod($pathtofile, 0666);
-            @unlink($img1);
-        }
-        
-    } else {
-        rename($img1, $pathtofile)
-        or die(sprintf(__("Couldn't upload your file to %s."), $pathtofile));
-    }
-    
-    if($_POST['thumbsize'] != 'none' ) {
-        if($_POST['thumbsize'] == 'small') {
-            $max_side = 200;
-        }
-        elseif($_POST['thumbsize'] == 'large') {
-            $max_side = 400;
-        }
-        elseif($_POST['thumbsize'] == 'custom') {
-            $max_side = intval($_POST['imgthumbsizecustom']);
-        }
-        
-        $result = wp_create_thumbnail($pathtofile, $max_side, NULL);
-        if($result != 1) {
-            print $result;
-        }
-    }
-
-if ( ereg('image/',$img1_type) )
-	$piece_of_code = "<img src='" . get_settings('fileupload_url') ."/$img1_name' alt='$imgdesc' />";
-else
-	$piece_of_code = "<a href='". get_settings('fileupload_url') . "/$img1_name' title='$imgdesc'>$imgdesc</a>";
-
-$piece_of_code = htmlspecialchars( $piece_of_code );
-?>
-
-<h3><?php _e('File uploaded!') ?></h3>
-<p><?php printf(__("Your file <code>%s</code> was uploaded successfully!"), $img1_name); ?></p>
-<p><?php _e('Here&#8217;s the code to display it:') ?></p>
-<p><code><?php echo $piece_of_code; ?></code>
-</p>
-<p><strong><?php _e('Image Details') ?></strong>: <br />
-<?php _e('Name:'); ?>
-<?php echo $img1_name; ?>
-<br />
-<?php _e('Size:') ?>
-<?php echo round($img1_size / 1024, 2); ?> <?php _e('<abbr title="Kilobyte">KB</abbr>') ?><br />
-<?php _e('Type:') ?>
-<?php echo $img1_type; ?>
-</p>
-</div>
-<p><a href="upload.php"><?php _e('Upload another') ?></a></p>
-<?php
-break;
-}
-include('admin-footer.php');
-?>
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/user-edit.php 2.0.4/wp-admin/user-edit.php
--- 1.5.2/wp-admin/user-edit.php	2005-03-29 08:48:49.000000000 -0600
+++ 2.0.4/wp-admin/user-edit.php	2006-06-27 18:10:02.000000000 -0500
@@ -22,188 +22,183 @@
 }
 
 switch ($action) {
-case 'update':
-
-get_currentuserinfo();
-$edituser = get_userdata($user_id);
-if ($edituser->user_level >= $user_level) die( __('You do not have permission to edit this user.') );
-
-/* checking the nickname has been typed */
-if (empty($_POST["new_nickname"])) {
-	die (__("<strong>ERROR</strong>: please enter your nickname (can be the same as your username)"));
-	return false;
-}
-
-$new_user_login  = wp_specialchars($_POST['new_user_login']);
-$pass1 = $_POST['pass1'];
-$pass2 = $_POST['pass2'];
-do_action('check_passwords', array($new_user_login, &$pass1, &$pass2));
-
-if ( '' == $pass1 ) {
-	if ( '' != $pass2 )
-		die (__("<strong>ERROR</strong>: you typed your new password only once. Go back to type it twice."));
-	$updatepassword = '';
-} else {
-	if ( '' == $pass2)
-		die (__("<strong>ERROR</strong>: you typed your new password only once. Go back to type it twice."));
-	if ( $pass1 != $pass2 )
-		die (__("<strong>ERROR</strong>: you typed two different passwords. Go back to correct that."));
-	$new_pass = $pass1;
-	$updatepassword = "user_pass=MD5('$new_pass'), ";
-}
-
-$new_firstname   = wp_specialchars($_POST['new_firstname']);
-$new_lastname    = wp_specialchars($_POST['new_lastname']);
-$new_nickname    = $_POST['new_nickname'];
-$new_nicename    = sanitize_title($new_nickname, $user_id);
-$new_icq         = wp_specialchars($_POST['new_icq']);
-$new_aim         = wp_specialchars($_POST['new_aim']);
-$new_msn         = wp_specialchars($_POST['new_msn']);
-$new_yim         = wp_specialchars($_POST['new_yim']);
-$new_email       = wp_specialchars($_POST['new_email']);
-$new_url         = wp_specialchars($_POST['new_url']);
-$new_url         = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $new_url) ? $new_url : 'http://' . $new_url; 
-$new_idmode      = wp_specialchars($_POST['new_idmode']);
-$new_description = $_POST['new_description'];
+case 'switchposts':
 
-$result = $wpdb->query("UPDATE $wpdb->users SET user_login = '$new_user_login', user_firstname = '$new_firstname', $updatepassword user_lastname='$new_lastname', user_nickname='$new_nickname', user_icq='$new_icq', user_email='$new_email', user_url='$new_url', user_aim='$new_aim', user_msn='$new_msn', user_yim='$new_yim', user_idmode='$new_idmode', user_description = '$new_description', user_nicename = '$new_nicename' WHERE ID = $user_id");
+check_admin_referer();
 
-header("Location: user-edit.php?user_id=$user_id&updated=true");
+/* TODO: Switch all posts from one user to another user */
 
 break;
 
-case 'switchposts':
+case 'update':
 
-check_admin_referer();
+check_admin_referer('update-user_' . $user_id);
 
-/* TODO: Switch all posts from one user to another user */
+$errors = array();
 
-break;
+if (!current_user_can('edit_users'))
+	$errors['head'] = __('You do not have permission to edit this user.');
+else
+	$errors = edit_user($user_id);
+
+if(count($errors) == 0) {
+	wp_redirect("user-edit.php?user_id=$user_id&updated=true");
+	exit;
+}
 
 default:
 include ('admin-header.php');
 
-$edituser = get_userdata($user_id);
+$profileuser = new WP_User($user_id);
 
-if ($edituser->user_level >= $user_level) die( __('You do not have permission to edit this user.') );
+if (!current_user_can('edit_users')) $errors['head'] = __('You do not have permission to edit this user.');
 ?>
 
 <?php if ( isset($_GET['updated']) ) : ?>
-<div class="updated">
+<div id="message" class="updated fade">
 	<p><strong><?php _e('User updated.') ?></strong></p>
 </div>
 <?php endif; ?>
+<?php if ( count($errors) != 0 ) : ?>
+<div class="error">
+	<ul>
+	<?php
+	foreach($errors as $error) echo "<li>$error</li>";
+	?>
+	</ul>
+</div>
+<?php endif; ?>
 
 <div class="wrap">
 <h2><?php _e('Edit User'); ?></h2>
-<form name="edituser" id="edituser" action="user-edit.php" method="post">
-<table width="99%"  border="0" cellspacing="2" cellpadding="3">
-	<tr>
-		<th width="33%" scope="row"><?php _e('Username:') ?></th>
-		<td width="73%"><input type="text" name="new_user_login" id="new_user_login" value="<?php echo $edituser->user_login; ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Level:') ?></th>
-		<td><?php echo $edituser->user_level; ?></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Posts:') ?></th>
-		<td><?php echo get_usernumposts($edituser->ID); ?></td>
-	</tr>
-<?php if ( '0000-00-00 00:00:00' != $edituser->user_registered ) { ?>
-	<tr>
-		<th scope="row"><?php _e('Registered on:') ?></th>
-		<td><?php echo substr($edituser->user_registered, 0, 11); ?></td>
-	</tr>
-<?php } ?>
-	<tr>
-		<th scope="row"><?php _e('First name:') ?></th>
-		<td><input type="text" name="new_firstname" id="new_firstname" value="<?php echo $edituser->user_firstname ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Last name:') ?></th>
-		<td><input type="text" name="new_lastname" id="new_lastname2" value="<?php echo $edituser->user_lastname ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Profile:') ?></th>
-		<td><textarea name="new_description" rows="5" id="new_description" style="width: 99%; "><?php echo $edituser->user_description ?></textarea></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Nickname:') ?></th>
-		<td><input type="text" name="new_nickname" id="new_nickname" value="<?php echo $edituser->user_nickname ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('E-mail:') ?></th>
-		<td><input type="text" name="new_email" id="new_email" value="<?php echo $edituser->user_email ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Website:') ?></th>
-		<td><input type="text" name="new_url" id="new_url" value="<?php echo $edituser->user_url ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('ICQ:') ?></th>
-		<td><input type="text" name="new_icq" id="new_icq" value="<?php if ($edituser->user_icq > 0) { echo $edituser->user_icq; } ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('AIM:') ?></th>
-		<td><input type="text" name="new_aim" id="new_aim" value="<?php echo $edituser->user_aim ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('MSN IM:') ?>
-		</th>
-		<td><input type="text" name="new_msn" id="new_msn" value="<?php echo $edituser->user_msn ?>" /></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Yahoo IM:') ?>
-		</th>
-		<td><input type="text" name="new_yim" id="new_yim" value="<?php echo $edituser->user_yim ?>" />
-		</td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e('Identity on blog:') ?>
-		</th>
-		<td><select name="new_idmode">
-				<option value="nickname"<?php
-	if ($edituser->user_idmode == 'nickname')
-	echo ' selected="selected"'; ?>><?php echo $edituser->user_nickname ?></option>
-				<option value="login"<?php
-	if ($edituser->user_idmode=="login")
-	echo ' selected="selected"'; ?>><?php echo $edituser->user_login ?></option>
-				<option value="firstname"<?php
-	if ($edituser->user_idmode=="firstname")
-	echo ' selected="selected"'; ?>><?php echo $edituser->user_firstname ?></option>
-				<option value="lastname"<?php
-	if ($edituser->user_idmode=="lastname")
-	echo ' selected="selected"'; ?>><?php echo $edituser->user_lastname ?></option>
-				<option value="namefl"<?php
-	if ($edituser->user_idmode=="namefl")
-	echo ' selected="selected"'; ?>><?php echo $edituser->user_firstname." ".$edituser->user_lastname ?></option>
-				<option value="namelf"<?php
-	if ($edituser->user_idmode=="namelf")
-	echo ' selected="selected"'; ?>><?php echo $edituser->user_lastname." ".$edituser->user_firstname ?></option>
-			</select>
-		</td>
-	</tr>
+
+<form name="profile" id="your-profile" action="user-edit.php" method="post">
+<?php wp_nonce_field('update-user_' . $user_id) ?>
+<p>
+<input type="hidden" name="from" value="profile" />
+<input type="hidden" name="checkuser_id" value="<?php echo $user_ID ?>" />
+</p>
+
+<fieldset>
+<legend><?php _e('Name'); ?></legend>
+<p><label><?php _e('Username: (no editing)'); ?><br />
+<input type="text" name="user_login" value="<?php echo $profileuser->user_login; ?>" disabled="disabled" />
+</label></p>
+
+<p><label><?php _e('Role:') ?><br />
+<?php
+// print_r($profileuser);
+echo '<select name="role">';
+foreach($wp_roles->role_names as $role => $name) {
+	$selected = ($profileuser->has_cap($role)) ? ' selected="selected"' : '';
+	echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
+}
+echo '</select>';
+?></label></p>
+
+<p><label><?php _e('First name:') ?><br />
+<input type="text" name="first_name" value="<?php echo $profileuser->first_name ?>" /></label></p>
+
+<p><label><?php _e('Last name:') ?><br />
+<input type="text" name="last_name"  value="<?php echo $profileuser->last_name ?>" /></label></p>
+
+<p><label><?php _e('Nickname:') ?><br />
+<input type="text" name="nickname" value="<?php echo $profileuser->nickname ?>" /></label></p>
+
+</p><label><?php _e('Display name publicly as:') ?> <br />
+<select name="display_name">
+<option value="<?php echo $profileuser->display_name; ?>"><?php echo $profileuser->display_name; ?></option>
+<option value="<?php echo $profileuser->nickname ?>"><?php echo $profileuser->nickname ?></option>
+<option value="<?php echo $profileuser->user_login ?>"><?php echo $profileuser->user_login ?></option>
+<?php if ( !empty( $profileuser->first_name ) ) : ?>
+<option value="<?php echo $profileuser->first_name ?>"><?php echo $profileuser->first_name ?></option>
+<?php endif; ?>
+<?php if ( !empty( $profileuser->last_name ) ) : ?>
+<option value="<?php echo $profileuser->last_name ?>"><?php echo $profileuser->last_name ?></option>
+<?php endif; ?>
+<?php if ( !empty( $profileuser->first_name ) && !empty( $profileuser->last_name ) ) : ?>
+<option value="<?php echo $profileuser->first_name." ".$profileuser->last_name ?>"><?php echo $profileuser->first_name." ".$profileuser->last_name ?></option>
+<option value="<?php echo $profileuser->last_name." ".$profileuser->first_name ?>"><?php echo $profileuser->last_name." ".$profileuser->first_name ?></option>
+<?php endif; ?>
+</select></label></p>
+</fieldset>
+
+<fieldset>
+<legend><?php _e('Contact Info'); ?></legend>
+
+<p><label><?php _e('E-mail: (required)') ?><br />
+<input type="text" name="email" value="<?php echo $profileuser->user_email ?>" /></label></p>
+
+<p><label><?php _e('Website:') ?><br />
+<input type="text" name="url" value="<?php echo $profileuser->user_url ?>" />
+</label></p>
+
+<p><label><?php _e('AIM:') ?><br />
+<input type="text" name="aim" value="<?php echo $profileuser->aim ?>" />
+</label></p>
+
+<p><label><?php _e('Yahoo IM:') ?><br />
+<input type="text" name="yim" value="<?php echo $profileuser->yim ?>" />
+</label></p>
+
+<p><label><?php _e('Jabber / Google Talk:') ?>
+<input type="text" name="jabber" value="<?php echo $profileuser->jabber ?>" /></label>
+</p>
+</fieldset>
+<br clear="all" />
+<fieldset>
+<legend><?php _e('About the user'); ?></legend>
+<p class="desc"><?php _e('Share a little biographical information to fill out your profile. This may be shown publicly.'); ?></p>
+<p><textarea name="description" rows="5" cols="30"><?php echo $profileuser->description ?></textarea></p>
+</fieldset>
+
 <?php
 $show_password_fields = apply_filters('show_password_fields', true);
 if ( $show_password_fields ) :
 ?>
-	<tr>
-		<th scope="row"><?php _e('New <strong>Password</strong> (Leave blank to stay the same.)') ?></th>
-		<td><input type="password" name="pass1" size="16" value="" />
-			<br />
-			<input type="password" name="pass2" size="16" value="" /></td>
-	</tr>
+<fieldset>
+<legend><?php _e("Update User's Password"); ?></legend>
+<p class="desc"><?php _e("If you would like to change the user's password type a new one twice below. Otherwise leave this blank."); ?></p>
+<p><label><?php _e('New Password:'); ?><br />
+<input type="password" name="pass1" size="16" value="" />
+</label></p>
+<p><label><?php _e('Type it one more time:'); ?><br />
+<input type="password" name="pass2" size="16" value="" />
+</label></p>
+</fieldset>
 <?php endif; ?>
-</table>
-  <p class="submit">
+
+<?php do_action('edit_user_profile'); ?>
+
+<br clear="all" />
+  <table width="99%"  border="0" cellspacing="2" cellpadding="3" class="editform">
+    <?php
+    if(count($profileuser->caps) > count($profileuser->roles)):
+    ?>
+    <tr>
+      <th scope="row"><?php _e('Additional Capabilities:') ?></th>
+      <td><?php 
+			$output = '';
+			foreach($profileuser->caps as $cap => $value) {
+				if(!$wp_roles->is_role($cap)) {
+					if($output != '') $output .= ', ';
+					$output .= $value ? $cap : "Denied: {$cap}";
+				}
+			}
+			echo $output;
+			?></td>
+    </tr>
+    <?php
+    endif;
+    ?>
+  </table>
+<p class="submit">
 	<input type="hidden" name="action" value="update" />
 	<input type="hidden" name="user_id" id="user_id" value="<?php echo $user_id; ?>" />
     <input type="submit" value="<?php _e('Update User &raquo;') ?>" name="submit" />
-  </p>
+ </p>
 </form>
 </div>
-
 <?php
 break;
 }
diff -ruN 1.5.2/wp-admin/users.php 2.0.4/wp-admin/users.php
--- 1.5.2/wp-admin/users.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/wp-admin/users.php	2006-06-27 18:10:02.000000000 -0500
@@ -1,191 +1,233 @@
 <?php
 require_once('admin.php');
+require_once( ABSPATH . WPINC . '/registration-functions.php');
 
 $title = __('Users');
 $parent_file = 'profile.php';
 	
-$wpvarstoreset = array('action');
-for ($i=0; $i<count($wpvarstoreset); $i += 1) {
-	$wpvar = $wpvarstoreset[$i];
-	if (!isset($$wpvar)) {
-		if (empty($_POST["$wpvar"])) {
-			if (empty($_GET["$wpvar"])) {
-				$$wpvar = '';
-			} else {
-				$$wpvar = $_GET["$wpvar"];
-			}
-		} else {
-			$$wpvar = $_POST["$wpvar"];
-		}
-	}
-}
+$action = $_REQUEST['action'];
+$update = '';
 
 switch ($action) {
-case 'adduser':
-	check_admin_referer();
 
-	$user_login     = wp_specialchars(trim($_POST['user_login']));
-	$pass1          = $_POST['pass1'];
-	$pass2          = $_POST['pass2'];
-	$user_email     = wp_specialchars(trim($_POST['email']));
-	$user_firstname = wp_specialchars(trim($_POST['firstname']));
-	$user_lastname  = wp_specialchars(trim($_POST['lastname']));
-	$user_uri       = wp_specialchars(trim($_POST['uri']));
-		
-	/* checking that username has been typed */
-	if ($user_login == '')
-		die (__('<strong>ERROR</strong>: Please enter a username.'));
-
-	/* checking the password has been typed twice */
-	do_action('check_passwords', array($user_login, &$pass1, &$pass2));
-	if ($pass1 == '' || $pass2 == '')
-		die (__('<strong>ERROR</strong>: Please enter your password twice.'));
-
-	/* checking the password has been typed twice the same */
-	if ($pass1 != $pass2)
-		die (__('<strong>ERROR</strong>: Please type the same password in the two password fields.'));
-
-	$user_nickname = $user_login;
-
-	/* checking that the username isn't already used by another user */
-	$loginthere = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_login = '$user_login'");
-    if ($loginthere)
-		die (__('<strong>ERROR</strong>: This username is already registered, please choose another one.'));
-
-	/* checking e-mail address */
-	if (empty($_POST["email"])) {
-		die (__("<strong>ERROR</strong>: please type an e-mail address"));
-		return false;
-	} else if (!is_email($_POST["email"])) {
-		die (__("<strong>ERROR</strong>: the email address isn't correct"));
-		return false;
-	}
+case 'promote':
+	check_admin_referer('bulk-users');
 
-	$user_ID = $wpdb->get_var("SELECT ID FROM $wpdb->users ORDER BY ID DESC LIMIT 1") + 1;
+	if (empty($_POST['users'])) {
+		wp_redirect('users.php');
+	}
 
-	$user_nicename = sanitize_title($user_nickname, $user_ID);
-	$user_uri = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $user_uri) ? $user_uri : 'http://' . $user_uri;
-	$now = gmdate('Y-m-d H:i:s');
-	$new_users_can_blog = get_settings('new_users_can_blog');
-
-	$result = $wpdb->query("INSERT INTO $wpdb->users 
-		(user_login, user_pass, user_nickname, user_email, user_ip, user_domain, user_browser, user_registered, user_level, user_idmode, user_firstname, user_lastname, user_nicename, user_url)
-	VALUES 
-		('$user_login', MD5('$pass1'), '$user_nickname', '$user_email', '$user_ip', '$user_domain', '$user_browser', '$now', '$new_users_can_blog', 'nickname', '$user_firstname', '$user_lastname', '$user_nicename', '$user_uri')");
-
-	do_action('user_register', $wpdb->insert_id);
-
-	if ($result == false)
-		die (__('<strong>ERROR</strong>: Couldn&#8217;t register you!'));
-
-	$stars = '';
-	for ($i = 0; $i < strlen($pass1); $i = $i + 1)
-		$stars .= '*';
-
-	$user_login = stripslashes($user_login);
-	$message  = sprintf(__('New user registration on your blog %s:'), get_settings('blogname')) . "\r\n\r\n";
-	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
-	$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
+	if ( !current_user_can('edit_users') )
+		die(__('You can&#8217;t edit users.'));
 
-	@wp_mail(get_settings('admin_email'), sprintf(__('[%s] New User Registration'), get_settings('blogname')), $message);
-	header('Location: users.php');
-break;
+ 	$userids = $_POST['users'];
+	$update = 'promote';
+ 	foreach($userids as $id) {
+		// The new role of the current user must also have edit_users caps
+		if($id == $current_user->id && !$wp_roles->role_objects[$_POST['new_role']]->has_cap('edit_users')) {
+			$update = 'err_admin_role';
+			continue;
+		}
 
-case 'promote':
-	check_admin_referer();
+ 		$user = new WP_User($id);
+ 		$user->set_role($_POST['new_role']);
+ 	}
+		
+	wp_redirect('users.php?update=' . $update);
 
-	if (empty($_GET['prom'])) {
-		header('Location: users.php');
-	}
+break;
 
-	$id = (int) $_GET['id'];
-	$prom = $_GET['prom'];
+case 'dodelete':
 
-	$user_data = get_userdata($id);
-	$usertopromote_level = $user_data->user_level;
+	check_admin_referer('delete-users');
 
-	if ($user_level <= $usertopromote_level) {
-		die(__('Can&#8217;t change the level of a user whose level is higher than yours.'));
+	if ( empty($_POST['users']) ) {
+		wp_redirect('users.php');
 	}
 
-	if ('up' == $prom) {
-		$new_level = $usertopromote_level + 1;
-		$wpdb->query("UPDATE $wpdb->users SET user_level=$new_level WHERE ID = $id AND $new_level < $user_level");
-	} elseif ('down' == $prom) {
-		$new_level = $usertopromote_level - 1;
-		$wpdb->query("UPDATE $wpdb->users SET user_level=$new_level WHERE ID = $id AND $new_level < $user_level");
+	if ( !current_user_can('edit_users') )
+		die(__('You can&#8217;t delete users.'));
+
+	$userids = $_POST['users'];
+	
+	$update = 'del';
+ 	foreach ($userids as $id) {
+		if($id == $current_user->id) {
+			$update = 'err_admin_del';
+			continue;
+		}
+ 		switch($_POST['delete_option']) {
+		case 'delete':
+			wp_delete_user($id);
+			break;
+		case 'reassign':
+			wp_delete_user($id, $_POST['reassign_user']);
+			break;
+		}
 	}
 
-	header('Location: users.php');
+	wp_redirect('users.php?update=' . $update);
 
 break;
 
 case 'delete':
 
-	check_admin_referer();
-
-	$id = (int) $_GET['id'];
-
-	if (!$id) {
-		header('Location: users.php');
-	}
+	check_admin_referer('bulk-users');
 
-	$user_data = get_userdata($id);
-	$usertodelete_level = $user_data->user_level;
+	if ( empty($_POST['users']) )
+		wp_redirect('users.php');
 
-	if ($user_level <= $usertodelete_level)
-		die(__('Can&#8217;t delete a user whose level is higher than yours.'));
+	if ( !current_user_can('edit_users') )
+		$error['edit_users'] = __('You can&#8217;t delete users.');
 
-	$post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_author = $id");
-	if ($post_ids) {
-		$post_ids = implode(',', $post_ids);
-		
-		// Delete comments, *backs
-		$wpdb->query("DELETE FROM $wpdb->comments WHERE comment_post_ID IN ($post_ids)");
-		// Clean cats
-		$wpdb->query("DELETE FROM $wpdb->post2cat WHERE post_id IN ($post_ids)");
-		// Clean post_meta
-		$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id IN ($post_ids)");
-		// Clean links
-		$wpdb->query("DELETE FROM $wpdb->links WHERE link_owner = $id");
-		// Delete posts
-		$wpdb->query("DELETE FROM $wpdb->posts WHERE post_author = $id");
-	}
+	$userids = $_POST['users'];
 
-	// FINALLY, delete user
-	$wpdb->query("DELETE FROM $wpdb->users WHERE ID = $id");
-	header('Location: users.php?deleted=true');
+	include ('admin-header.php');
+?>
+<form action="" method="post" name="updateusers" id="updateusers">
+<?php wp_nonce_field('delete-users') ?>
+<div class="wrap">
+<h2><?php _e('Delete Users'); ?></h2>
+<p><?php _e('You have specified these users for deletion:'); ?></p>
+<ul>
+<?php
+	$go_delete = false;
+ 	foreach ($userids as $id) {
+ 		$user = new WP_User($id);
+		if ($id == $current_user->id) {
+			echo "<li>" . sprintf(__('ID #%1s: %2s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
+		} else {
+			echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "</li>\n";
+			$go_delete = true;
+		}
+ 	}
+ 	$all_logins = $wpdb->get_results("SELECT ID, user_login FROM $wpdb->users ORDER BY user_login");
+ 	$user_dropdown = '<select name="reassign_user">';
+ 	foreach ($all_logins as $login) {
+		if ( $login->ID == $current_user->id || !in_array($login->ID, $userids) ) {
+ 			$user_dropdown .= "<option value=\"{$login->ID}\">{$login->user_login}</option>";
+ 		}
+ 	}
+ 	$user_dropdown .= '</select>';
+ 	?>
+ 	</ul>
+<?php if($go_delete) : ?>
+ 	<p><?php _e('What should be done with posts and links owned by this user?'); ?></p>
+	<ul style="list-style:none;">
+		<li><label><input type="radio" id="delete_option0" name="delete_option" value="delete" checked="checked" />
+		<?php _e('Delete all posts and links.'); ?></label></li>
+		<li><input type="radio" id="delete_option1" name="delete_option" value="reassign" />
+		<?php echo '<label for="delete_option1">'.__('Attribute all posts and links to:')."</label> $user_dropdown"; ?></li>
+	</ul>
+	<input type="hidden" name="action" value="dodelete" />
+	<p class="submit"><input type="submit" name="submit" value="<?php _e('Confirm Deletion'); ?>" /></p>
+<?php else : ?>
+	<p><?php _e('There are no valid users selected for deletion.'); ?></p>
+<?php endif; ?>
+</div>
+</form>
+<?php
 
 break;
 
+case 'adduser':
+	check_admin_referer('add-user');
+	
+	$errors = add_user();
+	
+	if(count($errors) == 0) {
+		wp_redirect('users.php?update=add');
+		die();
+	}
+
 default:
 	
 	include ('admin-header.php');
+	
+	$userids = $wpdb->get_col("SELECT ID FROM $wpdb->users;");
+	
+	foreach($userids as $userid) {
+		$tmp_user = new WP_User($userid);
+		$roles = $tmp_user->roles;
+		$role = array_shift($roles);
+		$roleclasses[$role][$tmp_user->user_login] = $tmp_user;
+	}	
+	
 	?>
 
-<?php if (isset($_GET['deleted'])) : ?>
-<div class="updated"><p><?php _e('User deleted.') ?></p></div>
-<?php endif; ?>
+	<?php 
+	if (isset($_GET['update'])) : 
+		switch($_GET['update']) {
+		case 'del':
+		?>
+			<div id="message" class="updated fade"><p><?php _e('User deleted.'); ?></p></div>
+		<?php
+			break;
+		case 'add':
+		?>
+			<div id="message" class="updated fade"><p><?php _e('New user created.'); ?></p></div>
+		<?php
+			break;
+		case 'promote':
+		?>
+			<div id="message" class="updated fade"><p><?php _e('Changed roles.'); ?></p></div>
+		<?php
+			break;
+		case 'err_admin_role':
+		?>
+			<div id="message" class="error"><p><?php _e("The current user's role must have user editing capabilities."); ?></p></div>
+			<div id="message" class="updated fade"><p><?php _e('Other user roles have been changed.'); ?></p></div>
+		<?php
+			break;
+		case 'err_admin_del':
+		?>
+			<div id="message" class="error"><p><?php _e("You can't delete the current user."); ?></p></div>
+			<div id="message" class="updated fade"><p><?php _e('Other users have been deleted.'); ?></p></div>
+		<?php
+			break;
+		}
+	endif; 
+	if ( isset($errors) ) : ?>
+	<div class="error">
+		<ul>
+		<?php
+		foreach($errors as $error) echo "<li>$error</li>";
+		?>
+		</ul>
+	</div>
+	<?php 
+	endif;
+	?>
+	
+<form action="" method="post" name="updateusers" id="updateusers">
+<?php wp_nonce_field('bulk-users') ?>
 <div class="wrap">
-  <h2><?php _e('Authors') ?></h2>
+	<h2><?php _e('User List by Role'); ?></h2>
   <table cellpadding="3" cellspacing="3" width="100%">
+	<?php
+	foreach($roleclasses as $role => $roleclass) {
+		ksort($roleclass);
+		?>
+
+	<tr>
+	<th colspan="8" align="left">
+  <h3><?php echo $wp_roles->role_names[$role]; ?></h3>
+  </th></tr>
+
 	<tr>
 	<th><?php _e('ID') ?></th>
-	<th><?php _e('Nickname') ?></th>
+	<th><?php _e('Username') ?></th>
 	<th><?php _e('Name') ?></th>
 	<th><?php _e('E-mail') ?></th>
 	<th><?php _e('Website') ?></th>
-	<th><?php _e('Level') ?></th>
 	<th><?php _e('Posts') ?></th>
 	<th>&nbsp;</th>
 	</tr>
 	<?php
-	$users = $wpdb->get_results("SELECT ID FROM $wpdb->users WHERE user_level > 0 ORDER BY ID");
 	$style = '';
-	foreach ($users as $user) {
-		$user_data = get_userdata($user->ID);
-		$email = $user_data->user_email;
-		$url = $user_data->user_url;
+	foreach ($roleclass as $user_object) {
+		$email = $user_object->user_email;
+		$url = $user_object->user_url;
 		$short_url = str_replace('http://', '', $url);
 		$short_url = str_replace('www.', '', $short_url);
 		if ('/' == substr($short_url, -1))
@@ -193,118 +235,74 @@
 		if (strlen($short_url) > 35)
 		$short_url =  substr($short_url, 0, 32).'...';
 		$style = ('class="alternate"' == $style) ? '' : 'class="alternate"';
-		$numposts = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_author = $user->ID and post_status = 'publish'");
-		if (0 < $numposts) $numposts = "<a href='edit.php?author=$user_data->ID' title='" . __('View posts') . "'>$numposts</a>";
+		$numposts = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_author = '$user_object->ID' and post_status = 'publish'");
+		if (0 < $numposts) $numposts = "<a href='edit.php?author=$user_object->ID' title='" . __('View posts') . "'>$numposts</a>";
 		echo "
 <tr $style>
-	<td align='center'>$user_data->ID</td>
-	<td><strong>$user_data->user_nickname</strong></td>
-	<td>$user_data->user_firstname $user_data->user_lastname</td>
+	<td><input type='checkbox' name='users[]' id='user_{$user_object->ID}' value='{$user_object->ID}' /> <label for='user_{$user_object->ID}'>{$user_object->ID}</label></td>
+	<td><label for='user_{$user_object->ID}'><strong>$user_object->user_login</strong></label></td>
+	<td><label for='user_{$user_object->ID}'>$user_object->first_name $user_object->last_name</label></td>
 	<td><a href='mailto:$email' title='" . sprintf(__('e-mail: %s'), $email) . "'>$email</a></td>
-	<td><a href='$url' title='website: $url'>$short_url</a></td>
-	<td align='center'>";
-	if (($user_level >= 2) and ($user_level > $user_data->user_level) and ($user_data->user_level > 0))
-		echo " <a href=\"users.php?action=promote&amp;id=".$user_data->ID."&amp;prom=down\">-</a> ";
-	echo $user_data->user_level;
-	if (($user_level >= 2) and ($user_level > ($user_data->user_level + 1)))
-		echo " <a href=\"users.php?action=promote&amp;id=".$user_data->ID."&amp;prom=up\">+</a> ";
-	echo "</td><td align='right'>$numposts</td>";
+	<td><a href='$url' title='website: $url'>$short_url</a></td>";
+	echo "<td align='right'>$numposts</td>";
 	echo '<td>';
-	if (($user_level >= 2) and ($user_level > $user_data->user_level))
-		echo "<a href='user-edit.php?user_id=$user_data->ID' class='edit'>".__('Edit')."</a>";
+	if (current_user_can('edit_users'))
+		echo "<a href='user-edit.php?user_id=$user_object->ID' class='edit'>".__('Edit')."</a>";
 	echo '</td>';
 	echo '</tr>';
 	}
 	
 	?>
 	
-  </table>
-</div>
 
 <?php
-$users = $wpdb->get_results("SELECT * FROM $wpdb->users WHERE user_level = 0 ORDER BY ID");
-if ($users) {
+	}
 ?>
-<div class="wrap">
-	<h2><?php _e('Registered Users') ?></h2>
-	<table cellpadding="3" cellspacing="3" width="100%">
-	<tr>
-		<th><?php _e('ID') ?></th>
-		<th><?php _e('Nickname') ?></th>
-		<th><?php _e('Name') ?></th>
-		<th><?php _e('E-mail') ?></th>
-		<th><?php _e('Website') ?></th>
-		<th></th>
-		<th></th>
-		<th></th>
-	</tr>
-<?php
-$style = '';
-foreach ($users as $user) {
-	$user_data = get_userdata($user->ID);
-	$email = $user_data->user_email;
-	$url = $user_data->user_url;
-	$short_url = str_replace('http://', '', $url);
-	$short_url = str_replace('www.', '', $short_url);
-	if ('/' == substr($short_url, -1))
-		$short_url = substr($short_url, 0, -1);
-	if (strlen($short_url) > 35)
-	$short_url =  substr($short_url, 0, 32).'...';
-	$style = ('class="alternate"' == $style) ? '' : 'class="alternate"';
-echo "\n<tr $style>
-<td align='center'>$user_data->ID</td>
-<td><strong>$user_data->user_nickname</strong></td>
-<td>$user_data->user_firstname $user_data->user_lastname</td>
-<td><a href='mailto:$email' title='" . sprintf(__('e-mail: %s'), $email) . "'>$email</a></td>
-<td><a href='$url' title='website: $url'>$short_url</a></td>
-<td align='center'>";
-
-	if ($user_level >= 6)
-		echo "<a href='users.php?action=promote&amp;id=$user_data->ID&amp;prom=up' class='edit'>". __('Promote') . '</a>';	
-	echo "</td>\n";
-	echo '<td>';
-	if (($user_level >= 6) and ($user_level > $user_data->user_level))
-		echo "<a href='user-edit.php?user_id=$user_data->ID' class='edit'>".__('Edit')."</a>";
-	echo '</td><td>';
-	if ($user_level >= 6)
-		echo "<a href='users.php?action=delete&amp;id=$user_data->ID' class='delete' onclick='return confirm(\"" . __('You are about to delete this user \n  OK to delete, Cancel to stop.') . "\")'>" . __('Delete'). '</a>';
-	echo '</td></tr>';
+  </table>
 
-}
 
-?>
-	
-	</table>
-	  <p><?php _e('Deleting a user also deletes all posts made by that user.') ?></p>
+	<h2><?php _e('Update Users'); ?></h2>
+<?php
+$role_select = '<select name="new_role">';
+foreach($wp_roles->role_names as $role => $name) {
+	$role_select .= "<option value=\"{$role}\">{$name}</option>";
+}
+$role_select .= '</select>';
+?>  
+  <ul style="list-style:none;">
+  	<li><input type="radio" name="action" id="action0" value="delete" /> <label for="action0"><?php _e('Delete checked users.'); ?></label></li>
+  	<li><input type="radio" name="action" id="action1" value="promote" /> <?php echo '<label for="action1">'.__('Set the Role of checked users to:')."</label> $role_select"; ?></li>
+  </ul>
+	<p class="submit"><input type="submit" value="<?php _e('Update &raquo;'); ?>" /></p>
 </div>
+</form>
 
-	<?php 
-	} ?>
 <div class="wrap">
 <h2><?php _e('Add New User') ?></h2>
-<?php printf(__('<p>Users can <a href="%s/wp-register.php">register themselves</a> or you can manually create users here.</p>'), get_settings('siteurl')); ?>
+<?php echo '<p>'.sprintf(__('Users can <a href="%1$s">register themselves</a> or you can manually create users here.'), get_settings('siteurl').'/wp-register.php').'</p>'; ?>
 <form action="" method="post" name="adduser" id="adduser">
+  <?php wp_nonce_field('add-user') ?>
   <table class="editform" width="100%" cellspacing="2" cellpadding="5">
     <tr>
       <th scope="row" width="33%"><?php _e('Nickname') ?>
       <input name="action" type="hidden" id="action" value="adduser" /></th>
-      <td width="66%"><input name="user_login" type="text" id="user_login" /></td>
+      <td width="66%"><input name="user_login" type="text" id="user_login" value="<?php echo $new_user_login; ?>" /></td>
     </tr>
     <tr>
       <th scope="row"><?php _e('First Name') ?> </th>
-      <td><input name="firstname" type="text" id="firstname" /></td>
+      <td><input name="first_name" type="text" id="first_name" value="<?php echo $new_user_firstname; ?>" /></td>
     </tr>
     <tr>
       <th scope="row"><?php _e('Last Name') ?> </th>
-      <td><input name="lastname" type="text" id="lastname" /></td>
+      <td><input name="last_name" type="text" id="last_name" value="<?php echo $new_user_lastname; ?>" /></td>
     </tr>
     <tr>
       <th scope="row"><?php _e('E-mail') ?></th>
-      <td><input name="email" type="text" id="email" /></td>
+      <td><input name="email" type="text" id="email" value="<?php echo $new_user_email; ?>" /></td>
     </tr>
     <tr>
       <th scope="row"><?php _e('Website') ?></th>
-      <td><input name="uri" type="text" id="uri" /></td>
+      <td><input name="url" type="text" id="url" value="<?php echo $new_user_uri; ?>" /></td>
     </tr>
 <?php
 $show_password_fields = apply_filters('show_password_fields', true);
diff -ruN 1.5.2/wp-admin/wp-admin.css 2.0.4/wp-admin/wp-admin.css
--- 1.5.2/wp-admin/wp-admin.css	2005-04-13 18:41:13.000000000 -0500
+++ 2.0.4/wp-admin/wp-admin.css	2006-07-06 01:35:28.000000000 -0500
@@ -2,6 +2,13 @@
 	height: 100%; /* kill peekaboo bug in IE */
 }
 
+/* This is the Holly Hack \*/
+* html .wrap { height: 1% }
+/* For Win IE's eyes only */
+
+body {
+	border: none;
+}
 a {
 	border-bottom: 1px solid #69c;
 	color: #00019b;
@@ -50,36 +57,34 @@
 }
 
 a:hover {
-	border-bottom: 1px solid #3a75ae;
+/*	border-bottom: 1px solid #3a75ae;*/
 	color: #069;
 }
 
 body	{
-	background: #f2f2f2;
+	background: #f9fcfe;
 	color: #000;
 	margin: 0;
 	padding: 0;
 }
 
 body, td {
-	font: 10pt Georgia, "Times New Roman", Times, serif;
+	font: 13px "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana;
 }
 
 fieldset {
-	border: 1px solid #ddd;
-	-moz-border-radius: 5px;
+	border: none;
 	padding: 3px;
 }
 
 fieldset label.selectit {
-	background: #f0f0f0;
 	display: block;
 	font-size: 11px;
 	padding: 0 2px;
 }
 
 fieldset label.selectit:hover {
-	background: #dadada;
+	background: #e9e9e9;
 }
 
 fieldset legend {
@@ -105,12 +110,25 @@
 }
 
 h2 {
-	border-bottom: 2px solid #69c;
+	border-bottom: .5em solid #f0f8ff;
 	color: #333;
-	font: normal 22px/18px serif;
+	font: normal 30px/5px serif;
 	margin: 5px 10px;
 }
 
+h2 small.quickjump {
+	display: block;
+	text-align: right;
+}
+
+h2 small.quickjump a {
+	text-decoration: none;
+	border-bottom: 0;
+	font-size: 15px;
+	background: #f0f8ff;
+	padding: 5px 10px;
+}
+
 img, #footer a {
 	border: 0;
 }
@@ -136,11 +154,37 @@
 	background: #f4f4f4;
 	border: 1px solid #b2b2b2;
 	color: #000;
-	font-family: Georgia, "Times New Roman", Times, serif;
+	font:  13px Verdana, Arial, Helvetica, sans-serif;
 	margin: 1px;
 	padding: 3px;
 }
 
+#uploading {
+	border-style: none;
+	padding: 0px;
+	margin-bottom: 16px;
+	height: 15em;
+	width: 100%;
+/*	overflow-y: hidden;*/
+}
+
+form#upload th {
+	text-align: right;
+}
+
+form#upload #post_content, form#upload #post_title {
+	width: 250px;
+}
+
+form#upload #post_content {
+	height: 50px;
+}
+
+.attpreview {
+	width: 1px; /* hug */
+	text-align: center;
+}
+
 .alignleft {
 	float: left
 }
@@ -150,13 +194,41 @@
 }
 
 .alternate {
-	background: #eee;
+	background: #f1f1f1;
 }
 
 .anchors {
 	margin: 10px 20px 10px 20px;
 }
 
+.available-theme {
+	width: 30%;
+	margin: 0 1em;
+	float: left;
+	text-align: center;
+	height: 28em;
+	overflow: hidden;
+}
+
+.available-theme a.screenshot {
+	width: 250px;
+	height: 200px;
+	display: block;
+	margin: auto;
+	background: #f1f1f1;
+	border: 1px solid #ccc;
+	margin-bottom: 10px;
+	overflow: hidden;
+}
+
+.available-theme a.screenshot:hover {
+/*	border: 1px solid #666;*/
+}
+
+.available-theme img {
+	width: 100%;
+}
+
 .checkbox {
 	background: #fff;
 	border: none;
@@ -173,8 +245,9 @@
 	padding: .3em 1em;
 }
 
-.ed_button {
-	padding: 1px;
+.clear {
+	clear: both;
+	height: 2px;
 }
 
 .hidden {
@@ -205,7 +278,7 @@
 }
 
 .submit input, .submit input:focus, .button {
-	background: url(../wp-images/fade-butt.png);
+	background: url( images/fade-butt.png );
 	border: 3px double #999;
 	border-left-color: #ccc;
 	border-top-color: #ccc;
@@ -220,7 +293,20 @@
 	border-top-color: #999;
 }
 
-.submit, #quicktags, .editform th, #postcustomsubmit {
+.submit, .editform th, #postcustomsubmit {
+	text-align: right;
+}
+
+.optiontable {
+	width: 100%;
+}
+
+.optiontable td, .optiontable th {
+	padding: .5em;
+}
+
+.optiontable th {
+	width: 33%;
 	text-align: right;
 }
 
@@ -241,8 +327,15 @@
 }
 
 .updated {
-	background: #f0f8ff;
-	border: 1px solid #69c;
+	background: #CFEBF7 url(images/notice.gif) no-repeat 1em ;
+	border: 1px solid #2580B2;
+	margin: 1em 5% 10px;
+	padding: 0 1em 0 3em;
+}
+
+.error {
+	background: #FFEFF7;
+	border: 1px solid #c69;
 	margin: 1em 5% 10px;
 	padding: 0 1em 0 1em;
 }
@@ -256,24 +349,28 @@
 }
 
 .wrap h2 {
-	margin: 6px 0;
+	margin: .8em 0 .5em;
+	clear: both;
+}
+
+table .vers, table .name {
+	text-align: center;
 }
 
 #adminmenu {
-	background: #fff;
-	border-bottom: 2px solid #707070;
+	background: #6da6d1;
+	border-top: 3px solid #448abd;
 	margin: 0;
-	padding: .2em;
+	padding: .2em .2em .2em 2em;
 }
 
-#adminmenu .current, #adminmenu2 .current, #ed_strong {
+#adminmenu .current, #submenu .current {
 	font-weight: bold;
 }
 
 #adminmenu a {
-	border: 1px solid #fff;
-	color: #333;
-	font-size: 16px;
+	color: #000;
+	font-size: 14px;
 	font-weight: normal;
 	margin: 0;
 	padding: 3px 5px;
@@ -281,68 +378,87 @@
 }
 
 #adminmenu a:hover, .current {
-	background: #ccc;
-	border: 1px solid #9d9d9d;
-	color: #171717;
+	background: #ddeaf4;
+	color: #333;
 }
 
-#adminmenu li, #adminmenu2 li {
+#adminmenu li, #submenu li {
 	display: inline;
 	line-height: 200%;
 	list-style: none;
 	text-align: center;
 }
 
-#adminmenu2 {
-	background: #a3a3a3;
+#submenu {
+	background: #0d324f;
 	border-bottom: none;
 	margin: 0;
-	padding: 3px 2em 0;
+	padding: 3px 2em 0 3em;
 }
 
-#adminmenu2 .current {
-	background: #f2f2f2;
-	border-top: 1px solid #9a9a9a;
-	border-right: 2px solid #4f4f4f;
+#submenu .current {
+	background: #f9fcfe;
+	border-top: 1px solid #045290;
+	border-right: 2px solid #045290;
 	color: #000;
 }
 
-#adminmenu2 a {
+#submenu a {
 	border: none;
 	color: #fff;
 	font-size: 12px;
 	padding: .3em .4em .33em;
 }
 
-#adminmenu2 a:hover {
-	background: #f0f0f0;
+#submenu a:hover {
+	background: #ddeaf4;
 	color: #393939;
 }
 
-#adminmenu2 li {
+#submenu li {
 	line-height: 170%;
 }
 
-#categorydiv {
-	line-height: 130%;
-	margin-right: 15px;
-	position: absolute;
-	right: 5%;
-	width: 9em;
+
+#categorydiv input, #poststatusdiv input, #commentstatusdiv input, #pingstatusdiv input {
+	border: none;
 }
 
-#categorydiv div {
-	height: 27em;
-	overflow: auto;
+#titlediv, #guiddiv {
+	margin: 0 8px 0 0;
+	padding: 0px;
 }
 
-#categorydiv input, #poststatusdiv input, #commentstatusdiv input, #pingstatusdiv input {
-	border: none;
+#postdiv {
+	margin: 0 8px 0 0;
+	padding: 0px;
 }
 
-#content, #excerpt {
-	margin-left: 1%;
-	width: 97%;
+#postdivrich {
+	margin: 0px;
+	padding: 0px;
+}
+
+#content {
+	margin: 0 0 0 0;
+	width: 100%;
+}
+
+#titlediv input, #guiddiv input {
+	margin: 0px;
+	width: 100%;
+}
+
+#quicktags {
+	margin-left: -1px;
+}
+
+#currenttheme img {
+	float: left;
+	border: 1px solid #666;
+	margin-right: 1em;
+	margin-bottom: 1.5em;
+	width: 300px;
 }
 
 #deletepost:hover {
@@ -350,26 +466,59 @@
 	color: #fff;
 }
 
-#ed_del {
+#quicktags #ed_strong {
+	font-weight: bold;
+}
+
+#quicktags #ed_link {
+	color: blue;
+	text-decoration: underline;
+}
+
+#quicktags #ed_del {
 	text-decoration: line-through;
 }
 
-#ed_em {
+#quicktags #ed_em {
 	font-style: italic;
 }
 
-#excerpt {
-	height: 1.8em;
-	width: 98%;
+#quicktags #ed_code {
+	font-family: "Courier New", Courier, mono;
+}
+
+#title {
+	font-size: 1.5em;
+}
+
+#postexcerpt div, #attachmentlinks div {
+	margin-right: 8px;
+}
+
+#attachmentlinks textarea {
+	width: 100%;
+	height: 2.5em;
+	margin-bottom: 6px;
+}
+
+* html #postexcerpt .dbx-toggle-open, * html #postexcerpt .dbx-toggle-open {
+	padding-right: 8px;
+}
+
+#excerpt, .attachmentlinks {
+	margin: 0px;
+	height: 4em;
+	width: 100%;
 }
 
 #footer {
+	clear: both;
 	text-align: center;
 }
 
 #login {
 	background: #fff;
-	border: 2px solid #a2a2a2;
+	border: 1px solid #a2a2a2;
 	margin: 5em auto;
 	padding: 1.5em;
 	width: 25em;
@@ -386,13 +535,15 @@
 }
 
 #login h1 {
-	background: url(../wp-images/wp-small.png) no-repeat;
+	background: url(images/wordpress-logo.png) no-repeat top left;
 	margin-top: 0;
 }
 
 #login h1 a {
 	display: block;
 	text-indent: -1000px;
+	height: 66px;
+	border-bottom: none;
 }
 
 #login input {
@@ -411,25 +562,23 @@
 	text-align: center;
 }
 
-#metainfo, #postdiv, #postexcerpt {
-	clear: both;
+#login #log, #pwd {
+	font-size: 1.7em;
+	width: 80%;
 }
 
-#postcustom {
-	border: 1px solid #aaa;
-	padding: .5em;
-	width: 97%;
+#login #submit {
+	font-size: 1.7em;
 }
 
 #postcustom .updatemeta, #postcustom .deletemeta {
 	margin: auto;
-	width: 5em;
 }
 
 #postcustom table {
 	border: 1px solid #ccc;
-	margin: .5em;
-	width: 98%;
+	margin: 0px;
+	width: 100%;
 }
 
 #postcustom table input, #postcustom table textarea {
@@ -437,50 +586,28 @@
 }
 
 #poststuff {
-	margin-right: 11em;
-}
-
-#profile {
-	margin: 10px;
-}
-
-#profile .left {
-	border-right: 1px dashed #ccc;
-	float: left;
-	margin-right: 5px;
-	padding-right: 5px;
+	margin-right: 16em;
 }
 
-#profile label {
-	float: left;
-	padding-right: 3px;
-	text-align: right;
-	width: 85px;
-}
-
-#profile p {
-	margin: 0 0 4px 0;
-}
-
-#quicktags {
-	margin-right: 1%;
+#save {
+	width: 15em;
 }
 
-#save {
-	width: 14em;
+#template div {
+	margin-right: 190px;
 }
 
-#simple #titlediv {
-	height: 4em;
+* html #template div {
+	margin-right: 0px;
 }
 
-#template div {
-	margin-right: 190px;
+#template, #template div, #editcat, #addcat {
+	zoom: 1;
 }
 
 #template textarea {
 	font: small 'Courier New', Courier, monospace;
-	width: 99%;
+	width: 97%;
 }
 
 #templateside {
@@ -498,15 +625,26 @@
 	padding: 0;
 }
 
-#titlediv, #commentstatusdiv, #postpassworddiv, #namediv, #uridiv, #emaildiv, #pageparent {
-	float: left;
-	height: 6em;
-	margin-right: 5px;
+#user_info {
+	position: absolute;
+	right: 1em;
+	top: 0;
+	color: #fff;
+	font-size: .9em;
+}
+
+#user_info a {
+	color: #fff;
 }
 
 #wphead {
-	background: url(../wp-images/header-shadow.png) #f2f2f2 repeat-x bottom;
-	padding: 1px 5px 11px;
+	background: #14568a;
+	padding: .8em 19em .8em 2em;
+	color: #c3def1;
+}
+
+#wphead a {
+	color: #fff;
 }
 
 #wphead h1 {
@@ -514,6 +652,7 @@
 	font-weight: normal;
 	letter-spacing: -.05em;
 	margin: 0;
+	font-family: Georgia, "Times New Roman", Times, serif
 }
 
 #wphead h1 span {
@@ -530,13 +669,17 @@
 	margin-left: 1em;
 	margin-top: .5em;
 	padding: 1em;
-	width: 27%;
+	width: 40%;
 }
 
 #zeitgeist h2, fieldset legend a {
 	border-bottom: none;
 }
 
+#zeitgeist h2 {
+	margin-top: .4em;
+}
+
 #zeitgeist h3 {
 	border-bottom: 1px solid #ccc;
 	font-size: 16px;
@@ -557,10 +700,308 @@
 	padding: 0 0 0 .6em;
 }
 
+.active td {
+	background: #BEB;
+}
+.active .name {
+	background: #9C9;
+}
+.alternate.active td {
+	background: #ADA;
+}
+.alternate.active .name {
+	background: #8B8;
+}
+
+/* A handy div class for hiding controls.
+   Some browsers will disable them when you
+   set display:none; */
+.zerosize {
+	height: 0px;
+	width: 0px;
+	margin: 0px;
+	border: 0px;
+	padding: 0px;
+	overflow: hidden;
+	position: absolute;
+}
 
-/* emeyer additions */
+/* Box stuff */
+.dbx-clone {
+	position:absolute;
+	visibility:hidden;
+}
+.dbx-clone, .dbx-clone .dbx-handle-cursor {
+	cursor:move !important;
+}
+.dbx-dummy {
+	display:block;
+	width:0;
+	height:0;
+	overflow:hidden;
+}
+.dbx-group, .dbx-box, .dbx-handle {
+	position:relative;
+	display:block;
+}
+
+#grabit {
+	width: 188px;
+}
+
+* html #themeselect {
+	padding: 0px 3px;
+	height: 22px;
+}
 
-.active td {background: #BEB;}
-.active .name {background: #9C9;}
-.alternate.active td {background: #ADA;}
-.alternate.active .name {background: #8B8;}
+/****************************************************************
+  avoid padding, margins or borders on dbx-box, 
+  to reduce visual discrepancies between it and the clone.  
+  overall, dbx-box is best left as visually unstyled as possible 
+*****************************************************************/
+.dbx-box {
+	margin:0;
+	padding:0;
+	border:none;
+}
+
+/* Can change this */
+#moremeta fieldset, #advancedstuff fieldset {
+	margin-bottom: 1em;
+}
+#moremeta fieldset div {
+	margin: 2px 0 0 0px;
+	padding: 7px;
+}
+#moremeta {
+	line-height: 130%;
+	margin-right: 15px;
+	position: absolute;
+	right: 5%;
+	width: 14.5em;
+}
+#moremeta select {
+	width: 96%;
+}
+
+#slugdiv input, #passworddiv input, #authordiv select, #thumbdiv input, #parentdiv input {
+	margin-top: .5em;
+	width: 90%;
+}
+
+#moremeta h3, #advancedstuff h3 {
+	padding: 3px;
+	font-weight: normal;
+	font-size: 13px;
+}
+
+#advancedstuff div {
+	margin-top: .5em;
+}
+
+#categorydiv div div {
+	height: 12em;
+	overflow: auto;
+}
+
+#ajaxcat input {
+	border: 1px solid #ccc;
+}
+
+#your-profile fieldset {
+	border: 1px solid #ccc;
+	float: left;
+	width: 40%;
+	padding: .5em 2em;
+	margin: 1em; 
+}
+
+#your-profile fieldset input  {
+	width: 100%;
+	font-size: 20px;
+	padding: 2px;
+}
+
+#your-profile fieldset textarea {
+	width: 100%;
+	padding: 2px;
+}
+
+#your-profile legend {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 22px;
+}
+
+/* default box styles */
+
+/* toggle state of inner content area */
+.dbx-box-open .dbx-content {
+	display: block;
+}
+.dbx-box-closed .dbx-content {
+	display: none;
+}
+
+#moremeta .dbx-content {
+	background: url(images/box-butt.gif) no-repeat bottom right;
+	padding-bottom: 15px;
+	padding-right: 2px;
+}
+
+#moremeta fieldset.dbx-box-closed {
+	background: url(images/box-butt.gif) no-repeat bottom;
+	padding-bottom: 9px;
+}
+
+/* handles */
+
+.dbx-handle  {
+	background: #2685af;
+	padding: 6px 1em 2px;
+	font-size: 12px;
+	margin: 0;
+	color: #E3EFF5;
+}
+
+#moremeta .dbx-handle {
+	padding: 6px 1em 2px;
+	font-size: 12px;
+	background: #2685af url(images/box-head.gif) no-repeat right;
+}
+
+#moremeta .dbx-box {
+	background: url(images/box-bg.gif) repeat-y right;
+}
+
+#advancedstuff h3.dbx-handle {
+	margin-left: 7px;
+	margin-bottom: -7px;
+	padding: 6px 1em 0 3px;
+	background: #2685af url(images/box-head-right.gif) no-repeat top right;
+}
+
+#advancedstuff div.dbx-handle-wrapper {
+	margin: 0 0 0 -7px;
+	background: #fff url(images/box-head-left.gif) no-repeat top left;
+}
+
+#advancedstuff div.dbx-content {
+	margin-left: 8px;
+	background: url(images/box-bg-right.gif) repeat-y right;
+	padding: 10px 10px 15px 0px;
+}
+
+#postexcerpt div.dbx-content {
+	margin-right: 0;
+	padding-right: 17px;
+}
+
+#advancedstuff div.dbx-content-wrapper {
+	margin-left: -7px;
+	margin-right: 0;
+	background: url(images/box-bg-left.gif) repeat-y left;
+}
+
+#advancedstuff fieldset.dbx-box {
+	padding-bottom: 9px;
+	margin-left: 6px;
+	background: url(images/box-butt-right.gif) no-repeat bottom right;
+}
+
+#advancedstuff div.dbx-box-wrapper {
+	background: url(images/box-butt-left.gif) no-repeat bottom left;
+}
+
+#advancedstuff .dbx-box-closed div.dbx-content-wrapper {
+	padding-bottom: 2px;
+	background: url(images/box-butt-left.gif) no-repeat bottom left;
+}
+
+#advancedstuff .dbx-box {
+	background: url(images/box-butt-right.gif) no-repeat bottom right;
+}
+
+
+/* handle cursors */
+.dbx-handle-cursor {
+	cursor: move;
+}
+	
+/* toggle images */
+a.dbx-toggle, a.dbx-toggle:visited {
+	display:block;
+	overflow: hidden;
+	background-image: url( images/toggle.gif );
+	position: absolute;
+	top: 0px;
+	right: 0px;
+	background-repeat: no-repeat;
+	border: 0px;
+	margin: 0px;
+	padding: 0px;
+}
+
+#moremeta a.dbx-toggle, #moremeta a.dbx-toggle-open:visited {
+	height: 25px;
+	width: 27px;
+	background-position: 0 0px;
+}
+
+#moremeta a.dbx-toggle-open, #moremeta a.dbx-toggle-open:visited {
+	height: 25px;
+	width: 27px;
+	background-position: 0 -25px;
+}
+
+#advancedstuff a.dbx-toggle, #advancedstuff a.dbx-toggle-open:visited {
+	height: 22px;
+	width: 22px;
+	top: 3px;
+	right: 5px;
+	background-position: 0 -3px;
+}
+
+#advancedstuff a.dbx-toggle-open, #advancedstuff a.dbx-toggle-open:visited {
+	height: 22px;
+	width: 22px;
+	top: 3px;
+	right: 5px;
+	background-position: 0 -28px;
+}
+
+#categorychecklist {
+	margin-right: 6px;
+}
+
+/* additional clone styles */
+.dbx-clone {
+	opacity: 0.8;
+	-moz-opacity: 0.8;
+	-khtml-opacity: 0.8;
+	filter: alpha(opacity=80);
+}
+
+#newcat { width: 120px; margin-right: 5px; }
+input#catadd { 	background: #a4a4a4;
+	border-bottom: 1px solid #898989;
+	border-left: 1px solid #bcbcbc;
+	border-right: 1px solid #898989;
+	border-top: 1px solid #bcbcbc;
+	color: #fff;
+	font-size: 10px;
+	padding: 0;
+	margin: 0;
+	font-weight: bold;
+	height: 20px;
+	margin-bottom: 2px;
+	text-align: center;
+	width: 37px; }
+#howto {
+	font-size: 11px;
+	margin: 0 5px;
+	display: block;
+}
+#jaxcat {
+	margin: 0;
+	padding: 0;
+}
\ No newline at end of file
diff -ruN 1.5.2/wp-admin/xfn.js 2.0.4/wp-admin/xfn.js
--- 1.5.2/wp-admin/xfn.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-admin/xfn.js	2006-01-09 23:16:17.000000000 -0600
@@ -0,0 +1,46 @@
+function GetElementsWithClassName(elementName, className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (i = 0; i < allElements.length; i++) {
+		if (allElements[i].className == className) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function meChecked() {
+  var undefined;
+  var eMe = document.getElementById('me');
+  if (eMe == undefined) return false;
+  else return eMe.checked;
+}
+
+function upit() {
+	var isMe = meChecked(); //document.getElementById('me').checked;
+	var inputColl = GetElementsWithClassName('input', 'valinp');
+	var results = document.getElementById('link_rel');
+	var linkText, linkUrl, inputs = '';
+	for (i = 0; i < inputColl.length; i++) {
+		 inputColl[i].disabled = isMe;
+		 inputColl[i].parentNode.className = isMe ? 'disabled' : '';
+		 if (!isMe && inputColl[i].checked && inputColl[i].value != '') {
+			inputs += inputColl[i].value + ' ';
+				}
+		 }
+	inputs = inputs.substr(0,inputs.length - 1);
+	if (isMe) inputs='me';
+	results.value = inputs;
+	}
+
+function blurry() {
+	if (!document.getElementById) return;
+
+	var aInputs = document.getElementsByTagName('input');
+
+	for (var i = 0; i < aInputs.length; i++) {		
+		 aInputs[i].onclick = aInputs[i].onkeyup = upit;
+	}
+}
+
+addLoadEvent(blurry);
\ No newline at end of file
diff -ruN 1.5.2/wp-atom.php 2.0.4/wp-atom.php
--- 1.5.2/wp-atom.php	2005-05-09 06:11:19.000000000 -0500
+++ 2.0.4/wp-atom.php	2005-06-10 18:15:13.000000000 -0500
@@ -1,10 +1,8 @@
 <?php
 
-if (empty($feed)) {
-    $blog = 1;
-		$feed = 'atom';
-    $doing_rss = 1;
-    require('wp-blog-header.php');
+if (empty($wp)) {
+	require_once('wp-config.php');
+	wp('feed=atom');
 }
 
 header('Content-type: application/atom+xml; charset=' . get_settings('blog_charset'), true);
@@ -16,6 +14,7 @@
   xmlns="http://purl.org/atom/ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xml:lang="<?php echo get_option('rss_language'); ?>"
+  <?php do_action('atom_ns'); ?>
   >
 	<title><?php bloginfo_rss('name') ?></title>
 	<link rel="alternate" type="text/html" href="<?php bloginfo_rss('home') ?>" />
@@ -23,7 +22,7 @@
 	<modified><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastpostmodified('GMT'), false); ?></modified>
 	<copyright>Copyright <?php echo mysql2date('Y', get_lastpostdate('blog'), 0); ?></copyright>
 	<generator url="http://wordpress.org/" version="<?php bloginfo_rss('version'); ?>">WordPress</generator>
-	
+	<?php do_action('atom_head'); ?>
 	<?php $items_count = 0; if ($posts) { foreach ($posts as $post) { start_wp(); ?>
 	<entry>
 	  	<author>
@@ -40,6 +39,7 @@
 		<content type="<?php bloginfo('html_type'); ?>" mode="escaped" xml:base="<?php permalink_single_rss() ?>"><![CDATA[<?php the_content('', 0, '') ?>]]></content>
 <?php endif; ?>
 <?php rss_enclosure(); ?>
+<?php do_action('atom_entry'); ?>
 	</entry>
 	<?php $items_count++; if (($items_count == get_settings('posts_per_rss')) && empty($m)) { break; } } } ?>
 </feed>
diff -ruN 1.5.2/wp-blog-header.php 2.0.4/wp-blog-header.php
--- 1.5.2/wp-blog-header.php	2005-05-13 16:07:21.000000000 -0500
+++ 2.0.4/wp-blog-header.php	2005-06-12 18:22:06.000000000 -0500
@@ -11,253 +11,11 @@
 
 require_once( dirname(__FILE__) . '/wp-config.php');
 
-$query_vars = array();
+wp();
+gzip_compression();
 
-// Process PATH_INFO and 404.
-if ((isset($_GET['error']) && $_GET['error'] == '404') ||
-		((! empty($_SERVER['PATH_INFO'])) &&
-		('/' != $_SERVER['PATH_INFO']) &&
-		 (false === strpos($_SERVER['PATH_INFO'], '.php'))
-		)) {
-
-	// If we match a rewrite rule, this will be cleared.
-	$error = '404';
-
-	// Fetch the rewrite rules.
-	$rewrite = $wp_rewrite->wp_rewrite_rules();
-
-	if (! empty($rewrite)) {
-		$pathinfo = $_SERVER['PATH_INFO'];
-		$req_uri = $_SERVER['REQUEST_URI'];      
-		$home_path = parse_url(get_settings('home'));
-		$home_path = $home_path['path'];
-
-		// Trim path info from the end and the leading home path from the
-		// front.  For path info requests, this leaves us with the requesting
-		// filename, if any.  For 404 requests, this leaves us with the
-		// requested permalink.	
-		$req_uri = str_replace($pathinfo, '', $req_uri);
-		$req_uri = str_replace($home_path, '', $req_uri);
-		$req_uri = trim($req_uri, '/');
-		$pathinfo = trim($pathinfo, '/');
-
-		// The requested permalink is in $pathinfo for path info requests and
-		//  $req_uri for other requests.
-		if (! empty($pathinfo)) {
-			$request = $pathinfo;
-		} else {
-			$request = $req_uri;
-		}
-
-		// Look for matches.
-		$request_match = $request;
-		foreach ($rewrite as $match => $query) {
-			// If the requesting file is the anchor of the match, prepend it
-			// to the path info.
-	    if ((! empty($req_uri)) && (strpos($match, $req_uri) === 0)) {
-	      $request_match = $req_uri . '/' . $request;
-	    }
-
-			if (preg_match("!^$match!", $request_match, $matches)) {
-				// Got a match.
-				// Trim the query of everything up to the '?'.
-				$query = preg_replace("!^.+\?!", '', $query);
-
-				// Substitute the substring matches into the query.
-				eval("\$query = \"$query\";");
-
-				// Parse the query.
-				parse_str($query, $query_vars);
-
-				// If we're processing a 404 request, clear the error var
-				// since we found something.
-				if (isset($_GET['error'])) {
-					unset($_GET['error']);
-				}
-
-				if (isset($error)) {
-					unset($error);
-				}
-
-				break;
-			}
-		}
-	}
- }
-
-$wpvarstoreset = array('m','p','posts','w', 'cat','withcomments','s','search','exact', 'sentence', 'debug', 'calendar','page','paged','more','tb', 'pb','author','order','orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup');
-
-$wpvarstoreset = apply_filters('query_vars', $wpvarstoreset);
-
-for ($i=0; $i<count($wpvarstoreset); $i += 1) {
-	$wpvar = $wpvarstoreset[$i];
-	if (!isset($$wpvar)) {
-		if (empty($_POST[$wpvar])) {
-			if (empty($_GET[$wpvar]) && empty($query_vars[$wpvar])) {
-				$$wpvar = '';
-			} elseif (!empty($_GET[$wpvar])) {
-				$$wpvar = $_GET[$wpvar];
-			} else {
-				$$wpvar = $query_vars[$wpvar];
-			}
-		} else {
-			$$wpvar = $_POST[$wpvar];
-		}
-	}
-}
-
-// Sending HTTP headers
-
-if ( !empty($error) && '404' == $error ) {
-	if ( preg_match('/cgi/', php_sapi_name()) )
-		@header('Status: 404 Not Found');
-	else
-		@header('HTTP/1.x 404 Not Found');
- } else if ( empty($feed) ) {
-	@header('X-Pingback: '. get_bloginfo('pingback_url'));
-	@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
-} else {
-	// We're showing a feed, so WP is indeed the only thing that last changed
-	if ( $withcomments )
-		$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastcommentmodified('GMT'), 0).' GMT';
-	else 
-		$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastpostmodified('GMT'), 0).' GMT';
-	$wp_etag = '"' . md5($wp_last_modified) . '"';
-	@header("Last-Modified: $wp_last_modified");
-	@header("ETag: $wp_etag");
-	@header('X-Pingback: ' . get_bloginfo('pingback_url'));
-
-	// Support for Conditional GET
-	if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) $client_etag = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
-	else $client_etag = 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...	
-	$wp_modified_timestamp = strtotime($wp_last_modified);
-
-	if ( ($client_last_modified && $client_etag) ?
-		(($client_modified_timestamp >= $wp_modified_timestamp) && ($client_etag == $wp_etag)) :
-		(($client_modified_timestamp >= $wp_modified_timestamp) || ($client_etag == $wp_etag)) ) {
-		if ( preg_match('/cgi/',php_sapi_name()) ) {
-			header('Status: 304 Not Modified');
-			echo "\r\n\r\n";
-			exit;
-		} else {
-			if ( version_compare(phpversion(), '4.3.0', '>=') )
-				header('Not Modified', TRUE, 304);
-			else
-				header('HTTP/1.x 304 Not Modified');
-			exit;
-		}
-	}
-}
-
-$use_gzipcompression = get_settings('gzipcompression');
-
-$more_wpvars = array('posts_per_page', 'posts_per_archive_page', 'what_to_show', 'showposts', 'nopaging');
-
-// Construct the query string.
-$query_string = '';
-foreach (array_merge($wpvarstoreset, $more_wpvars) as $wpvar) {
-	if ($$wpvar != '') {
-		$query_string .= (strlen($query_string) < 1) ? '' : '&';
-		$query_string .= $wpvar . '=' . rawurlencode($$wpvar);
-	}
-}
-
-$query_string = apply_filters('query_string', $query_string);
-
-update_category_cache();
-get_currentuserinfo();
-
-// Call query posts to do the work.
-$posts = & query_posts($query_string);
-
-// Extract updated query vars back into global namespace.
-extract($wp_query->query_vars);
-
-if ( is_single() || is_page() ) {
-	$more = 1;
-	$single = 1;
-}
-
-// Issue a 404 if a permalink request doesn't match any posts.  Don't issue a
-// 404 if one was already issued, if the request was a search, or if the
-// request was a regular query string request rather than a permalink request.
-if ( (0 == count($posts)) && !is_404() && !is_search()
-		&& ( isset($rewrite) || (!empty($_SERVER['QUERY_STRING']) &&
-		(false === strpos($_SERVER['REQUEST_URI'], '?'))) ) ) {
-	$wp_query->is_404 = true;
-	if ( preg_match('/cgi/', php_sapi_name()) )
-		@header('Status: 404 Not Found');
-	else
-		@header('HTTP/1.x 404 Not Found');
-}
-
-if ($pagenow != 'post.php' && $pagenow != 'edit.php') {
-	if ( get_settings('gzipcompression') ) 
-		gzip_compression();
-}
-
-// Template redirection
-if ( defined('WP_USE_THEMES') && constant('WP_USE_THEMES') ) {
-	do_action('template_redirect');
-	if ( is_feed() && empty($doing_rss) ) {
-		include(ABSPATH . '/wp-feed.php');
-		exit;
-	} else if ( is_trackback() && empty($doing_trackback) ) {
-		include(ABSPATH . '/wp-trackback.php');
-		exit;
-	} else if ( is_404() && get_404_template() ) {
-		include(get_404_template());
-		exit;
-	} else if ( is_search() && get_search_template() ) {
-		include(get_search_template());
-		exit;
-	} else if ( is_home() && get_home_template() ) {
-		include(get_home_template());
-		exit;
-	} else if ( is_single() && get_single_template() ) {
-		include(get_single_template());
-		exit;
-	} else if ( is_page() && get_page_template() ) {
-		include(get_page_template());
-		exit;
-	} else if ( is_category() && get_category_template()) {
-		include(get_category_template());
-		exit;		
-	} else if ( is_author() && get_author_template() ) {
-		include(get_author_template());
-		exit;
-	} else if ( is_date() && get_date_template() ) {
-		include(get_date_template());
-		exit;
-	} else if ( is_archive() && get_archive_template() ) {
-		include(get_archive_template());
-		exit;
-	} else if ( is_comments_popup() && get_comments_popup_template() ) {
-		include(get_comments_popup_template());
-		exit;
-	} else if ( is_paged() && get_paged_template() ) {
-		include(get_paged_template());
-		exit;
-	} else if ( file_exists(TEMPLATEPATH . "/index.php") ) {
-		include(TEMPLATEPATH . "/index.php");
-		exit;
-	}
-} else {
-	// Process feeds and trackbacks even if not using themes.
-	if ( is_feed() && empty($doing_rss) ) {
-		include(ABSPATH . '/wp-feed.php');
-		exit;
-	} else if ( is_trackback() && empty($doing_trackback) ) {
-		include(ABSPATH . '/wp-trackback.php');
-		exit;
-	}
-}
+require_once(ABSPATH . WPINC . '/template-loader.php');
 
 endif;
-?>
+
+?>
\ No newline at end of file
diff -ruN 1.5.2/wp-comments-post.php 2.0.4/wp-comments-post.php
--- 1.5.2/wp-comments-post.php	2005-05-03 02:31:29.000000000 -0500
+++ 2.0.4/wp-comments-post.php	2006-05-11 18:05:45.000000000 -0500
@@ -1,6 +1,8 @@
 <?php
 require( dirname(__FILE__) . '/wp-config.php' );
 
+nocache_headers();
+
 $comment_post_ID = (int) $_POST['comment_post_ID'];
 
 $status = $wpdb->get_row("SELECT post_status, comment_status FROM $wpdb->posts WHERE ID = '$comment_post_ID'");
@@ -22,11 +24,11 @@
 $comment_content      = trim($_POST['comment']);
 
 // If the user is logged in
-get_currentuserinfo();
-if ( $user_ID ) :
-	$comment_author       = addslashes($user_identity);
-	$comment_author_email = addslashes($user_email);
-	$comment_author_url   = addslashes($user_url);
+$user = wp_get_current_user();
+if ( $user->ID ) :
+	$comment_author       = $wpdb->escape($user->display_name);
+	$comment_author_email = $wpdb->escape($user->user_email);
+	$comment_author_url   = $wpdb->escape($user->user_url);
 else :
 	if ( get_option('comment_registration') )
 		die( __('Sorry, you must be logged in to post a comment.') );
@@ -34,7 +36,7 @@
 
 $comment_type = '';
 
-if ( get_settings('require_name_email') && !$user_ID ) {
+if ( get_settings('require_name_email') && !$user->ID ) {
 	if ( 6 > strlen($comment_author_email) || '' == $comment_author )
 		die( __('Error: please fill the required fields (name, email).') );
 	elseif ( !is_email($comment_author_email))
@@ -46,18 +48,17 @@
 
 $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'user_ID');
 
-wp_new_comment($commentdata);
+$comment_id = wp_new_comment( $commentdata );
 
-setcookie('comment_author_' . COOKIEHASH, stripslashes($comment_author), time() + 30000000, COOKIEPATH);
-setcookie('comment_author_email_' . COOKIEHASH, stripslashes($comment_author_email), time() + 30000000, COOKIEPATH);
-setcookie('comment_author_url_' . COOKIEHASH, stripslashes($comment_author_url), time() + 30000000, COOKIEPATH);
+if ( !$user->ID ) :
+	$comment = get_comment($comment_id);
+	setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
+	setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
+	setcookie('comment_author_url_' . COOKIEHASH, clean_url($comment->comment_author_url), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
+endif;
 
-header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-header('Cache-Control: no-cache, must-revalidate, max-age=0');
-header('Pragma: no-cache');
+$location = ( empty( $_POST['redirect_to'] ) ) ? get_permalink( $comment_post_ID ) : $_POST['redirect_to']; 
 
-$location = (empty($_POST['redirect_to'])) ? $_SERVER["HTTP_REFERER"] : $_POST['redirect_to']; 
+wp_redirect( $location );
 
-wp_redirect($location);
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-commentsrss2.php 2.0.4/wp-commentsrss2.php
--- 1.5.2/wp-commentsrss2.php	2005-08-14 13:21:38.000000000 -0500
+++ 2.0.4/wp-commentsrss2.php	2005-12-15 16:20:06.000000000 -0600
@@ -1,9 +1,8 @@
 <?php 
-if ( empty($feed) ) {
-	$feed = 'rss2';
-	$withcomments = 1;
-	$doing_rss = 1;
-	require('wp-blog-header.php');
+
+if (empty($wp)) {
+	require_once('wp-config.php');
+	wp('feed=rss2&withcomments=1');
 }
 
 header('Content-type: text/xml;charset=' . get_settings('blog_charset'), true);
@@ -21,7 +20,7 @@
 	if ($i < 1) {
 		$i++;
 ?>
-	<title><?php if (is_single() || is_page()) { echo "Comments on: "; the_title_rss(); } else { bloginfo_rss("name"); echo " Comments"; } ?></title>
+	<title><?php if (is_single() || is_page() ) { printf(__('Comments on: %s'), get_the_title_rss()); } else { printf(__('Comments for %s'), get_bloginfo_rss("name")); } ?></title>
 	<link><?php (is_single()) ? permalink_single_rss() : bloginfo_rss("url") ?></link>
 	<description><?php bloginfo_rss("description") ?></description>
 	<pubDate><?php echo gmdate('r'); ?></pubDate>
@@ -33,35 +32,40 @@
 			comment_author_url, comment_date, comment_date_gmt, comment_content, comment_post_ID, 
 			$wpdb->posts.ID, $wpdb->posts.post_password FROM $wpdb->comments 
 			LEFT JOIN $wpdb->posts ON comment_post_id = id WHERE comment_post_ID = '$id' 
-			AND $wpdb->comments.comment_approved = '1' AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'static') 
-			AND post_date < '".date("Y-m-d H:i:59")."' 
-			ORDER BY comment_date DESC LIMIT " . get_settings('posts_per_rss') );
+			AND $wpdb->comments.comment_approved = '1' AND $wpdb->posts.post_status IN ('publish', 'static', 'object') 
+			AND post_date_gmt < '" . gmdate("Y-m-d H:i:59") . "' 
+			ORDER BY comment_date_gmt DESC LIMIT " . get_settings('posts_per_rss') );
 		} else { // if no post id passed in, we'll just ue the last 10 comments.
 			$comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_author_email, 
 			comment_author_url, comment_date, comment_date_gmt, comment_content, comment_post_ID, 
 			$wpdb->posts.ID, $wpdb->posts.post_password FROM $wpdb->comments 
-			LEFT JOIN $wpdb->posts ON comment_post_id = id WHERE ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'static') 
-			AND $wpdb->comments.comment_approved = '1' AND post_date < '".date("Y-m-d H:i:s")."'  
-			ORDER BY comment_date DESC LIMIT " . get_settings('posts_per_rss') );
+			LEFT JOIN $wpdb->posts ON comment_post_id = id WHERE $wpdb->posts.post_status IN ('publish', 'static', 'object') 
+			AND $wpdb->comments.comment_approved = '1' AND post_date_gmt < '" . gmdate("Y-m-d H:i:s") . "'  
+			ORDER BY comment_date_gmt DESC LIMIT " . get_settings('posts_per_rss') );
 		}
 	// this line is WordPress' motor, do not delete it.
 		if ($comments) {
 			foreach ($comments as $comment) {
+				// Some plugins may need to know the metadata
+				// associated with this comment's post:
+				get_post_custom($comment->comment_post_ID);
 ?>
 	<item>
- 		<title><?php if ( (! is_single()) || (! is_page()) ) {
- 			$title = get_the_title($comment->comment_post_ID);
- 			$title = apply_filters('the_title', $title);
- 			$title = apply_filters('the_title_rss', $title);
- 			echo "Comment on $title";
- 		} ?> by: <?php comment_author_rss() ?></title>
+		<title><?php if ( ! (is_single() || is_page()) ) {
+			$title = get_the_title($comment->comment_post_ID);
+			$title = apply_filters('the_title', $title);
+			$title = apply_filters('the_title_rss', $title);
+			printf(__('Comment on %1$s by %2$s'), $title, get_comment_author_rss());
+		} else {	
+			printf(__('by: %s'), get_comment_author_rss());			
+		} ?></title>
 		<link><?php comment_link() ?></link>
 		<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_comment_time('Y-m-d H:i:s', true), false); ?></pubDate>
 		<guid><?php comment_link() ?></guid>
 			<?php 
 			if (!empty($comment->post_password) && $_COOKIE['wp-postpass'] != $comment->post_password) {
 			?>
-		<description>Protected Comments: Please enter your password to view comments.</description>
+		<description><?php _e('Protected Comments: Please enter your password to view comments.'); ?></description>
 		<content:encoded><![CDATA[<?php echo get_the_password_form() ?>]]></content:encoded>
 			<?php
 			} else {
diff -ruN 1.5.2/wp-content/index.php 2.0.4/wp-content/index.php
--- 1.5.2/wp-content/index.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-content/index.php	2005-11-18 17:18:34.000000000 -0600
@@ -0,0 +1,3 @@
+<?php
+// Silence is golden.
+?>
\ No newline at end of file
diff -ruN 1.5.2/wp-content/plugins/akismet/akismet.php 2.0.4/wp-content/plugins/akismet/akismet.php
--- 1.5.2/wp-content/plugins/akismet/akismet.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-content/plugins/akismet/akismet.php	2006-07-26 17:35:57.000000000 -0500
@@ -0,0 +1,334 @@
+<?php
+/*
+Plugin Name: Akismet
+Plugin URI: http://akismet.com/
+Description: Akismet checks your comments against the Akismet web serivce to see if they look like spam or not. You need a <a href="http://wordpress.com/api-keys/">WordPress.com API key</a> to use this service. You can review the spam it catches under "Manage" and it automatically deletes old spam after 15 days. Hat tip: <a href="http://ioerror.us/">Michael Hampton</a> and <a href="http://chrisjdavis.org/">Chris J. Davis</a> for help with the plugin.
+Author: Matt Mullenweg
+Version: 1.15
+Author URI: http://photomatt.net/
+*/
+
+add_action('admin_menu', 'ksd_config_page');
+
+if ( ! function_exists('wp_nonce_field') ) {
+	function akismet_nonce_field($action = -1) {
+		return;	
+	}
+	$akismet_nonce = -1;
+} else {
+	function akismet_nonce_field($action = -1) {
+		return wp_nonce_field($action);
+	}
+	$akismet_nonce = 'akismet-update-key';
+}
+
+function ksd_config_page() {
+	global $wpdb;
+	if ( function_exists('add_submenu_page') )
+		add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', __FILE__, 'akismet_conf');
+}
+
+function akismet_conf() {
+	global $akismet_nonce;
+	if ( isset($_POST['submit']) ) {
+		if ( !current_user_can('manage_options') )
+			die(__('Cheatin&#8217; uh?'));
+
+		check_admin_referer($akismet_nonce);
+		$key = preg_replace('/[^a-h0-9]/i', '', $_POST['key']);
+		if ( akismet_verify_key( $key ) )
+			update_option('wordpress_api_key', $key);
+		else
+			$invalid_key = true;
+	}
+	if ( !akismet_verify_key( get_option('wordpress_api_key') ) )
+		$invalid_key = true;
+?>
+
+<div class="wrap">
+<h2><?php _e('Akismet Configuration'); ?></h2>
+	<p><?php printf(__('For many people, <a href="%1$s">Akismet</a> will greatly reduce or even completely eliminate the comment and trackback spam you get on your site. If one does happen to get through, simply mark it as "spam" on the moderation screen and Akismet will learn from the mistakes. If you don\'t have a WordPress.com account yet, you can get one at <a href="%2$s">WordPress.com</a>.'), 'http://akismet.com/', 'http://wordpress.com/api-keys/'); ?></p>
+
+<form action="" method="post" id="akismet-conf" style="margin: auto; width: 25em; ">
+<?php akismet_nonce_field($akismet_nonce) ?>
+<h3><label for="key"><?php _e('WordPress.com API Key'); ?></label></h3>
+<?php if ( $invalid_key ) { ?>
+	<p style="padding: .5em; background-color: #f33; color: #fff; font-weight: bold;"><?php _e('Your key appears invalid. Double-check it.'); ?></p>
+<?php } ?>
+<p><input id="key" name="key" type="text" size="15" maxlength="12" value="<?php echo get_option('wordpress_api_key'); ?>" style="font-family: 'Courier New', Courier, mono; font-size: 1.5em;" /> (<?php _e('<a href="http://faq.wordpress.com/2005/10/19/api-key/">What is this?</a>'); ?>)</p>
+	<p class="submit"><input type="submit" name="submit" value="<?php _e('Update API Key &raquo;'); ?>" /></p>
+</form>
+</div>
+<?php
+}
+
+function akismet_verify_key( $key ) {
+	global $auto_comment_approved, $ksd_api_host, $ksd_api_port;
+	$blog = urlencode( get_option('home') );
+	$response = ksd_http_post("key=$key&blog=$blog", 'rest.akismet.com', '/1.1/verify-key', $ksd_api_port);
+	if ( 'valid' == $response[1] )
+		return true;
+	else
+		return false;
+}
+
+if ( !get_option('wordpress_api_key') && !isset($_POST['submit']) ) {
+	function akismet_warning() {
+	$path = plugin_basename(__FILE__);
+		echo "
+		<div id='akismet-warning' class='updated fade-ff0000'><p><strong>".__('Akismet is not active.')."</strong> ".sprintf(__('You must <a href="%1$s">enter your WordPress.com API key</a> for it to work.'), "plugins.php?page=$path")."</p></div>
+		<style type='text/css'>
+		#adminmenu { margin-bottom: 5em; }
+		#akismet-warning { position: absolute; top: 7em; }
+		</style>
+		";
+	}
+	add_action('admin_footer', 'akismet_warning');
+	return;
+}
+
+$ksd_api_host = get_option('wordpress_api_key') . '.rest.akismet.com';
+$ksd_api_port = 80;
+$ksd_user_agent = "WordPress/$wp_version | Akismet/1.15";
+
+// Returns array with headers in $response[0] and entity in $response[1]
+function ksd_http_post($request, $host, $path, $port = 80) {
+	global $ksd_user_agent;
+
+	$http_request  = "POST $path HTTP/1.0\r\n";
+	$http_request .= "Host: $host\r\n";
+	$http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_settings('blog_charset') . "\r\n";
+	$http_request .= "Content-Length: " . strlen($request) . "\r\n";
+	$http_request .= "User-Agent: $ksd_user_agent\r\n";
+	$http_request .= "\r\n";
+	$http_request .= $request;
+
+	$response = '';
+	if( false !== ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
+		fwrite($fs, $http_request);
+
+		while ( !feof($fs) )
+			$response .= fgets($fs, 1160); // One TCP-IP packet
+		fclose($fs);
+		$response = explode("\r\n\r\n", $response, 2);
+	}
+	return $response;
+}
+
+function ksd_auto_check_comment( $comment ) {
+	global $auto_comment_approved, $ksd_api_host, $ksd_api_port;
+	$comment['user_ip']    = preg_replace( '/[^0-9., ]/', '', $_SERVER['REMOTE_ADDR'] );
+	$comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
+	$comment['referrer']   = $_SERVER['HTTP_REFERER'];
+	$comment['blog']       = get_option('home');
+
+	$ignore = array( 'HTTP_COOKIE' );
+
+	foreach ( $_SERVER as $key => $value )
+		if ( !in_array( $key, $ignore ) )
+			$comment["$key"] = $value;
+
+	$query_string = '';
+	foreach ( $comment as $key => $data )
+		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
+
+	$response = ksd_http_post($query_string, $ksd_api_host, '/1.1/comment-check', $ksd_api_port);
+	if ( 'true' == $response[1] ) {
+		$auto_comment_approved = 'spam';
+		update_option( 'akismet_spam_count', get_option('akismet_spam_count') + 1 );
+	}
+	akismet_delete_old();
+	return $comment;
+}
+
+function akismet_delete_old() {
+	global $wpdb;
+	$now_gmt = current_time('mysql', 1);
+	$wpdb->query("DELETE FROM $wpdb->comments WHERE DATE_SUB('$now_gmt', INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = 'spam'");
+	$n = mt_rand(1, 5);
+	if ( $n % 5 )
+		$wpdb->query("OPTIMIZE TABLE $wpdb->comments");
+}
+
+function ksd_auto_approved( $approved ) {
+	global $auto_comment_approved;
+	if ( 'spam' == $auto_comment_approved )
+		$approved = $auto_comment_approved;
+	return $approved;
+}
+
+function ksd_submit_nonspam_comment ( $comment_id ) {
+	global $wpdb, $ksd_api_host, $ksd_api_port;
+
+	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
+	if ( !$comment ) // it was deleted
+		return;
+	$comment->blog = get_option('home');
+	$query_string = '';
+	foreach ( $comment as $key => $data )
+		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
+	$response = ksd_http_post($query_string, $ksd_api_host, "/1.1/submit-ham", $ksd_api_port);
+}
+
+function ksd_submit_spam_comment ( $comment_id ) {
+	global $wpdb, $ksd_api_host, $ksd_api_port;
+
+	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
+	if ( !$comment ) // it was deleted
+		return;
+	if ( 'spam' != $comment->comment_approved )
+		return;
+	$comment->blog = get_option('home');
+	$query_string = '';
+	foreach ( $comment as $key => $data )
+		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
+
+	$response = ksd_http_post($query_string, $ksd_api_host, "/1.1/submit-spam", $ksd_api_port);
+}
+
+add_action('wp_set_comment_status', 'ksd_submit_spam_comment');
+add_action('edit_comment', 'ksd_submit_spam_comment');
+add_action('preprocess_comment', 'ksd_auto_check_comment', 1);
+add_filter('pre_comment_approved', 'ksd_auto_approved');
+
+
+function ksd_spam_count() {
+	global $wpdb, $comments;
+	$count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");
+	return $count;
+}
+
+function ksd_manage_page() {
+	global $wpdb;
+	$count = sprintf(__('Akismet Spam (%s)'), ksd_spam_count());
+	if ( function_exists('add_management_page') )
+		add_management_page(__('Akismet Spam'), $count, 'moderate_comments', __FILE__, 'ksd_caught');
+}
+
+function ksd_caught() {
+	global $wpdb, $comment;
+	if (isset($_POST['submit']) && 'recover' == $_POST['action'] && ! empty($_POST['not_spam'])) {
+		if ( ! current_user_can('moderate_comments') )
+			die(__('You do not have sufficient permission to moderate comments.'));
+		
+		$i = 0;
+		foreach ($_POST['not_spam'] as $comment):
+			$comment = (int) $comment;
+			if ( function_exists('wp_set_comment_status') )
+				wp_set_comment_status($comment, 'approve');
+			else
+				$wpdb->query("UPDATE $wpdb->comments SET comment_approved = '1' WHERE comment_ID = '$comment'");
+			ksd_submit_nonspam_comment($comment);
+			++$i;
+		endforeach;
+		echo '<div class="updated"><p>' . sprintf(__('%1$s comments recovered.'), $i) . "</p></div>";
+	}
+	if ('delete' == $_POST['action']) {
+		if ( ! current_user_can('moderate_comments') )
+			die(__('You do not have sufficient permission to moderate comments.'));
+
+		$delete_time = addslashes( $_POST['display_time'] );
+		$nuked = $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' AND '$delete_time' > comment_date_gmt" );
+		if (isset($nuked)) {
+			echo '<div class="updated"><p>';
+			if ($nuked) {
+				_e('All spam deleted.');
+			}
+			echo "</p></div>";
+		}
+	}
+?>
+<div class="wrap">
+<h2><?php _e('Caught Spam') ?></h2>
+<?php
+$count = get_option('akismet_spam_count');
+if ( $count ) {
+?>
+<p><?php printf(__('Akismet has caught <strong>%1$s spam</strong> for you since you first installed it.'), number_format($count) ); ?></p>
+<?php
+}
+$spam_count = ksd_spam_count();
+if (0 == $spam_count) {
+	echo '<p>'.__('You have no spam currently in the queue. Must be your lucky day. :)').'</p>';
+	echo '</div>';
+} else {
+	echo '<p>'.__('You can delete all of the spam from your database with a single click. This operation cannot be undone, so you may wish to check to ensure that no legitimate comments got through first. Spam is automatically deleted after 15 days, so don&#8217;t sweat it.').'</p>';
+?>
+<form method="post" action="">
+<input type="hidden" name="action" value="delete" />
+<?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" name="Submit" value="<?php _e('Delete all'); ?>" />
+<input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" />
+</form>
+</div>
+<div class="wrap">
+<h2><?php _e('Latest Spam'); ?></h2>
+<?php echo '<p>'.__('These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as "not spam" and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you.').'</p>'; ?>
+<?php
+$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT 150");
+
+if ($comments) {
+?>
+<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
+<input type="hidden" name="action" value="recover" />
+<ul id="spam-list" class="commentlist" style="list-style: none; margin: 0; padding: 0;">
+<?php
+$i = 0;
+foreach($comments as $comment) {
+	$i++;
+	$comment_date = mysql2date(get_settings("date_format") . " @ " . get_settings("time_format"), $comment->comment_date);
+	$post = get_post($comment->comment_post_ID);
+	$post_title = $post->post_title;
+	if ($i % 2) $class = 'class="alternate"';
+	else $class = '';
+	echo "\n\t<li id='comment-$comment->comment_ID' $class>"; 
+	?>
+
+<p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
+
+<?php comment_text() ?>
+
+<p><label for="spam-<?php echo $comment->comment_ID; ?>">
+<input type="checkbox" id="spam-<?php echo $comment->comment_ID; ?>" name="not_spam[]" value="<?php echo $comment->comment_ID; ?>" />
+<?php _e('Not Spam') ?></label> &#8212; <?php comment_date('M j, g:i A');  ?> &#8212; [ 
+<?php
+$post = get_post($comment->comment_post_ID);
+$post_title = wp_specialchars( $post->post_title, 'double' );
+$post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;
+?>
+ <a href="<?php echo get_permalink($comment->comment_post_ID); ?>" title="<?php echo $post_title; ?>"><?php _e('View Post') ?></a> ] </p>
+
+
+<?php
+}
+}
+?>
+</ul>
+<p class="submit"> 
+<input type="submit" name="submit" value="<?php _e('De-spam marked comments &raquo;'); ?>" />
+</p>
+<p><?php _e('Comments you de-spam will be submitted to Akismet as mistakes so it can learn and get better.'); ?></p>
+</form>
+<form method="post" action="">
+<p><input type="hidden" name="action" value="delete" />
+<?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" name="Submit" value="<?php _e('Delete all'); ?>" />
+<input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" /></p>
+</form>
+</div>
+<?php
+	}
+}
+
+add_action('admin_menu', 'ksd_manage_page');
+
+function akismet_stats() {
+	$count = get_option('akismet_spam_count');
+	if ( !$count )
+		return;
+	$path = plugin_basename(__FILE__);
+	echo '<h3>'.__('Spam').'</h3>';
+	echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', "edit.php?page=$path", number_format($count) ).'</p>';
+}
+
+add_action('activity_box_end', 'akismet_stats');
+
+?>
diff -ruN 1.5.2/wp-content/plugins/hello.php 2.0.4/wp-content/plugins/hello.php
--- 1.5.2/wp-content/plugins/hello.php	2005-01-06 17:10:28.000000000 -0600
+++ 2.0.4/wp-content/plugins/hello.php	2005-08-07 05:30:53.000000000 -0500
@@ -2,9 +2,9 @@
 /*
 Plugin Name: Hello Dolly
 Plugin URI: http://wordpress.org/#
-Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong. Hello, Dolly. This is, by the way, the world's first official WordPress plugin. When enabled you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
+Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
 Author: Matt Mullenweg
-Version: 1.0
+Version: 1.5
 Author URI: http://photomatt.net/
 */ 
 
@@ -58,11 +58,11 @@
 	<style type='text/css'>
 	#dolly {
 		position: absolute;
-		top: 5px;
+		top: 2.3em;
 margin: 0; padding: 0;
-		right: 3em;
-		font-size: 20px;
-		color: #666;
+		right: 1em;
+		font-size: 16px;
+		color: #f1f1f1;
 	}
 	</style>
 	";
diff -ruN 1.5.2/wp-content/plugins/markdown.php 2.0.4/wp-content/plugins/markdown.php
--- 1.5.2/wp-content/plugins/markdown.php	2005-03-13 19:02:04.000000000 -0600
+++ 2.0.4/wp-content/plugins/markdown.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,1283 +0,0 @@
-<?php
-
-#
-# Markdown  -  A text-to-HTML conversion tool for web writers
-#
-# Copyright (c) 2004 John Gruber  
-# <http://daringfireball.net/projects/markdown/>
-#
-# Copyright (c) 2004 Michel Fortin - PHP Port  
-# <http://www.michelf.com/projects/php-markdown/>
-#
-
-
-global	$MarkdownPHPVersion, $MarkdownSyntaxVersion,
-		$md_empty_element_suffix, $md_tab_width,
-		$md_nested_brackets_depth, $md_nested_brackets, 
-		$md_escape_table, $md_backslash_escape_table, 
-		$md_list_level;
-
-$MarkdownPHPVersion    = '1.0.1'; # Fri 17 Dec 2004
-$MarkdownSyntaxVersion = '1.0.1'; # Sun 12 Dec 2004
-
-
-#
-# Global default settings:
-#
-$md_empty_element_suffix = " />";     # Change to ">" for HTML output
-$md_tab_width = 4;
-
-
-# -- WordPress Plugin Interface -----------------------------------------------
-/*
-Plugin Name: Markdown
-Plugin URI: http://www.michelf.com/projects/php-markdown/
-Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>
-Version: 1.0.1
-Author: Michel Fortin
-Author URI: http://www.michelf.com/
-*/
-if (isset($wp_version)) {
-	# Remove default WordPress auto-paragraph filter.
-	remove_filter('the_content', 'wpautop');
-	remove_filter('the_excerpt', 'wpautop');
-	remove_filter('comment_text', 'wpautop');
-	# Add Markdown filter with priority 6 (same as Textile).
-	add_filter('the_content', 'Markdown', 6);
-	add_filter('the_excerpt', 'Markdown', 6);
-	add_filter('the_excerpt_rss', 'Markdown', 6);
-	add_filter('comment_text', 'Markdown', 6);
-}
-
-
-# -- bBlog Plugin Info --------------------------------------------------------
-function identify_modifier_markdown() {
-	global $MarkdownPHPVersion;
-	return array(
-		'name'			=> 'markdown',
-		'type'			=> 'modifier',
-		'nicename'		=> 'Markdown',
-		'description'	=> 'A text-to-HTML conversion tool for web writers',
-		'authors'		=> 'Michel Fortin and John Gruber',
-		'licence'		=> 'GPL',
-		'version'		=> $MarkdownPHPVersion,
-		'help'			=> '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>'
-	);
-}
-
-# -- Smarty Modifier Interface ------------------------------------------------
-function smarty_modifier_markdown($text) {
-	return Markdown($text);
-}
-
-# -- Textile Compatibility Mode -----------------------------------------------
-# Rename this file to "classTextile.php" and it can replace Textile anywhere.
-if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) {
-	# Try to include PHP SmartyPants. Should be in the same directory.
-	@include_once 'smartypants.php';
-	# Fake Textile class. It calls Markdown instead.
-	class Textile {
-		function TextileThis($text, $lite='', $encode='', $noimage='', $strict='') {
-			if ($lite == '' && $encode == '')   $text = Markdown($text);
-			if (function_exists('SmartyPants')) $text = SmartyPants($text);
-			return $text;
-		}
-	}
-}
-
-
-
-#
-# Globals:
-#
-
-# Regex to match balanced [brackets].
-# Needed to insert a maximum bracked depth while converting to PHP.
-$md_nested_brackets_depth = 6;
-$md_nested_brackets = 
-	str_repeat('(?>[^\[\]]+|\[', $md_nested_brackets_depth).
-	str_repeat('\])*', $md_nested_brackets_depth);
-
-# Table of hash values for escaped characters:
-$md_escape_table = array(
-	"\\" => md5("\\"),
-	"`" => md5("`"),
-	"*" => md5("*"),
-	"_" => md5("_"),
-	"{" => md5("{"),
-	"}" => md5("}"),
-	"[" => md5("["),
-	"]" => md5("]"),
-	"(" => md5("("),
-	")" => md5(")"),
-	">" => md5(">"),
-	"#" => md5("#"),
-	"+" => md5("+"),
-	"-" => md5("-"),
-	"." => md5("."),
-	"!" => md5("!")
-);
-# Create an identical table but for escaped characters.
-$md_backslash_escape_table;
-foreach ($md_escape_table as $key => $char)
-	$md_backslash_escape_table["\\$key"] = $char;
-
-
-function Markdown($text) {
-#
-# Main function. The order in which other subs are called here is
-# essential. Link and image substitutions need to happen before
-# _EscapeSpecialChars(), so that any *'s or _'s in the <a>
-# and <img> tags get encoded.
-#
-	# Clear the global hashes. If we don't clear these, you get conflicts
-	# from other articles when generating a page which contains more than
-	# one article (e.g. an index page that shows the N most recent
-	# articles):
-	global $md_urls, $md_titles, $md_html_blocks;
-	$md_urls = array();
-	$md_titles = array();
-	$md_html_blocks = array();
-
-	# Standardize line endings:
-	#   DOS to Unix and Mac to Unix
-	$text = str_replace(array("\r\n", "\r"), "\n", $text);
-
-	# Make sure $text ends with a couple of newlines:
-	$text .= "\n\n";
-
-	# Convert all tabs to spaces.
-	$text = _Detab($text);
-
-	# Strip any lines consisting only of spaces and tabs.
-	# This makes subsequent regexen easier to write, because we can
-	# match consecutive blank lines with /\n+/ instead of something
-	# contorted like /[ \t]*\n+/ .
-	$text = preg_replace('/^[ \t]+$/m', '', $text);
-
-	# Turn block-level HTML blocks into hash entries
-	$text = _HashHTMLBlocks($text);
-
-	# Strip link definitions, store in hashes.
-	$text = _StripLinkDefinitions($text);
-
-	$text = _RunBlockGamut($text);
-
-	$text = _UnescapeSpecialChars($text);
-
-	return $text . "\n";
-}
-
-
-function _StripLinkDefinitions($text) {
-#
-# Strips link definitions from text, stores the URLs and titles in
-# hash references.
-#
-	global $md_tab_width;
-	$less_than_tab = $md_tab_width - 1;
-
-	# Link defs are in the form: ^[id]: url "optional title"
-	$text = preg_replace_callback('{
-						^[ ]{0,'.$less_than_tab.'}\[(.+)\]:	# id = $1
-						  [ \t]*
-						  \n?				# maybe *one* newline
-						  [ \t]*
-						<?(\S+?)>?			# url = $2
-						  [ \t]*
-						  \n?				# maybe one newline
-						  [ \t]*
-						(?:
-							(?<=\s)			# lookbehind for whitespace
-							["(]
-							(.+?)			# title = $3
-							[")]
-							[ \t]*
-						)?	# title is optional
-						(?:\n+|\Z)
-		}xm',
-		'_StripLinkDefinitions_callback',
-		$text);
-	return $text;
-}
-function _StripLinkDefinitions_callback($matches) {
-	global $md_urls, $md_titles;
-	$link_id = strtolower($matches[1]);
-	$md_urls[$link_id] = _EncodeAmpsAndAngles($matches[2]);
-	if (isset($matches[3]))
-		$md_titles[$link_id] = str_replace('"', '&quot;', $matches[3]);
-	return ''; # String that will replace the block
-}
-
-
-function _HashHTMLBlocks($text) {
-	global $md_tab_width;
-	$less_than_tab = $md_tab_width - 1;
-
-	# Hashify HTML blocks:
-	# We only want to do this for block-level HTML tags, such as headers,
-	# lists, and tables. That's because we still want to wrap <p>s around
-	# "paragraphs" that are wrapped in non-block-level tags, such as anchors,
-	# phrase emphasis, and spans. The list of tags we're looking for is
-	# hard-coded:
-	$block_tags_a = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|'.
-					'script|noscript|form|fieldset|iframe|math|ins|del';
-	$block_tags_b = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|'.
-					'script|noscript|form|fieldset|iframe|math';
-
-	# First, look for nested blocks, e.g.:
-	# 	<div>
-	# 		<div>
-	# 		tags for inner block must be indented.
-	# 		</div>
-	# 	</div>
-	#
-	# The outermost tags must start at the left margin for this to match, and
-	# the inner nested divs must be indented.
-	# We need to do this before the next, more liberal match, because the next
-	# match will start at the first `<div>` and stop at the first `</div>`.
-	$text = preg_replace_callback("{
-				(						# save in $1
-					^					# start of line  (with /m)
-					<($block_tags_a)	# start tag = $2
-					\\b					# word break
-					(.*\\n)*?			# any number of lines, minimally matching
-					</\\2>				# the matching end tag
-					[ \\t]*				# trailing spaces/tabs
-					(?=\\n+|\\Z)	# followed by a newline or end of document
-				)
-		}xm",
-		'_HashHTMLBlocks_callback',
-		$text);
-
-	#
-	# Now match more liberally, simply from `\n<tag>` to `</tag>\n`
-	#
-	$text = preg_replace_callback("{
-				(						# save in $1
-					^					# start of line  (with /m)
-					<($block_tags_b)	# start tag = $2
-					\\b					# word break
-					(.*\\n)*?			# any number of lines, minimally matching
-					.*</\\2>				# the matching end tag
-					[ \\t]*				# trailing spaces/tabs
-					(?=\\n+|\\Z)	# followed by a newline or end of document
-				)
-		}xm",
-		'_HashHTMLBlocks_callback',
-		$text);
-
-	# Special case just for <hr />. It was easier to make a special case than
-	# to make the other regex more complicated.
-	$text = preg_replace_callback('{
-				(?:
-					(?<=\n\n)		# Starting after a blank line
-					|				# or
-					\A\n?			# the beginning of the doc
-				)
-				(						# save in $1
-					[ ]{0,'.$less_than_tab.'}
-					<(hr)				# start tag = $2
-					\b					# word break
-					([^<>])*?			# 
-					/?>					# the matching end tag
-					[ \t]*
-					(?=\n{2,}|\Z)		# followed by a blank line or end of document
-				)
-		}x',
-		'_HashHTMLBlocks_callback',
-		$text);
-
-	# Special case for standalone HTML comments:
-	$text = preg_replace_callback('{
-				(?:
-					(?<=\n\n)		# Starting after a blank line
-					|				# or
-					\A\n?			# the beginning of the doc
-				)
-				(						# save in $1
-					[ ]{0,'.$less_than_tab.'}
-					(?s:
-						<!
-						(--.*?--\s*)+
-						>
-					)
-					[ \t]*
-					(?=\n{2,}|\Z)		# followed by a blank line or end of document
-				)
-			}x',
-			'_HashHTMLBlocks_callback',
-			$text);
-
-	return $text;
-}
-function _HashHTMLBlocks_callback($matches) {
-	global $md_html_blocks;
-	$text = $matches[1];
-	$key = md5($text);
-	$md_html_blocks[$key] = $text;
-	return "\n\n$key\n\n"; # String that will replace the block
-}
-
-
-function _RunBlockGamut($text) {
-#
-# These are all the transformations that form block-level
-# tags like paragraphs, headers, and list items.
-#
-	global $md_empty_element_suffix;
-
-	$text = _DoHeaders($text);
-
-	# Do Horizontal Rules:
-	$text = preg_replace(
-		array('{^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$}mx',
-			  '{^[ ]{0,2}([ ]? -[ ]?){3,}[ \t]*$}mx',
-			  '{^[ ]{0,2}([ ]? _[ ]?){3,}[ \t]*$}mx'),
-		"\n<hr$md_empty_element_suffix\n", 
-		$text);
-
-	$text = _DoLists($text);
-
-	$text = _DoCodeBlocks($text);
-
-	$text = _DoBlockQuotes($text);
-
-	# We already ran _HashHTMLBlocks() before, in Markdown(), but that
-	# was to escape raw HTML in the original Markdown source. This time,
-	# we're escaping the markup we've just created, so that we don't wrap
-	# <p> tags around block-level tags.
-	$text = _HashHTMLBlocks($text);
-
-	$text = _FormParagraphs($text);
-
-	return $text;
-}
-
-
-function _RunSpanGamut($text) {
-#
-# These are all the transformations that occur *within* block-level
-# tags like paragraphs, headers, and list items.
-#
-	global $md_empty_element_suffix;
-
-	$text = _DoCodeSpans($text);
-
-	$text = _EscapeSpecialChars($text);
-
-	# Process anchor and image tags. Images must come first,
-	# because ![foo][f] looks like an anchor.
-	$text = _DoImages($text);
-	$text = _DoAnchors($text);
-
-	# Make links out of things like `<http://example.com/>`
-	# Must come after _DoAnchors(), because you can use < and >
-	# delimiters in inline links like [this](<url>).
-	$text = _DoAutoLinks($text);
-
-	# Fix unencoded ampersands and <'s:
-	$text = _EncodeAmpsAndAngles($text);
-
-	$text = _DoItalicsAndBold($text);
-
-	# Do hard breaks:
-	$text = preg_replace('/ {2,}\n/', "<br$md_empty_element_suffix\n", $text);
-
-	return $text;
-}
-
-
-function _EscapeSpecialChars($text) {
-	global $md_escape_table;
-	$tokens = _TokenizeHTML($text);
-
-	$text = '';   # rebuild $text from the tokens
-#	$in_pre = 0;  # Keep track of when we're inside <pre> or <code> tags.
-#	$tags_to_skip = "!<(/?)(?:pre|code|kbd|script|math)[\s>]!";
-
-	foreach ($tokens as $cur_token) {
-		if ($cur_token[0] == 'tag') {
-			# Within tags, encode * and _ so they don't conflict
-			# with their use in Markdown for italics and strong.
-			# We're replacing each such character with its
-			# corresponding MD5 checksum value; this is likely
-			# overkill, but it should prevent us from colliding
-			# with the escape values by accident.
-			$cur_token[1] = str_replace(array('*', '_'),
-				array($md_escape_table['*'], $md_escape_table['_']),
-				$cur_token[1]);
-			$text .= $cur_token[1];
-		} else {
-			$t = $cur_token[1];
-			$t = _EncodeBackslashEscapes($t);
-			$text .= $t;
-		}
-	}
-	return $text;
-}
-
-
-function _DoAnchors($text) {
-#
-# Turn Markdown link shortcuts into XHTML <a> tags.
-#
-	global $md_nested_brackets;
-	#
-	# First, handle reference-style links: [link text] [id]
-	#
-	$text = preg_replace_callback("{
-		(					# wrap whole match in $1
-		  \\[
-			($md_nested_brackets)	# link text = $2
-		  \\]
-
-		  [ ]?				# one optional space
-		  (?:\\n[ ]*)?		# one optional newline followed by spaces
-
-		  \\[
-			(.*?)		# id = $3
-		  \\]
-		)
-		}xs",
-		'_DoAnchors_reference_callback', $text);
-
-	#
-	# Next, inline-style links: [link text](url "optional title")
-	#
-	$text = preg_replace_callback("{
-		(				# wrap whole match in $1
-		  \\[
-			($md_nested_brackets)	# link text = $2
-		  \\]
-		  \\(			# literal paren
-			[ \\t]*
-			<?(.*?)>?	# href = $3
-			[ \\t]*
-			(			# $4
-			  (['\"])	# quote char = $5
-			  (.*?)		# Title = $6
-			  \\5		# matching quote
-			)?			# title is optional
-		  \\)
-		)
-		}xs",
-		'_DoAnchors_inline_callback', $text);
-
-	return $text;
-}
-function _DoAnchors_reference_callback($matches) {
-	global $md_urls, $md_titles, $md_escape_table;
-	$whole_match = $matches[1];
-	$link_text   = $matches[2];
-	$link_id     = strtolower($matches[3]);
-
-	if ($link_id == "") {
-		$link_id = strtolower($link_text); # for shortcut links like [this][].
-	}
-
-	if (isset($md_urls[$link_id])) {
-		$url = $md_urls[$link_id];
-		# We've got to encode these to avoid conflicting with italics/bold.
-		$url = str_replace(array('*', '_'),
-						   array($md_escape_table['*'], $md_escape_table['_']),
-						   $url);
-		$result = "<a href=\"$url\"";
-		if ( isset( $md_titles[$link_id] ) ) {
-			$title = $md_titles[$link_id];
-			$title = str_replace(array('*',     '_'),
-								 array($md_escape_table['*'], 
-									   $md_escape_table['_']), $title);
-			$result .=  " title=\"$title\"";
-		}
-		$result .= ">$link_text</a>";
-	}
-	else {
-		$result = $whole_match;
-	}
-	return $result;
-}
-function _DoAnchors_inline_callback($matches) {
-	global $md_escape_table;
-	$whole_match	= $matches[1];
-	$link_text		= $matches[2];
-	$url			= $matches[3];
-	$title			=& $matches[6];
-
-	# We've got to encode these to avoid conflicting with italics/bold.
-	$url = str_replace(array('*', '_'),
-					   array($md_escape_table['*'], $md_escape_table['_']), 
-					   $url);
-	$result = "<a href=\"$url\"";
-	if (isset($title)) {
-		$title = str_replace('"', '&quot;', $title);
-		$title = str_replace(array('*', '_'),
-							 array($md_escape_table['*'], $md_escape_table['_']),
-							 $title);
-		$result .=  " title=\"$title\"";
-	}
-	
-	$result .= ">$link_text</a>";
-
-	return $result;
-}
-
-
-function _DoImages($text) {
-#
-# Turn Markdown image shortcuts into <img> tags.
-#
-	#
-	# First, handle reference-style labeled images: ![alt text][id]
-	#
-	$text = preg_replace_callback('{
-		(				# wrap whole match in $1
-		  !\[
-			(.*?)		# alt text = $2
-		  \]
-
-		  [ ]?				# one optional space
-		  (?:\n[ ]*)?		# one optional newline followed by spaces
-
-		  \[
-			(.*?)		# id = $3
-		  \]
-
-		)
-		}xs', 
-		'_DoImages_reference_callback', $text);
-
-	#
-	# Next, handle inline images:  ![alt text](url "optional title")
-	# Don't forget: encode * and _
-
-	$text = preg_replace_callback("{
-		(				# wrap whole match in $1
-		  !\\[
-			(.*?)		# alt text = $2
-		  \\]
-		  \\(			# literal paren
-			[ \\t]*
-			<?(\S+?)>?	# src url = $3
-			[ \\t]*
-			(			# $4
-			  (['\"])	# quote char = $5
-			  (.*?)		# title = $6
-			  \\5		# matching quote
-			  [ \\t]*
-			)?			# title is optional
-		  \\)
-		)
-		}xs",
-		'_DoImages_inline_callback', $text);
-
-	return $text;
-}
-function _DoImages_reference_callback($matches) {
-	global $md_urls, $md_titles, $md_empty_element_suffix, $md_escape_table;
-	$whole_match = $matches[1];
-	$alt_text    = $matches[2];
-	$link_id     = strtolower($matches[3]);
-
-	if ($link_id == "") {
-		$link_id = strtolower($alt_text); # for shortcut links like ![this][].
-	}
-
-	$alt_text = str_replace('"', '&quot;', $alt_text);
-	if (isset($md_urls[$link_id])) {
-		$url = $md_urls[$link_id];
-		# We've got to encode these to avoid conflicting with italics/bold.
-		$url = str_replace(array('*', '_'),
-						   array($md_escape_table['*'], $md_escape_table['_']),
-						   $url);
-		$result = "<img src=\"$url\" alt=\"$alt_text\"";
-		if (isset($md_titles[$link_id])) {
-			$title = $md_titles[$link_id];
-			$title = str_replace(array('*', '_'),
-								 array($md_escape_table['*'], 
-									   $md_escape_table['_']), $title);
-			$result .=  " title=\"$title\"";
-		}
-		$result .= $md_empty_element_suffix;
-	}
-	else {
-		# If there's no such link ID, leave intact:
-		$result = $whole_match;
-	}
-
-	return $result;
-}
-function _DoImages_inline_callback($matches) {
-	global $md_empty_element_suffix, $md_escape_table;
-	$whole_match	= $matches[1];
-	$alt_text		= $matches[2];
-	$url			= $matches[3];
-	$title			= '';
-	if (isset($matches[6])) {
-		$title		= $matches[6];
-	}
-
-	$alt_text = str_replace('"', '&quot;', $alt_text);
-	$title    = str_replace('"', '&quot;', $title);
-	# We've got to encode these to avoid conflicting with italics/bold.
-	$url = str_replace(array('*', '_'),
-					   array($md_escape_table['*'], $md_escape_table['_']),
-					   $url);
-	$result = "<img src=\"$url\" alt=\"$alt_text\"";
-	if (isset($title)) {
-		$title = str_replace(array('*', '_'),
-							 array($md_escape_table['*'], $md_escape_table['_']),
-							 $title);
-		$result .=  " title=\"$title\""; # $title already quoted
-	}
-	$result .= $md_empty_element_suffix;
-
-	return $result;
-}
-
-
-function _DoHeaders($text) {
-	# Setext-style headers:
-	#	  Header 1
-	#	  ========
-	#  
-	#	  Header 2
-	#	  --------
-	#
-	$text = preg_replace(
-		array('{ ^(.+)[ \t]*\n=+[ \t]*\n+ }emx',
-			  '{ ^(.+)[ \t]*\n-+[ \t]*\n+ }emx'),
-		array("'<h1>'._RunSpanGamut(_UnslashQuotes('\\1')).'</h1>\n\n'",
-			  "'<h2>'._RunSpanGamut(_UnslashQuotes('\\1')).'</h2>\n\n'"),
-		$text);
-
-	# atx-style headers:
-	#	# Header 1
-	#	## Header 2
-	#	## Header 2 with closing hashes ##
-	#	...
-	#	###### Header 6
-	#
-	$text = preg_replace("{
-			^(\\#{1,6})	# $1 = string of #'s
-			[ \\t]*
-			(.+?)		# $2 = Header text
-			[ \\t]*
-			\\#*			# optional closing #'s (not counted)
-			\\n+
-		}xme",
-		"'<h'.strlen('\\1').'>'._RunSpanGamut(_UnslashQuotes('\\2')).'</h'.strlen('\\1').'>\n\n'",
-		$text);
-
-	return $text;
-}
-
-
-function _DoLists($text) {
-#
-# Form HTML ordered (numbered) and unordered (bulleted) lists.
-#
-	global $md_tab_width, $md_list_level;
-	$less_than_tab = $md_tab_width - 1;
-
-	# Re-usable patterns to match list item bullets and number markers:
-	$marker_ul  = '[*+-]';
-	$marker_ol  = '\d+[.]';
-	$marker_any = "(?:$marker_ul|$marker_ol)";
-
-	# Re-usable pattern to match any entirel ul or ol list:
-	$whole_list = '
-		(								# $1 = whole list
-		  (								# $2
-			[ ]{0,'.$less_than_tab.'}
-			('.$marker_any.')				# $3 = first list item marker
-			[ \t]+
-		  )
-		  (?s:.+?)
-		  (								# $4
-			  \z
-			|
-			  \n{2,}
-			  (?=\S)
-			  (?!						# Negative lookahead for another list item marker
-				[ \t]*
-				'.$marker_any.'[ \t]+
-			  )
-		  )
-		)
-	'; // mx
-	
-	# We use a different prefix before nested lists than top-level lists.
-	# See extended comment in _ProcessListItems().
-
-	if ($md_list_level) {
-		$text = preg_replace_callback('{
-				^
-				'.$whole_list.'
-			}mx',
-			'_DoLists_callback', $text);
-	}
-	else {
-		$text = preg_replace_callback('{
-				(?:(?<=\n\n)|\A\n?)
-				'.$whole_list.'
-			}mx',
-			'_DoLists_callback', $text);
-	}
-
-	return $text;
-}
-function _DoLists_callback($matches) {
-	# Re-usable patterns to match list item bullets and number markers:
-	$marker_ul  = '[*+-]';
-	$marker_ol  = '\d+[.]';
-	$marker_any = "(?:$marker_ul|$marker_ol)";
-	
-	$list = $matches[1];
-	$list_type = preg_match("/$marker_ul/", $matches[3]) ? "ul" : "ol";
-	# Turn double returns into triple returns, so that we can make a
-	# paragraph for the last item in a list, if necessary:
-	$list = preg_replace("/\n{2,}/", "\n\n\n", $list);
-	$result = _ProcessListItems($list, $marker_any);
-	$result = "<$list_type>\n" . $result . "</$list_type>\n";
-	return $result;
-}
-
-
-function _ProcessListItems($list_str, $marker_any) {
-#
-#	Process the contents of a single ordered or unordered list, splitting it
-#	into individual list items.
-#
-	global $md_list_level;
-	
-	# The $md_list_level global keeps track of when we're inside a list.
-	# Each time we enter a list, we increment it; when we leave a list,
-	# we decrement. If it's zero, we're not in a list anymore.
-	#
-	# We do this because when we're not inside a list, we want to treat
-	# something like this:
-	#
-	#		I recommend upgrading to version
-	#		8. Oops, now this line is treated
-	#		as a sub-list.
-	#
-	# As a single paragraph, despite the fact that the second line starts
-	# with a digit-period-space sequence.
-	#
-	# Whereas when we're inside a list (or sub-list), that line will be
-	# treated as the start of a sub-list. What a kludge, huh? This is
-	# an aspect of Markdown's syntax that's hard to parse perfectly
-	# without resorting to mind-reading. Perhaps the solution is to
-	# change the syntax rules such that sub-lists must start with a
-	# starting cardinal number; e.g. "1." or "a.".
-	
-	$md_list_level++;
-
-	# trim trailing blank lines:
-	$list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
-
-	$list_str = preg_replace_callback('{
-		(\n)?							# leading line = $1
-		(^[ \t]*)						# leading whitespace = $2
-		('.$marker_any.') [ \t]+		# list marker = $3
-		((?s:.+?)						# list item text   = $4
-		(\n{1,2}))
-		(?= \n* (\z | \2 ('.$marker_any.') [ \t]+))
-		}xm',
-		'_ProcessListItems_callback', $list_str);
-
-	$md_list_level--;
-	return $list_str;
-}
-function _ProcessListItems_callback($matches) {
-	$item = $matches[4];
-	$leading_line =& $matches[1];
-	$leading_space =& $matches[2];
-
-	if ($leading_line || preg_match('/\n{2,}/', $item)) {
-		$item = _RunBlockGamut(_Outdent($item));
-	}
-	else {
-		# Recursion for sub-lists:
-		$item = _DoLists(_Outdent($item));
-		$item = rtrim($item, "\n");
-		$item = _RunSpanGamut($item);
-	}
-
-	return "<li>" . $item . "</li>\n";
-}
-
-
-function _DoCodeBlocks($text) {
-#
-#	Process Markdown `<pre><code>` blocks.
-#
-	global $md_tab_width;
-	$text = preg_replace_callback("{
-			(?:\\n\\n|\\A)
-			(	            # $1 = the code block -- one or more lines, starting with a space/tab
-			  (?:
-				(?:[ ]\{$md_tab_width} | \\t)  # Lines must start with a tab or a tab-width of spaces
-				.*\\n+
-			  )+
-			)
-			((?=^[ ]{0,$md_tab_width}\\S)|\\Z)	# Lookahead for non-space at line-start, or end of doc
-		}xm",
-		'_DoCodeBlocks_callback', $text);
-
-	return $text;
-}
-function _DoCodeBlocks_callback($matches) {
-	$codeblock = $matches[1];
-
-	$codeblock = _EncodeCode(_Outdent($codeblock));
-//	$codeblock = _Detab($codeblock);
-	# trim leading newlines and trailing whitespace
-	$codeblock = preg_replace(array('/\A\n+/', '/\s+\z/'), '', $codeblock);
-
-	$result = "\n\n<pre><code>" . $codeblock . "\n</code></pre>\n\n";
-
-	return $result;
-}
-
-
-function _DoCodeSpans($text) {
-#
-# 	*	Backtick quotes are used for <code></code> spans.
-#
-# 	*	You can use multiple backticks as the delimiters if you want to
-# 		include literal backticks in the code span. So, this input:
-#
-#		  Just type ``foo `bar` baz`` at the prompt.
-#
-#	  	Will translate to:
-#
-#		  <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
-#
-#		There's no arbitrary limit to the number of backticks you
-#		can use as delimters. If you need three consecutive backticks
-#		in your code, use four for delimiters, etc.
-#
-#	*	You can use spaces to get literal backticks at the edges:
-#
-#		  ... type `` `bar` `` ...
-#
-#	  	Turns to:
-#
-#		  ... type <code>`bar`</code> ...
-#
-	$text = preg_replace_callback("@
-			(`+)		# $1 = Opening run of `
-			(.+?)		# $2 = The code block
-			(?<!`)
-			\\1
-			(?!`)
-		@xs",
-		'_DoCodeSpans_callback', $text);
-
-	return $text;
-}
-function _DoCodeSpans_callback($matches) {
-	$c = $matches[2];
-	$c = preg_replace('/^[ \t]*/', '', $c); # leading whitespace
-	$c = preg_replace('/[ \t]*$/', '', $c); # trailing whitespace
-	$c = _EncodeCode($c);
-	return "<code>$c</code>";
-}
-
-
-function _EncodeCode($_) {
-#
-# Encode/escape certain characters inside Markdown code runs.
-# The point is that in code, these characters are literals,
-# and lose their special Markdown meanings.
-#
-	global $md_escape_table;
-
-	# Encode all ampersands; HTML entities are not
-	# entities within a Markdown code span.
-	$_ = str_replace('&', '&amp;', $_);
-
-	# Do the angle bracket song and dance:
-	$_ = str_replace(array('<',    '>'), 
-					 array('&lt;', '&gt;'), $_);
-
-	# Now, escape characters that are magic in Markdown:
-	$_ = str_replace(array_keys($md_escape_table), 
-					 array_values($md_escape_table), $_);
-
-	return $_;
-}
-
-
-function _DoItalicsAndBold($text) {
-	# <strong> must go first:
-	$text = preg_replace('{ (\*\*|__) (?=\S) (.+?[*_]*) (?<=\S) \1 }sx',
-		'<strong>\2</strong>', $text);
-	# Then <em>:
-	$text = preg_replace('{ (\*|_) (?=\S) (.+?) (?<=\S) \1 }sx',
-		'<em>\2</em>', $text);
-
-	return $text;
-}
-
-
-function _DoBlockQuotes($text) {
-	$text = preg_replace_callback('/
-		  (								# Wrap whole match in $1
-			(
-			  ^[ \t]*>[ \t]?			# ">" at the start of a line
-				.+\n					# rest of the first line
-			  (.+\n)*					# subsequent consecutive lines
-			  \n*						# blanks
-			)+
-		  )
-		/xm',
-		'_DoBlockQuotes_callback', $text);
-
-	return $text;
-}
-function _DoBlockQuotes_callback($matches) {
-	$bq = $matches[1];
-	# trim one level of quoting - trim whitespace-only lines
-	$bq = preg_replace(array('/^[ \t]*>[ \t]?/m', '/^[ \t]+$/m'), '', $bq);
-	$bq = _RunBlockGamut($bq);		# recurse
-
-	$bq = preg_replace('/^/m', "  ", $bq);
-	# These leading spaces screw with <pre> content, so we need to fix that:
-	$bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx', 
-								'_DoBlockQuotes_callback2', $bq);
-
-	return "<blockquote>\n$bq\n</blockquote>\n\n";
-}
-function _DoBlockQuotes_callback2($matches) {
-	$pre = $matches[1];
-	$pre = preg_replace('/^  /m', '', $pre);
-	return $pre;
-}
-
-
-function _FormParagraphs($text) {
-#
-#	Params:
-#		$text - string to process with html <p> tags
-#
-	global $md_html_blocks;
-
-	# Strip leading and trailing lines:
-	$text = preg_replace(array('/\A\n+/', '/\n+\z/'), '', $text);
-
-	$grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
-
-	#
-	# Wrap <p> tags.
-	#
-	foreach ($grafs as $key => $value) {
-		if (!isset( $md_html_blocks[$value] )) {
-			$value = _RunSpanGamut($value);
-			$value = preg_replace('/^([ \t]*)/', '<p>', $value);
-			$value .= "</p>";
-			$grafs[$key] = $value;
-		}
-	}
-
-	#
-	# Unhashify HTML blocks
-	#
-	foreach ($grafs as $key => $value) {
-		if (isset( $md_html_blocks[$value] )) {
-			$grafs[$key] = $md_html_blocks[$value];
-		}
-	}
-
-	return implode("\n\n", $grafs);
-}
-
-
-function _EncodeAmpsAndAngles($text) {
-# Smart processing for ampersands and angle brackets that need to be encoded.
-
-	# Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
-	#   http://bumppo.net/projects/amputator/
-	$text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/', 
-						 '&amp;', $text);;
-
-	# Encode naked <'s
-	$text = preg_replace('{<(?![a-z/?\$!])}i', '&lt;', $text);
-
-	return $text;
-}
-
-
-function _EncodeBackslashEscapes($text) {
-#
-#	Parameter:  String.
-#	Returns:    The string, with after processing the following backslash
-#				escape sequences.
-#
-	global $md_escape_table, $md_backslash_escape_table;
-	# Must process escaped backslashes first.
-	return str_replace(array_keys($md_backslash_escape_table),
-					   array_values($md_backslash_escape_table), $text);
-}
-
-
-function _DoAutoLinks($text) {
-	$text = preg_replace("!<((https?|ftp):[^'\">\\s]+)>!", 
-						 '<a href="\1">\1</a>', $text);
-
-	# Email addresses: <address@domain.foo>
-	$text = preg_replace('{
-		<
-        (?:mailto:)?
-		(
-			[-.\w]+
-			\@
-			[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
-		)
-		>
-		}exi',
-		"_EncodeEmailAddress(_UnescapeSpecialChars(_UnslashQuotes('\\1')))",
-		$text);
-
-	return $text;
-}
-
-
-function _EncodeEmailAddress($addr) {
-#
-#	Input: an email address, e.g. "foo@example.com"
-#
-#	Output: the email address as a mailto link, with each character
-#		of the address encoded as either a decimal or hex entity, in
-#		the hopes of foiling most address harvesting spam bots. E.g.:
-#
-#	  <a href="&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;
-#		x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;">&#102;&#111;&#111;
-#		&#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>
-#
-#	Based by a filter by Matthew Wickline, posted to the BBEdit-Talk
-#	mailing list: <http://tinyurl.com/yu7ue>
-#
-	$addr = "mailto:" . $addr;
-	$length = strlen($addr);
-
-	# leave ':' alone (to spot mailto: later)
-	$addr = preg_replace_callback('/([^\:])/', 
-								  '_EncodeEmailAddress_callback', $addr);
-
-	$addr = "<a href=\"$addr\">$addr</a>";
-	# strip the mailto: from the visible part
-	$addr = preg_replace('/">.+?:/', '">', $addr);
-
-	return $addr;
-}
-function _EncodeEmailAddress_callback($matches) {
-	$char = $matches[1];
-	$r = rand(0, 100);
-	# roughly 10% raw, 45% hex, 45% dec
-	# '@' *must* be encoded. I insist.
-	if ($r > 90 && $char != '@') return $char;
-	if ($r < 45) return '&#x'.dechex(ord($char)).';';
-	return '&#'.ord($char).';';
-}
-
-
-function _UnescapeSpecialChars($text) {
-#
-# Swap back in all the special characters we've hidden.
-#
-	global $md_escape_table;
-	return str_replace(array_values($md_escape_table), 
-					   array_keys($md_escape_table), $text);
-}
-
-
-# _TokenizeHTML is shared between PHP Markdown and PHP SmartyPants.
-# We only define it if it is not already defined.
-if (!function_exists('_TokenizeHTML')) :
-function _TokenizeHTML($str) {
-#
-#   Parameter:  String containing HTML markup.
-#   Returns:    An array of the tokens comprising the input
-#               string. Each token is either a tag (possibly with nested,
-#               tags contained therein, such as <a href="<MTFoo>">, or a
-#               run of text between tags. Each element of the array is a
-#               two-element array; the first is either 'tag' or 'text';
-#               the second is the actual value.
-#
-#
-#   Regular expression derived from the _tokenize() subroutine in 
-#   Brad Choate's MTRegex plugin.
-#   <http://www.bradchoate.com/past/mtregex.php>
-#
-	$index = 0;
-	$tokens = array();
-
-	$match = '(?s:<!(?:--.*?--\s*)+>)|'.	# comment
-			 '(?s:<\?.*?\?>)|'.				# processing instruction
-			 '(?:</?[\w:$]+\b(?>[^"\'>]+|"[^"]*"|\'[^\']*\')*>)'; # regular tags
-
-	$parts = preg_split("{($match)}", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
-
-	foreach ($parts as $part) {
-		if (++$index % 2 && $part != '') 
-			array_push($tokens, array('text', $part));
-		else
-			array_push($tokens, array('tag', $part));
-	}
-
-	return $tokens;
-}
-endif;
-
-
-function _Outdent($text) {
-#
-# Remove one level of line-leading tabs or spaces
-#
-	global $md_tab_width;
-	return preg_replace("/^(\\t|[ ]{1,$md_tab_width})/m", "", $text);
-}
-
-
-function _Detab($text) {
-#
-# Replace tabs with the appropriate amount of space.
-#
-	global $md_tab_width;
-
-	# For each line we separate the line in blocks delemited by
-	# tab characters. Then we reconstruct the line adding the appropriate
-	# number of space charcters.
-	
-	$lines = explode("\n", $text);
-	$text = "";
-	
-	foreach ($lines as $line) {
-		# Split in blocks.
-		$blocks = explode("\t", $line);
-		# Add each blocks to the line.
-		$line = $blocks[0];
-		unset($blocks[0]); # Do not add first block twice.
-		foreach ($blocks as $block) {
-			# Calculate amount of space, insert spaces, insert block.
-			$amount = $md_tab_width - strlen($line) % $md_tab_width;
-			$line .= str_repeat(" ", $amount) . $block;
-		}
-		$text .= "$line\n";
-	}
-	return $text;
-}
-
-
-function _UnslashQuotes($text) {
-#
-#	This function is useful to remove automaticaly slashed double quotes
-#	when using preg_replace and evaluating an expression.
-#	Parameter:  String.
-#	Returns:    The string with any slash-double-quote (\") sequence replaced
-#				by a single double quote.
-#
-	return str_replace('\"', '"', $text);
-}
-
-
-/*
-
-PHP Markdown
-============
-
-Description
------------
-
-This is a PHP translation of the original Markdown formatter written in
-Perl by John Gruber.
-
-Markdown is a text-to-HTML filter; it translates an easy-to-read /
-easy-to-write structured text format into HTML. Markdown's text format
-is most similar to that of plain text email, and supports features such
-as headers, *emphasis*, code blocks, blockquotes, and links.
-
-Markdown's syntax is designed not as a generic markup language, but
-specifically to serve as a front-end to (X)HTML. You can use span-level
-HTML tags anywhere in a Markdown document, and you can use block level
-HTML tags (like <div> and <table> as well).
-
-For more information about Markdown's syntax, see:
-
-<http://daringfireball.net/projects/markdown/>
-
-
-Bugs
-----
-
-To file bug reports please send email to:
-
-<michel.fortin@michelf.com>
-
-Please include with your report: (1) the example input; (2) the output you
-expected; (3) the output Markdown actually produced.
-
-
-Version History
---------------- 
-
-See the readme file for detailed release notes for this version.
-
-1.0.1 - 17 Dec 2004
-
-1.0 - 21 Aug 2004
-
-
-Author & Contributors
----------------------
-
-Original Perl version by John Gruber  
-<http://daringfireball.net/>
-
-PHP port and other contributions by Michel Fortin  
-<http://www.michelf.com/>
-
-
-Copyright and License
----------------------
-
-Copyright (c) 2004 Michel Fortin  
-<http://www.michelf.com/>  
-All rights reserved.
-
-Copyright (c) 2003-2004 John Gruber   
-<http://daringfireball.net/>   
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-*	Redistributions of source code must retain the above copyright notice,
-	this list of conditions and the following disclaimer.
-
-*	Redistributions in binary form must reproduce the above copyright
-	notice, this list of conditions and the following disclaimer in the
-	documentation and/or other materials provided with the distribution.
-
-*	Neither the name "Markdown" nor the names of its contributors may
-	be used to endorse or promote products derived from this software
-	without specific prior written permission.
-
-This software is provided by the copyright holders and contributors "as
-is" and any express or implied warranties, including, but not limited
-to, the implied warranties of merchantability and fitness for a
-particular purpose are disclaimed. In no event shall the copyright owner
-or contributors be liable for any direct, indirect, incidental, special,
-exemplary, or consequential damages (including, but not limited to,
-procurement of substitute goods or services; loss of use, data, or
-profits; or business interruption) however caused and on any theory of
-liability, whether in contract, strict liability, or tort (including
-negligence or otherwise) arising in any way out of the use of this
-software, even if advised of the possibility of such damage.
-
-*/
-?>
\ No newline at end of file
diff -ruN 1.5.2/wp-content/plugins/textile1.php 2.0.4/wp-content/plugins/textile1.php
--- 1.5.2/wp-content/plugins/textile1.php	2005-03-09 15:39:01.000000000 -0600
+++ 2.0.4/wp-content/plugins/textile1.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,390 +0,0 @@
-<?php
-/*
-Plugin Name: Textile 1
-Version: 1.0
-Plugin URI: http://www.huddledmasses.org/
-Description: This is a simple wrapper for <a href="http://textism.com/?wp">Dean Allen's</a> Humane Web Text Generator, also known as <a href="http://www.textism.com/tools/textile/">Textile</a>. If you use this plugin you should disable Textile 2 and Markdown, as they don't play well together.
-Author: Dean Allen
-Author URI: http://www.textism.com/?wp
-*/
-
-/*
-
-This is Textile
-A Humane Web Text Generator
-
-Version 1.0
-21 Feb, 2003
-
-Copyright (c) 2003, Dean Allen, www.textism.com
-All rights reserved.
-
-_______
-LICENSE
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice,
-  this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-* Neither the name Textile nor the names of its contributors may be used to
-  endorse or promote products derived from this software without specific
-  prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-
-	function textile($text) {
-	$text = stripslashes($text);
-
-	$text = preg_replace("/&(?![#a-zA-Z0-9]+;)/","x%x%",$text);
-
-	if (function_exists('mb_encode_numericentity')) {
-		$text = encode_high($text);
-	} else {
-		$text = htmlentities($text,ENT_NOQUOTES,"utf-8");
-	}
-
-	$text = str_replace(array("&gt;", "&lt;", "&amp;"), array(">", "<", "&"), $text);
-
-	$text = str_replace("\r\n", "\n", $text);
-
-	$text = str_replace("\t", "", $text);
-
-	$text = preg_split("/\n/",$text);
-	foreach($text as $line){
-		$line = rtrim($line);
-		$lineout[] = $line;
-	}
-
-	$text = implode("\n",$lineout);
-
-	$text = preg_replace('/(^|\s)==(.*)==(\s|$)?/msU','$1<notextile>$2</notextile>$3',$text);
-
-	$text = preg_replace('/!([^\s\(=]+)\s?(?:\(([^\)]+)\))?!(\s)?/mU','<img src="$1" alt="$2" border="0" />$3',$text);
-
-	$text = preg_replace('/(<img.+ \/>):(\S+)(\s)/U','<a href="$2">$1</a>$3',$text);
-
-	$text = preg_replace(
-		'/
-		([\s[{(]|[[:punct:]])?		# 1 optional space or brackets before
-		"							#   starting "
-		([^"\(]+)					# 2 text of link
-		\s?							#   opt space
-		(?:\(([^\(]*)\))?			# 3 opt title attribute in parenths
-		":							#   dividing ":
-		(\S+\b)						# 4 suppose this is the url
-		(\/)?						# 5 opt trailing slash
-		([^[:alnum:]\/;]*)			# 6 opt punctuation after the url
-		(\s|$)						# 7 either white space or end of string
-		/x',
-		'$1<a href="$4$5" title="$3">$2</a>$6$7',$text);
-
-	$qtags = array(
-		'\*\*'=>'b',
-		'\*'=>'strong',
-		'\?\?'=>'cite',
-		'-'=>'del',
-		'\+'=>'ins',
-		'~'=>'sub',
-		'@'=>'code');
-
-	foreach($qtags as $f=>$r){
-		$text = preg_replace(
-			'/(^|\s|>)'.$f.'\b(.+)\b([[:punct:]]*)'.$f.'([[:punct:]]{0,2})(\s|$)?/mU',
-			'$1<'.$r.'>$2$3</'.$r.'>$4$5',
-			$text);
-	}
-
-	$text = preg_replace('/(^|\s)__(.*)__([[:punct:]]{0,2})(\s|$)?/mU','$1<i>$2</i>$3$4',$text);
-	$text = preg_replace('/(^|\s)_(.*)_([[:punct:]]{0,2})(\s|$)?/mU','$1<em>$2</em>$3$4',$text);
-
-	$text = preg_replace('/\^(.*)\^/mU','<sup>$1</sup>',$text);
-
-	$text = preg_replace('/"$/',"\" ", $text);
-	$glyph_search = array(
-		'/([^\s[{(>])?\'(?(1)|(?=\s|s\b))/',					# single closing
-		'/\'/',													# single opening
-		'/([^\s[{(])?"(?(1)|(?=\s))/',							# double closing
-		'/"/',													# double opening
-		'/\b( )?\.{3}/',										# ellipsis
-		'/\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/',			# 3+ uppercase acronym
-		'/(^|[^"][>\s])([A-Z][A-Z0-9 ]{2,})([^<a-z0-9]|$)/',	# 3+ uppercase caps
-		'/\s?--\s?/',											# em dash
-		'/\s-\s/',												# en dash
-		'/(\d+) ?x ?(\d+)/',									# dimension sign
-		'/\b ?[([]TM[])]/i',									# trademark
-		'/\b ?[([]R[])]/i',										# registered
-		'/\b ?[([]C[])]/i');									# copyright
-
-	$glyph_replace = array(
-		'$1&#8217;$2',							# single closing
-		'&#8216;',								# single opening
-		'$1&#8221;',							# double closing
-		'&#8220;',								# double opening
-		'$1&#8230;',							# ellipsis
-		'<acronym title="$2">$1</acronym>',		# 3+ uppercase acronym
-		'$1<span class="caps">$2</span>$3',		# 3+ uppercase caps
-		'&#8212;',								# em dash
-		' &#8211; ',							# en dash
-		'$1&#215;$2',							# dimension sign
-		'&#8482;',								# trademark
-		'&#174;',								# registered
-		'&#169;');								# copyright
-
-	$codepre = false;
-
-	if(!preg_match("/<.*>/",$text)){
-		$text = preg_replace($glyph_search,$glyph_replace,$text);
-	} else {
-
-		$text = preg_split("/(<.*>)/U",$text,-1,PREG_SPLIT_DELIM_CAPTURE);
-			foreach($text as $line){
-
-					# matches are off if we're between <code>, <pre> etc.
-				if(preg_match('/<(code|pre|kbd|notextile)>/i',$line)){$codepre = true; }
-				if(preg_match('/<\/(code|pre|kbd|notextile)>/i',$line)){$codepre = false; }
-
-				if(!preg_match("/<.*>/",$line) && $codepre == false){
-					$line = preg_replace($glyph_search,$glyph_replace,$line);
-				}
-
-				# convert htmlspecial if between <code>
-				if ($codepre == true){
-					$line = htmlspecialchars($line,ENT_NOQUOTES,"UTF-8");
-					$line = str_replace("&lt;pre&gt;","<pre>",$line);
-					$line = str_replace("&lt;code&gt;","<code>",$line);
-					$line = str_replace("&lt;notextile&gt;","<notextile>",$line);
-					$line = str_replace("&lt;kbd&gt;","<kbd>",$line);
-				}
-
-				# each line gets pushed to a new array
-			$glyph_out[] = $line;
-		}
-			# $text is now the new array, cast to a string
-		$text = implode('',$glyph_out);
-	}
-
-	$text = preg_replace("/(\S)(_*)([[:punct:]]*) *\n([^#*\s])/", "$1$2$3<br />$4", $text);
-
-	$text = str_replace("l><br />", "l>\n", $text);
-
-	$text = preg_split("/\n/",$text);
-
-	array_push($text," ");
-
-			$list = '';
-			$pre = false;
-
-			$block_find = array(
-				'/^\s?\*\s(.*)/',						# bulleted list *
-				'/^\s?#\s(.*)/',						# numeric list #
-				'/^bq\. (.*)/',							# blockquote bq.
-				'/^h(\d)\(([[:alnum:]]+)\)\.\s(.*)/',	# header hn(class).  w/ css class
-				'/^h(\d)\. (.*)/',						# plain header hn.
-				'/^p\(([[:alnum:]]+)\)\.\s(.*)/',		# para p(class).  w/ css class
-				'/^p\. (.*)/i',	 						# plain paragraph
-				'/^([^\t ]+.*)/i'						# remaining plain paragraph
-				);
-
-			$block_replace = array(
-				"\t\t<li>$1</li>",
-				"\t\t\t<li>$1</li>",
-				"\t<blockquote>$1</blockquote>",
-				"\t<h$1 class=\"$2\">$3</h$1>$4",
-				"\t<h$1>$2</h$1>$3",
-				"\t<p class=\"$1\">$2</p>$3",
-				"\t<p>$1</p>",
-				"\t<p>$1</p>$2"
-				);
-
-	foreach($text as $line){
-
-			if(preg_match('/<pre>/i',$line)){$pre = true; }
-
-			if ($pre == false){
-				$line = preg_replace($block_find,$block_replace,$line);
-			}
-
-			if ($pre == true){
-				$line = str_replace("<br />","\n",$line);
-			}
-				if(preg_match('/<\/pre>/i',$line)){$pre = false; }
-
-			if ($list == '' && preg_match('/^\t\t<li>/',$line)){
-					$list = "ul";
-				$line = preg_replace('/^(\t\t<li>.*)/',"\t<ul>\n$1",$line);
-
-			} else if ($list == '' && preg_match('/^\t\t\t<li>/',$line)){
-					$list = "ol";
-				$line = preg_replace('/^\t(\t\t<li>.*)/',"\t<ol>\n$1",$line);
-
-			# at the end of a ul
-			} else if ($list == 'ul' && !preg_match('/^\t\t<li>/',$line)){
-					$list = '';
-				$line = preg_replace('/^(.*)$/',"\t</ul>\n$1",$line);
-
-			# at the end of a ol
-			} else if ($list == 'ol' && !preg_match('/^\t\t\t<li>/',$line)){
-					$list = '';
-				$line = preg_replace('/^(.*)$/',"\t</ol>\n$1",$line);
-			}
-
-			$block_out[] = $line;
-	}
-	$text = implode("\n",$block_out);
-	$text = preg_replace('/<\/?notextile>/', "",$text);
-	$text = str_replace("x%x%","&#38;",$text);
-	$text = str_replace("<br />","<br />\n",$text);
-	return $text;
-}
-
-function callback_url($text,$title='',$url) {
-		$out = 'a href="'.$url.'"';
-		$out.=($title!='')?' title="'.$title.'"':'';
-		$out.='>$text</a>';
-		return $out;
-	}
-
-
-
-function textile_popup_help($name,$helpvar,$windowW,$windowH) {
-	$out = $name;
-	$out .= ' <a target="_blank" href="http://www.textpattern.com/help/?item='.$helpvar.'"';
-	$out .= ' onclick="window.open(this.href, \'popupwindow\', \'width='.$windowW.',height='.$windowH.',scrollbars,resizable\'); return false;" style="color:blue;background-color:#ddd">?</a><br />';
-	print $out;
-}
-
-
-function encode_high($text) {
-	$cmap = cmap();
-	return mb_encode_numericentity($text, $cmap, "UTF-8");
-}
-
-
-function decode_high($text) {
-	$cmap = cmap();
-	return mb_decode_numericentity($text, $cmap, "UTF-8");
-}
-
-
-function cmap() {
-
-	$f = 0xffff;
-
-	$cmap = array(
-	 160,  255,  0, $f,
-	 402,  402,  0, $f,
-	 913,  929,  0, $f,
-	 931,  937,  0, $f,
-	 945,  969,  0, $f,
-	 977,  978,  0, $f,
-	 982,  982,  0, $f,
-	 8226, 8226, 0, $f,
-	 8230, 8230, 0, $f,
-	 8242, 8243, 0, $f,
-	 8254, 8254, 0, $f,
-	 8260, 8260, 0, $f,
-	 8465, 8465, 0, $f,
-	 8472, 8472, 0, $f,
-	 8476, 8476, 0, $f,
-	 8482, 8482, 0, $f,
-	 8501, 8501, 0, $f,
-	 8592, 8596, 0, $f,
-	 8629, 8629, 0, $f,
-	 8656, 8660, 0, $f,
-	 8704, 8704, 0, $f,
-	 8706, 8707, 0, $f,
-	 8709, 8709, 0, $f,
-	 8711, 8713, 0, $f,
-	 8715, 8715, 0, $f,
-	 8719, 8719, 0, $f,
-	 8721, 8722, 0, $f,
-	 8727, 8727, 0, $f,
-	 8730, 8730, 0, $f,
-	 8733, 8734, 0, $f,
-	 8736, 8736, 0, $f,
-	 8743, 8747, 0, $f,
-	 8756, 8756, 0, $f,
-	 8764, 8764, 0, $f,
-	 8773, 8773, 0, $f,
-	 8776, 8776, 0, $f,
-	 8800, 8801, 0, $f,
-	 8804, 8805, 0, $f,
-	 8834, 8836, 0, $f,
-	 8838, 8839, 0, $f,
-	 8853, 8853, 0, $f,
-	 8855, 8855, 0, $f,
-	 8869, 8869, 0, $f,
-	 8901, 8901, 0, $f,
-	 8968, 8971, 0, $f,
-	 9001, 9002, 0, $f,
-	 9674, 9674, 0, $f,
-	 9824, 9824, 0, $f,
-	 9827, 9827, 0, $f,
-	 9829, 9830, 0, $f,
-	 338,  339,  0, $f,
-	 352,  353,  0, $f,
-	 376,  376,  0, $f,
-	 710,  710,  0, $f,
-	 732,  732,  0, $f,
-	 8194, 8195, 0, $f,
-	 8201, 8201, 0, $f,
-	 8204, 8207, 0, $f,
-	 8211, 8212, 0, $f,
-	 8216, 8218, 0, $f,
-	 8218, 8218, 0, $f,
-	 8220, 8222, 0, $f,
-	 8224, 8225, 0, $f,
-	 8240, 8240, 0, $f,
-	 8249, 8250, 0, $f,
-	 8364, 8364, 0, $f
-	 );
-
-	return $cmap;
-}
-
-
-function linkit($text,$title,$url){
-    $url = preg_replace("/&(?!amp;)/","&amp;",$url);
-    $out = '<a href="'.$url;
-    if ($title!='') {
-		$title = trim($title);
-        $out .= ' title="'.$title;
-    }
-    $out .= '>'.$text.'</a>';
-
-    return $out;
-}
-
-// And now for the filters
-remove_filter('the_content', 'wpautop');
-remove_filter('the_excerpt', 'wpautop');
-remove_filter('comment_text', 'wpautop');
-
-remove_filter('the_content', 'wptexturize');
-remove_filter('the_excerpt', 'wptexturize');
-remove_filter('comment_text', 'wptexturize');
-
-add_filter('the_content', 'textile', 6);
-add_filter('the_excerpt', 'textile', 6);
-add_filter('comment_text', 'textile', 6);
-
-?>
\ No newline at end of file
diff -ruN 1.5.2/wp-content/plugins/wp-db-backup.php 2.0.4/wp-content/plugins/wp-db-backup.php
--- 1.5.2/wp-content/plugins/wp-db-backup.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-content/plugins/wp-db-backup.php	2006-07-26 17:56:56.000000000 -0500
@@ -0,0 +1,896 @@
+<?php
+/*
+Plugin Name: WordPress Database Backup
+Plugin URI: http://www.skippy.net/blog/plugins/
+Description: On-demand backup of your WordPress database.
+Author: Scott Merrill
+Version: 1.7
+Author URI: http://www.skippy.net/
+
+Much of this was modified from Mark Ghosh's One Click Backup, which
+in turn was derived from phpMyAdmin.
+
+Many thanks to Owen (http://asymptomatic.net/wp/) for his patch
+   http://dev.wp-plugins.org/ticket/219
+*/
+
+// CHANGE THIS IF YOU WANT TO USE A 
+// DIFFERENT BACKUP LOCATION
+
+$rand = substr( md5( md5( DB_PASSWORD ) ), -5 );
+
+define('WP_BACKUP_DIR', 'wp-content/backup-' . $rand);
+
+define('ROWS_PER_SEGMENT', 100);
+
+class wpdbBackup {
+
+	var $backup_complete = false;
+	var $backup_file = '';
+	var $backup_dir = WP_BACKUP_DIR;
+	var $backup_errors = array();
+	var $basename;
+
+	function gzip() {
+		return function_exists('gzopen');
+	}
+
+	function wpdbBackup() {
+		add_action('wp_cron_daily', array(&$this, 'wp_cron_daily'));
+
+		$this->backup_dir = trailingslashit($this->backup_dir);
+		$this->basename = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', __FILE__);
+	
+		if (isset($_POST['do_backup'])) {
+			if ( !current_user_can('import') ) die(__('You are not allowed to perform backups.'));
+			switch($_POST['do_backup']) {
+			case 'backup':
+				$this->perform_backup();
+				break;
+			case 'fragments':
+				add_action('admin_menu', array(&$this, 'fragment_menu'));
+				break;				
+			}
+		} elseif (isset($_GET['fragment'] )) {
+			if ( !current_user_can('import') ) die(__('You are not allowed to perform backups.'));
+			add_action('init', array(&$this, 'init'));
+		} elseif (isset($_GET['backup'] )) {
+			if ( !current_user_can('import') ) die(__('You are not allowed to perform backups.'));
+			add_action('init', array(&$this, 'init'));
+		} else {
+			add_action('admin_menu', array(&$this, 'admin_menu'));
+		}
+	}
+	
+	function init() {
+		if ( !current_user_can('import') ) die(__('You are not allowed to perform backups.'));
+
+		if (isset($_GET['backup'])) {
+			$via = isset($_GET['via']) ? $_GET['via'] : 'http';
+			
+			$this->backup_file = $_GET['backup'];
+			
+			switch($via) {
+			case 'smtp':
+			case 'email':
+				$this->deliver_backup ($this->backup_file, 'smtp', $_GET['recipient']);
+				echo '
+					<!-- ' . $via . ' -->
+					<script type="text/javascript"><!--\\
+				';
+				if($this->backup_errors) {
+					foreach($this->backup_errors as $error) {
+						echo "window.parent.addError('$error');\n";
+					}
+				}
+				echo '
+					alert("' . __('Backup Complete!') . '");
+					</script>
+				';
+				break;
+			default:
+				$this->deliver_backup ($this->backup_file, $via);
+			}
+			die();
+		}
+		if (isset($_GET['fragment'] )) {
+			list($table, $segment, $filename) = explode(':', $_GET['fragment']);
+			$this->backup_fragment($table, $segment, $filename);
+		}
+
+		die();
+	}
+	
+	function build_backup_script() {
+		global $table_prefix, $wpdb;
+	
+		$datum = date("Ymd_B");
+		$backup_filename = DB_NAME . "_$table_prefix$datum.sql";
+		if ($this->gzip()) $backup_filename .= '.gz';
+		
+		echo "<div class='wrap'>";
+		//echo "<pre>" . print_r($_POST, 1) . "</pre>";
+		echo '<h2>' . __('Backup') . '</h2>
+			<fieldset class="options"><legend>' . __('Progress') . '</legend>
+			<p><strong>' .
+				__('DO NOT DO THE FOLLOWING AS IT WILL CAUSE YOUR BACKUP TO FAIL:').
+			'</strong></p>
+			<ol>
+				<li>'.__('Close this browser').'</li>
+				<li>'.__('Reload this page').'</li>
+				<li>'.__('Click the Stop or Back buttons in your browser').'</li>
+			</ol>
+			<p><strong>' . __('Progress:') . '</strong></p>
+			<div id="meterbox" style="height:11px;width:80%;padding:3px;border:1px solid #659fff;"><div id="meter" style="height:11px;background-color:#659fff;width:0%;text-align:center;font-size:6pt;">&nbsp;</div></div>
+			<div id="progress_message"></div>
+			<div id="errors"></div>
+			</fieldset>
+			<iframe id="backuploader" src="about:blank" style="border:0px solid white;height:1em;width:1em;"></iframe>
+			<script type="text/javascript"><!--//
+			function setMeter(pct) {
+				var meter = document.getElementById("meter");
+				meter.style.width = pct + "%";
+				meter.innerHTML = Math.floor(pct) + "%";
+			}
+			function setProgress(str) {
+				var progress = document.getElementById("progress_message");
+				progress.innerHTML = str;
+			}
+			function addError(str) {
+				var errors = document.getElementById("errors");
+				errors.innerHTML = errors.innerHTML + str + "<br />";
+			}
+
+			function backup(table, segment) {
+				var fram = document.getElementById("backuploader");				
+				fram.src = "' . $_SERVER['REQUEST_URI'] . '&fragment=" + table + ":" + segment + ":' . $backup_filename . '";
+			}
+			
+			var curStep = 0;
+			
+			function nextStep() {
+				backupStep(curStep);
+				curStep++;
+			}
+			
+			function finishBackup() {
+				var fram = document.getElementById("backuploader");				
+				setMeter(100);
+		';
+
+		$this_basename = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', __FILE__);
+		$download_uri = get_settings('siteurl') . "/wp-admin/edit.php?page={$this_basename}&backup={$backup_filename}";
+		switch($_POST['deliver']) {
+		case 'http':
+			echo '
+				setProgress("' . sprintf(__("Backup complete, preparing <a href=\\\"%s\\\">backup</a> for download..."), $download_uri) . '");
+				fram.src = "' . $download_uri . '";
+			';
+			break;
+		case 'smtp':
+			echo '
+				setProgress("' . sprintf(__("Backup complete, sending <a href=\\\"%s\\\">backup</a> via email..."), $download_uri) . '");
+				fram.src = "' . $download_uri . '&via=email&recipient=' . $_POST['backup_recipient'] . '";
+			';
+			break;
+		default:
+			echo '
+				setProgress("' . sprintf(__("Backup complete, download <a href=\\\"%s\\\">here</a>."), $download_uri) . '");
+			';
+		}
+		
+		echo '
+			}
+			
+			function backupStep(step) {
+				switch(step) {
+				case 0: backup("", 0); break;
+		';
+		
+		$also_backup = array();
+		if (isset($_POST['other_tables'])) {
+			$also_backup = $_POST['other_tables'];
+		} else {
+			$also_backup = array();
+		}
+		$core_tables = $_POST['core_tables'];
+		$tables = array_merge($core_tables, $also_backup);
+		$step_count = 1;
+		foreach ($tables as $table) {
+			$rec_count = $wpdb->get_var("SELECT count(*) FROM {$table}");
+			$rec_segments = ceil($rec_count / ROWS_PER_SEGMENT);
+			$table_count = 0;
+			do {
+				echo "case {$step_count}: backup(\"{$table}\", {$table_count}); break;\n";
+				$step_count++;
+				$table_count++;
+			} while($table_count < $rec_segments);
+			echo "case {$step_count}: backup(\"{$table}\", -1); break;\n";
+			$step_count++;
+		}
+		echo "case {$step_count}: finishBackup(); break;";
+		
+		echo '
+				}
+				if(step != 0) setMeter(100 * step / ' . $step_count . ');
+			}
+
+			nextStep();
+			//--></script>
+	</div>
+		';
+	}
+
+	function backup_fragment($table, $segment, $filename) {
+		global $table_prefix, $wpdb;
+			
+		echo "$table:$segment:$filename";
+		
+		if($table == '') {
+			$msg = __('Creating backup file...');
+		} else {
+			if($segment == -1) {
+				$msg = sprintf(__('Finished backing up table \\"%s\\".'), $table);
+			} else {
+				$msg = sprintf(__('Backing up table \\"%s\\"...'), $table);
+			}
+		}
+		
+		echo '<script type="text/javascript"><!--//
+		var msg = "' . $msg . '";
+		window.parent.setProgress(msg);
+		';
+			
+		if (is_writable(ABSPATH . $this->backup_dir)) {
+			$this->fp = $this->open(ABSPATH . $this->backup_dir . $filename, 'a');
+			if(!$this->fp) {
+				$this->backup_error(__('Could not open the backup file for writing!'));
+				$this->fatal_error = __('The backup file could not be saved.  Please check the permissions for writing to your backup directory and try again.');
+			}
+			else {
+				if($table == '') {		
+					//Begin new backup of MySql
+					$this->stow("# WordPress MySQL database backup\n");
+					$this->stow("#\n");
+					$this->stow("# Generated: " . date("l j. F Y H:i T") . "\n");
+					$this->stow("# Hostname: " . DB_HOST . "\n");
+					$this->stow("# Database: " . $this->backquote(DB_NAME) . "\n");
+					$this->stow("# --------------------------------------------------------\n");
+				} else {
+					if($segment == 0) {
+						// Increase script execution time-limit to 15 min for every table.
+						if ( !ini_get('safe_mode')) @set_time_limit(15*60);
+						//ini_set('memory_limit', '16M');
+						// Create the SQL statements
+						$this->stow("# --------------------------------------------------------\n");
+						$this->stow("# Table: " . $this->backquote($table) . "\n");
+						$this->stow("# --------------------------------------------------------\n");
+					}			
+					$this->backup_table($table, $segment);
+				}
+			}
+		} else {
+			$this->backup_error(__('The backup directory is not writeable!'));
+			$this->fatal_error = __('The backup directory is not writeable!  Please check the permissions for writing to your backup directory and try again.');
+		}
+
+		if($this->fp) $this->close($this->fp);
+		
+		if($this->backup_errors) {
+			foreach($this->backup_errors as $error) {
+				echo "window.parent.addError('$error');\n";
+			}
+		}
+		if($this->fatal_error) {
+			echo '
+				alert("' . addslashes($this->fatal_error) . '");
+				//--></script>
+			';
+		}
+		else {
+			echo '
+				window.parent.nextStep();
+				//--></script>
+			';
+		}
+		
+		die();
+	}
+
+	function perform_backup() {
+		// are we backing up any other tables?
+		$also_backup = array();
+		if (isset($_POST['other_tables'])) {
+			$also_backup = $_POST['other_tables'];
+		}
+		
+		$core_tables = $_POST['core_tables'];
+		$this->backup_file = $this->db_backup($core_tables, $also_backup);
+		if (FALSE !== $this->backup_file) {
+			if ('smtp' == $_POST['deliver']) {
+				$this->deliver_backup ($this->backup_file, $_POST['deliver'], $_POST['backup_recipient']);
+			} elseif ('http' == $_POST['deliver']) {
+				$this_basename = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', __FILE__);
+				header('Refresh: 3; ' . get_settings('siteurl') . "/wp-admin/edit.php?page={$this_basename}&backup={$this->backup_file}");
+			}
+			// we do this to say we're done.
+			$this->backup_complete = true;
+		}
+	}
+	
+	///////////////////////////////
+	function admin_menu() {
+		add_management_page(__('Backup'), __('Backup'), 'import', basename(__FILE__), array(&$this, 'backup_menu'));
+	}
+
+	function fragment_menu() {
+		add_management_page(__('Backup'), __('Backup'), 'import', basename(__FILE__), array(&$this, 'build_backup_script'));
+	}
+
+	/////////////////////////////////////////////////////////
+	function sql_addslashes($a_string = '', $is_like = FALSE)
+	{
+	        /*
+	                Better addslashes for SQL queries.
+	                Taken from phpMyAdmin.
+	        */
+	    if ($is_like) {
+	        $a_string = str_replace('\\', '\\\\\\\\', $a_string);
+	    } else {
+	        $a_string = str_replace('\\', '\\\\', $a_string);
+	    }
+	    $a_string = str_replace('\'', '\\\'', $a_string);
+
+	    return $a_string;
+	} // function sql_addslashes($a_string = '', $is_like = FALSE)
+
+	///////////////////////////////////////////////////////////
+	function backquote($a_name)
+	{
+	        /*
+	                Add backqouotes to tables and db-names in
+	                SQL queries. Taken from phpMyAdmin.
+	        */
+	    if (!empty($a_name) && $a_name != '*') {
+	        if (is_array($a_name)) {
+	             $result = array();
+	             reset($a_name);
+	             while(list($key, $val) = each($a_name)) {
+	                 $result[$key] = '`' . $val . '`';
+	             }
+	             return $result;
+	        } else {
+	            return '`' . $a_name . '`';
+	        }
+	    } else {
+	        return $a_name;
+	    }
+	} // function backquote($a_name, $do_it = TRUE)
+
+	/////////////
+	function open($filename = '', $mode = 'w') {
+		if ('' == $filename) return false;
+		if ($this->gzip()) {
+			$fp = @gzopen($filename, $mode);
+		} else {
+			$fp = @fopen($filename, $mode);
+		}
+		return $fp;
+	}
+
+	//////////////
+	function close($fp) {
+		if ($this->gzip()) {
+			gzclose($fp);
+		} else {
+			fclose($fp);
+		}
+	}
+	
+	//////////////
+	function stow($query_line) {
+		if ($this->gzip()) {
+			if(@gzwrite($this->fp, $query_line) === FALSE) {
+				backup_error(__('There was an error writing a line to the backup script:'));
+				backup_error('&nbsp;&nbsp;' . $query_line);
+			}
+		} else {
+			if(@fwrite($this->fp, $query_line) === FALSE) {
+				backup_error(__('There was an error writing a line to the backup script:'));
+				backup_error('&nbsp;&nbsp;' . $query_line);
+			}
+		}
+	}
+	
+	function backup_error($err) {
+		if(count($this->backup_errors) < 20) {
+			$this->backup_errors[] = $err;
+		} elseif(count($this->backup_errors) == 20) {
+			$this->backup_errors[] = __('Subsequent errors have been omitted from this log.');
+		}
+	}
+	
+	/////////////////////////////
+	function backup_table($table, $segment = 'none') {
+		global $wpdb;
+		
+		/*
+		Taken partially from phpMyAdmin and partially from
+		Alain Wolf, Zurich - Switzerland
+		Website: http://restkultur.ch/personal/wolf/scripts/db_backup/
+		
+		Modified by Scott Merril (http://www.skippy.net/) 
+		to use the WordPress $wpdb object
+		*/
+
+		$table_structure = $wpdb->get_results("DESCRIBE $table");
+		if (! $table_structure) {
+			backup_errors(__('Error getting table details') . ": $table");
+			return FALSE;
+		}
+	
+		if(($segment == 'none') || ($segment == 0)) {
+			//
+			// Add SQL statement to drop existing table
+			$this->stow("\n\n");
+			$this->stow("#\n");
+			$this->stow("# Delete any existing table " . $this->backquote($table) . "\n");
+			$this->stow("#\n");
+			$this->stow("\n");
+			$this->stow("DROP TABLE IF EXISTS " . $this->backquote($table) . ";\n");
+			
+			// 
+			//Table structure
+			// Comment in SQL-file
+			$this->stow("\n\n");
+			$this->stow("#\n");
+			$this->stow("# Table structure of table " . $this->backquote($table) . "\n");
+			$this->stow("#\n");
+			$this->stow("\n");
+			
+			$create_table = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_N);
+			if (FALSE === $create_table) {
+				$this->backup_error(sprintf(__("Error with SHOW CREATE TABLE for %s."), $table));
+				$this->stow("#\n# Error with SHOW CREATE TABLE for $table!\n#\n");
+			}
+			$this->stow($create_table[0][1] . ' ;');
+			
+			if (FALSE === $table_structure) {
+				$this->backup_error(sprintf(__("Error getting table structure of %s"), $table));
+				$this->stow("#\n# Error getting table structure of $table!\n#\n");
+			}
+		
+			//
+			// Comment in SQL-file
+			$this->stow("\n\n");
+			$this->stow("#\n");
+			$this->stow('# Data contents of table ' . $this->backquote($table) . "\n");
+			$this->stow("#\n");
+		}
+		
+		if(($segment == 'none') || ($segment >= 0)) {
+			$ints = array();
+			foreach ($table_structure as $struct) {
+				if ( (0 === strpos($struct->Type, 'tinyint')) ||
+					(0 === strpos(strtolower($struct->Type), 'smallint')) ||
+					(0 === strpos(strtolower($struct->Type), 'mediumint')) ||
+					(0 === strpos(strtolower($struct->Type), 'int')) ||
+					(0 === strpos(strtolower($struct->Type), 'bigint')) ||
+					(0 === strpos(strtolower($struct->Type), 'timestamp')) ) {
+						$ints[strtolower($struct->Field)] = "1";
+				}
+			}
+			
+			
+			// Batch by $row_inc
+			
+			if($segment == 'none') {
+				$row_start = 0;
+				$row_inc = ROWS_PER_SEGMENT;
+			} else {
+				$row_start = $segment * ROWS_PER_SEGMENT;
+				$row_inc = ROWS_PER_SEGMENT;
+			}
+			
+			do {	
+				if ( !ini_get('safe_mode')) @set_time_limit(15*60);
+				$table_data = $wpdb->get_results("SELECT * FROM $table LIMIT {$row_start}, {$row_inc}", ARRAY_A);
+
+				/*
+				if (FALSE === $table_data) {
+					$wp_backup_error .= "Error getting table contents from $table\r\n";
+					fwrite($fp, "#\n# Error getting table contents fom $table!\n#\n");
+				}
+				*/
+					
+				$entries = 'INSERT INTO ' . $this->backquote($table) . ' VALUES (';	
+				//    \x08\\x09, not required
+				$search = array("\x00", "\x0a", "\x0d", "\x1a");
+				$replace = array('\0', '\n', '\r', '\Z');
+				if($table_data) {
+					foreach ($table_data as $row) {
+						$values = array();
+						foreach ($row as $key => $value) {
+							if ($ints[strtolower($key)]) {
+								$values[] = $value;
+							} else {
+								$values[] = "'" . str_replace($search, $replace, $this->sql_addslashes($value)) . "'";
+							}
+						}
+						$this->stow(" \n" . $entries . implode(', ', $values) . ') ;');
+					}
+					$row_start += $row_inc;
+				}
+			} while((count($table_data) > 0) and ($segment=='none'));
+		}
+		
+		
+		if(($segment == 'none') || ($segment < 0)) {
+			// Create footer/closing comment in SQL-file
+			$this->stow("\n");
+			$this->stow("#\n");
+			$this->stow("# End of data contents of table " . $this->backquote($table) . "\n");
+			$this->stow("# --------------------------------------------------------\n");
+			$this->stow("\n");
+		}
+		
+	} // end backup_table()
+	
+	function return_bytes($val) {
+	   $val = trim($val);
+	   $last = strtolower($val{strlen($val)-1});
+	   switch($last) {
+	       // The 'G' modifier is available since PHP 5.1.0
+	       case 'g':
+	           $val *= 1024;
+	       case 'm':
+	           $val *= 1024;
+	       case 'k':
+	           $val *= 1024;
+	   }
+	
+	   return $val;
+	}
+	
+	////////////////////////////
+	function db_backup($core_tables, $other_tables) {
+		global $table_prefix, $wpdb;
+		
+		$datum = date("Ymd_B");
+		$wp_backup_filename = DB_NAME . "_$table_prefix$datum.sql";
+			if ($this->gzip()) {
+				$wp_backup_filename .= '.gz';
+			}
+		
+		if (is_writable(ABSPATH . $this->backup_dir)) {
+			$this->fp = $this->open(ABSPATH . $this->backup_dir . $wp_backup_filename);
+			if(!$this->fp) {
+				$this->backup_error(__('Could not open the backup file for writing!'));
+				return false;
+			}
+		} else {
+			$this->backup_error(__('The backup directory is not writeable!'));
+			return false;
+		}
+		
+		//Begin new backup of MySql
+		$this->stow("# WordPress MySQL database backup\n");
+		$this->stow("#\n");
+		$this->stow("# Generated: " . date("l j. F Y H:i T") . "\n");
+		$this->stow("# Hostname: " . DB_HOST . "\n");
+		$this->stow("# Database: " . $this->backquote(DB_NAME) . "\n");
+		$this->stow("# --------------------------------------------------------\n");
+		
+			if ( (is_array($other_tables)) && (count($other_tables) > 0) )
+			$tables = array_merge($core_tables, $other_tables);
+		else
+			$tables = $core_tables;
+		
+		foreach ($tables as $table) {
+			// Increase script execution time-limit to 15 min for every table.
+			if ( !ini_get('safe_mode')) @set_time_limit(15*60);
+			// Create the SQL statements
+			$this->stow("# --------------------------------------------------------\n");
+			$this->stow("# Table: " . $this->backquote($table) . "\n");
+			$this->stow("# --------------------------------------------------------\n");
+			$this->backup_table($table);
+		}
+				
+		$this->close($this->fp);
+		
+		if (count($this->backup_errors)) {
+			return false;
+		} else {
+			return $wp_backup_filename;
+		}
+		
+	} //wp_db_backup
+	
+	///////////////////////////
+	function deliver_backup ($filename = '', $delivery = 'http', $recipient = '') {
+		if ('' == $filename) { return FALSE; }
+		
+		$diskfile = ABSPATH . $this->backup_dir . $filename;
+		if ('http' == $delivery) {
+			if (! file_exists($diskfile)) {
+				$msg = sprintf(__('File not found:%s'), "<br /><strong>$filename</strong><br />");
+				$this_basename = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', __FILE__);
+				$msg .= '<br /><a href="' . get_settings('siteurl') . "/wp-admin/edit.php?page={$this_basename}" . '">' . __('Return to Backup');
+			die($msg);
+			}
+			header('Content-Description: File Transfer');
+			header('Content-Type: application/octet-stream');
+			header('Content-Length: ' . filesize($diskfile));
+			header("Content-Disposition: attachment; filename=$filename");
+			readfile($diskfile);
+			unlink($diskfile);
+		} elseif ('smtp' == $delivery) {
+			if (! file_exists($diskfile)) return false;
+
+			if (! is_email ($recipient)) {
+				$recipient = get_settings('admin_email');
+			}
+			$randomish = md5(time());
+			$boundary = "==WPBACKUP-BY-SKIPPY-$randomish";
+			$fp = fopen($diskfile,"rb");
+			$file = fread($fp,filesize($diskfile)); 
+			$this->close($fp);
+			$data = chunk_split(base64_encode($file));
+			$headers = "MIME-Version: 1.0\n";
+			$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
+			$headers .= 'From: ' . get_settings('admin_email') . "\n";
+		
+			$message = sprintf(__("Attached to this email is\n   %1s\n   Size:%2s kilobytes\n"), $filename, round(filesize($diskfile)/1024));
+			// Add a multipart boundary above the plain message
+			$message = "This is a multi-part message in MIME format.\n\n" .
+		        	"--{$boundary}\n" .
+				"Content-Type: text/plain; charset=\"utf-8\"\n" .
+				"Content-Transfer-Encoding: 7bit\n\n" .
+				$message . "\n\n";
+			
+			// Add file attachment to the message
+			$message .= "--{$boundary}\n" .
+				"Content-Type: application/octet-stream;\n" .
+				" name=\"{$filename}\"\n" .
+				"Content-Disposition: attachment;\n" .
+				" filename=\"{$filename}\"\n" .
+				"Content-Transfer-Encoding: base64\n\n" .
+				$data . "\n\n" .
+				"--{$boundary}--\n";
+			
+			if (function_exists('wp_mail')) {
+				wp_mail ($recipient, get_bloginfo('name') . ' ' . __('Database Backup'), $message, $headers);
+			} else {
+				mail ($recipient, get_bloginfo('name') . ' ' . __('Database Backup'), $message, $headers);
+			}
+			
+			unlink($diskfile);
+		}
+		return;
+	}
+	
+	////////////////////////////
+	function backup_menu() {
+		global $table_prefix, $wpdb;
+		$feedback = '';
+		$WHOOPS = FALSE;
+		
+		// did we just do a backup?  If so, let's report the status
+		if ( $this->backup_complete ) {
+			$feedback = '<div class="updated"><p>' . __('Backup Successful') . '!';
+			$file = $this->backup_file;
+			switch($_POST['deliver']) {
+			case 'http':
+				$feedback .= '<br />' . sprintf(__('Your backup file: <a href="%1s">%2s</a> should begin downloading shortly.'), get_settings('siteurl') . "/{$this->backup_dir}{$this->backup_file}", $this->backup_file);
+				break;
+			case 'smtp':
+				if (! is_email($_POST['backup_recipient'])) {
+					$feedback .= get_settings('admin_email');
+				} else {
+					$feedback .= $_POST['backup_recipient'];
+				}
+				$feedback = '<br />' . sprintf(__('Your backup has been emailed to %s'), $feedback);
+				break;
+			case 'none':
+				$feedback .= '<br />' . __('Your backup file has been saved on the server. If you would like to download it now, right click and select "Save As"');
+				$feedback .= ':<br /> <a href="' . get_settings('siteurl') . "/{$this->backup_dir}$file\">$file</a> : " . sprintf(__('%s bytes'), filesize(ABSPATH . $this->backup_dir . $file));
+			}
+			$feedback .= '</p></div>';
+		}
+		
+		if (count($this->backup_errors)) {
+			$feedback .= '<div class="updated error">' . __('The following errors were reported:') . "<pre>";
+			foreach($this->backup_errors as $error) {
+				$feedback .= "{$error}\n";  //Errors are already localized
+			}
+			$feedback .= "</pre></div>";
+		}
+		
+		// did we just save options for wp-cron?
+		if ( (function_exists('wp_cron_init')) && isset($_POST['wp_cron_backup_options']) ) {
+			update_option('wp_cron_backup_schedule', intval($_POST['cron_schedule']), FALSE);
+			update_option('wp_cron_backup_tables', $_POST['wp_cron_backup_tables']);
+			if (is_email($_POST['cron_backup_recipient'])) {
+				update_option('wp_cron_backup_recipient', $_POST['cron_backup_recipient'], FALSE);
+			}
+			$feedback .= '<div class="updated"><p>' . __('Scheduled Backup Options Saved!') . '</p></div>';
+		}
+		
+		// Simple table name storage
+		$wp_table_names = explode(',','categories,comments,linkcategories,links,options,post2cat,postmeta,posts,users,usermeta');
+		// Apply WP DB prefix to table names
+		$wp_table_names = array_map(create_function('$a', 'global $table_prefix;return "{$table_prefix}{$a}";'), $wp_table_names);
+		
+		$other_tables = array();
+		$also_backup = array();
+	
+		// Get complete db table list	
+		$all_tables = $wpdb->get_results("SHOW TABLES", ARRAY_N);
+		$all_tables = array_map(create_function('$a', 'return $a[0];'), $all_tables);
+		// Get list of WP tables that actually exist in this DB (for 1.6 compat!)
+		$wp_backup_default_tables = array_intersect($all_tables, $wp_table_names);
+		// Get list of non-WP tables
+		$other_tables = array_diff($all_tables, $wp_backup_default_tables);
+		
+		if ('' != $feedback) {
+			echo $feedback;
+		}
+
+		// Give the new dirs the same perms as wp-content.
+		$stat = stat( ABSPATH . 'wp-content' );
+		$dir_perms = $stat['mode'] & 0000777; // Get the permission bits.
+
+		if ( !file_exists( ABSPATH . $this->backup_dir) ) {
+			if ( @ mkdir( ABSPATH . $this->backup_dir) ) {
+				@ chmod( ABSPATH . $this->backup_dir, $dir_perms);
+			} else {
+				echo '<div class="updated error"><p align="center">' . __('WARNING: Your wp-content directory is <strong>NOT</strong> writable! We can not create the backup directory.') . '<br />' . ABSPATH . $this->backup_dir . "</p></div>";
+			$WHOOPS = TRUE;
+			}
+		}
+		
+		if ( !is_writable( ABSPATH . $this->backup_dir) ) {
+			echo '<div class="updated error"><p align="center">' . __('WARNING: Your backup directory is <strong>NOT</strong> writable! We can not create the backup directory.') . '<br />' . ABSPATH . "</p></div>";
+		}
+
+		if ( !file_exists( ABSPATH . $this->backup_dir . 'index.php') ) {
+			@ touch( ABSPATH . $this->backup_dir . "index.php");
+		}
+
+		echo "<div class='wrap'>";
+		echo '<h2>' . __('Backup') . '</h2>';
+		echo '<fieldset class="options"><legend>' . __('Tables') . '</legend>';
+		echo '<form method="post">';
+		echo '<table align="center" cellspacing="5" cellpadding="5"><tr><td width="50%" align="left" class="alternate" valign="top">';
+		echo __('These core WordPress tables will always be backed up:') . '<br /><ul>';
+		foreach ($wp_backup_default_tables as $table) {
+			echo "<li><input type='hidden' name='core_tables[]' value='$table' />$table</li>";
+		}
+		echo '</ul></td><td width="50%" align="left" valign="top">';
+		if (count($other_tables) > 0) {
+			echo __('You may choose to include any of the following tables:') . ' <br />';
+			foreach ($other_tables as $table) {
+				echo "<label style=\"display:block;\"><input type='checkbox' name='other_tables[]' value='{$table}' /> {$table}</label>";
+			}
+		}
+		echo '</tr></table></fieldset>';
+		echo '<fieldset class="options"><legend>' . __('Backup Options') . '</legend>';
+		echo __('What to do with the backup file:') . "<br />";
+		echo '<label style="display:block;"><input type="radio" name="deliver" value="none" /> ' . __('Save to server') . " ({$this->backup_dir})</label>";
+		echo '<label style="display:block;"><input type="radio" checked="checked" name="deliver" value="http" /> ' . __('Download to your computer') . '</label>';
+		echo '<div><input type="radio" name="deliver" id="do_email" value="smtp" /> ';
+		echo '<label for="do_email">'.__('Email backup to:').'</label><input type="text" name="backup_recipient" size="20" value="' . get_settings('admin_email') . '" />';
+		
+		// Check DB dize.
+		$table_status = $wpdb->get_results("SHOW TABLE STATUS FROM " . $this->backquote(DB_NAME));
+		$core_size = $db_size = 0;
+		foreach($table_status as $table) {
+			$table_size = $table->Data_length - $table->Data_free;
+			if(in_array($table->Name, $wp_backup_default_tables)) {
+				$core_size += $table_size;	
+			}
+			$db_size += $table_size;
+		}
+		$mem_limit = ini_get('memory_limit');
+		$mem_limit = $this->return_bytes($mem_limit);
+		$mem_limit = ($mem_limit == 0) ? 8*1024*1024 :  $mem_limit - 2000000;
+		
+		if (! $WHOOPS) {
+			echo '<input type="hidden" name="do_backup" id="do_backup" value="backup" /></div>';
+			echo '<p class="submit"><input type="submit" name="submit" onclick="document.getElementById(\'do_backup\').value=\'fragments\';" value="' . __('Backup') . '!" / ></p>';
+		} else {
+			echo '<p class="alternate">' . __('WARNING: Your backup directory is <strong>NOT</strong> writable!') . '</p>';
+		}
+		echo '</fieldset>';
+		echo '</form>';
+		
+		// this stuff only displays if wp_cron is installed
+		if (function_exists('wp_cron_init')) {
+			echo '<fieldset class="options"><legend>' . __('Scheduled Backup') . '</legend>';
+			$datetime = get_settings('date_format') . ' @ ' . get_settings('time_format');
+			echo '<p>' . __('Last WP-Cron Daily Execution') . ': ' . date($datetime, get_option('wp_cron_daily_lastrun')) . '<br />';
+			echo __('Next WP-Cron Daily Execution') . ': ' . date($datetime, (get_option('wp_cron_daily_lastrun') + 86400)) . '</p>';
+			echo '<form method="post">';
+			echo '<table width="100%" callpadding="5" cellspacing="5">';
+			echo '<tr><td align="center">';
+			echo __('Schedule: ');
+			$wp_cron_backup_schedule = get_option('wp_cron_backup_schedule');
+			$schedule = array(0 => __('None'), 1 => __('Daily'));
+			foreach ($schedule as $value => $name) {
+				echo ' <input type="radio" name="cron_schedule"';
+				if ($wp_cron_backup_schedule == $value) {
+					echo ' checked="checked" ';
+				}
+				echo 'value="' . $value . '" /> ' . __($name);
+			}
+			echo '</td><td align="center">';
+			$cron_recipient = get_option('wp_cron_backup_recipient');
+			if (! is_email($cron_recipient)) {
+				$cron_recipient = get_settings('admin_email');
+			}
+			echo __('Email backup to:') . ' <input type="text" name="cron_backup_recipient" size="20" value="' . $cron_recipient . '" />';
+			echo '</td></tr>';
+			$cron_tables = get_option('wp_cron_backup_tables');
+			if (! is_array($cron_tables)) {
+				$cron_tables = array();
+			}
+			if (count($other_tables) > 0) {
+				echo '<tr><td colspan="2" align="left">' . __('Tables to include:') . '<br />';
+				foreach ($other_tables as $table) {
+					echo '<input type="checkbox" ';
+					if (in_array($table, $cron_tables)) {
+						echo 'checked=checked ';
+					}
+					echo "name='wp_cron_backup_tables[]' value='{$table}' /> {$table}<br />";
+				}
+				echo '</td></tr>';
+			}
+			echo '<tr><td colspan="2" align="center"><input type="hidden" name="wp_cron_backup_options" value="SET" /><input type="submit" name="submit" value="' . __('Submit') . '" /></td></tr></table></form>';
+			echo '</fieldset>';
+		}
+		// end of wp_cron section
+		
+		echo '</div>';
+		
+	}// end wp_backup_menu()
+	
+	/////////////////////////////
+	function wp_cron_daily() {
+		
+		$schedule = intval(get_option('wp_cron_backup_schedule'));
+		if (0 == $schedule) {
+		        // Scheduled backup is disabled
+		        return;
+		}
+		
+		global $table_prefix, $wpdb;
+
+		$wp_table_names = explode(',','categories,comments,linkcategories,links,options,post2cat,postmeta,posts,users,usermeta');
+		$wp_table_names = array_map(create_function('$a', 'global $table_prefix;return "{$table_prefix}{$a}";'), $wp_table_names);
+		$all_tables = $wpdb->get_results("SHOW TABLES", ARRAY_N);
+		$all_tables = array_map(create_function('$a', 'return $a[0];'), $all_tables);
+		$core_tables = array_intersect($all_tables, $wp_table_names);
+		$other_tables = get_option('wp_cron_backup_tables');
+		
+		$recipient = get_option('wp_cron_backup_recipient');
+		
+		$backup_file = $this->db_backup($core_tables, $other_tables);
+		if (FALSE !== $backup_file) {
+			$this->deliver_backup ($backup_file, 'smtp', $recipient);
+		}
+		
+		return;
+	} // wp_cron_db_backup
+}
+
+function wpdbBackup_init() {
+	global $mywpdbbackup;
+
+	if ( !current_user_can('import') ) return;
+
+	$mywpdbbackup = new wpdbBackup(); 	
+}
+
+add_action('plugins_loaded', 'wpdbBackup_init');
+
+?>
diff -ruN 1.5.2/wp-content/themes/classic/comments-popup.php 2.0.4/wp-content/themes/classic/comments-popup.php
--- 1.5.2/wp-content/themes/classic/comments-popup.php	2005-02-14 03:17:23.000000000 -0600
+++ 2.0.4/wp-content/themes/classic/comments-popup.php	2006-06-22 17:09:17.000000000 -0500
@@ -29,11 +29,10 @@
 
 <?php
 // this line is WordPress' motor, do not delete it.
-$comment_author = (isset($_COOKIE['comment_author_' . COOKIEHASH])) ? trim($_COOKIE['comment_author_'. COOKIEHASH]) : '';
-$comment_author_email = (isset($_COOKIE['comment_author_email_'. COOKIEHASH])) ? trim($_COOKIE['comment_author_email_'. COOKIEHASH]) : '';
-$comment_author_url = (isset($_COOKIE['comment_author_url_'. COOKIEHASH])) ? trim($_COOKIE['comment_author_url_'. COOKIEHASH]) : '';
-$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved = '1' ORDER BY comment_date");
-$commentstatus = $wpdb->get_row("SELECT comment_status, post_password FROM $wpdb->posts WHERE ID = $id");
+$commenter = wp_get_current_commenter();
+extract($commenter);
+$comments = get_approved_comments($id);
+$commentstatus = get_post($id);
 if (!empty($commentstatus->post_password) && $_COOKIE['wp-postpass_'. COOKIEHASH] != $commentstatus->post_password) {  // and it doesn't match the cookie
 	echo(get_the_password_form());
 } else { ?>
diff -ruN 1.5.2/wp-content/themes/classic/footer.php 2.0.4/wp-content/themes/classic/footer.php
--- 1.5.2/wp-content/themes/classic/footer.php	2005-03-29 09:11:36.000000000 -0600
+++ 2.0.4/wp-content/themes/classic/footer.php	2005-11-16 17:48:12.000000000 -0600
@@ -3,7 +3,7 @@
 
 <?php get_sidebar(); ?>
 
-<p class="credit"><!--<?php echo $wpdb->num_queries; ?> queries. <?php timer_stop(1); ?> seconds. --> <cite><?php echo sprintf(__("Powered by <a href='http://wordpress.org' title='%s'><strong>WordPress</strong></a>"), __("Powered by WordPress, state-of-the-art semantic personal publishing platform.")); ?></cite></p>
+<p class="credit"><!--<?php echo get_num_queries(); ?> queries. <?php timer_stop(1); ?> seconds. --> <cite><?php echo sprintf(__("Powered by <a href='http://wordpress.org/' title='%s'><strong>WordPress</strong></a>"), __("Powered by WordPress, state-of-the-art semantic personal publishing platform.")); ?></cite></p>
 
 </div>
 
diff -ruN 1.5.2/wp-content/themes/classic/header.php 2.0.4/wp-content/themes/classic/header.php
--- 1.5.2/wp-content/themes/classic/header.php	2005-02-13 22:36:57.000000000 -0600
+++ 2.0.4/wp-content/themes/classic/header.php	2005-11-17 04:10:10.000000000 -0600
@@ -24,7 +24,7 @@
 
 <body>
 <div id="rap">
-<h1 id="header"><a href="<?php bloginfo('url'); ?>"><?php bloginfo('name'); ?></a></h1>
+<h1 id="header"><a href="<?php bloginfo('url'); ?>/"><?php bloginfo('name'); ?></a></h1>
 
 <div id="content">
-<!-- end header -->
\ No newline at end of file
+<!-- end header -->
Files 1.5.2/wp-content/themes/classic/screenshot.png and 2.0.4/wp-content/themes/classic/screenshot.png differ
diff -ruN 1.5.2/wp-content/themes/default/archive.php 2.0.4/wp-content/themes/default/archive.php
--- 1.5.2/wp-content/themes/default/archive.php	2005-03-08 22:21:24.000000000 -0600
+++ 2.0.4/wp-content/themes/default/archive.php	2006-06-26 14:33:36.000000000 -0500
@@ -5,21 +5,21 @@
 		<?php if (have_posts()) : ?>
 
 		 <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
-<?php /* If this is a category archive */ if (is_category()) { ?>				
+<?php /* If this is a category archive */ if (is_category()) { ?>
 		<h2 class="pagetitle">Archive for the '<?php echo single_cat_title(); ?>' Category</h2>
-		
+
  	  <?php /* If this is a daily archive */ } elseif (is_day()) { ?>
 		<h2 class="pagetitle">Archive for <?php the_time('F jS, Y'); ?></h2>
-		
+
 	 <?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
 		<h2 class="pagetitle">Archive for <?php the_time('F, Y'); ?></h2>
 
 		<?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
 		<h2 class="pagetitle">Archive for <?php the_time('Y'); ?></h2>
-		
+
 	  <?php /* If this is a search */ } elseif (is_search()) { ?>
 		<h2 class="pagetitle">Search Results</h2>
-		
+
 	  <?php /* If this is an author archive */ } elseif (is_author()) { ?>
 		<h2 class="pagetitle">Author Archive</h2>
 
@@ -38,29 +38,29 @@
 		<div class="post">
 				<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h3>
 				<small><?php the_time('l, F jS, Y') ?></small>
-				
+
 				<div class="entry">
-					<?php the_excerpt() ?>
+					<?php the_content() ?>
 				</div>
-		
-				<p class="postmetadata">Posted in <?php the_category(', ') ?> <strong>|</strong> <?php edit_post_link('Edit','','<strong>|</strong>'); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p> 
+
+				<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p> 
 
 			</div>
-	
+
 		<?php endwhile; ?>
 
 		<div class="navigation">
 			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
 			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
 		</div>
-	
+
 	<?php else : ?>
 
 		<h2 class="center">Not Found</h2>
 		<?php include (TEMPLATEPATH . '/searchform.php'); ?>
 
 	<?php endif; ?>
-		
+
 	</div>
 
 <?php get_sidebar(); ?>
diff -ruN 1.5.2/wp-content/themes/default/archives.php 2.0.4/wp-content/themes/default/archives.php
--- 1.5.2/wp-content/themes/default/archives.php	2005-01-03 23:20:06.000000000 -0600
+++ 2.0.4/wp-content/themes/default/archives.php	2006-06-26 14:33:36.000000000 -0500
@@ -20,6 +20,6 @@
      <?php wp_list_cats(); ?>
   </ul>
 
-</div>	
+</div>
 
 <?php get_footer(); ?>
diff -ruN 1.5.2/wp-content/themes/default/attachment.php 2.0.4/wp-content/themes/default/attachment.php
--- 1.5.2/wp-content/themes/default/attachment.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-content/themes/default/attachment.php	2006-07-26 12:42:30.000000000 -0500
@@ -0,0 +1,67 @@
+<?php get_header(); ?>
+
+	<div id="content" class="widecolumn">
+
+  <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+
+		<div class="navigation">
+			<div class="alignleft">&nbsp;</div>
+			<div class="alignright">&nbsp;</div>
+		</div>
+<?php $attachment_link = get_the_attachment_link($post->ID, true, array(450, 800)); // This also populates the iconsize for the next line ?>
+<?php $_post = &get_post($post->ID); $classname = ($_post->iconsize[0] <= 128 ? 'small' : '') . 'attachment'; // This lets us style narrow icons specially ?>
+		<div class="post" id="post-<?php the_ID(); ?>">
+			<h2><a href="<?php echo get_permalink($post->post_parent); ?>" rev="attachment"><?php echo get_the_title($post->post_parent); ?></a> &raquo; <a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h2>
+			<div class="entry">
+				<p class="<?php echo $classname; ?>"><?php echo $attachment_link; ?><br /><?php echo basename($post->guid); ?></p>
+
+				<?php the_content('<p class="serif">Read the rest of this entry &raquo;</p>'); ?>
+
+				<?php link_pages('<p><strong>Pages:</strong> ', '</p>', 'number'); ?>
+
+				<p class="postmetadata alt">
+					<small>
+						This entry was posted
+						<?php /* This is commented, because it requires a little adjusting sometimes.
+							You'll need to download this plugin, and follow the instructions:
+							http://binarybonsai.com/archives/2004/08/17/time-since-plugin/ */
+							/* $entry_datetime = abs(strtotime($post->post_date) - (60*120)); echo time_since($entry_datetime); echo ' ago'; */ ?> 
+						on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?>
+						and is filed under <?php the_category(', ') ?>.
+						You can follow any responses to this entry through the <?php comments_rss_link('RSS 2.0'); ?> feed. 
+
+						<?php if (('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
+							// Both Comments and Pings are open ?>
+							You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(true); ?>" rel="trackback">trackback</a> from your own site.
+
+						<?php } elseif (!('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
+							// Only Pings are Open ?>
+							Responses are currently closed, but you can <a href="<?php trackback_url(true); ?> " rel="trackback">trackback</a> from your own site.
+
+						<?php } elseif (('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
+							// Comments are open, Pings are not ?>
+							You can skip to the end and leave a response. Pinging is currently not allowed.
+
+						<?php } elseif (!('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
+							// Neither Comments, nor Pings are open ?>
+							Both comments and pings are currently closed.
+
+						<?php } edit_post_link('Edit this entry.','',''); ?>
+
+					</small>
+				</p>
+
+			</div>
+		</div>
+
+	<?php comments_template(); ?>
+
+	<?php endwhile; else: ?>
+
+		<p>Sorry, no attachments matched your criteria.</p>
+
+<?php endif; ?>
+
+	</div>
+
+<?php get_footer(); ?>
diff -ruN 1.5.2/wp-content/themes/default/comments.php 2.0.4/wp-content/themes/default/comments.php
--- 1.5.2/wp-content/themes/default/comments.php	2005-04-13 11:44:35.000000000 -0500
+++ 2.0.4/wp-content/themes/default/comments.php	2006-06-26 14:33:36.000000000 -0500
@@ -5,9 +5,9 @@
         if (!empty($post->post_password)) { // if there's a password
             if ($_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password) {  // and it doesn't match the cookie
 				?>
-				
+
 				<p class="nocomments">This post is password protected. Enter the password to view comments.<p>
-				
+
 				<?php
 				return;
             }
@@ -39,7 +39,7 @@
 
 		</li>
 
-	<?php /* Changes every other comment to a different class */	
+	<?php /* Changes every other comment to a different class */
 		if ('alt' == $oddcomment) $oddcomment = '';
 		else $oddcomment = 'alt';
 	?>
@@ -52,11 +52,11 @@
 
   <?php if ('open' == $post->comment_status) : ?> 
 		<!-- If comments are open, but there are no comments. -->
-		
+
 	 <?php else : // comments are closed ?>
 		<!-- If comments are closed. -->
 		<p class="nocomments">Comments are closed.</p>
-		
+
 	<?php endif; ?>
 <?php endif; ?>
 
diff -ruN 1.5.2/wp-content/themes/default/comments-popup.php 2.0.4/wp-content/themes/default/comments-popup.php
--- 1.5.2/wp-content/themes/default/comments-popup.php	2005-02-27 11:04:45.000000000 -0600
+++ 2.0.4/wp-content/themes/default/comments-popup.php	2006-06-26 14:33:36.000000000 -0500
@@ -29,12 +29,11 @@
 
 <?php
 // this line is WordPress' motor, do not delete it.
-$comment_author = (isset($_COOKIE['comment_author_' . COOKIEHASH])) ? trim($_COOKIE['comment_author_'. COOKIEHASH]) : '';
-$comment_author_email = (isset($_COOKIE['comment_author_email_'. COOKIEHASH])) ? trim($_COOKIE['comment_author_email_'. COOKIEHASH]) : '';
-$comment_author_url = (isset($_COOKIE['comment_author_url_'. COOKIEHASH])) ? trim($_COOKIE['comment_author_url_'. COOKIEHASH]) : '';
-$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved = '1' ORDER BY comment_date");
-$commentstatus = $wpdb->get_row("SELECT comment_status, post_password FROM $wpdb->posts WHERE ID = $id");
-if (!empty($commentstatus->post_password) && $_COOKIE['wp-postpass_'. COOKIEHASH] != $commentstatus->post_password) {  // and it doesn't match the cookie
+$commenter = wp_get_current_commenter();
+extract($commenter);
+$comments = get_approved_comments($id);
+$post = get_post($id);
+if (!empty($post->post_password) && $_COOKIE['wp-postpass_'. COOKIEHASH] != $post->post_password) {  // and it doesn't match the cookie
 	echo(get_the_password_form());
 } else { ?>
 
@@ -52,7 +51,7 @@
 	<p>No comments yet.</p>
 <?php } ?>
 
-<?php if ('open' == $commentstatus->comment_status) { ?>
+<?php if ('open' == $post->comment_status) { ?>
 <h2>Leave a comment</h2>
 <p>Line and paragraph breaks automatic, e-mail address never displayed, <acronym title="Hypertext Markup Language">HTML</acronym> allowed: <code><?php echo allowed_tags(); ?></code></p>
 
@@ -99,11 +98,11 @@
 
 <!-- // this is just the end of the motor - don't touch that line either :) -->
 <?php //} ?> 
-<p class="credit"><?php timer_stop(1); ?> <cite>Powered by <a href="http://wordpress.org" title="Powered by WordPress, state-of-the-art semantic personal publishing platform"><strong>Wordpress</strong></a></cite></p>
+<p class="credit"><?php timer_stop(1); ?> <cite>Powered by <a href="http://wordpress.org/" title="Powered by WordPress, state-of-the-art semantic personal publishing platform"><strong>Wordpress</strong></a></cite></p>
 <?php // Seen at http://www.mijnkopthee.nl/log2/archive/2003/05/28/esc(18) ?>
 <script type="text/javascript">
 <!--
-document.onkeypress = function esc(e) {	
+document.onkeypress = function esc(e) {
 	if(typeof(e) == "undefined") { e=event; }
 	if (e.keyCode == 27) { self.close(); }
 }
diff -ruN 1.5.2/wp-content/themes/default/footer.php 2.0.4/wp-content/themes/default/footer.php
--- 1.5.2/wp-content/themes/default/footer.php	2005-03-29 09:11:36.000000000 -0600
+++ 2.0.4/wp-content/themes/default/footer.php	2006-06-26 14:33:36.000000000 -0500
@@ -1,12 +1,13 @@
 
 <hr />
 <div id="footer">
+<!-- If you'd like to support WordPress, having the "powered by" link someone on your blog is the best way, it's our only promotion or advertising. -->
 	<p>
 		<?php bloginfo('name'); ?> is proudly powered by 
-		<a href="http://wordpress.org">WordPress</a>
+		<a href="http://wordpress.org/">WordPress</a>
 		<br /><a href="feed:<?php bloginfo('rss2_url'); ?>">Entries (RSS)</a>
 		and <a href="feed:<?php bloginfo('comments_rss2_url'); ?>">Comments (RSS)</a>.
-		<!-- <?php echo $wpdb->num_queries; ?> queries. <?php timer_stop(1); ?> seconds. -->
+		<!-- <?php echo get_num_queries(); ?> queries. <?php timer_stop(1); ?> seconds. -->
 	</p>
 </div>
 </div>
@@ -15,6 +16,5 @@
 <?php /* "Just what do you think you're doing Dave?" */ ?>
 
 		<?php wp_footer(); ?>
-
 </body>
-</html>
\ No newline at end of file
+</html>
diff -ruN 1.5.2/wp-content/themes/default/functions.php 2.0.4/wp-content/themes/default/functions.php
--- 1.5.2/wp-content/themes/default/functions.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-content/themes/default/functions.php	2006-07-05 21:44:40.000000000 -0500
@@ -0,0 +1,397 @@
+<?php
+
+function kubrick_head() {
+	$head = "<style type='text/css'>\n<!--";
+	$output = '';
+	if ( kubrick_header_image() ) {
+		$url =  kubrick_header_image_url() ;
+		$output .= "#header { background: url('$url') no-repeat bottom center; }\n";
+	}
+	if ( false !== ( $color = kubrick_header_color() ) ) {
+		$output .= "#headerimg h1 a, #headerimg h1 a:visited, #headerimg .description { color: $color; }\n";
+	}
+	if ( false !== ( $display = kubrick_header_display() ) ) {
+		$output .= "#headerimg { display: $display }\n";
+	}
+	$foot = "--></style>\n";
+	if ( '' != $output )
+		echo $head . $output . $foot;
+}
+
+add_action('wp_head', 'kubrick_head');
+
+function kubrick_header_image() {
+	return apply_filters('kubrick_header_image', get_settings('kubrick_header_image'));
+}
+
+function kubrick_upper_color() {
+	if ( strstr( $url = kubrick_header_image_url(), 'header-img.php?' ) ) {
+		parse_str(substr($url, strpos($url, '?') + 1), $q);
+		return $q['upper'];
+	} else
+		return '69aee7';
+}
+
+function kubrick_lower_color() {
+	if ( strstr( $url = kubrick_header_image_url(), 'header-img.php?' ) ) {
+		parse_str(substr($url, strpos($url, '?') + 1), $q);
+		return $q['lower'];
+	} else
+		return '4180b6';
+}
+
+function kubrick_header_image_url() {
+	if ( $image = kubrick_header_image() )
+		$url = get_template_directory_uri() . '/images/' . $image;
+	else
+		$url = get_template_directory_uri() . '/images/kubrickheader.jpg';
+
+	return $url;
+}
+
+function kubrick_header_color() {
+	return apply_filters('kubrick_header_color', get_settings('kubrick_header_color'));
+}
+
+function kubrick_header_color_string() {
+	$color = kubrick_header_color();
+	if ( false === $color )
+		return 'white';
+
+	return $color;
+}
+
+function kubrick_header_display() {
+	return apply_filters('kubrick_header_display', get_settings('kubrick_header_display'));
+}
+
+function kubrick_header_display_string() {
+	$display = kubrick_header_display();
+	return $display ? $display : 'inline';
+}
+
+add_action('admin_menu', 'kubrick_add_theme_page');
+
+function kubrick_add_theme_page() {
+	if ( $_GET['page'] == basename(__FILE__) ) {
+		if ( 'save' == $_REQUEST['action'] ) {
+			if ( isset($_REQUEST['njform']) ) {
+				if ( isset($_REQUEST['defaults']) ) {
+					delete_option('kubrick_header_image');
+					delete_option('kubrick_header_color');
+					delete_option('kubrick_header_display');
+				} else {
+					if ( '' == $_REQUEST['njfontcolor'] )
+						delete_option('kubrick_header_color');
+					else
+						update_option('kubrick_header_color', $_REQUEST['njfontcolor']);
+
+					if ( preg_match('/[0-9A-F]{6}|[0-9A-F]{3}/i', $_REQUEST['njuppercolor'], $uc) && preg_match('/[0-9A-F]{6}|[0-9A-F]{3}/i', $_REQUEST['njlowercolor'], $lc) ) {
+						$uc = ( strlen($uc[0]) == 3 ) ? $uc[0]{0}.$uc[0]{0}.$uc[0]{1}.$uc[0]{1}.$uc[0]{2}.$uc[0]{2} : $uc[0];
+						$lc = ( strlen($lc[0]) == 3 ) ? $lc[0]{0}.$lc[0]{0}.$lc[0]{1}.$lc[0]{1}.$lc[0]{2}.$lc[0]{2} : $lc[0];
+						update_option('kubrick_header_image', "header-img.php?upper=$uc&amp;lower=$lc");
+					}
+
+					if ( isset($_REQUEST['toggledisplay']) ) {
+						if ( false === get_settings('kubrick_header_display') )
+							update_option('kubrick_header_display', 'none');
+						else
+							delete_option('kubrick_header_display');
+					}
+				}
+			} else {
+
+				if ( isset($_REQUEST['headerimage']) ) {
+					if ( '' == $_REQUEST['headerimage'] )
+						delete_option('kubrick_header_image');
+					else
+						update_option('kubrick_header_image', $_REQUEST['headerimage']);
+				}
+
+				if ( isset($_REQUEST['fontcolor']) ) {
+					if ( '' == $_REQUEST['fontcolor'] )
+						delete_option('kubrick_header_color');
+					else
+						update_option('kubrick_header_color', $_REQUEST['fontcolor']);
+				}
+
+				if ( isset($_REQUEST['fontdisplay']) ) {
+					if ( '' == $_REQUEST['fontdisplay'] || 'inline' == $_REQUEST['fontdisplay'] )
+						delete_option('kubrick_header_display');
+					else
+						update_option('kubrick_header_display', 'none');
+				}
+			}
+			//print_r($_REQUEST);
+			wp_redirect("themes.php?page=functions.php&saved=true");
+			die;
+		}
+		add_action('admin_head', 'kubrick_theme_page_head');
+	}
+	add_theme_page('Customize Header', 'Header Image and Color', 'edit_themes', basename(__FILE__), 'kubrick_theme_page');
+}
+
+function kubrick_theme_page_head() {
+?>
+<script type="text/javascript" src="../wp-includes/js/colorpicker.js"></script>
+<script type='text/javascript'>
+// <![CDATA[
+	function pickColor(color) {
+		ColorPicker_targetInput.value = color;
+		kUpdate(ColorPicker_targetInput.id);
+	}
+	function PopupWindow_populate(contents) {
+		contents += '<br /><p style="text-align:center;margin-top:0px;"><input type="button" value="Close Color Picker" onclick="cp.hidePopup(\'prettyplease\')"></input></p>';
+		this.contents = contents;
+		this.populated = false;
+	}
+	function PopupWindow_hidePopup(magicword) {
+		if ( magicword != 'prettyplease' )
+			return false;
+		if (this.divName != null) {
+			if (this.use_gebi) {
+				document.getElementById(this.divName).style.visibility = "hidden";
+			}
+			else if (this.use_css) {
+				document.all[this.divName].style.visibility = "hidden";
+			}
+			else if (this.use_layers) {
+				document.layers[this.divName].visibility = "hidden";
+			}
+		}
+		else {
+			if (this.popupWindow && !this.popupWindow.closed) {
+				this.popupWindow.close();
+				this.popupWindow = null;
+			}
+		}
+		return false;
+	}
+	function colorSelect(t,p) {
+		if ( cp.p == p && document.getElementById(cp.divName).style.visibility != "hidden" )
+			cp.hidePopup('prettyplease');
+		else {
+			cp.p = p;
+			cp.select(t,p);
+		}
+	}
+	function PopupWindow_setSize(width,height) {
+		this.width = 162;
+		this.height = 210;
+	}
+
+	var cp = new ColorPicker();
+	function advUpdate(val, obj) {
+		document.getElementById(obj).value = val;
+		kUpdate(obj);
+	}
+	function kUpdate(oid) {
+		if ( 'uppercolor' == oid || 'lowercolor' == oid ) {
+			uc = document.getElementById('uppercolor').value.replace('#', '');
+			lc = document.getElementById('lowercolor').value.replace('#', '');
+			hi = document.getElementById('headerimage');
+			hi.value = 'header-img.php?upper='+uc+'&lower='+lc;
+			document.getElementById('header').style.background = 'url("<?php echo get_template_directory_uri(); ?>/images/'+hi.value+'") center no-repeat';
+			document.getElementById('advuppercolor').value = '#'+uc;
+			document.getElementById('advlowercolor').value = '#'+lc;
+		}
+		if ( 'fontcolor' == oid ) {
+			document.getElementById('header').style.color = document.getElementById('fontcolor').value;
+			document.getElementById('advfontcolor').value = document.getElementById('fontcolor').value;
+		}
+		if ( 'fontdisplay' == oid ) {
+			document.getElementById('headerimg').style.display = document.getElementById('fontdisplay').value;
+		}
+	}
+	function toggleDisplay() {
+		td = document.getElementById('fontdisplay');
+		td.value = ( td.value == 'none' ) ? 'inline' : 'none';
+		kUpdate('fontdisplay');
+	}
+	function toggleAdvanced() {
+		a = document.getElementById('jsAdvanced');
+		if ( a.style.display == 'none' )
+			a.style.display = 'block';
+		else
+			a.style.display = 'none';
+	}
+	function kDefaults() {
+		document.getElementById('headerimage').value = '';
+		document.getElementById('advuppercolor').value = document.getElementById('uppercolor').value = '#69aee7';
+		document.getElementById('advlowercolor').value = document.getElementById('lowercolor').value = '#4180b6';
+		document.getElementById('header').style.background = 'url("<?php echo get_template_directory_uri(); ?>/images/kubrickheader.jpg") center no-repeat';
+		document.getElementById('header').style.color = '#FFFFFF';
+		document.getElementById('advfontcolor').value = document.getElementById('fontcolor').value = '';
+		document.getElementById('fontdisplay').value = 'inline';
+		document.getElementById('headerimg').style.display = document.getElementById('fontdisplay').value;
+	}
+	function kRevert() {
+		document.getElementById('headerimage').value = '<?php echo kubrick_header_image(); ?>';
+		document.getElementById('advuppercolor').value = document.getElementById('uppercolor').value = '#<?php echo kubrick_upper_color(); ?>';
+		document.getElementById('advlowercolor').value = document.getElementById('lowercolor').value = '#<?php echo kubrick_lower_color(); ?>';
+		document.getElementById('header').style.background = 'url("<?php echo kubrick_header_image_url(); ?>") center no-repeat';
+		document.getElementById('header').style.color = '';
+		document.getElementById('advfontcolor').value = document.getElementById('fontcolor').value = '<?php echo kubrick_header_color_string(); ?>';
+		document.getElementById('fontdisplay').value = '<?php echo kubrick_header_display_string(); ?>';
+		document.getElementById('headerimg').style.display = document.getElementById('fontdisplay').value;
+	}
+	function kInit() {
+		document.getElementById('jsForm').style.display = 'block';
+		document.getElementById('nonJsForm').style.display = 'none';
+	}
+	addLoadEvent(kInit);
+// ]]>
+</script>
+<style type='text/css'>
+	#headwrap {
+		text-align: center;
+	}
+	#kubrick-header {
+		font-size: 80%;
+	}
+	#kubrick-header .hibrowser {
+		width: 780px;
+		height: 260px;
+		overflow: scroll;
+	}
+	#kubrick-header #hitarget {
+		display: none;
+	}
+	#kubrick-header #header h1 {
+		font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, Sans-Serif;
+		font-weight: bold;
+		font-size: 4em;
+		text-align: center;
+		padding-top: 70px;
+		margin: 0;
+	}
+
+	#kubrick-header #header .description {
+		font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
+		font-size: 1.2em;
+		text-align: center;
+	}
+	#kubrick-header #header {
+		text-decoration: none;
+		color: <?php echo kubrick_header_color_string(); ?>;
+		padding: 0;
+		margin: 0;
+		height: 200px;
+		text-align: center;
+		background: url('<?php echo kubrick_header_image_url(); ?>') center no-repeat;
+	}
+	#kubrick-header #headerimg {
+		margin: 0;
+		height: 200px;
+		width: 100%;
+		display: <?php echo kubrick_header_display_string(); ?>;
+	}
+	#jsForm {
+		display: none;
+		text-align: center;
+	}
+	#jsForm input.submit, #jsForm input.button, #jsAdvanced input.button {
+		padding: 0px;
+		margin: 0px;
+	}
+	#advanced {
+		text-align: center;
+		width: 620px;
+	}
+	html>body #advanced {
+		text-align: center;
+		position: relative;
+		left: 50%;
+		margin-left: -380px;
+	}
+	#jsAdvanced {
+		text-align: right;
+	}
+	#nonJsForm {
+		position: relative;
+		text-align: left;
+		margin-left: -370px;
+		left: 50%;
+	}
+	#nonJsForm label {
+		padding-top: 6px;
+		padding-right: 5px;
+		float: left;
+		width: 100px;
+		text-align: right;
+	}
+	.defbutton {
+		font-weight: bold;
+	}
+	.zerosize {
+		width: 0px;
+		height: 0px;
+		overflow: hidden;
+	}
+	#colorPickerDiv a, #colorPickerDiv a:hover {
+		padding: 1px;
+		text-decoration: none;
+		border-bottom: 0px;
+	}
+</style>
+<?php
+}
+
+function kubrick_theme_page() {
+	if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>Options saved.</strong></p></div>';
+?>
+<div class='wrap'>
+	<div id="kubrick-header">
+		<h2>Header Image and Color</h2>
+		<div id="headwrap">
+			<div id="header">
+				<div id="headerimg">
+					<h1><?php bloginfo('name'); ?></h1>
+					<div class="description"><?php bloginfo('description'); ?></div>
+				</div>
+			</div>
+		</div>
+		<br />
+		<div id="nonJsForm">
+			<form method="post" action="">
+				<div class="zerosize"><input type="submit" name="defaultsubmit" value="Save" /></div>
+				<label for="njfontcolor">Font Color:</label><input type="text" name="njfontcolor" id="njfontcolor" value="<?php echo kubrick_header_color(); ?>" /> Any CSS color (<code>red</code> or <code>#FF0000</code> or <code>rgb(255, 0, 0)</code>)<br />
+				<label for="njuppercolor">Upper Color:</label><input type="text" name="njuppercolor" id="njuppercolor" value="#<?php echo kubrick_upper_color(); ?>" /> HEX only (<code>#FF0000</code> or <code>#F00</code>)<br />
+				<label for="njlowercolor">Lower Color:</label><input type="text" name="njlowercolor" id="njlowercolor" value="#<?php echo kubrick_lower_color(); ?>" /> HEX only (<code>#FF0000</code> or <code>#F00</code>)<br />
+				<input type="hidden" name="hi" id="hi" value="<?php echo kubrick_header_image(); ?>" />
+				<input type="submit" name="toggledisplay" id="toggledisplay" value="Toggle Text" />
+				<input type="submit" name="defaults" value="Use Defaults" />
+				<input type="submit" class="defbutton" name="submitform" value="&nbsp;&nbsp;Save&nbsp;&nbsp;" />
+				<input type="hidden" name="action" value="save" />
+				<input type="hidden" name="njform" value="true" />
+			</form>
+		</div>
+		<div id="jsForm">
+			<form style="display:inline;" method="post" name="hicolor" id="hicolor" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
+				<input type="button" onclick="tgt=document.getElementById('fontcolor');colorSelect(tgt,'pick1');return false;" name="pick1" id="pick1" value="Font Color"></input>
+				<input type="button" onclick="tgt=document.getElementById('uppercolor');colorSelect(tgt,'pick2');return false;" name="pick2" id="pick2" value="Upper Color"></input>
+				<input type="button" onclick="tgt=document.getElementById('lowercolor');colorSelect(tgt,'pick3');return false;" name="pick3" id="pick3" value="Lower Color"></input>
+				<input type="button" name="revert" value="Revert" onclick="kRevert()" />
+				<input type="button" value="Advanced" onclick="toggleAdvanced()" />
+				<input type="submit" name="submitform" class="defbutton" value="Save" onclick="cp.hidePopup('prettyplease')" />
+				<input type="hidden" name="action" value="save" />
+				<input type="hidden" name="fontdisplay" id="fontdisplay" value="<?php echo kubrick_header_display(); ?>" />
+				<input type="hidden" name="fontcolor" id="fontcolor" value="<?php echo kubrick_header_color(); ?>" />
+				<input type="hidden" name="uppercolor" id="uppercolor" value="<?php echo kubrick_upper_color(); ?>" />
+				<input type="hidden" name="lowercolor" id="lowercolor" value="<?php echo kubrick_lower_color(); ?>" />
+				<input type="hidden" name="headerimage" id="headerimage" value="<?php echo kubrick_header_image(); ?>" />
+			</form>
+			<div id="colorPickerDiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;visibility:hidden;"> </div>
+			<div id="advanced">
+				<form id="jsAdvanced" style="display:none;" action="">
+					<label for="advfontcolor">Font Color (CSS): </label><input type="text" id="advfontcolor" onchange="advUpdate(this.value, 'fontcolor')" value="<?php echo kubrick_header_color(); ?>" /><br />
+					<label for="advuppercolor">Upper Color (HEX): </label><input type="text" id="advuppercolor" onchange="advUpdate(this.value, 'uppercolor')" value="#<?php echo kubrick_upper_color(); ?>" /><br />
+					<label for="advlowercolor">Lower Color (HEX): </label><input type="text" id="advlowercolor" onchange="advUpdate(this.value, 'lowercolor')" value="#<?php echo kubrick_lower_color(); ?>" /><br />
+					<input type="button" name="default" value="Select Default Colors" onclick="kDefaults()" /><br />
+					<input type="button" onclick="toggleDisplay();return false;" name="pick" id="pick" value="Toggle Text Display"></input><br />
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+<?php } ?>
diff -ruN 1.5.2/wp-content/themes/default/header.php 2.0.4/wp-content/themes/default/header.php
--- 1.5.2/wp-content/themes/default/header.php	2005-05-23 12:58:59.000000000 -0500
+++ 2.0.4/wp-content/themes/default/header.php	2006-06-26 14:33:36.000000000 -0500
@@ -9,52 +9,31 @@
 <meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats -->
 
 <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
-<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="<?php bloginfo('rss2_url'); ?>" />
-<link rel="alternate" type="text/xml" title="RSS .92" href="<?php bloginfo('rss_url'); ?>" />
-<link rel="alternate" type="application/atom+xml" title="Atom 0.3" href="<?php bloginfo('atom_url'); ?>" />
+<link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss2_url'); ?>" />
 <link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />
 
 <style type="text/css" media="screen">
-/*	To accomodate differing install paths of WordPress, images are referred only here,
-	and not in the wp-layout.css file. If you prefer to use only CSS for colors and what
-	not, then go right ahead and delete the following lines, and the image files. */
-		
-	body { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbgcolor.jpg"); }	
-<?php /* Checks to see whether it needs a sidebar or not */ if ((! $withcomments) && (! is_single())) { ?>
+
+<?php 
+// Checks to see whether it needs a sidebar or not
+if ( !$withcomments && !is_single() ) { 
+?>
 	#page { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbg.jpg") repeat-y top; border: none; }
 <?php } else { // No sidebar ?>
 	#page { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbgwide.jpg") repeat-y top; border: none; } 
 <?php } ?>
-	#header { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickheader.jpg") no-repeat bottom center; }
-	#footer { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickfooter.jpg") no-repeat bottom; border: none;}
 
-/*	Because the template is slightly different, size-wise, with images, this needs to be set here
-	If you don't want to use the template's images, you can also delete the following two lines. */
-		
-	#header 	{ margin: 0 !important; margin: 0 0 0 1px; padding: 1px; height: 198px; width: 758px; }
-	#headerimg 	{ margin: 7px 9px 0; height: 192px; width: 740px; } 
-
-/* 	To ease the insertion of a personal header image, I have done it in such a way,
-	that you simply drop in an image called 'personalheader.jpg' into your /images/
-	directory. Dimensions should be at least 760px x 200px. Anything above that will
-	get cropped off of the image. */
-	/*
-	#headerimg { background: url('<?php bloginfo('stylesheet_directory'); ?>/images/personalheader.jpg') no-repeat top;}
-	*/
 </style>
 
-<?php wp_get_archives('type=monthly&format=link'); ?>
-
 <?php wp_head(); ?>
 </head>
 <body>
-
 <div id="page">
 
 
 <div id="header">
 	<div id="headerimg">
-		<h1><a href="<?php echo get_settings('home'); ?>"><?php bloginfo('name'); ?></a></h1>
+		<h1><a href="<?php echo get_settings('home'); ?>/"><?php bloginfo('name'); ?></a></h1>
 		<div class="description"><?php bloginfo('description'); ?></div>
 	</div>
 </div>
Files 1.5.2/wp-content/themes/default/images/audio.jpg and 2.0.4/wp-content/themes/default/images/audio.jpg differ
diff -ruN 1.5.2/wp-content/themes/default/images/header-img.php 2.0.4/wp-content/themes/default/images/header-img.php
--- 1.5.2/wp-content/themes/default/images/header-img.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-content/themes/default/images/header-img.php	2006-01-04 19:47:22.000000000 -0600
@@ -0,0 +1,77 @@
+<?php
+
+$img = 'kubrickheader.jpg';
+
+// If we don't have image processing support, redirect.
+if ( ! function_exists('imagecreatefromjpeg') )
+	die(header("Location: kubrickheader.jpg"));
+
+// Assign and validate the color values
+$default = false;
+$vars = array('upper'=>array('r1', 'g1', 'b1'), 'lower'=>array('r2', 'g2', 'b2'));
+foreach ( $vars as $var => $subvars ) {
+	if ( isset($_GET[$var]) ) {
+		foreach ( $subvars as $index => $subvar ) {
+			$length = strlen($_GET[$var]) / 3;
+			$v = substr($_GET[$var], $index * $length, $length);
+			if ( $length == 1 ) $v = '' . $v . $v;
+			$$subvar = hexdec( $v );
+			if ( $$subvar < 0 || $$subvar > 255 )
+				$default = true;
+		}
+	} else {
+		$default = true;
+	}
+}
+
+if ( $default )
+	list ( $r1, $g1, $b1, $r2, $g2, $b2 ) = array ( 105, 174, 231, 65, 128, 182 );
+
+// Create the image
+$im = imagecreatefromjpeg($img);
+
+// Get the background color, define the rectangle height
+$white = imagecolorat( $im, 15, 15 );
+$h = 182;
+
+// Define the boundaries of the rounded edges ( y => array ( x1, x2 ) )
+$corners = array(
+	0 => array ( 25, 734 ),
+	1 => array ( 23, 736 ),
+	2 => array ( 22, 737 ),
+	3 => array ( 21, 738 ),
+	4 => array ( 21, 738 ),
+	177 => array ( 21, 738 ),
+	178 => array ( 21, 738 ),
+	179 => array ( 22, 737 ),
+	180 => array ( 23, 736 ),
+	181 => array ( 25, 734 ),
+	);
+
+// Blank out the blue thing
+for ( $i = 0; $i < $h; $i++ ) {
+	$x1 = 19;
+	$x2 = 740;
+	imageline( $im, $x1, 18 + $i, $x2, 18 + $i, $white );
+}
+
+// Draw a new color thing
+for ( $i = 0; $i < $h; $i++ ) {
+	$x1 = 20;
+	$x2 = 739;
+	$r = ( $r2 - $r1 != 0 ) ? $r1 + ( $r2 - $r1 ) * ( $i / $h ) : $r1;
+	$g = ( $g2 - $g1 != 0 ) ? $g1 + ( $g2 - $g1 ) * ( $i / $h ) : $g1;
+	$b = ( $b2 - $b1 != 0 ) ? $b1 + ( $b2 - $b1 ) * ( $i / $h ) : $b1;
+	$color = imagecolorallocate( $im, $r, $g, $b );
+	if ( array_key_exists($i, $corners) ) {
+		imageline( $im, $x1, 18 + $i, $x2, 18 + $i, $white );
+		list ( $x1, $x2 ) = $corners[$i];
+	}
+	imageline( $im, $x1, 18 + $i, $x2, 18 + $i, $color );
+}
+
+//die;
+header("Content-Type: image/jpeg");
+imagejpeg($im, '', 92);
+imagedestroy($im);
+?>
diff -ruN 1.5.2/wp-content/themes/default/index.php 2.0.4/wp-content/themes/default/index.php
--- 1.5.2/wp-content/themes/default/index.php	2005-05-01 13:51:10.000000000 -0500
+++ 2.0.4/wp-content/themes/default/index.php	2006-06-26 14:33:36.000000000 -0500
@@ -3,27 +3,27 @@
 	<div id="content" class="narrowcolumn">
 
 	<?php if (have_posts()) : ?>
-		
+
 		<?php while (have_posts()) : the_post(); ?>
-				
+
 			<div class="post" id="post-<?php the_ID(); ?>">
 				<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
 				<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
-				
+
 				<div class="entry">
 					<?php the_content('Read the rest of this entry &raquo;'); ?>
 				</div>
-		
-				<p class="postmetadata">Posted in <?php the_category(', ') ?> <strong>|</strong> <?php edit_post_link('Edit','','<strong>|</strong>'); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
+
+				<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
 			</div>
-	
+
 		<?php endwhile; ?>
 
 		<div class="navigation">
 			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
 			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
 		</div>
-		
+
 	<?php else : ?>
 
 		<h2 class="center">Not Found</h2>
diff -ruN 1.5.2/wp-content/themes/default/links.php 2.0.4/wp-content/themes/default/links.php
--- 1.5.2/wp-content/themes/default/links.php	2005-01-03 23:20:06.000000000 -0600
+++ 2.0.4/wp-content/themes/default/links.php	2006-06-26 14:33:36.000000000 -0500
@@ -13,6 +13,6 @@
 <?php get_links_list(); ?>
 </ul>
 
-</div>	
+</div>
 
 <?php get_footer(); ?>
diff -ruN 1.5.2/wp-content/themes/default/page.php 2.0.4/wp-content/themes/default/page.php
--- 1.5.2/wp-content/themes/default/page.php	2005-05-01 13:51:10.000000000 -0500
+++ 2.0.4/wp-content/themes/default/page.php	2006-07-26 12:42:30.000000000 -0500
@@ -5,11 +5,11 @@
     <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
 		<div class="post" id="post-<?php the_ID(); ?>">
 		<h2><?php the_title(); ?></h2>
-			<div class="entrytext">
+			<div class="entry">
 				<?php the_content('<p class="serif">Read the rest of this page &raquo;</p>'); ?>
-	
+
 				<?php link_pages('<p><strong>Pages:</strong> ', '</p>', 'number'); ?>
-	
+
 			</div>
 		</div>
 	  <?php endwhile; endif; ?>
Files 1.5.2/wp-content/themes/default/screenshot.png and 2.0.4/wp-content/themes/default/screenshot.png differ
diff -ruN 1.5.2/wp-content/themes/default/searchform.php 2.0.4/wp-content/themes/default/searchform.php
--- 1.5.2/wp-content/themes/default/searchform.php	2005-02-02 04:57:07.000000000 -0600
+++ 2.0.4/wp-content/themes/default/searchform.php	2005-11-17 04:10:10.000000000 -0600
@@ -1,5 +1,5 @@
-<form method="get" id="searchform" action="<?php echo $_SERVER['PHP_SELF']; ?>">
+<form method="get" id="searchform" action="<?php bloginfo('home'); ?>/">
 <div><input type="text" value="<?php echo wp_specialchars($s, 1); ?>" name="s" id="s" />
 <input type="submit" id="searchsubmit" value="Search" />
 </div>
-</form>
\ No newline at end of file
+</form>
diff -ruN 1.5.2/wp-content/themes/default/search.php 2.0.4/wp-content/themes/default/search.php
--- 1.5.2/wp-content/themes/default/search.php	2005-03-08 22:21:24.000000000 -0600
+++ 2.0.4/wp-content/themes/default/search.php	2006-06-26 14:33:36.000000000 -0500
@@ -5,7 +5,7 @@
 	<?php if (have_posts()) : ?>
 
 		<h2 class="pagetitle">Search Results</h2>
-		
+
 		<div class="navigation">
 			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
 			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
@@ -13,32 +13,28 @@
 
 
 		<?php while (have_posts()) : the_post(); ?>
-				
+
 			<div class="post">
 				<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h3>
 				<small><?php the_time('l, F jS, Y') ?></small>
-				
-				<div class="entry">
-					<?php the_excerpt() ?>
-				</div>
-		
-				<p class="postmetadata">Posted in <?php the_category(', ') ?> <strong>|</strong> <?php edit_post_link('Edit','','<strong>|</strong>'); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
+
+				<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
 			</div>
-	
+
 		<?php endwhile; ?>
 
 		<div class="navigation">
 			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
 			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
 		</div>
-	
+
 	<?php else : ?>
 
-		<h2 class="center">Not Found</h2>
+		<h2 class="center">No posts found. Try a different search?</h2>
 		<?php include (TEMPLATEPATH . '/searchform.php'); ?>
 
 	<?php endif; ?>
-		
+
 	</div>
 
 <?php get_sidebar(); ?>
diff -ruN 1.5.2/wp-content/themes/default/sidebar.php 2.0.4/wp-content/themes/default/sidebar.php
--- 1.5.2/wp-content/themes/default/sidebar.php	2005-04-22 00:12:59.000000000 -0500
+++ 2.0.4/wp-content/themes/default/sidebar.php	2006-06-26 14:33:36.000000000 -0500
@@ -1,6 +1,6 @@
 	<div id="sidebar">
 		<ul>
-			
+
 			<li>
 				<?php include (TEMPLATEPATH . '/searchform.php'); ?>
 			</li>
@@ -15,25 +15,25 @@
 			<?php /* If this is a 404 page */ if (is_404()) { ?>
 			<?php /* If this is a category archive */ } elseif (is_category()) { ?>
 			<p>You are currently browsing the archives for the <?php single_cat_title(''); ?> category.</p>
-			
+
 			<?php /* If this is a yearly archive */ } elseif (is_day()) { ?>
-			<p>You are currently browsing the <a href="<?php echo get_settings('siteurl'); ?>"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You are currently browsing the <a href="<?php bloginfo('home'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
 			for the day <?php the_time('l, F jS, Y'); ?>.</p>
-			
+
 			<?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
-			<p>You are currently browsing the <a href="<?php echo get_settings('siteurl'); ?>"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You are currently browsing the <a href="<?php bloginfo('home'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
 			for <?php the_time('F, Y'); ?>.</p>
 
       <?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
-			<p>You are currently browsing the <a href="<?php echo get_settings('siteurl'); ?>"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You are currently browsing the <a href="<?php bloginfo('home'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
 			for the year <?php the_time('Y'); ?>.</p>
-			
+
 		 <?php /* If this is a monthly archive */ } elseif (is_search()) { ?>
-			<p>You have searched the <a href="<?php echo get_settings('siteurl'); ?>"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You have searched the <a href="<?php echo bloginfo('home'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
 			for <strong>'<?php echo wp_specialchars($s); ?>'</strong>. If you are unable to find anything in these search results, you can try one of these links.</p>
 
 			<?php /* If this is a monthly archive */ } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?>
-			<p>You are currently browsing the <a href="<?php echo get_settings('siteurl'); ?>"><?php echo bloginfo('name'); ?></a> weblog archives.</p>
+			<p>You are currently browsing the <a href="<?php echo bloginfo('home'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives.</p>
 
 			<?php } ?>
 			</li>
@@ -52,9 +52,9 @@
 				</ul>
 			</li>
 
-			<?php /* If this is the frontpage */ if ( is_home() || is_page() ) { ?>				
+			<?php /* If this is the frontpage */ if ( is_home() || is_page() ) { ?>
 				<?php get_links_list(); ?>
-				
+
 				<li><h2>Meta</h2>
 				<ul>
 					<?php wp_register(); ?>
@@ -66,7 +66,7 @@
 				</ul>
 				</li>
 			<?php } ?>
-			
+
 		</ul>
 	</div>
 
diff -ruN 1.5.2/wp-content/themes/default/single.php 2.0.4/wp-content/themes/default/single.php
--- 1.5.2/wp-content/themes/default/single.php	2005-05-09 06:04:02.000000000 -0500
+++ 2.0.4/wp-content/themes/default/single.php	2006-07-26 12:42:30.000000000 -0500
@@ -1,22 +1,22 @@
 <?php get_header(); ?>
 
 	<div id="content" class="widecolumn">
-				
+
   <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
-	
+
 		<div class="navigation">
 			<div class="alignleft"><?php previous_post_link('&laquo; %link') ?></div>
 			<div class="alignright"><?php next_post_link('%link &raquo;') ?></div>
 		</div>
-	
+
 		<div class="post" id="post-<?php the_ID(); ?>">
 			<h2><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h2>
-	
-			<div class="entrytext">
+
+			<div class="entry">
 				<?php the_content('<p class="serif">Read the rest of this entry &raquo;</p>'); ?>
-	
+
 				<?php link_pages('<p><strong>Pages:</strong> ', '</p>', 'number'); ?>
-	
+
 				<p class="postmetadata alt">
 					<small>
 						This entry was posted
@@ -27,39 +27,39 @@
 						on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?>
 						and is filed under <?php the_category(', ') ?>.
 						You can follow any responses to this entry through the <?php comments_rss_link('RSS 2.0'); ?> feed. 
-						
+
 						<?php if (('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
 							// Both Comments and Pings are open ?>
 							You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(true); ?>" rel="trackback">trackback</a> from your own site.
-						
+
 						<?php } elseif (!('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
 							// Only Pings are Open ?>
 							Responses are currently closed, but you can <a href="<?php trackback_url(true); ?> " rel="trackback">trackback</a> from your own site.
-						
+
 						<?php } elseif (('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
 							// Comments are open, Pings are not ?>
 							You can skip to the end and leave a response. Pinging is currently not allowed.
-			
+
 						<?php } elseif (!('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
 							// Neither Comments, nor Pings are open ?>
-							Both comments and pings are currently closed.			
-						
+							Both comments and pings are currently closed.
+
 						<?php } edit_post_link('Edit this entry.','',''); ?>
-						
+
 					</small>
 				</p>
-	
+
 			</div>
 		</div>
-		
+
 	<?php comments_template(); ?>
-	
+
 	<?php endwhile; else: ?>
-	
+
 		<p>Sorry, no posts matched your criteria.</p>
-	
+
 <?php endif; ?>
-	
+
 	</div>
 
 <?php get_footer(); ?>
diff -ruN 1.5.2/wp-content/themes/default/style.css 2.0.4/wp-content/themes/default/style.css
--- 1.5.2/wp-content/themes/default/style.css	2005-02-11 01:48:30.000000000 -0600
+++ 2.0.4/wp-content/themes/default/style.css	2006-06-26 14:33:36.000000000 -0500
@@ -2,7 +2,7 @@
 Theme Name: WordPress Default
 Theme URI: http://wordpress.org/
 Description: The default WordPress theme based on the famous <a href="http://binarybonsai.com/kubrick/">Kubrick</a>.
-Version: 1.5
+Version: 1.6
 Author: Michael Heilemann
 Author URI: http://binarybonsai.com/
 
@@ -14,13 +14,7 @@
 
 	The CSS, XHTML and design is released under GPL:
 	http://www.opensource.org/licenses/gpl-license.php
-	
 
-	*** REGARDING IMAGES ***
-	All CSS that involves the use of images, can be found in the 'index.php' file.
-	This is to ease installation inside subdirectories of a server.
-
-	Have fun, and don't be afraid to contact me if you have questions.
 */
 
 
@@ -29,7 +23,7 @@
 body {
 	font-size: 62.5%; /* Resets 1em to 10px */
 	font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
-	background-color: #d5d6d7;
+	background: #d5d6d7 url('images/kubrickbgcolor.jpg');
 	color: #333;
 	text-align: center;
 	}
@@ -41,9 +35,15 @@
 	}
 
 #header {
-	background-color: #73a0c5;
+	background: #73a0c5 url('images/kubrickheader.jpg') no-repeat bottom center;
 	}
 
+#headerimg 	{ 
+	margin: 7px 9px 0; 
+	height: 192px; 
+	width: 740px; 
+	} 
+
 #content {
 	font-size: 1.2em
 	}
@@ -59,7 +59,7 @@
 .widecolumn {
 	line-height: 1.6em;
 	}
-	
+
 .narrowcolumn .postmetadata {
 	text-align: center;
 	}
@@ -71,7 +71,8 @@
 	}
 
 #footer {
-	background-color: #eee;
+	background: #eee url('images/kubrickfooter.jpg') no-repeat top; 
+	border: none;
 	}
 
 small {
@@ -90,7 +91,7 @@
 	text-align: center;
 	}
 
-.description {
+#headerimg .description {
 	font-size: 1.2em;
 	text-align: center;
 	}
@@ -112,7 +113,7 @@
 	font-size: 1.3em;
 	}
 
-h1, h1 a, h1 a:hover, h1 a:visited, .description {
+h1, h1 a, h1 a:hover, h1 a:visited, #headerimg .description {
 	text-decoration: none;
 	color: white;
 	}
@@ -132,7 +133,7 @@
 .commentlist li, #commentform input, #commentform textarea {
 	font: 0.9em 'Lucida Grande', Verdana, Arial, Sans-Serif;
 	}
-	
+
 .commentlist li {
 	font-weight: bold;
 	}
@@ -164,7 +165,7 @@
 small, #sidebar ul ul li, #sidebar ul ol li, .nocomments, .postmetadata, blockquote, strike {
 	color: #777;
 	}
-	
+
 code {
 	font: 1.1em 'Courier New', Courier, Fixed;
 	}
@@ -184,7 +185,7 @@
 	color: #147;
 	text-decoration: underline;
 	}
-	
+
 #wp-calendar #prev a {
 	font-size: 9pt;
 	}
@@ -208,7 +209,7 @@
 
 /* Begin Structure */
 body {
-	margin: 0;
+	margin: 0 0 20px 0;
 	padding: 0; 
 	}
 
@@ -219,13 +220,13 @@
 	width: 760px;
 	border: 1px solid #959596;
 	}
-	
+
 #header {
-	padding: 0;
-	margin: 0 auto;
-	height: 200px;
-	width: 100%;
 	background-color: #73a0c5;
+	margin: 0 0 0 1px; 
+	padding: 0; 
+	height: 200px; 
+	width: 758px;
 	}
 
 #headerimg {
@@ -246,7 +247,7 @@
 	margin: 5px 0 0 150px;
 	width: 450px;
 	}
-	
+
 .post {
 	margin: 0 0 40px;
 	text-align: justify;
@@ -263,9 +264,25 @@
 .widecolumn .postmetadata {
 	margin: 30px 0;
 	}
-	
+
+.widecolumn .smallattachment {
+	text-align: center;
+	float: left;
+	width: 128px;
+	margin: 5px 5px 5px 0px;
+}
+
+.widecolumn .attachment {
+	text-align: center;
+	margin: 5px 0px;
+}
+
+.postmetadata {
+	clear: left;
+}
+
 #footer {
-	padding: 0 0 0 1px;
+	padding: 0;
 	margin: 0 auto;
 	width: 760px;
 	clear: both;
@@ -286,10 +303,6 @@
 	margin: 0;
 	}
 
-.description {
-	text-align: center;
-	}
-
 h2 {
 	margin: 30px 0 0;
 	}
@@ -327,13 +340,13 @@
 	thought?!) align the image to the right. And using 'class="centered',
 	will of course center the image. This is much better than using
 	align="center", being much more futureproof (and valid) */
-	
+
 img.centered {
 	display: block;
 	margin-left: auto;
 	margin-right: auto;
 	}
-	
+
 img.alignright {
 	padding: 4px;
 	margin: 0 0 2px 7px;
@@ -349,7 +362,7 @@
 .alignright {
 	float: right;
 	}
-	
+
 .alignleft {
 	float: left
 	}
@@ -393,7 +406,7 @@
 	list-style-type: none;
 	list-style-image: none;
 	}
-	
+
 #sidebar ul, #sidebar ul ol {
 	margin: 0;
 	padding: 0;
@@ -437,7 +450,7 @@
 	}
 
 #sidebar #searchform #s {
-	width: 115px;
+	width: 108px;
 	padding: 2px;
 	}
 
Files 1.5.2/wp-images/fade-butt.png and 2.0.4/wp-images/fade-butt.png differ
Files 1.5.2/wp-images/get-firefox.png and 2.0.4/wp-images/get-firefox.png differ
Files 1.5.2/wp-images/header-shadow.png and 2.0.4/wp-images/header-shadow.png differ
Files 1.5.2/wp-images/smilies/icon_arrow.gif and 2.0.4/wp-images/smilies/icon_arrow.gif differ
Files 1.5.2/wp-images/smilies/icon_biggrin.gif and 2.0.4/wp-images/smilies/icon_biggrin.gif differ
Files 1.5.2/wp-images/smilies/icon_confused.gif and 2.0.4/wp-images/smilies/icon_confused.gif differ
Files 1.5.2/wp-images/smilies/icon_cool.gif and 2.0.4/wp-images/smilies/icon_cool.gif differ
Files 1.5.2/wp-images/smilies/icon_cry.gif and 2.0.4/wp-images/smilies/icon_cry.gif differ
Files 1.5.2/wp-images/smilies/icon_eek.gif and 2.0.4/wp-images/smilies/icon_eek.gif differ
Files 1.5.2/wp-images/smilies/icon_evil.gif and 2.0.4/wp-images/smilies/icon_evil.gif differ
Files 1.5.2/wp-images/smilies/icon_exclaim.gif and 2.0.4/wp-images/smilies/icon_exclaim.gif differ
Files 1.5.2/wp-images/smilies/icon_idea.gif and 2.0.4/wp-images/smilies/icon_idea.gif differ
Files 1.5.2/wp-images/smilies/icon_lol.gif and 2.0.4/wp-images/smilies/icon_lol.gif differ
Files 1.5.2/wp-images/smilies/icon_mad.gif and 2.0.4/wp-images/smilies/icon_mad.gif differ
Files 1.5.2/wp-images/smilies/icon_mrgreen.gif and 2.0.4/wp-images/smilies/icon_mrgreen.gif differ
Files 1.5.2/wp-images/smilies/icon_neutral.gif and 2.0.4/wp-images/smilies/icon_neutral.gif differ
Files 1.5.2/wp-images/smilies/icon_question.gif and 2.0.4/wp-images/smilies/icon_question.gif differ
Files 1.5.2/wp-images/smilies/icon_razz.gif and 2.0.4/wp-images/smilies/icon_razz.gif differ
Files 1.5.2/wp-images/smilies/icon_redface.gif and 2.0.4/wp-images/smilies/icon_redface.gif differ
Files 1.5.2/wp-images/smilies/icon_rolleyes.gif and 2.0.4/wp-images/smilies/icon_rolleyes.gif differ
Files 1.5.2/wp-images/smilies/icon_sad.gif and 2.0.4/wp-images/smilies/icon_sad.gif differ
Files 1.5.2/wp-images/smilies/icon_smile.gif and 2.0.4/wp-images/smilies/icon_smile.gif differ
Files 1.5.2/wp-images/smilies/icon_surprised.gif and 2.0.4/wp-images/smilies/icon_surprised.gif differ
Files 1.5.2/wp-images/smilies/icon_twisted.gif and 2.0.4/wp-images/smilies/icon_twisted.gif differ
Files 1.5.2/wp-images/smilies/icon_wink.gif and 2.0.4/wp-images/smilies/icon_wink.gif differ
Files 1.5.2/wp-images/wpminilogo.png and 2.0.4/wp-images/wpminilogo.png differ
Files 1.5.2/wp-images/wp-small.png and 2.0.4/wp-images/wp-small.png differ
diff -ruN 1.5.2/wp-includes/cache.php 2.0.4/wp-includes/cache.php
--- 1.5.2/wp-includes/cache.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/cache.php	2006-05-31 00:01:09.000000000 -0500
@@ -0,0 +1,444 @@
+<?php
+function wp_cache_add($key, $data, $flag = '', $expire = 0) {
+	global $wp_object_cache;
+
+	return $wp_object_cache->add($key, $data, $flag, $expire);
+}
+
+function wp_cache_close() {
+	global $wp_object_cache;
+
+	return $wp_object_cache->save();
+}
+
+function wp_cache_delete($id, $flag = '') {
+	global $wp_object_cache;
+
+	return $wp_object_cache->delete($id, $flag);
+}
+
+function wp_cache_flush() {
+	global $wp_object_cache;
+
+	return $wp_object_cache->flush();
+}
+
+function wp_cache_get($id, $flag = '') {
+	global $wp_object_cache;
+
+	return $wp_object_cache->get($id, $flag);
+}
+
+function wp_cache_init() {
+	global $wp_object_cache;
+
+	$wp_object_cache = new WP_Object_Cache();
+}
+
+function wp_cache_replace($key, $data, $flag = '', $expire = 0) {
+	global $wp_object_cache;
+
+	return $wp_object_cache->replace($key, $data, $flag, $expire);
+}
+
+function wp_cache_set($key, $data, $flag = '', $expire = 0) {
+	global $wp_object_cache;
+
+	return $wp_object_cache->set($key, $data, $flag, $expire);
+}
+
+define('CACHE_SERIAL_HEADER', "<?php\n/*");
+define('CACHE_SERIAL_FOOTER', "*/\n?".">");
+
+class WP_Object_Cache {
+	var $cache_dir;
+	var $cache_enabled = false;
+	var $expiration_time = 900;
+	var $flock_filename = 'wp_object_cache.lock';
+	var $mutex;
+	var $cache = array ();
+	var $dirty_objects = array ();
+	var $non_existant_objects = array ();
+	var $global_groups = array ('users', 'userlogins', 'usermeta');
+	var $blog_id;
+	var $cold_cache_hits = 0;
+	var $warm_cache_hits = 0;
+	var $cache_misses = 0;
+	var $secret = '';
+
+	function acquire_lock() {
+		// Acquire a write lock. 
+		$this->mutex = @fopen($this->cache_dir.$this->flock_filename, 'w');
+		if ( false == $this->mutex)
+			return false;
+		flock($this->mutex, LOCK_EX);
+		return true;
+	}
+
+	function add($id, $data, $group = 'default', $expire = '') {
+		if (empty ($group))
+			$group = 'default';
+
+		if (false !== $this->get($id, $group, false))
+			return false;
+
+		return $this->set($id, $data, $group, $expire);
+	}
+
+	function delete($id, $group = 'default', $force = false) {
+		if (empty ($group))
+			$group = 'default';
+
+		if (!$force && false === $this->get($id, $group, false))
+			return false;
+
+		unset ($this->cache[$group][$id]);
+		$this->non_existant_objects[$group][$id] = true;
+		$this->dirty_objects[$group][] = $id;
+		return true;
+	}
+
+	function flush() {
+		if ( !$this->cache_enabled )
+			return true;
+
+		if ( ! $this->acquire_lock() )
+			return false;
+
+		$this->rm_cache_dir();
+		$this->cache = array ();
+		$this->dirty_objects = array ();
+		$this->non_existant_objects = array ();
+		
+		$this->release_lock();
+
+		return true;
+	}
+
+	function get($id, $group = 'default', $count_hits = true) {
+		if (empty ($group))
+			$group = 'default';
+
+		if (isset ($this->cache[$group][$id])) {
+			if ($count_hits)
+				$this->warm_cache_hits += 1;
+			return $this->cache[$group][$id];
+		}
+
+		if (isset ($this->non_existant_objects[$group][$id]))
+			return false;
+
+		//  If caching is not enabled, we have to fall back to pulling from the DB.
+		if (!$this->cache_enabled) {
+			if (!isset ($this->cache[$group]))
+				$this->load_group_from_db($group);
+
+			if (isset ($this->cache[$group][$id])) {
+				$this->cold_cache_hits += 1;
+				return $this->cache[$group][$id];
+			}
+
+			$this->non_existant_objects[$group][$id] = true;
+			$this->cache_misses += 1;
+			return false;
+		}
+
+		$cache_file = $this->cache_dir.$this->get_group_dir($group)."/".$this->hash($id).'.php';
+		if (!file_exists($cache_file)) {
+			$this->non_existant_objects[$group][$id] = true;
+			$this->cache_misses += 1;
+			return false;
+		}
+
+		// If the object has expired, remove it from the cache and return false to force
+		// a refresh.
+		$now = time();
+		if ((filemtime($cache_file) + $this->expiration_time) <= $now) {
+			$this->cache_misses += 1;
+			$this->delete($id, $group, true);
+			return false;
+		}
+
+		$this->cache[$group][$id] = unserialize(base64_decode(substr(@ file_get_contents($cache_file), strlen(CACHE_SERIAL_HEADER), -strlen(CACHE_SERIAL_FOOTER))));
+		if (false === $this->cache[$group][$id])
+			$this->cache[$group][$id] = '';
+
+		$this->cold_cache_hits += 1;
+		return $this->cache[$group][$id];
+	}
+
+	function get_group_dir($group) {
+		if (false !== array_search($group, $this->global_groups))
+			return $group;
+
+		return "{$this->blog_id}/$group";
+	}
+
+	function hash($data) {
+		if ( function_exists('hash_hmac') ) {
+			return hash_hmac('md5', $data, $this->secret);
+		} else {
+			return md5($data . $this->secret);
+		}
+	}
+
+	function load_group_from_db($group) {
+		global $wpdb;
+
+		if ('category' == $group) {
+			$this->cache['category'] = array ();
+			if ($dogs = $wpdb->get_results("SELECT * FROM $wpdb->categories")) {
+				foreach ($dogs as $catt)
+					$this->cache['category'][$catt->cat_ID] = $catt;
+
+				foreach ($this->cache['category'] as $catt) {
+					$curcat = $catt->cat_ID;
+					$fullpath = '/'.$this->cache['category'][$catt->cat_ID]->category_nicename;
+					while ($this->cache['category'][$curcat]->category_parent != 0) {
+						$curcat = $this->cache['category'][$curcat]->category_parent;
+						$fullpath = '/'.$this->cache['category'][$curcat]->category_nicename.$fullpath;
+					}
+					$this->cache['category'][$catt->cat_ID]->fullpath = $fullpath;
+				}
+			}
+		} else
+			if ('options' == $group) {
+				$wpdb->hide_errors();
+				if (!$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'")) {
+					$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options");
+				}
+				$wpdb->show_errors();
+
+				if ( ! $options )
+					return;
+
+				foreach ($options as $option) {
+					$this->cache['options'][$option->option_name] = $option->option_value;
+				}
+			}
+	}
+
+	function make_group_dir($group, $perms) {
+		$group_dir = $this->get_group_dir($group);
+		$make_dir = '';
+		foreach (split('/', $group_dir) as $subdir) {
+			$make_dir .= "$subdir/";
+			if (!file_exists($this->cache_dir.$make_dir)) {
+				if (! @ mkdir($this->cache_dir.$make_dir))
+					break;
+				@ chmod($this->cache_dir.$make_dir, $perms);
+			}
+
+			if (!file_exists($this->cache_dir.$make_dir."index.php")) {
+				$file_perms = $perms & 0000666;
+				@ touch($this->cache_dir.$make_dir."index.php");
+				@ chmod($this->cache_dir.$make_dir."index.php", $file_perms);
+			}
+		}
+
+		return $this->cache_dir."$group_dir/";
+	}
+
+	function rm_cache_dir() {
+		$dir = $this->cache_dir;
+		$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)
+				return false;
+      
+			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($stack as $dir) {
+			if ( $dir != $top_dir)
+				@ rmdir($dir);
+		}
+
+	}
+
+	function release_lock() {
+		// Release write lock.
+		flock($this->mutex, LOCK_UN);
+		fclose($this->mutex);
+	}
+
+	function replace($id, $data, $group = 'default', $expire = '') {
+		if (empty ($group))
+			$group = 'default';
+
+		if (false === $this->get($id, $group, false))
+			return false;
+
+		return $this->set($id, $data, $group, $expire);
+	}
+
+	function set($id, $data, $group = 'default', $expire = '') {
+		if (empty ($group))
+			$group = 'default';
+
+		if (NULL == $data)
+			$data = '';
+
+		$this->cache[$group][$id] = $data;
+		unset ($this->non_existant_objects[$group][$id]);
+		$this->dirty_objects[$group][] = $id;
+
+		return true;
+	}
+
+	function save() {
+		//$this->stats();
+
+		if (!$this->cache_enabled)
+			return true;
+
+		if (empty ($this->dirty_objects))
+			return true;
+
+		// Give the new dirs the same perms as wp-content.
+		$stat = stat(ABSPATH.'wp-content');
+		$dir_perms = $stat['mode'] & 0007777; // Get the permission bits.
+		$file_perms = $dir_perms & 0000666; // Remove execute bits for files.
+
+		// Make the base cache dir.
+		if (!file_exists($this->cache_dir)) {
+			if (! @ mkdir($this->cache_dir))
+				return false;
+			@ chmod($this->cache_dir, $dir_perms);
+		}
+
+		if (!file_exists($this->cache_dir."index.php")) {
+			@ touch($this->cache_dir."index.php");
+			@ chmod($this->cache_dir."index.php", $file_perms);
+		}
+
+		if ( ! $this->acquire_lock() )
+			return false;
+
+		// Loop over dirty objects and save them.
+		$errors = 0;
+		foreach ($this->dirty_objects as $group => $ids) {
+			$group_dir = $this->make_group_dir($group, $dir_perms);
+
+			$ids = array_unique($ids);
+			foreach ($ids as $id) {
+				$cache_file = $group_dir.$this->hash($id).'.php';
+
+				// Remove the cache file if the key is not set.
+				if (!isset ($this->cache[$group][$id])) {
+					if (file_exists($cache_file))
+						@ unlink($cache_file);
+					continue;
+				}
+
+				$temp_file = tempnam($group_dir, 'tmp');
+				$serial = CACHE_SERIAL_HEADER.base64_encode(serialize($this->cache[$group][$id])).CACHE_SERIAL_FOOTER;
+				$fd = @fopen($temp_file, 'w');
+				if ( false === $fd ) {
+					$errors++;
+					continue;
+				}
+				fputs($fd, $serial);
+				fclose($fd);
+				if (!@ rename($temp_file, $cache_file)) {
+					if (@ copy($temp_file, $cache_file))
+						@ unlink($temp_file);
+					else
+						$errors++;	
+				}
+				@ chmod($cache_file, $file_perms);
+			}
+		}
+
+		$this->dirty_objects = array();
+
+		$this->release_lock();
+		
+		if ( $errors )
+			return false;
+
+		return true;
+	}
+
+	function stats() {
+		echo "<p>";
+		echo "<strong>Cold Cache Hits:</strong> {$this->cold_cache_hits}<br/>";
+		echo "<strong>Warm Cache Hits:</strong> {$this->warm_cache_hits}<br/>";
+		echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br/>";
+		echo "</p>";
+
+		foreach ($this->cache as $group => $cache) {
+			echo "<p>";
+			echo "<strong>Group:</strong> $group<br/>";
+			echo "<strong>Cache:</strong>";
+			echo "<pre>";
+			print_r($cache);
+			echo "</pre>";
+			if (isset ($this->dirty_objects[$group])) {
+				echo "<strong>Dirty Objects:</strong>";
+				echo "<pre>";
+				print_r(array_unique($this->dirty_objects[$group]));
+				echo "</pre>";
+				echo "</p>";
+			}
+		}
+	}
+
+	function WP_Object_Cache() {
+		global $blog_id;
+
+		if (defined('DISABLE_CACHE'))
+			return;
+
+		if ( ! defined('ENABLE_CACHE') )
+			return;
+
+		// Disable the persistent cache if safe_mode is on.
+		if ( ini_get('safe_mode') && ! defined('ENABLE_CACHE') )
+			return;
+
+		if (defined('CACHE_PATH'))
+			$this->cache_dir = CACHE_PATH;
+		else
+			// Using the correct separator eliminates some cache flush errors on Windows
+			$this->cache_dir = ABSPATH.'wp-content'.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR;
+
+		if (is_writable($this->cache_dir) && is_dir($this->cache_dir)) {
+				$this->cache_enabled = true;
+		} else {
+			if (is_writable(ABSPATH.'wp-content')) {
+				$this->cache_enabled = true;
+			}
+		}
+
+		if (defined('CACHE_EXPIRATION_TIME'))
+			$this->expiration_time = CACHE_EXPIRATION_TIME;
+
+		if ( defined('WP_SECRET') )
+			$this->secret = WP_SECRET;
+		else
+			$this->secret = DB_PASSWORD . DB_USER . DB_NAME . DB_HOST . ABSPATH;
+
+		$this->blog_id = $this->hash($blog_id);
+	}
+}
+?>
diff -ruN 1.5.2/wp-includes/capabilities.php 2.0.4/wp-includes/capabilities.php
--- 1.5.2/wp-includes/capabilities.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/capabilities.php	2006-05-11 18:05:45.000000000 -0500
@@ -0,0 +1,421 @@
+<?php
+
+class WP_Roles {
+	var $roles;
+
+	var $role_objects = array();
+	var $role_names = array();
+	var $role_key;
+
+	function WP_Roles() {
+		global $table_prefix;
+		$this->role_key = $table_prefix . 'user_roles';
+
+		$this->roles = get_option($this->role_key);
+
+		if ( empty($this->roles) )
+			return;
+
+		foreach ($this->roles as $role => $data) {
+			$this->role_objects[$role] = new WP_Role($role, $this->roles[$role]['capabilities']);
+			$this->role_names[$role] = $this->roles[$role]['name'];
+		}
+	}
+
+	function add_role($role, $display_name, $capabilities = '') {
+		if ( isset($this->roles[$role]) )
+			return;
+
+		$this->roles[$role] = array(
+			'name' => $display_name,
+			'capabilities' => $capabilities);
+		update_option($this->role_key, $this->roles);
+		$this->role_objects[$role] = new WP_Role($role, $capabilities);
+		$this->role_names[$role] = $display_name;
+		return $this->role_objects[$role];
+	}
+	
+	function remove_role($role) {
+		if ( ! isset($this->role_objects[$role]) )
+			return;
+		
+		unset($this->role_objects[$role]);
+		unset($this->role_names[$role]);
+		unset($this->roles[$role]);
+		
+		update_option($this->role_key, $this->roles);
+	}
+
+	function add_cap($role, $cap, $grant = true) {
+		$this->roles[$role]['capabilities'][$cap] = $grant;
+		update_option($this->role_key, $this->roles);
+	}
+
+	function remove_cap($role, $cap) {
+		unset($this->roles[$role]['capabilities'][$cap]);
+		update_option($this->role_key, $this->roles);
+	}
+
+	function &get_role($role) {
+		if ( isset($this->role_objects[$role]) )
+			return $this->role_objects[$role];
+		else
+			return null;
+	}
+
+	function get_names() {
+		return $this->role_names;
+	}
+
+	function is_role($role)
+	{
+		return isset($this->role_names[$role]);
+	}	
+}
+
+class WP_Role {
+	var $name;
+	var $capabilities;
+
+	function WP_Role($role, $capabilities) {
+		$this->name = $role;
+		$this->capabilities = $capabilities;
+	}
+
+	function add_cap($cap, $grant = true) {
+		global $wp_roles;
+
+		if ( ! isset($wp_roles) )
+			$wp_roles = new WP_Roles();
+
+		$this->capabilities[$cap] = $grant;
+		$wp_roles->add_cap($this->name, $cap, $grant);
+	}
+
+	function remove_cap($cap) {
+		global $wp_roles;
+
+		if ( ! isset($wp_roles) )
+			$wp_roles = new WP_Roles();
+
+		unset($this->capabilities[$cap]);
+		$wp_roles->remove_cap($this->name, $cap);
+	}
+
+	function has_cap($cap) {
+		$capabilities = apply_filters('role_has_cap', $this->capabilities, $cap, $this->name);
+		if ( !empty($capabilities[$cap]) )
+			return $capabilities[$cap];
+		else
+			return false;
+	}
+
+}
+
+class WP_User {
+	var $data;
+	var $id = 0;
+	var $caps = array();
+	var $cap_key;
+	var $roles = array();
+	var $allcaps = array();
+
+	function WP_User($id, $name = '') {
+		global $table_prefix;
+
+		if ( empty($id) && empty($name) )
+			return;
+
+		if ( ! is_numeric($id) ) {
+			$name = $id;
+			$id = 0;
+		}
+
+		if ( ! empty($id) )
+			$this->data = get_userdata($id);
+		else
+			$this->data = get_userdatabylogin($name);
+
+		if ( empty($this->data->ID) )
+			return;
+
+		foreach (get_object_vars($this->data) as $key => $value) {
+			$this->{$key} = $value;
+		}
+
+		$this->id = $this->ID;
+		$this->cap_key = $table_prefix . 'capabilities';
+		$this->caps = &$this->{$this->cap_key};
+		if ( ! is_array($this->caps) )
+			$this->caps = array();
+		$this->get_role_caps();
+	}
+	
+	function get_role_caps() {
+		global $wp_roles;
+		
+		if ( ! isset($wp_roles) )
+			$wp_roles = new WP_Roles();
+
+		//Filter out caps that are not role names and assign to $this->roles
+		if(is_array($this->caps))
+			$this->roles = array_filter(array_keys($this->caps), array(&$wp_roles, 'is_role'));
+
+		//Build $allcaps from role caps, overlay user's $caps
+		$this->allcaps = array();
+		foreach($this->roles as $role) {
+			$role = $wp_roles->get_role($role);
+			$this->allcaps = array_merge($this->allcaps, $role->capabilities);
+		}
+		$this->allcaps = array_merge($this->allcaps, $this->caps);
+	}
+	
+	function add_role($role) {
+		$this->caps[$role] = true;
+		update_usermeta($this->id, $this->cap_key, $this->caps);
+		$this->get_role_caps();
+		$this->update_user_level_from_caps();
+	}
+	
+	function remove_role($role) {
+		if ( empty($this->roles[$role]) || (count($this->roles) <= 1) )
+			return;
+		unset($this->caps[$role]);
+		update_usermeta($this->id, $this->cap_key, $this->caps);
+		$this->get_role_caps();
+	}
+	
+	function set_role($role) {
+		foreach($this->roles as $oldrole) 
+			unset($this->caps[$oldrole]);
+		$this->caps[$role] = true;
+		$this->roles = array($role => true);
+		update_usermeta($this->id, $this->cap_key, $this->caps);
+		$this->get_role_caps();
+		$this->update_user_level_from_caps();
+	}
+
+	function level_reduction($max, $item) {
+	    if(preg_match('/^level_(10|[0-9])$/i', $item, $matches)) {
+	        $level = intval($matches[1]);
+	        return max($max, $level);
+	    } else {
+	        return $max;
+	    }
+	}
+	
+	function update_user_level_from_caps() {
+	    global $table_prefix;
+	    $this->user_level = array_reduce(array_keys($this->allcaps), 	array(&$this, 'level_reduction'), 0);
+	    update_usermeta($this->id, $table_prefix.'user_level', $this->user_level);
+	}
+	
+	function add_cap($cap, $grant = true) {
+		$this->caps[$cap] = $grant;
+		update_usermeta($this->id, $this->cap_key, $this->caps);
+	}
+
+	function remove_cap($cap) {
+		if ( empty($this->caps[$cap]) ) return;
+		unset($this->caps[$cap]);
+		update_usermeta($this->id, $this->cap_key, $this->caps);
+	}
+	
+	//has_cap(capability_or_role_name) or
+	//has_cap('edit_post', post_id)
+	function has_cap($cap) {
+		if ( is_numeric($cap) )
+			$cap = $this->translate_level_to_cap($cap);
+		
+		$args = array_slice(func_get_args(), 1);
+		$args = array_merge(array($cap, $this->id), $args);
+		$caps = call_user_func_array('map_meta_cap', $args);
+		// Must have ALL requested caps
+		$capabilities = apply_filters('user_has_cap', $this->allcaps, $caps, $args);
+		foreach ($caps as $cap) {
+			//echo "Checking cap $cap<br/>";
+			if(empty($capabilities[$cap]) || !$capabilities[$cap])
+				return false;
+		}
+
+		return true;
+	}
+
+	function translate_level_to_cap($level) {
+		return 'level_' . $level;
+	}
+
+}
+
+// Map meta capabilities to primitive capabilities.
+function map_meta_cap($cap, $user_id) {
+	$args = array_slice(func_get_args(), 2);
+	$caps = array();
+
+	switch ($cap) {
+		// edit_post breaks down to edit_posts, edit_published_posts, or
+		// edit_others_posts
+	case 'edit_post':
+		$author_data = get_userdata($user_id);
+		//echo "post ID: {$args[0]}<br/>";
+		$post = get_post($args[0]);
+		$post_author_data = get_userdata($post->post_author);
+		//echo "current user id : $user_id, post author id: " . $post_author_data->ID . "<br/>";
+		// If the user is the author...
+		if ($user_id == $post_author_data->ID) {
+			// If the post is published...
+			if ($post->post_status == 'publish')
+				$caps[] = 'edit_published_posts';
+			else if ($post->post_status == 'static')
+				$caps[] = 'edit_pages';
+			else
+				// If the post is draft...
+				$caps[] = 'edit_posts';
+		} else {
+			if ($post->post_status == 'static') {
+				$caps[] = 'edit_pages';
+				break;
+			}
+
+			// The user is trying to edit someone else's post.
+			$caps[] = 'edit_others_posts';
+			// The post is published, extra cap required.
+			if ($post->post_status == 'publish')
+				$caps[] = 'edit_published_posts';
+		}
+		break;
+	case 'read_post':
+		$post = get_post($args[0]);
+		
+		if ( 'private' != $post->post_status ) {
+			$caps[] = 'read';
+			break;	
+		}
+			
+		$author_data = get_userdata($user_id);
+		$post_author_data = get_userdata($post->post_author);
+		if ($user_id == $post_author_data->ID)
+			$caps[] = 'read';
+		else
+			$caps[] = 'read_private_posts';
+		break;
+	default:
+		// If no meta caps match, return the original cap.
+		$caps[] = $cap;
+	}
+
+	return $caps;
+}
+
+// Capability checking wrapper around the global $current_user object.
+function current_user_can($capability) {
+	$current_user = wp_get_current_user();
+
+	$args = array_slice(func_get_args(), 1);
+	$args = array_merge(array($capability), $args);
+
+	if ( empty($current_user) )
+		return false;
+
+	return call_user_func_array(array(&$current_user, 'has_cap'), $args);
+}
+
+// Convenience wrappers around $wp_roles.
+function get_role($role) {
+	global $wp_roles;
+
+	if ( ! isset($wp_roles) )
+		$wp_roles = new WP_Roles();
+
+	return $wp_roles->get_role($role);
+}
+
+function add_role($role, $display_name, $capabilities = '') {
+	global $wp_roles;
+
+	if ( ! isset($wp_roles) )
+		$wp_roles = new WP_Roles();
+
+	return $wp_roles->add_role($role, $display_name, $capabilities);
+}
+
+function remove_role($role) {
+	global $wp_roles;
+
+	if ( ! isset($wp_roles) )
+		$wp_roles = new WP_Roles();
+
+	return $wp_roles->remove_role($role);
+}
+
+//
+// These are deprecated.  Use current_user_can().
+//
+
+/* returns true if $user_id can create a new post */
+function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') {
+	$author_data = get_userdata($user_id);
+	return ($author_data->user_level > 1);
+}
+
+/* returns true if $user_id can create a new post */
+function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') {
+	$author_data = get_userdata($user_id);
+	return ($author_data->user_level >= 1);
+}
+
+/* returns true if $user_id can edit $post_id */
+function user_can_edit_post($user_id, $post_id, $blog_id = 1) {
+	$author_data = get_userdata($user_id);
+	$post = get_post($post_id);
+	$post_author_data = get_userdata($post->post_author);
+
+	if ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' &&  $author_data->user_level < 2))
+	     || ($author_data->user_level > $post_author_data->user_level)
+	     || ($author_data->user_level >= 10) ) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/* returns true if $user_id can delete $post_id */
+function user_can_delete_post($user_id, $post_id, $blog_id = 1) {
+	// right now if one can edit, one can delete
+	return user_can_edit_post($user_id, $post_id, $blog_id);
+}
+
+/* returns true if $user_id can set new posts' dates on $blog_id */
+function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') {
+	$author_data = get_userdata($user_id);
+	return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id));
+}
+
+/* returns true if $user_id can edit $post_id's date */
+function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) {
+	$author_data = get_userdata($user_id);
+	return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id));
+}
+
+/* returns true if $user_id can edit $post_id's comments */
+function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) {
+	// right now if one can edit a post, one can edit comments made on it
+	return user_can_edit_post($user_id, $post_id, $blog_id);
+}
+
+/* returns true if $user_id can delete $post_id's comments */
+function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) {
+	// right now if one can edit comments, one can delete comments
+	return user_can_edit_post_comments($user_id, $post_id, $blog_id);
+}
+
+function user_can_edit_user($user_id, $other_user) {
+	$user  = get_userdata($user_id);
+	$other = get_userdata($other_user);
+	if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID )
+		return true;
+	else
+		return false;
+}
+
+?>
diff -ruN 1.5.2/wp-includes/classes.php 2.0.4/wp-includes/classes.php
--- 1.5.2/wp-includes/classes.php	2005-04-13 23:24:22.000000000 -0500
+++ 2.0.4/wp-includes/classes.php	2006-07-04 15:01:31.000000000 -0500
@@ -5,13 +5,16 @@
 	var $query_vars;
 	var $queried_object;
 	var $queried_object_id;
+	var $request;
 
 	var $posts;
 	var $post_count = 0;
 	var $current_post = -1;
+	var $in_the_loop = false;
 	var $post;
 
 	var $is_single = false;
+	var $is_preview = false;
 	var $is_page = false;
 	var $is_archive = false;
 	var $is_date = false;
@@ -28,8 +31,9 @@
 	var $is_404 = false;
 	var $is_comments_popup = false;
 	var $is_admin = false;
+	var $is_attachment = false;
 
-	function init () {
+	function init_query_flags() {
 		$this->is_single = false;
 		$this->is_page = false;
 		$this->is_archive = false;
@@ -47,7 +51,10 @@
 		$this->is_404 = false;
 		$this->is_paged = false;
 		$this->is_admin = false;
-
+		$this->is_attachment = false;
+	}
+	
+	function init () {
 		unset($this->posts);
 		unset($this->query);
 		unset($this->query_vars);
@@ -55,6 +62,9 @@
 		unset($this->queried_object_id);
 		$this->post_count = 0;
 		$this->current_post = -1;
+		$this->in_the_loop = false;
+		
+		$this->init_query_flags();
 	}
 
 	// Reparse the query vars.
@@ -71,22 +81,47 @@
 			$this->query_vars = $qv;
 		}
 
+		if ('404' == $qv['error']) {
+			$this->is_404 = true;
+			if ( !empty($query) ) {
+				do_action('parse_query', array(&$this));
+			}
+			return;
+		}
+
 		$qv['m'] =  (int) $qv['m'];
 		$qv['p'] =  (int) $qv['p'];
 
-		if ('' != $qv['name']) {
+		// Compat.  Map subpost to attachment.
+		if ( '' != $qv['subpost'] )
+			$qv['attachment'] = $qv['subpost'];
+		if ( '' != $qv['subpost_id'] )
+			$qv['attachment_id'] = $qv['subpost_id'];
+			
+		if ( ('' != $qv['attachment']) || (int) $qv['attachment_id'] ) {
+			$this->is_single = true;
+			$this->is_attachment = true;
+		} elseif ('' != $qv['name']) {
 			$this->is_single = true;
 		} elseif ( $qv['p'] ) {
 			$this->is_single = true;
 		} elseif (('' != $qv['hour']) && ('' != $qv['minute']) &&('' != $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day'])) {
 			// If year, month, day, hour, minute, and second are set, a single 
-		  // post is being queried.        
+			// post is being queried.        
 			$this->is_single = true;
 		} elseif ('' != $qv['static'] || '' != $qv['pagename'] || '' != $qv['page_id']) {
 			$this->is_page = true;
 			$this->is_single = false;
 		} elseif (!empty($qv['s'])) {
 			$this->is_search = true;
+			switch ($qv['show_post_type']) {
+			case 'page' :
+				$this->is_page = true;
+				break;
+			case 'attachment' :
+				$this->is_attachment = true;
+				break;
+			}
 		} else {
 		// Look for archive queries.  Dates, categories, authors.
 
@@ -170,6 +205,10 @@
 			if ( ($this->is_date || $this->is_author || $this->is_category)) {
 				$this->is_archive = true;
 			}
+
+			if ( 'attachment' == $qv['show_post_type'] ) {
+				$this->is_attachment = true;
+			}
 		}
 
 		if ('' != $qv['feed']) {
@@ -180,10 +219,6 @@
 			$this->is_trackback = true;
 		}
 
-		if ('404' == $qv['error']) {
-			$this->is_404 = true;
-		}
-
 		if ('' != $qv['paged']) {
 			$this->is_paged = true;
 		}
@@ -191,12 +226,17 @@
 		if ('' != $qv['comments_popup']) {
 			$this->is_comments_popup = true;
 		}
+		
+		//if we're previewing inside the write screen
+		if ('' != $qv['preview']) {
+			$this->is_preview = true;
+		}
 
 		if (strstr($_SERVER['PHP_SELF'], 'wp-admin/')) {
 			$this->is_admin = true;
 		}
 
-		if ( ! ($this->is_archive || $this->is_single || $this->is_page || $this->is_search || $this->is_feed || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_comments_popup)) {
+		if ( ! ($this->is_attachment || $this->is_archive || $this->is_single || $this->is_page || $this->is_search || $this->is_feed || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_comments_popup)) {
 			$this->is_home = true;
 		}
 
@@ -205,6 +245,11 @@
 		}
 	}
 
+	function set_404() {
+		$this->init_query_flags();
+		$this->is_404 = true;	
+	}
+	
 	function get($query_var) {
 		if (isset($this->query_vars[$query_var])) {
 			return $this->query_vars[$query_var];
@@ -218,7 +263,9 @@
 	}
 
 	function &get_posts() {
-		global $wpdb, $pagenow, $request, $user_ID;
+		global $wpdb, $pagenow, $user_ID;
+
+		do_action('pre_get_posts', array(&$this));
 
 		// Shorthand.
 		$q = $this->query_vars;	
@@ -226,6 +273,7 @@
 		// First let's clear some variables
 		$whichcat = '';
 		$whichauthor = '';
+		$whichpage = '';
 		$result = '';
 		$where = '';
 		$limits = '';
@@ -257,6 +305,7 @@
 		if (isset($q['page'])) {
 			$q['page'] = trim($q['page'], '/');
 			$q['page'] = (int) $q['page'];
+			$q['page'] = abs($q['page']);
 		}
 	
 		$add_hours = intval(get_settings('gmt_offset'));
@@ -309,16 +358,43 @@
 			$where .= " AND DAYOFMONTH(post_date)='" . $q['day'] . "'";
 		}
 
+		// Compat.  Map subpost to attachment.
+		if ( '' != $q['subpost'] )
+			$q['attachment'] = $q['subpost'];
+		if ( '' != $q['subpost_id'] )
+			$q['attachment_id'] = $q['subpost_id'];
+
 		if ('' != $q['name']) {
 			$q['name'] = sanitize_title($q['name']);
 			$where .= " AND post_name = '" . $q['name'] . "'";
 		} else if ('' != $q['pagename']) {
-			$q['pagename'] = sanitize_title(basename(str_replace('%2F', '/', urlencode($q['pagename']))));
+			$q['pagename'] = str_replace('%2F', '/', urlencode(urldecode($q['pagename'])));
+			$page_paths = '/' . trim($q['pagename'], '/');
+			$q['pagename'] = sanitize_title(basename($page_paths));
 			$q['name'] = $q['pagename'];
-			$where .= " AND post_name = '" . $q['pagename'] . "'";
+			$page_paths = explode('/', $page_paths);
+			foreach($page_paths as $pathdir)
+				$page_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir);
+				
+			$all_page_ids = get_all_page_ids();
+			$reqpage = 0;
+			if (is_array($all_page_ids)) { foreach ( $all_page_ids as $page_id ) {
+				$page = get_page($page_id);
+				if ( $page->fullpath == $page_path ) {
+					$reqpage = $page_id;
+					break;
+				}
+			} }
+			
+			$where .= " AND (ID = '$reqpage')";
+		} elseif ('' != $q['attachment']) {
+			$q['attachment'] = str_replace('%2F', '/', urlencode(urldecode($q['attachment'])));
+			$attach_paths = '/' . trim($q['attachment'], '/');
+			$q['attachment'] = sanitize_title(basename($attach_paths));
+			$q['name'] = $q['attachment'];
+			$where .= " AND post_name = '" . $q['attachment'] . "'";
 		}
 
-
 		if ( (int) $q['w'] ) {
 			$q['w'] = ''.intval($q['w']);
 			$where .= " AND WEEK(post_date, 1)='" . $q['w'] . "'";
@@ -327,6 +403,10 @@
 		if ( intval($q['comments_popup']) )
 			$q['p'] = intval($q['comments_popup']);
 
+		// If a attachment is requested by number, let it supercede any post number.
+		if ( ($q['attachment_id'] != '') && (intval($q['attachment_id']) != 0) )
+			$q['p'] = (int) $q['attachment_id'];
+
 		// If a post number is specified, load that post
 		if (($q['p'] != '') && intval($q['p']) != 0) {
 			$q['p'] =  (int) $q['p'];
@@ -403,20 +483,34 @@
 
 		// Category stuff for nice URIs
 
+		global $cache_categories;
 		if ('' != $q['category_name']) {
-			if (stristr($q['category_name'],'/')) {
-				$q['category_name'] = explode('/',$q['category_name']);
-				if ($q['category_name'][count($q['category_name'])-1]) {
-					$q['category_name'] = $q['category_name'][count($q['category_name'])-1]; // no trailing slash
-				} else {
-					$q['category_name'] = $q['category_name'][count($q['category_name'])-2]; // there was a trailling slash
+			$cat_paths = '/' . trim(urldecode($q['category_name']), '/');
+			$q['category_name'] = sanitize_title(basename($cat_paths));
+			$cat_paths = explode('/', $cat_paths);
+			foreach($cat_paths as $pathdir)
+				$cat_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir);
+
+			$all_cat_ids = get_all_category_ids();
+			$q['cat'] = 0; $partial_match = 0;
+			foreach ( $all_cat_ids as $cat_id ) {
+				$cat = get_category($cat_id);
+				if ( $cat->fullpath == $cat_path ) {
+					$q['cat'] = $cat_id;
+					break;
+				} elseif ( $cat->category_nicename == $q['category_name'] ) {
+					$partial_match = $cat_id;
 				}
 			}
-			$q['category_name'] = sanitize_title($q['category_name']);
+			
+			//if we don't match the entire hierarchy fallback on just matching the nicename
+			if (!$q['cat'] && $partial_match) {
+				$q['cat'] = $partial_match;
+			}			
+
 			$tables = ", $wpdb->post2cat, $wpdb->categories";
 			$join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) LEFT JOIN $wpdb->categories ON ($wpdb->post2cat.category_id = $wpdb->categories.cat_ID) ";
-			$whichcat = " AND (category_nicename = '" . $q['category_name'] . "'";
-			$q['cat'] = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE category_nicename = '" . $q['category_name'] . "'");
+			$whichcat = " AND (category_id = '" . $q['cat'] . "'";
 			$whichcat .= get_category_children($q['cat'], " OR category_id = ");
 			$whichcat .= ")";
 		}
@@ -460,7 +554,7 @@
 			$q['author'] = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_nicename='".$q['author_name']."'");
 			$whichauthor .= ' AND (post_author = '.intval($q['author']).')';
 		}
-
+		
 		$where .= $search.$whichcat.$whichauthor;
 
 		if ((empty($q['order'])) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC'))) {
@@ -472,7 +566,7 @@
 			$q['orderby']='date '.$q['order'];
 		} else {
 			// Used to filter values
-			$allowed_keys = array('author','date','category','title');
+			$allowed_keys = array('author', 'date', 'category', 'title', 'modified');
 			$q['orderby'] = urldecode($q['orderby']);
 			$q['orderby'] = addslashes_gpc($q['orderby']);
 			$orderby_array = explode(' ',$q['orderby']);
@@ -491,13 +585,17 @@
 		}
 
 		$now = gmdate('Y-m-d H:i:59');
-
-		if ($pagenow != 'post.php' && $pagenow != 'edit.php') {
+		
+		//only select past-dated posts, except if a logged in user is viewing a single: then, if they
+		//can edit the post, we let them through
+		if ($pagenow != 'post.php' && $pagenow != 'edit.php' && !($this->is_single && $user_ID)) {
 			$where .= " AND post_date_gmt <= '$now'";
 			$distinct = 'DISTINCT';
 		}
 
-		if ($this->is_page) {
+		if ( $this->is_attachment ) {
+			$where .= ' AND (post_status = "attachment")';
+		} elseif ($this->is_page) {
 			$where .= ' AND (post_status = "static")';
 		} elseif ($this->is_single) {
 			$where .= ' AND (post_status != "static")';
@@ -510,22 +608,31 @@
 				$where .= ')';				
 		}
 
+		if (! $this->is_attachment )
+			$where .= ' AND post_status != "attachment"';
+
 		// Apply filters on where and join prior to paging so that any
 		// manipulations to them are reflected in the paging by day queries.
 		$where = apply_filters('posts_where', $where);
 		$join = apply_filters('posts_join', $join);
 
 		// Paging
-		if (empty($q['nopaging']) && ! $this->is_single) {
-			$page = $q['paged'];
+		if (empty($q['nopaging']) && ! $this->is_single && ! $this->is_page) {
+			$page = abs(intval($q['paged']));
 			if (empty($page)) {
 				$page = 1;
 			}
 
 			if (($q['what_to_show'] == 'posts')) {
-				$pgstrt = '';
-				$pgstrt = (intval($page) -1) * $q['posts_per_page'] . ', ';
-				$limits = 'LIMIT '.$pgstrt.$q['posts_per_page'];
+				$q['offset'] = abs(intval($q['offset']));
+				if ( empty($q['offset']) ) {
+					$pgstrt = '';
+					$pgstrt = (intval($page) -1) * $q['posts_per_page'] . ', ';
+					$limits = 'LIMIT '.$pgstrt.$q['posts_per_page'];
+				} else { // we're ignoring $page and using 'offset'
+					$pgstrt = $q['offset'] . ', ';
+					$limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];
+				}
 			} elseif ($q['what_to_show'] == 'days') {
 				$startrow = $q['posts_per_page'] * (intval($page)-1);
 				$start_date = $wpdb->get_var("SELECT max(post_date) FROM $wpdb->posts $join WHERE (1=1) $where GROUP BY year(post_date), month(post_date), dayofmonth(post_date) ORDER BY post_date DESC LIMIT $startrow,1");
@@ -543,40 +650,54 @@
 		// Apply post-paging filters on where and join.  Only plugins that
 		// manipulate paging queries should use these hooks.
 		$where = apply_filters('posts_where_paged', $where);
-		$where .= " GROUP BY $wpdb->posts.ID";
+		$groupby = " $wpdb->posts.ID ";
+		$groupby = apply_filters('posts_groupby', $groupby);
 		$join = apply_filters('posts_join_paged', $join);
 		$orderby = "post_" . $q['orderby'];
 		$orderby = apply_filters('posts_orderby', $orderby); 
-		$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1".$where." ORDER BY " . $orderby . " $limits";
+		$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";
+		$this->request = apply_filters('posts_request', $request);
 
-		$this->posts = $wpdb->get_results($request);
+		$this->posts = $wpdb->get_results($this->request);
 
 		// Check post status to determine if post should be displayed.
-		if ($this->is_single) {
-			if ('publish' != $this->posts[0]->post_status) {
+		if ( !empty($this->posts) && $this->is_single ) {
+			$status = get_post_status($this->posts[0]);
+			if ( ('publish' != $status) && ('static' != $status) ) {
 				if ( ! (isset($user_ID) && ('' != intval($user_ID))) ) {
 					// User must be logged in to view unpublished posts.
 					$this->posts = array();
 				} else {
-					if ('draft' == $this->posts[0]->post_status) {
+					if ('draft' == $status) {
 						// User must have edit permissions on the draft to preview.
-						if (! user_can_edit_post($user_ID, $this->posts[0]->ID))
+						if (! current_user_can('edit_post', $this->posts[0]->ID)) {
 							$this->posts = array();
-					} elseif ('private' == $this->posts[0]->post_status) {
-						if ($this->posts[0]->post_author != $user_ID)
+						} else {
+							$this->is_preview = true;
+							$this->posts[0]->post_date = current_time('mysql');
+						}
+					} else {
+						if (! current_user_can('read_post', $this->posts[0]->ID))
 							$this->posts = array();
 					}
 				}
+			} else {
+				if (mysql2date('U', $this->posts[0]->post_date_gmt) > mysql2date('U', $now)) { //it's future dated
+					$this->is_preview = true;
+					if (!current_user_can('edit_post', $this->posts[0]->ID)) {
+						$this->posts = array ( );
+					}
+				}
 			}
 		}
 
+		update_post_caches($this->posts);
+
 		$this->posts = apply_filters('the_posts', $this->posts);
 		$this->post_count = count($this->posts);
 		if ($this->post_count > 0) {
 			$this->post = $this->posts[0];
 		}
-
-		update_post_caches($this->posts);
 		
 		// Save any changes made to the query vars.
 		$this->query_vars = $q;
@@ -593,15 +714,24 @@
 
 	function the_post() {
 		global $post;
+		$this->in_the_loop = true;
 		$post = $this->next_post();
 		setup_postdata($post);
+
+		if ( $this->current_post == 0 ) // loop has just started
+			do_action('loop_start');
 	}
 
 	function have_posts() {
 		if ($this->current_post + 1 < $this->post_count) {
 			return true;
+		} elseif ($this->current_post + 1 == $this->post_count) {
+			do_action('loop_end');
+			// Do some cleaning up after the loop
+			$this->rewind_posts();
 		}
 
+		$this->in_the_loop = false;
 		return false;
 	}
 
@@ -626,9 +756,10 @@
 		$this->queried_object_id = 0;
 
 		if ($this->is_category) {
-			$category = &get_category($this->get('cat'));
+			$cat = $this->get('cat');
+			$category = &get_category($cat);
 			$this->queried_object = &$category;
-			$this->queried_object_id = $this->get('cat');
+			$this->queried_object_id = $cat;
 		} else if ($this->is_single) {
 			$this->queried_object = $this->post;
 			$this->queried_object_id = $this->post->ID;
@@ -636,11 +767,10 @@
 			$this->queried_object = $this->post;
 			$this->queried_object_id = $this->post->ID;
 		} else if ($this->is_author) {
-			global $cache_userdata;
-			if (isset($cache_userdata[$this->get('author')])) {
-				$this->queried_object = $cache_userdata[$this->get('author')];
-				$this->queried_object_id = $this->get('author');
-			}
+			$author_id = $this->get('author');
+			$author = get_userdata($author_id);
+			$this->queried_object = $author;
+			$this->queried_object_id = $author_id;
 		}
 
 		return $this->queried_object;
@@ -663,11 +793,6 @@
 	}
 }
 
-// Make a global instance.
-if (! isset($wp_query)) {
-    $wp_query = new WP_Query();
-}
-
 class retrospam_mgr {
 	var $spam_words;
 	var $comments_list;
@@ -704,10 +829,11 @@
 		foreach( $this->comment_list as $comment ) {
 			if( $comment->approved == 1 ) {
 				foreach( $this->spam_words as $word ) {
+					$word = trim($word);
 					if ( empty( $word ) )
 						continue;
 					$fulltext = strtolower($comment->email.' '.$comment->url.' '.$comment->ip.' '.$comment->text);
-					if( strpos( $fulltext, strtolower(trim($word)) ) != FALSE ) {
+					if( false !== strpos( $fulltext, strtolower($word) ) ) {
 						$this->found_comments[] = $comment->ID;
 						break;
 					}
@@ -758,6 +884,7 @@
 	var $index = 'index.php';
 	var $matches = '';
 	var $rules;
+	var $use_verbose_rules = false;
 	var $rewritecode = 
 		array(
 					'%year%',
@@ -792,19 +919,19 @@
 
 	var $queryreplace = 
 		array (
-					 'year=',
-					 'monthnum=',
-					 'day=',
-					 'hour=',
-					 'minute=',
-					 'second=',
-					 'name=',
-					 'p=',
-					 'category_name=',
-					 'author_name=',
-					 'pagename=',
-					 's='
-					 );
+					'year=',
+					'monthnum=',
+					'day=',
+					'hour=',
+					'minute=',
+					'second=',
+					'name=',
+					'p=',
+					'category_name=',
+					'author_name=',
+					'pagename=',
+					's='
+					);
 
 	var $feeds = array ('feed', 'rdf', 'rss', 'rss2', 'atom');
 
@@ -816,16 +943,16 @@
 	}					
 
 	function using_index_permalinks() {
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			return false;
-    }
+		}
 
-    // If the index is not in the permalink, we're using mod_rewrite.
-    if (preg_match('#^/*' . $this->index . '#', $this->permalink_structure)) {
-      return true;
-    }
+		// If the index is not in the permalink, we're using mod_rewrite.
+		if (preg_match('#^/*' . $this->index . '#', $this->permalink_structure)) {
+			return true;
+		}
     
-    return false;
+		return false;
 	}
 
 	function using_mod_rewrite_permalinks() {
@@ -836,29 +963,35 @@
 	}					
 
 	function preg_index($number) {
-    $match_prefix = '$';
-    $match_suffix = '';
-    
-    if (! empty($this->matches)) {
+		$match_prefix = '$';
+		$match_suffix = '';
+
+		if (! empty($this->matches)) {
 			$match_prefix = '$' . $this->matches . '['; 
 			$match_suffix = ']';
-    }        
-    
-    return "$match_prefix$number$match_suffix";        
+		}        
+
+		return "$match_prefix$number$match_suffix";        
 	}
 
 	function page_rewrite_rules() {
 		$uris = get_settings('page_uris');
+		$attachment_uris = get_settings('page_attachment_uris');
 
 		$rewrite_rules = array();
 		$page_structure = $this->get_page_permastruct();
-		if( is_array( $uris ) )
-			{
-				foreach ($uris as $uri => $pagename) {
-					$this->add_rewrite_tag('%pagename%', "($uri)", 'pagename=');
-					$rewrite_rules += $this->generate_rewrite_rules($page_structure);
-				}
+		if( is_array( $attachment_uris ) ) {
+			foreach ($attachment_uris as $uri => $pagename) {
+				$this->add_rewrite_tag('%pagename%', "($uri)", 'attachment=');
+				$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure));
+			}
+		}
+		if( is_array( $uris ) ) {
+			foreach ($uris as $uri => $pagename) {
+				$this->add_rewrite_tag('%pagename%', "($uri)", 'pagename=');
+				$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure));
 			}
+		}
 
 		return $rewrite_rules;
 	}
@@ -868,7 +1001,7 @@
 			return $this->date_structure;
 		}
 
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			$this->date_structure = '';
 			return false;
 		}
@@ -907,7 +1040,7 @@
 	}
 
 	function get_year_permastruct() {
-		$structure = $this->get_date_permastruct($permalink_structure);
+		$structure = $this->get_date_permastruct($this->permalink_structure);
 
 		if (empty($structure)) {
 			return false;
@@ -922,7 +1055,7 @@
 	}
 
 	function get_month_permastruct() {
-		$structure = $this->get_date_permastruct($permalink_structure);
+		$structure = $this->get_date_permastruct($this->permalink_structure);
 
 		if (empty($structure)) {
 			return false;
@@ -936,7 +1069,7 @@
 	}
 
 	function get_day_permastruct() {
-		return $this->get_date_permastruct($permalink_structure);
+		return $this->get_date_permastruct($this->permalink_structure);
 	}
 
 	function get_category_permastruct() {
@@ -944,7 +1077,7 @@
 			return $this->category_structure;
 		}
 
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			$this->category_structure = '';
 			return false;
 		}
@@ -964,7 +1097,7 @@
 			return $this->author_structure;
 		}
 
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			$this->author_structure = '';
 			return false;
 		}
@@ -979,7 +1112,7 @@
 			return $this->search_structure;
 		}
 
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			$this->search_structure = '';
 			return false;
 		}
@@ -994,7 +1127,7 @@
 			return $this->page_structure;
 		}
 
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			$this->page_structure = '';
 			return false;
 		}
@@ -1009,7 +1142,7 @@
 			return $this->feed_structure;
 		}
 
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			$this->feed_structure = '';
 			return false;
 		}
@@ -1024,7 +1157,7 @@
 			return $this->comment_feed_structure;
 		}
 
-    if (empty($this->permalink_structure)) {
+		if (empty($this->permalink_structure)) {
 			$this->comment_feed_structure = '';
 			return false;
 		}
@@ -1049,7 +1182,7 @@
 		}
 	}
 
-	function generate_rewrite_rules($permalink_structure, $page = true, $feed = true, $forcomments = false, $walk_dirs = true) {
+	function generate_rewrite_rules($permalink_structure, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true) {
 		$feedregex2 = '';
 		foreach ($this->feeds as $feed_name) {
 			$feedregex2 .= $feed_name . '|';
@@ -1117,18 +1250,35 @@
 			$rewrite = array();
 			if ($feed) 
 				$rewrite = array($feedmatch => $feedquery, $feedmatch2 => $feedquery2);
-			if ($page)
-				$rewrite = $rewrite + array($pagematch => $pagequery);
+			if ($paged)
+				$rewrite = array_merge($rewrite, array($pagematch => $pagequery));
 
 			if ($num_toks) {
-				$post = 0;
+				$post = false;
+				$page = false;
 				if (strstr($struct, '%postname%') || strstr($struct, '%post_id%')
 						|| strstr($struct, '%pagename%')
 						|| (strstr($struct, '%year%') &&  strstr($struct, '%monthnum%') && strstr($struct, '%day%') && strstr($struct, '%hour%') && strstr($struct, '%minute') && strstr($struct, '%second%'))) {
-					$post = 1;
+					$post = true;
+					if  ( strstr($struct, '%pagename%') )
+						$page = true;
 					$trackbackmatch = $match . $trackbackregex;
 					$trackbackquery = $trackbackindex . '?' . $query . '&tb=1';
 					$match = rtrim($match, '/');
+					$submatchbase = str_replace(array('(',')'),'',$match);
+					$sub1 = $submatchbase . '/([^/]+)/';
+					$sub1tb = $sub1 . $trackbackregex;
+					$sub1feed = $sub1 . $feedregex;
+					$sub1feed2 = $sub1 . $feedregex2;
+					$sub1 .= '?$';
+					$sub2 = $submatchbase . '/attachment/([^/]+)/';
+					$sub2tb = $sub2 . $trackbackregex;
+					$sub2feed = $sub2 . $feedregex;
+					$sub2feed2 = $sub2 . $feedregex2;
+					$sub2 .= '?$';
+					$subquery = $index . '?attachment=' . $this->preg_index(1);
+					$subtbquery = $subquery . '&tb=1';
+					$subfeedquery = $subquery . '&feed=' . $this->preg_index(2);
 					$match = $match . '(/[0-9]+)?/?$';
 					$query = $index . '?' . $query . '&page=' . $this->preg_index($num_toks + 1);
 				} else {
@@ -1136,16 +1286,17 @@
 					$query = $index . '?' . $query;
 				}
 				        
-				$rewrite = $rewrite + array($match => $query);
+				$rewrite = array_merge($rewrite, array($match => $query));
 
 				if ($post) {
-					$rewrite = array($trackbackmatch => $trackbackquery) + $rewrite;
+					$rewrite = array_merge(array($trackbackmatch => $trackbackquery), $rewrite);
+					if ( ! $page )
+						$rewrite = array_merge($rewrite, array($sub1 => $subquery, $sub1tb => $subtbquery, $sub1feed => $subfeedquery, $sub1feed2 => $subfeedquery));
+					$rewrite = array_merge($rewrite, array($sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery));
 				}
 			}
-
-			$post_rewrite = $rewrite + $post_rewrite;
+			$post_rewrite = array_merge($rewrite, $post_rewrite);
 		}
-
 		return $post_rewrite;
 	}
 
@@ -1177,7 +1328,7 @@
 		$root_rewrite = apply_filters('root_rewrite_rules', $root_rewrite);
 
 		// Comments
-		$comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, true, true, true);
+		$comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, true, true, true, false);
 		$comments_rewrite = apply_filters('comments_rewrite_rules', $comments_rewrite);
 
 		// Search
@@ -1198,16 +1349,23 @@
 		$page_rewrite = apply_filters('page_rewrite_rules', $page_rewrite);
 
 		// Put them together.
-		$this->rules = $page_rewrite + $root_rewrite + $comments_rewrite + $search_rewrite + $category_rewrite + $author_rewrite + $date_rewrite + $post_rewrite;
+		$this->rules = array_merge($page_rewrite, $root_rewrite, $comments_rewrite, $search_rewrite, $category_rewrite, $author_rewrite, $date_rewrite, $post_rewrite);
 
 		do_action('generate_rewrite_rules', array(&$this));
 		$this->rules = apply_filters('rewrite_rules_array', $this->rules);
+
 		return $this->rules;
 	}
 
 	function wp_rewrite_rules() {
-		$this->matches = 'matches';
-		return $this->rewrite_rules();
+		$this->rules = get_option('rewrite_rules');
+		if ( empty($this->rules) ) {
+			$this->matches = 'matches';
+			$this->rewrite_rules();
+			update_option('rewrite_rules', $this->rules);
+		}
+
+		return $this->rules;
 	}
 
 	function mod_rewrite_rules() {
@@ -1224,29 +1382,37 @@
 		$rules = "<IfModule mod_rewrite.c>\n";
 		$rules .= "RewriteEngine On\n";
 		$rules .= "RewriteBase $home_root\n";
-		$this->matches = '';
-		$rewrite = $this->rewrite_rules();
-		$num_rules = count($rewrite);
-		$rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" .
-			"RewriteCond %{REQUEST_FILENAME} -d\n" .
-			"RewriteRule ^.*$ - [S=$num_rules]\n";
-
-		foreach ($rewrite as $match => $query) {
-			// Apache 1.3 does not support the reluctant (non-greedy) modifier.
-			$match = str_replace('.+?', '.+', $match);
-
-			// If the match is unanchored and greedy, prepend rewrite conditions
-			// to avoid infinite redirects and eclipsing of real files.
-			if ($match == '(.+)/?$' || $match == '([^/]+)/?$' ) {
-				//nada.
-			}
 
-			if (strstr($query, $this->index)) {
-				$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";
-			} else {
-				$rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n";
+		if ($this->use_verbose_rules) {
+			$this->matches = '';
+			$rewrite = $this->rewrite_rules();
+			$num_rules = count($rewrite);
+			$rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" .
+				"RewriteCond %{REQUEST_FILENAME} -d\n" .
+				"RewriteRule ^.*$ - [S=$num_rules]\n";
+		
+			foreach ($rewrite as $match => $query) {
+				// Apache 1.3 does not support the reluctant (non-greedy) modifier.
+				$match = str_replace('.+?', '.+', $match);
+
+				// If the match is unanchored and greedy, prepend rewrite conditions
+				// to avoid infinite redirects and eclipsing of real files.
+				if ($match == '(.+)/?$' || $match == '([^/]+)/?$' ) {
+					//nada.
+				}
+			
+				if (strstr($query, $this->index)) {
+					$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";
+				} else {
+					$rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n";
+				}
 			}
+		} else {
+			$rules .= "RewriteCond %{REQUEST_FILENAME} !-f\n" .
+				"RewriteCond %{REQUEST_FILENAME} !-d\n" .
+				"RewriteRule . {$home_root}{$this->index} [L]\n";
 		}
+
 		$rules .= "</IfModule>\n";
 
 		$rules = apply_filters('mod_rewrite_rules', $rules);
@@ -1255,6 +1421,14 @@
 		return $rules;
 	}
 
+	function flush_rules() {
+		generate_page_rewrite_rules();
+		delete_option('rewrite_rules');
+		$this->wp_rewrite_rules();
+		if ( function_exists('save_mod_rewrite_rules') )
+			save_mod_rewrite_rules();
+	}
+
 	function init() {
 		$this->permalink_structure = get_settings('permalink_structure');
 		$this->front = substr($this->permalink_structure, 0, strpos($this->permalink_structure, '%'));		
@@ -1291,9 +1465,263 @@
 	}
 }
 
-// Make a global instance.
-if (! isset($wp_rewrite)) {
-    $wp_rewrite = new WP_Rewrite();
+class WP {
+	var $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview');
+
+	var $private_query_vars = array('posts_per_page', 'posts_per_archive_page', 'what_to_show', 'showposts', 'nopaging', 'show_post_type');
+
+	var $query_vars;
+	var $query_string;
+	var $request;
+	var $matched_rule;
+	var $matched_query;
+	var $did_permalink = false;
+
+	function parse_request($extra_query_vars = '') {
+		global $wp_rewrite;
+
+		$this->query_vars = array();
+
+		if (! empty($extra_query_vars))
+			parse_str($extra_query_vars, $extra_query_vars);
+		else
+			$extra_query_vars = array();
+
+		// Process PATH_INFO, REQUEST_URI, and 404 for permalinks.
+
+		// Fetch the rewrite rules.
+		$rewrite = $wp_rewrite->wp_rewrite_rules();
+
+		if (! empty($rewrite)) {
+			// If we match a rewrite rule, this will be cleared.
+			$error = '404';
+			$this->did_permalink = true;
+
+			$pathinfo = $_SERVER['PATH_INFO'];
+			$pathinfo_array = explode('?', $pathinfo);
+			$pathinfo = $pathinfo_array[0];
+			$req_uri = $_SERVER['REQUEST_URI'];
+			$req_uri_array = explode('?', $req_uri);
+			$req_uri = $req_uri_array[0];
+			$self = $_SERVER['PHP_SELF'];
+			$home_path = parse_url(get_settings('home'));
+			$home_path = $home_path['path'];
+			$home_path = trim($home_path, '/');
+
+			// Trim path info from the end and the leading home path from the
+			// front.  For path info requests, this leaves us with the requesting
+			// filename, if any.  For 404 requests, this leaves us with the
+			// requested permalink.	
+			$req_uri = str_replace($pathinfo, '', $req_uri);
+			$req_uri = trim($req_uri, '/');
+			$req_uri = preg_replace("|^$home_path|", '', $req_uri);
+			$req_uri = trim($req_uri, '/');
+			$pathinfo = trim($pathinfo, '/');
+			$pathinfo = preg_replace("|^$home_path|", '', $pathinfo);
+			$pathinfo = trim($pathinfo, '/');
+			$self = trim($self, '/');
+			$self = preg_replace("|^$home_path|", '', $self);
+			$self = str_replace($home_path, '', $self);
+			$self = trim($self, '/');
+
+			// The requested permalink is in $pathinfo for path info requests and
+			//  $req_uri for other requests.
+			if ( ! empty($pathinfo) && !preg_match('|^.*' . $wp_rewrite->index . '$|', $pathinfo) ) {
+				$request = $pathinfo;
+			} else {
+				// If the request uri is the index, blank it out so that we don't try to match it against a rule.
+				if ( $req_uri == $wp_rewrite->index )
+					$req_uri = '';
+				$request = $req_uri;
+			}
+
+			$this->request = $request;
+
+			// Look for matches.
+			$request_match = $request;
+			foreach ($rewrite as $match => $query) {
+				// If the requesting file is the anchor of the match, prepend it
+				// to the path info.
+				if ((! empty($req_uri)) && (strpos($match, $req_uri) === 0) && ($req_uri != $request)) {
+					$request_match = $req_uri . '/' . $request;
+				}
+
+				if (preg_match("!^$match!", $request_match, $matches) ||
+					preg_match("!^$match!", urldecode($request_match), $matches)) {
+					// Got a match.
+					$this->matched_rule = $match;
+
+					// Trim the query of everything up to the '?'.
+					$query = preg_replace("!^.+\?!", '', $query);
+
+					// Substitute the substring matches into the query.
+					eval("\$query = \"$query\";");
+					$this->matched_query = $query;
+
+					// Parse the query.
+					parse_str($query, $query_vars);
+
+					// If we're processing a 404 request, clear the error var
+					// since we found something.
+					if (isset($_GET['error']))
+						unset($_GET['error']);
+
+					if (isset($error))
+						unset($error);
+
+					break;
+				}
+			}
+
+			// If req_uri is empty or if it is a request for ourself, unset error.
+			if ( empty($request) || $req_uri == $self || strstr($_SERVER['PHP_SELF'], 'wp-admin/') ) {
+				if (isset($_GET['error']))
+					unset($_GET['error']);
+
+				if (isset($error))
+					unset($error);
+					
+				if ( isset($query_vars) && strstr($_SERVER['PHP_SELF'], 'wp-admin/') )
+					unset($query_vars);
+					
+				$this->did_permalink = false;
+			}
+		}
+
+		$this->public_query_vars = apply_filters('query_vars', $this->public_query_vars);
+
+		for ($i=0; $i<count($this->public_query_vars); $i += 1) {
+			$wpvar = $this->public_query_vars[$i];
+			if (isset($extra_query_vars[$wpvar]))
+				$this->query_vars[$wpvar] = $extra_query_vars[$wpvar];
+			elseif (isset($GLOBALS[$wpvar]))
+				$this->query_vars[$wpvar] = $GLOBALS[$wpvar];
+			elseif (!empty($_POST[$wpvar]))
+				$this->query_vars[$wpvar] = $_POST[$wpvar];
+			elseif (!empty($_GET[$wpvar]))
+				$this->query_vars[$wpvar] = $_GET[$wpvar];
+			elseif (!empty($query_vars[$wpvar]))
+				$this->query_vars[$wpvar] = $query_vars[$wpvar];
+			else
+				$this->query_vars[$wpvar] = '';
+		}
+
+		if ( isset($error) )
+			$this->query_vars['error'] = $error;
+	}
+
+	function send_headers() {
+		@header('X-Pingback: '. get_bloginfo('pingback_url'));
+		if ( is_user_logged_in() )
+			nocache_headers();
+		if ( !empty($this->query_vars['error']) && '404' == $this->query_vars['error'] ) {
+			status_header( 404 );
+			@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+		} else if ( empty($this->query_vars['feed']) ) {
+			@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+		} else {
+			// We're showing a feed, so WP is indeed the only thing that last changed
+			if ( $this->query_vars['withcomments'] )
+				$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastcommentmodified('GMT'), 0).' GMT';
+			else 
+				$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastpostmodified('GMT'), 0).' GMT';
+			$wp_etag = '"' . md5($wp_last_modified) . '"';
+			@header("Last-Modified: $wp_last_modified");
+			@header("ETag: $wp_etag");
+
+			// Support for Conditional GET
+			if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) $client_etag = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
+			else $client_etag = 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...	
+			$wp_modified_timestamp = strtotime($wp_last_modified);
+
+			if ( ($client_last_modified && $client_etag) ?
+					 (($client_modified_timestamp >= $wp_modified_timestamp) && ($client_etag == $wp_etag)) :
+					 (($client_modified_timestamp >= $wp_modified_timestamp) || ($client_etag == $wp_etag)) ) {
+				status_header( 304 );
+				exit;
+			}
+		}
+	}
+
+	function build_query_string() {
+		$this->query_string = '';
+
+		foreach ($this->public_query_vars as $wpvar) {
+			if (isset($this->query_vars[$wpvar]) && '' != $this->query_vars[$wpvar]) {
+				$this->query_string .= (strlen($this->query_string) < 1) ? '' : '&';
+				$this->query_string .= $wpvar . '=' . rawurlencode($this->query_vars[$wpvar]);
+			}
+		}
+
+		foreach ($this->private_query_vars as $wpvar) {
+			if (isset($GLOBALS[$wpvar]) && '' != $GLOBALS[$wpvar]) {
+				$this->query_string .= (strlen($this->query_string) < 1) ? '' : '&';
+				$this->query_string .= $wpvar . '=' . rawurlencode($GLOBALS[$wpvar]);
+			}
+		}
+
+		$this->query_string = apply_filters('query_string', $this->query_string);
+	}
+
+	function register_globals() {
+		global $wp_query;
+		// Extract updated query vars back into global namespace.
+		foreach ($wp_query->query_vars as $key => $value) {
+			$GLOBALS[$key] = $value;
+		}
+
+		$GLOBALS['query_string'] = & $this->query_string;
+		$GLOBALS['posts'] = & $wp_query->posts;
+		$GLOBALS['post'] = & $wp_query->post;
+		$GLOBALS['request'] = & $wp_query->request;
+
+		if ( is_single() || is_page() ) {
+			$GLOBALS['more'] = 1;
+			$GLOBALS['single'] = 1;
+		}
+	}
+
+	function init() {
+		wp_get_current_user();
+	}
+
+	function query_posts() {
+		$this->build_query_string();
+		query_posts($this->query_string);
+ 	}
+
+	function handle_404() {
+		global $wp_query;
+		// Issue a 404 if a permalink request doesn't match any posts.  Don't
+		// issue a 404 if one was already issued, if the request was a search,
+		// or if the request was a regular query string request rather than a
+		// permalink request.
+		if ( (0 == count($wp_query->posts)) && !is_404() && !is_search() && ( $this->did_permalink || (!empty($_SERVER['QUERY_STRING']) && (false === strpos($_SERVER['REQUEST_URI'], '?'))) ) ) {
+			$wp_query->set_404();
+			status_header( 404 );
+		}	elseif( is_404() != true ) {
+			status_header( 200 );
+		}
+	}
+
+	function main($query_args = '') {
+		$this->init();
+		$this->parse_request($query_args);
+		$this->send_headers();
+		$this->query_posts();
+		$this->handle_404();
+		$this->register_globals();
+	}
+
+	function WP() {
+		// Empty.
+	}
 }
 
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-includes/class-IXR.php 2.0.4/wp-includes/class-IXR.php
--- 1.5.2/wp-includes/class-IXR.php	2005-01-24 03:53:23.000000000 -0600
+++ 2.0.4/wp-includes/class-IXR.php	2005-12-07 18:08:12.000000000 -0600
@@ -1,15 +1,12 @@
 <?php
-
 /* 
-   IXR - The Inutio XML-RPC Library - (c) Incutio Ltd 2002
-   Version 1.62WP - Simon Willison, 11th July 2003 (htmlentities -> htmlspecialchars)
-           ^^^^^^ (We've made some changes)
+   IXR - The Inutio XML-RPC Library - (c) Incutio Ltd 2002-2005
+   Version 1.7 (beta) - Simon Willison, 23rd May 2005
    Site:   http://scripts.incutio.com/xmlrpc/
    Manual: http://scripts.incutio.com/xmlrpc/manual.php
    Made available under the BSD License: http://www.opensource.org/licenses/bsd-license.php
 */
 
-
 class IXR_Value {
     var $data;
     var $type;
@@ -90,6 +87,7 @@
             case 'struct':
                 $return = '<struct>'."\n";
                 foreach ($this->data as $name => $value) {
+					$name = htmlspecialchars($name);
                     $return .= "  <member><name>$name</name><value>";
                     $return .= $value->getXml()."</value></member>\n";
                 }
@@ -165,6 +163,7 @@
         return true;
     }
     function tag_open($parser, $tag, $attr) {
+		$this->_currentTagContents = '';
         $this->currentTag = $tag;
         switch($tag) {
             case 'methodCall':
@@ -191,42 +190,35 @@
         switch($tag) {
             case 'int':
             case 'i4':
-                $value = (int)trim($this->_currentTagContents);
-                $this->_currentTagContents = '';
+                $value = (int) trim($this->_currentTagContents);
                 $valueFlag = true;
                 break;
             case 'double':
-                $value = (double)trim($this->_currentTagContents);
-                $this->_currentTagContents = '';
+                $value = (double) trim($this->_currentTagContents);
                 $valueFlag = true;
                 break;
             case 'string':
-                $value = (string)trim($this->_currentTagContents);
-                $this->_currentTagContents = '';
+                $value = $this->_currentTagContents;
                 $valueFlag = true;
                 break;
             case 'dateTime.iso8601':
                 $value = new IXR_Date(trim($this->_currentTagContents));
                 // $value = $iso->getTimestamp();
-                $this->_currentTagContents = '';
                 $valueFlag = true;
                 break;
             case 'value':
                 // "If no type is indicated, the type is string."
                 if (trim($this->_currentTagContents) != '') {
                     $value = (string)$this->_currentTagContents;
-                    $this->_currentTagContents = '';
                     $valueFlag = true;
                 }
                 break;
             case 'boolean':
-                $value = (boolean)trim($this->_currentTagContents);
-                $this->_currentTagContents = '';
+                $value = (boolean) trim($this->_currentTagContents);
                 $valueFlag = true;
                 break;
             case 'base64':
-                $value = base64_decode( trim($this->_currentTagContents) );
-                $this->_currentTagContents = '';
+                $value = base64_decode( trim( $this->_currentTagContents ) );
                 $valueFlag = true;
                 break;
             /* Deal with stacks of arrays and structs */
@@ -241,19 +233,12 @@
                 break;
             case 'name':
                 $this->_currentStructName[] = trim($this->_currentTagContents);
-                $this->_currentTagContents = '';
                 break;
             case 'methodName':
                 $this->methodName = trim($this->_currentTagContents);
-                $this->_currentTagContents = '';
                 break;
         }
         if ($valueFlag) {
-            /*
-            if (!is_array($value) && !is_object($value)) {
-                $value = trim($value);
-            }
-            */
             if (count($this->_arraystructs) > 0) {
                 // Add value to struct or array
                 if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {
@@ -268,6 +253,7 @@
                 $this->params[] = $value;
             }
         }
+		$this->_currentTagContents = '';
     }       
 }
 
@@ -469,13 +455,12 @@
     var $path;
     var $useragent;
     var $response;
-    var $timeout;
-    var $vendor = '';
     var $message = false;
     var $debug = false;
+	var $timeout;
     // Storage place for an error message
     var $error = false;
-    function IXR_Client($server, $path = false, $port = 80, $timeout = 30, $vendor = '') {
+    function IXR_Client($server, $path = false, $port = 80, $timeout = false) {
         if (!$path) {
             // Assume we have been given a URL instead
             $bits = parse_url($server);
@@ -490,9 +475,9 @@
             $this->server = $server;
             $this->path = $path;
             $this->port = $port;
-            $this->timeout = $timeout;
         }
-        $this->useragent = 'The Incutio XML-RPC PHP Library';
+        $this->useragent = 'Incutio XML-RPC';
+		$this->timeout = $timeout;
     }
     function query() {
         $args = func_get_args();
@@ -511,9 +496,13 @@
         if ($this->debug) {
             echo '<pre>'.htmlspecialchars($request)."\n</pre>\n\n";
         }
-        $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout);
+        if ($this->timeout) {
+            $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout);
+        } else {
+            $fp = @fsockopen($this->server, $this->port, $errno, $errstr);
+        }
         if (!$fp) {
-            $this->error = new IXR_Error(-32300, 'transport error - could not open socket');
+            $this->error = new IXR_Error(-32300, "transport error - could not open socket: $errno $errstr");
             return false;
         }
         fputs($fp, $request);
@@ -610,7 +599,6 @@
     var $hour;
     var $minute;
     var $second;
-    var $timezone;
     function IXR_Date($time) {
         // $time can be a PHP timestamp or an ISO one
         if (is_numeric($time)) {
@@ -621,8 +609,8 @@
     }
     function parseTimestamp($timestamp) {
         $this->year = date('Y', $timestamp);
-        $this->month = date('Y', $timestamp);
-        $this->day = date('Y', $timestamp);
+        $this->month = date('m', $timestamp);
+        $this->day = date('d', $timestamp);
         $this->hour = date('H', $timestamp);
         $this->minute = date('i', $timestamp);
         $this->second = date('s', $timestamp);
@@ -713,7 +701,6 @@
         $returnType = array_shift($signature);
         // Check the number of arguments
         if (count($args) != count($signature)) {
-            // print 'Num of args: '.count($args).' Num in signature: '.count($signature);
             return new IXR_Error(-32602, 'server error. wrong number of method parameters');
         }
         // Check the argument types
diff -ruN 1.5.2/wp-includes/class-snoopy.php 2.0.4/wp-includes/class-snoopy.php
--- 1.5.2/wp-includes/class-snoopy.php	2005-01-06 03:53:40.000000000 -0600
+++ 2.0.4/wp-includes/class-snoopy.php	2006-07-23 16:28:36.000000000 -0500
@@ -5,7 +5,7 @@
 Snoopy - the PHP net client
 Author: Monte Ohrt <monte@ispi.net>
 Copyright (c): 1999-2000 ispi, all rights reserved
-Version: 1.0
+Version: 1.01
 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -31,7 +31,7 @@
 Lincoln, NE 68510
 
 The latest version of Snoopy can be obtained from:
-http://snoopy.sourceforge.net
+http://snoopy.sourceforge.net/
 
 *************************************************/
 
@@ -46,7 +46,10 @@
 	var $port			=	80;					// port we are connecting to
 	var $proxy_host		=	"";					// proxy host to use
 	var $proxy_port		=	"";					// proxy port to use
-	var $agent			=	"Snoopy v1.0";		// agent we masquerade as
+	var $proxy_user		=	"";					// proxy user to use
+	var $proxy_pass		=	"";					// proxy password to use
+	
+	var $agent			=	"Snoopy v1.2.3";	// agent we masquerade as
 	var	$referer		=	"";					// referer info to pass
 	var $cookies		=	array();			// array of cookies to pass
 												// $cookies["username"]="joe";
@@ -59,7 +62,7 @@
 	var $maxframes		=	0;					// frame content depth maximum. 0 = disallow
 	var $expandlinks	=	true;				// expand links to fully qualified URLs.
 												// this only applies to fetchlinks()
-												// or submitlinks()
+												// submitlinks(), and submittext()
 	var $passcookies	=	true;				// pass set cookies back through redirects
 												// NOTE: this currently does not respect
 												// dates, domains or paths.
@@ -75,14 +78,18 @@
 	var $error			=	"";					// error messages sent here
 	var	$response_code	=	"";					// response code returned from server
 	var	$headers		=	array();			// headers returned from server sent here
-	var	$maxlength		=	500000;				// max return data length (body)
+	var	$maxlength		=	8192;				// max return data length (body)
 	var $read_timeout	=	0;					// timeout on read operations, in seconds
 												// supported only since PHP 4 Beta 4
 												// set to 0 to disallow timeouts
 	var $timed_out		=	false;				// if a read operation timed out
 	var	$status			=	0;					// http request status
-	
-	var	$curl_path		=	"/usr/bin/curl";
+
+	var $temp_dir		=	"/tmp";				// temporary directory that the webserver
+												// has permission to write to.
+												// under Windows, this should be C:\temp
+
+	var	$curl_path		=	"/usr/local/bin/curl";
 												// Snoopy will use cURL for fetching
 												// SSL content if a full system path to
 												// the cURL binary is supplied here.
@@ -94,9 +101,6 @@
 												// as these functions are not stable
 												// as of this Snoopy release.
 	
-	// send Accept-encoding: gzip?
-	var $use_gzip		= true;	
-	
 	/**** Private variables ****/	
 	
 	var	$_maxlinelen	=	4096;				// max line length (headers)
@@ -132,8 +136,12 @@
 			$this->user = $URI_PARTS["user"];
 		if (!empty($URI_PARTS["pass"]))
 			$this->pass = $URI_PARTS["pass"];
+		if (empty($URI_PARTS["query"]))
+			$URI_PARTS["query"] = '';
+		if (empty($URI_PARTS["path"]))
+			$URI_PARTS["path"] = '';
 				
-		switch($URI_PARTS["scheme"])
+		switch(strtolower($URI_PARTS["scheme"]))
 		{
 			case "http":
 				$this->host = $URI_PARTS["host"];
@@ -148,7 +156,7 @@
 					}
 					else
 					{
-						$path = $URI_PARTS["path"].(isset($URI_PARTS["query"]) ? "?".$URI_PARTS["query"] : "");
+						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
 						// no proxy, send only the path
 						$this->_httprequest($path, $fp, $URI, $this->_httpmethod);
 					}
@@ -195,10 +203,11 @@
 				return true;					
 				break;
 			case "https":
-				if(!$this->curl_path || (!is_executable($this->curl_path))) {
-					$this->error = "Bad curl ($this->curl_path), can't fetch HTTPS \n";
+				if(!$this->curl_path)
 					return false;
-				}
+				if(function_exists("is_executable"))
+				    if (!is_executable($this->curl_path))
+				        return false;
 				$this->host = $URI_PARTS["host"];
 				if(!empty($URI_PARTS["port"]))
 					$this->port = $URI_PARTS["port"];
@@ -257,7 +266,346 @@
 		return true;
 	}
 
+/*======================================================================*\
+	Function:	submit
+	Purpose:	submit an http form
+	Input:		$URI	the location to post the data
+				$formvars	the formvars to use.
+					format: $formvars["var"] = "val";
+				$formfiles  an array of files to submit
+					format: $formfiles["var"] = "/dir/filename.ext";
+	Output:		$this->results	the text output from the post
+\*======================================================================*/
+
+	function submit($URI, $formvars="", $formfiles="")
+	{
+		unset($postdata);
+		
+		$postdata = $this->_prepare_post_body($formvars, $formfiles);
+			
+		$URI_PARTS = parse_url($URI);
+		if (!empty($URI_PARTS["user"]))
+			$this->user = $URI_PARTS["user"];
+		if (!empty($URI_PARTS["pass"]))
+			$this->pass = $URI_PARTS["pass"];
+		if (empty($URI_PARTS["query"]))
+			$URI_PARTS["query"] = '';
+		if (empty($URI_PARTS["path"]))
+			$URI_PARTS["path"] = '';
+
+		switch(strtolower($URI_PARTS["scheme"]))
+		{
+			case "http":
+				$this->host = $URI_PARTS["host"];
+				if(!empty($URI_PARTS["port"]))
+					$this->port = $URI_PARTS["port"];
+				if($this->_connect($fp))
+				{
+					if($this->_isproxy)
+					{
+						// using proxy, send entire URI
+						$this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);
+					}
+					else
+					{
+						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
+						// no proxy, send only the path
+						$this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);
+					}
+					
+					$this->_disconnect($fp);
+
+					if($this->_redirectaddr)
+					{
+						/* url was redirected, check if we've hit the max depth */
+						if($this->maxredirs > $this->_redirectdepth)
+						{						
+							if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
+								$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);						
+							
+							// only follow redirect if it's on this site, or offsiteok is true
+							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
+							{
+								/* follow the redirect */
+								$this->_redirectdepth++;
+								$this->lastredirectaddr=$this->_redirectaddr;
+								if( strpos( $this->_redirectaddr, "?" ) > 0 )
+									$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get
+								else
+									$this->submit($this->_redirectaddr,$formvars, $formfiles);
+							}
+						}
+					}
+
+					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
+					{
+						$frameurls = $this->_frameurls;
+						$this->_frameurls = array();
+						
+						while(list(,$frameurl) = each($frameurls))
+						{														
+							if($this->_framedepth < $this->maxframes)
+							{
+								$this->fetch($frameurl);
+								$this->_framedepth++;
+							}
+							else
+								break;
+						}
+					}					
+					
+				}
+				else
+				{
+					return false;
+				}
+				return true;					
+				break;
+			case "https":
+				if(!$this->curl_path)
+					return false;
+				if(function_exists("is_executable"))
+				    if (!is_executable($this->curl_path))
+				        return false;
+				$this->host = $URI_PARTS["host"];
+				if(!empty($URI_PARTS["port"]))
+					$this->port = $URI_PARTS["port"];
+				if($this->_isproxy)
+				{
+					// using proxy, send entire URI
+					$this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata);
+				}
+				else
+				{
+					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
+					// no proxy, send only the path
+					$this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata);
+				}
+
+				if($this->_redirectaddr)
+				{
+					/* url was redirected, check if we've hit the max depth */
+					if($this->maxredirs > $this->_redirectdepth)
+					{						
+						if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
+							$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);						
 
+						// only follow redirect if it's on this site, or offsiteok is true
+						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
+						{
+							/* follow the redirect */
+							$this->_redirectdepth++;
+							$this->lastredirectaddr=$this->_redirectaddr;
+							if( strpos( $this->_redirectaddr, "?" ) > 0 )
+								$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get
+							else
+								$this->submit($this->_redirectaddr,$formvars, $formfiles);
+						}
+					}
+				}
+
+				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
+				{
+					$frameurls = $this->_frameurls;
+					$this->_frameurls = array();
+
+					while(list(,$frameurl) = each($frameurls))
+					{														
+						if($this->_framedepth < $this->maxframes)
+						{
+							$this->fetch($frameurl);
+							$this->_framedepth++;
+						}
+						else
+							break;
+					}
+				}					
+				return true;					
+				break;
+				
+			default:
+				// not a valid protocol
+				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
+				return false;
+				break;
+		}		
+		return true;
+	}
+
+/*======================================================================*\
+	Function:	fetchlinks
+	Purpose:	fetch the links from a web page
+	Input:		$URI	where you are fetching from
+	Output:		$this->results	an array of the URLs
+\*======================================================================*/
+
+	function fetchlinks($URI)
+	{
+		if ($this->fetch($URI))
+		{			
+			if($this->lastredirectaddr)
+				$URI = $this->lastredirectaddr;
+			if(is_array($this->results))
+			{
+				for($x=0;$x<count($this->results);$x++)
+					$this->results[$x] = $this->_striplinks($this->results[$x]);
+			}
+			else
+				$this->results = $this->_striplinks($this->results);
+
+			if($this->expandlinks)
+				$this->results = $this->_expandlinks($this->results, $URI);
+			return true;
+		}
+		else
+			return false;
+	}
+
+/*======================================================================*\
+	Function:	fetchform
+	Purpose:	fetch the form elements from a web page
+	Input:		$URI	where you are fetching from
+	Output:		$this->results	the resulting html form
+\*======================================================================*/
+
+	function fetchform($URI)
+	{
+		
+		if ($this->fetch($URI))
+		{			
+
+			if(is_array($this->results))
+			{
+				for($x=0;$x<count($this->results);$x++)
+					$this->results[$x] = $this->_stripform($this->results[$x]);
+			}
+			else
+				$this->results = $this->_stripform($this->results);
+			
+			return true;
+		}
+		else
+			return false;
+	}
+	
+	
+/*======================================================================*\
+	Function:	fetchtext
+	Purpose:	fetch the text from a web page, stripping the links
+	Input:		$URI	where you are fetching from
+	Output:		$this->results	the text from the web page
+\*======================================================================*/
+
+	function fetchtext($URI)
+	{
+		if($this->fetch($URI))
+		{			
+			if(is_array($this->results))
+			{
+				for($x=0;$x<count($this->results);$x++)
+					$this->results[$x] = $this->_striptext($this->results[$x]);
+			}
+			else
+				$this->results = $this->_striptext($this->results);
+			return true;
+		}
+		else
+			return false;
+	}
+
+/*======================================================================*\
+	Function:	submitlinks
+	Purpose:	grab links from a form submission
+	Input:		$URI	where you are submitting from
+	Output:		$this->results	an array of the links from the post
+\*======================================================================*/
+
+	function submitlinks($URI, $formvars="", $formfiles="")
+	{
+		if($this->submit($URI,$formvars, $formfiles))
+		{			
+			if($this->lastredirectaddr)
+				$URI = $this->lastredirectaddr;
+			if(is_array($this->results))
+			{
+				for($x=0;$x<count($this->results);$x++)
+				{
+					$this->results[$x] = $this->_striplinks($this->results[$x]);
+					if($this->expandlinks)
+						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
+				}
+			}
+			else
+			{
+				$this->results = $this->_striplinks($this->results);
+				if($this->expandlinks)
+					$this->results = $this->_expandlinks($this->results,$URI);
+			}
+			return true;
+		}
+		else
+			return false;
+	}
+
+/*======================================================================*\
+	Function:	submittext
+	Purpose:	grab text from a form submission
+	Input:		$URI	where you are submitting from
+	Output:		$this->results	the text from the web page
+\*======================================================================*/
+
+	function submittext($URI, $formvars = "", $formfiles = "")
+	{
+		if($this->submit($URI,$formvars, $formfiles))
+		{			
+			if($this->lastredirectaddr)
+				$URI = $this->lastredirectaddr;
+			if(is_array($this->results))
+			{
+				for($x=0;$x<count($this->results);$x++)
+				{
+					$this->results[$x] = $this->_striptext($this->results[$x]);
+					if($this->expandlinks)
+						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
+				}
+			}
+			else
+			{
+				$this->results = $this->_striptext($this->results);
+				if($this->expandlinks)
+					$this->results = $this->_expandlinks($this->results,$URI);
+			}
+			return true;
+		}
+		else
+			return false;
+	}
+
+	
+
+/*======================================================================*\
+	Function:	set_submit_multipart
+	Purpose:	Set the form submission content type to
+				multipart/form-data
+\*======================================================================*/
+	function set_submit_multipart()
+	{
+		$this->_submit_type = "multipart/form-data";
+	}
+
+	
+/*======================================================================*\
+	Function:	set_submit_normal
+	Purpose:	Set the form submission content type to
+				application/x-www-form-urlencoded
+\*======================================================================*/
+	function set_submit_normal()
+	{
+		$this->_submit_type = "application/x-www-form-urlencoded";
+	}
+
+	
+	
 
 /*======================================================================*\
 	Private functions
@@ -273,7 +621,7 @@
 
 	function _striplinks($document)
 	{	
-		preg_match_all("'<\s*a\s+.*href\s*=\s*			# find <a href=
+		preg_match_all("'<\s*a\s.*?href\s*=\s*			# find <a href=
 						([\"\'])?					# find single or double quote
 						(?(1) (.*?)\\1 | ([^\s\>]+))		# if quote found, match up to next matching
 													# quote, otherwise match up to next space
@@ -335,16 +683,27 @@
 		$search = array("'<script[^>]*?>.*?</script>'si",	// strip out javascript
 						"'<[\/\!]*?[^<>]*?>'si",			// strip out html tags
 						"'([\r\n])[\s]+'",					// strip out white space
-						"'&(quote|#34);'i",					// replace html entities
-						"'&(amp|#38);'i",
-						"'&(lt|#60);'i",
-						"'&(gt|#62);'i",
-						"'&(nbsp|#160);'i",
+						"'&(quot|#34|#034|#x22);'i",		// replace html entities
+						"'&(amp|#38|#038|#x26);'i",			// added hexadecimal values
+						"'&(lt|#60|#060|#x3c);'i",
+						"'&(gt|#62|#062|#x3e);'i",
+						"'&(nbsp|#160|#xa0);'i",
 						"'&(iexcl|#161);'i",
 						"'&(cent|#162);'i",
 						"'&(pound|#163);'i",
-						"'&(copy|#169);'i"
-						);				
+						"'&(copy|#169);'i",
+						"'&(reg|#174);'i",
+						"'&(deg|#176);'i",
+						"'&(#39|#039|#x27);'",
+						"'&(euro|#8364);'i",				// europe
+						"'&a(uml|UML);'",					// german
+						"'&o(uml|UML);'",
+						"'&u(uml|UML);'",
+						"'&A(uml|UML);'",
+						"'&O(uml|UML);'",
+						"'&U(uml|UML);'",
+						"'&szlig;'i",
+						);
 		$replace = array(	"",
 							"",
 							"\\1",
@@ -356,7 +715,19 @@
 							chr(161),
 							chr(162),
 							chr(163),
-							chr(169));
+							chr(169),
+							chr(174),
+							chr(176),
+							chr(39),
+							chr(128),
+							"ä",
+							"ö",
+							"ü",
+							"Ä",
+							"Ö",
+							"Ü",
+							"ß",
+						);
 					
 		$text = preg_replace($search,$replace,$document);
 								
@@ -377,14 +748,20 @@
 		preg_match("/^[^\?]+/",$URI,$match);
 
 		$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
+		$match = preg_replace("|/$|","",$match);
+		$match_part = parse_url($match);
+		$match_root =
+		$match_part["scheme"]."://".$match_part["host"];
 				
 		$search = array( 	"|^http://".preg_quote($this->host)."|i",
-							"|^(?!http://)(\/)?(?!mailto:)|i",
+							"|^(\/)|i",
+							"|^(?!http://)(?!mailto:)|i",
 							"|/\./|",
 							"|/[^\/]+/\.\./|"
 						);
 						
 		$replace = array(	"",
+							$match_root."/",
 							$match."/",
 							"/",
 							"/"
@@ -407,6 +784,7 @@
 	
 	function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="")
 	{
+		$cookie_headers = '';
 		if($this->passcookies && $this->_redirectaddr)
 			$this->setcookies();
 			
@@ -416,25 +794,14 @@
 		$headers = $http_method." ".$url." ".$this->_httpversion."\r\n";		
 		if(!empty($this->agent))
 			$headers .= "User-Agent: ".$this->agent."\r\n";
-		if(!empty($this->host) && !isset($this->rawheaders['Host']))
-			$headers .= "Host: ".$this->host."\r\n";
+		if(!empty($this->host) && !isset($this->rawheaders['Host'])) {
+			$headers .= "Host: ".$this->host;
+			if(!empty($this->port))
+				$headers .= ":".$this->port;
+			$headers .= "\r\n";
+		}
 		if(!empty($this->accept))
 			$headers .= "Accept: ".$this->accept."\r\n";
-		
-		if($this->use_gzip) {
-			// make sure PHP was built with --with-zlib
-			// and we can handle gzipp'ed data
-			if ( function_exists(gzinflate) ) {
-			   $headers .= "Accept-encoding: gzip\r\n";
-			}
-			else {
-			   trigger_error(
-			   	"use_gzip is on, but PHP was built without zlib support.".
-				"  Requesting file(s) without gzip encoding.", 
-				E_USER_NOTICE);
-			}
-		}
-		
 		if(!empty($this->referer))
 			$headers .= "Referer: ".$this->referer."\r\n";
 		if(!empty($this->cookies))
@@ -467,7 +834,12 @@
 		if(!empty($body))	
 			$headers .= "Content-length: ".strlen($body)."\r\n";
 		if(!empty($this->user) || !empty($this->pass))	
-			$headers .= "Authorization: BASIC ".base64_encode($this->user.":".$this->pass)."\r\n";
+			$headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n";
+		
+		//add proxy auth headers
+		if(!empty($this->proxy_user))	
+			$headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n";
+
 
 		$headers .= "\r\n";
 		
@@ -480,9 +852,6 @@
 		
 		$this->_redirectaddr = false;
 		unset($this->headers);
-		
-		// content was returned gzip encoded?
-		$is_gzipped = false;
 						
 		while($currentHeader = fgets($fp,$this->_maxlinelen))
 		{
@@ -492,15 +861,14 @@
 				return false;
 			}
 				
-		//	if($currentHeader == "\r\n")
-			if(preg_match("/^\r?\n$/", $currentHeader) )
-			      break;
+			if($currentHeader == "\r\n")
+				break;
 						
 			// if a header begins with Location: or URI:, set the redirect
 			if(preg_match("/^(Location:|URI:)/i",$currentHeader))
 			{
 				// get URL portion of the redirect
-				preg_match("/^(Location:|URI:)\s+(.*)/",chop($currentHeader),$matches);
+				preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches);
 				// look for :// in the Location header to see if hostname is included
 				if(!preg_match("|\:\/\/|",$matches[2]))
 				{
@@ -524,31 +892,19 @@
                 }				
 				$this->response_code = $currentHeader;
 			}
-			
-			if (preg_match("/Content-Encoding: gzip/", $currentHeader) ) {
-				$is_gzipped = true;
-			}
-			
+				
 			$this->headers[] = $currentHeader;
 		}
 
-		# $results = fread($fp, $this->maxlength);
-		$results = "";
-		while ( $data = fread($fp, $this->maxlength) ) {
-		    $results .= $data;
-		    if (
-		        strlen($results) > $this->maxlength ) {
-		        break;
-		    }
-		}
-		
-		// gunzip
-		if ( $is_gzipped ) {
-			// per http://www.php.net/manual/en/function.gzencode.php
-			$results = substr($results, 10);
-			$results = gzinflate($results);
-		}
-		
+		$results = '';
+		do {
+    		$_data = fread($fp, $this->maxlength);
+    		if (strlen($_data) == 0) {
+        		break;
+    		}
+    		$results .= $_data;
+		} while(true);
+
 		if ($this->read_timeout > 0 && $this->_check_timeout($fp))
 		{
 			$this->status=-100;
@@ -557,7 +913,8 @@
 		
 		// check if there is a a redirect meta tag
 		
-		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]+URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
+		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
+
 		{
 			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);	
 		}
@@ -603,7 +960,10 @@
 		if(!empty($this->agent))
 			$headers[] = "User-Agent: ".$this->agent;
 		if(!empty($this->host))
-			$headers[] = "Host: ".$this->host;
+			if(!empty($this->port))
+				$headers[] = "Host: ".$this->host.":".$this->port;
+			else
+				$headers[] = "Host: ".$this->host;
 		if(!empty($this->accept))
 			$headers[] = "Accept: ".$this->accept;
 		if(!empty($this->referer))
@@ -640,8 +1000,10 @@
 		if(!empty($this->user) || !empty($this->pass))	
 			$headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);
 			
-		for($curr_header = 0; $curr_header < count($headers); $curr_header++)
-			$cmdline_params .= " -H \"".$headers[$curr_header]."\"";
+		for($curr_header = 0; $curr_header < count($headers); $curr_header++) {
+			$safer_header = strtr( $headers[$curr_header], "\"", " " );
+			$cmdline_params .= " -H \"".$safer_header."\"";
+		}
 		
 		if(!empty($body))
 			$cmdline_params .= " -d \"$body\"";
@@ -649,11 +1011,10 @@
 		if($this->read_timeout > 0)
 			$cmdline_params .= " -m ".$this->read_timeout;
 		
-		$headerfile = uniqid(time());
-		
-		# accept self-signed certs
-		$cmdline_params .= " -k";
-		exec($this->curl_path." -D \"/tmp/$headerfile\"".$cmdline_params." ".$URI,$results,$return);
+		$headerfile = tempnam($temp_dir, "sno");
+
+		$safer_URI = strtr( $URI, "\"", " " ); // strip quotes from the URI to avoid shell access
+		exec(escapeshellcmd($this->curl_path." -D \"$headerfile\"".$cmdline_params." \"".$safer_URI."\""),$results,$return);
 		
 		if($return)
 		{
@@ -664,7 +1025,7 @@
 			
 		$results = implode("\r\n",$results);
 		
-		$result_headers = file("/tmp/$headerfile");
+		$result_headers = file("$headerfile");
 						
 		$this->_redirectaddr = false;
 		unset($this->headers);
@@ -676,7 +1037,7 @@
 			if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader]))
 			{
 				// get URL portion of the redirect
-				preg_match("/^(Location: |URI:)(.*)/",chop($result_headers[$currentHeader]),$matches);
+				preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches);
 				// look for :// in the Location header to see if hostname is included
 				if(!preg_match("|\:\/\/|",$matches[2]))
 				{
@@ -693,19 +1054,14 @@
 			}
 		
 			if(preg_match("|^HTTP/|",$result_headers[$currentHeader]))
-			{
-			    $this->response_code = $result_headers[$currentHeader];
-			    if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$this->response_code, $match))
-			    {
-				$this->status= $match[1];
-                	    }
-			}
+				$this->response_code = $result_headers[$currentHeader];
+
 			$this->headers[] = $result_headers[$currentHeader];
 		}
 
 		// check if there is a a redirect meta tag
 		
-		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]+URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
+		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
 		{
 			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);	
 		}
@@ -724,7 +1080,7 @@
 		else
 			$this->results = $results;
 
-		unlink("/tmp/$headerfile");
+		unlink("$headerfile");
 		
 		return true;
 	}
@@ -738,8 +1094,8 @@
 	{
 		for($x=0; $x<count($this->headers); $x++)
 		{
-		if(preg_match("/^set-cookie:[\s]+([^=]+)=([^;]+)/i", $this->headers[$x],$match))
-			$this->cookies[$match[1]] = $match[2];
+		if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match))
+			$this->cookies[$match[1]] = urldecode($match[2]);
 		}
 	}
 
@@ -773,6 +1129,7 @@
 		if(!empty($this->proxy_host) && !empty($this->proxy_port))
 			{
 				$this->_isproxy = true;
+				
 				$host = $this->proxy_host;
 				$port = $this->proxy_port;
 			}
@@ -838,6 +1195,7 @@
 	{
 		settype($formvars, "array");
 		settype($formfiles, "array");
+		$postdata = '';
 
 		if (count($formvars) == 0 && count($formfiles) == 0)
 			return;
@@ -880,7 +1238,9 @@
 						if (!is_readable($file_name)) continue;
 
 						$fp = fopen($file_name, "r");
-						$file_content = fread($fp, filesize($file_name));
+						while (!feof($fp)) {
+							$file_content = fread($fp, filesize($file_name));
+						}
 						fclose($fp);
 						$base_name = basename($file_name);
 
@@ -898,4 +1258,4 @@
 }
 endif;
 
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-includes/comment-functions.php 2.0.4/wp-includes/comment-functions.php
--- 1.5.2/wp-includes/comment-functions.php	2005-08-12 02:03:13.000000000 -0500
+++ 2.0.4/wp-includes/comment-functions.php	2006-07-05 21:27:53.000000000 -0500
@@ -5,29 +5,214 @@
 function comments_template( $file = '/comments.php' ) {
 	global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity;
 
-	if ( is_single() || is_page() || $withcomments ) :
-		$req = get_settings('require_name_email');
-		$comment_author = isset($_COOKIE['comment_author_'.COOKIEHASH]) ? trim(stripslashes($_COOKIE['comment_author_'.COOKIEHASH])) : '';
-		$comment_author_email = isset($_COOKIE['comment_author_email_'.COOKIEHASH]) ? trim(stripslashes($_COOKIE['comment_author_email_'.COOKIEHASH])) : '';
-		$comment_author_url = isset($_COOKIE['comment_author_url_'.COOKIEHASH]) ? trim(stripslashes($_COOKIE['comment_author_url_'.COOKIEHASH])) : '';
+	if ( ! (is_single() || is_page() || $withcomments) )
+		return;
+
+	$req = get_settings('require_name_email');
+	$commenter = wp_get_current_commenter();
+	extract($commenter);
+
+	// TODO: Use API instead of SELECTs.
 	if ( empty($comment_author) ) {
 		$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND comment_approved = '1' ORDER BY comment_date");
 	} else {
-		$author_db = addslashes($comment_author);
-		$email_db  = addslashes($comment_author_email);
+		$author_db = $wpdb->escape($comment_author);
+		$email_db  = $wpdb->escape($comment_author_email);
 		$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND ( comment_approved = '1' OR ( comment_author = '$author_db' AND comment_author_email = '$email_db' AND comment_approved = '0' ) ) ORDER BY comment_date");
 	}
 
-	get_currentuserinfo();
-
 	define('COMMENTS_TEMPLATE', true);
 	$include = apply_filters('comments_template', TEMPLATEPATH . $file );
 	if ( file_exists( $include ) )
 		require( $include );
 	else
 		require( ABSPATH . 'wp-content/themes/default/comments.php');
+}
+
+function wp_new_comment( $commentdata ) {
+	$commentdata = apply_filters('preprocess_comment', $commentdata);
+
+	$commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID'];
+	$commentdata['user_ID']         = (int) $commentdata['user_ID'];
+
+	$commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];
+	$commentdata['comment_agent']     = $_SERVER['HTTP_USER_AGENT'];
+
+	$commentdata['comment_date']     = current_time('mysql');
+	$commentdata['comment_date_gmt'] = current_time('mysql', 1);
+	
+
+	$commentdata = wp_filter_comment($commentdata);
+
+	$commentdata['comment_approved'] = wp_allow_comment($commentdata);
+
+	$comment_ID = wp_insert_comment($commentdata);
+
+	do_action('comment_post', $comment_ID, $commentdata['comment_approved']);
+
+	if ( 'spam' !== $commentdata['comment_approved'] ) { // If it's spam save it silently for later crunching
+		if ( '0' == $commentdata['comment_approved'] )
+			wp_notify_moderator($comment_ID);
+
+		$post = &get_post($commentdata['comment_post_ID']); // Don't notify if it's your own comment
+
+		if ( get_settings('comments_notify') && $commentdata['comment_approved'] && $post->post_author != $commentdata['user_ID'] )
+			wp_notify_postauthor($comment_ID, $commentdata['comment_type']);
+	}
+
+	return $comment_ID;
+}
+
+function wp_insert_comment($commentdata) {
+	global $wpdb;
+	extract($commentdata);
+
+	if ( ! isset($comment_author_IP) )
+		$comment_author_IP = $_SERVER['REMOTE_ADDR'];
+	if ( ! isset($comment_date) )
+		$comment_date = current_time('mysql');
+	if ( ! isset($comment_date_gmt) )
+		$comment_date_gmt = gmdate('Y-m-d H:i:s', strtotime($comment_date) );
+	if ( ! isset($comment_parent) )
+		$comment_parent = 0;
+	if ( ! isset($comment_approved) )
+		$comment_approved = 1;
+
+	$result = $wpdb->query("INSERT INTO $wpdb->comments 
+	(comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_date_gmt, comment_content, comment_approved, comment_agent, comment_type, comment_parent, user_id)
+	VALUES 
+	('$comment_post_ID', '$comment_author', '$comment_author_email', '$comment_author_url', '$comment_author_IP', '$comment_date', '$comment_date_gmt', '$comment_content', '$comment_approved', '$comment_agent', '$comment_type', '$comment_parent', '$user_id')
+	");
+
+	$id = $wpdb->insert_id;
+
+	if ( $comment_approved == 1) {
+		$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'");
+		$wpdb->query( "UPDATE $wpdb->posts SET comment_count = $count WHERE ID = '$comment_post_ID'" );
+	}
+	return $id;
+}
+
+function wp_filter_comment($commentdata) {
+	$commentdata['user_id']              = apply_filters('pre_user_id', $commentdata['user_ID']);
+	$commentdata['comment_agent']        = apply_filters('pre_comment_user_agent', $commentdata['comment_agent']);
+	$commentdata['comment_author']       = apply_filters('pre_comment_author_name', $commentdata['comment_author']);
+	$commentdata['comment_content']      = apply_filters('pre_comment_content', $commentdata['comment_content']);
+	$commentdata['comment_author_IP']    = apply_filters('pre_comment_user_ip', $commentdata['comment_author_IP']);
+	$commentdata['comment_author_url']   = apply_filters('pre_comment_author_url', $commentdata['comment_author_url']);
+	$commentdata['comment_author_email'] = apply_filters('pre_comment_author_email', $commentdata['comment_author_email']);
+	$commentdata['filtered'] = true;
+	return $commentdata;
+}
+
+function wp_allow_comment($commentdata) {
+	global $wpdb;
+	extract($commentdata);
+
+	$comment_user_domain = apply_filters('pre_comment_user_domain', gethostbyaddr($comment_author_IP) );
+
+	// Simple duplicate check
+	$dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";
+	if ( $comment_author_email )
+		$dupe .= "OR comment_author_email = '$comment_author_email' ";
+	$dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
+	if ( $wpdb->get_var($dupe) )
+		die( __('Duplicate comment detected; it looks as though you\'ve already said that!') );
+
+	// Simple flood-protection
+	if ( $lasttime = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_author_IP = '$comment_author_IP' OR comment_author_email = '$comment_author_email' ORDER BY comment_date DESC LIMIT 1") ) {
+		$time_lastcomment = mysql2date('U', $lasttime);
+		$time_newcomment  = mysql2date('U', $comment_date_gmt);
+		if ( ($time_newcomment - $time_lastcomment) < 15 ) {
+			do_action('comment_flood_trigger', $time_lastcomment, $time_newcomment);
+			die( __('Sorry, you can only post a new comment once every 15 seconds. Slow down cowboy.') );
+		}
+	}
+
+	if ( $user_id ) {
+		$userdata = get_userdata($user_id);
+		$user = new WP_User($user_id);
+		$post_author = $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = '$comment_post_ID' LIMIT 1");
+	}
+
+	// The author and the admins get respect.
+	if ( $userdata && ( $user_id == $post_author || $user->has_cap('level_9') ) ) {
+		$approved = 1;
+	}
+
+	// Everyone else's comments will be checked.
+	else {
+		if ( check_comment($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent, $comment_type) )
+			$approved = 1;
+		else
+			$approved = 0;
+		if ( wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent) )
+			$approved = 'spam';
+	}
+
+	$approved = apply_filters('pre_comment_approved', $approved);
+	return $approved;
+}
+
+
+function wp_update_comment($commentarr) {
+	global $wpdb;
+
+	// First, get all of the original fields
+	$comment = get_comment($commentarr['comment_ID'], ARRAY_A);
+
+	// Escape data pulled from DB.
+	foreach ($comment as $key => $value)
+		$comment[$key] = $wpdb->escape($value);
+
+	// Merge old and new fields with new fields overwriting old ones.
+	$commentarr = array_merge($comment, $commentarr);
+
+	$commentarr = wp_filter_comment( $commentarr );
+
+	// Now extract the merged array.
+	extract($commentarr);
+
+	$comment_content = apply_filters('comment_save_pre', $comment_content);
+
+	$result = $wpdb->query(
+		"UPDATE $wpdb->comments SET
+			comment_content = '$comment_content',
+			comment_author = '$comment_author',
+			comment_author_email = '$comment_author_email',
+			comment_approved = '$comment_approved',
+			comment_author_url = '$comment_author_url',
+			comment_date = '$comment_date'
+		WHERE comment_ID = $comment_ID" );
+
+	$rval = $wpdb->rows_affected;
+
+	$c = $wpdb->get_row( "SELECT count(*) as c FROM {$wpdb->comments} WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'" );
+	if( is_object( $c ) )
+		$wpdb->query( "UPDATE $wpdb->posts SET comment_count = '$c->c' WHERE ID = '$comment_post_ID'" );
+
+	do_action('edit_comment', $comment_ID);
+
+	return $rval;
+}
+
+function wp_delete_comment($comment_id) {
+	global $wpdb;
+	do_action('delete_comment', $comment_id);
+
+	$comment = get_comment($comment_id);
 
-	endif;
+	if ( ! $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1") )
+		return false;
+
+	$post_id = $comment->comment_post_ID;
+	if ( $post_id && $comment->comment_approved == 1 ) {
+		$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$post_id' AND comment_approved = '1'");
+		$wpdb->query( "UPDATE $wpdb->posts SET comment_count = $count WHERE ID = '$post_id'" );
+	}
+
+	do_action('wp_set_comment_status', $comment_id, 'delete');
+	return true;
 }
 
 function clean_url( $url ) {
@@ -39,13 +224,17 @@
 	return $url;
 }
 
-function get_comments_number( $comment_id ) {
-	global $wpdb, $comment_count_cache;
-	$comment_id = (int) $comment_id;
-	if (!isset($comment_count_cache[$comment_id]))
-		$comment_count_cache[$comment_id] =  $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$comment_id' AND comment_approved = '1'");
+function get_comments_number( $post_id = 0 ) {
+	global $wpdb, $comment_count_cache, $id;
+	$post_id = (int) $post_id;
+
+	if ( !$post_id )
+		$post_id = $id;
+
+	if ( !isset($comment_count_cache[$post_id]) )
+		$comment_count_cache[$id] = $wpdb->get_var("SELECT comment_count FROM $wpdb->posts WHERE ID = '$post_id'");
 	
-	return apply_filters('get_comments_number', $comment_count_cache[$comment_id]);
+	return apply_filters('get_comments_number', $comment_count_cache[$post_id]);
 }
 
 function comments_number( $zero = 'No Comments', $one = '1 Comment', $more = '% Comments', $number = '' ) {
@@ -89,45 +278,48 @@
 }
 
 function comments_popup_link($zero='No Comments', $one='1 Comment', $more='% Comments', $CSSclass='', $none='Comments Off') {
-    global $id, $wpcommentspopupfile, $wpcommentsjavascript, $post, $wpdb;
-    global $comment_count_cache;
-
+	global $id, $wpcommentspopupfile, $wpcommentsjavascript, $post, $wpdb;
+	global $comment_count_cache;
+	
 	if (! is_single() && ! is_page()) {
-    if ( !isset($comment_count_cache[$id]))
-			$comment_count_cache[$id] = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved = '1';");
-
-		$number = $comment_count_cache[$id];
-
-    if (0 == $number && 'closed' == $post->comment_status && 'closed' == $post->ping_status) {
-        echo $none;
-        return;
-    } else {
-        if (!empty($post->post_password)) { // if there's a password
-            if ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) {  // and it doesn't match the cookie
-                echo('Enter your password to view comments');
-                return;
-            }
-        }
-        echo '<a href="';
-        if ($wpcommentsjavascript) {
-					if ( empty($wpcommentspopupfile) )
-						$home = get_settings('home');
-					else
-						$home = get_settings('siteurl');
-					echo $home . '/' . $wpcommentspopupfile.'?comments_popup='.$id;
-					echo '" onclick="wpopen(this.href); return false"';
-        } else {
-            // if comments_popup_script() is not in the template, display simple comment link
-            comments_link();
-            echo '"';
-        }
-        if (!empty($CSSclass)) {
-            echo ' class="'.$CSSclass.'"';
-        }
-        echo '>';
-        comments_number($zero, $one, $more, $number);
-        echo '</a>';
-    }
+	if ( !isset($comment_count_cache[$id]) )
+		$comment_count_cache[$id] = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved = '1';");
+	
+	$number = $comment_count_cache[$id];
+	
+	if (0 == $number && 'closed' == $post->comment_status && 'closed' == $post->ping_status) {
+		echo $none;
+		return;
+	} else {
+		if (!empty($post->post_password)) { // if there's a password
+			if ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) {  // and it doesn't match the cookie
+				echo(__('Enter your password to view comments'));
+				return;
+			}
+		}
+		echo '<a href="';
+		if ($wpcommentsjavascript) {
+			if ( empty($wpcommentspopupfile) )
+				$home = get_settings('home');
+			else
+				$home = get_settings('siteurl');
+			echo $home . '/' . $wpcommentspopupfile.'?comments_popup='.$id;
+			echo '" onclick="wpopen(this.href); return false"';
+		} else { // if comments_popup_script() is not in the template, display simple comment link
+			if ( 0 == $number )
+				echo get_permalink() . '#respond';
+			else
+				comments_link();
+			echo '"';
+		}
+		if (!empty($CSSclass)) {
+			echo ' class="'.$CSSclass.'"';
+		}
+		$title = wp_specialchars(apply_filters('the_title', get_the_title()), true);
+		echo ' title="' . sprintf( __('Comment on %s'), $title ) .'">';
+		comments_number($zero, $one, $more, $number);
+		echo '</a>';
+	}
 	}
 }
 
@@ -143,7 +335,7 @@
 function get_comment_author() {
 	global $comment;
 	if ( empty($comment->comment_author) )
-		$author = 'Anonymous';
+		$author = __('Anonymous');
 	else
 		$author = $comment->comment_author;
 	return apply_filters('get_comment_author', $author);
@@ -168,7 +360,7 @@
 	$url    = get_comment_author_url();
 	$author = get_comment_author();
 
-	if ( empty( $url ) )
+	if ( empty( $url ) || 'http://' == $url )
 		$return = $author;
 	else
 		$return = "<a href='$url' rel='external nofollow'>$author</a>";
@@ -439,7 +631,8 @@
 	// We don't wanna ping first and second types, even if they have a valid <link/>
 
 	foreach($post_links_temp[0] as $link_test) :
-		if ( !in_array($link_test, $pung) ) : // If we haven't pung it already
+		if ( !in_array($link_test, $pung) && (url_to_postid($link_test) != $post_ID) // If we haven't pung it already and it isn't a link to itself
+				&& !is_local_attachment($link_test) ) : // Also, let's never ping local attachments.
 			$test = parse_url($link_test);
 			if (isset($test['query']))
 				$post_links[] = $link_test;
@@ -448,12 +641,14 @@
 		endif;
 	endforeach;
 
+	do_action('pre_ping',  array(&$post_links, &$pung));
+
 	foreach ($post_links as $pagelinkedto){
 		debug_fwrite($log, "Processing -- $pagelinkedto\n");
 		$pingback_server_url = discover_pingback_server_uri($pagelinkedto, 2048);
 
 		if ($pingback_server_url) {
-                        set_time_limit( 60 ); 
+			@ set_time_limit( 60 ); 
 			 // Now, the RPC call
 			debug_fwrite($log, "Page Linked To: $pagelinkedto \n");
 			debug_fwrite($log, 'Page Linked From: ');
@@ -468,7 +663,7 @@
 			// when set to true, this outputs debug messages by itself
 			$client->debug = false;
 			
-			if ( $client->query('pingback.ping', array($pagelinkedfrom, $pagelinkedto) ) )
+			if ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto ) )
 				add_ping( $post_ID, $pagelinkedto );
 			else
 				debug_fwrite($log, "Error.\n Fault code: ".$client->getErrorCode()." : ".$client->getErrorMessage()."\n");
@@ -509,8 +704,8 @@
 	}
 
 	// Send the GET request
-	$request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version PHP/" . phpversion() . "\r\n\r\n";
-	ob_end_flush();
+	$request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version \r\n\r\n";
+//	ob_end_flush();
 	fputs($fp, $request);
 
 	// Let's check for an X-Pingback header first
@@ -569,6 +764,18 @@
 	return false;
 }
 
+function is_local_attachment($url) {
+	if ( !strstr($url, get_bloginfo('home') ) )
+		return false;
+	if ( strstr($url, get_bloginfo('home') . '/?attachment_id=') )
+		return true;
+	if ( $id = url_to_postid($url) ) {
+		$post = & get_post($id);
+		if ( 'attachment' == $post->post_status )
+			return true;
+	}		
+	return false;
+}
 
 function wp_set_comment_status($comment_id, $comment_status) {
     global $wpdb;
@@ -584,7 +791,7 @@
  			$query = "UPDATE $wpdb->comments SET comment_approved='spam' WHERE comment_ID='$comment_id' LIMIT 1";
  		break;
 		case 'delete':
-			$query = "DELETE FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1";
+			return wp_delete_comment($comment_id);
 		break;
 		default:
 			return false;
@@ -592,13 +799,18 @@
     
     if ($wpdb->query($query)) {
 		do_action('wp_set_comment_status', $comment_id, $comment_status);
+		
+		$comment = get_comment($comment_id);
+		$comment_post_ID = $comment->comment_post_ID;
+		$c = $wpdb->get_row( "SELECT count(*) as c FROM {$wpdb->comments} WHERE comment_post_ID = '$comment_post_ID' AND comment_approved = '1'" );
+		if( is_object( $c ) )
+			$wpdb->query( "UPDATE $wpdb->posts SET comment_count = '$c->c' WHERE ID = '$comment_post_ID'" );
 		return true;
     } else {
 		return false;
     }
 }
 
-
 function wp_get_comment_status($comment_id) {
 	global $wpdb;
 	
@@ -661,8 +873,9 @@
 				return false;
 		} elseif( $author != '' && $email != '' ) {
 			$ok_to_comment = $wpdb->get_var("SELECT comment_approved FROM $wpdb->comments WHERE comment_author = '$author' AND comment_author_email = '$email' and comment_approved = '1' LIMIT 1");
-			if ( 1 == $ok_to_comment && false === strpos( $email, get_settings('moderation_keys')) )
-				return true;
+			if ( ( 1 == $ok_to_comment ) &&
+				( empty($mod_keys) || false === strpos( $email, $mod_keys) ) )
+					return true;
 			else
 				return false;
 		} else {
@@ -673,4 +886,52 @@
 	return true;
 }
 
+function get_approved_comments($post_id) {
+	global $wpdb;
+
+	$post_id = (int) $post_id;
+	return $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $post_id AND comment_approved = '1' ORDER BY comment_date");
+}
+
+function sanitize_comment_cookies() {
+	if ( isset($_COOKIE['comment_author_'.COOKIEHASH]) ) {
+		$comment_author = apply_filters('pre_comment_author_name', $_COOKIE['comment_author_'.COOKIEHASH]);
+		$comment_author = stripslashes($comment_author);
+		$comment_author = wp_specialchars($comment_author, true);
+		$_COOKIE['comment_author_'.COOKIEHASH] = $comment_author;
+	}
+
+	if ( isset($_COOKIE['comment_author_email_'.COOKIEHASH]) ) {
+		$comment_author_email = apply_filters('pre_comment_author_email', $_COOKIE['comment_author_email_'.COOKIEHASH]);
+		$comment_author_email = stripslashes($comment_author_email);
+		$comment_author_email = wp_specialchars($comment_author_email, true);	
+		$_COOKIE['comment_author_email_'.COOKIEHASH] = $comment_author_email;
+	}
+
+	if ( isset($_COOKIE['comment_author_url_'.COOKIEHASH]) ) {
+		$comment_author_url = apply_filters('pre_comment_author_url', $_COOKIE['comment_author_url_'.COOKIEHASH]);
+		$comment_author_url = stripslashes($comment_author_url);
+		$comment_author_url = wp_specialchars($comment_author_url, true);
+		$_COOKIE['comment_author_url_'.COOKIEHASH] = $comment_author_url;
+	}
+}
+
+function wp_get_current_commenter() {
+	// Cookies should already be sanitized.
+
+	$comment_author = '';
+	if ( isset($_COOKIE['comment_author_'.COOKIEHASH]) )
+		$comment_author = $_COOKIE['comment_author_'.COOKIEHASH];
+
+	$comment_author_email = '';
+	if ( isset($_COOKIE['comment_author_email_'.COOKIEHASH]) )
+		$comment_author_email = $_COOKIE['comment_author_email_'.COOKIEHASH];
+
+	$comment_author_url = '';
+	if ( isset($_COOKIE['comment_author_url_'.COOKIEHASH]) )
+		$comment_author_url = $_COOKIE['comment_author_url_'.COOKIEHASH];
+
+	return compact('comment_author', 'comment_author_email', 'comment_author_url');
+}
+
 ?>
diff -ruN 1.5.2/wp-includes/default-filters.php 2.0.4/wp-includes/default-filters.php
--- 1.5.2/wp-includes/default-filters.php	2005-04-05 12:25:57.000000000 -0500
+++ 2.0.4/wp-includes/default-filters.php	2006-07-26 12:40:30.000000000 -0500
@@ -25,7 +25,6 @@
 add_filter('pre_comment_author_url', 'clean_url');
 
 add_filter('pre_comment_content', 'stripslashes', 1);
-add_filter('pre_comment_content', 'wp_filter_kses');
 add_filter('pre_comment_content', 'wp_rel_nofollow', 15);
 add_filter('pre_comment_content', 'balanceTags', 30);
 add_filter('pre_comment_content', 'addslashes', 50);
@@ -45,11 +44,44 @@
 
 add_filter('comment_text', 'convert_chars');
 add_filter('comment_text', 'make_clickable');
+add_filter('comment_text', 'force_balance_tags', 25);
 add_filter('comment_text', 'wpautop', 30);
 add_filter('comment_text', 'convert_smilies', 20);
 
 add_filter('comment_excerpt', 'convert_chars');
 
+// Categories
+add_filter('pre_category_name', 'strip_tags');
+add_filter('pre_category_name', 'trim');
+add_filter('pre_category_name', 'wp_filter_kses');
+add_filter('pre_category_name', 'wp_specialchars', 30);
+add_filter('pre_category_description', 'wp_filter_kses');
+
+// Users
+add_filter('pre_user_display_name', 'strip_tags');
+add_filter('pre_user_display_name', 'trim');
+add_filter('pre_user_display_name', 'wp_filter_kses');
+add_filter('pre_user_display_name', 'wp_specialchars', 30);
+add_filter('pre_user_first_name', 'strip_tags');
+add_filter('pre_user_first_name', 'trim');
+add_filter('pre_user_first_name', 'wp_filter_kses');
+add_filter('pre_user_first_name', 'wp_specialchars', 30);
+add_filter('pre_user_last_name', 'strip_tags');
+add_filter('pre_user_last_name', 'trim');
+add_filter('pre_user_last_name', 'wp_filter_kses');
+add_filter('pre_user_last_name', 'wp_specialchars', 30);
+add_filter('pre_user_nickname', 'strip_tags');
+add_filter('pre_user_nickname', 'trim');
+add_filter('pre_user_nickname', 'wp_filter_kses');
+add_filter('pre_user_nickname', 'wp_specialchars', 30);
+add_filter('pre_user_description', 'trim');
+add_filter('pre_user_description', 'wp_filter_kses');
+add_filter('pre_user_url', 'strip_tags');
+add_filter('pre_user_url', 'trim');
+add_filter('pre_user_url', 'clean_url');
+add_filter('pre_user_email', 'trim');
+add_filter('pre_user_email', 'sanitize_email');
+
 // Places to balance tags on input
 add_filter('content_save_pre', 'balanceTags', 50);
 add_filter('excerpt_save_pre', 'balanceTags', 50);
@@ -73,16 +105,19 @@
 // RSS filters
 add_filter('the_title_rss', 'strip_tags');
 add_filter('the_title_rss', 'ent2ncr', 8);
+add_filter('the_title_rss', 'wp_specialchars');
 add_filter('the_content_rss', 'ent2ncr', 8);
 add_filter('the_excerpt_rss', 'convert_chars');
 add_filter('the_excerpt_rss', 'ent2ncr', 8);
 add_filter('comment_author_rss', 'ent2ncr', 8);
-add_filter('comment_text_rss', 'htmlspecialchars');
+add_filter('comment_text_rss', 'wp_specialchars');
 add_filter('comment_text_rss', 'ent2ncr', 8);
 add_filter('bloginfo_rss', 'ent2ncr', 8);
 add_filter('the_author', 'ent2ncr', 8);
 
 // Actions
 add_action('publish_post', 'generic_ping');
+add_action('wp_head', 'rsd_link');
+add_action('sanitize_comment_cookies', 'sanitize_comment_cookies');
 
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-includes/feed-functions.php 2.0.4/wp-includes/feed-functions.php
--- 1.5.2/wp-includes/feed-functions.php	2005-05-09 05:59:36.000000000 -0500
+++ 2.0.4/wp-includes/feed-functions.php	2005-12-15 16:20:06.000000000 -0600
@@ -9,16 +9,20 @@
 	echo get_bloginfo_rss($show);
 }
 
-function the_title_rss() {
+function get_the_title_rss() {
 	$title = get_the_title();
 	$title = apply_filters('the_title', $title);
 	$title = apply_filters('the_title_rss', $title);
-	echo $title;
+	return $title;
+}
+
+function the_title_rss() {
+	echo get_the_title_rss();
 }
 
 function the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) {
 	$content = get_the_content($more_link_text, $stripteaser, $more_file);
-	$content = apply_filters('the_content', $content);
+	$content = apply_filters('the_content_rss', $content);
 	if ($cut && !$encode_html) {
 		$encode_html = 2;
 	}
@@ -62,9 +66,11 @@
 	echo get_comment_link();
 }
 
+function get_comment_author_rss() {
+	return apply_filters('comment_author_rss', get_comment_author() );
+}
 function comment_author_rss() {
-	$author = apply_filters('comment_author_rss', get_comment_author() );
-	echo $author;
+	echo get_comment_author_rss();
 }
 
 function comment_text_rss() {
diff -ruN 1.5.2/wp-includes/functions-compat.php 2.0.4/wp-includes/functions-compat.php
--- 1.5.2/wp-includes/functions-compat.php	2005-02-10 18:57:46.000000000 -0600
+++ 2.0.4/wp-includes/functions-compat.php	2006-05-11 18:05:45.000000000 -0500
@@ -47,6 +47,14 @@
 	return $code;
 }
 
+/* compatibility with PHP versions older than 4.3 */
+if ( !function_exists('file_get_contents') ) {
+	function file_get_contents( $file ) {
+		$file = file($file);
+		return !$file ? false : implode('', $file);
+	}
+}
+
 if (!defined('CASE_LOWER')) {
     define('CASE_LOWER', 0);
 }
@@ -64,7 +72,7 @@
  * @link        http://php.net/function.array_change_key_case
  * @author      Stephan Schmidt <schst@php.net>
  * @author      Aidan Lister <aidan@php.net>
- * @version     $Revision: 2247 $
+ * @version     $Revision: 3771 $
  * @since       PHP 4.2.0
  * @require     PHP 4.0.0 (user_error)
  */
@@ -89,4 +97,17 @@
     }
 }
 
-?>
\ No newline at end of file
+// From php.net
+if(!function_exists('http_build_query')) {
+   function http_build_query( $formdata, $numeric_prefix = null, $key = null ) {
+       $res = array();
+       foreach ((array)$formdata as $k=>$v) {
+           $tmp_key = urlencode(is_int($k) ? $numeric_prefix.$k : $k);
+           if ($key) $tmp_key = $key.'['.$tmp_key.']';
+           $res[] = ( ( is_array($v) || is_object($v) ) ? http_build_query($v, null, $tmp_key) : $tmp_key."=".urlencode($v) );
+       }
+       $separator = ini_get('arg_separator.output');
+       return implode($separator, $res);
+   }
+}
+?>
diff -ruN 1.5.2/wp-includes/functions-formatting.php 2.0.4/wp-includes/functions-formatting.php
--- 1.5.2/wp-includes/functions-formatting.php	2005-05-03 17:31:20.000000000 -0500
+++ 2.0.4/wp-includes/functions-formatting.php	2006-07-26 17:57:15.000000000 -0500
@@ -41,7 +41,7 @@
 		} else {
 			$next = true;
 		}
-		$curl = preg_replace('/&([^#])(?![a-z12]{1,8};)/', '&#038;$1', $curl);
+		$curl = preg_replace('/&([^#])(?![a-zA-Z1-4]{1,8};)/', '&#038;$1', $curl);
 		$output .= $curl;
 	}
 	return $output;
@@ -59,12 +59,12 @@
 	$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
 	// Space things out a little
 	$pee = preg_replace('!(<(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)!', "\n$1", $pee); 
-	$pee = preg_replace('!(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])>)!', "$1\n", $pee);
+	$pee = preg_replace('!(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])>)!', "$1\n\n", $pee);
 	$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines 
 	$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
-	$pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "\t<p>$1</p>\n", $pee); // make paragraphs, including one at the end 
+	$pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end 
 	$pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace 
-    $pee = preg_replace('!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
+	$pee = preg_replace('!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
 	$pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
 	$pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
 	$pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
@@ -73,7 +73,7 @@
 	if ($br) $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
 	$pee = preg_replace('!(</?(?:table|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*<br />!', "$1", $pee);
 	$pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!', '$1', $pee);
-	$pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  clean_pre('$2')  . '</pre>' ", $pee);
+	$pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  stripslashes(clean_pre('$2'))  . '</pre>' ", $pee);
 	
 	return $pee; 
 }
@@ -98,10 +98,14 @@
 
 function wp_specialchars( $text, $quotes = 0 ) {
 	// Like htmlspecialchars except don't double-encode HTML entities
-	$text = preg_replace('/&([^#])(?![a-z12]{1,8};)/', '&#038;$1', $text);-
+	$text = preg_replace('/&([^#])(?![a-z1-4]{1,8};)/', '&#038;$1', $text);
 	$text = str_replace('<', '&lt;', $text);
 	$text = str_replace('>', '&gt;', $text);
-	if ( $quotes ) {
+	if ( 'double' === $quotes ) {
+		$text = str_replace('"', '&quot;', $text);
+	} elseif ( 'single' === $quotes ) {
+		$text = str_replace("'", '&#039;', $text);
+	} elseif ( $quotes ) {
 		$text = str_replace('"', '&quot;', $text);
 		$text = str_replace("'", '&#039;', $text);
 	}
@@ -141,6 +145,9 @@
 }
 
 function remove_accents($string) {
+	if ( !preg_match('/[\x80-\xff]/', $string) )
+		return $string;
+
 	if (seems_utf8($string)) {
 		$chars = array(
 		// Decompositions for Latin-1 Supplement
@@ -176,7 +183,7 @@
 		chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
 		chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
 		chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
-		chr(196).chr(134) => 'C', chr(196).chr(134) => 'c',
+		chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
 		chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
 		chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
 		chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
@@ -205,15 +212,15 @@
 		chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
 		chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
 		chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
-		chr(197).chr(128) => 'l', chr(196).chr(129) => 'L',
-		chr(197).chr(130) => 'l', chr(196).chr(131) => 'N',
-		chr(197).chr(132) => 'n', chr(196).chr(133) => 'N',
-		chr(197).chr(134) => 'n', chr(196).chr(135) => 'N',
-		chr(197).chr(136) => 'n', chr(196).chr(137) => 'N',
-		chr(197).chr(138) => 'n', chr(196).chr(139) => 'N',
-		chr(197).chr(140) => 'O', chr(196).chr(141) => 'o',
-		chr(197).chr(142) => 'O', chr(196).chr(143) => 'o',
-		chr(197).chr(144) => 'O', chr(196).chr(145) => 'o',
+		chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
+		chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
+		chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
+		chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
+		chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
+		chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
+		chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
+		chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
+		chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
 		chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
 		chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
 		chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
@@ -265,6 +272,20 @@
 	return $string;
 }
 
+function sanitize_user( $username, $strict = false ) {
+	$raw_username = $username;
+	$username = strip_tags($username);
+	// Kill octets
+	$username = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '', $username);
+	$username = preg_replace('/&.+?;/', '', $username); // Kill entities
+
+	// If strict, reduce to ASCII for max portability.
+	if ( $strict )
+		$username = preg_replace('|[^a-z0-9 _.\-@]|i', '', $username);
+
+	return apply_filters('sanitize_user', $username, $raw_username, $strict);
+}
+
 function sanitize_title($title, $fallback_title = '') {
 	$title = strip_tags($title);
 	$title = apply_filters('sanitize_title', $title);
@@ -345,7 +366,7 @@
 	$content = preg_replace('/<category>(.+?)<\/category>/','',$content);
 
 	// Converts lone & characters into &#38; (a.k.a. &amp;)
-	$content = preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $content);
+	$content = preg_replace('/&([^#])(?![a-z1-4]{1,8};)/i', '&#038;$1', $content);
 
 	// Fix Word pasting
 	$content = strtr($content, $wp_htmltranswinuni);
@@ -388,9 +409,8 @@
 */
 function balanceTags($text, $is_comment = 0) {
 	
-	if (get_settings('use_balanceTags') == 0) {
+	if ( get_option('use_balanceTags') == 0)
 		return $text;
-	}
 
 	$tagstack = array(); $stacksize = 0; $tagqueue = ''; $newtext = '';
 
@@ -488,10 +508,14 @@
 	return $newtext;
 }
 
+function force_balance_tags($text) {
+	return balanceTags($text, 0, true);
+}
 
-function format_to_edit($content) {
+function format_to_edit($content, $richedit = false) {
 	$content = apply_filters('format_to_edit', $content);
-	$content = htmlspecialchars($content);
+	if (! $richedit )
+		$content = htmlspecialchars($content);
 	return $content;
 }
 
@@ -503,10 +527,11 @@
 
 function zeroise($number,$threshold) { // function to add leading zeros when necessary
 	return sprintf('%0'.$threshold.'s', $number);
-	}
+}
 
 
 function backslashit($string) {
+	$string = preg_replace('/^([0-9])/', '\\\\\\\\\1', $string);
 	$string = preg_replace('/([a-z])/i', '\\\\\1', $string);
 	return $string;
 }
@@ -519,10 +544,23 @@
 }
 
 function addslashes_gpc($gpc) {
-	if (!get_magic_quotes_gpc()) {
-		$gpc = addslashes($gpc);
+	global $wpdb;
+
+	if (get_magic_quotes_gpc()) {
+		$gpc = stripslashes($gpc);
 	}
-	return $gpc;
+
+	return $wpdb->escape($gpc);
+}
+
+
+function stripslashes_deep($value)
+{
+   $value = is_array($value) ?
+               array_map('stripslashes_deep', $value) :
+               stripslashes($value);
+
+   return $value;
 }
 
 function antispambot($emailaddy, $mailto=0) {
@@ -543,10 +581,11 @@
 }
 
 function make_clickable($ret) {
-	$ret = ' ' . $ret . ' ';
-	$ret = preg_replace("#([\s>])(https?)://([^\s<>{}()]+[^\s.,<>{}()])#i", "$1<a href='$2://$3' rel='nofollow'>$2://$3</a>", $ret);
-	$ret = preg_replace("#(\s)www\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[^ <>{}()\n\r]*[^., <>{}()\n\r]?)?)#i", "$1<a href='http://www.$2.$3$4' rel='nofollow'>www.$2.$3$4</a>", $ret);
+	$ret = ' ' . $ret;
+	$ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "$1<a href='$2' rel='nofollow'>$2</a>", $ret);
+	$ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "$1<a href='http://$2' rel='nofollow'>$2</a>", $ret);
 	$ret = preg_replace("#(\s)([a-z0-9\-_.]+)@([^,< \n\r]+)#i", "$1<a href=\"mailto:$2@$3\">$2@$3</a>", $ret);
+	$ret = substr($ret, 1);
 	$ret = trim($ret);
 	return $ret;
 }
@@ -591,20 +630,6 @@
 	}
 }
 
-
-function strip_all_but_one_link($text, $mylink) {
-	$match_link = '#(<a.+?href.+?'.'>)(.+?)(</a>)#';
-	preg_match_all($match_link, $text, $matches);
-	$count = count($matches[0]);
-	for ($i=0; $i<$count; $i++) {
-		if (!strstr($matches[0][$i], $mylink)) {
-			$text = str_replace($matches[0][$i], $matches[2][$i], $text);
-		}
-	}
-	return $text;
-}
-
-
 // used by wp-mail to handle charsets in email subjects
 function wp_iso_descrambler($string) {
   /* this may only work with iso-8859-1, I'm afraid */
@@ -725,269 +750,287 @@
 
 function ent2ncr($text) {
 	$to_ncr = array(
-			'&quot;' => '&#34;',
-			'&amp;' => '&#38;',
-			'&frasl;' => '&#47;',
-			'&lt;' => '&#60;',
-			'&gt;' => '&#62;',
-			'&nbsp;' => '&#160;',
-			'&iexcl;' => '&#161;',
-			'&cent;' => '&#162;',
-			'&pound;' => '&#163;',
-			'&curren;' => '&#164;',
-			'&yen;' => '&#165;',
-			'|' => '&#166;',
-			'&brvbar;' => '&#166;',
-			'&brkbar;' => '&#166;',
-			'&sect;' => '&#167;',
-			'&uml;' => '&#168;',
-			'&die;' => '&#168;',
-			'&copy;' => '&#169;',
-			'&ordf;' => '&#170;',
-			'&laquo;' => '&#171;',
-			'&not;' => '&#172;',
-			'&shy;' => '&#173;',
-			'&reg;' => '&#174;',
-			'&macr;' => '&#175;',
-			'&hibar;' => '&#175;',
-			'&deg;' => '&#176;',
-			'&plusmn;' => '&#177;',
-			'&sup2;' => '&#178;',
-			'&sup3;' => '&#179;',
-			'&acute;' => '&#180;',
-			'&micro;' => '&#181;',
-			'&para;' => '&#182;',
-			'&middot;' => '&#183;',
-			'&cedil;' => '&#184;',
-			'&sup1;' => '&#185;',
-			'&ordm;' => '&#186;',
-			'&raquo;' => '&#187;',
-			'&frac14;' => '&#188;',
-			'&frac12;' => '&#189;',
-			'&frac34;' => '&#190;',
-			'&iquest;' => '&#191;',
-			'&Agrave;' => '&#192;',
-			'&Aacute;' => '&#193;',
-			'&Acirc;' => '&#194;',
-			'&Atilde;' => '&#195;',
-			'&Auml;' => '&#196;',
-			'&Aring;' => '&#197;',
-			'&AElig;' => '&#198;',
-			'&Ccedil;' => '&#199;',
-			'&Egrave;' => '&#200;',
-			'&Eacute;' => '&#201;',
-			'&Ecirc;' => '&#202;',
-			'&Euml;' => '&#203;',
-			'&Igrave;' => '&#204;',
-			'&Iacute;' => '&#205;',
-			'&Icirc;' => '&#206;',
-			'&Iuml;' => '&#207;',
-			'&ETH;' => '&#208;',
-			'&Ntilde;' => '&#209;',
-			'&Ograve;' => '&#210;',
-			'&Oacute;' => '&#211;',
-			'&Ocirc;' => '&#212;',
-			'&Otilde;' => '&#213;',
-			'&Ouml;' => '&#214;',
-			'&times;' => '&#215;',
-			'&Oslash;' => '&#216;',
-			'&Ugrave;' => '&#217;',
-			'&Uacute;' => '&#218;',
-			'&Ucirc;' => '&#219;',
-			'&Uuml;' => '&#220;',
-			'&Yacute;' => '&#221;',
-			'&THORN;' => '&#222;',
-			'&szlig;' => '&#223;',
-			'&agrave;' => '&#224;',
-			'&aacute;' => '&#225;',
-			'&acirc;' => '&#226;',
-			'&atilde;' => '&#227;',
-			'&auml;' => '&#228;',
-			'&aring;' => '&#229;',
-			'&aelig;' => '&#230;',
-			'&ccedil;' => '&#231;',
-			'&egrave;' => '&#232;',
-			'&eacute;' => '&#233;',
-			'&ecirc;' => '&#234;',
-			'&euml;' => '&#235;',
-			'&igrave;' => '&#236;',
-			'&iacute;' => '&#237;',
-			'&icirc;' => '&#238;',
-			'&iuml;' => '&#239;',
-			'&eth;' => '&#240;',
-			'&ntilde;' => '&#241;',
-			'&ograve;' => '&#242;',
-			'&oacute;' => '&#243;',
-			'&ocirc;' => '&#244;',
-			'&otilde;' => '&#245;',
-			'&ouml;' => '&#246;',
-			'&divide;' => '&#247;',
-			'&oslash;' => '&#248;',
-			'&ugrave;' => '&#249;',
-			'&uacute;' => '&#250;',
-			'&ucirc;' => '&#251;',
-			'&uuml;' => '&#252;',
-			'&yacute;' => '&#253;',
-			'&thorn;' => '&#254;',
-			'&yuml;' => '&#255;',
-			'&OElig;' => '&#338;',
-			'&oelig;' => '&#339;',
-			'&Scaron;' => '&#352;',
-			'&scaron;' => '&#353;',
-			'&Yuml;' => '&#376;',
-			'&fnof;' => '&#402;',
-			'&circ;' => '&#710;',
-			'&tilde;' => '&#732;',
-			'&Alpha;' => '&#913;',
-			'&Beta;' => '&#914;',
-			'&Gamma;' => '&#915;',
-			'&Delta;' => '&#916;',
-			'&Epsilon;' => '&#917;',
-			'&Zeta;' => '&#918;',
-			'&Eta;' => '&#919;',
-			'&Theta;' => '&#920;',
-			'&Iota;' => '&#921;',
-			'&Kappa;' => '&#922;',
-			'&Lambda;' => '&#923;',
-			'&Mu;' => '&#924;',
-			'&Nu;' => '&#925;',
-			'&Xi;' => '&#926;',
-			'&Omicron;' => '&#927;',
-			'&Pi;' => '&#928;',
-			'&Rho;' => '&#929;',
-			'&Sigma;' => '&#931;',
-			'&Tau;' => '&#932;',
-			'&Upsilon;' => '&#933;',
-			'&Phi;' => '&#934;',
-			'&Chi;' => '&#935;',
-			'&Psi;' => '&#936;',
-			'&Omega;' => '&#937;',
-			'&alpha;' => '&#945;',
-			'&beta;' => '&#946;',
-			'&gamma;' => '&#947;',
-			'&delta;' => '&#948;',
-			'&epsilon;' => '&#949;',
-			'&zeta;' => '&#950;',
-			'&eta;' => '&#951;',
-			'&theta;' => '&#952;',
-			'&iota;' => '&#953;',
-			'&kappa;' => '&#954;',
-			'&lambda;' => '&#955;',
-			'&mu;' => '&#956;',
-			'&nu;' => '&#957;',
-			'&xi;' => '&#958;',
-			'&omicron;' => '&#959;',
-			'&pi;' => '&#960;',
-			'&rho;' => '&#961;',
-			'&sigmaf;' => '&#962;',
-			'&sigma;' => '&#963;',
-			'&tau;' => '&#964;',
-			'&upsilon;' => '&#965;',
-			'&phi;' => '&#966;',
-			'&chi;' => '&#967;',
-			'&psi;' => '&#968;',
-			'&omega;' => '&#969;',
-			'&thetasym;' => '&#977;',
-			'&upsih;' => '&#978;',
-			'&piv;' => '&#982;',
-			'&ensp;' => '&#8194;',
-			'&emsp;' => '&#8195;',
-			'&thinsp;' => '&#8201;',
-			'&zwnj;' => '&#8204;',
-			'&zwj;' => '&#8205;',
-			'&lrm;' => '&#8206;',
-			'&rlm;' => '&#8207;',
-			'&ndash;' => '&#8211;',
-			'&mdash;' => '&#8212;',
-			'&lsquo;' => '&#8216;',
-			'&rsquo;' => '&#8217;',
-			'&sbquo;' => '&#8218;',
-			'&ldquo;' => '&#8220;',
-			'&rdquo;' => '&#8221;',
-			'&bdquo;' => '&#8222;',
-			'&dagger;' => '&#8224;',
-			'&Dagger;' => '&#8225;',
-			'&bull;' => '&#8226;',
-			'&hellip;' => '&#8230;',
-			'&permil;' => '&#8240;',
-			'&prime;' => '&#8242;',
-			'&Prime;' => '&#8243;',
-			'&lsaquo;' => '&#8249;',
-			'&rsaquo;' => '&#8250;',
-			'&oline;' => '&#8254;',
-			'&frasl;' => '&#8260;',
-			'&euro;' => '&#8364;',
-			'&image;' => '&#8465;',
-			'&weierp;' => '&#8472;',
-			'&real;' => '&#8476;',
-			'&trade;' => '&#8482;',
-			'&alefsym;' => '&#8501;',
-			'&crarr;' => '&#8629;',
-			'&lArr;' => '&#8656;',
-			'&uArr;' => '&#8657;',
-			'&rArr;' => '&#8658;',
-			'&dArr;' => '&#8659;',
-			'&hArr;' => '&#8660;',
-			'&forall;' => '&#8704;',
-			'&part;' => '&#8706;',
-			'&exist;' => '&#8707;',
-			'&empty;' => '&#8709;',
-			'&nabla;' => '&#8711;',
-			'&isin;' => '&#8712;',
-			'&notin;' => '&#8713;',
-			'&ni;' => '&#8715;',
-			'&prod;' => '&#8719;',
-			'&sum;' => '&#8721;',
-			'&minus;' => '&#8722;',
-			'&lowast;' => '&#8727;',
-			'&radic;' => '&#8730;',
-			'&prop;' => '&#8733;',
-			'&infin;' => '&#8734;',
-			'&ang;' => '&#8736;',
-			'&and;' => '&#8743;',
-			'&or;' => '&#8744;',
-			'&cap;' => '&#8745;',
-			'&cup;' => '&#8746;',
-			'&int;' => '&#8747;',
-			'&there4;' => '&#8756;',
-			'&sim;' => '&#8764;',
-			'&cong;' => '&#8773;',
-			'&asymp;' => '&#8776;',
-			'&ne;' => '&#8800;',
-			'&equiv;' => '&#8801;',
-			'&le;' => '&#8804;',
-			'&ge;' => '&#8805;',
-			'&sub;' => '&#8834;',
-			'&sup;' => '&#8835;',
-			'&nsub;' => '&#8836;',
-			'&sube;' => '&#8838;',
-			'&supe;' => '&#8839;',
-			'&oplus;' => '&#8853;',
-			'&otimes;' => '&#8855;',
-			'&perp;' => '&#8869;',
-			'&sdot;' => '&#8901;',
-			'&lceil;' => '&#8968;',
-			'&rceil;' => '&#8969;',
-			'&lfloor;' => '&#8970;',
-			'&rfloor;' => '&#8971;',
-			'&lang;' => '&#9001;',
-			'&rang;' => '&#9002;',
-			'&larr;' => '&#8592;',
-			'&uarr;' => '&#8593;',
-			'&rarr;' => '&#8594;',
-			'&darr;' => '&#8595;',
-			'&harr;' => '&#8596;',
-			'&loz;' => '&#9674;',
-			'&spades;' => '&#9824;',
-			'&clubs;' => '&#9827;',
-			'&hearts;' => '&#9829;',
-			'&diams;' => '&#9830;'
+		'&quot;' => '&#34;',
+		'&amp;' => '&#38;',
+		'&frasl;' => '&#47;',
+		'&lt;' => '&#60;',
+		'&gt;' => '&#62;',
+		'|' => '&#124;',
+		'&nbsp;' => '&#160;',
+		'&iexcl;' => '&#161;',
+		'&cent;' => '&#162;',
+		'&pound;' => '&#163;',
+		'&curren;' => '&#164;',
+		'&yen;' => '&#165;',
+		'&brvbar;' => '&#166;',
+		'&brkbar;' => '&#166;',
+		'&sect;' => '&#167;',
+		'&uml;' => '&#168;',
+		'&die;' => '&#168;',
+		'&copy;' => '&#169;',
+		'&ordf;' => '&#170;',
+		'&laquo;' => '&#171;',
+		'&not;' => '&#172;',
+		'&shy;' => '&#173;',
+		'&reg;' => '&#174;',
+		'&macr;' => '&#175;',
+		'&hibar;' => '&#175;',
+		'&deg;' => '&#176;',
+		'&plusmn;' => '&#177;',
+		'&sup2;' => '&#178;',
+		'&sup3;' => '&#179;',
+		'&acute;' => '&#180;',
+		'&micro;' => '&#181;',
+		'&para;' => '&#182;',
+		'&middot;' => '&#183;',
+		'&cedil;' => '&#184;',
+		'&sup1;' => '&#185;',
+		'&ordm;' => '&#186;',
+		'&raquo;' => '&#187;',
+		'&frac14;' => '&#188;',
+		'&frac12;' => '&#189;',
+		'&frac34;' => '&#190;',
+		'&iquest;' => '&#191;',
+		'&Agrave;' => '&#192;',
+		'&Aacute;' => '&#193;',
+		'&Acirc;' => '&#194;',
+		'&Atilde;' => '&#195;',
+		'&Auml;' => '&#196;',
+		'&Aring;' => '&#197;',
+		'&AElig;' => '&#198;',
+		'&Ccedil;' => '&#199;',
+		'&Egrave;' => '&#200;',
+		'&Eacute;' => '&#201;',
+		'&Ecirc;' => '&#202;',
+		'&Euml;' => '&#203;',
+		'&Igrave;' => '&#204;',
+		'&Iacute;' => '&#205;',
+		'&Icirc;' => '&#206;',
+		'&Iuml;' => '&#207;',
+		'&ETH;' => '&#208;',
+		'&Ntilde;' => '&#209;',
+		'&Ograve;' => '&#210;',
+		'&Oacute;' => '&#211;',
+		'&Ocirc;' => '&#212;',
+		'&Otilde;' => '&#213;',
+		'&Ouml;' => '&#214;',
+		'&times;' => '&#215;',
+		'&Oslash;' => '&#216;',
+		'&Ugrave;' => '&#217;',
+		'&Uacute;' => '&#218;',
+		'&Ucirc;' => '&#219;',
+		'&Uuml;' => '&#220;',
+		'&Yacute;' => '&#221;',
+		'&THORN;' => '&#222;',
+		'&szlig;' => '&#223;',
+		'&agrave;' => '&#224;',
+		'&aacute;' => '&#225;',
+		'&acirc;' => '&#226;',
+		'&atilde;' => '&#227;',
+		'&auml;' => '&#228;',
+		'&aring;' => '&#229;',
+		'&aelig;' => '&#230;',
+		'&ccedil;' => '&#231;',
+		'&egrave;' => '&#232;',
+		'&eacute;' => '&#233;',
+		'&ecirc;' => '&#234;',
+		'&euml;' => '&#235;',
+		'&igrave;' => '&#236;',
+		'&iacute;' => '&#237;',
+		'&icirc;' => '&#238;',
+		'&iuml;' => '&#239;',
+		'&eth;' => '&#240;',
+		'&ntilde;' => '&#241;',
+		'&ograve;' => '&#242;',
+		'&oacute;' => '&#243;',
+		'&ocirc;' => '&#244;',
+		'&otilde;' => '&#245;',
+		'&ouml;' => '&#246;',
+		'&divide;' => '&#247;',
+		'&oslash;' => '&#248;',
+		'&ugrave;' => '&#249;',
+		'&uacute;' => '&#250;',
+		'&ucirc;' => '&#251;',
+		'&uuml;' => '&#252;',
+		'&yacute;' => '&#253;',
+		'&thorn;' => '&#254;',
+		'&yuml;' => '&#255;',
+		'&OElig;' => '&#338;',
+		'&oelig;' => '&#339;',
+		'&Scaron;' => '&#352;',
+		'&scaron;' => '&#353;',
+		'&Yuml;' => '&#376;',
+		'&fnof;' => '&#402;',
+		'&circ;' => '&#710;',
+		'&tilde;' => '&#732;',
+		'&Alpha;' => '&#913;',
+		'&Beta;' => '&#914;',
+		'&Gamma;' => '&#915;',
+		'&Delta;' => '&#916;',
+		'&Epsilon;' => '&#917;',
+		'&Zeta;' => '&#918;',
+		'&Eta;' => '&#919;',
+		'&Theta;' => '&#920;',
+		'&Iota;' => '&#921;',
+		'&Kappa;' => '&#922;',
+		'&Lambda;' => '&#923;',
+		'&Mu;' => '&#924;',
+		'&Nu;' => '&#925;',
+		'&Xi;' => '&#926;',
+		'&Omicron;' => '&#927;',
+		'&Pi;' => '&#928;',
+		'&Rho;' => '&#929;',
+		'&Sigma;' => '&#931;',
+		'&Tau;' => '&#932;',
+		'&Upsilon;' => '&#933;',
+		'&Phi;' => '&#934;',
+		'&Chi;' => '&#935;',
+		'&Psi;' => '&#936;',
+		'&Omega;' => '&#937;',
+		'&alpha;' => '&#945;',
+		'&beta;' => '&#946;',
+		'&gamma;' => '&#947;',
+		'&delta;' => '&#948;',
+		'&epsilon;' => '&#949;',
+		'&zeta;' => '&#950;',
+		'&eta;' => '&#951;',
+		'&theta;' => '&#952;',
+		'&iota;' => '&#953;',
+		'&kappa;' => '&#954;',
+		'&lambda;' => '&#955;',
+		'&mu;' => '&#956;',
+		'&nu;' => '&#957;',
+		'&xi;' => '&#958;',
+		'&omicron;' => '&#959;',
+		'&pi;' => '&#960;',
+		'&rho;' => '&#961;',
+		'&sigmaf;' => '&#962;',
+		'&sigma;' => '&#963;',
+		'&tau;' => '&#964;',
+		'&upsilon;' => '&#965;',
+		'&phi;' => '&#966;',
+		'&chi;' => '&#967;',
+		'&psi;' => '&#968;',
+		'&omega;' => '&#969;',
+		'&thetasym;' => '&#977;',
+		'&upsih;' => '&#978;',
+		'&piv;' => '&#982;',
+		'&ensp;' => '&#8194;',
+		'&emsp;' => '&#8195;',
+		'&thinsp;' => '&#8201;',
+		'&zwnj;' => '&#8204;',
+		'&zwj;' => '&#8205;',
+		'&lrm;' => '&#8206;',
+		'&rlm;' => '&#8207;',
+		'&ndash;' => '&#8211;',
+		'&mdash;' => '&#8212;',
+		'&lsquo;' => '&#8216;',
+		'&rsquo;' => '&#8217;',
+		'&sbquo;' => '&#8218;',
+		'&ldquo;' => '&#8220;',
+		'&rdquo;' => '&#8221;',
+		'&bdquo;' => '&#8222;',
+		'&dagger;' => '&#8224;',
+		'&Dagger;' => '&#8225;',
+		'&bull;' => '&#8226;',
+		'&hellip;' => '&#8230;',
+		'&permil;' => '&#8240;',
+		'&prime;' => '&#8242;',
+		'&Prime;' => '&#8243;',
+		'&lsaquo;' => '&#8249;',
+		'&rsaquo;' => '&#8250;',
+		'&oline;' => '&#8254;',
+		'&frasl;' => '&#8260;',
+		'&euro;' => '&#8364;',
+		'&image;' => '&#8465;',
+		'&weierp;' => '&#8472;',
+		'&real;' => '&#8476;',
+		'&trade;' => '&#8482;',
+		'&alefsym;' => '&#8501;',
+		'&crarr;' => '&#8629;',
+		'&lArr;' => '&#8656;',
+		'&uArr;' => '&#8657;',
+		'&rArr;' => '&#8658;',
+		'&dArr;' => '&#8659;',
+		'&hArr;' => '&#8660;',
+		'&forall;' => '&#8704;',
+		'&part;' => '&#8706;',
+		'&exist;' => '&#8707;',
+		'&empty;' => '&#8709;',
+		'&nabla;' => '&#8711;',
+		'&isin;' => '&#8712;',
+		'&notin;' => '&#8713;',
+		'&ni;' => '&#8715;',
+		'&prod;' => '&#8719;',
+		'&sum;' => '&#8721;',
+		'&minus;' => '&#8722;',
+		'&lowast;' => '&#8727;',
+		'&radic;' => '&#8730;',
+		'&prop;' => '&#8733;',
+		'&infin;' => '&#8734;',
+		'&ang;' => '&#8736;',
+		'&and;' => '&#8743;',
+		'&or;' => '&#8744;',
+		'&cap;' => '&#8745;',
+		'&cup;' => '&#8746;',
+		'&int;' => '&#8747;',
+		'&there4;' => '&#8756;',
+		'&sim;' => '&#8764;',
+		'&cong;' => '&#8773;',
+		'&asymp;' => '&#8776;',
+		'&ne;' => '&#8800;',
+		'&equiv;' => '&#8801;',
+		'&le;' => '&#8804;',
+		'&ge;' => '&#8805;',
+		'&sub;' => '&#8834;',
+		'&sup;' => '&#8835;',
+		'&nsub;' => '&#8836;',
+		'&sube;' => '&#8838;',
+		'&supe;' => '&#8839;',
+		'&oplus;' => '&#8853;',
+		'&otimes;' => '&#8855;',
+		'&perp;' => '&#8869;',
+		'&sdot;' => '&#8901;',
+		'&lceil;' => '&#8968;',
+		'&rceil;' => '&#8969;',
+		'&lfloor;' => '&#8970;',
+		'&rfloor;' => '&#8971;',
+		'&lang;' => '&#9001;',
+		'&rang;' => '&#9002;',
+		'&larr;' => '&#8592;',
+		'&uarr;' => '&#8593;',
+		'&rarr;' => '&#8594;',
+		'&darr;' => '&#8595;',
+		'&harr;' => '&#8596;',
+		'&loz;' => '&#9674;',
+		'&spades;' => '&#9824;',
+		'&clubs;' => '&#9827;',
+		'&hearts;' => '&#9829;',
+		'&diams;' => '&#9830;'
 	);
 
-	foreach ($to_ncr as $entity => $ncr) {
-		$text = str_replace($entity, $ncr, $text);
-	}
-	return $text;
+	return str_replace( array_keys($to_ncr), array_values($to_ncr), $text );
+}
+
+function wp_richedit_pre($text) {
+	// Filtering a blank results in an annoying <br />\n
+	if ( empty($text) ) return apply_filters('richedit_pre', '');
+
+	$output = $text;
+	$output = convert_chars($output);
+	$output = wpautop($output);
+
+	// These must be double-escaped or planets will collide.
+	$output = str_replace('&lt;', '&amp;lt;', $output);
+	$output = str_replace('&gt;', '&amp;gt;', $output);
+
+	return apply_filters('richedit_pre', $output);
 }
 
+// Escape single quotes, specialchar double quotes, and fix line endings.
+function js_escape($text) {
+	$text = wp_specialchars($text, 'double');
+	$text = str_replace('&#039;', "'", $text);
+	return preg_replace("/\r?\n/", "\\n", addslashes($text));
+}
 ?>
diff -ruN 1.5.2/wp-includes/functions.php 2.0.4/wp-includes/functions.php
--- 1.5.2/wp-includes/functions.php	2005-05-27 01:10:41.000000000 -0500
+++ 2.0.4/wp-includes/functions.php	2006-07-26 12:45:19.000000000 -0500
@@ -2,7 +2,7 @@
 
 require_once(dirname(__FILE__).'/functions-compat.php');
 
-if (!function_exists('_')) {
+if ( !function_exists('_') ) {
 	function _($string) {
 		return $string;
 	}
@@ -10,33 +10,37 @@
 
 function get_profile($field, $user = false) {
 	global $wpdb;
-	if (!$user)
-		$user = $wpdb->escape($_COOKIE['wordpressuser_' . COOKIEHASH]);
+	if ( !$user )
+		$user = $wpdb->escape($_COOKIE[USER_COOKIE]);
 	return $wpdb->get_var("SELECT $field FROM $wpdb->users WHERE user_login = '$user'");
 }
 
 function mysql2date($dateformatstring, $mysqlstring, $translate = true) {
 	global $month, $weekday, $month_abbrev, $weekday_abbrev;
 	$m = $mysqlstring;
-	if (empty($m)) {
+	if ( empty($m) ) {
 		return false;
 	}
-	$i = mktime(substr($m,11,2),substr($m,14,2),substr($m,17,2),substr($m,5,2),substr($m,8,2),substr($m,0,4)); 
-	if (!empty($month) && !empty($weekday) && $translate) {
+	$i = mktime(substr($m,11,2),substr($m,14,2),substr($m,17,2),substr($m,5,2),substr($m,8,2),substr($m,0,4));
+	
+	if ( -1 == $i || false == $i )
+		$i = 0;
+
+	if ( !empty($month) && !empty($weekday) && $translate ) {
 		$datemonth = $month[date('m', $i)];
 		$datemonth_abbrev = $month_abbrev[$datemonth];
 		$dateweekday = $weekday[date('w', $i)];
-		$dateweekday_abbrev = $weekday_abbrev[$dateweekday]; 		
+		$dateweekday_abbrev = $weekday_abbrev[$dateweekday];
 		$dateformatstring = ' '.$dateformatstring;
 		$dateformatstring = preg_replace("/([^\\\])D/", "\\1".backslashit($dateweekday_abbrev), $dateformatstring);
 		$dateformatstring = preg_replace("/([^\\\])F/", "\\1".backslashit($datemonth), $dateformatstring);
 		$dateformatstring = preg_replace("/([^\\\])l/", "\\1".backslashit($dateweekday), $dateformatstring);
 		$dateformatstring = preg_replace("/([^\\\])M/", "\\1".backslashit($datemonth_abbrev), $dateformatstring);
-	
+
 		$dateformatstring = substr($dateformatstring, 1, strlen($dateformatstring)-1);
 	}
 	$j = @date($dateformatstring, $i);
-	if (!$j) {
+	if ( !$j ) {
 	// for debug purposes
 	//	echo $i." ".$mysqlstring;
 	}
@@ -46,12 +50,12 @@
 function current_time($type, $gmt = 0) {
 	switch ($type) {
 		case 'mysql':
-			if ($gmt) $d = gmdate('Y-m-d H:i:s');
+			if ( $gmt ) $d = gmdate('Y-m-d H:i:s');
 			else $d = gmdate('Y-m-d H:i:s', (time() + (get_settings('gmt_offset') * 3600)));
 			return $d;
 			break;
 		case 'timestamp':
-			if ($gmt) $d = time();
+			if ( $gmt ) $d = time();
 			else $d = time() + (get_settings('gmt_offset') * 3600);
 			return $d;
 			break;
@@ -60,12 +64,12 @@
 
 function date_i18n($dateformatstring, $unixtimestamp) {
 	global $month, $weekday, $month_abbrev, $weekday_abbrev;
-	$i = $unixtimestamp; 
-	if ((!empty($month)) && (!empty($weekday))) {
+	$i = $unixtimestamp;
+	if ( (!empty($month)) && (!empty($weekday)) ) {
 		$datemonth = $month[date('m', $i)];
 		$datemonth_abbrev = $month_abbrev[$datemonth];
 		$dateweekday = $weekday[date('w', $i)];
-		$dateweekday_abbrev = $weekday_abbrev[$dateweekday]; 		
+		$dateweekday_abbrev = $weekday_abbrev[$dateweekday];
 		$dateformatstring = ' '.$dateformatstring;
 		$dateformatstring = preg_replace("/([^\\\])D/", "\\1".backslashit($dateweekday_abbrev), $dateformatstring);
 		$dateformatstring = preg_replace("/([^\\\])F/", "\\1".backslashit($datemonth), $dateformatstring);
@@ -85,19 +89,19 @@
 	$weekday = date('w',$day);
 	$i = 86400;
 
-	if ($weekday < get_settings('start_of_week'))
+	if ( $weekday < get_settings('start_of_week') )
 		$weekday = 7 - (get_settings('start_of_week') - $weekday);
 
 	while ($weekday > get_settings('start_of_week')) {
 		$weekday = date('w',$day);
-		if ($weekday < get_settings('start_of_week'))
+		if ( $weekday < get_settings('start_of_week') )
 			$weekday = 7 - (get_settings('start_of_week') - $weekday);
 
 		$day = $day - 86400;
 		$i = 0;
 	}
 	$week['start'] = $day + 86400 - $i;
-	//$week['end']   = $day - $i + 691199;
+	// $week['end'] = $day - $i + 691199;
 	$week['end'] = $week['start'] + 604799;
 	return $week;
 }
@@ -144,7 +148,7 @@
 				break;
 		}
 		$lastpostdate = get_lastpostdate($timezone);
-		if ($lastpostdate > $lastpostmodified) {
+		if ( $lastpostdate > $lastpostmodified ) {
 			$lastpostmodified = $lastpostdate;
 		}
 		$cache_lastpostmodified[$timezone] = $lastpostmodified;
@@ -170,104 +174,152 @@
 	return $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_author = '$userid' AND post_status = 'publish'");
 }
 
+
 // examine a url (supposedly from this blog) and try to
 // determine the post ID it represents.
 function url_to_postid($url) {
 	global $wp_rewrite;
 
-	// First, check to see if there is a 'p=N' or 'page_id=N' to match against:
+	// First, check to see if there is a 'p=N' or 'page_id=N' to match against
 	preg_match('#[?&](p|page_id)=(\d+)#', $url, $values);
 	$id = intval($values[2]);
-	if ($id) return $id;
+	if ( $id ) return $id;
 
-	// URI is probably a permalink.
+	// Check to see if we are using rewrite rules
 	$rewrite = $wp_rewrite->wp_rewrite_rules();
 
+	// Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options
 	if ( empty($rewrite) )
 		return 0;
 
-	$req_uri = $url;
-
-	if ( false !== strpos($req_uri, get_settings('home')) ) {
-		$req_uri = str_replace(get_settings('home'), '', $req_uri);
+	// $url cleanup by Mark Jaquith
+	// This fixes things like #anchors, ?query=strings, missing 'www.',
+	// added 'www.', or added 'index.php/' that will mess up our WP_Query
+	// and return a false negative
+
+	// Get rid of the #anchor
+	$url_split = explode('#', $url);
+	$url = $url_split[0];
+
+	// Get rid of URI ?query=string
+	$url_split = explode('?', $url);
+	$url = $url_split[0];
+
+	// Add 'www.' if it is absent and should be there
+	if ( false !== strpos(get_settings('home'), '://www.') && false === strpos($url, '://www.') )
+		$url = str_replace('://', '://www.', $url);
+
+	// Strip 'www.' if it is present and shouldn't be
+	if ( false === strpos(get_settings('home'), '://www.') )
+		$url = str_replace('://www.', '://', $url);
+
+	// Strip 'index.php/' if we're not using path info permalinks
+	if ( false === strpos($rewrite, 'index.php/') )
+		$url = str_replace('index.php/', '', $url);
+
+	if ( false !== strpos($url, get_settings('home')) ) {
+		// Chop off http://domain.com
+		$url = str_replace(get_settings('home'), '', $url);
 	} else {
+		// Chop off /path/to/blog
 		$home_path = parse_url(get_settings('home'));
 		$home_path = $home_path['path'];
-		$req_uri = str_replace($home_path, '', $req_uri);
+		$url = str_replace($home_path, '', $url);
 	}
 
-	$req_uri = trim($req_uri, '/');
-	$request = $req_uri;
-	
+	// Trim leading and lagging slashes
+	$url = trim($url, '/');
+
+	$request = $url;
+
+	// Done with cleanup
+
 	// Look for matches.
 	$request_match = $request;
 	foreach ($rewrite as $match => $query) {
 		// If the requesting file is the anchor of the match, prepend it
 		// to the path info.
-		if ((! empty($req_uri)) && (strpos($match, $req_uri) === 0)) {
-			$request_match = $req_uri . '/' . $request;
+		if ( (! empty($url)) && (strpos($match, $url) === 0) ) {
+			$request_match = $url . '/' . $request;
 		}
 
-		if (preg_match("!^$match!", $request_match, $matches)) {
+		if ( preg_match("!^$match!", $request_match, $matches) ) {
 			// Got a match.
 			// Trim the query of everything up to the '?'.
 			$query = preg_replace("!^.+\?!", '', $query);
-			
+
 			// Substitute the substring matches into the query.
 			eval("\$query = \"$query\";");
 			$query = new WP_Query($query);
-			if ( !empty($query->post) )
+			if ( $query->is_single || $query->is_page )
 				return $query->post->ID;
 			else
 				return 0;
 		}
 	}
-
 	return 0;
 }
 
 
+function maybe_unserialize($original) {
+	if ( false !== $gm = @ unserialize($original) )
+		return $gm;
+	else
+		return $original;
+}
+
 /* Options functions */
 
 function get_settings($setting) {
-  global $wpdb, $cache_settings, $cache_nonexistantoptions;
-	if ( strstr($_SERVER['REQUEST_URI'], 'wp-admin/install.php') || defined('WP_INSTALLING') )
-		return false;
-
-	if ( empty($cache_settings) )
-		$cache_settings = get_alloptions();
-
-	if ( empty($cache_nonexistantoptions) )
-		$cache_nonexistantoptions = array();
+	global $wpdb;
 
-	if ('home' == $setting && '' == $cache_settings->home)
-		return apply_filters('option_' . $setting, $cache_settings->siteurl);
+	$value = wp_cache_get($setting, 'options');
 
-	if ( isset($cache_settings->$setting) ) :
-		return apply_filters('option_' . $setting, $cache_settings->$setting);
-	else :
-		// for these cases when we're asking for an unknown option
-		if ( isset($cache_nonexistantoptions[$setting]) )
+	if ( false === $value ) {
+		if ( defined('WP_INSTALLING') )
+			$wpdb->hide_errors();
+		$row = $wpdb->get_row("SELECT option_value FROM $wpdb->options WHERE option_name = '$setting' LIMIT 1");
+		if ( defined('WP_INSTALLING') )
+			$wpdb->show_errors();
+
+		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;
+			wp_cache_set($setting, $value, 'options');
+		} else {
 			return false;
+		}
+	}
 
-		$option = $wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = '$setting'");
+	// If home is not set use siteurl.
+	if ( 'home' == $setting && '' == $value )
+		return get_settings('siteurl');
 
-		if (!$option) :
-			$cache_nonexistantoptions[$setting] = true;
-			return false;
-		endif;
+	if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting )
+		$value = preg_replace('|/+$|', '', $value);
 
-		@ $kellogs = unserialize($option);
-		if ($kellogs !== FALSE)
-			return apply_filters('option_' . $setting, $kellogs);
-		else return apply_filters('option_' . $setting, $option);
-	endif;
+	return apply_filters( 'option_' . $setting, maybe_unserialize($value) );
 }
 
 function get_option($option) {
 	return get_settings($option);
 }
 
+function get_user_option( $option, $user = 0 ) {
+	global $wpdb;
+	
+	if ( empty($user) )
+		$user = wp_get_current_user();
+	else
+		$user = get_userdata($user);
+
+	if ( isset( $user->{$wpdb->prefix . $option} ) ) // Blog specific
+		return $user->{$wpdb->prefix . $option};
+	elseif ( isset( $user->{$option} ) ) // User specific and cross-blog
+		return $user->{$option};
+	else // Blog global
+		return get_option( $option );
+}
+
 function form_option($option) {
 	echo htmlspecialchars( get_option($option), ENT_QUOTES );
 }
@@ -275,66 +327,84 @@
 function get_alloptions() {
 	global $wpdb, $wp_queries;
 	$wpdb->hide_errors();
-	if (!$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'")) {
+	if ( !$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'") ) {
 		$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options");
 	}
 	$wpdb->show_errors();
 
 	foreach ($options as $option) {
-		// "When trying to design a foolproof system, 
+		// "When trying to design a foolproof system,
 		//  never underestimate the ingenuity of the fools :)" -- Dougal
-		if ('siteurl' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
-		if ('home' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
-		if ('category_base' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
-		@ $value = unserialize($option->option_value);
-		if ($value === FALSE)
-			$value = $option->option_value;
+		if ( 'siteurl' == $option->option_name )
+			$option->option_value = preg_replace('|/+$|', '', $option->option_value);
+		if ( 'home' == $option->option_name )
+			$option->option_value = preg_replace('|/+$|', '', $option->option_value);
+		if ( 'category_base' == $option->option_name )
+			$option->option_value = preg_replace('|/+$|', '', $option->option_value);
+		$value = maybe_unserialize($option->option_value);
 		$all_options->{$option->option_name} = apply_filters('pre_option_' . $option->option_name, $value);
 	}
 	return apply_filters('all_options', $all_options);
 }
 
 function update_option($option_name, $newvalue) {
-	global $wpdb, $cache_settings;
+	global $wpdb;
+
+	if ( is_string($newvalue) )
+		$newvalue = trim($newvalue);
+
+	// If the new and old values are the same, no need to update.
+	$oldvalue = get_option($option_name);
+	if ( $newvalue == $oldvalue ) {
+		return false;
+	}
+
+	if ( false === $oldvalue ) {
+		add_option($option_name, $newvalue);
+		return true;
+	}
+
+	$_newvalue = $newvalue;
 	if ( is_array($newvalue) || is_object($newvalue) )
 		$newvalue = serialize($newvalue);
 
-	$newvalue = trim($newvalue); // I can't think of any situation we wouldn't want to trim
-
-    // If the new and old values are the same, no need to update.
-    if ($newvalue == get_option($option_name)) {
-        return true;
-    }
-
-	// If it's not there add it
-	if ( !$wpdb->get_var("SELECT option_name FROM $wpdb->options WHERE option_name = '$option_name'") )
-		add_option($option_name);
+	wp_cache_set($option_name, $newvalue, 'options');
 
 	$newvalue = $wpdb->escape($newvalue);
+	$option_name = $wpdb->escape($option_name);
 	$wpdb->query("UPDATE $wpdb->options SET option_value = '$newvalue' WHERE option_name = '$option_name'");
-	$cache_settings = get_alloptions(); // Re cache settings
-	return true;
+	if ( $wpdb->rows_affected == 1 ) {
+		do_action("update_option_{$option_name}", array('old'=>$oldvalue, 'new'=>$_newvalue));
+		return true;
+	}
+	return false;
 }
 
+function update_user_option( $user_id, $option_name, $newvalue, $global = false ) {
+	global $wpdb;
+	if ( !$global )
+		$option_name = $wpdb->prefix . $option_name;
+	return update_usermeta( $user_id, $option_name, $newvalue );
+}
 
 // thx Alex Stapleton, http://alex.vort-x.net/blog/
 function add_option($name, $value = '', $description = '', $autoload = 'yes') {
 	global $wpdb;
-	$original = $value;
+
+	// Make sure the option doesn't already exist
+	if ( false !== get_option($name) )
+		return;
+
 	if ( is_array($value) || is_object($value) )
 		$value = serialize($value);
 
-	if( !$wpdb->get_var("SELECT option_name FROM $wpdb->options WHERE option_name = '$name'") ) {
-		$name = $wpdb->escape($name);
-		$value = $wpdb->escape($value);
-		$description = $wpdb->escape($description);
-		$wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, option_description, autoload) VALUES ('$name', '$value', '$description', '$autoload')");
-
-		if($wpdb->insert_id) {
-			global $cache_settings;
-			$cache_settings->{$name} = $original;
-		}
-	}
+	wp_cache_set($name, $value, 'options');
+
+	$name = $wpdb->escape($name);
+	$value = $wpdb->escape($value);
+	$description = $wpdb->escape($description);
+	$wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, option_description, autoload) VALUES ('$name', '$value', '$description', '$autoload')");
+
 	return;
 }
 
@@ -342,33 +412,37 @@
 	global $wpdb;
 	// Get the ID, if no ID then return
 	$option_id = $wpdb->get_var("SELECT option_id FROM $wpdb->options WHERE option_name = '$name'");
-	if (!$option_id) return false;
+	if ( !$option_id ) return false;
 	$wpdb->query("DELETE FROM $wpdb->options WHERE option_name = '$name'");
+	wp_cache_delete($name, 'options');
 	return true;
 }
 
 function add_post_meta($post_id, $key, $value, $unique = false) {
-	global $wpdb;
-	
-	if ($unique) {
-		if( $wpdb->get_var("SELECT meta_key FROM $wpdb->postmeta WHERE meta_key
+	global $wpdb, $post_meta_cache;
+
+	if ( $unique ) {
+		if ( $wpdb->get_var("SELECT meta_key FROM $wpdb->postmeta WHERE meta_key
 = '$key' AND post_id = '$post_id'") ) {
 			return false;
 		}
 	}
 
-	$wpdb->query("INSERT INTO $wpdb->postmeta
-                                (post_id,meta_key,meta_value) 
-                                VALUES ('$post_id','$key','$value')
-                        ");
-	
+	$original = $value;
+	if ( is_array($value) || is_object($value) )
+		$value = $wpdb->escape(serialize($value));
+
+	$wpdb->query("INSERT INTO $wpdb->postmeta (post_id,meta_key,meta_value) VALUES ('$post_id','$key','$value')");
+
+	$post_meta_cache['$post_id'][$key][] = $original;
+
 	return true;
 }
 
 function delete_post_meta($post_id, $key, $value = '') {
-	global $wpdb;
+	global $wpdb, $post_meta_cache;
 
-	if (empty($value)) {
+	if ( empty($value) ) {
 		$meta_id = $wpdb->get_var("SELECT meta_id FROM $wpdb->postmeta WHERE
 post_id = '$post_id' AND meta_key = '$key'");
 	} else {
@@ -376,64 +450,91 @@
 post_id = '$post_id' AND meta_key = '$key' AND meta_value = '$value'");
 	}
 
-	if (!$meta_id) return false;
+	if ( !$meta_id )
+		return false;
 
-	if (empty($value)) {
+	if ( empty($value) ) {
 		$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '$post_id'
 AND meta_key = '$key'");
+		unset($post_meta_cache['$post_id'][$key]);
 	} else {
 		$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '$post_id'
 AND meta_key = '$key' AND meta_value = '$value'");
+		$cache_key = $post_meta_cache['$post_id'][$key];
+		if ($cache_key) foreach ( $cache_key as $index => $data )
+			if ( $data == $value )
+				unset($post_meta_cache['$post_id'][$key][$index]);
 	}
-        
+
+	unset($post_meta_cache['$post_id'][$key]);
+
 	return true;
 }
 
 function get_post_meta($post_id, $key, $single = false) {
 	global $wpdb, $post_meta_cache;
 
-	if (isset($post_meta_cache[$post_id][$key])) {
-		if ($single) {
-			return $post_meta_cache[$post_id][$key][0];
+	if ( isset($post_meta_cache[$post_id][$key]) ) {
+		if ( $single ) {
+			return maybe_unserialize( $post_meta_cache[$post_id][$key][0] );
 		} else {
-			return $post_meta_cache[$post_id][$key];
+			return maybe_unserialize( $post_meta_cache[$post_id][$key] );
 		}
 	}
 
 	$metalist = $wpdb->get_results("SELECT meta_value FROM $wpdb->postmeta WHERE post_id = '$post_id' AND meta_key = '$key'", ARRAY_N);
 
 	$values = array();
-	if ($metalist) {
+	if ( $metalist ) {
 		foreach ($metalist as $metarow) {
 			$values[] = $metarow[0];
 		}
 	}
 
-	if ($single) {
-		if (count($values)) {
-			return $values[0];
+	if ( $single ) {
+		if ( count($values) ) {
+			$return = maybe_unserialize( $values[0] );
 		} else {
 			return '';
 		}
 	} else {
-		return $values;
+		$return = $values;
 	}
+
+	return maybe_unserialize($return);
 }
 
 function update_post_meta($post_id, $key, $value, $prev_value = '') {
 	global $wpdb, $post_meta_cache;
 
-		if(! $wpdb->get_var("SELECT meta_key FROM $wpdb->postmeta WHERE meta_key
+	$original_value = $value;
+	if ( is_array($value) || is_object($value) )
+		$value = $wpdb->escape(serialize($value));
+
+	$original_prev = $prev_value;
+	if ( is_array($prev_value) || is_object($prev_value) )
+		$prev_value = $wpdb->escape(serialize($prev_value));
+
+	if (! $wpdb->get_var("SELECT meta_key FROM $wpdb->postmeta WHERE meta_key
 = '$key' AND post_id = '$post_id'") ) {
-			return false;
-		}
+		return false;
+	}
 
-	if (empty($prev_value)) {
+	if ( empty($prev_value) ) {
 		$wpdb->query("UPDATE $wpdb->postmeta SET meta_value = '$value' WHERE
 meta_key = '$key' AND post_id = '$post_id'");
+		$cache_key = $post_meta_cache['$post_id'][$key];
+		if ( !empty($cache_key) )
+			foreach ($cache_key as $index => $data)
+				$post_meta_cache['$post_id'][$key][$index] = $original_value;
 	} else {
 		$wpdb->query("UPDATE $wpdb->postmeta SET meta_value = '$value' WHERE
 meta_key = '$key' AND post_id = '$post_id' AND meta_value = '$prev_value'");
+		$cache_key = $post_meta_cache['$post_id'][$key];
+		if ( !empty($cache_key) )
+			foreach ($cache_key as $index => $data)
+				if ( $data == $original_prev )
+					$post_meta_cache['$post_id'][$key][$index] = $original_value;
 	}
 
 	return true;
@@ -442,14 +543,14 @@
 // Deprecated.  Use get_post().
 function get_postdata($postid) {
 	$post = &get_post($postid);
-	
+
 	$postdata = array (
-		'ID' => $post->ID, 
-		'Author_ID' => $post->post_author, 
-		'Date' => $post->post_date, 
-		'Content' => $post->post_content, 
-		'Excerpt' => $post->post_excerpt, 
-		'Title' => $post->post_title, 
+		'ID' => $post->ID,
+		'Author_ID' => $post->post_author,
+		'Date' => $post->post_date,
+		'Content' => $post->post_content,
+		'Excerpt' => $post->post_excerpt,
+		'Title' => $post->post_title,
 		'Category' => $post->post_category,
 		'post_status' => $post->post_status,
 		'comment_status' => $post->comment_status,
@@ -463,112 +564,237 @@
 	return $postdata;
 }
 
-// Retrieves post data given a post ID or post object. 
+// Retrieves post data given a post ID or post object.
 // Handles post caching.
 function &get_post(&$post, $output = OBJECT) {
 	global $post_cache, $wpdb;
 
 	if ( empty($post) ) {
 		if ( isset($GLOBALS['post']) )
-			$post = & $GLOBALS['post'];
+			$_post = & $GLOBALS['post'];
 		else
-			$post = null;
-	} elseif (is_object($post) ) {
-		if (! isset($post_cache[$post->ID]))
+			$_post = null;
+	} elseif ( is_object($post) ) {
+		if ( 'static' == $post->post_status )
+			return get_page($post, $output);
+		if ( !isset($post_cache[$post->ID]) )
 			$post_cache[$post->ID] = &$post;
-		$post = & $post_cache[$post->ID];
+		$_post = & $post_cache[$post->ID];
 	} else {
-		if (isset($post_cache[$post]))
-			$post = & $post_cache[$post];
+		if ( $_post = wp_cache_get($post, 'pages') )
+			return get_page($_post, $output);
+		elseif ( isset($post_cache[$post]) )
+			$_post = & $post_cache[$post];
 		else {
-			$query = "SELECT * FROM $wpdb->posts WHERE ID=$post";
-			$post_cache[$post] = & $wpdb->get_row($query);
-			$post = & $post_cache[$post];
+			$query = "SELECT * FROM $wpdb->posts WHERE ID = '$post' LIMIT 1";
+			$_post = & $wpdb->get_row($query);
+			if ( 'static' == $_post->post_status )
+				return get_page($_post, $output);
+			$post_cache[$post] = & $_post;
 		}
 	}
 
+	if ( defined(WP_IMPORTING) )
+		unset($post_cache);
+
 	if ( $output == OBJECT ) {
-		return $post;
+		return $_post;
 	} elseif ( $output == ARRAY_A ) {
-		return get_object_vars($post);
+		return get_object_vars($_post);
 	} elseif ( $output == ARRAY_N ) {
-		return array_values(get_object_vars($post));
+		return array_values(get_object_vars($_post));
 	} else {
-		return $post;
+		return $_post;
 	}
 }
 
-// Retrieves page data given a page ID or page object. 
+function &get_children($post = 0, $output = OBJECT) {
+	global $post_cache, $wpdb;
+
+	if ( empty($post) ) {
+		if ( isset($GLOBALS['post']) )
+			$post_parent = & $GLOBALS['post']->post_parent;
+		else
+			return false;
+	} elseif ( is_object($post) ) {
+		$post_parent = $post->post_parent;
+	} else {
+		$post_parent = $post;
+	}
+
+	$post_parent = (int) $post_parent;
+
+	$query = "SELECT * FROM $wpdb->posts WHERE post_parent = $post_parent";
+
+	$children = $wpdb->get_results($query);
+
+	if ( $children ) {
+		foreach ( $children as $key => $child ) {
+			$post_cache[$child->ID] =& $children[$key];
+			$kids[$child->ID] =& $children[$key];
+		}
+	} else {
+		return false;
+	}
+
+	if ( $output == OBJECT ) {
+		return $kids;
+	} elseif ( $output == ARRAY_A ) {
+		foreach ( $kids as $kid )
+			$weeuns[$kid->ID] = get_object_vars($kids[$kid->ID]);
+		return $weeuns;
+	} elseif ( $output == ARRAY_N ) {
+		foreach ( $kids as $kid )
+			$babes[$kid->ID] = array_values(get_object_vars($kids[$kid->ID]));
+		return $babes;
+	} else {
+		return $kids;
+	}
+}
+
+function set_page_path($page) {
+	$page->fullpath = '/' . $page->post_name;
+	$path = $page->fullpath;
+	$curpage = $page;
+	while ($curpage->post_parent != 0) {
+		$curpage = get_page($curpage->post_parent);
+		$path = '/' . $curpage->post_name . $path;
+	}
+	
+	$page->fullpath = $path;
+
+	return $page;
+}
+
+// Retrieves page data given a page ID or page object.
 // Handles page caching.
 function &get_page(&$page, $output = OBJECT) {
-	global $page_cache, $wpdb;
+	global $wpdb;
 
 	if ( empty($page) ) {
-		if ( isset($GLOBALS['page']) )
-			$page = & $GLOBALS['page'];
-		else
-			$page = null;
-	} elseif (is_object($page) ) {
-		if (! isset($page_cache[$page->ID]))
-			$page_cache[$page->ID] = &$page;
-		$page = & $page_cache[$page->ID];
-	} else {
-		if ( isset($GLOBALS['page']) && ($page == $GLOBALS['page']->ID) )
-			$page = & $GLOBALS['page'];
-		elseif (isset($page_cache[$page]))
-			$page = & $page_cache[$page];
-		else {
-			$query = "SELECT * FROM $wpdb->posts WHERE ID=$page";
-			$page_cache[$page] = & $wpdb->get_row($query);
-			$page = & $page_cache[$page];
+		if ( isset($GLOBALS['page']) ) {
+			$_page = & $GLOBALS['page'];
+			wp_cache_add($_page->ID, $_page, 'pages');
+		} else {
+			$_page = null;
+		}
+	} elseif ( is_object($page) ) {
+		if ( 'static' != $page->post_status )
+			return get_post($page, $output);
+		wp_cache_add($page->ID, $page, 'pages');
+		$_page = $page;
+	} else {
+		if ( isset($GLOBALS['page']) && ($page == $GLOBALS['page']->ID) ) {
+			$_page = & $GLOBALS['page'];
+			wp_cache_add($_page->ID, $_page, 'pages');
+		} elseif ( $_page = $GLOBALS['post_cache'][$page] ) {
+			return get_post($page, $output);
+		} elseif ( $_page = wp_cache_get($page, 'pages') ) {
+			// Got it.
+		} else {
+			$query = "SELECT * FROM $wpdb->posts WHERE ID= '$page' LIMIT 1";
+			$_page = & $wpdb->get_row($query);
+			if ( 'static' != $_page->post_status )
+				return get_post($_page, $output);
+			wp_cache_add($_page->ID, $_page, 'pages');
 		}
 	}
+	
+	if (!isset($_page->fullpath)) {
+		$_page = set_page_path($_page);
+		wp_cache_replace($_page->cat_ID, $_page, 'pages');
+	}
 
 	if ( $output == OBJECT ) {
-		return $page;
+		return $_page;
 	} elseif ( $output == ARRAY_A ) {
-		return get_object_vars($page);
+		return get_object_vars($_page);
 	} elseif ( $output == ARRAY_N ) {
-		return array_values(get_object_vars($page));
+		return array_values(get_object_vars($_page));
 	} else {
-		return $page;
+		return $_page;
+	}
+}
+
+function set_category_path($cat) {
+	$cat->fullpath = '/' . $cat->category_nicename;
+	$path = $cat->fullpath;
+	$curcat = $cat;
+	while ($curcat->category_parent != 0) {
+		$curcat = get_category($curcat->category_parent);
+		$path = '/' . $curcat->category_nicename . $path;
 	}
+	
+	$cat->fullpath = $path;
+
+	return $cat;
 }
 
-// Retrieves category data given a category ID or category object. 
+// Retrieves category data given a category ID or category object.
 // Handles category caching.
 function &get_category(&$category, $output = OBJECT) {
-	global $cache_categories, $wpdb;
+	global $wpdb;
 
 	if ( empty($category) )
 		return null;
 
-	$category = (int) $category;
+	if ( is_object($category) ) {
+		wp_cache_add($category->cat_ID, $category, 'category');
+		$_category = $category;
+	} else {
+		if ( ! $_category = wp_cache_get($category, 'category') ) {
+			$_category = $wpdb->get_row("SELECT * FROM $wpdb->categories WHERE cat_ID = '$category' LIMIT 1");
+			wp_cache_add($category, $_category, 'category');
+		}
+	}
+
+	$_category = apply_filters('get_category', $_category);
+
+	if ( !isset($_category->fullpath) ) {
+		$_category = set_category_path($_category);
+		wp_cache_replace($_category->cat_ID, $_category, 'category');	
+	}
+
+	if ( $output == OBJECT ) {
+		return $_category;
+	} elseif ( $output == ARRAY_A ) {
+		return get_object_vars($_category);
+	} elseif ( $output == ARRAY_N ) {
+		return array_values(get_object_vars($_category));
+	} else {
+		return $_category;
+	}
+}
 
-	if ( ! isset($cache_categories))
-		update_category_cache();
+// Retrieves comment data given a comment ID or comment object.
+// Handles comment caching.
+function &get_comment(&$comment, $output = OBJECT) {
+	global $comment_cache, $wpdb;
 
-	if (is_object($category)) {
-		if ( ! isset($cache_categories[$category->cat_ID]))
-			$cache_categories[$category->cat_ID] = &$category;
-		$category = & $cache_categories[$category->cat_ID];
-	} else {
-		if ( !isset($cache_categories[$category]) ) {
-			$category = $wpdb->get_row("SELECT * FROM $wpdb->categories WHERE cat_ID = $category");
-			$cache_categories[$category->cat_ID] = & $category;
+	if ( empty($comment) )
+		return null;
+
+	if ( is_object($comment) ) {
+		if ( !isset($comment_cache[$comment->comment_ID]) )
+			$comment_cache[$comment->comment_ID] = &$comment;
+		$_comment = & $comment_cache[$comment->comment_ID];
+	} else {
+		if ( !isset($comment_cache[$comment]) ) {
+			$_comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment' LIMIT 1");
+			$comment_cache[$comment->comment_ID] = & $_comment;
 		} else {
-			$category = & $cache_categories[$category];
+			$_comment = & $comment_cache[$comment];
 		}
 	}
 
 	if ( $output == OBJECT ) {
-		return $category;
+		return $_comment;
 	} elseif ( $output == ARRAY_A ) {
-		return get_object_vars($category);
+		return get_object_vars($_comment);
 	} elseif ( $output == ARRAY_N ) {
-		return array_values(get_object_vars($category));
+		return array_values(get_object_vars($_comment));
 	} else {
-		return $category;
+		return $_comment;
 	}
 }
 
@@ -577,11 +803,32 @@
 	return $category->cat_name;
 }
 
+function get_all_category_ids() {
+	global $wpdb;
+	
+	if ( ! $cat_ids = wp_cache_get('all_category_ids', 'category') ) {
+		$cat_ids = $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories");
+		wp_cache_add('all_category_ids', $cat_ids, 'category');
+	}
+	
+	return $cat_ids;
+}
+
+function get_all_page_ids() {
+	global $wpdb;
+	
+	if ( ! $page_ids = wp_cache_get('all_page_ids', 'pages') ) {
+		$page_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_status='static'");
+		wp_cache_add('all_page_ids', $page_ids, 'pages');
+	}
+	
+	return $page_ids;
+}
+
 function gzip_compression() {
-	if ( strstr($_SERVER['PHP_SELF'], 'wp-admin') ) return false;
 	if ( !get_settings('gzipcompression') ) return false;
 
-	if( extension_loaded('zlib') ) {
+	if ( extension_loaded('zlib') ) {
 		ob_start('ob_gzhandler');
 	}
 }
@@ -597,7 +844,7 @@
 	$mtime = $mtime[1] + $mtime[0];
 	$timeend = $mtime;
 	$timetotal = $timeend-$timestart;
-	if ($display)
+	if ( $display )
 		echo number_format($timetotal,$precision);
 	return $timetotal;
 }
@@ -622,7 +869,7 @@
 	$services = get_settings('ping_sites');
 	$services = preg_replace("|(\s)+|", '$1', $services); // Kill dupe lines
 	$services = trim($services);
-	if ('' != $services) {
+	if ( '' != $services ) {
 		$services = explode("\n", $services);
 		foreach ($services as $service) {
 			weblog_ping($service);
@@ -636,7 +883,7 @@
 function trackback($trackback_url, $title, $excerpt, $ID) {
 	global $wpdb, $wp_version;
 
-	if (empty($trackback_url))
+	if ( empty($trackback_url) )
 		return;
 
 	$title = urlencode($title);
@@ -646,7 +893,7 @@
 	$url = urlencode(get_permalink($ID));
 	$query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt";
 	$trackback_url = parse_url($trackback_url);
-	$http_request  = 'POST ' . $trackback_url['path'] . ($trackback_url['query'] ? '?'.$trackback_url['query'] : '') . " HTTP/1.0\r\n";
+	$http_request = 'POST ' . $trackback_url['path'] . ($trackback_url['query'] ? '?'.$trackback_url['query'] : '') . " HTTP/1.0\r\n";
 	$http_request .= 'Host: '.$trackback_url['host']."\r\n";
 	$http_request .= 'Content-Type: application/x-www-form-urlencoded; charset='.get_settings('blog_charset')."\r\n";
 	$http_request .= 'Content-Length: '.strlen($query_string)."\r\n";
@@ -669,9 +916,9 @@
 */
 	@fclose($fs);
 
+	$tb_url = addslashes( $tb_url );
 	$wpdb->query("UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', '$tb_url') WHERE ID = '$ID'");
-	$wpdb->query("UPDATE $wpdb->posts SET to_ping = REPLACE(to_ping, '$tb_url', '') WHERE ID = '$ID'");
-	return $result;
+	return $wpdb->query("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, '$tb_url', '')) WHERE ID = '$ID'");
 }
 
 function make_url_footnote($content) {
@@ -685,7 +932,7 @@
 		$link_url = $matches[2][$i];
 		$link_text = $matches[4][$i];
 		$content = str_replace($link_match, $link_text.' '.$link_number, $content);
-		$link_url = (strtolower(substr($link_url,0,7)) != 'http://') ? get_settings('home') . $link_url : $link_url;
+		$link_url = ((strtolower(substr($link_url,0,7)) != 'http://') && (strtolower(substr($link_url,0,8)) != 'https://')) ? get_settings('home') . $link_url : $link_url;
 		$links_summary .= "\n".$link_number.' '.$link_url;
 	}
 	$content = strip_tags($content);
@@ -696,7 +943,7 @@
 
 function xmlrpc_getposttitle($content) {
 	global $post_default_title;
-	if (preg_match('/<title>(.+?)<\/title>/is', $content, $matchtitle)) {
+	if ( preg_match('/<title>(.+?)<\/title>/is', $content, $matchtitle) ) {
 		$post_title = $matchtitle[0];
 		$post_title = preg_replace('/<title>/si', '', $post_title);
 		$post_title = preg_replace('/<\/title>/si', '', $post_title);
@@ -705,10 +952,10 @@
 	}
 	return $post_title;
 }
-	
+
 function xmlrpc_getpostcategory($content) {
 	global $post_default_category;
-	if (preg_match('/<category>(.+?)<\/category>/is', $content, $matchcat)) {
+	if ( preg_match('/<category>(.+?)<\/category>/is', $content, $matchcat) ) {
 		$post_category = trim($matchcat[1], ',');
 		$post_category = explode(',', $post_category);
 	} else {
@@ -726,7 +973,7 @@
 
 function debug_fopen($filename, $mode) {
 	global $debug;
-	if ($debug == 1) {
+	if ( $debug == 1 ) {
 		$fp = fopen($filename, $mode);
 		return $fp;
 	} else {
@@ -736,18 +983,39 @@
 
 function debug_fwrite($fp, $string) {
 	global $debug;
-	if ($debug == 1) {
+	if ( $debug == 1 ) {
 		fwrite($fp, $string);
 	}
 }
 
 function debug_fclose($fp) {
 	global $debug;
-	if ($debug == 1) {
+	if ( $debug == 1 ) {
 		fclose($fp);
 	}
 }
 
+function spawn_pinger() {
+	global $wpdb, $wp_version;
+	$doping = false;
+	if ( $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE TRIM(to_ping) != '' LIMIT 1") )
+		$doping = true;
+
+	if ( $wpdb->get_var("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_pingme' OR meta_key = '_encloseme' LIMIT 1") )
+		$doping = true;
+
+	if ( substr(php_sapi_name(), 0, 3) == 'cgi' )
+		return $doping;
+
+	if ( $doping ) {
+		$ping_url = get_settings('siteurl') .'/wp-admin/execute-pings.php';
+		$parts = parse_url($ping_url);
+		$argyle = @ fsockopen($parts['host'], $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01);
+		if ( $argyle )
+			fputs($argyle, "GET {$parts['path']}?time=".time()." HTTP/1.0\r\nHost: {$_SERVER['HTTP_HOST']}\r\nUser-Agent: WordPress/{$wp_version}\r\n\r\n");
+       }
+}
+
 function do_enclose( $content, $post_ID ) {
 	global $wp_version, $wpdb;
 	include_once (ABSPATH . WPINC . '/class-IXR.php');
@@ -771,9 +1039,9 @@
 	foreach($post_links_temp[0] as $link_test) :
 		if ( !in_array($link_test, $pung) ) : // If we haven't pung it already
 			$test = parse_url($link_test);
-			if (isset($test['query']))
+			if ( isset($test['query']) )
 				$post_links[] = $link_test;
-			elseif(($test['path'] != '/') && ($test['path'] != ''))
+			elseif (($test['path'] != '/') && ($test['path'] != ''))
 				$post_links[] = $link_test;
 		endif;
 	endforeach;
@@ -781,10 +1049,10 @@
 	foreach ($post_links as $url) :
 		if ( $url != '' && !$wpdb->get_var("SELECT post_id FROM $wpdb->postmeta WHERE post_id = '$post_ID' AND meta_key = 'enclosure' AND meta_value LIKE ('$url%')") ) {
 			if ( $headers = wp_get_http_headers( $url) ) {
-				$len  = (int) $headers['content-length'];
-				$type = addslashes( $headers['content-type'] );
+				$len = (int) $headers['content-length'];
+				$type = $wpdb->escape( $headers['content-type'] );
 				$allowed_types = array( 'video', 'audio' );
-				if( in_array( substr( $type, 0, strpos( $type, "/" ) ), $allowed_types ) ) {
+				if ( in_array( substr( $type, 0, strpos( $type, "/" ) ), $allowed_types ) ) {
 					$meta_value = "$url\n$len\n$type\n";
 					$wpdb->query( "INSERT INTO `$wpdb->postmeta` ( `post_id` , `meta_key` , `meta_value` )
 					VALUES ( '$post_ID', 'enclosure' , '$meta_value')" );
@@ -794,15 +1062,20 @@
 	endforeach;
 }
 
-function wp_get_http_headers( $url ) {
-	set_time_limit( 60 ); 
+function wp_get_http_headers( $url, $red = 1 ) {
+	global $wp_version;
+	@set_time_limit( 60 );
+
+	if ( $red > 5 )
+	   return false;
+
 	$parts = parse_url( $url );
-	$file  = $parts['path'] . ($parts['query'] ? '?'.$parts['query'] : '');
-	$host  = $parts['host'];
+	$file = $parts['path'] . ($parts['query'] ? '?'.$parts['query'] : '');
+	$host = $parts['host'];
 	if ( !isset( $parts['port'] ) )
 		$parts['port'] = 80;
 
-	$head = "HEAD $file HTTP/1.1\r\nHOST: $host\r\n\r\n";
+	$head = "HEAD $file HTTP/1.1\r\nHOST: $host\r\nUser-Agent: WordPress/" . $wp_version . "\r\n\r\n";
 
 	$fp = @fsockopen($host, $parts['port'], $err_num, $err_msg, 3);
 	if ( !$fp )
@@ -822,6 +1095,11 @@
 
 	preg_match('/.*([0-9]{3}).*/', $response, $return);
 	$headers['response'] = $return[1]; // HTTP response code eg 204, 200, 404
+
+    $code = $headers['response'];
+    if ( ('302' == $code || '301' == $code) && isset($headers['location']) )
+        return wp_get_http_headers( $headers['location'], ++$red );
+
 	return $headers;
 }
 
@@ -837,7 +1115,7 @@
 
 // Setup global post data.
 function setup_postdata($post) {
-  global $id, $postdata, $authordata, $day, $page, $pages, $multipage, $more, $numpages, $wp_query;
+	global $id, $postdata, $authordata, $day, $page, $pages, $multipage, $more, $numpages, $wp_query;
 	global $pagenow;
 
 	$id = $post->ID;
@@ -848,13 +1126,13 @@
 	$currentmonth = mysql2date('m', $post->post_date);
 	$numpages = 1;
 	$page = get_query_var('page');
-	if (!$page)
+	if ( !$page )
 		$page = 1;
-	if (is_single() || is_page())
+	if ( is_single() || is_page() )
 		$more = 1;
 	$content = $post->post_content;
-	if (preg_match('/<!--nextpage-->/', $content)) {
-		if ($page > 1)
+	if ( preg_match('/<!--nextpage-->/', $content) ) {
+		if ( $page > 1 )
 			$more = 1;
 		$multipage = 1;
 		$content = str_replace("\n<!--nextpage-->\n", '<!--nextpage-->', $content);
@@ -869,9 +1147,31 @@
 	return true;
 }
 
+// Setup global user vars.  Used by set_current_user() for back compat.
+function setup_userdata($user_id = '') {
+	global $user_login, $userdata, $user_level, $user_ID, $user_email, $user_url, $user_pass_md5, $user_identity;
+
+	if ( '' == $user_id )
+		$user = wp_get_current_user();
+	else 
+		$user = new WP_User($user_id);
+
+	if ( 0 == $user->ID )
+		return;
+
+	$userdata = $user->data;
+	$user_login	= $user->user_login;
+	$user_level	= $user->user_level;
+	$user_ID	= $user->ID;
+	$user_email	= $user->user_email;
+	$user_url	= $user->user_url;
+	$user_pass_md5	= md5($user->user_pass);
+	$user_identity	= $user->display_name;
+}
+
 function is_new_day() {
 	global $day, $previousday;
-	if ($day != $previousday) {
+	if ( $day != $previousday ) {
 		return(1);
 	} else {
 		return(0);
@@ -882,9 +1182,9 @@
 
 function merge_filters($tag) {
 	global $wp_filter;
-	if (isset($wp_filter['all'])) {
+	if ( isset($wp_filter['all']) ) {
 		foreach ($wp_filter['all'] as $priority => $functions) {
-			if (isset($wp_filter[$tag][$priority]))
+			if ( isset($wp_filter[$tag][$priority]) )
 				$wp_filter[$tag][$priority] = array_merge($wp_filter['all'][$priority], $wp_filter[$tag][$priority]);
 			else
 				$wp_filter[$tag][$priority] = array_merge($wp_filter['all'][$priority], array());
@@ -898,31 +1198,30 @@
 
 function apply_filters($tag, $string) {
 	global $wp_filter;
-	
+
 	$args = array_slice(func_get_args(), 2);
 
 	merge_filters($tag);
-	
-	if (!isset($wp_filter[$tag])) {
+
+	if ( !isset($wp_filter[$tag]) ) {
 		return $string;
 	}
 	foreach ($wp_filter[$tag] as $priority => $functions) {
-		if (!is_null($functions)) {
+		if ( !is_null($functions) ) {
 			foreach($functions as $function) {
 
 				$all_args = array_merge(array($string), $args);
 				$function_name = $function['function'];
 				$accepted_args = $function['accepted_args'];
 
-				if($accepted_args == 1) {
+				if ( $accepted_args == 1 )
 					$the_args = array($string);
-				} elseif ($accepted_args > 1) {
+				elseif ( $accepted_args > 1 )
 					$the_args = array_slice($all_args, 0, $accepted_args);
-				} elseif($accepted_args == 0) {
+				elseif ( $accepted_args == 0 )
 					$the_args = NULL;
-				} else {
+				else
 					$the_args = $all_args;
-				}
 
 				$string = call_user_func_array($function_name, $the_args);
 			}
@@ -935,11 +1234,11 @@
 	global $wp_filter;
 
 	// check that we don't already have the same filter at the same priority
-	if (isset($wp_filter[$tag]["$priority"])) {
+	if ( isset($wp_filter[$tag]["$priority"]) ) {
 		foreach($wp_filter[$tag]["$priority"] as $filter) {
 			// uncomment if we want to match function AND accepted_args
-			//if ($filter == array($function, $accepted_args)) {
-			if ($filter['function'] == $function_to_add) {
+			// if ( $filter == array($function, $accepted_args) ) {
+			if ( $filter['function'] == $function_to_add ) {
 				return true;
 			}
 		}
@@ -954,9 +1253,10 @@
 	global $wp_filter;
 
 	// rebuild the list of filters
-	if (isset($wp_filter[$tag]["$priority"])) {
+	if ( isset($wp_filter[$tag]["$priority"]) ) {
+		$new_function_list = array();
 		foreach($wp_filter[$tag]["$priority"] as $filter) {
-			if ($filter['function'] != $function_to_remove) {
+			if ( $filter['function'] != $function_to_remove ) {
 				$new_function_list[] = $filter;
 			}
 		}
@@ -974,27 +1274,27 @@
  		$args = array_merge($arg, $extra_args);
 	else
 		$args = array_merge(array($arg), $extra_args);
-	
+
 	merge_filters($tag);
-	
-	if (!isset($wp_filter[$tag])) {
+
+	if ( !isset($wp_filter[$tag]) ) {
 		return;
 	}
 	foreach ($wp_filter[$tag] as $priority => $functions) {
-		if (!is_null($functions)) {
+		if ( !is_null($functions) ) {
 			foreach($functions as $function) {
 
 				$function_name = $function['function'];
 				$accepted_args = $function['accepted_args'];
 
-				if($accepted_args == 1) {
+				if ( $accepted_args == 1 ) {
 					if ( is_array($arg) )
 						$the_args = $arg;
 					else
 						$the_args = array($arg);
-				} elseif ($accepted_args > 1) {
+				} elseif ( $accepted_args > 1 ) {
 					$the_args = array_slice($args, 0, $accepted_args);
-				} elseif($accepted_args == 0) {
+				} elseif ( $accepted_args == 0 ) {
 					$the_args = NULL;
 				} else {
 					$the_args = $args;
@@ -1019,10 +1319,9 @@
 	$uri = urldecode($page->post_name);
 
 	// A page cannot be it's own parent.
-	if ($page->post_parent == $page->ID) {
+	if ( $page->post_parent == $page->ID )
 		return $uri;
-	}
-	
+
 	while ($page->post_parent != 0) {
 		$page = get_page($page->post_parent);
 		$uri = urldecode($page->post_name) . "/" . $uri;
@@ -1034,11 +1333,16 @@
 function get_posts($args) {
 	global $wpdb;
 	parse_str($args, $r);
-	if (!isset($r['numberposts'])) $r['numberposts'] = 5;
-	if (!isset($r['offset'])) $r['offset'] = 0;
-	if (!isset($r['category'])) $r['category'] = '';
-	if (!isset($r['orderby'])) $r['orderby'] = 'post_date';
-	if (!isset($r['order'])) $r['order'] = 'DESC';
+	if ( !isset($r['numberposts']) )
+		$r['numberposts'] = 5;
+	if ( !isset($r['offset']) )
+		$r['offset'] = 0;
+	if ( !isset($r['category']) )
+		$r['category'] = '';
+	if ( !isset($r['orderby']) )
+		$r['orderby'] = 'post_date';
+	if ( !isset($r['order']) )
+		$r['order'] = 'DESC';
 
 	$now = current_time('mysql');
 
@@ -1047,10 +1351,10 @@
 		( empty( $r['category'] ) ? "" : ", $wpdb->post2cat " ) .
 		" WHERE post_date <= '$now' AND (post_status = 'publish') ".
 		( empty( $r['category'] ) ? "" : "AND $wpdb->posts.ID = $wpdb->post2cat.post_id AND $wpdb->post2cat.category_id = " . $r['category']. " " ) .
-		" GROUP BY $wpdb->posts.ID ORDER BY " . $r['orderby'] . " " . $r['order'] . "  LIMIT " . $r['offset'] . ',' . $r['numberposts'] );
-	
-    update_post_caches($posts);
-	
+		" GROUP BY $wpdb->posts.ID ORDER BY " . $r['orderby'] . " " . $r['order'] . " LIMIT " . $r['offset'] . ',' . $r['numberposts'] );
+
+	update_post_caches($posts);
+
 	return $posts;
 }
 
@@ -1070,6 +1374,13 @@
 	}
 }
 
+function clean_post_cache($id) {
+	global $post_cache;
+
+	if ( isset( $post_cache[$id] ) )
+		unset( $post_cache[$id] );
+}
+
 function update_page_cache(&$pages) {
 	global $page_cache;
 
@@ -1078,64 +1389,57 @@
 
 	for ($i = 0; $i < count($pages); $i++) {
 		$page_cache[$pages[$i]->ID] = &$pages[$i];
+		wp_cache_add($pages[$i]->ID, $pages[$i], 'pages');
 	}
 }
 
+
+function clean_page_cache($id) {
+	global $page_cache;
+
+	if ( isset( $page_cache[$id] ) )
+		unset( $page_cache[$id] );
+}
+
 function update_post_category_cache($post_ids) {
-	global $wpdb, $category_cache, $cache_categories;
+	global $wpdb, $category_cache;
 
-	if (empty($post_ids))
+	if ( empty($post_ids) )
 		return;
 
-	if (is_array($post_ids))
+	if ( is_array($post_ids) )
 		$post_ids = implode(',', $post_ids);
 
-	$dogs = $wpdb->get_results("SELECT DISTINCT
-	post_id, cat_ID FROM $wpdb->categories, $wpdb->post2cat
-	WHERE category_id = cat_ID AND post_id IN ($post_ids)");
+	$dogs = $wpdb->get_results("SELECT post_id, category_id FROM $wpdb->post2cat WHERE post_id IN ($post_ids)");
 
-	if (! isset($cache_categories))
-		update_category_cache();
+	if ( empty($dogs) )
+		return;
 		
-	if ( !empty($dogs) ) {
-		foreach ($dogs as $catt) {
-			$category_cache[$catt->post_id][$catt->cat_ID] = &$cache_categories[$catt->cat_ID];
-		}
-	}
+	foreach ($dogs as $catt)
+		$category_cache[$catt->post_id][$catt->category_id] = &get_category($catt->category_id);
 }
 
 function update_post_caches(&$posts) {
 	global $post_cache, $category_cache, $comment_count_cache, $post_meta_cache;
 	global $wpdb;
-	
+
 	// No point in doing all this work if we didn't match any posts.
 	if ( !$posts )
 		return;
 
 	// Get the categories for all the posts
 	for ($i = 0; $i < count($posts); $i++) {
-		$post_id_list[] = $posts[$i]->ID;
+		$post_id_array[] = $posts[$i]->ID;
 		$post_cache[$posts[$i]->ID] = &$posts[$i];
+		$comment_count_cache[$posts[$i]->ID] = $posts[$i]->comment_count;
 	}
 
-	$post_id_list = implode(',', $post_id_list);
-	
-	update_post_category_cache($post_id_list);
+	$post_id_list = implode(',', $post_id_array);
 
-	// Do the same for comment numbers
-	$comment_counts = $wpdb->get_results("SELECT ID, COUNT( comment_ID ) AS ccount
-	FROM $wpdb->posts
-	LEFT JOIN $wpdb->comments ON ( comment_post_ID = ID  AND comment_approved =  '1')
-	WHERE ID IN ($post_id_list)
-	GROUP BY ID");
-	
-	if ($comment_counts) {
-		foreach ($comment_counts as $comment_count)
-			$comment_count_cache["$comment_count->ID"] = $comment_count->ccount;
-	}
+	update_post_category_cache($post_id_list);
 
-    // Get post-meta info
-	if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta  WHERE post_id IN($post_id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
+	// Get post-meta info
+	if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN($post_id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
 		// Change from flat structure to hierarchical:
 		$post_meta_cache = array();
 		foreach ($meta_list as $metarow) {
@@ -1144,9 +1448,9 @@
 			$mval = $metarow['meta_value'];
 
 			// Force subkeys to be array type:
-			if (!isset($post_meta_cache[$mpid]) || !is_array($post_meta_cache[$mpid]))
+			if ( !isset($post_meta_cache[$mpid]) || !is_array($post_meta_cache[$mpid]) )
 				$post_meta_cache[$mpid] = array();
-			if (!isset($post_meta_cache[$mpid]["$mkey"]) || !is_array($post_meta_cache[$mpid]["$mkey"]))
+			if ( !isset($post_meta_cache[$mpid]["$mkey"]) || !is_array($post_meta_cache[$mpid]["$mkey"]) )
 				$post_meta_cache[$mpid]["$mkey"] = array();
 
 			// Add a value to the current pid/key:
@@ -1156,24 +1460,7 @@
 }
 
 function update_category_cache() {
-	global $cache_categories, $wpdb;
-	$dogs = $wpdb->get_results("SELECT * FROM $wpdb->categories");
-	foreach ($dogs as $catt)
-		$cache_categories[$catt->cat_ID] = $catt;
-}
-
-function update_user_cache() {
-	global $cache_userdata, $wpdb;
-	
-	if ( $users = $wpdb->get_results("SELECT * FROM $wpdb->users WHERE user_level > 0") ) :
-		foreach ($users as $user) :
-			$cache_userdata[$user->ID] = $user;
-			$cache_userdata[$user->user_login] =& $cache_userdata[$user->ID];
-		endforeach;
-		return true;
-	else : 
-		return false;
-	endif;
+	return true;
 }
 
 function wp_head() {
@@ -1195,9 +1482,9 @@
 
 	$post_obj = $wp_query->get_queried_object();
 
-	if ( $post == $post_obj->ID ) 
+	if ( $post == $post_obj->ID )
 		return true;
-	elseif ( $post == $post_obj->post_title ) 
+	elseif ( $post == $post_obj->post_title )
 		return true;
 	elseif ( $post == $post_obj->post_name )
 		return true;
@@ -1208,83 +1495,89 @@
 function is_page ($page = '') {
 	global $wp_query;
 
-	if (! $wp_query->is_page) {
+	if ( !$wp_query->is_page )
 		return false;
-	}
 
-	if (empty($page)) {
+	if ( empty($page) )
 		return true;
-	}
 
 	$page_obj = $wp_query->get_queried_object();
-		
-	if ($page == $page_obj->ID) {
+
+	if ( $page == $page_obj->ID )
 		return true;
-	} else if ($page == $page_obj->post_title) {
+	elseif ( $page == $page_obj->post_title )
 		return true;
-	} else if ($page == $page_obj->post_name) {
+	else if ( $page == $page_obj->post_name )
 		return true;
-	}
 
 	return false;
 }
 
+function is_attachment () {
+	global $wp_query;
+
+	return $wp_query->is_attachment;
+}
+
+function is_preview() {
+	global $wp_query;
+	
+	return $wp_query->is_preview;
+}
+
 function is_archive () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_archive;
+	return $wp_query->is_archive;
 }
 
 function is_date () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_date;
+	return $wp_query->is_date;
 }
 
 function is_year () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_year;
+	return $wp_query->is_year;
 }
 
 function is_month () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_month;
+	return $wp_query->is_month;
 }
 
 function is_day () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_day;
+	return $wp_query->is_day;
 }
 
 function is_time () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_time;
+	return $wp_query->is_time;
 }
 
 function is_author ($author = '') {
 	global $wp_query;
 
-	if (! $wp_query->is_author) {
+	if ( !$wp_query->is_author )
 		return false;
-	}
 
-	if (empty($author)) {
+	if ( empty($author) )
 		return true;
-	}
 
 	$author_obj = $wp_query->get_queried_object();
-		
-	if ($author == $author_obj->ID) {
+
+	if ( $author == $author_obj->ID )
 		return true;
-	} else if ($author == $author_obj->user_nickname) {
+	elseif ( $author == $author_obj->nickname )
 		return true;
-	} else if ($author == $author_obj->user_nicename) {
+	elseif ( $author == $author_obj->user_nicename )
 		return true;
-	}
 
 	return false;
 }
@@ -1292,96 +1585,100 @@
 function is_category ($category = '') {
 	global $wp_query;
 
-	if (! $wp_query->is_category) {
+	if ( !$wp_query->is_category )
 		return false;
-	}
 
-	if (empty($category)) {
+	if ( empty($category) )
 		return true;
-	}
 
 	$cat_obj = $wp_query->get_queried_object();
-		
-	if ($category == $cat_obj->cat_ID) {
+
+	if ( $category == $cat_obj->cat_ID )
 		return true;
-	} else if ($category == $cat_obj->cat_name) {
+	else if ( $category == $cat_obj->cat_name )
 		return true;
-	} else if ($category == $cat_obj->category_nicename) {
+	elseif ( $category == $cat_obj->category_nicename )
 		return true;
-	}
 
 	return false;
 }
 
 function is_search () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_search;
+	return $wp_query->is_search;
 }
 
 function is_feed () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_feed;
+	return $wp_query->is_feed;
 }
 
 function is_trackback () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_trackback;
+	return $wp_query->is_trackback;
 }
 
 function is_admin () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_admin;
+	return ( $wp_query->is_admin || strstr($_SERVER['REQUEST_URI'], 'wp-admin/') );
 }
 
 function is_home () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_home;
+	return $wp_query->is_home;
 }
 
 function is_404 () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_404;
+	return $wp_query->is_404;
 }
 
 function is_comments_popup () {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->is_comments_popup;
+	return $wp_query->is_comments_popup;
 }
 
 function is_paged () {
-    global $wp_query;
+	global $wp_query;
+
+	return $wp_query->is_paged;
+}
 
-    return $wp_query->is_paged;
+function in_the_loop() {
+	global $wp_query;
+
+	return $wp_query->in_the_loop;
 }
 
 function get_query_var($var) {
-  global $wp_query;
+	global $wp_query;
 
-  return $wp_query->get($var);
+	return $wp_query->get($var);
 }
 
 function have_posts() {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->have_posts();
+	return $wp_query->have_posts();
 }
 
 function rewind_posts() {
-    global $wp_query;
+	global $wp_query;
 
-    return $wp_query->rewind_posts();
+	return $wp_query->rewind_posts();
 }
 
 function the_post() {
-    global $wp_query;
-    $wp_query->the_post();
+	global $wp_query;
+
+	$wp_query->the_post();
 }
 
 function get_theme_root() {
@@ -1403,7 +1700,7 @@
 }
 
 function get_stylesheet_directory_uri() {
-	$stylesheet = get_stylesheet();
+	$stylesheet = rawurlencode( get_stylesheet() );
 	$stylesheet_dir_uri = get_theme_root_uri() . "/$stylesheet";
 	return apply_filters('stylesheet_directory_uri', $stylesheet_dir_uri, $stylesheet);
 }
@@ -1415,6 +1712,11 @@
 }
 
 function get_template() {
+	$template = get_settings('template');
+	if (!file_exists(get_theme_root() . "/$template")) { //works for dirs too
+		update_option('template', 'default');
+		update_option('stylesheet', 'default');
+	}
 	return apply_filters('template', get_settings('template'));
 }
 
@@ -1439,27 +1741,24 @@
 	preg_match("|Author URI:(.*)|i", $theme_data, $author_uri);
 	preg_match("|Template:(.*)|i", $theme_data, $template);
 	if ( preg_match("|Version:(.*)|i", $theme_data, $version) )
-		$version = $version[1];
+		$version = trim($version[1]);
 	else
 		$version ='';
 	if ( preg_match("|Status:(.*)|i", $theme_data, $status) )
-		$status = $status[1];
+		$status = trim($status[1]);
 	else
-		$status ='publish';
+		$status = 'publish';
 
-	$description = wptexturize($description[1]);
+	$description = wptexturize(trim($description[1]));
 
 	$name = $theme_name[1];
 	$name = trim($name);
 	$theme = $name;
-	if ('' != $theme_uri[1] && '' != $name) {
-		$theme = '<a href="' . $theme_uri[1] . '" title="' . __('Visit theme homepage') . '">' . $theme . '</a>';
-	}
 
-	if ('' == $author_uri[1]) {
-		$author = $author_name[1];
+	if ( '' == $author_uri[1] ) {
+		$author = trim($author_name[1]);
 	} else {
-		$author = '<a href="' . $author_uri[1] . '" title="' . __('Visit author homepage') . '">' . $author_name[1] . '</a>';
+		$author = '<a href="' . trim($author_uri[1]) . '" title="' . __('Visit author homepage') . '">' . trim($author_name[1]) . '</a>';
 	}
 
 	return array('Name' => $name, 'Title' => $theme, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template[1], 'Status' => $status);
@@ -1469,9 +1768,8 @@
 	global $wp_themes;
 	global $wp_broken_themes;
 
-	if (isset($wp_themes)) {
+	if ( isset($wp_themes) )
 		return $wp_themes;
-	}
 
 	$themes = array();
 	$wp_broken_themes = array();
@@ -1480,38 +1778,43 @@
 
 	// Files in wp-content/themes directory
 	$themes_dir = @ dir($theme_root);
-	if ($themes_dir) {
+	if ( $themes_dir ) {
 		while(($theme_dir = $themes_dir->read()) !== false) {
-			if (is_dir($theme_root . '/' . $theme_dir)) {
-				if ($theme_dir{0} == '.' || $theme_dir == '..' || $theme_dir == 'CVS') {
+			if ( is_dir($theme_root . '/' . $theme_dir) && is_readable($theme_root . '/' . $theme_dir) ) {
+				if ( $theme_dir{0} == '.' || $theme_dir == '..' || $theme_dir == 'CVS' ) {
 					continue;
 				}
 				$stylish_dir = @ dir($theme_root . '/' . $theme_dir);
 				$found_stylesheet = false;
-				while(($theme_file = $stylish_dir->read()) !== false) {
+				while (($theme_file = $stylish_dir->read()) !== false) {
 					if ( $theme_file == 'style.css' ) {
 						$theme_files[] = $theme_dir . '/' . $theme_file;
 						$found_stylesheet = true;
 						break;
 					}
 				}
-				if (!$found_stylesheet) {
+				if ( !$found_stylesheet ) {
 					$wp_broken_themes[$theme_dir] = array('Name' => $theme_dir, 'Title' => $theme_dir, 'Description' => __('Stylesheet is missing.'));
 				}
 			}
 		}
 	}
 
-	if (!$themes_dir || !$theme_files) {
+	if ( !$themes_dir || !$theme_files ) {
 		return $themes;
 	}
 
 	sort($theme_files);
 
 	foreach($theme_files as $theme_file) {
+		if ( ! is_readable("$theme_root/$theme_file") ) {
+			$wp_broken_themes[$theme_file] = array('Name' => $theme_file, 'Title' => $theme_file, 'Description' => __('File not readable.'));
+			continue;
+		}
+
 		$theme_data = get_theme_data("$theme_root/$theme_file");
-	  
-		$name = $theme_data['Name']; 
+
+		$name = $theme_data['Name'];
 		$title = $theme_data['Title'];
 		$description = wptexturize($theme_data['Description']);
 		$version = $theme_data['Version'];
@@ -1519,13 +1822,20 @@
 		$template = $theme_data['Template'];
 		$stylesheet = dirname($theme_file);
 
-		if (empty($name)) {
+		foreach (array('png', 'gif', 'jpg', 'jpeg') as $ext) {
+			if (file_exists("$theme_root/$stylesheet/screenshot.$ext")) {
+				$screenshot = "screenshot.$ext";
+				break;
+			}
+		}
+
+		if ( empty($name) ) {
 			$name = dirname($theme_file);
 			$title = $name;
 		}
 
-		if (empty($template)) {
-			if (file_exists(dirname("$theme_root/$theme_file/index.php"))) {
+		if ( empty($template) ) {
+			if ( file_exists(dirname("$theme_root/$theme_file/index.php")) ) {
 				$template = dirname($theme_file);
 			} else {
 				continue;
@@ -1534,25 +1844,25 @@
 
 		$template = trim($template);
 
-		if (! file_exists("$theme_root/$template/index.php")) {
+		if ( !file_exists("$theme_root/$template/index.php") ) {
 			$wp_broken_themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => __('Template is missing.'));
 			continue;
 		}
-		
+
 		$stylesheet_files = array();
 		$stylesheet_dir = @ dir("$theme_root/$stylesheet");
-		if ($stylesheet_dir) {
+		if ( $stylesheet_dir ) {
 			while(($file = $stylesheet_dir->read()) !== false) {
-				if ( !preg_match('|^\.+$|', $file) && preg_match('|\.css$|', $file) ) 
+				if ( !preg_match('|^\.+$|', $file) && preg_match('|\.css$|', $file) )
 					$stylesheet_files[] = "$theme_loc/$stylesheet/$file";
 			}
 		}
 
-		$template_files = array();		
+		$template_files = array();
 		$template_dir = @ dir("$theme_root/$template");
-		if ($template_dir) {
+		if ( $template_dir ) {
 			while(($file = $template_dir->read()) !== false) {
-				if ( !preg_match('|^\.+$|', $file) && preg_match('|\.php$|', $file) ) 
+				if ( !preg_match('|^\.+$|', $file) && preg_match('|\.php$|', $file) )
 					$template_files[] = "$theme_loc/$template/$file";
 			}
 		}
@@ -1560,8 +1870,10 @@
 		$template_dir = dirname($template_files[0]);
 		$stylesheet_dir = dirname($stylesheet_files[0]);
 
-		if (empty($template_dir)) $template_dir = '/';
-		if (empty($stylesheet_dir)) $stylesheet_dir = '/';
+		if ( empty($template_dir) )
+			$template_dir = '/';
+		if ( empty($stylesheet_dir) )
+			$stylesheet_dir = '/';
 
 		// Check for theme name collision.  This occurs if a theme is copied to
 		// a new theme directory and the theme header is not updated.  Whichever
@@ -1580,8 +1892,8 @@
 				$name = "$name/$stylesheet";
 			}
 		}
-		
-		$themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template, 'Stylesheet' => $stylesheet, 'Template Files' => $template_files, 'Stylesheet Files' => $stylesheet_files, 'Template Dir' => $template_dir, 'Stylesheet Dir' => $stylesheet_dir, 'Status' => $theme_data['Status']);
+
+		$themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template, 'Stylesheet' => $stylesheet, 'Template Files' => $template_files, 'Stylesheet Files' => $stylesheet_files, 'Template Dir' => $template_dir, 'Stylesheet Dir' => $stylesheet_dir, 'Status' => $theme_data['Status'], 'Screenshot' => $screenshot);
 	}
 
 	// Resolve theme dependencies.
@@ -1589,9 +1901,9 @@
 
 	foreach ($theme_names as $theme_name) {
 		$themes[$theme_name]['Parent Theme'] = '';
-		if ($themes[$theme_name]['Stylesheet'] != $themes[$theme_name]['Template']) {
+		if ( $themes[$theme_name]['Stylesheet'] != $themes[$theme_name]['Template'] ) {
 			foreach ($theme_names as $parent_theme_name) {
-				if (($themes[$parent_theme_name]['Stylesheet'] == $themes[$parent_theme_name]['Template']) && ($themes[$parent_theme_name]['Template'] == $themes[$theme_name]['Template'])) {
+				if ( ($themes[$parent_theme_name]['Stylesheet'] == $themes[$parent_theme_name]['Template']) && ($themes[$parent_theme_name]['Template'] == $themes[$theme_name]['Template']) ) {
 					$themes[$theme_name]['Parent Theme'] = $themes[$parent_theme_name]['Name'];
 					break;
 				}
@@ -1607,9 +1919,8 @@
 function get_theme($theme) {
 	$themes = get_themes();
 
-	if (array_key_exists($theme, $themes)) {
+	if ( array_key_exists($theme, $themes) )
 		return $themes[$theme];
-	}
 
 	return NULL;
 }
@@ -1621,10 +1932,10 @@
 	$current_stylesheet = get_settings('stylesheet');
 	$current_theme = 'WordPress Default';
 
-	if ($themes) {
+	if ( $themes ) {
 		foreach ($theme_names as $theme_name) {
-			if ($themes[$theme_name]['Stylesheet'] == $current_stylesheet &&
-					$themes[$theme_name]['Template'] == $current_template) {
+			if ( $themes[$theme_name]['Stylesheet'] == $current_stylesheet &&
+					$themes[$theme_name]['Template'] == $current_template ) {
 				$current_theme = $themes[$theme_name]['Name'];
 				break;
 			}
@@ -1682,7 +1993,7 @@
 function get_page_template() {
 	global $wp_query;
 
-	$id = $wp_query->post->ID;	
+	$id = $wp_query->post->ID;
 	$template = get_post_meta($id, '_wp_page_template', true);
 
 	if ( 'default' == $template )
@@ -1690,8 +2001,8 @@
 
 	if ( ! empty($template) && file_exists(TEMPLATEPATH . "/$template") )
 		$template = TEMPLATEPATH . "/$template";
-	else if ( file_exists(TEMPLATEPATH .  "/page.php") )
-		$template = TEMPLATEPATH .  "/page.php";
+	else if ( file_exists(TEMPLATEPATH . "/page.php") )
+		$template = TEMPLATEPATH . "/page.php";
 	else
 		$template = '';
 
@@ -1710,6 +2021,19 @@
 	return get_query_template('single');
 }
 
+function get_attachment_template() {
+	global $posts;
+	$type = explode('/', $posts[0]->post_mime_type);
+	if ( $template = get_query_template($type[0]) )
+		return $template;
+	elseif ( $template = get_query_template($type[1]) )
+		return $template;
+	elseif ( $template = get_query_template("$type[0]_$type[1]") )
+		return $template;
+	else
+		return get_query_template('attachment');
+}
+
 function get_comments_popup_template() {
 	if ( file_exists( TEMPLATEPATH . '/comments-popup.php') )
 		$template = TEMPLATEPATH . '/comments-popup.php';
@@ -1731,9 +2055,8 @@
 function is_plugin_page() {
 	global $plugin_page;
 
-	if (isset($plugin_page)) {
+	if ( isset($plugin_page) )
 		return true;
-	}
 
 	return false;
 }
@@ -1750,29 +2073,35 @@
 */
 function add_query_arg() {
 	$ret = '';
-	if(is_array(func_get_arg(0))) {
-		$uri = @func_get_arg(1);
-	}
-	else {
-		if (@func_num_args() < 3) {
+	if ( is_array(func_get_arg(0)) ) {
+		if ( @func_num_args() < 2 )
 			$uri = $_SERVER['REQUEST_URI'];
-		} else {
+		else
+			$uri = @func_get_arg(1);
+	} else {
+		if ( @func_num_args() < 3 )
+			$uri = $_SERVER['REQUEST_URI'];
+		else
 			$uri = @func_get_arg(2);
-		}
 	}
 
-	if (strstr($uri, '?')) {
+	if ( preg_match('|^https?://|i', $uri, $matches) ) {
+		$protocol = $matches[0];
+		$uri = substr($uri, strlen($protocol));
+	} else {
+		$protocol = '';
+	}
+
+	if ( strstr($uri, '?') ) {
 		$parts = explode('?', $uri, 2);
-		if (1 == count($parts)) {
+		if ( 1 == count($parts) ) {
 			$base = '?';
 			$query = $parts[0];
-		}
-		else {
+		} else {
 			$base = $parts[0] . '?';
 			$query = $parts[1];
 		}
-	}
-	else if (strstr($uri, '/')) {
+	} else if ( !empty($protocol) || strstr($uri, '/') ) {
 		$base = $uri . '?';
 		$query = '';
 	} else {
@@ -1781,29 +2110,26 @@
 	}
 
 	parse_str($query, $qs);
-	if (is_array(func_get_arg(0))) {
+	if ( is_array(func_get_arg(0)) ) {
 		$kayvees = func_get_arg(0);
 		$qs = array_merge($qs, $kayvees);
+	} else {
+		$qs[func_get_arg(0)] = func_get_arg(1);
 	}
-	else
-    {
-			$qs[func_get_arg(0)] = func_get_arg(1);
-    }
-
-	foreach($qs as $k => $v)
-    {
-			if($v != '')
-        {
-					if($ret != '') $ret .= '&';
-					$ret .= "$k=$v";
-        }
-    }
-	$ret = $base . $ret;   
+
+	foreach($qs as $k => $v) {
+		if ( $v != '' ) {
+			if ( $ret != '' )
+				$ret .= '&';
+			$ret .= "$k=$v";
+		}
+	}
+	$ret = $protocol . $base . $ret;
 	return trim($ret, '?');
 }
 
 function remove_query_arg($key, $query) {
-	add_query_arg($key, '', $query);
+	return add_query_arg($key, '', $query);
 }
 
 function load_template($file) {
@@ -1816,11 +2142,13 @@
 }
 
 function add_magic_quotes($array) {
+	global $wpdb;
+
 	foreach ($array as $k => $v) {
-		if (is_array($v)) {
+		if ( is_array($v) ) {
 			$array[$k] = add_magic_quotes($v);
 		} else {
-			$array[$k] = addslashes($v);
+			$array[$k] = $wpdb->escape($v);
 		}
 	}
 	return $array;
@@ -1835,7 +2163,7 @@
 		while( $remote_read = fread($fp, 4096) )
 			$linea .= $remote_read;
 		fclose($fp);
-		return $linea;		
+		return $linea;
 	} else if ( function_exists('curl_init') ) {
 		$handle = curl_init();
 		curl_setopt ($handle, CURLOPT_URL, $uri);
@@ -1846,7 +2174,333 @@
 		return $buffer;
 	} else {
 		return false;
-	}	
+	}
+}
+
+function wp($query_vars = '') {
+	global $wp;
+	
+	$wp->main($query_vars);
+}
+
+function status_header( $header ) {
+	if ( 200 == $header )
+		$text = 'OK';
+	elseif ( 301 == $header )
+		$text = 'Moved Permanently';
+	elseif ( 302 == $header )
+		$text = 'Moved Temporarily';
+	elseif ( 304 == $header )
+		$text = 'Not Modified';
+	elseif ( 404 == $header )
+		$text = 'Not Found';
+	elseif ( 410 == $header )
+		$text = 'Gone';
+
+	@header("HTTP/1.1 $header $text");
+	@header("Status: $header $text");
+}
+
+function nocache_headers() {
+	@ header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
+	@ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
+	@ header('Cache-Control: no-cache, must-revalidate, max-age=0');
+	@ header('Pragma: no-cache');
+}
+
+function get_usermeta( $user_id, $meta_key = '') {
+	global $wpdb;
+	$user_id = (int) $user_id;
+
+	if ( !empty($meta_key) ) {
+		$meta_key = preg_replace('|a-z0-9_|i', '', $meta_key);
+		$metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = '$user_id' AND meta_key = '$meta_key'");
+	} else {
+		$metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = '$user_id'");
+	}
+
+	if ( empty($metas) ) {
+		if ( empty($meta_key) )
+			return array();
+		else
+			return '';
+	}
+
+	foreach ($metas as $index => $meta) {
+		@ $value = unserialize($meta->meta_value);
+		if ( $value === FALSE )
+			$value = $meta->meta_value;
+
+		$values[] = $value;
+	}
+
+	if ( count($values) == 1 )
+		return $values[0];
+	else
+		return $values;
+}
+
+function update_usermeta( $user_id, $meta_key, $meta_value ) {
+	global $wpdb;
+	if ( !is_numeric( $user_id ) )
+		return false;
+	$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
+
+	if ( is_array($meta_value) || is_object($meta_value) )
+		$meta_value = serialize($meta_value);
+	$meta_value = trim( $meta_value );
+	
+	if (empty($meta_value)) {
+		delete_usermeta($user_id, $meta_key);
+	}
+
+	$cur = $wpdb->get_row("SELECT * FROM $wpdb->usermeta WHERE user_id = '$user_id' AND meta_key = '$meta_key'");
+	if ( !$cur ) {
+		$wpdb->query("INSERT INTO $wpdb->usermeta ( user_id, meta_key, meta_value )
+		VALUES
+		( '$user_id', '$meta_key', '$meta_value' )");
+	} else if ( $cur->meta_value != $meta_value ) {
+		$wpdb->query("UPDATE $wpdb->usermeta SET meta_value = '$meta_value' WHERE user_id = '$user_id' AND meta_key = '$meta_key'");
+	} else {
+		return false;	
+	}
+	
+	$user = get_userdata($user_id);
+	wp_cache_delete($user_id, 'users');
+	wp_cache_delete($user->user_login, 'userlogins');
+	
+	return true;
+}
+
+function delete_usermeta( $user_id, $meta_key, $meta_value = '' ) {
+	global $wpdb;
+	if ( !is_numeric( $user_id ) )
+		return false;
+	$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
+
+	if ( is_array($meta_value) || is_object($meta_value) )
+		$meta_value = serialize($meta_value);
+	$meta_value = trim( $meta_value );
+
+	if ( ! empty($meta_value) )
+		$wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$user_id' AND meta_key = '$meta_key' AND meta_value = '$meta_value'");
+	else
+		$wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$user_id' AND meta_key = '$meta_key'");
+		
+	$user = get_userdata($user_id);
+	wp_cache_delete($user_id, 'users');
+	wp_cache_delete($user->user_login, 'userlogins');
+	
+	return true;
+}
+
+function register_activation_hook($file, $function) {
+	$file = plugin_basename($file);
+
+	add_action('activate_' . $file, $function);
+}
+
+function register_deactivation_hook($file, $function) {
+	$file = plugin_basename($file);
+
+	add_action('deactivate_' . $file, $function);
+}
+
+function plugin_basename($file) {
+	$file = preg_replace('|\\\\+|', '\\\\', $file);
+	$file = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', $file);
+	return $file;
+}
+
+function get_num_queries() {
+	global $wpdb;
+	return $wpdb->num_queries;
+}
+
+function wp_nonce_url($actionurl, $action = -1) {
+	return wp_specialchars(add_query_arg('_wpnonce', wp_create_nonce($action), $actionurl));
+}
+
+function wp_nonce_field($action = -1) {
+	echo '<input type="hidden" name="_wpnonce" value="' . wp_create_nonce($action) . '" />';
+	wp_referer_field();
+}
+
+function wp_referer_field() {
+	$ref = wp_specialchars($_SERVER['REQUEST_URI']);
+	echo '<input type="hidden" name="_wp_http_referer" value="'. $ref . '" />';
+	if ( wp_get_original_referer() ) {
+		$original_ref = wp_specialchars(stripslashes(wp_get_original_referer()));
+		echo '<input type="hidden" name="_wp_original_http_referer" value="'. $original_ref . '" />';
+	}
+}
+
+function wp_original_referer_field() {
+	echo '<input type="hidden" name="_wp_original_http_referer" value="' . wp_specialchars(stripslashes($_SERVER['REQUEST_URI'])) . '" />';
+}
+
+function wp_get_referer() {
+	foreach ( array($_REQUEST['_wp_http_referer'], $_SERVER['HTTP_REFERER']) as $ref )
+		if ( !empty($ref) )
+			return $ref;
+	return false;
+}
+
+function wp_get_original_referer() {
+	if ( !empty($_REQUEST['_wp_original_http_referer']) )
+		return $_REQUEST['_wp_original_http_referer'];
+	return false;
+}
+
+function wp_explain_nonce($action) {
+	if ( $action !== -1 && preg_match('/([a-z]+)-([a-z]+)(_(.+))?/', $action, $matches) ) {
+		$verb = $matches[1];
+		$noun = $matches[2];
+
+		$trans = array();
+		$trans['update']['attachment'] = array(__('Are you sure you want to edit this attachment: &quot;%s&quot;?'), 'get_the_title');
+
+		$trans['add']['category'] = array(__('Are you sure you want to add this category?'), false);
+		$trans['delete']['category'] = array(__('Are you sure you want to delete this category: &quot;%s&quot;?'), 'get_catname');
+		$trans['update']['category'] = array(__('Are you sure you want to edit this category: &quot;%s&quot;?'), 'get_catname');
+
+		$trans['delete']['comment'] = array(__('Are you sure you want to delete this comment: &quot;%s&quot;?'), 'use_id');
+		$trans['unapprove']['comment'] = array(__('Are you sure you want to unapprove this comment: &quot;%s&quot;?'), 'use_id');
+		$trans['approve']['comment'] = array(__('Are you sure you want to approve this comment: &quot;%s&quot;?'), 'use_id');
+		$trans['update']['comment'] = array(__('Are you sure you want to edit this comment: &quot;%s&quot;?'), 'use_id');
+		$trans['bulk']['comments'] = array(__('Are you sure you want to bulk modify comments?'), false);
+		$trans['moderate']['comments'] = array(__('Are you sure you want to moderate comments?'), false);
+
+		$trans['add']['bookmark'] = array(__('Are you sure you want to add this bookmark?'), false);
+		$trans['delete']['bookmark'] = array(__('Are you sure you want to delete this bookmark: &quot;%s&quot;?'), 'use_id');
+		$trans['update']['bookmark'] = array(__('Are you sure you want to edit this bookmark: &quot;%s&quot;?'), 'use_id');
+		$trans['bulk']['bookmarks'] = array(__('Are you sure you want to bulk modify bookmarks?'), false);
+
+		$trans['add']['page'] = array(__('Are you sure you want to add this page?'), false);
+		$trans['delete']['page'] = array(__('Are you sure you want to delete this page: &quot;%s&quot;?'), 'get_the_title');
+		$trans['update']['page'] = array(__('Are you sure you want to edit this page: &quot;%s&quot;?'), 'get_the_title');
+
+		$trans['edit']['plugin'] = array(__('Are you sure you want to edit this plugin file: &quot;%s&quot;?'), 'use_id');
+		$trans['activate']['plugin'] = array(__('Are you sure you want to activate this plugin: &quot;%s&quot;?'), 'use_id');
+		$trans['deactivate']['plugin'] = array(__('Are you sure you want to deactivate this plugin: &quot;%s&quot;?'), 'use_id');
+
+		$trans['add']['post'] = array(__('Are you sure you want to add this post?'), false);
+		$trans['delete']['post'] = array(__('Are you sure you want to delete this post: &quot;%s&quot;?'), 'get_the_title');
+		$trans['update']['post'] = array(__('Are you sure you want to edit this post: &quot;%s&quot;?'), 'get_the_title');
+
+		$trans['add']['user'] = array(__('Are you sure you want to add this user?'), false);
+		$trans['delete']['users'] = array(__('Are you sure you want to delete users?'), false);
+		$trans['bulk']['users'] = array(__('Are you sure you want to bulk modify users?'), false);
+		$trans['update']['user'] = array(__('Are you sure you want to edit this user: &quot;%s&quot;?'), 'get_author_name');
+		$trans['update']['profile'] = array(__('Are you sure you want to modify the profile for: &quot;%s&quot;?'), 'get_author_name');
+
+		$trans['update']['options'] = array(__('Are you sure you want to edit your settings?'), false);
+		$trans['update']['permalink'] = array(__('Are you sure you want to change your permalink structure to: %s?'), 'use_id');
+		$trans['edit']['file'] = array(__('Are you sure you want to edit this file: &quot;%s&quot;?'), 'use_id');
+		$trans['edit']['theme'] = array(__('Are you sure you want to edit this theme file: &quot;%s&quot;?'), 'use_id');
+		$trans['switch']['theme'] = array(__('Are you sure you want to switch to this theme: &quot;%s&quot;?'), 'use_id');
+
+		if ( isset($trans[$verb][$noun]) ) {
+			if ( !empty($trans[$verb][$noun][1]) ) {
+				$lookup = $trans[$verb][$noun][1];
+				$object = $matches[4];
+				if ( 'use_id' != $lookup )
+					$object = call_user_func($lookup, $object);
+				return sprintf($trans[$verb][$noun][0], $object);
+			} else {
+				return $trans[$verb][$noun][0];
+			}
+		}
+	}
+
+	return __('Are you sure you want to do this');
+}
+
+function wp_nonce_ays($action) {
+	global $pagenow, $menu, $submenu, $parent_file, $submenu_file;
+
+	$adminurl = get_settings('siteurl') . '/wp-admin';
+	if ( wp_get_referer() )
+		$adminurl = wp_get_referer();
+
+	$title = __('WordPress Confirmation');
+	// Remove extra layer of slashes.
+	$_POST   = stripslashes_deep($_POST  );
+	if ( $_POST ) {
+		$q = http_build_query($_POST);
+		$q = explode( ini_get('arg_separator.output'), $q);
+		$html .= "\t<form method='post' action='$pagenow'>\n";
+		foreach ( (array) $q as $a ) {
+			$v = substr(strstr($a, '='), 1);
+			$k = substr($a, 0, -(strlen($v)+1));
+			$html .= "\t\t<input type='hidden' name='" . wp_specialchars( urldecode($k), 1 ) . "' value='" . wp_specialchars( urldecode($v), 1 ) . "' />\n";
+		}
+		$html .= "\t\t<input type='hidden' name='_wpnonce' value='" . wp_create_nonce($action) . "' />\n";
+		$html .= "\t\t<div id='message' class='confirm fade'>\n\t\t<p>" . wp_explain_nonce($action) . "</p>\n\t\t<p><a href='$adminurl'>" . __('No') . "</a> <input type='submit' value='" . __('Yes') . "' /></p>\n\t\t</div>\n\t</form>\n";
+	} else {
+		$html .= "\t<div id='message' class='confirm fade'>\n\t<p>" . wp_explain_nonce($action) . "</p>\n\t<p><a href='$adminurl'>" . __('No') . "</a> <a href='" . add_query_arg( '_wpnonce', wp_create_nonce($action), $_SERVER['REQUEST_URI'] ) . "'>" . __('Yes') . "</a></p>\n\t</div>\n";
+	}
+	$html .= "</body>\n</html>";
+	wp_die($html, $title);
+}
+
+function wp_die($message, $title = '') {
+	header('Content-Type: text/html; charset=utf-8');
+
+	if ( empty($title) )
+		$title = __('WordPress &rsaquo; Error');
+?>
+<!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>
+	<title><?php echo $title ?></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<style media="screen" type="text/css">
+	<!--
+	html {
+		background: #eee;
+	}
+	body {
+		background: #fff;
+		color: #000;
+		font-family: Georgia, "Times New Roman", Times, serif;
+		margin-left: 25%;
+		margin-right: 25%;
+		padding: .2em 2em;
+	}
+
+	h1 {
+		color: #006;
+		font-size: 18px;
+		font-weight: lighter;
+	}
+
+	h2 {
+		font-size: 16px;
+	}
+
+	p, li, dt {
+		line-height: 140%;
+		padding-bottom: 2px;
+	}
+
+	ul, ol {
+		padding: 5px 5px 5px 20px;
+	}
+	#logo {
+		margin-bottom: 2em;
+	}
+	-->
+	</style>
+</head>
+<body>
+	<h1 id="logo"><img alt="WordPress" src="<?php echo get_settings('siteurl'); ?>/wp-admin/images/wordpress-logo.png" /></h1>
+	<p><?php echo $message; ?></p>
+</body>
+</html>
+<?php
+
+	die();
 }
 
 ?>
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/functions-post.php 2.0.4/wp-includes/functions-post.php
--- 1.5.2/wp-includes/functions-post.php	2005-07-02 20:03:13.000000000 -0500
+++ 2.0.4/wp-includes/functions-post.php	2006-07-04 16:40:41.000000000 -0500
@@ -6,83 +6,397 @@
  * generic function for inserting data into the posts table.
  */
 function wp_insert_post($postarr = array()) {
-	global $wpdb, $allowedtags;
-	
+	global $wpdb, $wp_rewrite, $allowedtags, $user_ID;
+
+	if ( is_object($postarr) )
+		$postarr = get_object_vars($postarr);
+
 	// export array as variables
 	extract($postarr);
-	
-	$post_name = sanitize_title($post_title);
-	$post_author = (int) $post_author;
 
+	// Are we updating or creating?
+	$update = false;
+	if ( !empty($ID) ) {
+		$update = true;
+		$post = & get_post($ID);
+		$previous_status = $post->post_status;
+	}
+
+	// Get the basics.
+	$post_content    = apply_filters('content_save_pre',   $post_content);
+	$post_excerpt    = apply_filters('excerpt_save_pre',   $post_excerpt);
+	$post_title      = apply_filters('title_save_pre',     $post_title);
+	$post_category   = apply_filters('category_save_pre',  $post_category);
+	$post_status     = apply_filters('status_save_pre',    $post_status);
+	$post_name       = apply_filters('name_save_pre',      $post_name);
+	$comment_status  = apply_filters('comment_status_pre', $comment_status);
+	$ping_status     = apply_filters('ping_status_pre',    $ping_status);
+	
 	// Make sure we set a valid category
 	if (0 == count($post_category) || !is_array($post_category)) {
 		$post_category = array(get_option('default_category'));
 	}
-
 	$post_cat = $post_category[0];
+
+	if ( empty($post_author) )
+		$post_author = $user_ID;
+
+	if ( empty($post_status) )
+		$post_status = 'draft';
 	
-	if (empty($post_date))
-		$post_date = current_time('mysql');
-	// Make sure we have a good gmt date:
-	if (empty($post_date_gmt)) 
-		$post_date_gmt = get_gmt_from_date($post_date);
-	if (empty($comment_status))
-		$comment_status = get_settings('default_comment_status');
-	if (empty($ping_status))
+	// Get the post ID.
+	if ( $update )
+		$post_ID = $ID;
+
+	// Create a valid post name.  Drafts are allowed to have an empty
+	// post name.
+	if ( empty($post_name) ) {
+		if ( 'draft' != $post_status )
+			$post_name = sanitize_title($post_title);
+	} else {
+		$post_name = sanitize_title($post_name);
+	}
+	
+
+	// If the post date is empty (due to having been new or a draft) and status is not 'draft', set date to now
+	if (empty($post_date)) {
+		if ( 'draft' != $post_status )
+			$post_date = current_time('mysql');
+	}
+
+	if (empty($post_date_gmt)) {
+		if ( 'draft' != $post_status )
+			$post_date_gmt = get_gmt_from_date($post_date);
+	}
+
+	if ( empty($comment_status) ) {
+		if ( $update )
+			$comment_status = 'closed';
+		else
+			$comment_status = get_settings('default_comment_status');
+	}
+	if ( empty($ping_status) )
 		$ping_status = get_settings('default_ping_status');
-	if ( empty($post_parent) )
+	if ( empty($post_pingback) )
+		$post_pingback = get_option('default_pingback_flag');
+
+	if ( isset($to_ping) )
+		$to_ping = preg_replace('|\s+|', "\n", $to_ping);
+	else
+		$to_ping = '';
+
+	if ( ! isset($pinged) )
+		$pinged = '';
+
+	if ( isset($post_parent) )
+		$post_parent = (int) $post_parent;
+	else
 		$post_parent = 0;
 
-	if ('publish' == $post_status) {
-		$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1");
+	if ( isset($menu_order) )
+		$menu_order = (int) $menu_order;
+	else
+		$menu_order = 0;
+
+	if ( !isset($post_password) )
+		$post_password = '';
+
+	if ( ('publish' == $post_status) || ('static' == $post_status) ) {
+		$post_name_check = ('publish' == $post_status)
+			? $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1")
+			: $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_status = 'static' AND ID != '$post_ID' AND post_parent = '$post_parent' LIMIT 1");
+
 		if ($post_name_check) {
 			$suffix = 2;
 			while ($post_name_check) {
 				$alt_post_name = $post_name . "-$suffix";
-				$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1");
+				$post_name_check = ('publish' == $post_status)
+					? $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_status = 'publish' AND ID != '$post_ID' LIMIT 1")
+					: $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_status = 'static' AND ID != '$post_ID' AND post_parent = '$post_parent' LIMIT 1");
 				$suffix++;
 			}
 			$post_name = $alt_post_name;
 		}
 	}
 
-	$sql = "INSERT INTO $wpdb->posts 
-		(post_author, post_date, post_date_gmt, post_modified, post_modified_gmt, post_content, post_title, post_excerpt, post_category, post_status, post_name, comment_status, ping_status, post_parent) 
-		VALUES ('$post_author', '$post_date', '$post_date_gmt', '$post_date', '$post_date_gmt', '$post_content', '$post_title', '$post_excerpt', '$post_cat', '$post_status', '$post_name', '$comment_status', '$ping_status', '$post_parent')";
-	
-	$result = $wpdb->query($sql);
-	$post_ID = $wpdb->insert_id;
+	if ($update) {
+		$wpdb->query(
+			"UPDATE IGNORE $wpdb->posts SET
+			post_author = '$post_author',
+			post_date = '$post_date',
+			post_date_gmt = '$post_date_gmt',
+			post_content = '$post_content',
+			post_content_filtered = '$post_content_filtered',
+			post_title = '$post_title',
+			post_excerpt = '$post_excerpt',
+			post_status = '$post_status',
+			comment_status = '$comment_status',
+			ping_status = '$ping_status',
+			post_password = '$post_password',
+			post_name = '$post_name',
+			to_ping = '$to_ping',
+			pinged = '$pinged',
+			post_modified = '".current_time('mysql')."',
+			post_modified_gmt = '".current_time('mysql',1)."',
+			post_parent = '$post_parent',
+			menu_order = '$menu_order'
+			WHERE ID = $post_ID");
+	} else {
+		$wpdb->query(
+			"INSERT IGNORE INTO $wpdb->posts
+			(post_author, post_date, post_date_gmt, post_content, post_content_filtered, post_title, post_excerpt,  post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_parent, menu_order, post_mime_type)
+			VALUES
+			('$post_author', '$post_date', '$post_date_gmt', '$post_content', '$post_content_filtered', '$post_title', '$post_excerpt', '$post_status', '$comment_status', '$ping_status', '$post_password', '$post_name', '$to_ping', '$pinged', '$post_date', '$post_date_gmt', '$post_parent', '$menu_order', '$post_mime_type')");
+			$post_ID = $wpdb->insert_id;			
+	}
+
+	if ( empty($post_name) && 'draft' != $post_status ) {
+		$post_name = sanitize_title($post_title, $post_ID);
+		$wpdb->query( "UPDATE $wpdb->posts SET post_name = '$post_name' WHERE ID = '$post_ID'" );
+	}
+
+	wp_set_post_cats('', $post_ID, $post_category);
+
+	if ( 'static' == $post_status ) {
+		clean_page_cache($post_ID);
+		wp_cache_delete($post_ID, 'pages');
+	} else {
+		clean_post_cache($post_ID);
+	}
 
 	// Set GUID
-	$wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
+	if ( ! $update )
+		$wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
+
+	if ( $update) {
+		if ($previous_status != 'publish' && $post_status == 'publish') {
+			// Reset GUID if transitioning to publish.
+			$wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
+			do_action('private_to_published', $post_ID);
+		}
+		
+		do_action('edit_post', $post_ID);
+	}
+
+	if ($post_status == 'publish') {
+		do_action('publish_post', $post_ID);
+
+		if ( !defined('WP_IMPORTING') ) {
+			if ( $post_pingback )
+				$result = $wpdb->query("
+					INSERT INTO $wpdb->postmeta 
+					(post_id,meta_key,meta_value) 
+					VALUES ('$post_ID','_pingme','1')
+				");
+			$result = $wpdb->query("
+				INSERT INTO $wpdb->postmeta 
+				(post_id,meta_key,meta_value) 
+				VALUES ('$post_ID','_encloseme','1')
+			");
+			spawn_pinger();
+		}
+	} else if ($post_status == 'static') {
+		wp_cache_delete('all_page_ids', 'pages');
+		$wp_rewrite->flush_rules();
+
+		if ( !empty($page_template) )
+			if ( ! update_post_meta($post_ID, '_wp_page_template',  $page_template))
+				add_post_meta($post_ID, '_wp_page_template',  $page_template, true);
+	}
+
+	do_action('save_post', $post_ID);
+	do_action('wp_insert_post', $post_ID);
+
+	return $post_ID;
+}
+
+function wp_insert_attachment($object, $file = false, $post_parent = 0) {
+	global $wpdb, $user_ID;
+
+	if ( is_object($object) )
+		$object = get_object_vars($object);
+
+	// Export array as variables
+	extract($object);
+
+	// Get the basics.
+	$post_content    = apply_filters('content_save_pre',   $post_content);
+	$post_excerpt    = apply_filters('excerpt_save_pre',   $post_excerpt);
+	$post_title      = apply_filters('title_save_pre',     $post_title);
+	$post_category   = apply_filters('category_save_pre',  $post_category);
+	$post_name       = apply_filters('name_save_pre',      $post_name);
+	$comment_status  = apply_filters('comment_status_pre', $comment_status);
+	$ping_status     = apply_filters('ping_status_pre',    $ping_status);
+	$post_mime_type  = apply_filters('post_mime_type_pre', $post_mime_type);
+
+	// Make sure we set a valid category
+	if (0 == count($post_category) || !is_array($post_category)) {
+		$post_category = array(get_option('default_category'));
+	}
+	$post_cat = $post_category[0];
+
+	if ( empty($post_author) )
+		$post_author = $user_ID;
+
+	$post_status = 'attachment';
+
+	// Are we updating or creating?
+	$update = false;
+	if ( !empty($ID) ) {
+		$update = true;
+		$post_ID = $ID;	
+	}
+
+	// Create a valid post name.
+	if ( empty($post_name) )
+		$post_name = sanitize_title($post_title);
+	else
+		$post_name = sanitize_title($post_name);
 	
+	if (empty($post_date))
+		$post_date = current_time('mysql');
+	if (empty($post_date_gmt)) 
+		$post_date_gmt = current_time('mysql', 1);
+
+	if ( empty($comment_status) ) {
+		if ( $update )
+			$comment_status = 'closed';
+		else
+			$comment_status = get_settings('default_comment_status');
+	}
+	if ( empty($ping_status) )
+		$ping_status = get_settings('default_ping_status');
+	if ( empty($post_pingback) )
+		$post_pingback = get_option('default_pingback_flag');
+
+	if ( isset($to_ping) )
+		$to_ping = preg_replace('|\s+|', "\n", $to_ping);
+	else
+		$to_ping = '';
+
+	if ( isset($post_parent) )
+		$post_parent = (int) $post_parent;
+	else
+		$post_parent = 0;
+
+	if ( isset($menu_order) )
+		$menu_order = (int) $menu_order;
+	else
+		$menu_order = 0;
+
+	if ( !isset($post_password) )
+		$post_password = '';
+
+	if ( isset($to_ping) )
+		$to_ping = preg_replace('|\s+|', "\n", $to_ping);
+	else
+		$to_ping = '';
+
+	if ( ! isset($pinged) )
+		$pinged = '';
+
+	if ($update) {
+		$wpdb->query(
+			"UPDATE $wpdb->posts SET
+			post_author = '$post_author',
+			post_date = '$post_date',
+			post_date_gmt = '$post_date_gmt',
+			post_content = '$post_content',
+			post_title = '$post_title',
+			post_excerpt = '$post_excerpt',
+			post_status = '$post_status',
+			comment_status = '$comment_status',
+			ping_status = '$ping_status',
+			post_password = '$post_password',
+			post_name = '$post_name',
+			to_ping = '$to_ping',
+			pinged = '$pinged',
+			post_modified = '".current_time('mysql')."',
+			post_modified_gmt = '".current_time('mysql',1)."',
+			post_parent = '$post_parent',
+			menu_order = '$menu_order',
+			post_mime_type = '$post_mime_type',
+			guid = '$guid'
+			WHERE ID = $post_ID");
+	} else {
+		$wpdb->query(
+			"INSERT INTO $wpdb->posts
+			(post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt,  post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_parent, menu_order, post_mime_type, guid)
+			VALUES
+			('$post_author', '$post_date', '$post_date_gmt', '$post_content', '$post_title', '$post_excerpt', '$post_status', '$comment_status', '$ping_status', '$post_password', '$post_name', '$to_ping', '$pinged', '$post_date', '$post_date_gmt', '$post_parent', '$menu_order', '$post_mime_type', '$guid')");
+			$post_ID = $wpdb->insert_id;			
+	}
+	
+	if ( empty($post_name) ) {
+		$post_name = sanitize_title($post_title, $post_ID);
+		$wpdb->query( "UPDATE $wpdb->posts SET post_name = '$post_name' WHERE ID = '$post_ID'" );
+	}
+
 	wp_set_post_cats('', $post_ID, $post_category);
+
+	if ( $file )
+		add_post_meta($post_ID, '_wp_attached_file', $file);
+
+	clean_post_cache($post_ID);
+
+	if ( $update) {
+		do_action('edit_attachment', $post_ID);
+	} else {
+		do_action('add_attachment', $post_ID);
+	}
 	
-	if ($post_status == 'publish') {
-		do_action('publish_post', $post_ID);
+	return $post_ID;
+}
+
+function wp_delete_attachment($postid) {
+	global $wpdb;
+	$postid = (int) $postid;
+
+	if ( !$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID = '$postid'") )
+		return $post;
+
+	if ( 'attachment' != $post->post_status )
+		return false;
+
+	$meta = get_post_meta($postid, '_wp_attachment_metadata', true);
+	$file = get_post_meta($postid, '_wp_attached_file', true);
+
+	$wpdb->query("DELETE FROM $wpdb->posts WHERE ID = '$postid'");
+
+	$wpdb->query("DELETE FROM $wpdb->comments WHERE comment_post_ID = '$postid'");
+
+	$wpdb->query("DELETE FROM $wpdb->post2cat WHERE post_id = '$postid'");
+
+	$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '$postid'");
+
+	if ( ! empty($meta['thumb']) ) {
+		// Don't delete the thumb if another attachment uses it
+		if (! $foo = $wpdb->get_row("SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE '%".$wpdb->escape($meta['thumb'])."%' AND post_id <> '$postid'"))
+			@ unlink(str_replace(basename($file), $meta['thumb'], $file));
 	}
 
-	pingback($content, $post_ID);
+	if ( ! empty($file) )
+		@ unlink($file);
+
+	do_action('delete_attachment', $postid);
 
-	// Return insert_id if we got a good result, otherwise return zero.
-	return $result ? $post_ID : 0;
+	return $post;
 }
 
 function wp_get_single_post($postid = 0, $mode = OBJECT) {
 	global $wpdb;
 
-	$sql = "SELECT * FROM $wpdb->posts WHERE ID=$postid";
-	$result = $wpdb->get_row($sql, $mode);
+	$post = get_post($postid, $mode);
 	
 	// Set categories
 	if($mode == OBJECT) {
-		$result->post_category = wp_get_post_cats('',$postid);
+		$post->post_category = wp_get_post_cats('',$postid);
 	} 
 	else {
-		$result['post_category'] = wp_get_post_cats('',$postid);
+		$post['post_category'] = wp_get_post_cats('',$postid);
 	}
 
-	return $result;
+	return $post;
 }
 
 function wp_get_recent_posts($num = 10) {
@@ -102,54 +416,51 @@
 function wp_update_post($postarr = array()) {
 	global $wpdb;
 
-	// First get all of the original fields
-	$post = wp_get_single_post($postarr['ID'], ARRAY_A);
+	if ( is_object($postarr) )
+		$postarr = get_object_vars($postarr);
+
+	// First, get all of the original fields
+	$post = wp_get_single_post($postarr['ID'], ARRAY_A);	
 
 	// Escape data pulled from DB.
 	$post = add_magic_quotes($post);
-	extract($post);
-
-	// Now overwrite any changed values being passed in. These are 
-	// already escaped.
-	extract($postarr);
 
-	// If no categories were passed along, use the current cats.
-	if ( 0 == count($post_category) || !is_array($post_category) )
-		$post_category = $post['post_category'];
-
-	$post_modified = current_time('mysql');
-	$post_modified_gmt = current_time('mysql', 1);
-
-	$sql = "UPDATE $wpdb->posts 
-		SET post_content = '$post_content',
-		post_title = '$post_title',
-		post_category = $post_category[0],
-		post_status = '$post_status',
-		post_date = '$post_date',
-		post_date_gmt = '$post_date_gmt',
-		post_modified = '$post_modified',
-		post_modified_gmt = '$post_modified_gmt',
-		post_excerpt = '$post_excerpt',
-		ping_status = '$ping_status',
-		comment_status = '$comment_status'
-		WHERE ID = $ID";
-		
-	$result = $wpdb->query($sql);
-	$rows_affected = $wpdb->rows_affected;
+	// Passed post category list overwrites existing category list if not empty.
+ 	if ( isset($postarr['post_category']) && is_array($postarr['post_category'])
+			 && 0 != count($postarr['post_category']) )
+ 		$post_cats = $postarr['post_category'];
+ 	else 
+ 		$post_cats = $post['post_category'];
+
+	// Drafts shouldn't be assigned a date unless explicitly done so by the user
+	if ( 'draft' == $post['post_status'] && empty($postarr['edit_date']) && empty($postarr['post_date']) && 
+	     ('0000-00-00 00:00:00' == $post['post_date']) )
+		$clear_date = true;
+	else
+		$clear_date = false;
 
-	wp_set_post_cats('', $ID, $post_category);
+ 	// Merge old and new fields with new fields overwriting old ones.
+ 	$postarr = array_merge($post, $postarr);
+ 	$postarr['post_category'] = $post_cats;	
+	if ( $clear_date ) {
+		$postarr['post_date'] = '';
+		$postarr['post_date_gmt'] = '';
+	}
 
-	do_action('edit_post', $ID);
+	if ($postarr['post_status'] == 'attachment')
+		return wp_insert_attachment($postarr);
 
-	return $rows_affected;
+	return wp_insert_post($postarr);
 }
 
 function wp_get_post_cats($blogid = '1', $post_ID = 0) {
 	global $wpdb;
 	
+	$post_ID = (int) $post_ID;
+
 	$sql = "SELECT category_id 
 		FROM $wpdb->post2cat 
-		WHERE post_id = $post_ID 
+		WHERE post_id = '$post_ID' 
 		ORDER BY category_id";
 
 	$result = $wpdb->get_col($sql);
@@ -165,7 +476,7 @@
 	// If $post_categories isn't already an array, make it one:
 	if (!is_array($post_categories) || 0 == count($post_categories))
 		$post_categories = array(get_option('default_category'));
-
+	
 	$post_categories = array_unique($post_categories);
 
 	// First the old categories
@@ -180,10 +491,6 @@
 		$old_categories = array_unique($old_categories);
 	}
 
-
-	$oldies = printr($old_categories,1);
-	$newbies = printr($post_categories,1);
-
 	// Delete any?
 	$delete_cats = array_diff($old_categories,$post_categories);
 
@@ -207,15 +514,38 @@
 				VALUES ($post_ID, $new_cat)");
 		}
 	}
+	
+	// Update category counts.
+	$all_affected_cats = array_unique(array_merge($post_categories, $old_categories));
+	foreach ( $all_affected_cats as $cat_id ) {
+		$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->post2cat, $wpdb->posts WHERE $wpdb->posts.ID=$wpdb->post2cat.post_id AND post_status='publish' AND category_id = '$cat_id'");
+		$wpdb->query("UPDATE $wpdb->categories SET category_count = '$count' WHERE cat_ID = '$cat_id'");
+		wp_cache_delete($cat_id, 'category');		
+	}
 }	// wp_set_post_cats()
 
 function wp_delete_post($postid = 0) {
-	global $wpdb;
+	global $wpdb, $wp_rewrite;
 	$postid = (int) $postid;
 
 	if ( !$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID = $postid") )
 		return $post;
 
+	if ( 'attachment' == $post->post_status )
+		return wp_delete_attachment($postid);
+
+	do_action('delete_post', $postid);
+
+	if ( 'publish' == $post->post_status) {
+		$categories = wp_get_post_cats('', $post->ID);
+		if( is_array( $categories ) ) {
+			foreach ( $categories as $cat_id ) {
+				$wpdb->query("UPDATE $wpdb->categories SET category_count = category_count - 1 WHERE cat_ID = '$cat_id'");
+				wp_cache_delete($cat_id, 'category');
+			}
+		}
+	}
+
 	if ( 'static' == $post->post_status )
 		$wpdb->query("UPDATE $wpdb->posts SET post_parent = $post->post_parent WHERE post_parent = $postid AND post_status = 'static'");
 
@@ -226,7 +556,12 @@
 	$wpdb->query("DELETE FROM $wpdb->post2cat WHERE post_id = $postid");
 
 	$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = $postid");
-	
+
+	if ( 'static' == $post->post_status ) {
+		wp_cache_delete('all_page_ids', 'pages');
+		$wp_rewrite->flush_rules();
+	}
+
 	return $post;
 }
 
@@ -262,31 +597,7 @@
 function get_author_name( $auth_id ) {
 	$authordata = get_userdata( $auth_id );
 
-	switch( $authordata['user_idmode'] ) {
-		case 'nickname':
-			$authorname = $authordata['user_nickname'];
-			break;
-		case 'login':
-			$authorname = $authordata['user_login'];
-			break;
-		case 'firstname':
-			$authorname = $authordata['user_firstname'];
-			break;
-		case 'lastname':
-			$authorname = $authordata['user_lastname'];
-			break;
-		case 'namefl':
-			$authorname = $authordata['user_firstname'].' '.$authordata['user_lastname'];
-			break;
-		case 'namelf':
-			$authorname = $authordata['user_lastname'].' '.$authordata['user_firstname'];
-			break;
-		default:
-			$authorname = $authordata['user_nickname'];
-			break;
-	}
-
-	return $authorname;
+	return $authordata->display_name;
 }
 
 // get extended entry info (<!--more-->)
@@ -326,77 +637,6 @@
     }
 }
 
-
-// query user capabilities
-// rather simplistic. shall evolve with future permission system overhaul
-// $blog_id and $category_id are there for future usage
-
-/* returns true if $user_id can create a new post */
-function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') {
-	$author_data = get_userdata($user_id);
-	return ($author_data->user_level > 1);
-}
-
-/* returns true if $user_id can create a new post */
-function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') {
-	$author_data = get_userdata($user_id);
-	return ($author_data->user_level >= 1);
-}
-
-/* returns true if $user_id can edit $post_id */
-function user_can_edit_post($user_id, $post_id, $blog_id = 1) {
-	$author_data = get_userdata($user_id);
-	$post = get_post($post_id);
-	$post_author_data = get_userdata($post->post_author);
-
-	if ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' &&  $author_data->user_level < 2))
-	     || ($author_data->user_level > $post_author_data->user_level)
-	     || ($author_data->user_level >= 10) ) {
-		return true;
-	} else {
-		return false;
-	}
-}
-
-/* returns true if $user_id can delete $post_id */
-function user_can_delete_post($user_id, $post_id, $blog_id = 1) {
-	// right now if one can edit, one can delete
-	return user_can_edit_post($user_id, $post_id, $blog_id);
-}
-
-/* returns true if $user_id can set new posts' dates on $blog_id */
-function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') {
-	$author_data = get_userdata($user_id);
-	return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id));
-}
-
-/* returns true if $user_id can edit $post_id's date */
-function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) {
-	$author_data = get_userdata($user_id);
-	return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id));
-}
-
-/* returns true if $user_id can edit $post_id's comments */
-function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) {
-	// right now if one can edit a post, one can edit comments made on it
-	return user_can_edit_post($user_id, $post_id, $blog_id);
-}
-
-/* returns true if $user_id can delete $post_id's comments */
-function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) {
-	// right now if one can edit comments, one can delete comments
-	return user_can_edit_post_comments($user_id, $post_id, $blog_id);
-}
-
-function user_can_edit_user($user_id, $other_user) {
-	$user  = get_userdata($user_id);
-	$other = get_userdata($other_user);
-	if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID )
-		return true;
-	else
-		return false;
-}
-
 function wp_blacklist_check($author, $email, $url, $comment, $user_ip, $user_agent) {
 	global $wpdb;
 
@@ -444,7 +684,7 @@
 function wp_proxy_check($ipnum) {
 	if ( get_option('open_proxy_check') && isset($ipnum) ) {
 		$rev_ip = implode( '.', array_reverse( explode( '.', $ipnum ) ) );
-		$lookup = $rev_ip . '.opm.blitzed.org';
+		$lookup = $rev_ip . '.sbl-xbl.spamhaus.org.';
 		if ( $lookup != gethostbyname( $lookup ) )
 			return true;
 	}
@@ -452,107 +692,39 @@
 	return false;
 }
 
-function wp_new_comment( $commentdata, $spam = false ) {
-	global $wpdb;
-
-	$commentdata = apply_filters('preprocess_comment', $commentdata);
-	extract($commentdata);
-
-	$comment_post_ID = (int) $comment_post_ID;
-
-	$user_id = apply_filters('pre_user_id', $user_ID);
-	$author  = apply_filters('pre_comment_author_name', $comment_author);
-	$email   = apply_filters('pre_comment_author_email', $comment_author_email);
-	$url     = apply_filters('pre_comment_author_url', $comment_author_url);
-	$comment = apply_filters('pre_comment_content', $comment_content);
-	$comment = apply_filters('post_comment_text', $comment); // Deprecated
-	$comment = apply_filters('comment_content_presave', $comment); // Deprecated
-
-	$user_ip     = apply_filters('pre_comment_user_ip', $_SERVER['REMOTE_ADDR']);
-	$user_domain = apply_filters('pre_comment_user_domain', gethostbyaddr($user_ip) );
-	$user_agent  = apply_filters('pre_comment_user_agent', $_SERVER['HTTP_USER_AGENT']);
-
-	$now     = current_time('mysql');
-	$now_gmt = current_time('mysql', 1);
-
-	if ( $user_id ) {
-		$userdata = get_userdata($user_id);
-		$post_author = $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = '$comment_post_ID' LIMIT 1");
-	}
-
-	// Simple duplicate check
-	$dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$author' ";
-	if ( $email ) $dupe .= "OR comment_author_email = '$email' ";
-	$dupe .= ") AND comment_content = '$comment' LIMIT 1";
-	if ( $wpdb->get_var($dupe) )
-		die( __('Duplicate comment detected; it looks as though you\'ve already said that!') );
-
-	// Simple flood-protection
-	if ( $lasttime = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_author_IP = '$user_ip' OR comment_author_email = '$email' ORDER BY comment_date DESC LIMIT 1") ) {
-		$time_lastcomment = mysql2date('U', $lasttime);
-		$time_newcomment  = mysql2date('U', $now_gmt);
-		if ( ($time_newcomment - $time_lastcomment) < 15 ) {
-			do_action('comment_flood_trigger', $time_lastcomment, $time_newcomment);
-			die( __('Sorry, you can only post a new comment once every 15 seconds. Slow down cowboy.') );
-		}
-	}
-
-	if ( $userdata && ( $user_id == $post_author || $userdata->user_level >= 9 ) ) {
-		$approved = 1;
-	} else {
-		if ( check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $comment_type) )
-			$approved = 1;
-		else
-			$approved = 0;
-		if ( wp_blacklist_check($author, $email, $url, $comment, $user_ip, $user_agent) )
-			$approved = 'spam';
-	}
-
-	$approved = apply_filters('pre_comment_approved', $approved);
-
-	$result = $wpdb->query("INSERT INTO $wpdb->comments 
-	(comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_date_gmt, comment_content, comment_approved, comment_agent, comment_type, user_id)
-	VALUES 
-	('$comment_post_ID', '$author', '$email', '$url', '$user_ip', '$now', '$now_gmt', '$comment', '$approved', '$user_agent', '$comment_type', '$user_id')
-	");
-
-	$comment_id = $wpdb->insert_id;
-	do_action('comment_post', $comment_id, $approved);
-
-	if ( 'spam' !== $approved ) { // If it's spam save it silently for later crunching
-		if ( '0' == $approved )
-			wp_notify_moderator($comment_id);
-	
-		if ( get_settings('comments_notify') && $approved )
-			wp_notify_postauthor($comment_id, $comment_type);
-	}
-
-	return $result;
-}
-
 function do_trackbacks($post_id) {
 	global $wpdb;
 
 	$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID = $post_id");
 	$to_ping = get_to_ping($post_id);
 	$pinged  = get_pung($post_id);
-	if ( empty($to_ping) )
+	if ( empty($to_ping) ) {
+		$wpdb->query("UPDATE $wpdb->posts SET to_ping = '' WHERE ID = '$post_id'");
 		return;
+	}
+	
 	if (empty($post->post_excerpt))
 		$excerpt = apply_filters('the_content', $post->post_content);
 	else
 		$excerpt = apply_filters('the_excerpt', $post->post_excerpt);
 	$excerpt = str_replace(']]>', ']]&gt;', $excerpt);
 	$excerpt = strip_tags($excerpt);
-	$excerpt = substr($excerpt, 0, 252) . '...';
+	if ( function_exists('mb_strcut') ) // For international trackbacks
+    	$excerpt = mb_strcut($excerpt, 0, 252, get_settings('blog_charset')) . '...';
+	else
+		$excerpt = substr($excerpt, 0, 252) . '...';
 
 	$post_title = apply_filters('the_title', $post->post_title);
 	$post_title = strip_tags($post_title);
 
 	if ($to_ping) : foreach ($to_ping as $tb_ping) :
 		$tb_ping = trim($tb_ping);
-		if ( !in_array($tb_ping, $pinged) )
-		 trackback($tb_ping, $post_title, $excerpt, $post_id);
+		if ( !in_array($tb_ping, $pinged) ) {
+			trackback($tb_ping, $post_title, $excerpt, $post_id);
+			$pinged[] = $tb_ping;
+		} else {
+			$wpdb->query("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, '$tb_ping', '')) WHERE ID = '$post_id'");
+		}
 	endforeach; endif;
 }
 
@@ -561,6 +733,7 @@
 	$pung = $wpdb->get_var("SELECT pinged FROM $wpdb->posts WHERE ID = $post_id");
 	$pung = trim($pung);
 	$pung = preg_split('/\s/', $pung);
+	$pung = apply_filters('get_pung', $pung);
 	return $pung;
 }
 
@@ -568,18 +741,18 @@
 	global $wpdb;
 	$custom_fields = get_post_custom( $post_id );
 	$pung = array();
-	if( is_array( $custom_fields ) ) {
-		while( list( $key, $val ) = each( $custom_fields ) ) { 
-			if( $key == 'enclosure' ) {
-				if (is_array($val)) {
-					foreach($val as $enc) {
-						$enclosure = split( "\n", $enc );
-						$pung[] = trim( $enclosure[ 0 ] );
-					}
-				}
-			}
+	if ( !is_array( $custom_fields ) )
+		return $pung;
+
+	foreach ( $custom_fields as $key => $val ) {
+		if ( 'enclosure' != $key || !is_array( $val ) )
+			continue;
+		foreach( $val as $enc ) {
+			$enclosure = split( "\n", $enc );
+			$pung[] = trim( $enclosure[ 0 ] );
 		}
 	}
+	$pung = apply_filters('get_enclosed', $pung);
 	return $pung;
 }
 
@@ -588,6 +761,7 @@
 	$to_ping = $wpdb->get_var("SELECT to_ping FROM $wpdb->posts WHERE ID = $post_id");
 	$to_ping = trim($to_ping);
 	$to_ping = preg_split('/\s/', $to_ping, -1, PREG_SPLIT_NO_EMPTY);
+	$to_ping = apply_filters('get_to_ping',  $to_ping);
 	return $to_ping;
 }
 
@@ -598,7 +772,254 @@
 	$pung = preg_split('/\s/', $pung);
 	$pung[] = $uri;
 	$new = implode("\n", $pung);
+	$new = apply_filters('add_ping', $new);
 	return $wpdb->query("UPDATE $wpdb->posts SET pinged = '$new' WHERE ID = $post_id");
 }
 
+//fetches the pages returned as a FLAT list, but arranged in order of their hierarchy, i.e., child parents
+//immediately follow their parents
+function get_page_hierarchy($posts, $parent = 0) {
+	$result = array ( );
+	if ($posts) { foreach ($posts as $post) {
+		if ($post->post_parent == $parent) {
+			$result[$post->ID] = $post->post_name;
+			$children = get_page_hierarchy($posts, $post->ID);
+			$result += $children; //append $children to $result
+		}
+	} }
+	return $result;
+}
+
+function generate_page_rewrite_rules() {
+	global $wpdb;
+	
+	//get pages in order of hierarchy, i.e. children after parents
+	$posts = get_page_hierarchy($wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_status = 'static'"));
+	//now reverse it, because we need parents after children for rewrite rules to work properly
+	$posts = array_reverse($posts, true);
+
+	$page_rewrite_rules = array();
+	$page_attachment_rewrite_rules = array();
+
+	if ($posts) {
+		
+		foreach ($posts as $id => $post) {
+
+			// URI => page name
+			$uri = get_page_uri($id);
+			$attachments = $wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_status = 'attachment' AND post_parent = '$id'");
+			if ( $attachments ) {
+				foreach ( $attachments as $attachment ) {
+					$attach_uri = get_page_uri($attachment->ID);
+					$page_attachment_rewrite_rules[$attach_uri] = $attachment->post_name;
+				}
+			}
+
+			$page_rewrite_rules[$uri] = $post;
+		}
+
+		update_option('page_uris', $page_rewrite_rules);
+		
+		if ( $page_attachment_rewrite_rules )
+			update_option('page_attachment_uris', $page_attachment_rewrite_rules);
+	}
+}
+
+function get_post_status($ID = '') {
+	$post = get_post($ID);
+
+	if ( is_object($post) ) {
+		if ( ('attachment' == $post->post_status) && $post->post_parent && ($post->ID != $post->post_parent) )
+			return get_post_status($post->post_parent);
+		else
+			return $post->post_status;
+	}
+
+	return false;
+}
+
+// Takes a post ID, returns its mime type.
+function get_post_mime_type($ID = '') {
+	$post = & get_post($ID);
+
+	if ( is_object($post) )
+		return $post->post_mime_type;
+
+	return false;
+}
+
+function get_attached_file($attachment_id) {
+	return get_post_meta($attachment_id, '_wp_attached_file', true);
+}
+
+function wp_mkdir_p($target) {
+	// from php.net/mkdir user contributed notes
+	if (file_exists($target)) {
+		if (! @ is_dir($target))
+			return false;
+		else
+			return true;
+	}
+
+	// Attempting to create the directory may clutter up our display.
+	if (@ mkdir($target)) {
+		$stat = @ stat(dirname($target));
+		$dir_perms = $stat['mode'] & 0007777;  // Get the permission bits.
+		@ chmod($target, $dir_perms);
+		return true;
+	} else {
+		if ( is_dir(dirname($target)) )
+			return false;	
+	}
+
+	// If the above failed, attempt to create the parent node, then try again.
+	if (wp_mkdir_p(dirname($target)))
+		return wp_mkdir_p($target);
+
+	return false;
+}
+
+// Returns an array containing the current upload directory's path and url, or an error message.
+function wp_upload_dir() {
+	$siteurl = get_settings('siteurl');
+	//prepend ABSPATH to $dir and $siteurl to $url if they're not already there
+	$path = str_replace(ABSPATH, '', trim(get_settings('upload_path')));
+	$dir = ABSPATH . $path;
+	$url = trailingslashit($siteurl) . $path;
+
+	if ( $dir == ABSPATH ) { //the option was empty
+		$dir = ABSPATH . 'wp-content/uploads';
+	}
+
+	if ( defined('UPLOADS') ) {
+		$dir = ABSPATH . UPLOADS;
+		$url = trailingslashit($siteurl) . UPLOADS;
+	}
+
+	if ( get_settings('uploads_use_yearmonth_folders')) {
+		// Generate the yearly and monthly dirs
+		$time = current_time( 'mysql' );
+		$y = substr( $time, 0, 4 );
+		$m = substr( $time, 5, 2 );
+		$dir = $dir . "/$y/$m";
+		$url = $url . "/$y/$m";
+	}
+
+	// Make sure we have an uploads dir
+	if ( ! wp_mkdir_p( $dir ) ) {
+		$message = sprintf(__('Unable to create directory %s. Is its parent directory writable by the server?'), $dir);
+		return array('error' => $message);
+	}
+
+    $uploads = array('path' => $dir, 'url' => $url, 'error' => false);
+	return apply_filters('upload_dir', $uploads);
+}
+
+function wp_upload_bits($name, $type, $bits) {
+	if ( empty($name) )
+		return array('error' => __("Empty filename"));
+
+	$wp_filetype = wp_check_filetype($name);
+	if ( !$wp_filetype['ext'] )
+		return array('error' => __("Invalid file type"));
+
+	$upload = wp_upload_dir();
+	
+	if ( $upload['error'] !== false )
+		return $upload;
+
+	$number = '';
+	$filename = $name;
+	$path_parts = pathinfo($filename);
+	$ext = $path_parts['extension'];
+	if ( empty($ext) )
+		$ext = '';
+	else
+		$ext = ".$ext";
+	while ( file_exists($upload['path'] . "/$filename") ) {
+		if ( '' == "$number$ext" )
+			$filename = $filename . ++$number . $ext;
+		else
+			$filename = str_replace("$number$ext", ++$number . $ext, $filename);
+	}
+		
+	$new_file = $upload['path'] . "/$filename";
+	if ( ! wp_mkdir_p( dirname($new_file) ) ) {
+		$message = sprintf(__('Unable to create directory %s. Is its parent directory writable by the server?'), dirname($new_file));
+		return array('error' => $message);
+	}
+
+	$ifp = @ fopen($new_file, 'wb');
+	if ( ! $ifp )
+		return array('error' => "Could not write file $new_file.");
+		
+	$success = @ fwrite($ifp, $bits);
+	fclose($ifp);
+	// Set correct file permissions
+	$stat = @ stat(dirname($new_file));
+	$perms = $stat['mode'] & 0007777;
+	$perms = $perms & 0000666;
+	@ chmod($new_file, $perms);
+
+	// Compute the URL
+	$url = $upload['url'] . "/$filename";
+
+	return array('file' => $new_file, 'url' => $url, 'error' => false);
+}
+
+function wp_check_filetype($filename, $mimes = null) {
+	// Accepted MIME types are set here as PCRE unless provided.
+	$mimes = is_array($mimes) ? $mimes : apply_filters('upload_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 ($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');
+}
+
 ?>
diff -ruN 1.5.2/wp-includes/gettext.php 2.0.4/wp-includes/gettext.php
--- 1.5.2/wp-includes/gettext.php	2005-04-19 21:46:48.000000000 -0500
+++ 2.0.4/wp-includes/gettext.php	2006-07-06 17:36:44.000000000 -0500
@@ -94,7 +94,7 @@
    */
   function gettext_reader($Reader, $enable_cache = true) {
     // If there isn't a StreamReader, turn on short circuit mode.
-    if (! $Reader) {
+    if (! $Reader || isset($Reader->error) ) {
       $this->short_circuit = true;
       return;
     }
@@ -102,16 +102,16 @@
     // Caching can be turned off
     $this->enable_cache = $enable_cache;
 
-    // $MAGIC1 = (int)0x950412de; //bug in PHP 5
+    // $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;
 
     $this->STREAM = $Reader;
     $magic = $this->readint();
-    if ($magic == $MAGIC1) {
+    if ($magic == ($MAGIC1 & 0xFFFFFFFF)) { // to make sure it works for 64-bit platforms
       $this->BYTEORDER = 0;
-    } elseif ($magic == $MAGIC2) {
+    } elseif ($magic == ($MAGIC2 & 0xFFFFFFFF)) {
       $this->BYTEORDER = 1;
     } else {
       $this->error = 1; // not MO file
@@ -279,7 +279,7 @@
       } else {
         $header = $this->get_translation_string(0);
       }
-      if (eregi("plural-forms: (.*)\n", $header, $regs))
+      if (eregi("plural-forms: ([^\n]*)\n", $header, $regs))
         $expr = $regs[1];
       else
         $expr = "nplurals=2; plural=n == 1 ? 0 : 1;";
@@ -305,7 +305,7 @@
     $plural = 0;
 
     eval("$string");
-    if ($plural >= $total) $plural = 0;
+    if ($plural >= $total) $plural = $total - 1;
     return $plural;
   }
 
Files 1.5.2/wp-includes/images/smilies/icon_arrow.gif and 2.0.4/wp-includes/images/smilies/icon_arrow.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_biggrin.gif and 2.0.4/wp-includes/images/smilies/icon_biggrin.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_confused.gif and 2.0.4/wp-includes/images/smilies/icon_confused.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_cool.gif and 2.0.4/wp-includes/images/smilies/icon_cool.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_cry.gif and 2.0.4/wp-includes/images/smilies/icon_cry.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_eek.gif and 2.0.4/wp-includes/images/smilies/icon_eek.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_evil.gif and 2.0.4/wp-includes/images/smilies/icon_evil.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_exclaim.gif and 2.0.4/wp-includes/images/smilies/icon_exclaim.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_idea.gif and 2.0.4/wp-includes/images/smilies/icon_idea.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_lol.gif and 2.0.4/wp-includes/images/smilies/icon_lol.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_mad.gif and 2.0.4/wp-includes/images/smilies/icon_mad.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_mrgreen.gif and 2.0.4/wp-includes/images/smilies/icon_mrgreen.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_neutral.gif and 2.0.4/wp-includes/images/smilies/icon_neutral.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_question.gif and 2.0.4/wp-includes/images/smilies/icon_question.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_razz.gif and 2.0.4/wp-includes/images/smilies/icon_razz.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_redface.gif and 2.0.4/wp-includes/images/smilies/icon_redface.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_rolleyes.gif and 2.0.4/wp-includes/images/smilies/icon_rolleyes.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_sad.gif and 2.0.4/wp-includes/images/smilies/icon_sad.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_smile.gif and 2.0.4/wp-includes/images/smilies/icon_smile.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_surprised.gif and 2.0.4/wp-includes/images/smilies/icon_surprised.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_twisted.gif and 2.0.4/wp-includes/images/smilies/icon_twisted.gif differ
Files 1.5.2/wp-includes/images/smilies/icon_wink.gif and 2.0.4/wp-includes/images/smilies/icon_wink.gif differ
diff -ruN 1.5.2/wp-includes/js/colorpicker.js 2.0.4/wp-includes/js/colorpicker.js
--- 1.5.2/wp-includes/js/colorpicker.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/colorpicker.js	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,707 @@
+// ===================================================================
+// Author: Matt Kruse <matt@mattkruse.com>
+// WWW: http://www.mattkruse.com/
+//
+// NOTICE: You may use this code for any purpose, commercial or
+// private, without any further permission from the author. You may
+// remove this notice from your final code if you wish, however it is
+// appreciated by the author if at least my web site address is kept.
+//
+// You may *NOT* re-distribute this code in any way except through its
+// use. That means, you can include it in your product, or your web
+// site, or any other form where the code is actually being used. You
+// may not put the plain javascript up on your site for download or
+// include it in your javascript libraries for download. 
+// If you wish to share this code with others, please just point them
+// to the URL instead.
+// Please DO NOT link directly to my .js files from your site. Copy
+// the files to your server and use them there. Thank you.
+// ===================================================================
+
+
+/* SOURCE FILE: AnchorPosition.js */
+
+/* 
+AnchorPosition.js
+Author: Matt Kruse
+Last modified: 10/11/02
+
+DESCRIPTION: These functions find the position of an <A> tag in a document,
+so other elements can be positioned relative to it.
+
+COMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small
+positioning errors - usually with Window positioning - occur on the 
+Macintosh platform.
+
+FUNCTIONS:
+getAnchorPosition(anchorname)
+  Returns an Object() having .x and .y properties of the pixel coordinates
+  of the upper-left corner of the anchor. Position is relative to the PAGE.
+
+getAnchorWindowPosition(anchorname)
+  Returns an Object() having .x and .y properties of the pixel coordinates
+  of the upper-left corner of the anchor, relative to the WHOLE SCREEN.
+
+NOTES:
+
+1) For popping up separate browser windows, use getAnchorWindowPosition. 
+   Otherwise, use getAnchorPosition
+
+2) Your anchor tag MUST contain both NAME and ID attributes which are the 
+   same. For example:
+   <A NAME="test" ID="test"> </A>
+
+3) There must be at least a space between <A> </A> for IE5.5 to see the 
+   anchor tag correctly. Do not do <A></A> with no space.
+*/ 
+
+// getAnchorPosition(anchorname)
+//   This function returns an object having .x and .y properties which are the coordinates
+//   of the named anchor, relative to the page.
+function getAnchorPosition(anchorname) {
+	// This function will return an Object with x and y properties
+	var useWindow=false;
+	var coordinates=new Object();
+	var x=0,y=0;
+	// Browser capability sniffing
+	var use_gebi=false, use_css=false, use_layers=false;
+	if (document.getElementById) { use_gebi=true; }
+	else if (document.all) { use_css=true; }
+	else if (document.layers) { use_layers=true; }
+	// Logic to find position
+ 	if (use_gebi && document.all) {
+		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
+		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
+		}
+	else if (use_gebi) {
+		var o=document.getElementById(anchorname);
+		x=AnchorPosition_getPageOffsetLeft(o);
+		y=AnchorPosition_getPageOffsetTop(o);
+		}
+ 	else if (use_css) {
+		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
+		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
+		}
+	else if (use_layers) {
+		var found=0;
+		for (var i=0; i<document.anchors.length; i++) {
+			if (document.anchors[i].name==anchorname) { found=1; break; }
+			}
+		if (found==0) {
+			coordinates.x=0; coordinates.y=0; return coordinates;
+			}
+		x=document.anchors[i].x;
+		y=document.anchors[i].y;
+		}
+	else {
+		coordinates.x=0; coordinates.y=0; return coordinates;
+		}
+	coordinates.x=x;
+	coordinates.y=y;
+	return coordinates;
+	}
+
+// getAnchorWindowPosition(anchorname)
+//   This function returns an object having .x and .y properties which are the coordinates
+//   of the named anchor, relative to the window
+function getAnchorWindowPosition(anchorname) {
+	var coordinates=getAnchorPosition(anchorname);
+	var x=0;
+	var y=0;
+	if (document.getElementById) {
+		if (isNaN(window.screenX)) {
+			x=coordinates.x-document.body.scrollLeft+window.screenLeft;
+			y=coordinates.y-document.body.scrollTop+window.screenTop;
+			}
+		else {
+			x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
+			y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
+			}
+		}
+	else if (document.all) {
+		x=coordinates.x-document.body.scrollLeft+window.screenLeft;
+		y=coordinates.y-document.body.scrollTop+window.screenTop;
+		}
+	else if (document.layers) {
+		x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
+		y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
+		}
+	coordinates.x=x;
+	coordinates.y=y;
+	return coordinates;
+	}
+
+// Functions for IE to get position of an object
+function AnchorPosition_getPageOffsetLeft (el) {
+	var ol=el.offsetLeft;
+	while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
+	return ol;
+	}
+function AnchorPosition_getWindowOffsetLeft (el) {
+	return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;
+	}	
+function AnchorPosition_getPageOffsetTop (el) {
+	var ot=el.offsetTop;
+	while((el=el.offsetParent) != null) { ot += el.offsetTop; }
+	return ot;
+	}
+function AnchorPosition_getWindowOffsetTop (el) {
+	return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;
+	}
+
+/* SOURCE FILE: PopupWindow.js */
+
+/* 
+PopupWindow.js
+Author: Matt Kruse
+Last modified: 02/16/04
+
+DESCRIPTION: This object allows you to easily and quickly popup a window
+in a certain place. The window can either be a DIV or a separate browser
+window.
+
+COMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.x on Windows. Some small
+positioning errors - usually with Window positioning - occur on the 
+Macintosh platform. Due to bugs in Netscape 4.x, populating the popup 
+window with <STYLE> tags may cause errors.
+
+USAGE:
+// Create an object for a WINDOW popup
+var win = new PopupWindow(); 
+
+// Create an object for a DIV window using the DIV named 'mydiv'
+var win = new PopupWindow('mydiv'); 
+
+// Set the window to automatically hide itself when the user clicks 
+// anywhere else on the page except the popup
+win.autoHide(); 
+
+// Show the window relative to the anchor name passed in
+win.showPopup(anchorname);
+
+// Hide the popup
+win.hidePopup();
+
+// Set the size of the popup window (only applies to WINDOW popups
+win.setSize(width,height);
+
+// Populate the contents of the popup window that will be shown. If you 
+// change the contents while it is displayed, you will need to refresh()
+win.populate(string);
+
+// set the URL of the window, rather than populating its contents
+// manually
+win.setUrl("http://www.site.com/");
+
+// Refresh the contents of the popup
+win.refresh();
+
+// Specify how many pixels to the right of the anchor the popup will appear
+win.offsetX = 50;
+
+// Specify how many pixels below the anchor the popup will appear
+win.offsetY = 100;
+
+NOTES:
+1) Requires the functions in AnchorPosition.js
+
+2) Your anchor tag MUST contain both NAME and ID attributes which are the 
+   same. For example:
+   <A NAME="test" ID="test"> </A>
+
+3) There must be at least a space between <A> </A> for IE5.5 to see the 
+   anchor tag correctly. Do not do <A></A> with no space.
+
+4) When a PopupWindow object is created, a handler for 'onmouseup' is
+   attached to any event handler you may have already defined. Do NOT define
+   an event handler for 'onmouseup' after you define a PopupWindow object or
+   the autoHide() will not work correctly.
+*/ 
+
+// Set the position of the popup window based on the anchor
+function PopupWindow_getXYPosition(anchorname) {
+	var coordinates;
+	if (this.type == "WINDOW") {
+		coordinates = getAnchorWindowPosition(anchorname);
+		}
+	else {
+		coordinates = getAnchorPosition(anchorname);
+		}
+	this.x = coordinates.x;
+	this.y = coordinates.y;
+	}
+// Set width/height of DIV/popup window
+function PopupWindow_setSize(width,height) {
+	this.width = width;
+	this.height = height;
+	}
+// Fill the window with contents
+function PopupWindow_populate(contents) {
+	this.contents = contents;
+	this.populated = false;
+	}
+// Set the URL to go to
+function PopupWindow_setUrl(url) {
+	this.url = url;
+	}
+// Set the window popup properties
+function PopupWindow_setWindowProperties(props) {
+	this.windowProperties = props;
+	}
+// Refresh the displayed contents of the popup
+function PopupWindow_refresh() {
+	if (this.divName != null) {
+		// refresh the DIV object
+		if (this.use_gebi) {
+			document.getElementById(this.divName).innerHTML = this.contents;
+			}
+		else if (this.use_css) { 
+			document.all[this.divName].innerHTML = this.contents;
+			}
+		else if (this.use_layers) { 
+			var d = document.layers[this.divName]; 
+			d.document.open();
+			d.document.writeln(this.contents);
+			d.document.close();
+			}
+		}
+	else {
+		if (this.popupWindow != null && !this.popupWindow.closed) {
+			if (this.url!="") {
+				this.popupWindow.location.href=this.url;
+				}
+			else {
+				this.popupWindow.document.open();
+				this.popupWindow.document.writeln(this.contents);
+				this.popupWindow.document.close();
+			}
+			this.popupWindow.focus();
+			}
+		}
+	}
+// Position and show the popup, relative to an anchor object
+function PopupWindow_showPopup(anchorname) {
+	this.getXYPosition(anchorname);
+	this.x += this.offsetX;
+	this.y += this.offsetY;
+	if (!this.populated && (this.contents != "")) {
+		this.populated = true;
+		this.refresh();
+		}
+	if (this.divName != null) {
+		// Show the DIV object
+		if (this.use_gebi) {
+			document.getElementById(this.divName).style.left = this.x + "px";
+			document.getElementById(this.divName).style.top = this.y;
+			document.getElementById(this.divName).style.visibility = "visible";
+			}
+		else if (this.use_css) {
+			document.all[this.divName].style.left = this.x;
+			document.all[this.divName].style.top = this.y;
+			document.all[this.divName].style.visibility = "visible";
+			}
+		else if (this.use_layers) {
+			document.layers[this.divName].left = this.x;
+			document.layers[this.divName].top = this.y;
+			document.layers[this.divName].visibility = "visible";
+			}
+		}
+	else {
+		if (this.popupWindow == null || this.popupWindow.closed) {
+			// If the popup window will go off-screen, move it so it doesn't
+			if (this.x<0) { this.x=0; }
+			if (this.y<0) { this.y=0; }
+			if (screen && screen.availHeight) {
+				if ((this.y + this.height) > screen.availHeight) {
+					this.y = screen.availHeight - this.height;
+					}
+				}
+			if (screen && screen.availWidth) {
+				if ((this.x + this.width) > screen.availWidth) {
+					this.x = screen.availWidth - this.width;
+					}
+				}
+			var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled );
+			this.popupWindow = window.open(avoidAboutBlank?"":"about:blank","window_"+anchorname,this.windowProperties+",width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+"");
+			}
+		this.refresh();
+		}
+	}
+// Hide the popup
+function PopupWindow_hidePopup() {
+	if (this.divName != null) {
+		if (this.use_gebi) {
+			document.getElementById(this.divName).style.visibility = "hidden";
+			}
+		else if (this.use_css) {
+			document.all[this.divName].style.visibility = "hidden";
+			}
+		else if (this.use_layers) {
+			document.layers[this.divName].visibility = "hidden";
+			}
+		}
+	else {
+		if (this.popupWindow && !this.popupWindow.closed) {
+			this.popupWindow.close();
+			this.popupWindow = null;
+			}
+		}
+	}
+// Pass an event and return whether or not it was the popup DIV that was clicked
+function PopupWindow_isClicked(e) {
+	if (this.divName != null) {
+		if (this.use_layers) {
+			var clickX = e.pageX;
+			var clickY = e.pageY;
+			var t = document.layers[this.divName];
+			if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) {
+				return true;
+				}
+			else { return false; }
+			}
+		else if (document.all) { // Need to hard-code this to trap IE for error-handling
+			var t = window.event.srcElement;
+			while (t.parentElement != null) {
+				if (t.id==this.divName) {
+					return true;
+					}
+				t = t.parentElement;
+				}
+			return false;
+			}
+		else if (this.use_gebi && e) {
+			var t = e.originalTarget;
+			while (t.parentNode != null) {
+				if (t.id==this.divName) {
+					return true;
+					}
+				t = t.parentNode;
+				}
+			return false;
+			}
+		return false;
+		}
+	return false;
+	}
+
+// Check an onMouseDown event to see if we should hide
+function PopupWindow_hideIfNotClicked(e) {
+	if (this.autoHideEnabled && !this.isClicked(e)) {
+		this.hidePopup();
+		}
+	}
+// Call this to make the DIV disable automatically when mouse is clicked outside it
+function PopupWindow_autoHide() {
+	this.autoHideEnabled = true;
+	}
+// This global function checks all PopupWindow objects onmouseup to see if they should be hidden
+function PopupWindow_hidePopupWindows(e) {
+	for (var i=0; i<popupWindowObjects.length; i++) {
+		if (popupWindowObjects[i] != null) {
+			var p = popupWindowObjects[i];
+			p.hideIfNotClicked(e);
+			}
+		}
+	}
+// Run this immediately to attach the event listener
+function PopupWindow_attachListener() {
+	if (document.layers) {
+		document.captureEvents(Event.MOUSEUP);
+		}
+	window.popupWindowOldEventListener = document.onmouseup;
+	if (window.popupWindowOldEventListener != null) {
+		document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
+		}
+	else {
+		document.onmouseup = PopupWindow_hidePopupWindows;
+		}
+	}
+// CONSTRUCTOR for the PopupWindow object
+// Pass it a DIV name to use a DHTML popup, otherwise will default to window popup
+function PopupWindow() {
+	if (!window.popupWindowIndex) { window.popupWindowIndex = 0; }
+	if (!window.popupWindowObjects) { window.popupWindowObjects = new Array(); }
+	if (!window.listenerAttached) {
+		window.listenerAttached = true;
+		PopupWindow_attachListener();
+		}
+	this.index = popupWindowIndex++;
+	popupWindowObjects[this.index] = this;
+	this.divName = null;
+	this.popupWindow = null;
+	this.width=0;
+	this.height=0;
+	this.populated = false;
+	this.visible = false;
+	this.autoHideEnabled = false;
+	
+	this.contents = "";
+	this.url="";
+	this.windowProperties="toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no";
+	if (arguments.length>0) {
+		this.type="DIV";
+		this.divName = arguments[0];
+		}
+	else {
+		this.type="WINDOW";
+		}
+	this.use_gebi = false;
+	this.use_css = false;
+	this.use_layers = false;
+	if (document.getElementById) { this.use_gebi = true; }
+	else if (document.all) { this.use_css = true; }
+	else if (document.layers) { this.use_layers = true; }
+	else { this.type = "WINDOW"; }
+	this.offsetX = 0;
+	this.offsetY = 0;
+	// Method mappings
+	this.getXYPosition = PopupWindow_getXYPosition;
+	this.populate = PopupWindow_populate;
+	this.setUrl = PopupWindow_setUrl;
+	this.setWindowProperties = PopupWindow_setWindowProperties;
+	this.refresh = PopupWindow_refresh;
+	this.showPopup = PopupWindow_showPopup;
+	this.hidePopup = PopupWindow_hidePopup;
+	this.setSize = PopupWindow_setSize;
+	this.isClicked = PopupWindow_isClicked;
+	this.autoHide = PopupWindow_autoHide;
+	this.hideIfNotClicked = PopupWindow_hideIfNotClicked;
+	}
+
+/* SOURCE FILE: ColorPicker2.js */
+
+/* 
+Last modified: 02/24/2003
+
+DESCRIPTION: This widget is used to select a color, in hexadecimal #RRGGBB 
+form. It uses a color "swatch" to display the standard 216-color web-safe 
+palette. The user can then click on a color to select it.
+
+COMPATABILITY: See notes in AnchorPosition.js and PopupWindow.js.
+Only the latest DHTML-capable browsers will show the color and hex values
+at the bottom as your mouse goes over them.
+
+USAGE:
+// Create a new ColorPicker object using DHTML popup
+var cp = new ColorPicker();
+
+// Create a new ColorPicker object using Window Popup
+var cp = new ColorPicker('window');
+
+// Add a link in your page to trigger the popup. For example:
+<A HREF="#" onClick="cp.show('pick');return false;" NAME="pick" ID="pick">Pick</A>
+
+// Or use the built-in "select" function to do the dirty work for you:
+<A HREF="#" onClick="cp.select(document.forms[0].color,'pick');return false;" NAME="pick" ID="pick">Pick</A>
+
+// If using DHTML popup, write out the required DIV tag near the bottom
+// of your page.
+<SCRIPT LANGUAGE="JavaScript">cp.writeDiv()</SCRIPT>
+
+// Write the 'pickColor' function that will be called when the user clicks
+// a color and do something with the value. This is only required if you
+// want to do something other than simply populate a form field, which is 
+// what the 'select' function will give you.
+function pickColor(color) {
+	field.value = color;
+	}
+
+NOTES:
+1) Requires the functions in AnchorPosition.js and PopupWindow.js
+
+2) Your anchor tag MUST contain both NAME and ID attributes which are the 
+   same. For example:
+   <A NAME="test" ID="test"> </A>
+
+3) There must be at least a space between <A> </A> for IE5.5 to see the 
+   anchor tag correctly. Do not do <A></A> with no space.
+
+4) When a ColorPicker object is created, a handler for 'onmouseup' is
+   attached to any event handler you may have already defined. Do NOT define
+   an event handler for 'onmouseup' after you define a ColorPicker object or
+   the color picker will not hide itself correctly.
+*/ 
+ColorPicker_targetInput = null;
+function ColorPicker_writeDiv() {
+	document.writeln("<DIV ID=\"colorPickerDiv\" STYLE=\"position:absolute;visibility:hidden;\"> </DIV>");
+	}
+
+function ColorPicker_show(anchorname) {
+	this.showPopup(anchorname);
+	}
+
+function ColorPicker_pickColor(color,obj) {
+	obj.hidePopup();
+	pickColor(color);
+	}
+
+// A Default "pickColor" function to accept the color passed back from popup.
+// User can over-ride this with their own function.
+function pickColor(color) {
+	if (ColorPicker_targetInput==null) {
+		alert("Target Input is null, which means you either didn't use the 'select' function or you have no defined your own 'pickColor' function to handle the picked color!");
+		return;
+		}
+	ColorPicker_targetInput.value = color;
+	}
+
+// This function is the easiest way to popup the window, select a color, and
+// have the value populate a form field, which is what most people want to do.
+function ColorPicker_select(inputobj,linkname) {
+	if (inputobj.type!="text" && inputobj.type!="hidden" && inputobj.type!="textarea") { 
+		alert("colorpicker.select: Input object passed is not a valid form input object"); 
+		window.ColorPicker_targetInput=null;
+		return;
+		}
+	window.ColorPicker_targetInput = inputobj;
+	this.show(linkname);
+	}
+	
+// This function runs when you move your mouse over a color block, if you have a newer browser
+function ColorPicker_highlightColor(c) {
+	var thedoc = (arguments.length>1)?arguments[1]:window.document;
+	var d = thedoc.getElementById("colorPickerSelectedColor");
+	d.style.backgroundColor = c;
+	d = thedoc.getElementById("colorPickerSelectedColorValue");
+	d.innerHTML = c;
+	}
+
+function ColorPicker() {
+	var windowMode = false;
+	// Create a new PopupWindow object
+	if (arguments.length==0) {
+		var divname = "colorPickerDiv";
+		}
+	else if (arguments[0] == "window") {
+		var divname = '';
+		windowMode = true;
+		}
+	else {
+		var divname = arguments[0];
+		}
+	
+	if (divname != "") {
+		var cp = new PopupWindow(divname);
+		}
+	else {
+		var cp = new PopupWindow();
+		cp.setSize(225,250);
+		}
+
+	// Object variables
+	cp.currentValue = "#FFFFFF";
+	
+	// Method Mappings
+	cp.writeDiv = ColorPicker_writeDiv;
+	cp.highlightColor = ColorPicker_highlightColor;
+	cp.show = ColorPicker_show;
+	cp.select = ColorPicker_select;
+
+	// Code to populate color picker window
+	var colors = new Array(	"#4180B6","#69AEE7","#000000","#000033","#000066","#000099","#0000CC","#0000FF","#330000","#330033","#330066","#330099",
+							"#3300CC","#3300FF","#660000","#660033","#660066","#660099","#6600CC","#6600FF","#990000","#990033","#990066","#990099",
+							"#9900CC","#9900FF","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#FF0000","#FF0033","#FF0066","#FF0099",
+							"#FF00CC","#FF00FF","#7FFFFF","#7FFFFF","#7FF7F7","#7FEFEF","#7FE7E7","#7FDFDF","#7FD7D7","#7FCFCF","#7FC7C7","#7FBFBF",
+							"#7FB7B7","#7FAFAF","#7FA7A7","#7F9F9F","#7F9797","#7F8F8F","#7F8787","#7F7F7F","#7F7777","#7F6F6F","#7F6767","#7F5F5F",
+							"#7F5757","#7F4F4F","#7F4747","#7F3F3F","#7F3737","#7F2F2F","#7F2727","#7F1F1F","#7F1717","#7F0F0F","#7F0707","#7F0000",
+
+							"#4180B6","#69AEE7","#003300","#003333","#003366","#003399","#0033CC","#0033FF","#333300","#333333","#333366","#333399",
+							"#3333CC","#3333FF","#663300","#663333","#663366","#663399","#6633CC","#6633FF","#993300","#993333","#993366","#993399",
+							"#9933CC","#9933FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#FF3300","#FF3333","#FF3366","#FF3399",
+							"#FF33CC","#FF33FF","#FF7FFF","#FF7FFF","#F77FF7","#EF7FEF","#E77FE7","#DF7FDF","#D77FD7","#CF7FCF","#C77FC7","#BF7FBF",
+							"#B77FB7","#AF7FAF","#A77FA7","#9F7F9F","#977F97","#8F7F8F","#877F87","#7F7F7F","#777F77","#6F7F6F","#677F67","#5F7F5F",
+							"#577F57","#4F7F4F","#477F47","#3F7F3F","#377F37","#2F7F2F","#277F27","#1F7F1F","#177F17","#0F7F0F","#077F07","#007F00",
+
+							"#4180B6","#69AEE7","#006600","#006633","#006666","#006699","#0066CC","#0066FF","#336600","#336633","#336666","#336699",
+							"#3366CC","#3366FF","#666600","#666633","#666666","#666699","#6666CC","#6666FF","#996600","#996633","#996666","#996699",
+							"#9966CC","#9966FF","#CC6600","#CC6633","#CC6666","#CC6699","#CC66CC","#CC66FF","#FF6600","#FF6633","#FF6666","#FF6699",
+							"#FF66CC","#FF66FF","#FFFF7F","#FFFF7F","#F7F77F","#EFEF7F","#E7E77F","#DFDF7F","#D7D77F","#CFCF7F","#C7C77F","#BFBF7F",
+							"#B7B77F","#AFAF7F","#A7A77F","#9F9F7F","#97977F","#8F8F7F","#87877F","#7F7F7F","#77777F","#6F6F7F","#67677F","#5F5F7F",
+							"#57577F","#4F4F7F","#47477F","#3F3F7F","#37377F","#2F2F7F","#27277F","#1F1F7F","#17177F","#0F0F7F","#07077F","#00007F",
+
+							"#4180B6","#69AEE7","#009900","#009933","#009966","#009999","#0099CC","#0099FF","#339900","#339933","#339966","#339999",
+							"#3399CC","#3399FF","#669900","#669933","#669966","#669999","#6699CC","#6699FF","#999900","#999933","#999966","#999999",
+							"#9999CC","#9999FF","#CC9900","#CC9933","#CC9966","#CC9999","#CC99CC","#CC99FF","#FF9900","#FF9933","#FF9966","#FF9999",
+							"#FF99CC","#FF99FF","#3FFFFF","#3FFFFF","#3FF7F7","#3FEFEF","#3FE7E7","#3FDFDF","#3FD7D7","#3FCFCF","#3FC7C7","#3FBFBF",
+							"#3FB7B7","#3FAFAF","#3FA7A7","#3F9F9F","#3F9797","#3F8F8F","#3F8787","#3F7F7F","#3F7777","#3F6F6F","#3F6767","#3F5F5F",
+							"#3F5757","#3F4F4F","#3F4747","#3F3F3F","#3F3737","#3F2F2F","#3F2727","#3F1F1F","#3F1717","#3F0F0F","#3F0707","#3F0000",
+
+							"#4180B6","#69AEE7","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#33CC00","#33CC33","#33CC66","#33CC99",
+							"#33CCCC","#33CCFF","#66CC00","#66CC33","#66CC66","#66CC99","#66CCCC","#66CCFF","#99CC00","#99CC33","#99CC66","#99CC99",
+							"#99CCCC","#99CCFF","#CCCC00","#CCCC33","#CCCC66","#CCCC99","#CCCCCC","#CCCCFF","#FFCC00","#FFCC33","#FFCC66","#FFCC99",
+							"#FFCCCC","#FFCCFF","#FF3FFF","#FF3FFF","#F73FF7","#EF3FEF","#E73FE7","#DF3FDF","#D73FD7","#CF3FCF","#C73FC7","#BF3FBF",
+							"#B73FB7","#AF3FAF","#A73FA7","#9F3F9F","#973F97","#8F3F8F","#873F87","#7F3F7F","#773F77","#6F3F6F","#673F67","#5F3F5F",
+							"#573F57","#4F3F4F","#473F47","#3F3F3F","#373F37","#2F3F2F","#273F27","#1F3F1F","#173F17","#0F3F0F","#073F07","#003F00",
+
+							"#4180B6","#69AEE7","#00FF00","#00FF33","#00FF66","#00FF99","#00FFCC","#00FFFF","#33FF00","#33FF33","#33FF66","#33FF99",
+							"#33FFCC","#33FFFF","#66FF00","#66FF33","#66FF66","#66FF99","#66FFCC","#66FFFF","#99FF00","#99FF33","#99FF66","#99FF99",
+							"#99FFCC","#99FFFF","#CCFF00","#CCFF33","#CCFF66","#CCFF99","#CCFFCC","#CCFFFF","#FFFF00","#FFFF33","#FFFF66","#FFFF99",
+							"#FFFFCC","#FFFFFF","#FFFF3F","#FFFF3F","#F7F73F","#EFEF3F","#E7E73F","#DFDF3F","#D7D73F","#CFCF3F","#C7C73F","#BFBF3F",
+							"#B7B73F","#AFAF3F","#A7A73F","#9F9F3F","#97973F","#8F8F3F","#87873F","#7F7F3F","#77773F","#6F6F3F","#67673F","#5F5F3F",
+							"#57573F","#4F4F3F","#47473F","#3F3F3F","#37373F","#2F2F3F","#27273F","#1F1F3F","#17173F","#0F0F3F","#07073F","#00003F",
+
+							"#4180B6","#69AEE7","#FFFFFF","#FFEEEE","#FFDDDD","#FFCCCC","#FFBBBB","#FFAAAA","#FF9999","#FF8888","#FF7777","#FF6666",
+							"#FF5555","#FF4444","#FF3333","#FF2222","#FF1111","#FF0000","#FF0000","#FF0000","#FF0000","#EE0000","#DD0000","#CC0000",
+							"#BB0000","#AA0000","#990000","#880000","#770000","#660000","#550000","#440000","#330000","#220000","#110000","#000000",
+							"#000000","#000000","#000000","#001111","#002222","#003333","#004444","#005555","#006666","#007777","#008888","#009999",
+							"#00AAAA","#00BBBB","#00CCCC","#00DDDD","#00EEEE","#00FFFF","#00FFFF","#00FFFF","#00FFFF","#11FFFF","#22FFFF","#33FFFF",
+							"#44FFFF","#55FFFF","#66FFFF","#77FFFF","#88FFFF","#99FFFF","#AAFFFF","#BBFFFF","#CCFFFF","#DDFFFF","#EEFFFF","#FFFFFF",
+
+							"#4180B6","#69AEE7","#FFFFFF","#EEFFEE","#DDFFDD","#CCFFCC","#BBFFBB","#AAFFAA","#99FF99","#88FF88","#77FF77","#66FF66",
+							"#55FF55","#44FF44","#33FF33","#22FF22","#11FF11","#00FF00","#00FF00","#00FF00","#00FF00","#00EE00","#00DD00","#00CC00",
+							"#00BB00","#00AA00","#009900","#008800","#007700","#006600","#005500","#004400","#003300","#002200","#001100","#000000",
+							"#000000","#000000","#000000","#110011","#220022","#330033","#440044","#550055","#660066","#770077","#880088","#990099",
+							"#AA00AA","#BB00BB","#CC00CC","#DD00DD","#EE00EE","#FF00FF","#FF00FF","#FF00FF","#FF00FF","#FF11FF","#FF22FF","#FF33FF",
+							"#FF44FF","#FF55FF","#FF66FF","#FF77FF","#FF88FF","#FF99FF","#FFAAFF","#FFBBFF","#FFCCFF","#FFDDFF","#FFEEFF","#FFFFFF",
+
+							"#4180B6","#69AEE7","#FFFFFF","#EEEEFF","#DDDDFF","#CCCCFF","#BBBBFF","#AAAAFF","#9999FF","#8888FF","#7777FF","#6666FF",
+							"#5555FF","#4444FF","#3333FF","#2222FF","#1111FF","#0000FF","#0000FF","#0000FF","#0000FF","#0000EE","#0000DD","#0000CC",
+							"#0000BB","#0000AA","#000099","#000088","#000077","#000066","#000055","#000044","#000033","#000022","#000011","#000000",
+							"#000000","#000000","#000000","#111100","#222200","#333300","#444400","#555500","#666600","#777700","#888800","#999900",
+							"#AAAA00","#BBBB00","#CCCC00","#DDDD00","#EEEE00","#FFFF00","#FFFF00","#FFFF00","#FFFF00","#FFFF11","#FFFF22","#FFFF33",
+							"#FFFF44","#FFFF55","#FFFF66","#FFFF77","#FFFF88","#FFFF99","#FFFFAA","#FFFFBB","#FFFFCC","#FFFFDD","#FFFFEE","#FFFFFF",
+
+							"#4180B6","#69AEE7","#FFFFFF","#FFFFFF","#FBFBFB","#F7F7F7","#F3F3F3","#EFEFEF","#EBEBEB","#E7E7E7","#E3E3E3","#DFDFDF",
+							"#DBDBDB","#D7D7D7","#D3D3D3","#CFCFCF","#CBCBCB","#C7C7C7","#C3C3C3","#BFBFBF","#BBBBBB","#B7B7B7","#B3B3B3","#AFAFAF",
+							"#ABABAB","#A7A7A7","#A3A3A3","#9F9F9F","#9B9B9B","#979797","#939393","#8F8F8F","#8B8B8B","#878787","#838383","#7F7F7F",
+							"#7B7B7B","#777777","#737373","#6F6F6F","#6B6B6B","#676767","#636363","#5F5F5F","#5B5B5B","#575757","#535353","#4F4F4F",
+							"#4B4B4B","#474747","#434343","#3F3F3F","#3B3B3B","#373737","#333333","#2F2F2F","#2B2B2B","#272727","#232323","#1F1F1F",
+							"#1B1B1B","#171717","#131313","#0F0F0F","#0B0B0B","#070707","#030303","#000000","#000000","#000000","#000000","#000000");
+	var total = colors.length;
+	var width = 72;
+	var cp_contents = "";
+	var windowRef = (windowMode)?"window.opener.":"";
+	if (windowMode) {
+		cp_contents += "<html><head><title>Select Color</title></head>";
+		cp_contents += "<body marginwidth=0 marginheight=0 leftmargin=0 topmargin=0><center>";
+		}
+	cp_contents += "<table border=0 cellspacing=0 cellpadding=0>";
+	var use_highlight = (document.getElementById || document.all)?true:false;
+	for (var i=0; i<total; i++) {
+		if ((i % width) == 0) { cp_contents += "<tr>"; }
+		if (use_highlight) { var mo = 'onMouseOver="'+windowRef+'ColorPicker_highlightColor(\''+colors[i]+'\',window.document)"'; }
+		else { mo = ""; }
+		cp_contents += '<td bgcolor="'+colors[i]+'"><a href="javascript:void()" onclick="'+windowRef+'ColorPicker_pickColor(\''+colors[i]+'\','+windowRef+'window.popupWindowObjects['+cp.index+']);return false;" '+mo+'>&nbsp;</a></td>';
+		if ( ((i+1)>=total) || (((i+1) % width) == 0)) { 
+			cp_contents += "</tr>";
+			}
+		}
+	// If the browser supports dynamically changing TD cells, add the fancy stuff
+	if (document.getElementById) {
+		var width1 = Math.floor(width/2);
+		var width2 = width = width1;
+		cp_contents += "<tr><td colspan='"+width1+"' bgcolor='#ffffff' ID='colorPickerSelectedColor'>&nbsp;</td><td colspan='"+width2+"' align='center' id='colorPickerSelectedColorValue'>#FFFFFF</td></tr>";
+		}
+	cp_contents += "</table>";
+	if (windowMode) {
+		cp_contents += "</center></body></html>";
+		}
+	// end populate code
+
+	// Write the contents to the popup object
+	cp.populate(cp_contents+"\n");
+	// Move the table down a bit so you can see it
+	cp.offsetY = 25;
+	cp.autoHide();
+	return cp;
+	}
diff -ruN 1.5.2/wp-includes/js/dbx.js 2.0.4/wp-includes/js/dbx.js
--- 1.5.2/wp-includes/js/dbx.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/dbx.js	2005-12-22 15:45:59.000000000 -0600
@@ -0,0 +1,6 @@
+// DBX2.01 :: Docking Boxes (dbx)
+// *****************************************************
+// DOM scripting by brothercake -- http://www.brothercake.com/
+// GNU Lesser General Public License -- http://www.gnu.org/licenses/lgpl.html
+//******************************************************
+var dbx;function dbxManager(sid){dbx = this;if(!/^[-_a-z0-9]+$/i.test(sid)) { alert('Error from dbxManager:\n"' + sid + '" is an invalid session ID'); return; }this.supported = !(document.getElementsByTagName('*').length == 0 || (navigator.vendor == 'KDE' && typeof window.sidebar == 'undefined'));if(!this.supported) { return; }this.etype = typeof document.addEventListener != 'undefined' ? 'addEventListener' : typeof document.attachEvent != 'undefined' ? 'attachEvent' : 'none';this.eprefix = (this.etype == 'attachEvent' ? 'on' : '');if(typeof window.opera != 'undefined' && parseFloat(navigator.userAgent.toLowerCase().split(/opera[\/ ]/)[1].split(' ')[0], 10) < 7.5){this.etype = 'none';}if(this.etype == 'none') { this.supported = false; return; }this.running = 0;this.sid = sid;this.savedata = {};this.cookiestate = this.getCookieState();};dbxManager.prototype.setCookieState = function(){var now = new Date();now.setTime(now.getTime() + (365*24*60*60*1000));var str = '';for(j in this.savedata){if(typeof this.savedata[j]!='function'){str += j + '=' + this.savedata[j] + '&'}}this.state = str.replace(/^(.+)&$/, '$1');if(typeof this.onstatechange == 'undefined' || this.onstatechange()){document.cookie = 'dbx-' + this.sid + '='+ this.state+ '; expires=' + now.toGMTString()+ '; path=/';}};dbxManager.prototype.getCookieState = function(){this.cookiestate = null;if(document.cookie){if(document.cookie.indexOf('dbx-' + this.sid)!=-1){this.cookie = document.cookie.split('dbx-' + this.sid + '=')[1].split('&');for(var i in this.cookie){if(typeof this.cookie[i]!='function'){this.cookie[i] = this.cookie[i].split('=');this.cookie[i][1] = this.cookie[i][1].split(',');}}this.cookiestate = {};for(i in this.cookie){if(typeof this.cookie[i]!='function'){this.cookiestate[this.cookie[i][0]] = this.cookie[i][1];}}}}return this.cookiestate;};dbxManager.prototype.addDataMember = function(gid, order){this.savedata[gid] = order;};dbxManager.prototype.createElement = function(tag){return typeof document.createElementNS != 'undefined' ? document.createElementNS('http://www.w3.org/1999/xhtml', tag) : document.createElement(tag);};dbxManager.prototype.getTarget = function(e, pattern, node){if(typeof node != 'undefined'){var target = node;}else{target = typeof e.target != 'undefined' ? e.target : e.srcElement;}var regex = new RegExp(pattern, '');while(!regex.test(target.className)){target = target.parentNode;}return target;};function dbxGroup(gid, dir, thresh, fix, ani, togs, def, open, close, move, toggle, kmove, ktoggle, syntax){if(!/^[-_a-z0-9]+$/i.test(gid)) { alert('Error from dbxGroup:\n"' + gid + '" is an invalid container ID'); return; }this.container = document.getElementById(gid);if(this.container == null || !dbx.supported) { return; }var self = this;this.gid = gid;this.dragok = false;this.box = null;this.vertical = dir == 'vertical';this.threshold = parseInt(thresh, 10);this.restrict = fix == 'yes';this.resolution = parseInt(ani, 10);this.toggles = togs == 'yes';this.defopen = def != 'closed';this.vocab = {'open' : open,'close' : close,'move' : move,'toggle' : toggle,'kmove' : kmove,'ktoggle' : ktoggle,'syntax' : syntax};this.container.style.position = 'relative';this.container.style.display = 'block';if(typeof window.opera != 'undefined'){this.container.style.display = 'run-in';}this.boxes = [];this.buttons = [];this.order = [];this.eles = this.container.getElementsByTagName('*');for(var i=0; i<this.eles.length; i++){if(/dbx\-box/i.test(this.eles[i].className) && !/dbx\-dummy/i.test(this.eles[i].className)){this.eles[i].style.position = 'relative';this.eles[i].style.display = 'block';this.boxes.push(this.eles[i]);this.eles[i].className += ' dbx-box-open';this.eles[i].className += ' dbxid' + this.order.length;this.order.push(this.order.length.toString() + '+');this.eles[i][dbx.etype](dbx.eprefix + 'mousedown', function(e){if(!e) { e = window.event; }self.mousedown(e, dbx.getTarget(e, 'dbx\-box'));}, false);}if(/dbx\-handle/i.test(this.eles[i].className)){this.eles[i].style.position = 'relative';this.eles[i].style.display = 'block';this.eles[i].className += ' dbx-handle-cursor';this.eles[i].setAttribute('title', this.eles[i].getAttribute('title') == null || this.eles[i].title == '' ? this.vocab.move : this.vocab.syntax.replace('%mytitle%', this.eles[i].title).replace('%dbxtitle%', this.vocab.move));if(this.toggles){this.buttons.push(this.addToggleBehavior(this.eles[i]));}else{this.eles[i][dbx.etype](dbx.eprefix + 'key' + (typeof document.uniqueID != 'undefined' || navigator.vendor == 'Apple Computer, Inc.' ? 'down' : 'press'), function(e){if(!e) { e = window.event; }return self.keypress(e, dbx.getTarget(e, 'dbx\-handle'));}, false);this.eles[i][dbx.etype](dbx.eprefix + 'focus', function(e){if(!e) { e = window.event; }self.createTooltip(null, dbx.getTarget(e, 'dbx\-handle'));}, false);this.eles[i][dbx.etype](dbx.eprefix + 'blur', function(){self.removeTooltip();}, false);}}}dbx.addDataMember(this.gid, this.order.join(','));var dummy = this.container.appendChild(dbx.createElement('span'));dummy.className = 'dbx-box dbx-dummy';dummy.style.display = 'block';dummy.style.width = '0';dummy.style.height = '0';dummy.style.overflow = 'hidden';if(this.vertical) { dummy.className += ' dbx-offdummy'; }this.boxes.push(dummy);if(dbx.cookiestate != null && typeof dbx.cookiestate[this.gid] != 'undefined'){var num = dbx.cookiestate[this.gid].length;if(num == this.boxes.length - 1){for(i=0; i<num; i++){var index = parseInt(dbx.cookiestate[this.gid][i], 10);this.container.insertBefore(this.boxes[index], dummy);if(this.toggles && dbx.cookiestate[this.gid][i].charAt(1) == '-'){this.toggleBoxState(this.buttons[index], false);}}this.getBoxOrder();}}else if(!this.defopen && this.toggles){var len = this.buttons.length;for(i=0; i<len; i++){this.toggleBoxState(this.buttons[i], true);}}document[dbx.etype](dbx.eprefix + 'mouseout', function(e){if(typeof e.target == 'undefined') { e = window.event; e.relatedTarget = e.toElement; }if(e.relatedTarget == null){self.mouseup(e);}}, false);document[dbx.etype](dbx.eprefix + 'mousemove', function(e){self.mousemove(e);}, false);document[dbx.etype](dbx.eprefix + 'mouseup', function(e){self.mouseup(e);}, false);this.keydown = false;document[dbx.etype](dbx.eprefix + 'keydown', function(){self.keydown = true;}, false);document[dbx.etype](dbx.eprefix + 'keyup', function(){self.keydown = false;}, false);};dbxGroup.prototype.addToggleBehavior = function(){var self = this;var button = arguments[0].appendChild(dbx.createElement('a'));button.appendChild(document.createTextNode('\u00a0'));button.style.cursor = 'pointer';button.href = 'javascript:void(null)';button.className = 'dbx-toggle dbx-toggle-open';button.setAttribute('title', this.vocab.toggle.replace('%toggle%', this.vocab.close));button.hasfocus = typeof window.opera != 'undefined' || navigator.vendor == 'Apple Computer, Inc.' ? null : false;this.tooltip = null;button.onclick = function(){if(this.hasfocus === true || this.hasfocus === null){self.removeTooltip();self.toggleBoxState(this, true);}};button['onkey' + (typeof document.uniqueID != 'undefined' || navigator.vendor == 'Apple Computer, Inc.' ? 'down' : 'press')] = function(e){if(!e) { e = window.event; }return self.keypress(e, this);};button.onfocus = function(){var len = self.buttons.length;for(var i=0; i<len; i++){self.buttons[i].className = self.buttons[i].className.replace(/[ ](dbx\-toggle\-hilite\-)(open|closed)/, '');}var isopen = (/dbx\-toggle\-open/.test(this.className));this.className += ' dbx-toggle-hilite-' + (isopen ? 'open' : 'closed');self.createTooltip(isopen, this);this.isactive = true;if(this.hasfocus !== null) { this.hasfocus = true; }};button.onblur = function(){this.className = this.className.replace(/[ ](dbx\-toggle\-hilite\-)(open|closed)/, '');self.removeTooltip();if(this.hasfocus !== null) { this.hasfocus = false; }};return button;};dbxGroup.prototype.toggleBoxState = function(button, regen){var isopen = (/dbx\-toggle\-open/.test(button.className));var parent = dbx.getTarget(null, 'dbx\-box', button);dbx.box = parent;dbx.toggle = button;if(typeof dbx.container == 'undefined'){dbx.group = dbx.getTarget(null, 'dbx\-group', parent);}else { dbx.group = dbx.container; }if((!isopen && (typeof dbx.onboxopen == 'undefined' || dbx.onboxopen()))||(isopen && (typeof dbx.onboxclose == 'undefined' || dbx.onboxclose()))){button.className = 'dbx-toggle dbx-toggle-' + (isopen ? 'closed' : 'open');button.title = this.vocab.toggle.replace('%toggle%', isopen ? this.vocab.open : this.vocab.close);if(typeof button.isactive != 'undefined'){button.className += ' dbx-toggle-hilite-' + (isopen ? 'closed' : 'open')}parent.className = parent.className.replace(/[ ](dbx-box-)(open|closed)/, ' $1' + (isopen ? 'closed' : 'open'));if(regen) { this.getBoxOrder(); }}};dbxGroup.prototype.shiftBoxPosition = function(e, anchor, positive){var parent = dbx.getTarget(null, 'dbx\-box', anchor);dbx.group = this.container;dbx.box = parent;dbx.event = e;if(typeof dbx.onboxdrag == 'undefined' || dbx.onboxdrag()){var positions = [];var len = this.boxes.length;for(var i=0; i<len; i++){positions[i] = [i, this.boxes[i][this.vertical ? 'offsetTop' : 'offsetLeft']];if(parent == this.boxes[i]) { this.idref = i; }}positions.sort(this.compare);for(i=0; i<len; i++){if(positions[i][0] == this.idref){if((positive && i < len - 2) || (!positive && i > 0)){var sibling = this.boxes[positions[i + (positive ? 1 : -1)][0]];if(this.resolution > 0){var visipos = { 'x' : parent.offsetLeft, 'y' : parent.offsetTop };var siblingpos = { 'x' : sibling.offsetLeft, 'y' : sibling.offsetTop };}var obj = { 'insert' : (positive ? sibling : parent), 'before' : (positive ? parent : sibling) };this.container.insertBefore(obj.insert, obj.before);if(this.resolution > 0){var animators ={'sibling' : new dbxAnimator(this, sibling, siblingpos, this.resolution, true, anchor),'parent' : new dbxAnimator(this, parent, visipos, this.resolution, true, anchor)};}else{anchor.focus();}break;}}}this.getBoxOrder();}};dbxGroup.prototype.compare = function(a, b){return a[1] - b[1];};dbxGroup.prototype.createTooltip = function(isopen, anchor){if(this.keydown){this.tooltip = this.container.appendChild(dbx.createElement('span'));this.tooltip.style.visibility = 'hidden';this.tooltip.className = 'dbx-tooltip';if(isopen != null){this.tooltip.appendChild(document.createTextNode(this.vocab.kmove + this.vocab.ktoggle.replace('%toggle%', isopen ? this.vocab.close : this.vocab.open)));}else{this.tooltip.appendChild(document.createTextNode(this.vocab.kmove));}var parent = dbx.getTarget(null, 'dbx\-box', anchor);this.tooltip.style.left = parent.offsetLeft + 'px';this.tooltip.style.top = parent.offsetTop + 'px';var tooltip = this.tooltip;window.setTimeout(function(){if(tooltip != null) { tooltip.style.visibility = 'visible'; }}, 500);}};dbxGroup.prototype.removeTooltip = function(){if(this.tooltip != null){this.tooltip.parentNode.removeChild(this.tooltip);this.tooltip = null;}};dbxGroup.prototype.mousedown = function(e, box){var node = typeof e.target != 'undefined' ? e.target : e.srcElement;if(node.nodeName == '#text') { node = node.parentNode; }if(!/dbx\-(toggle|box|group)/i.test(node.className)){while(!/dbx\-(handle|box|group)/i.test(node.className)){node = node.parentNode;}}if(/dbx\-handle/i.test(node.className)){this.removeTooltip();this.released = false;this.initial = { 'x' : e.clientX, 'y' : e.clientY };this.current = { 'x' : 0, 'y' : 0 };this.createCloneBox(box);if(typeof e.preventDefault != 'undefined' ) { e.preventDefault(); }if(typeof document.onselectstart != 'undefined'){document.onselectstart = function() { return false; }}}};dbxGroup.prototype.mousemove = function(e){if(this.dragok && this.box != null){this.positive = this.vertical ? (e.clientY > this.current.y ? true : false) : (e.clientX > this.current.x ? true : false);this.current = { 'x' : e.clientX, 'y' : e.clientY };var overall = { 'x' : this.current.x - this.initial.x, 'y' : this.current.y - this.initial.y };if(((overall.x >= 0 && overall.x <= this.threshold) || (overall.x <= 0 && overall.x >= 0 - this.threshold))&&((overall.y >= 0 && overall.y <= this.threshold) || (overall.y <= 0 && overall.y >= 0 - this.threshold))){this.current.x -= overall.x;this.current.y -= overall.y;}if(this.released || overall.x > this.threshold || overall.x < (0 - this.threshold) || overall.y > this.threshold || overall.y < (0 - this.threshold)){dbx.group = this.container;dbx.box = this.box;dbx.event = e;if(typeof dbx.onboxdrag == 'undefined' || dbx.onboxdrag()){this.released = true;if(!this.restrict || !this.vertical) { this.boxclone.style.left = (this.current.x - this.difference.x) + 'px'; }if(!this.restrict || this.vertical) { this.boxclone.style.top = (this.current.y - this.difference.y) + 'px'; }this.moveOriginalToPosition(this.current.x, this.current.y);if(typeof e.preventDefault != 'undefined' ) { e.preventDefault(); }}}}return true;};dbxGroup.prototype.mouseup = function(e){if(this.box != null){this.moveOriginalToPosition(e.clientX, e.clientY);this.removeCloneBox();this.getBoxOrder();if(typeof document.onselectstart != 'undefined'){document.onselectstart = function() { return true; }}}this.dragok = false;};dbxGroup.prototype.keypress = function(e, anchor){if(/^(3[7-9])|(40)$/.test(e.keyCode)){this.removeTooltip();if((this.vertical && /^(38|40)$/.test(e.keyCode)) || (!this.vertical && /^(37|39)$/.test(e.keyCode))){this.shiftBoxPosition(e, anchor, /^[3][78]$/.test(e.keyCode) ? false : true);if(typeof e.preventDefault != 'undefined') { e.preventDefault(); }else { return false; }typeof e.stopPropagation != 'undefined' ? e.stopPropagation() : e.cancelBubble = true;this.keydown = false;}}return true;};dbxGroup.prototype.getBoxOrder = function(){this.order = [];var len = this.eles.length;for(var j=0; j<len; j++){if(/dbx\-box/i.test(this.eles[j].className) && !/dbx\-(clone|dummy)/i.test(this.eles[j].className)){this.order.push(this.eles[j].className.split('dbxid')[1] + (/dbx\-box\-open/i.test(this.eles[j].className) ? '+' : '-'));}}dbx.savedata[this.gid] = this.order.join(',');dbx.setCookieState();};dbxGroup.prototype.createClone = function(){var clone = this.container.appendChild(arguments[0].cloneNode(true));clone.className += ' dbx-clone';clone.style.position = 'absolute';clone.style.visibility = 'hidden';clone.style.zIndex = arguments[1];clone.style.left = arguments[2].x + 'px';clone.style.top = arguments[2].y + 'px';clone.style.width = arguments[0].offsetWidth + 'px';clone.style.height = arguments[0].offsetHeight + 'px';return clone;};dbxGroup.prototype.createCloneBox = function(box){this.box = box;this.position = { 'x' : this.box.offsetLeft, 'y' : this.box.offsetTop };this.difference = { 'x' : (this.initial.x - this.position.x), 'y' : (this.initial.y - this.position.y) };this.boxclone = this.createClone(this.box, 30000, this.position);this.boxclone.style.cursor = 'move';this.dragok = true;};dbxGroup.prototype.removeCloneBox = function(){this.container.removeChild(this.boxclone);this.box.style.visibility = 'visible';this.box = null;};dbxGroup.prototype.moveOriginalToPosition = function(clientX, clientY){var cloneprops = {'xy' : this.vertical ? clientY - this.difference.y : clientX - this.difference.x,'wh' : this.vertical ? this.boxclone.offsetHeight : this.boxclone.offsetWidth};this.box.style.visibility = 'hidden';this.boxclone.style.visibility = 'visible';var len = this.boxes.length;for(var i=0; i<len; i++){var boxprops = {'xy' : this.vertical ? this.boxes[i].offsetTop : this.boxes[i].offsetLeft,'wh' : this.vertical ? this.boxes[i].offsetHeight : this.boxes[i].offsetWidth};if((this.positive && cloneprops.xy + cloneprops.wh > boxprops.xy && cloneprops.xy < boxprops.xy)||(!this.positive && cloneprops.xy < boxprops.xy && cloneprops.xy + cloneprops.wh > boxprops.xy)){if(this.boxes[i] == this.box) { return; }var sibling = this.box.nextSibling;while(sibling.className == null || !/dbx\-box/.test(sibling.className)){sibling = sibling.nextSibling;}if(this.boxes[i] == sibling) { return; }if(this.resolution > 0){if(this.box[this.vertical ? 'offsetTop' : 'offsetLeft'] < boxprops.xy){var visibox = this.boxes[i].previousSibling;while(visibox.className == null || !/dbx\-box/.test(visibox.className)){visibox = visibox.previousSibling;}}else{visibox = this.boxes[i];}var visipos = { 'x' : visibox.offsetLeft, 'y' : visibox.offsetTop };}var prepos = { 'x' : this.box.offsetLeft, 'y' : this.box.offsetTop };this.container.insertBefore(this.box, this.boxes[i]);this.initial.x += (this.box.offsetLeft - prepos.x);this.initial.y += (this.box.offsetTop - prepos.y);if(this.resolution > 0 && visibox != this.box){var animator = new dbxAnimator(this, visibox, visipos, this.resolution, false, null);}else{}break;}}};function dbxAnimator(caller, box, pos, res, kbd, anchor){this.caller = caller;this.box = box;this.timer = null;var before = pos[this.caller.vertical ? 'y' : 'x'];var after = this.box[this.caller.vertical ? 'offsetTop' : 'offsetLeft'];if(before != after){if(dbx.running > this.caller.boxes.length - 1) { return; }var clone = this.caller.createClone(this.box, 29999, arguments[2]);clone.style.visibility = 'visible';this.box.style.visibility = 'hidden';this.animateClone(clone,before,after > before ? after - before : 0 - (before - after),this.caller.vertical ? 'top' : 'left',res,kbd,anchor);}};dbxAnimator.prototype.animateClone = function(clone, current, change, dir, res, kbd, anchor){var self = this;var count = 0;dbx.running ++;this.timer = window.setInterval(function(){count ++;current += change / res;clone.style[dir] = current + 'px';if(count == res){window.clearTimeout(self.timer);self.timer = null;dbx.running --;self.caller.container.removeChild(clone);self.box.style.visibility = 'visible';if(kbd){if(anchor != null && anchor.parentNode.style.visibility != 'hidden'){anchor.focus();}else if(self.caller.toggles){var button = self.caller.buttons[parseInt(self.box.className.split('dbxid')[1],10)];if(button != null && typeof button.isactive != 'undefined'){button.focus();}}}}}, 20);};if(typeof window.attachEvent != 'undefined'){window.attachEvent('onunload', function(){var ev = ['mousedown', 'mousemove', 'mouseup', 'mouseout', 'click', 'keydown', 'keyup', 'focus', 'blur', 'selectstart', 'statechange', 'boxdrag', 'boxopen', 'boxclose'];var el = ev.length;var dl = document.all.length;for(var i=0; i<dl; i++){for(var j=0; j<el; j++){document.all[i]['on' + ev[j]] = null;}}});}
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/js/dbx-key.js 2.0.4/wp-includes/js/dbx-key.js
--- 1.5.2/wp-includes/js/dbx-key.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/dbx-key.js	2005-12-15 15:48:12.000000000 -0600
@@ -0,0 +1,39 @@
+
+//initialisation function
+addLoadEvent( function()
+{
+	//create new docking boxes group
+	var meta = new dbxGroup(
+		'grabit', 		// container ID [/-_a-zA-Z0-9/]
+		'vertical', 	// orientation ['vertical'|'horizontal']
+		'10', 			// drag threshold ['n' pixels]
+		'no',			// restrict drag movement to container axis ['yes'|'no']
+		'10', 			// animate re-ordering [frames per transition, or '0' for no effect]
+		'yes', 			// include open/close toggle buttons ['yes'|'no']
+		'closed', 		// default state ['open'|'closed']
+		'open', 		// word for "open", as in "open this box"
+		'close', 		// word for "close", as in "close this box"
+		'click-down and drag to move this box', // sentence for "move this box" by mouse
+		'click to %toggle% this box', // pattern-match sentence for "(open|close) this box" by mouse
+		'use the arrow keys to move this box', // sentence for "move this box" by keyboard
+		', or press the enter key to %toggle% it',  // pattern-match sentence-fragment for "(open|close) this box" by keyboard
+		'%mytitle%  [%dbxtitle%]' // pattern-match syntax for title-attribute conflicts
+		);
+
+	var advanced = new dbxGroup(
+		'advancedstuff', 		// container ID [/-_a-zA-Z0-9/]
+		'vertical', 		// orientation ['vertical'|'horizontal']
+		'10', 			// drag threshold ['n' pixels]
+		'yes',			// restrict drag movement to container axis ['yes'|'no']
+		'10', 			// animate re-ordering [frames per transition, or '0' for no effect]
+		'yes', 			// include open/close toggle buttons ['yes'|'no']
+		'closed', 		// default state ['open'|'closed']
+		'open', 		// word for "open", as in "open this box"
+		'close', 		// word for "close", as in "close this box"
+		'click-down and drag to move this box', // sentence for "move this box" by mouse
+		'click to %toggle% this box', // pattern-match sentence for "(open|close) this box" by mouse
+		'use the arrow keys to move this box', // sentence for "move this box" by keyboard
+		', or press the enter key to %toggle% it',  // pattern-match sentence-fragment for "(open|close) this box" by keyboard
+		'%mytitle%  [%dbxtitle%]' // pattern-match syntax for title-attribute conflicts
+		);
+});
diff -ruN 1.5.2/wp-includes/js/fat.js 2.0.4/wp-includes/js/fat.js
--- 1.5.2/wp-includes/js/fat.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/fat.js	2005-08-27 13:48:56.000000000 -0500
@@ -0,0 +1,90 @@
+// @name      The Fade Anything Technique
+// @namespace http://www.axentric.com/aside/fat/
+// @version   1.0-RC1
+// @author    Adam Michela
+
+var Fat = {
+	make_hex : function (r,g,b) 
+	{
+		r = r.toString(16); if (r.length == 1) r = '0' + r;
+		g = g.toString(16); if (g.length == 1) g = '0' + g;
+		b = b.toString(16); if (b.length == 1) b = '0' + b;
+		return "#" + r + g + b;
+	},
+	fade_all : function ()
+	{
+		var a = document.getElementsByTagName("*");
+		for (var i = 0; i < a.length; i++) 
+		{
+			var o = a[i];
+			var r = /fade-?(\w{3,6})?/.exec(o.className);
+			if (r)
+			{
+				if (!r[1]) r[1] = "";
+				if (o.id) Fat.fade_element(o.id,null,null,"#"+r[1]);
+			}
+		}
+	},
+	fade_element : function (id, fps, duration, from, to) 
+	{
+		if (!fps) fps = 30;
+		if (!duration) duration = 3000;
+		if (!from || from=="#") from = "#FFFF33";
+		if (!to) to = this.get_bgcolor(id);
+		
+		var frames = Math.round(fps * (duration / 1000));
+		var interval = duration / frames;
+		var delay = interval;
+		var frame = 0;
+		
+		if (from.length < 7) from += from.substr(1,3);
+		if (to.length < 7) to += to.substr(1,3);
+		
+		var rf = parseInt(from.substr(1,2),16);
+		var gf = parseInt(from.substr(3,2),16);
+		var bf = parseInt(from.substr(5,2),16);
+		var rt = parseInt(to.substr(1,2),16);
+		var gt = parseInt(to.substr(3,2),16);
+		var bt = parseInt(to.substr(5,2),16);
+		
+		var r,g,b,h;
+		while (frame < frames)
+		{
+			r = Math.floor(rf * ((frames-frame)/frames) + rt * (frame/frames));
+			g = Math.floor(gf * ((frames-frame)/frames) + gt * (frame/frames));
+			b = Math.floor(bf * ((frames-frame)/frames) + bt * (frame/frames));
+			h = this.make_hex(r,g,b);
+		
+			setTimeout("Fat.set_bgcolor('"+id+"','"+h+"')", delay);
+
+			frame++;
+			delay = interval * frame; 
+		}
+		setTimeout("Fat.set_bgcolor('"+id+"','"+to+"')", delay);
+	},
+	set_bgcolor : function (id, c)
+	{
+		var o = document.getElementById(id);
+		o.style.backgroundColor = c;
+	},
+	get_bgcolor : function (id)
+	{
+		var o = document.getElementById(id);
+		while(o)
+		{
+			var c;
+			if (window.getComputedStyle) c = window.getComputedStyle(o,null).getPropertyValue("background-color");
+			if (o.currentStyle) c = o.currentStyle.backgroundColor;
+			if ((c != "" && c != "transparent") || o.tagName == "BODY") { break; }
+			o = o.parentNode;
+		}
+		if (c == undefined || c == "" || c == "transparent") c = "#FFFFFF";
+		var rgb = c.match(/rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/);
+		if (rgb) c = this.make_hex(parseInt(rgb[1]),parseInt(rgb[2]),parseInt(rgb[3]));
+		return c;
+	}
+}
+
+addLoadEvent(function ()  {
+	Fat.fade_all();
+});
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/js/quicktags.js 2.0.4/wp-includes/js/quicktags.js
--- 1.5.2/wp-includes/js/quicktags.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/quicktags.js	2005-12-09 13:24:14.000000000 -0600
@@ -0,0 +1,389 @@
+// new edit toolbar used with permission
+// by Alex King
+// http://www.alexking.org/
+
+var edButtons = new Array();
+var edLinks = new Array();
+var edOpenTags = new Array();
+
+function edButton(id, display, tagStart, tagEnd, access, open) {
+	this.id = id;				// used to name the toolbar button
+	this.display = display;		// label on button
+	this.tagStart = tagStart; 	// open tag
+	this.tagEnd = tagEnd;		// close tag
+	this.access = access;		// access key
+	this.open = open;			// set to -1 if tag does not need to be closed
+}
+
+function zeroise(number, threshold) {
+	// FIXME: or we could use an implementation of printf in js here
+	var str = number.toString();
+	if (number < 0) { str = str.substr(1, str.length) }
+	while (str.length < threshold) { str = "0" + str }
+	if (number < 0) { str = '-' + str }
+	return str;
+}
+
+var now = new Date();
+var datetime = now.getUTCFullYear() + '-' + 
+zeroise(now.getUTCMonth() + 1, 2) + '-' +
+zeroise(now.getUTCDate(), 2) + 'T' + 
+zeroise(now.getUTCHours(), 2) + ':' + 
+zeroise(now.getUTCMinutes(), 2) + ':' + 
+zeroise(now.getUTCSeconds() ,2) +
+'+00:00';
+
+edButtons[edButtons.length] = 
+new edButton('ed_strong'
+,'b'
+,'<strong>'
+,'</strong>'
+,'b'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_em'
+,'i'
+,'<em>'
+,'</em>'
+,'i'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_link'
+,'link'
+,''
+,'</a>'
+,'a'
+); // special case
+
+edButtons[edButtons.length] = 
+new edButton('ed_block'
+,'b-quote'
+,'\n\n<blockquote>'
+,'</blockquote>\n\n'
+,'q'
+);
+
+
+edButtons[edButtons.length] = 
+new edButton('ed_del'
+,'del'
+,'<del datetime="' + datetime + '">'
+,'</del>'
+,'d'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_ins'
+,'ins'
+,'<ins datetime="' + datetime + '">'
+,'</ins>'
+,'s'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_img'
+,'img'
+,''
+,''
+,'m'
+,-1
+); // special case
+
+edButtons[edButtons.length] = 
+new edButton('ed_ul'
+,'ul'
+,'<ul>\n'
+,'</ul>\n\n'
+,'u'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_ol'
+,'ol'
+,'<ol>\n'
+,'</ol>\n\n'
+,'o'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_li'
+,'li'
+,'\t<li>'
+,'</li>\n'
+,'l'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_code'
+,'code'
+,'<code>'
+,'</code>'
+,'c'
+);
+
+edButtons[edButtons.length] = 
+new edButton('ed_more'
+,'more'
+,'<!--more-->'
+,''
+,'t'
+,-1
+);
+/*
+edButtons[edButtons.length] = 
+new edButton('ed_next'
+,'page'
+,'<!--nextpage-->'
+,''
+,'p'
+,-1
+);
+*/
+function edLink() {
+	this.display = '';
+	this.URL = '';
+	this.newWin = 0;
+}
+
+edLinks[edLinks.length] = new edLink('WordPress'
+                                    ,'http://wordpress.org/'
+                                    );
+
+edLinks[edLinks.length] = new edLink('alexking.org'
+                                    ,'http://www.alexking.org/'
+                                    );
+
+function edShowButton(button, i) {
+	if (button.id == 'ed_img') {
+		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage(edCanvas);" value="' + button.display + '" />');
+	}
+	else if (button.id == 'ed_link') {
+		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
+	}
+	else {
+		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '"  />');
+	}
+}
+
+function edShowLinks() {
+	var tempStr = '<select onchange="edQuickLink(this.options[this.selectedIndex].value, this);"><option value="-1" selected>(Quick Links)</option>';
+	for (i = 0; i < edLinks.length; i++) {
+		tempStr += '<option value="' + i + '">' + edLinks[i].display + '</option>';
+	}
+	tempStr += '</select>';
+	document.write(tempStr);
+}
+
+function edAddTag(button) {
+	if (edButtons[button].tagEnd != '') {
+		edOpenTags[edOpenTags.length] = button;
+		document.getElementById(edButtons[button].id).value = '/' + document.getElementById(edButtons[button].id).value;
+	}
+}
+
+function edRemoveTag(button) {
+	for (i = 0; i < edOpenTags.length; i++) {
+		if (edOpenTags[i] == button) {
+			edOpenTags.splice(i, 1);
+			document.getElementById(edButtons[button].id).value = 		document.getElementById(edButtons[button].id).value.replace('/', '');
+		}
+	}
+}
+
+function edCheckOpenTags(button) {
+	var tag = 0;
+	for (i = 0; i < edOpenTags.length; i++) {
+		if (edOpenTags[i] == button) {
+			tag++;
+		}
+	}
+	if (tag > 0) {
+		return true; // tag found
+	}
+	else {
+		return false; // tag not found
+	}
+}	
+
+function edCloseAllTags() {
+	var count = edOpenTags.length;
+	for (o = 0; o < count; o++) {
+		edInsertTag(edCanvas, edOpenTags[edOpenTags.length - 1]);
+	}
+}
+
+function edQuickLink(i, thisSelect) {
+	if (i > -1) {
+		var newWin = '';
+		if (edLinks[i].newWin == 1) {
+			newWin = ' target="_blank"';
+		}
+		var tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>' 
+		            + edLinks[i].display
+		            + '</a>';
+		thisSelect.selectedIndex = 0;
+		edInsertContent(edCanvas, tempStr);
+	}
+	else {
+		thisSelect.selectedIndex = 0;
+	}
+}
+
+function edSpell(myField) {
+	var word = '';
+	if (document.selection) {
+		myField.focus();
+	    var sel = document.selection.createRange();
+		if (sel.text.length > 0) {
+			word = sel.text;
+		}
+	}
+	else if (myField.selectionStart || myField.selectionStart == '0') {
+		var startPos = myField.selectionStart;
+		var endPos = myField.selectionEnd;
+		if (startPos != endPos) {
+			word = myField.value.substring(startPos, endPos);
+		}
+	}
+	if (word == '') {
+		word = prompt('Enter a word to look up:', '');
+	}
+	if (word !== null && /^\w[\w ]*$/.test(word)) {
+		window.open('http://www.answers.com/' + escape(word));
+	}
+}
+
+function edToolbar() {
+	document.write('<div id="ed_toolbar">');
+	for (i = 0; i < edButtons.length; i++) {
+		edShowButton(edButtons[i], i);
+	}
+	document.write('<input type="button" id="ed_spell" class="ed_button" onclick="edSpell(edCanvas);" title="Dictionary lookup" value="lookup" />');
+	document.write('<input type="button" id="ed_close" class="ed_button" onclick="edCloseAllTags();" title="Close all open tags" value="Close Tags" />');
+//	edShowLinks(); // disabled by default
+	document.write('</div>');
+}
+
+// insertion code
+
+function edInsertTag(myField, i) {
+	//IE support
+	if (document.selection) {
+		myField.focus();
+	    sel = document.selection.createRange();
+		if (sel.text.length > 0) {
+			sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
+		}
+		else {
+			if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
+				sel.text = edButtons[i].tagStart;
+				edAddTag(i);
+			}
+			else {
+				sel.text = edButtons[i].tagEnd;
+				edRemoveTag(i);
+			}
+		}
+		myField.focus();
+	}
+	//MOZILLA/NETSCAPE support
+	else if (myField.selectionStart || myField.selectionStart == '0') {
+		var startPos = myField.selectionStart;
+		var endPos = myField.selectionEnd;
+		var cursorPos = endPos;
+		var scrollTop = myField.scrollTop;
+
+		if (startPos != endPos) {
+			myField.value = myField.value.substring(0, startPos)
+			              + edButtons[i].tagStart
+			              + myField.value.substring(startPos, endPos) 
+			              + edButtons[i].tagEnd
+			              + myField.value.substring(endPos, myField.value.length);
+			cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
+		}
+		else {
+			if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
+				myField.value = myField.value.substring(0, startPos) 
+				              + edButtons[i].tagStart
+				              + myField.value.substring(endPos, myField.value.length);
+				edAddTag(i);
+				cursorPos = startPos + edButtons[i].tagStart.length;
+			}
+			else {
+				myField.value = myField.value.substring(0, startPos) 
+				              + edButtons[i].tagEnd
+				              + myField.value.substring(endPos, myField.value.length);
+				edRemoveTag(i);
+				cursorPos = startPos + edButtons[i].tagEnd.length;
+			}
+		}
+		myField.focus();
+		myField.selectionStart = cursorPos;
+		myField.selectionEnd = cursorPos;
+		myField.scrollTop = scrollTop;
+	}
+	else {
+		if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
+			myField.value += edButtons[i].tagStart;
+			edAddTag(i);
+		}
+		else {
+			myField.value += edButtons[i].tagEnd;
+			edRemoveTag(i);
+		}
+		myField.focus();
+	}
+}
+
+function edInsertContent(myField, myValue) {
+	//IE support
+	if (document.selection) {
+		myField.focus();
+		sel = document.selection.createRange();
+		sel.text = myValue;
+		myField.focus();
+	}
+	//MOZILLA/NETSCAPE support
+	else if (myField.selectionStart || myField.selectionStart == '0') {
+		var startPos = myField.selectionStart;
+		var endPos = myField.selectionEnd;
+		myField.value = myField.value.substring(0, startPos)
+		              + myValue 
+                      + myField.value.substring(endPos, myField.value.length);
+		myField.focus();
+		myField.selectionStart = startPos + myValue.length;
+		myField.selectionEnd = startPos + myValue.length;
+	} else {
+		myField.value += myValue;
+		myField.focus();
+	}
+}
+
+function edInsertLink(myField, i, defaultValue) {
+	if (!defaultValue) {
+		defaultValue = 'http://';
+	}
+	if (!edCheckOpenTags(i)) {
+		var URL = prompt('Enter the URL' ,defaultValue);
+		if (URL) {
+			edButtons[i].tagStart = '<a href="' + URL + '">';
+			edInsertTag(myField, i);
+		}
+	}
+	else {
+		edInsertTag(myField, i);
+	}
+}
+
+function edInsertImage(myField) {
+	var myValue = prompt('Enter the URL of the image', 'http://');
+	if (myValue) {
+		myValue = '<img src="' 
+				+ myValue 
+				+ '" alt="' + prompt('Enter a description of the image', '') 
+				+ '" />';
+		edInsertContent(myField, myValue);
+	}
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/blank.htm 2.0.4/wp-includes/js/tinymce/blank.htm
--- 1.5.2/wp-includes/js/tinymce/blank.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/blank.htm	2005-09-26 01:52:30.000000000 -0500
@@ -0,0 +1,9 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>blank_page</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body class="mceContentBody">
+
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/langs/en.js 2.0.4/wp-includes/js/tinymce/langs/en.js
--- 1.5.2/wp-includes/js/tinymce/langs/en.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/langs/en.js	2006-03-04 17:01:33.000000000 -0600
@@ -0,0 +1,47 @@
+// UK lang variables
+
+if (navigator.userAgent.indexOf('Mac OS') != -1) {
+// Mac OS browsers use Ctrl to hit accesskeys
+	var metaKey = 'Ctrl';
+}
+else {
+	var metaKey = 'Alt';
+}
+
+tinyMCELang['lang_bold_desc'] = 'Bold (' + metaKey + '+b)';
+tinyMCELang['lang_italic_desc'] = 'Italic (' + metaKey + '+i)';
+tinyMCELang['lang_underline_desc'] = 'Underline';
+tinyMCELang['lang_striketrough_desc'] = 'Striketrough (' + metaKey + '-d)';
+tinyMCELang['lang_justifyleft_desc'] = 'Align left (' + metaKey + '-f)';
+tinyMCELang['lang_justifycenter_desc'] = 'Align center (' + metaKey + '-c)';
+tinyMCELang['lang_justifyright_desc'] = 'Align right (' + metaKey + '-r)';
+tinyMCELang['lang_justifyfull_desc'] = 'Align full';
+tinyMCELang['lang_bullist_desc'] = 'Unordered list (' + metaKey + '-l)';
+tinyMCELang['lang_numlist_desc'] = 'Ordered list (' + metaKey + '-o)';
+tinyMCELang['lang_outdent_desc'] = 'Outdent (' + metaKey + '-w)';
+tinyMCELang['lang_indent_desc'] = 'Indent/Blockquote (' + metaKey + '-q)';
+tinyMCELang['lang_undo_desc'] = 'Undo (' + metaKey + '-u)';
+tinyMCELang['lang_redo_desc'] = 'Redo (' + metaKey + '-y)';
+tinyMCELang['lang_link_desc'] = 'Insert/edit link (' + metaKey + '-a)';
+tinyMCELang['lang_unlink_desc'] = 'Unlink (' + metaKey + '-s)';
+tinyMCELang['lang_image_desc'] = 'Insert/edit image (' + metaKey + '-m)';
+tinyMCELang['lang_cleanup_desc'] = 'Cleanup messy code';
+tinyMCELang['lang_focus_alert'] = 'A editor instance must be focused before using this command.';
+tinyMCELang['lang_edit_confirm'] = 'Do you want to use the WYSIWYG mode for this textarea?';
+tinyMCELang['lang_insert_link_title'] = 'Insert/edit link';
+tinyMCELang['lang_insert'] = 'Insert';
+tinyMCELang['lang_update'] = 'Update';
+tinyMCELang['lang_cancel'] = 'Cancel';
+tinyMCELang['lang_insert_link_url'] = 'Link URL';
+tinyMCELang['lang_insert_link_target'] = 'Target';
+tinyMCELang['lang_insert_link_target_same'] = 'Open link in the same window';
+tinyMCELang['lang_insert_link_target_blank'] = 'Open link in a new window';
+tinyMCELang['lang_insert_image_title'] = 'Insert/edit image';
+tinyMCELang['lang_insert_image_src'] = 'Image URL';
+tinyMCELang['lang_insert_image_alt'] = 'Image description';
+tinyMCELang['lang_help_desc'] = 'Help';
+tinyMCELang['lang_bold_img'] = "bold.gif";
+tinyMCELang['lang_italic_img'] = "italic.gif";
+tinyMCELang['lang_underline_img'] = "underline.gif";
+tinyMCELang['lang_clipboard_msg'] = 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?';
+tinyMCELang['lang_popup_blocked'] = 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.';
diff -ruN 1.5.2/wp-includes/js/tinymce/license.html 2.0.4/wp-includes/js/tinymce/license.html
--- 1.5.2/wp-includes/js/tinymce/license.html	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/license.html	2005-11-17 11:47:29.000000000 -0600
@@ -0,0 +1,465 @@
+<!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>
+<title>TinyMCE License (LGPL)</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+	<h1>TinyMCE License (LGPL)</h1>
+</div>
+
+<div class="content">
+<p>
+Visit the <a href="faq.html">FAQ</a> for general answers surrounding TinyMCE. Or visit <a href="http://www.fsf.org" target="_blank">http://www.fsf.org</a> for more information about Open-Source licenses.
+</p>
+<pre>
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+.
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+.
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+.
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+.
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+.
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+.
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+.
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+.
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+</pre>
+</div>
+
+<div class="footer">
+	<div class="helpindexlink"><a href="index.html">Index</a></div>
+	<div class="copyright">Copyright &copy; 2005 Moxiecode Systems AB</div>
+	<br style="clear: both" />
+</div>
+
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/license.txt 2.0.4/wp-includes/js/tinymce/license.txt
--- 1.5.2/wp-includes/js/tinymce/license.txt	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/license.txt	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,437 @@
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+.
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+.
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+.
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+.
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+.
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+.
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+.
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+.
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js 2.0.4/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js
--- 1.5.2/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js	2005-11-05 21:30:11.000000000 -0600
@@ -0,0 +1,2 @@
+/* Import plugin specific language pack */
+ tinyMCE.importPluginLanguagePack('autosave','en,sv,cs,he,no,hu,de,da,ru,ru_KOI8-R,ru_UTF-8,fi,cy,es,is,pl');function TinyMCE_autosave_getInfo(){return{longname:'Auto save',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_autosave_beforeUnloadHandler(){var msg=tinyMCE.getLang("lang_autosave_unload_msg");var anyDirty=false;for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.isDirty())return msg;}return;}window.onbeforeunload=TinyMCE_autosave_beforeUnloadHandler;
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js 2.0.4/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js
--- 1.5.2/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js	2005-11-05 21:30:11.000000000 -0600
@@ -0,0 +1,30 @@
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('autosave', 'en,sv,cs,he,no,hu,de,da,ru,ru_KOI8-R,ru_UTF-8,fi,cy,es,is,pl');
+
+function TinyMCE_autosave_getInfo() {
+	return {
+		longname : 'Auto save',
+		author : 'Moxiecode Systems',
+		authorurl : 'http://tinymce.moxiecode.com',
+		infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html',
+		version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+	};
+};
+
+function TinyMCE_autosave_beforeUnloadHandler() {
+	var msg = tinyMCE.getLang("lang_autosave_unload_msg");
+
+	var anyDirty = false;
+	for (var n in tinyMCE.instances) {
+		var inst = tinyMCE.instances[n];
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		if (inst.isDirty())
+			return msg;
+	}
+
+	return;
+}
+
+window.onbeforeunload = TinyMCE_autosave_beforeUnloadHandler;
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/autosave/langs/en.js 2.0.4/wp-includes/js/tinymce/plugins/autosave/langs/en.js
--- 1.5.2/wp-includes/js/tinymce/plugins/autosave/langs/en.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/autosave/langs/en.js	2005-09-26 01:52:30.000000000 -0500
@@ -0,0 +1,5 @@
+// EN lang variables
+
+tinyMCE.addToLang('',{
+autosave_unload_msg : 'The changes you made will be lost if you navigate away from this page.'
+});
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/autosave/readme.txt 2.0.4/wp-includes/js/tinymce/plugins/autosave/readme.txt
--- 1.5.2/wp-includes/js/tinymce/plugins/autosave/readme.txt	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/autosave/readme.txt	2005-09-26 01:52:30.000000000 -0500
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js 2.0.4/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js
--- 1.5.2/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js	2005-11-30 11:15:43.000000000 -0600
@@ -0,0 +1,83 @@
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('directionality', 'en,sv,fr_ca,zh_cn,cs,da,he,no,de,hu,ru,ru_KOI8-R,ru_UTF-8,es,cy,is,pl');
+
+function TinyMCE_directionality_getInfo() {
+	return {
+		longname : 'Directionality',
+		author : 'Moxiecode Systems',
+		authorurl : 'http://tinymce.moxiecode.com',
+		infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_directionality.html',
+		version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+	};
+};
+
+function TinyMCE_directionality_getControlHTML(control_name) {
+    switch (control_name) {
+        case "ltr":
+			var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionLTR\');return false;';
+            return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_ltr" src="{$pluginurl}/images/ltr.gif" title="{$lang_directionality_ltr_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>'
+			+ '<div class="zerosize"><input type="button" accesskey="." onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionLTR\',false);" /></div>';
+
+        case "rtl":
+			var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionRTL\');return false;';
+            return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_rtl" src="{$pluginurl}/images/rtl.gif" title="{$lang_directionality_rtl_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>'
+			+ '<div class="zerosize"><input type="button" accesskey="," onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionRTL\',false);" /></div>';
+    }
+
+    return "";
+}
+
+function TinyMCE_directionality_execCommand(editor_id, element, command, user_interface, value) {
+	// Handle commands
+	switch (command) {
+		case "mceDirectionLTR":
+			var inst = tinyMCE.getInstanceById(editor_id);
+			var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");
+
+			if (elm)
+				elm.setAttribute("dir", "ltr");
+
+			tinyMCE.triggerNodeChange(false);
+			return true;
+
+		case "mceDirectionRTL":
+			var inst = tinyMCE.getInstanceById(editor_id);
+			var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");
+
+			if (elm)
+				elm.setAttribute("dir", "rtl");
+
+			tinyMCE.triggerNodeChange(false);
+			return true;
+	}
+
+	// Pass to next handler in chain
+	return false;
+}
+
+function TinyMCE_directionality_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+	function getAttrib(elm, name) {
+		return elm.getAttribute(name) ? elm.getAttribute(name) : "";
+	}
+
+	tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonNormal', false);
+	tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonNormal', false);
+
+	if (node == null)
+		return;
+
+	var elm = tinyMCE.getParentElement(node, "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");
+	if (!elm) {
+		tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonDisabled', true);
+		tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonDisabled', true);
+		return;
+	}
+
+	var dir = getAttrib(elm, "dir");
+	if (dir == "ltr" || dir == "")
+		tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonSelected', false);
+	else
+		tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonSelected', false);
+
+	return true;
+}
Files 1.5.2/wp-includes/js/tinymce/plugins/directionality/images/ltr.gif and 2.0.4/wp-includes/js/tinymce/plugins/directionality/images/ltr.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/directionality/images/rtl.gif and 2.0.4/wp-includes/js/tinymce/plugins/directionality/images/rtl.gif differ
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/directionality/langs/en.js 2.0.4/wp-includes/js/tinymce/plugins/directionality/langs/en.js
--- 1.5.2/wp-includes/js/tinymce/plugins/directionality/langs/en.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/directionality/langs/en.js	2005-11-30 11:15:43.000000000 -0600
@@ -0,0 +1,6 @@
+// UK lang variables
+
+tinyMCE.addToLang('',{
+directionality_ltr_desc : 'Direction left to right (Alt-.)',
+directionality_rtl_desc : 'Direction right to left (Alt-,)'
+});
Files 1.5.2/wp-includes/js/tinymce/plugins/inlinepopups/images/spacer.gif and 2.0.4/wp-includes/js/tinymce/plugins/inlinepopups/images/spacer.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/inlinepopups/images/window_close.gif and 2.0.4/wp-includes/js/tinymce/plugins/inlinepopups/images/window_close.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/inlinepopups/images/window_maximize.gif and 2.0.4/wp-includes/js/tinymce/plugins/inlinepopups/images/window_maximize.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/inlinepopups/images/window_minimize.gif and 2.0.4/wp-includes/js/tinymce/plugins/inlinepopups/images/window_minimize.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/inlinepopups/images/window_resize.gif and 2.0.4/wp-includes/js/tinymce/plugins/inlinepopups/images/window_resize.gif differ
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js 2.0.4/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js
--- 1.5.2/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	2005-12-05 11:00:01.000000000 -0600
@@ -0,0 +1,285 @@
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('wordpress', '');
+
+function TinyMCE_wordpress_initInstance(inst) {
+	if (!tinyMCE.settings['wordpress_skip_plugin_css'])
+		tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/wordpress/wordpress.css");
+}
+
+function TinyMCE_wordpress_getControlHTML(control_name) {
+	switch (control_name) {
+		case "wordpress":
+			var titleMore = tinyMCE.getLang('lang_wordpress_more_button');
+			var titlePage = tinyMCE.getLang('lang_wordpress_page_button');
+			var titleHelp = tinyMCE.getLang('lang_wordpress_help_button');
+			var buttons = '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcewordpressmore\')" target="_self" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcewordpressmore\');return false;"><img id="{$editor_id}_wordpress_more" src="{$pluginurl}/images/more.gif" title="'+titleMore+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';
+			// Add this to the buttons var to put the Page button into the toolbar.
+			// '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcewordpresspage\')" target="_self" onclick="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcewordpresspage\');return false;"><img id="{$editor_id}_wordpress_page" src="{$pluginurl}/images/page.gif" title="'+titlePage+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';
+			return buttons;
+	}
+
+	return '';
+}
+
+function TinyMCE_wordpress_parseAttributes(attribute_string) {
+	var attributeName = "";
+	var attributeValue = "";
+	var withInName;
+	var withInValue;
+	var attributes = new Array();
+	var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');
+	var titleText = tinyMCE.getLang('lang_wordpress_more');
+	var titleTextPage = tinyMCE.getLang('lang_wordpress_page');
+
+	if (attribute_string == null || attribute_string.length < 2)
+		return null;
+
+	withInName = withInValue = false;
+
+	for (var i=0; i<attribute_string.length; i++) {
+		var chr = attribute_string.charAt(i);
+
+		if ((chr == '"' || chr == "'") && !withInValue)
+			withInValue = true;
+		else if ((chr == '"' || chr == "'") && withInValue) {
+			withInValue = false;
+
+			var pos = attributeName.lastIndexOf(' ');
+			if (pos != -1)
+				attributeName = attributeName.substring(pos+1);
+
+			attributes[attributeName.toLowerCase()] = attributeValue.substring(1).toLowerCase();
+
+			attributeName = "";
+			attributeValue = "";
+		} else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)
+			withInName = true;
+
+		if (chr == '=' && withInName)
+			withInName = false;
+
+		if (withInName)
+			attributeName += chr;
+
+		if (withInValue)
+			attributeValue += chr;
+	}
+
+	return attributes;
+}
+
+function TinyMCE_wordpress_execCommand(editor_id, element, command, user_interface, value) {
+	var inst = tinyMCE.getInstanceById(editor_id);
+	var focusElm = inst.getFocusElement();
+	var doc = inst.getDoc();
+
+	function getAttrib(elm, name) {
+		return elm.getAttribute(name) ? elm.getAttribute(name) : "";
+	}
+
+	// Handle commands
+	switch (command) {
+			case "mcewordpressmore":
+				var flag = "";
+				var template = new Array();
+				var altMore = tinyMCE.getLang('lang_wordpress_more_alt');
+
+				// Is selection a image
+				if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") {
+					flag = getAttrib(focusElm, 'class');
+	
+					if (flag != 'mce_plugin_wordpress_more') // Not a wordpress
+						return true;
+	
+					action = "update";
+				}
+	
+				html = ''
+					+ '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '
+					+ ' width="100%" height="10px" '
+					+ 'alt="'+altMore+'" title="'+altMore+'" class="mce_plugin_wordpress_more" name="mce_plugin_wordpress_more" />';
+				tinyMCE.execCommand("mceInsertContent",true,html);
+				tinyMCE.selectedInstance.repaint();
+				return true;
+			case "mcewordpresspage":
+				var flag = "";
+				var template = new Array();
+				var altPage = tinyMCE.getLang('lang_wordpress_more_alt');
+	
+				// Is selection a image
+				if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") {
+					flag = getAttrib(focusElm, 'name');
+	
+					if (flag != 'mce_plugin_wordpress_page') // Not a wordpress
+						return true;
+	
+					action = "update";
+				}
+	
+				html = ''
+					+ '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '
+					+ ' width="100%" height="10px" '
+					+ 'alt="'+altPage+'" title="'+altPage+'" class="mce_plugin_wordpress_page" name="mce_plugin_wordpress_page" />';
+				tinyMCE.execCommand("mceInsertContent",true,html);
+				tinyMCE.selectedInstance.repaint();
+				return true;
+	}
+
+	// Pass to next handler in chain
+	return false;
+}
+
+function TinyMCE_wordpress_cleanup(type, content) {
+	switch (type) {
+	
+		case "insert_to_editor":
+			var startPos = 0;
+			var altMore = tinyMCE.getLang('lang_wordpress_more_alt');
+			var altPage = tinyMCE.getLang('lang_wordpress_page_alt');
+
+			// Parse all <!--more--> tags and replace them with images
+			while ((startPos = content.indexOf('<!--more-->', startPos)) != -1) {
+				// Insert image
+				var contentAfter = content.substring(startPos + 11);
+				content = content.substring(0, startPos);
+				content += '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" ';
+				content += ' width="100%" height="10px" ';
+				content += 'alt="'+altMore+'" title="'+altMore+'" class="mce_plugin_wordpress_more" />';
+				content += contentAfter;
+
+				startPos++;
+			}
+			var startPos = 0;
+
+			// Parse all <!--page--> tags and replace them with images
+			while ((startPos = content.indexOf('<!--nextpage-->', startPos)) != -1) {
+				// Insert image
+				var contentAfter = content.substring(startPos + 15);
+				content = content.substring(0, startPos);
+				content += '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" ';
+				content += ' width="100%" height="10px" ';
+				content += 'alt="'+altPage+'" title="'+altPage+'" class="mce_plugin_wordpress_page" />';
+				content += contentAfter;
+
+				startPos++;
+			}
+
+			// It's supposed to be WYSIWYG, right?
+			content = content.replace(new RegExp('&', 'g'), '&amp;');
+
+			break;
+
+		case "get_from_editor":
+			// Parse all img tags and replace them with <!--more-->
+			var startPos = -1;
+			while ((startPos = content.indexOf('<img', startPos+1)) != -1) {
+				var endPos = content.indexOf('/>', startPos);
+				var attribs = TinyMCE_wordpress_parseAttributes(content.substring(startPos + 4, endPos));
+
+				if (attribs['class'] == "mce_plugin_wordpress_more") {
+					endPos += 2;
+	
+					var embedHTML = '<!--more-->';
+	
+					// Insert embed/object chunk
+					chunkBefore = content.substring(0, startPos);
+					chunkAfter = content.substring(endPos);
+					content = chunkBefore + embedHTML + chunkAfter;
+				}
+				if (attribs['class'] == "mce_plugin_wordpress_page") {
+					endPos += 2;
+	
+					var embedHTML = '<!--nextpage-->';
+	
+					// Insert embed/object chunk
+					chunkBefore = content.substring(0, startPos);
+					chunkAfter = content.substring(endPos);
+					content = chunkBefore + embedHTML + chunkAfter;
+				}
+			}
+
+			// If it says & in the WYSIWYG editor, it should say &amp; in the html.
+			content = content.replace(new RegExp('&', 'g'), '&amp;');
+			content = content.replace(new RegExp('&amp;nbsp;', 'g'), '&nbsp;');
+
+			// Remove anonymous, empty paragraphs.
+			content = content.replace(new RegExp('<p>(\\s|&nbsp;)*</p>', 'mg'), '');
+
+			// Handle table badness.
+			content = content.replace(new RegExp('<(table( [^>]*)?)>.*?<((tr|thead)( [^>]*)?)>', 'mg'), '<$1><$3>');
+			content = content.replace(new RegExp('<(tr|thead|tfoot)>.*?<((td|th)( [^>]*)?)>', 'mg'), '<$1><$2>');
+			content = content.replace(new RegExp('</(td|th)>.*?<(td( [^>]*)?|th( [^>]*)?|/tr|/thead|/tfoot)>', 'mg'), '</$1><$2>');
+			content = content.replace(new RegExp('</tr>.*?<(tr|/table)>', 'mg'), '</tr><$1>');
+			content = content.replace(new RegExp('<(/?(table|tbody|tr|th|td)[^>]*)>(\\s*|(<br ?/?>)*)*', 'g'), '<$1>');
+
+			// Pretty it up for the source editor.
+			var blocklist = 'blockquote|ul|ol|li|table|thead|tr|th|td|div|h\\d|pre|p';
+			content = content.replace(new RegExp('\\s*</('+blocklist+')>\\s*', 'mg'), '</$1>\n');
+			content = content.replace(new RegExp('\\s*<(('+blocklist+')[^>]*)>\\s*', 'mg'), '\n<$1>');
+			content = content.replace(new RegExp('<((li|/?tr|/?thead|/?tfoot)( [^>]*)?)>', 'g'), '\t<$1>');
+			content = content.replace(new RegExp('<((td|th)( [^>]*)?)>', 'g'), '\t\t<$1>');
+			content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'mg'), '<br />\n');
+			content = content.replace(new RegExp('^\\s*', ''), '');
+			content = content.replace(new RegExp('\\s*$', ''), '');
+			
+			break;
+	}
+
+	// Pass through to next handler in chain
+	return content;
+}
+
+function TinyMCE_wordpress_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+	function getAttrib(elm, name) {
+		return elm.getAttribute(name) ? elm.getAttribute(name) : "";
+	}
+
+	tinyMCE.switchClassSticky(editor_id + '_wordpress_more', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_wordpress_page', 'mceButtonNormal');
+
+	if (node == null)
+		return;
+
+	do {
+		if (node.nodeName.toLowerCase() == "img" && getAttrib(node, 'class').indexOf('mce_plugin_wordpress_more') == 0)
+			tinyMCE.switchClassSticky(editor_id + '_wordpress_more', 'mceButtonSelected');
+		if (node.nodeName.toLowerCase() == "img" && getAttrib(node, 'class').indexOf('mce_plugin_wordpress_page') == 0)
+			tinyMCE.switchClassSticky(editor_id + '_wordpress_page', 'mceButtonSelected');
+	} while ((node = node.parentNode));
+
+	return true;
+}
+
+function wp_save_callback(el, content, body) {
+	// We have a TON of cleanup to do.
+
+	// Mark </p> if it has any attributes.
+	content = content.replace(new RegExp('(<p[^>]+>.*?)</p>', 'mg'), '$1</p#>');
+
+	// Decode the ampersands of time.
+	content = content.replace(new RegExp('&amp;', 'g'), '&');
+
+	// Get it ready for wpautop.
+	content = content.replace(new RegExp('[\\s]*<p>[\\s]*', 'mgi'), '');
+	content = content.replace(new RegExp('[\\s]*</p>[\\s]*', 'mgi'), '\n\n');
+	content = content.replace(new RegExp('\\n\\s*\\n\\s*\\n*', 'mgi'), '\n\n');
+	content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'gi'), '\n');
+
+	// Fix some block element newline issues
+	var blocklist = 'blockquote|ul|ol|li|table|thead|tr|th|td|div|h\\d|pre';
+	content = content.replace(new RegExp('\\s*<(('+blocklist+') ?[^>]*)\\s*>', 'mg'), '\n<$1>');
+	content = content.replace(new RegExp('\\s*</('+blocklist+')>\\s*', 'mg'), '</$1>\n');
+	content = content.replace(new RegExp('<li>', 'g'), '\t<li>');
+
+	// Unmark special paragraph closing tags
+	content = content.replace(new RegExp('</p#>', 'g'), '</p>\n');
+	content = content.replace(new RegExp('\\s*(<p[^>]+>.*</p>)', 'mg'), '\n$1');
+
+	// Trim any whitespace
+	content = content.replace(new RegExp('^\\s*', ''), '');
+	content = content.replace(new RegExp('\\s*$', ''), '');
+
+	// Hope.
+	return content;
+
+}
Files 1.5.2/wp-includes/js/tinymce/plugins/wordpress/images/help.gif and 2.0.4/wp-includes/js/tinymce/plugins/wordpress/images/help.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/wordpress/images/more_bug.gif and 2.0.4/wp-includes/js/tinymce/plugins/wordpress/images/more_bug.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/wordpress/images/more.gif and 2.0.4/wp-includes/js/tinymce/plugins/wordpress/images/more.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/wordpress/images/page_bug.gif and 2.0.4/wp-includes/js/tinymce/plugins/wordpress/images/page_bug.gif differ
Files 1.5.2/wp-includes/js/tinymce/plugins/wordpress/images/page.gif and 2.0.4/wp-includes/js/tinymce/plugins/wordpress/images/page.gif differ
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/wordpress/langs/en.js 2.0.4/wp-includes/js/tinymce/plugins/wordpress/langs/en.js
--- 1.5.2/wp-includes/js/tinymce/plugins/wordpress/langs/en.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/wordpress/langs/en.js	2006-03-04 17:01:33.000000000 -0600
@@ -0,0 +1,16 @@
+// EN lang variables
+
+if (navigator.userAgent.indexOf('Mac OS') != -1) {
+// Mac OS browsers use Ctrl to hit accesskeys
+	var metaKey = 'Ctrl';
+}
+else {
+	var metaKey = 'Alt';
+}
+
+tinyMCE.addToLang('',{
+wordpress_more_button : 'Split post with More tag (' + metaKey + '-t)',
+wordpress_page_button : 'Split post with Page tag',
+wordpress_more_alt : 'More...',
+wordpress_page_alt : '...page...'
+});
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/wordpress/wordpress.css 2.0.4/wp-includes/js/tinymce/plugins/wordpress/wordpress.css
--- 1.5.2/wp-includes/js/tinymce/plugins/wordpress/wordpress.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/wordpress/wordpress.css	2005-08-29 20:25:19.000000000 -0500
@@ -0,0 +1,21 @@
+.mce_plugin_wordpress_more {
+	border: 0px;
+	border-top: 1px dotted #cccccc;
+	display:block;
+	background-color: #ffffff;
+	margin-top:15px;
+	background-image: url(images/more_bug.gif);
+	background-repeat: no-repeat;
+	background-position: right top;
+}
+
+.mce_plugin_wordpress_page {
+	border: 0px;
+	border-top: 1px dotted #cccccc;
+	display:block;
+	background-color: #ffffff;
+	margin-top:15px;
+	background-image: url(images/page_bug.gif);
+	background-repeat: no-repeat;
+	background-position: right top;
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js 2.0.4/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js
--- 1.5.2/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,57 @@
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('wphelp', '');
+
+function TinyMCE_wphelp_getControlHTML(control_name) {
+	switch (control_name) {
+		case "wphelp":
+			var titleHelp = tinyMCE.getLang('lang_help_button_title');
+			var buttons = '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceWordPressHelp\')" target="_self" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceWordPressHelp\');return false;"><img id="{$editor_id}_help" src="{$pluginurl}/images/help.gif" title="'+titleHelp+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';
+			var hiddenControls = '<div class="zerosize">'
+			+ '<input type="button" accesskey="b" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\',false);" />'
+			+ '<input type="button" accesskey="i" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Italic\',false);" />'
+			+ '<input type="button" accesskey="d" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\',false);" />'
+			+ '<input type="button" accesskey="l" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\',false);" />'
+			+ '<input type="button" accesskey="o" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\',false);" />'
+			+ '<input type="button" accesskey="w" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Outdent\',false);" />'
+			+ '<input type="button" accesskey="q" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Indent\',false);" />'
+			+ '<input type="button" accesskey="f" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyLeft\',false);" />'
+			+ '<input type="button" accesskey="c" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyCenter\',false);" />'
+			+ '<input type="button" accesskey="r" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyRight\',false);" />'
+			+ '<input type="button" accesskey="a" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceLink\',true);" />'
+			+ '<input type="button" accesskey="s" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'unlink\',false);" />'
+			+ '<input type="button" accesskey="m" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceImage\',true);" />'
+			+ '<input type="button" accesskey="t" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcewordpressmore\');" />'
+			+ '<input type="button" accesskey="u" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\',false);" />'
+			+ '<input type="button" accesskey="y" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\',false);" />'
+			+ '<input type="button" accesskey="e" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceCodeEditor\',false);" />'
+			+ '<input type="button" accesskey="h" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceWordPressHelp\',false);" />'
+			+ '</div>';
+			return buttons+hiddenControls;
+    }
+
+    return "";
+}
+
+function TinyMCE_wphelp_execCommand(editor_id, element, command, user_interface, value) {
+
+	// Handle commands
+	switch (command) {
+		case "mceWordPressHelp":
+			var template = new Array();
+
+			template['file']   = tinyMCE.baseURL + '/wp-mce-help.php';
+			template['width']  = 480;
+			template['height'] = 380;
+
+			args = {
+				resizable : 'yes',
+				scrollbars : 'yes'
+			};
+
+			tinyMCE.openWindow(template, args);
+			return true;
+	}
+
+	// Pass to next handler in chain
+	return false;
+}
Files 1.5.2/wp-includes/js/tinymce/plugins/wphelp/images/help.gif and 2.0.4/wp-includes/js/tinymce/plugins/wphelp/images/help.gif differ
diff -ruN 1.5.2/wp-includes/js/tinymce/plugins/wphelp/langs/en.js 2.0.4/wp-includes/js/tinymce/plugins/wphelp/langs/en.js
--- 1.5.2/wp-includes/js/tinymce/plugins/wphelp/langs/en.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/plugins/wphelp/langs/en.js	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,5 @@
+// EN lang variables
+
+tinyMCE.addToLang('',{
+help_button_title : 'Help (Alt+h)'
+});
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/about.htm 2.0.4/wp-includes/js/tinymce/themes/advanced/about.htm
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/about.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/about.htm	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,52 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_about_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/about.js"></script>
+	<link href="css/dialog_about.css" rel="stylesheet" type="text/css" />
+</head>
+<body id="about" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+		<div class="tabs">
+			<ul>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_about}</a></span></li>
+				<li id="help_tab"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{$lang_help}</a></span></li>
+				<li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{$lang_plugins}</a></span></li>
+			</ul>
+		</div>
+
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<h3>{$lang_about_title}</h3>
+				<p>Version: {$tinymce_version} ({$tinymce_releasedate})</p>
+				<p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a>
+				by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>
+				<p>Copyright &copy; 2005, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>
+				<p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p>
+
+				<div id="buttoncontainer"></div>
+			</div>
+
+			<div id="plugins_panel" class="panel">
+				<div id="pluginscontainer">
+					<h3>{$lang_loaded_plugins}</h3>
+
+					<div id="plugintablecontainer">
+					</div>
+
+					<p>&nbsp;</p>
+				</div>
+			</div>
+
+			<div id="help_panel" class="panel noscroll" style="overflow: visible;">
+				<div id="iframecontainer"></div>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{$lang_close}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/anchor.htm 2.0.4/wp-includes/js/tinymce/themes/advanced/anchor.htm
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/anchor.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/anchor.htm	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_insert_anchor_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/anchor.js"></script>
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<form onsubmit="insertAnchor();return false;" action="#">
+
+	<table border="0" cellpadding="4" cellspacing="0">
+		<tr>
+			<td colspan="2" class="title">{$lang_insert_anchor_title}</td>
+		</tr>
+		<tr>
+			<td nowrap="nowrap">{$lang_insert_anchor_name}:</td>
+			<td><input name="anchorName" type="text" id="anchorName" value="" style="width: 200px" /></td>
+		</tr>
+	</table>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAnchor();" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+
+</form>
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/charmap.htm 2.0.4/wp-includes/js/tinymce/themes/advanced/charmap.htm
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/charmap.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/charmap.htm	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,52 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_theme_charmap_title}</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/charmap.js"></script>
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<table align="center" border="0" cellspacing="0" cellpadding="2">
+    <tr>
+        <td colspan="2" class="title">{$lang_theme_charmap_title}</td>
+    </tr>
+    <tr>
+        <td rowspan="2" align="left" valign="top">
+            <script language="javascript" type="text/javascript">renderCharMapHTML();</script>
+        </td>
+        <td width="100" align="center" valign="top">
+            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height: 100px">
+                <tr>
+                    <td class="charmapOver" style="font-size: 40px; height:80px;" id="codeV">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td style="font-size: 10px; font-family: Arial, Helvetica, sans-serif; text-align:center;" id="codeN">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+    <tr>
+        <td valign="bottom" style="padding-bottom: 3px;">
+            <table width="100" align="center" border="0" cellpadding="2" cellspacing="0">
+                <tr>
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td>
+                </tr>
+                <tr>
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td style="font-size: 1px;">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td>
+                </tr>
+                <tr>
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
+
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/color_picker.htm 2.0.4/wp-includes/js/tinymce/themes/advanced/color_picker.htm
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/color_picker.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/color_picker.htm	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,12 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_theme_colorpicker_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/color_picker.js"></script>
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" marginheight="3" topmargin="3" leftmargin="3" marginwidth="3" style="display: none">
+	<div align="center">
+	   <script language="javascript" type="text/javascript">renderColorMap();</script>
+	</div>
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/css/editor_content.css 2.0.4/wp-includes/js/tinymce/themes/advanced/css/editor_content.css
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/css/editor_content.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/css/editor_content.css	2005-11-08 13:17:08.000000000 -0600
@@ -0,0 +1,49 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
+/* You can extend this CSS by adding your own CSS file with the the content_css option */
+
+body {
+	background-color: #FFFFFF;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	line-height: 1.2em;
+	padding: .3em;
+}
+
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+pre {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+.mceVisualAid {
+	border: 1px dashed #BBBBBB !important;
+}
+
+.mceItemAnchor {
+	width: 12px;
+	line-height: 6px;
+	overflow: hidden;
+	padding-left: 12px;
+	background-image: url('../images/anchor_symbol.gif');
+	background-position: bottom;
+	background-repeat: no-repeat;
+}
+
+/* Important is needed in Gecko browsers inorder to style links */
+/*
+a {
+	color: green !important;
+}
+*/
+
+/* Style selection range colors in Gecko browsers */
+/*
+::-moz-selection {
+	background-color: red;
+	color: green;
+}
+*/
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css 2.0.4/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css	2005-09-26 01:52:30.000000000 -0500
@@ -0,0 +1,319 @@
+/* This file contains the CSS data for all popups in TinyMCE */
+
+body {
+	background-color: #F0F0EE;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+	margin: 8px;
+}
+
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+}
+
+input {
+	background: #FFFFFF;
+	border: 1px solid #cccccc;
+}
+
+td, input, select, textarea {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+input, select, textarea {
+	border: 1px solid #808080;
+}
+
+.input_noborder {
+	border: 0px solid #808080;
+}
+
+#insert {
+   font-weight: bold;
+   width: 90px;
+   height: 21px;
+   border: 0px;
+   background-image: url('../images/insert_button_bg.gif');
+   cursor: pointer;
+}
+
+#cancel {
+   font-weight: bold;
+   width: 90px;
+   height: 21px;
+   border: 0px;
+   background-image: url('../images/cancel_button_bg.gif');
+   cursor: pointer;
+}
+
+/* Mozilla only style */
+html>body #insert, html>body #cancel {
+	padding-bottom: 2px;
+}
+
+.title {
+	font-size: 12px;
+	font-weight: bold;
+	color: #2B6FB6;
+}
+
+table.charmap {
+	border-style: solid;
+	border-width: 1px;
+	border-color: #AAAAAA;
+}
+
+td.charmap, td.charmapOver {
+	color: #000000;
+	border-color: #AAAAAA;
+	border-style: solid;
+	border-width: 1px;
+	text-align: center;
+	font-size: 12px;
+}
+
+td.charmapOver {
+	background-color: #CCCCCC;
+	cursor: arrow;
+}
+
+a.charmap {
+	color: #000000;
+	text-decoration: none
+}
+
+.wordWrapCode {
+	vertical-align: middle;
+	border: 1px none #000000;
+	background-color: transparent;
+}
+
+input.radio {
+	border: 1px none #000000;
+	background-color: transparent;
+	vertical-align: middle;
+}
+
+input.checkbox {
+	border: 1px none #000000;
+	background-color: transparent;
+	vertical-align: middle;
+}
+
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
+	margin-left: 1px;
+}
+
+.mceButtonNormal {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceButtonOver {
+	border: 1px solid #0A246A;
+	cursor: arrow;
+	background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+	cursor: arrow;
+	border: 1px solid #0A246A;
+	background-color: #8592B5;
+}
+
+.mceButtonDisabled {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceActionPanel {
+	margin-top: 5px;
+}
+
+/* Tabs classes */
+
+.tabs {
+	float: left;
+	width: 100%;
+	line-height: normal;
+	background-image: url("../images/xp/tabs_bg.gif");
+}
+
+.tabs ul {
+	margin: 0;
+	padding: 0px 0px 0;
+	list-style: none;
+}
+
+.tabs li {
+	float: left;
+	background: url("../images/xp/tab_bg.gif") no-repeat left top;
+	margin: 0;
+	margin-left: 0px;
+	margin-right: 2px;
+	padding: 0 0 0 10px;
+	line-height: 18px;
+}
+
+.tabs li.current {
+	background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;
+	margin-right: 2px;
+}
+
+.tabs span {
+	float: left;
+	display: block;
+	background: url("../images/xp/tab_end.gif") no-repeat right top;
+	padding: 0px 10px 0px 0px;
+}
+
+.tabs .current span {
+	background: url("../images/xp/tab_sel_end.gif") no-repeat right top;
+}
+
+.tabs a {
+	text-decoration: none;
+	font-family: Verdana, Arial;
+	font-size: 10px;
+}
+
+.tabs a:link, .tabs a:visited, .tabs a:hover {
+	color: black;
+}
+
+.tabs a:hover {
+}
+
+.tabs .current {
+}
+
+.tabs .current a, .tabs .current a:link, .tabs .current a:visited {
+}
+
+.panel_wrapper div.panel {
+	display: none;
+}
+
+.panel_wrapper div.current {
+	display: block;
+	width: 100%;
+	height: 300px;
+	overflow: visible; /* Should be auto but that breaks Safari */
+}
+
+.panel_wrapper {
+	border: 1px solid #919B9C;
+	border-top: 0px;
+	padding: 10px;
+	padding-top: 5px;
+	clear: both;
+	background-color: white;
+}
+
+fieldset {
+	border: 1px solid #919B9C;
+	font-family: Verdana, Arial;
+	font-size: 10px;
+	padding: 0px;
+	margin: 0px;
+	padding: 4px;
+}
+
+legend {
+	color: #2B6FB6;
+	font-weight: bold;
+}
+
+.properties {
+	width: 100%;
+}
+
+.properties .column1 {
+}
+
+.properties .column2 {
+	text-align: left;
+}
+
+a:link, a:visited {
+	color: black;
+}
+
+a:hover {
+	color: #2B6FB6;
+}
+
+#plugintable thead {
+	font-weight: bold;
+	background-color: #DDDDDD;
+}
+
+#plugintable, #about #plugintable td {
+	border: 1px solid #919B9C;
+}
+
+#plugintable {
+	width: 99%;
+	margin-top: 10px;
+}
+
+#pluginscontainer {
+	height: 290px;
+	overflow: auto;
+}
+
+/* MSIE Specific styles */
+
+* html .panel_wrapper {
+	width: 100%;
+}
+
+.column {
+	float: left;
+}
+
+h1, h2, h3, h4 {
+	color: #2B6FB6;
+	margin: 0px;
+	padding: 0px;
+	padding-top: 5px;
+}
+
+h3 {
+	font-size: 14px;
+}
+
+/* Disables the advanced tab in the table plugin. */
+/*
+#table #advanced_tab {
+	display: none;
+}
+*/
+
+/* Disables the border input field and label in the table plugin. */
+/*
+#table #border, #table #borderlabel {
+	display: none;
+}
+*/
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css 2.0.4/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css	2005-11-05 21:30:11.000000000 -0600
@@ -0,0 +1,181 @@
+/* This file contains the CSS data for the editor UI of TinyMCE instances */
+
+.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {
+	border: 0px; margin: 0px; padding: 0px; background: transparent;
+}
+
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceSeparatorLine, .mceButtonDisabled, .mceButtonSelected {
+	border: 0px; margin: 0px; padding: 0px; background: transparent;
+	margin-top: 1px;
+	margin-left: 1px;
+}
+
+.mceButtonNormal {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceButtonOver {
+	border: 1px solid #0A246A;
+	cursor: arrow;
+	background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+	cursor: arrow;
+	border: 1px solid #0A246A;
+	background-color: #8592B5;
+}
+
+.mceButtonSelected {
+	border: 1px solid;
+	border-color: #C0C0BB;
+	cursor: arrow;
+}
+
+.mceButtonDisabled {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceSeparator {
+	border-top: 1px solid buttonhighlight;
+	border-left: 1px solid buttonhighlight;
+	border-bottom: 1px solid buttonshadow;
+	border-right: 1px solid buttonshadow;
+	margin-right: 2px;
+	margin-left: 2px;
+}
+
+.mceSeparatorLine {
+	margin:2px;
+	margin-left: 4px;
+	background-color: #F0F0EE;
+	border-top: 1px solid buttonshadow;
+	border-left: 1px solid buttonshadow;
+	border-bottom: 1px solid buttonhighlight;
+	border-right: 1px solid buttonhighlight;
+	width: 0px;
+	height: 15px;
+}
+
+.mceSelectList {
+	font-family: "MS Sans Serif";
+	font-size: 7pt;
+	font-weight: normal;
+	margin-top: 3px;
+	padding: 0px;
+	display: inline;
+	vertical-align: top;
+	background-color: #F0F0EE
+}
+
+.mceLabel, .mceLabelDisabled {
+	font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+	font-size: 9pt;
+}
+
+.mceLabel {
+	color: #000000;
+}
+
+.mceLabelDisabled {
+	cursor: text;
+	color: #999999;
+}
+
+.mceEditor {
+	background: #F0F0EE;
+	border: 1px solid #cccccc;
+	padding: 0px;
+	margin: 0px;
+}
+
+.mceEditorArea {
+	font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+	background: #FFFFFF;
+	padding: 0px;
+	margin: 0px;
+}
+
+.mceToolbarTop, .mceToolbarBottom {
+	background: #F0F0EE;
+	line-height: 1px;
+	font-size: 1px;
+}
+
+.mceToolbarTop {
+	border-bottom: 1px solid #cccccc;
+}
+
+.mceToolbarBottom {
+	border-top: 1px solid #cccccc;
+}
+
+.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {
+	height: 20px;
+}
+
+.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {
+	font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+	font-size: 9pt;
+	padding: 2px;
+	line-height: 16px;
+	overflow: visible;
+}
+
+.mceStatusbarTop {
+	border-bottom: 1px solid #cccccc;
+}
+
+.mceStatusbarBottom {
+	border-top: 1px solid #cccccc;
+}
+
+.mceStatusbar {
+	border-bottom: 1px solid #cccccc;
+}
+
+.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {
+	text-decoration: none;
+	font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+	font-size: 9pt;
+	color: #000000;
+}
+
+.mcePathItem:hover {
+	text-decoration: underline;
+}
+
+.mceStatusbarPathText {
+	float: left;
+}
+
+.mceStatusbarResize {
+	float: right;
+	background-image: url('../images/statusbar_resize.gif');
+	background-repeat: no-repeat;
+	width: 11px;
+	height: 20px;
+	cursor: se-resize;
+}
+
+.mceResizeBox {
+	width: 10px;
+	height: 10px;
+	display: none;
+	border: 1px dotted gray;
+	margin: 0px;
+	padding: 0px;
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/editor_template.js 2.0.4/wp-includes/js/tinymce/themes/advanced/editor_template.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/editor_template.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/editor_template.js	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,13 @@
+/* Import theme specific language pack */
+ tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_advanced_autoImportCSSClasses=true;var TinyMCE_advanced_resizer=new Object();var TinyMCE_advanced_buttons=[['bold','{$lang_bold_img}','{$lang_bold_desc}','Bold'],['italic','{$lang_italic_img}','{$lang_italic_desc}','Italic'],['underline','{$lang_underline_img}','{$lang_underline_desc}','Underline'],['strikethrough','strikethrough.gif','{$lang_striketrough_desc}','Strikethrough'],['justifyleft','left.gif','{$lang_justifyleft_desc}','JustifyLeft'],['justifycenter','center.gif','{$lang_justifycenter_desc}','JustifyCenter'],['justifyright','right.gif','{$lang_justifyright_desc}','JustifyRight'],['justifyfull','full.gif','{$lang_justifyfull_desc}','JustifyFull'],['bullist','bullist.gif','{$lang_bullist_desc}','InsertUnorderedList'],['numlist','numlist.gif','{$lang_numlist_desc}','InsertOrderedList'],['outdent','outdent.gif','{$lang_outdent_desc}','Outdent'],['indent','indent.gif','{$lang_indent_desc}','Indent'],['cut','cut.gif','{$lang_cut_desc}','Cut'],['copy','copy.gif','{$lang_copy_desc}','Copy'],['paste','paste.gif','{$lang_paste_desc}','Paste'],['undo','undo.gif','{$lang_undo_desc}','Undo'],['redo','redo.gif','{$lang_redo_desc}','Redo'],['link','link.gif','{$lang_link_desc}','mceLink',true],['unlink','unlink.gif','{$lang_unlink_desc}','unlink'],['image','image.gif','{$lang_image_desc}','mceImage',true],['cleanup','cleanup.gif','{$lang_cleanup_desc}','mceCleanup'],['help','help.gif','{$lang_help_desc}','mceHelp'],['code','code.gif','{$lang_theme_code_desc}','mceCodeEditor'],['hr','hr.gif','{$lang_theme_hr_desc}','inserthorizontalrule'],['removeformat','removeformat.gif','{$lang_theme_removeformat_desc}','removeformat'],['sub','sub.gif','{$lang_theme_sub_desc}','subscript'],['sup','sup.gif','{$lang_theme_sup_desc}','superscript'],['forecolor','forecolor.gif','{$lang_theme_forecolor_desc}','mceForeColor',true],['backcolor','backcolor.gif','{$lang_theme_backcolor_desc}','mceBackColor',true],['charmap','charmap.gif','{$lang_theme_charmap_desc}','mceCharMap'],['visualaid','visualaid.gif','{$lang_theme_visualaid_desc}','mceToggleVisualAid'],['anchor','anchor.gif','{$lang_theme_anchor_desc}','mceInsertAnchor'],['newdocument','newdocument.gif','{$lang_newdocument_desc}','mceNewDocument']];function TinyMCE_advanced_getControlHTML(button_name){var buttonTileMap=new Array('anchor.gif','backcolor.gif','bullist.gif','center.gif','charmap.gif','cleanup.gif','code.gif','copy.gif','custom_1.gif','cut.gif','forecolor.gif','full.gif','help.gif','hr.gif','image.gif','indent.gif','left.gif','link.gif','numlist.gif','outdent.gif','paste.gif','redo.gif','removeformat.gif','right.gif','strikethrough.gif','sub.gif','sup.gif','undo.gif','unlink.gif','visualaid.gif');for(var i=0;i<TinyMCE_advanced_buttons.length;i++){var but=TinyMCE_advanced_buttons[i];if(but[0]==button_name){if(tinyMCE.settings['button_tile_map']){for(var x=0;!tinyMCE.isMSIE&&x<buttonTileMap.length;x++){if(buttonTileMap[x]==but[1]){var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\','+(but.length>4?but[4]:false)+(but.length>5?',\''+but[5]+'\'':'')+')';return '<a href="javascript:'+cmd+'" onclick="'+cmd+';return false;" onmousedown="return false;" target="_self"><img id="{$editor_id}_'+but[0]+'" src="{$themeurl}/images/spacer.gif" style="background-image:url({$themeurl}/images/buttons.gif); background-position: '+(0-(x*20))+'px 0px" title="'+but[2]+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}}}var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\','+(but.length>4?but[4]:false)+(but.length>5?',\''+but[5]+'\'':'')+')';return '<a href="javascript:'+cmd+'" onclick="'+cmd+';return false;" onmousedown="return false;" target="_self"><img id="{$editor_id}_'+but[0]+'" src="{$themeurl}/images/'+but[1]+'" title="'+but[2]+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}}switch(button_name){case "formatselect":var html='<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';var formats=tinyMCE.getParam("theme_advanced_blockformats","p,address,pre,h1,h2,h3,h4,h5,h6",true).split(',');var lookup=[['p','{$lang_theme_paragraph}'],['address','{$lang_theme_address}'],['pre','{$lang_theme_pre}'],['h1','{$lang_theme_h1}'],['h2','{$lang_theme_h2}'],['h3','{$lang_theme_h3}'],['h4','{$lang_theme_h4}'],['h5','{$lang_theme_h5}'],['h6','{$lang_theme_h6}']];html+='<option value="">{$lang_theme_block}</option>';for(var i=0;i<formats.length;i++){for(var x=0;x<lookup.length;x++){if(formats[i]==lookup[x][0]){html+='<option value="<'+lookup[x][0]+'>">'+lookup[x][1]+'</option>';}}}html+='</select>';return html;case "styleselect":return '<select id="{$editor_id}_styleSelect" onmousedown="TinyMCE_advanced_setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';case "fontselect":var fontHTML='<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';var iFonts='Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';var nFonts='Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';var fonts=tinyMCE.getParam("theme_advanced_fonts",nFonts).split(';');for(var i=0;i<fonts.length;i++){if(fonts[i]!=''){var parts=fonts[i].split('=');fontHTML+='<option value="'+parts[1]+'">'+parts[0]+'</option>';}}fontHTML+='</select>';return fontHTML;case "fontsizeselect":return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">\
+		<option value="0">{$lang_theme_font_size}</option>\
+		<option value="1">1 (8 pt)</option>\
+		<option value="2">2 (10 pt)</option>\
+		<option value="3">3 (12 pt)</option>\
+		<option value="4">4 (14 pt)</option>\
+		<option value="5">5 (18 pt)</option>\
+		<option value="6">6 (24 pt)</option>\
+		<option value="7">7 (36 pt)</option>\
+		</select>';case "|":case "separator":return '<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">';case "spacer":return '<img src="{$themeurl}/images/spacer.gif" width="1" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" />';case "rowseparator":return '<br />';}return "";}function TinyMCE_advanced_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceForeColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=tinyMCE.getAttrib(elm,"color");if(inputColor=='')inputColor=elm.style.color;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"forecolor",input_color:inputColor});return true;case "mceBackColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=elm.style.backgroundColor;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;template['width']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"HiliteColor",input_color:inputColor});return true;case "mceColorPicker":if(user_interface){var template=new Array();var inputColor=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=220;template['height']=190;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:inputColor});}else{var savedVal=tinyMCE.lastColorPickerValue;var elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;eval('elm.onchange();');}return true;case "mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",500));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",400));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case "mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case "mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case "mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,'');return true;}return false;}function TinyMCE_advanced_getEditorTemplate(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array();for(var i=0;i<in_array.length;i++){skip=false;for(var j=0;j<remove_array.length;j++){if(in_array[i]==remove_array[j]){skip=true;}}if(!skip){outArray[outArray.length]=in_array[i];}}return outArray;}function addToArray(in_array,add_array){for(var i=0;i<add_array.length;i++){in_array[in_array.length]=add_array[i];}return in_array;}var template=new Array();var deltaHeight=0;var resizing=tinyMCE.getParam("theme_advanced_resizing",false);var path=tinyMCE.getParam("theme_advanced_path",true);var statusbarHTML='<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: '+(path?"block":"none")+'">&nbsp;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: '+(resizing?"block":"none")+'" onmousedown="TinyMCE_advanced_setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='<option value="">{$lang_theme_style_select}</option>';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i<stylesAr.length;i++){var key,value;key=stylesAr[i].split('=')[0];value=stylesAr[i].split('=')[1];styleSelectHTML+='<option value="'+value+'">'+key+'</option>';}TinyMCE_advanced_autoImportCSSClasses=false;}switch(layoutManager){case "SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};/*toolbarHTML+='<a href="#" accesskey="q" title="'+tinyMCE.getLang("lang_toolbar_focus")+'"></a>';*/for(var i=1;i<100;i++){var def=defVals["theme_advanced_buttons"+i];var buttons=tinyMCE.getParam("theme_advanced_buttons"+i,def==null?'':def,true,',');if(buttons.length==0)break;buttons=removeFromArray(buttons,tinyMCE.getParam("theme_advanced_disable","",true,','));buttons=addToArray(buttons,tinyMCE.getParam("theme_advanced_buttons"+i+"_add","",true,','));buttons=addToArray(tinyMCE.getParam("theme_advanced_buttons"+i+"_add_before","",true,','),buttons);for(var b=0;b<buttons.length;b++)toolbarHTML+=tinyMCE.getControlHTML(buttons[b]);if(buttons.length>0){toolbarHTML+="<br />";deltaHeight-=23;}}toolbarHTML+='<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"></a>';template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';if(toolbarLocation=="top"){template['html']+='<tr><td class="mceToolbarTop" align="'+toolbarAlign+'" height="1" nowrap="nowrap">'+toolbarHTML+'</td></tr>';}if(statusbarLocation=="top"){template['html']+='<tr><td class="mceStatusbarTop" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23;}template['html']+='<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';if(toolbarLocation=="bottom"){template['html']+='<tr><td class="mceToolbarBottom" align="'+toolbarAlign+'" height="1">'+toolbarHTML+'</td></tr>';}if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCE.settings);toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCELang);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,"editor_id",editorId);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML);elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null;}if(statusbarLocation=="bottom"){template['html']+='<tr><td class="mceStatusbarBottom" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23;}template['html']+='</tbody></table>';break;case "RowLayout":template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i<containers.length;i++){if(containers[i]=="mceEditor"){template['html']+='<tr><td align="center" class="mceEditor_border">\
+												<span id="{$editor_id}"></span>\
+												</td></tr>';}else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom";}else if(i==0){pathClass="mceStatusbar";}else{deltaHeight-=2;}template['html']+='<tr><td class="'+pathClass+'" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=22;}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);for(var j=0;j<curContainer.length;j++){curContainerHTML+=tinyMCE.getControlHTML(curContainer[j]);}if(curContainer.length>0){curContainerHTML+="<br />";deltaHeight-=23;}template['html']+='<tr><td class="'+curCSS+'" align="'+curAlign+'" height="1">'+curContainerHTML+'</td></tr>';}}template['html']+='</tbody></table>';break;case "BorderLayout":break;case "CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);");}break;default:alert('UNDEFINED LAYOUT MANAGER! PLEASE CHECK YOUR TINYMCE CONFIG!');break;}template['html']+='<div id="{$editor_id}_resize_box" class="mceResizeBox"></div>';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);template['delta_width']=0;template['delta_height']=deltaHeight;return template;}function TinyMCE_advanced_setResizing(e,editor_id,state){e=typeof(e)=="undefined"?window.event:e;var resizer=TinyMCE_advanced_resizer;var editorContainer=document.getElementById(editor_id+'_parent');var editorArea=document.getElementById(editor_id+'_parent').firstChild;var resizeBox=document.getElementById(editor_id+'_resize_box');var inst=tinyMCE.getInstanceById(editor_id);if(state){var width=editorArea.clientWidth;var height=editorArea.clientHeight;resizeBox.style.width=width+"px";resizeBox.style.height=height+"px";resizer.iframeWidth=inst.iframeElement.clientWidth;resizer.iframeHeight=inst.iframeElement.clientHeight;editorArea.style.display="none";resizeBox.style.display="block";if(!resizer.eventHandlers){if(tinyMCE.isMSIE)tinyMCE.addEvent(document,"mousemove",TinyMCE_advanced_resizeEventHandler);else tinyMCE.addEvent(window,"mousemove",TinyMCE_advanced_resizeEventHandler);tinyMCE.addEvent(document,"mouseup",TinyMCE_advanced_resizeEventHandler);resizer.eventHandlers=true;}resizer.resizing=true;resizer.downX=e.screenX;resizer.downY=e.screenY;resizer.width=parseInt(resizeBox.style.width);resizer.height=parseInt(resizeBox.style.height);resizer.editorId=editor_id;resizer.resizeBox=resizeBox;resizer.horizontal=tinyMCE.getParam("theme_advanced_resize_horizontal",true);}else{resizer.resizing=false;resizeBox.style.display="none";editorArea.style.display=tinyMCE.isMSIE?"block":"table";tinyMCE.execCommand('mceResetDesignMode');}}function TinyMCE_advanced_initInstance(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_advanced_getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_advanced_getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_advanced_resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true));}}}function TinyMCE_advanced_setCookie(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie;}function TinyMCE_advanced_getCookie(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null;}else begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)end=dc.length;return unescape(dc.substring(begin+prefix.length,end));}function TinyMCE_advanced_resizeTo(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0;}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2;}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;if(tinyMCE.isGecko){iw-=2;ih-=2;}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth<minIframeWidth){dx=minIframeWidth-inst.iframeElement.clientWidth;inst.iframeElement.style.width=(iw+dx)+"px";}}}function TinyMCE_advanced_resizeEventHandler(e){var resizer=TinyMCE_advanced_resizer;if(!resizer.resizing)return;e=typeof(e)=="undefined"?window.event:e;var dx=e.screenX-resizer.downX;var dy=e.screenY-resizer.downY;var resizeBox=resizer.resizeBox;var editorId=resizer.editorId;switch(e.type){case "mousemove":if(resizer.horizontal)resizeBox.style.width=(resizer.width+dx)+"px";resizeBox.style.height=(resizer.height+dy)+"px";break;case "mouseup":TinyMCE_advanced_setResizing(e,editorId,false);TinyMCE_advanced_resizeTo(tinyMCE.getInstanceById(editorId),resizer.width+dx,resizer.height+dy,resizer.horizontal);if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var expires=new Date();expires.setTime(expires.getTime()+3600000*24*30);TinyMCE_advanced_setCookie("TinyMCE_"+editorId+"_width",""+(resizer.horizontal?resizer.width+dx:""),expires);TinyMCE_advanced_setCookie("TinyMCE_"+editorId+"_height",""+(resizer.height+dy),expires);}break;}}function TinyMCE_advanced_getInsertLinkTemplate(){var template=new Array();template['file']='link.htm';template['width']=330;template['height']=160;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);return template;};function TinyMCE_advanced_getInsertImageTemplate(){var template=new Array();template['file']='image.htm?src={$src}';template['width']=340;template['height']=165;template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);return template;};function TinyMCE_advanced_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){function selectByValue(select_elm,value,first_index){first_index=typeof(first_index)=="undefined"?false:true;if(select_elm){for(var i=0;i<select_elm.options.length;i++){var ov=""+select_elm.options[i].value;if(first_index&&ov.toLowerCase().indexOf(value.toLowerCase())==0){select_elm.selectedIndex=i;return true;}if(ov==value){select_elm.selectedIndex=i;return true;}}}return false;};function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";};if(node==null){return;}var pathElm=document.getElementById(editor_id+"_path");var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();if(pathElm){var parentNode=node;var path=new Array();while(parentNode!=null){if(parentNode.nodeName.toUpperCase()=="BODY"){break;}if(parentNode.nodeType==1){path[path.length]=parentNode;}parentNode=parentNode.parentNode;}var html="";for(var i=path.length-1;i>=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName=="b"){nodeName="strong";}if(nodeName=="i"){nodeName="em";}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+st+" ";}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+face+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+size+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+color+" ";}if(getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" ";}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(getAttrib(path[i],'src')!=""){nodeData+="src: "+path[i].getAttribute('src')+" ";}if(getAttrib(path[i],'href')!=""){nodeData+="href: "+path[i].getAttribute('href')+" ";}if(nodeName=="img"&&tinyMCE.getAttrib(path[i],"class").indexOf('mceItemFlash')!=-1){nodeName="flash";nodeData="src: "+path[i].getAttribute('title');}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+anchor;nodeData="";}if(getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className;}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+='<a title="'+nodeData+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" target="_self" class="mcePathItem">'+nodeName+'</a>';if(i>0){html+=" &raquo; ";}}pathElm.innerHTML='<a href="#" accesskey="x"></a>'+tinyMCE.getLang('lang_theme_path')+": "+html+'&nbsp;';}tinyMCE.switchClassSticky(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_link','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_unlink','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_image','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClassSticky(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal',false);}tinyMCE.switchClassSticky(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal',false);if(undo_levels!=-1){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonDisabled',true);}if(tinyMCE.getParentElement(node,"li,blockquote")){tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index<undo_levels-1&&undo_levels>0)){tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index>0&&undo_levels>0)){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonNormal',false);}var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_advanced_setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i<selectElm.options.length;i++){if(selectElm.options[i].value==classNode.className){index=i;breakOut=true;break;}}}}while(!breakOut&&classNode!=null&&(classNode=classNode.parentNode)!=null);selectElm.selectedIndex=index;}var selectElm=document.getElementById(editor_id+"_formatSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm){selectByValue(selectElm,"<"+elm.nodeName.toLowerCase()+">");}else{selectByValue(selectElm,"");}}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=doc.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="");}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"");}else selectByValue(selectElm,"");}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=doc.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size);}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i<sizes.length;i++){if((''+sizes[i])==size){size=i;break;}}}if(!selectByValue(selectElm,size))selectByValue(selectElm,"");}else selectByValue(selectElm,"0");}}alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align')){continue;}switch(alignNode.getAttribute('align').toLowerCase()){case "left":tinyMCE.switchClassSticky(editor_id+'_justifyleft','mceButtonSelected');breakOut=true;break;case "right":tinyMCE.switchClassSticky(editor_id+'_justifyright','mceButtonSelected');breakOut=true;break;case "middle":case "center":tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonSelected');breakOut=true;break;case "justify":tinyMCE.switchClassSticky(editor_id+'_justifyfull','mceButtonSelected');breakOut=true;break;}}while(!breakOut&&(alignNode=alignNode.parentNode)!=null);var div=tinyMCE.getParentElement(node,"div");if(div&&div.style.textAlign=="center")tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonSelected');if(!setup_content){var ar=new Array("Bold","_bold","Italic","_italic","Strikethrough","_strikethrough","superscript","_sup","subscript","_sub");for(var i=0;i<ar.length;i+=2){if(doc.queryCommandState(ar[i]))tinyMCE.switchClassSticky(editor_id+ar[i+1],'mceButtonSelected');}if(doc.queryCommandState("Underline")&&(node.parentNode==null||node.parentNode.nodeName!="A")){tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');}}do{switch(node.nodeName){case "UL":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "OL":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;case "HR":tinyMCE.switchClassSticky(editor_id+'_hr','mceButtonSelected');break;case "IMG":if(getAttrib(node,'name').indexOf('mce_')!=0){tinyMCE.switchClassSticky(editor_id+'_image','mceButtonSelected');}break;}}while((node=node.parentNode)!=null);};function TinyMCE_advanced_setupCSSClasses(editor_id){if(!TinyMCE_advanced_autoImportCSSClasses){return;}var selectElm=document.getElementById(editor_id+'_styleSelect');if(selectElm&&selectElm.getAttribute('cssImported')!='true'){var csses=tinyMCE.getCSSClasses(editor_id);if(csses&&selectElm){for(var i=0;i<csses.length;i++){selectElm.options[selectElm.length]=new Option(csses[i],csses[i]);}}if(csses!=null&&csses.length>0){selectElm.setAttribute('cssImported','true');}}};
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/image.htm 2.0.4/wp-includes/js/tinymce/themes/advanced/image.htm
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/image.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/image.htm	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,112 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_insert_image_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/image.js"></script>
+	<style type="text/css">
+		#insert, #cancel {
+			font: 13px Verdana, Arial, Helvetica, sans-serif;
+			height:auto;
+			width: auto;
+			background-color: transparent;
+			background-image: url(../../../../../wp-admin/images/fade-butt.png);
+			background-repeat: repeat;
+			border: 3px double;
+			border-right-color: rgb(153, 153, 153);
+			border-bottom-color: rgb(153, 153, 153);
+			border-left-color: rgb(204, 204, 204);
+			border-top-color: rgb(204, 204, 204);
+			color: rgb(51, 51, 51);
+			padding: 0.25em 1em;
+		}
+		#insert:active, #cancel:active {
+			background: #f4f4f4;
+			border-left-color: #999;
+			border-top-color: #999;
+		}
+	</style>
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');document.getElementById('src').focus();" style="display: none">
+<form onsubmit="insertImage();return false;">
+  <table border="0" cellpadding="0" cellspacing="0" width="200">
+    <tr>
+      <td align="center" valign="middle"><table border="0" cellpadding="4" cellspacing="0">
+          <tr>
+            <td colspan="2" class="title" nowrap="nowrap">{$lang_insert_image_title}</td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap">{$lang_insert_image_src}:</td>
+            <td><table border="0" cellspacing="0" cellpadding="0">
+                <tr>
+                  <td><input name="src" type="text" id="src" value="" style="width: 200px" onchange="getImageData();"></td>
+                  <td id="srcbrowsercontainer">&nbsp;</td>
+                </tr>
+              </table></td>
+          </tr>
+		  <!-- Image list -->
+		  <script language="javascript">
+			if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
+				var html = "";
+
+				html += '<tr><td>{$lang_image_list}:</td>';
+				html += '<td><select name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';
+				html += '<option value="">---</option>';
+
+				for (var i=0; i<tinyMCEImageList.length; i++)
+					html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';
+
+				html += '</select></td></tr>';
+
+				document.write(html);
+			}
+		  </script>
+		  <!-- /Image list -->
+          <tr>
+            <td nowrap="nowrap">{$lang_insert_image_alt}:</td>
+            <td><input name="alt" type="text" id="alt" value="" style="width: 200px"></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap">{$lang_insert_image_align}:</td>
+            <td><select name="align">
+                <option value="">{$lang_insert_image_align_default}</option>
+                <option value="baseline">{$lang_insert_image_align_baseline}</option>
+                <option value="top">{$lang_insert_image_align_top}</option>
+                <option value="middle">{$lang_insert_image_align_middle}</option>
+                <option value="bottom">{$lang_insert_image_align_bottom}</option>
+                <option value="texttop">{$lang_insert_image_align_texttop}</option>
+                <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>
+                <option value="absbottom">{$lang_insert_image_align_absbottom}</option>
+                <option value="left">{$lang_insert_image_align_left}</option>
+                <option value="right">{$lang_insert_image_align_right}</option>
+              </select></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap"><!--{$lang_insert_image_dimensions}:</td>
+            <td><input name="width" type="text" id="width" value="" size="3" maxlength="3">
+              x
+              <input name="height" type="text" id="height" value="" size="3" maxlength="3">--></td>
+          </tr>
+<!--          <tr>
+            <td nowrap="nowrap">{$lang_insert_image_border}:</td>
+            <td><input name="border" type="text" id="border" value="" size="3" maxlength="3"></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap">{$lang_insert_image_vspace}:</td>
+            <td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3"></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap">{$lang_insert_image_hspace}:</td>
+            <td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3"></td>
+          </tr>
+-->          <tr>
+            <td nowrap="nowrap"><input type="submit" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();">
+            </td>
+            <td align="right"><input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();"></td>
+          </tr>
+        </table></td>
+    </tr>
+  </table>
+</form>
+</body>
+</html>
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/anchor.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/anchor.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/anchor_symbol.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/anchor_symbol.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/backcolor.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/backcolor.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/bold_de_se.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/bold_de_se.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/bold_fr.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/bold_fr.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/bold.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/bold.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/bold_ru.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/bold_ru.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/browse.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/browse.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/bullist.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/bullist.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/buttons.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/buttons.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/cancel_button_bg.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/cancel_button_bg.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/center.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/center.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/charmap.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/charmap.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/cleanup.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/cleanup.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/close.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/close.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/code.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/code.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/color.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/color.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/copy.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/copy.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/custom_1.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/custom_1.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/cut.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/cut.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/forecolor.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/forecolor.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/full.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/full.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/hr.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/hr.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/image.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/image.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/indent.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/indent.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/insert_button_bg.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/insert_button_bg.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/italic_de_se.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/italic_de_se.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/italic.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/italic.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/italic_ru.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/italic_ru.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/left.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/left.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/link.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/link.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/newdocument.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/newdocument.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/numlist.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/numlist.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/outdent.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/outdent.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/paste.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/paste.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/redo.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/redo.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/removeformat.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/removeformat.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/right.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/right.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/spacer.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/spacer.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/statusbar_resize.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/statusbar_resize.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/strikethrough.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/strikethrough.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/sub.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/sub.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/sup.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/sup.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/table_delete_col.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/table_delete_col.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/table_delete_row.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/table_delete_row.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/table.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/table.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_after.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_after.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_before.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_before.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_after.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_after.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_before.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_before.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/underline_fr.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/underline_fr.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/underline.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/underline.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/underline_ru.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/underline_ru.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/undo.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/undo.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/unlink.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/unlink.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/visualaid.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/visualaid.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/xp/tab_bg.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/xp/tab_bg.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/xp/tab_end.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/xp/tab_end.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/xp/tabs_bg.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/xp/tabs_bg.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_bg.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_bg.gif differ
Files 1.5.2/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_end.gif and 2.0.4/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_end.gif differ
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/about.js 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/about.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/about.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/about.js	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,74 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Give FF some time
+	window.setTimeout('insertHelpIFrame();', 10);
+
+	var tcont = document.getElementById('plugintablecontainer');
+	var plugins = tinyMCE.getParam('plugins', '', true, ',');
+	if (plugins.length == 0)
+		document.getElementById('plugins_tab').style.display = 'none';
+
+	var html = "";
+	html += '<table id="plugintable">';
+	html += '<thead>';
+	html += '<tr>';
+	html += '<td>' + tinyMCE.getLang('lang_plugin') + '</td>';
+	html += '<td>' + tinyMCE.getLang('lang_author') + '</td>';
+	html += '<td>' + tinyMCE.getLang('lang_version') + '</td>';
+	html += '</tr>';
+	html += '</thead>';
+	html += '<tbody>';
+
+	for (var i=0; i<plugins.length; i++) {
+		var info = getPluginInfo(plugins[i]);
+
+		html += '<tr>';
+
+		if (info.infourl != null && info.infourl != '')
+			html += '<td width="50%" title="' + plugins[i] + '"><a href="' + info.infourl + '" target="mceplugin">' + info.longname + '</a></td>';
+		else
+			html += '<td width="50%" title="' + plugins[i] + '">' + info.longname + '</td>';
+
+		if (info.authorurl != null && info.authorurl != '')
+			html += '<td width="35%"><a href="' + info.authorurl + '" target="mceplugin">' + info.author + '</a></td>';
+		else
+			html += '<td width="35%">' + info.author + '</td>';
+
+		html += '<td width="15%">' + info.version + '</td>';
+		html += '</tr>';
+	}
+
+	html += '</tbody>';
+	html += '</table>';
+
+	tcont.innerHTML = html;
+}
+
+function getPluginInfo(name) {
+	var fn = eval('tinyMCEPopup.windowOpener.TinyMCE_' + name + '_getInfo');
+
+	if (typeof(fn) != 'undefined')
+		return fn();
+
+	return {
+		longname : name,
+		authorurl : '',
+		infourl : '',
+		author : '--',
+		version : '--'
+	};
+}
+
+function insertHelpIFrame() {
+	var html = '<iframe width="100%" height="300" src="' + tinyMCE.themeURL + "/docs/" + tinyMCE.settings['docs_language'] + "/index.htm" + '"></iframe>';
+
+	document.getElementById('iframecontainer').innerHTML = html;
+
+	html = '';
+	html += '<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> ';
+	html += '<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> ';
+	html += '<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> ';
+
+	document.getElementById('buttoncontainer').innerHTML = html;
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,59 @@
+var action, element;
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name");
+	var img = inst.getFocusElement();
+	action = 'insert';
+
+	if (anchor != null) {
+		element = anchor;
+		action = "update";
+	}
+
+	if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") {
+		element = img;
+		action = "update";
+	}
+
+	if (action == "update")
+		document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name");
+
+	document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);
+}
+
+function insertAnchor() {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var name = document.forms[0].anchorName.value;
+
+	tinyMCEPopup.execCommand("mceBeginUndoLevel");
+
+	if (action == "update") {
+		if (element.nodeName == "IMG")
+			element.setAttribute("title", name);
+		else
+			element.setAttribute("name", name);
+	} else {
+		var rng = inst.getRng();
+
+		if (rng.collapse)
+			rng.collapse(false);
+
+		name = name.replace(/&/g, '&amp;');
+		name = name.replace(/\"/g, '&quot;');
+		name = name.replace(/</g, '&lt;');
+		name = name.replace(/>/g, '&gr;');
+
+		html = '<a name="' + name + '"></a>';
+
+		tinyMCEPopup.execCommand("mceInsertContent", false, html);
+		tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+	}
+
+	tinyMCEPopup.execCommand("mceEndUndoLevel");
+
+	tinyMCE.triggerNodeChange();
+	tinyMCEPopup.close();
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,324 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+}
+
+var charmap = new Array();
+
+// for mor details please see w3c.org
+// now here is the complete list ;)
+
+charmap = [
+	['&nbsp;',    '&#160;',  true, 'no-break space'],
+	['&amp;',     '&#38;',   true, 'ampersand'],
+	['&quot;',    '&#34;',   true, 'quotation mark'],
+// finance
+	['&cent;',    '&#162;',  true, 'cent sign'],
+	['&euro;',    '&#8364;', true, 'euro sign'],
+	['&pound;',   '&#163;',  true, 'pound sign'],
+	['&yen;',     '&#165;',  true, 'yen sign'],
+// signs
+	['&copy;',    '&#169;',  true, 'copyright sign'],
+	['&reg;',     '&#174;',  true, 'registered sign'],
+	['&trade;',   '&#8482;', true, 'trade mark sign'],
+	['&permil;',  '&#8240;', true, 'per mille sign'],
+	['&micro;',   '&#181;',  true, 'micro sign'],
+	['&middot;',  '&#183;',  true, 'middle dot'],
+	['&bull;',    '&#8226;', true, 'bullet'],
+	['&hellip;',  '&#8230;', true, 'three dot leader'],
+	['&prime;',   '&#8242;', true, 'minutes / feet'],
+	['&Prime;',   '&#8243;', true, 'seconds / inches'],
+	['&sect;',    '&#167;',  true, 'section sign'],
+	['&para;',    '&#182;',  true, 'paragraph sign'],
+	['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],
+// quotations
+	['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],
+	['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],
+	['&laquo;',   '&#171;',  true, 'left pointing guillemet'],
+	['&raquo;',   '&#187;',  true, 'right pointing guillemet'],
+	['&lsquo;',   '&#8216;', true, 'left single quotation mark'],
+	['&rsquo;',   '&#8217;', true, 'right single quotation mark'],
+	['&ldquo;',   '&#8220;', true, 'left double quotation mark'],
+	['&rdquo;',   '&#8221;', true, 'right double quotation mark'],
+	['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],
+	['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],
+	['&lt;',      '&#60;',   true, 'less-than sign'],
+	['&gt;',      '&#62;',   true, 'greater-than sign'],
+	['&le;',      '&#8804;', true, 'less-than or equal to'],
+	['&ge;',      '&#8805;', true, 'greater-than or equal to'],
+	['&ndash;',   '&#8211;', true, 'en dash'],
+	['&mdash;',   '&#8212;', true, 'em dash'],
+	['&macr;',    '&#175;',  true, 'macron'],
+	['&oline;',   '&#8254;', true, 'overline'],
+	['&curren;',  '&#164;',  true, 'currency sign'],
+	['&brvbar;',  '&#166;',  true, 'broken bar'],
+	['&uml;',     '&#168;',  true, 'diaeresis'],
+	['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],
+	['&iquest;',  '&#191;',  true, 'turned question mark'],
+	['&circ;',    '&#710;',  true, 'circumflex accent'],
+	['&tilde;',   '&#732;',  true, 'small tilde'],
+	['&deg;',     '&#176;',  true, 'degree sign'],
+	['&minus;',   '&#8722;', true, 'minus sign'],
+	['&plusmn;',  '&#177;',  true, 'plus-minus sign'],
+	['&divide;',  '&#247;',  true, 'division sign'],
+	['&frasl;',   '&#8260;', true, 'fraction slash'],
+	['&times;',   '&#215;',  true, 'multiplication sign'],
+	['&sup1;',    '&#185;',  true, 'superscript one'],
+	['&sup2;',    '&#178;',  true, 'superscript two'],
+	['&sup3;',    '&#179;',  true, 'superscript three'],
+	['&frac14;',  '&#188;',  true, 'fraction one quarter'],
+	['&frac12;',  '&#189;',  true, 'fraction one half'],
+	['&frac34;',  '&#190;',  true, 'fraction three quarters'],
+// math / logical
+	['&fnof;',    '&#402;',  true, 'function / florin'],
+	['&int;',     '&#8747;', true, 'integral'],
+	['&sum;',     '&#8721;', true, 'n-ary sumation'],
+	['&infin;',   '&#8734;', true, 'infinity'],
+	['&radic;',   '&#8730;', true, 'square root'],
+	['&sim;',     '&#8764;', false,'similar to'],
+	['&cong;',    '&#8773;', false,'approximately equal to'],
+	['&asymp;',   '&#8776;', true, 'almost equal to'],
+	['&ne;',      '&#8800;', true, 'not equal to'],
+	['&equiv;',   '&#8801;', true, 'identical to'],
+	['&isin;',    '&#8712;', false,'element of'],
+	['&notin;',   '&#8713;', false,'not an element of'],
+	['&ni;',      '&#8715;', false,'contains as member'],
+	['&prod;',    '&#8719;', true, 'n-ary product'],
+	['&and;',     '&#8743;', false,'logical and'],
+	['&or;',      '&#8744;', false,'logical or'],
+	['&not;',     '&#172;',  true, 'not sign'],
+	['&cap;',     '&#8745;', true, 'intersection'],
+	['&cup;',     '&#8746;', false,'union'],
+	['&part;',    '&#8706;', true, 'partial differential'],
+	['&forall;',  '&#8704;', false,'for all'],
+	['&exist;',   '&#8707;', false,'there exists'],
+	['&empty;',   '&#8709;', false,'diameter'],
+	['&nabla;',   '&#8711;', false,'backward difference'],
+	['&lowast;',  '&#8727;', false,'asterisk operator'],
+	['&prop;',    '&#8733;', false,'proportional to'],
+	['&ang;',     '&#8736;', false,'angle'],
+// undefined
+	['&acute;',   '&#180;',  true, 'acute accent'],
+	['&cedil;',   '&#184;',  true, 'cedilla'],
+	['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],
+	['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],
+	['&dagger;',  '&#8224;', true, 'dagger'],
+	['&Dagger;',  '&#8225;', true, 'double dagger'],
+// alphabetical special chars
+	['&Agrave;',  '&#192;',  true, 'A - grave'],
+	['&Aacute;',  '&#193;',  true, 'A - acute'],
+	['&Acirc;',   '&#194;',  true, 'A - circumflex'],
+	['&Atilde;',  '&#195;',  true, 'A - tilde'],
+	['&Auml;',    '&#196;',  true, 'A - diaeresis'],
+	['&Aring;',   '&#197;',  true, 'A - ring above'],
+	['&AElig;',   '&#198;',  true, 'ligature AE'],
+	['&Ccedil;',  '&#199;',  true, 'C - cedilla'],
+	['&Egrave;',  '&#200;',  true, 'E - grave'],
+	['&Eacute;',  '&#201;',  true, 'E - acute'],
+	['&Ecirc;',   '&#202;',  true, 'E - circumflex'],
+	['&Euml;',    '&#203;',  true, 'E - diaeresis'],
+	['&Igrave;',  '&#204;',  true, 'I - grave'],
+	['&Iacute;',  '&#205;',  true, 'I - acute'],
+	['&Icirc;',   '&#206;',  true, 'I - circumflex'],
+	['&Iuml;',    '&#207;',  true, 'I - diaeresis'],
+	['&ETH;',     '&#208;',  true, 'ETH'],
+	['&Ntilde;',  '&#209;',  true, 'N - tilde'],
+	['&Ograve;',  '&#210;',  true, 'O - grave'],
+	['&Oacute;',  '&#211;',  true, 'O - acute'],
+	['&Ocirc;',   '&#212;',  true, 'O - circumflex'],
+	['&Otilde;',  '&#213;',  true, 'O - tilde'],
+	['&Ouml;',    '&#214;',  true, 'O - diaeresis'],
+	['&Oslash;',  '&#216;',  true, 'O - slash'],
+	['&OElig;',   '&#338;',  true, 'ligature OE'],
+	['&Scaron;',  '&#352;',  true, 'S - caron'],
+	['&Ugrave;',  '&#217;',  true, 'U - grave'],
+	['&Uacute;',  '&#218;',  true, 'U - acute'],
+	['&Ucirc;',   '&#219;',  true, 'U - circumflex'],
+	['&Uuml;',    '&#220;',  true, 'U - diaeresis'],
+	['&Yacute;',  '&#221;',  true, 'Y - acute'],
+	['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],
+	['&THORN;',   '&#222;',  true, 'THORN'],
+	['&agrave;',  '&#224;',  true, 'a - grave'],
+	['&aacute;',  '&#225;',  true, 'a - acute'],
+	['&acirc;',   '&#226;',  true, 'a - circumflex'],
+	['&atilde;',  '&#227;',  true, 'a - tilde'],
+	['&auml;',    '&#228;',  true, 'a - diaeresis'],
+	['&aring;',   '&#229;',  true, 'a - ring above'],
+	['&aelig;',   '&#230;',  true, 'ligature ae'],
+	['&ccedil;',  '&#231;',  true, 'c - cedilla'],
+	['&egrave;',  '&#232;',  true, 'e - grave'],
+	['&eacute;',  '&#233;',  true, 'e - acute'],
+	['&ecirc;',   '&#234;',  true, 'e - circumflex'],
+	['&euml;',    '&#235;',  true, 'e - diaeresis'],
+	['&igrave;',  '&#236;',  true, 'i - grave'],
+	['&iacute;',  '&#237;',  true, 'i - acute'],
+	['&icirc;',   '&#238;',  true, 'i - circumflex'],
+	['&iuml;',    '&#239;',  true, 'i - diaeresis'],
+	['&eth;',     '&#240;',  true, 'eth'],
+	['&ntilde;',  '&#241;',  true, 'n - tilde'],
+	['&ograve;',  '&#242;',  true, 'o - grave'],
+	['&oacute;',  '&#243;',  true, 'o - acute'],
+	['&ocirc;',   '&#244;',  true, 'o - circumflex'],
+	['&otilde;',  '&#245;',  true, 'o - tilde'],
+	['&ouml;',    '&#246;',  true, 'o - diaeresis'],
+	['&oslash;',  '&#248;',  true, 'o slash'],
+	['&oelig;',   '&#339;',  true, 'ligature oe'],
+	['&scaron;',  '&#353;',  true, 's - caron'],
+	['&ugrave;',  '&#249;',  true, 'u - grave'],
+	['&uacute;',  '&#250;',  true, 'u - acute'],
+	['&ucirc;',   '&#251;',  true, 'u - circumflex'],
+	['&uuml;',    '&#252;',  true, 'u - diaeresis'],
+	['&yacute;',  '&#253;',  true, 'y - acute'],
+	['&thorn;',   '&#254;',  true, 'thorn'],
+	['&yuml;',    '&#255;',  true, 'y - diaeresis'],
+// ['&Alpha;',   '&#913;',  true, 'Alpha'],
+	['&Beta;',    '&#914;',  true, 'Beta'],
+	['&Gamma;',   '&#915;',  true, 'Gamma'],
+	['&Delta;',   '&#916;',  true, 'Delta'],
+	['&Epsilon;', '&#917;',  true, 'Epsilon'],
+	['&Zeta;',    '&#918;',  true, 'Zeta'],
+	['&Eta;',     '&#919;',  true, 'Eta'],
+	['&Theta;',   '&#920;',  true, 'Theta'],
+	['&Iota;',    '&#921;',  true, 'Iota'],
+	['&Kappa;',   '&#922;',  true, 'Kappa'],
+	['&Lambda;',  '&#923;',  true, 'Lambda'],
+	['&Mu;',      '&#924;',  true, 'Mu'],
+	['&Nu;',      '&#925;',  true, 'Nu'],
+	['&Xi;',      '&#926;',  true, 'Xi'],
+	['&Omicron;', '&#927;',  true, 'Omicron'],
+	['&Pi;',      '&#928;',  true, 'Pi'],
+	['&Rho;',     '&#929;',  true, 'Rho'],
+	['&Sigma;',   '&#931;',  true, 'Sigma'],
+	['&Tau;',     '&#932;',  true, 'Tau'],
+	['&Upsilon;', '&#933;',  true, 'Upsilon'],
+	['&Phi;',     '&#934;',  true, 'Phi'],
+	['&Chi;',     '&#935;',  true, 'Chi'],
+	['&Psi;',     '&#936;',  true, 'Psi'],
+	['&Omega;',   '&#937;',  true, 'Omega'],
+	['&alpha;',   '&#945;',  true, 'alpha'],
+	['&beta;',    '&#946;',  true, 'beta'],
+	['&gamma;',   '&#947;',  true, 'gamma'],
+	['&delta;',   '&#948;',  true, 'delta'],
+	['&epsilon;', '&#949;',  true, 'epsilon'],
+	['&zeta;',    '&#950;',  true, 'zeta'],
+	['&eta;',     '&#951;',  true, 'eta'],
+	['&theta;',   '&#952;',  true, 'theta'],
+	['&iota;',    '&#953;',  true, 'iota'],
+	['&kappa;',   '&#954;',  true, 'kappa'],
+	['&lambda;',  '&#955;',  true, 'lambda'],
+	['&mu;',      '&#956;',  true, 'mu'],
+	['&nu;',      '&#957;',  true, 'nu'],
+	['&xi;',      '&#958;',  true, 'xi'],
+	['&omicron;', '&#959;',  true, 'omicron'],
+	['&pi;',      '&#960;',  true, 'pi'],
+	['&rho;',     '&#961;',  true, 'rho'],
+	['&sigmaf;',  '&#962;',  true, 'final sigma'],
+	['&sigma;',   '&#963;',  true, 'sigma'],
+	['&tau;',     '&#964;',  true, 'tau'],
+	['&upsilon;', '&#965;',  true, 'upsilon'],
+	['&phi;',     '&#966;',  true, 'phi'],
+	['&chi;',     '&#967;',  true, 'chi'],
+	['&psi;',     '&#968;',  true, 'psi'],
+	['&omega;',   '&#969;',  true, 'omega'],
+// symbols
+	['&alefsym;', '&#8501;', false,'alef symbol'],
+	['&piv;',     '&#982;',  false,'pi symbol'],
+	['&real;',    '&#8476;', false,'real part symbol'],
+	['&thetasym;','&#977;',  false,'theta symbol'],
+	['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],
+	['&weierp;',  '&#8472;', false,'Weierstrass p'],
+	['&image;',   '&#8465;', false,'imaginary part'],
+// arrows
+	['&larr;',    '&#8592;', true, 'leftwards arrow'],
+	['&uarr;',    '&#8593;', true, 'upwards arrow'],
+	['&rarr;',    '&#8594;', true, 'rightwards arrow'],
+	['&darr;',    '&#8595;', true, 'downwards arrow'],
+	['&harr;',    '&#8596;', true, 'left right arrow'],
+	['&crarr;',   '&#8629;', false,'carriage return'],
+	['&lArr;',    '&#8656;', false,'leftwards double arrow'],
+	['&uArr;',    '&#8657;', false,'upwards double arrow'],
+	['&rArr;',    '&#8658;', false,'rightwards double arrow'],
+	['&dArr;',    '&#8659;', false,'downwards double arrow'],
+	['&hArr;',    '&#8660;', false,'left right double arrow'],
+	['&there4;',  '&#8756;', false,'therefore'],
+	['&sub;',     '&#8834;', false,'subset of'],
+	['&sup;',     '&#8835;', false,'superset of'],
+	['&nsub;',    '&#8836;', false,'not a subset of'],
+	['&sube;',    '&#8838;', false,'subset of or equal to'],
+	['&supe;',    '&#8839;', false,'superset of or equal to'],
+	['&oplus;',   '&#8853;', false,'circled plus'],
+	['&otimes;',  '&#8855;', false,'circled times'],
+	['&perp;',    '&#8869;', false,'perpendicular'],
+	['&sdot;',    '&#8901;', false,'dot operator'],
+	['&lceil;',   '&#8968;', false,'left ceiling'],
+	['&rceil;',   '&#8969;', false,'right ceiling'],
+	['&lfloor;',  '&#8970;', false,'left floor'],
+	['&rfloor;',  '&#8971;', false,'right floor'],
+	['&lang;',    '&#9001;', false,'left-pointing angle bracket'],
+	['&rang;',    '&#9002;', false,'right-pointing angle bracket'],
+	['&loz;',     '&#9674;', true,'lozenge'],
+	['&spades;',  '&#9824;', false,'black spade suit'],
+	['&clubs;',   '&#9827;', true, 'black club suit'],
+	['&hearts;',  '&#9829;', true, 'black heart suit'],
+	['&diams;',   '&#9830;', true, 'black diamond suit'],
+	['&ensp;',    '&#8194;', false,'en space'],
+	['&emsp;',    '&#8195;', false,'em space'],
+	['&thinsp;',  '&#8201;', false,'thin space'],
+	['&zwnj;',    '&#8204;', false,'zero width non-joiner'],
+	['&zwj;',     '&#8205;', false,'zero width joiner'],
+	['&lrm;',     '&#8206;', false,'left-to-right mark'],
+	['&rlm;',     '&#8207;', false,'right-to-left mark'],
+	['&shy;',     '&#173;',  false,'soft hyphen']
+];
+
+function renderCharMapHTML() {
+	var charsPerRow = 20, tdWidth=20, tdHeight=20;
+	var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';
+	var cols=-1;
+	for (var i=0; i<charmap.length; i++) {
+		if (charmap[i][2]==true) {
+			cols++;
+			html += ''
+				+ '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"'
+				+ ' onmouseover="tinyMCE.switchClass(this,\'charmapOver\');'
+				+ 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');"'
+				+ ' onmouseout="tinyMCE.restoreClass(this,\'charmapOver\');"'
+				+ ' nowrap="nowrap" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');"><a style="text-decoration: none;" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'
+				+ charmap[i][1]
+				+ '</a></td>';
+			if ((cols+1) % charsPerRow == 0)
+				html += '</tr><tr height="' + tdHeight + '">';
+		}
+	 }
+	if (cols % charsPerRow > 0) {
+		var padd = charsPerRow - (cols % charsPerRow);
+		for (var i=0; i<padd-1; i++)
+			html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';
+	}
+	html += '</tr></table>';
+	document.write(html);
+}
+
+function insertChar(chr) {
+	tinyMCEPopup.execCommand('mceInsertContent', false, '\&#' + chr + ';');
+
+	// Refocus in window
+	if (tinyMCEPopup.isWindow)
+		window.focus();
+}
+
+function previewChar(codeA, codeB, codeN) {
+	var elmA = document.getElementById('codeA');
+	var elmB = document.getElementById('codeB');
+	var elmV = document.getElementById('codeV');
+	var elmN = document.getElementById('codeN');
+
+	if (codeA=='#160;') {
+		elmV.innerHTML = '__';
+	} else {
+		elmV.innerHTML = '&' + codeA;
+	}
+
+	elmB.innerHTML = '&amp;' + codeA;
+	elmA.innerHTML = '&amp;' + codeB;
+	elmN.innerHTML = codeN;
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js	2005-11-12 22:43:57.000000000 -0600
@@ -0,0 +1,107 @@
+function init() {
+	if (tinyMCE.isMSIE)
+		tinyMCEPopup.resizeToInnerSize();
+}
+
+function selectColor() {
+	var color = document.getElementById("selectedColorBox").value;
+
+	tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color);
+	tinyMCEPopup.close();
+}
+
+function showColor(color) {
+	document.getElementById("selectedColor").style.backgroundColor = color;
+	document.getElementById("selectedColorBox").value = color;
+}
+
+var colors = new Array(
+	"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
+	"#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
+	"#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
+	"#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
+	"#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
+	"#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
+	"#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
+	"#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
+	"#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
+	"#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
+	"#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
+	"#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
+	"#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
+	"#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
+	"#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
+	"#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
+	"#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
+	"#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
+	"#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
+	"#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
+	"#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
+	"#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
+	"#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
+	"#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
+	"#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
+	"#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
+	"#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
+);
+
+function convertRGBToHex(col) {
+	var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+	var rgb = col.replace(re, "$1,$2,$3").split(',');
+	if (rgb.length == 3) {
+		r = parseInt(rgb[0]).toString(16);
+		g = parseInt(rgb[1]).toString(16);
+		b = parseInt(rgb[2]).toString(16);
+
+		r = r.length == 1 ? '0' + r : r;
+		g = g.length == 1 ? '0' + g : g;
+		b = b.length == 1 ? '0' + b : b;
+
+		return "#" + r + g + b;
+	}
+
+	return col;
+}
+
+function convertHexToRGB(col) {
+	if (col.indexOf('#') != -1) {
+		col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+
+		r = parseInt(col.substring(0, 2), 16);
+		g = parseInt(col.substring(2, 4), 16);
+		b = parseInt(col.substring(4, 6), 16);
+
+		return "rgb(" + r + "," + g + "," + b + ")";
+	}
+
+	return col;
+}
+
+function renderColorMap() {
+	var html = "";
+	var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color'));
+
+	html += '<table border="0" cellspacing="1" cellpadding="0">'
+		+ '<tr>';
+	for (var i=0; i<colors.length; i++) {
+		html += '<td bgcolor="' + colors[i] + '">'
+			+ '<a href="javascript:selectColor();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');">'
+			+ '<img border="0" src="images/spacer.gif" width="10" height="10" title="' + colors[i] +  '" alt="' + colors[i] +  '" /></a></td>';
+		if ((i+1) % 18 == 0)
+			html += '</tr><tr>';
+	}
+	html += '<tr><td colspan="18">'
+		+ '<table width="100%" border="0" cellspacing="0" cellpadding="0">'
+		+ '<tr><td>'
+		+ '<img id="selectedColor" style="background-color:' + tinyMCE.getWindowArg('input_color') + '" border="0" src="images/spacer.gif" width="80" height="16" />'
+		+ '</td><td align="right">'
+		+ '<input id="selectedColorBox" name="selectedColorBox" type="text" size="7" maxlength="7" style="width:65px" value="' + inputColor + '" />'
+		+ '</td></tr>'
+		+ '</table>'
+		+ '<input type="button" id="insert" name="insert" value="{$lang_theme_colorpicker_apply}" style="margin-top:3px" onclick="selectColor();">'
+		+ '</td></tr>'
+		+ '</table>';
+
+	document.write(html);
+}
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/image.js 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/image.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/image.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/image.js	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,82 @@
+var url = tinyMCE.getParam("external_image_list_url");
+if (url != null) {
+	// Fix relative
+	if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+		url = tinyMCE.documentBasePath + "/" + url;
+
+	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+}
+
+function insertImage() {
+	if (window.opener) {
+		var src = document.forms[0].src.value;
+		var alt = document.forms[0].alt.value;
+		var border = '';//document.forms[0].border.value;
+		var vspace = '';//document.forms[0].vspace.value;
+		var hspace = '';//document.forms[0].hspace.value;
+		var width = '';//document.forms[0].width.value;
+		var height = '';//document.forms[0].height.value;
+		var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value;
+
+		window.opener.tinyMCE.insertImage(src, alt, border, hspace, vspace, width, height, align);
+		top.close();
+	}
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+
+	var formObj = document.forms[0];
+
+	for (var i=0; i<document.forms[0].align.options.length; i++) {
+		if (document.forms[0].align.options[i].value == tinyMCE.getWindowArg('align'))
+			document.forms[0].align.options.selectedIndex = i;
+	}
+
+	formObj.src.value = tinyMCE.getWindowArg('src');
+	formObj.alt.value = tinyMCE.getWindowArg('alt');
+//	formObj.border.value = tinyMCE.getWindowArg('border');
+//	formObj.vspace.value = tinyMCE.getWindowArg('vspace');
+//	formObj.hspace.value = tinyMCE.getWindowArg('hspace');
+//	formObj.width.value = tinyMCE.getWindowArg('width');
+//	formObj.height.value = tinyMCE.getWindowArg('height');
+	formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
+
+	// Handle file browser
+	if (isVisible('srcbrowser'))
+		document.getElementById('src').style.width = '180px';
+
+	// Auto select image in list
+	if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
+		for (var i=0; i<formObj.image_list.length; i++) {
+			if (formObj.image_list.options[i].value == tinyMCE.getWindowArg('src'))
+				formObj.image_list.options[i].selected = true;
+		}
+	}
+}
+
+var preloadImg = new Image();
+
+function resetImageData() {
+	var formObj = document.forms[0];
+	formObj.width.value = formObj.height.value = "";	
+}
+
+function updateImageData() {
+	var formObj = document.forms[0];
+
+//	if (formObj.width.value == "")
+//		formObj.width.value = preloadImg.width;
+
+//	if (formObj.height.value == "")
+//		formObj.height.value = preloadImg.height;
+}
+
+function getImageData() {
+	preloadImg = new Image();
+	tinyMCE.addEvent(preloadImg, "load", updateImageData);
+	tinyMCE.addEvent(preloadImg, "error", function () {var formObj = document.forms[0];formObj.width.value = formObj.height.value = "";});
+	preloadImg.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], document.forms[0].src.value);
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/link.js 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/link.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/link.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/link.js	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,64 @@
+var url = tinyMCE.getParam("external_link_list_url");
+if (url != null) {
+	// Fix relative
+	if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+		url = tinyMCE.documentBasePath + "/" + url;
+
+	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+//	document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link');
+
+	var formObj = document.forms[0];
+
+	for (var i=0; i<document.forms[0].target.options.length; i++) {
+		var option = document.forms[0].target.options[i];
+
+		if (option.value == tinyMCE.getWindowArg('target'))
+			option.selected = true;
+	}
+
+	document.forms[0].href.value = tinyMCE.getWindowArg('href');
+	document.forms[0].linktitle.value = tinyMCE.getWindowArg('title');
+	document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
+
+//	addClassesToList('styleSelect', 'theme_advanced_link_styles');
+//	selectByValue(formObj, 'styleSelect', tinyMCE.getWindowArg('className'), true);
+
+	// Handle file browser
+	if (isVisible('hrefbrowser'))
+		document.getElementById('href').style.width = '180px';
+
+	// Auto select link in list
+	if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {
+		var formObj = document.forms[0];
+
+		for (var i=0; i<formObj.link_list.length; i++) {
+			if (formObj.link_list.options[i].value == tinyMCE.getWindowArg('href'))
+				formObj.link_list.options[i].selected = true;
+		}
+	}
+}
+
+function insertLink() {
+	if (window.opener) {
+		var href = document.forms[0].href.value;
+		var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;
+		var title = document.forms[0].linktitle.value;
+		var style_class = '';//document.forms[0].styleSelect.value;
+		var dummy;
+
+		// Make anchors absolute
+		if (href.charAt(0) == '#')
+			href = tinyMCE.settings['document_base_url'] + href;
+
+		if (target == '_self')
+			target = '';
+
+		window.opener.tinyMCE.insertLink(href, target, title, dummy, style_class);
+		tinyMCEPopup.close();
+	}
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js	2005-11-17 11:47:29.000000000 -0600
@@ -0,0 +1,56 @@
+function saveContent() {
+	tinyMCE.setContent(document.getElementById('htmlSource').value);
+	tinyMCE.closeWindow(window);
+}
+
+// Fixes some charcode issues
+function fixContent(html) {
+	// WP
+	return html;
+
+	html = html.replace(new RegExp('<(p|hr|table|tr|td|ol|ul|object|embed|li|blockquote)', 'gi'),'\n<$1');
+	html = html.replace(new RegExp('<\/(p|ol|ul|li|table|tr|td|blockquote|object)>', 'gi'),'</$1>\n');
+	html = tinyMCE.regexpReplace(html, '<br />','<br />\n','gi');
+	html = tinyMCE.regexpReplace(html, '\n\n','\n','gi');
+	return html;
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.forms[0].htmlSource.value = fixContent(tinyMCE.getContent(tinyMCE.getWindowArg('editor_id')));
+	resizeInputs();
+	setWrap('off');
+}
+
+function setWrap(val) {
+	// hard soft off
+	document.forms[0].htmlSource.wrap = val;
+}
+
+function toggleWordWrap(elm) {
+	if (elm.checked)
+		setWrap('soft');
+	else
+		setWrap('off');
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+	if (!tinyMCE.isMSIE) {
+		 wHeight = self.innerHeight-80;
+		 wWidth = self.innerWidth-16;
+	} else {
+		 wHeight = document.body.clientHeight - 80;
+		 wWidth = document.body.clientWidth - 16;
+	}
+
+	document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';
+	document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';
+}
+
+function renderWordWrap() {
+	if (tinyMCE.isMSIE)
+		document.write('<input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{$lang_theme_code_wordwrap}</label>');
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/langs/en.js 2.0.4/wp-includes/js/tinymce/themes/advanced/langs/en.js
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/langs/en.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/langs/en.js	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,76 @@
+// UK lang variables
+
+tinyMCE.addToLang('',{
+theme_style_select : '-- Styles --',
+theme_code_desc : 'Edit HTML Source (Alt+e)',
+theme_code_title : 'HTML Source Editor',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Subscript',
+theme_sup_desc : 'Superscript',
+theme_hr_desc : 'Insert horizontal ruler',
+theme_removeformat_desc : 'Remove formatting',
+theme_custom1_desc : 'Your custom description here',
+insert_image_border : 'Border',
+insert_image_dimensions : 'Dimensions',
+insert_image_vspace : 'Vertical space',
+insert_image_hspace : 'Horizontal space',
+insert_image_align : 'Alignment',
+insert_image_align_default : '-- Not set --',
+insert_image_align_baseline : 'Baseline',
+insert_image_align_top : 'Top',
+insert_image_align_middle : 'Middle',
+insert_image_align_bottom : 'Bottom',
+insert_image_align_texttop : 'TextTop',
+insert_image_align_absmiddle : 'Absolute Middle',
+insert_image_align_absbottom : 'Absolute Bottom',
+insert_image_align_left : 'Left',
+insert_image_align_right : 'Right',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraph',
+theme_div : 'Div',
+theme_address : 'Address',
+theme_pre : 'Preformatted',
+theme_h1 : 'Heading 1',
+theme_h2 : 'Heading 2',
+theme_h3 : 'Heading 3',
+theme_h4 : 'Heading 4',
+theme_h5 : 'Heading 5',
+theme_h6 : 'Heading 6',
+theme_colorpicker_title : 'Select a color',
+theme_colorpicker_apply : 'Apply',
+theme_forecolor_desc : 'Select text color',
+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : 'Select custom character',
+theme_charmap_desc : 'Insert custom character',
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',
+insert_anchor_title : 'Insert/edit anchor',
+insert_anchor_name : 'Anchor name',
+theme_anchor_desc : 'Insert/edit anchor',
+theme_insert_link_titlefield : 'Title',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+class_name : 'Class',
+newdocument : 'Are you sure you want clear all contents?',
+about_title : 'About TinyMCE',
+about : 'About',
+license : 'License',
+plugins : 'Plugins',
+plugin : 'Plugin',
+author : 'Author',
+version : 'Version',
+loaded_plugins : 'Loaded plugins',
+help : 'Help',
+not_set : '-- Not set --',
+close : 'Close',
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X'
+});
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/link.htm 2.0.4/wp-includes/js/tinymce/themes/advanced/link.htm
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/link.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/link.htm	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,113 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_insert_link_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/link.js"></script>
+	<style type="text/css">
+		#insert, #cancel {
+			font: 13px Verdana, Arial, Helvetica, sans-serif;
+			height: auto;
+			width: auto;
+			background-color: transparent;
+			background-image: url(../../../../../wp-admin/images/fade-butt.png);
+			background-repeat: repeat;
+			border: 3px double;
+			border-right-color: rgb(153, 153, 153);
+			border-bottom-color: rgb(153, 153, 153);
+			border-left-color: rgb(204, 204, 204);
+			border-top-color: rgb(204, 204, 204);
+			color: rgb(51, 51, 51);
+			padding: 0.25em 0.75em;
+		}
+		#insert:active, #cancel:active {
+			background: #f4f4f4;
+			border-left-color: #999;
+			border-top-color: #999;
+		}
+	</style>
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');document.getElementById('href').focus();" style="display: none">
+<form onsubmit="insertLink();return false;">
+  <table border="0" cellpadding="0" cellspacing="0" width="100">
+    <tr>
+      <td align="center" valign="middle"><table border="0" cellpadding="4" cellspacing="0">
+          <tr>
+            <td colspan="2" class="title" nowrap="nowrap">{$lang_insert_link_title}</td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap">{$lang_insert_link_url}:</td>
+            <td>              <table border="0" cellspacing="0" cellpadding="0">
+                <tr>
+                  <td><input name="href" type="text" id="href" value="" style="width: 200px"></td>
+                  <td id="hrefbrowsercontainer">&nbsp;</td>
+                </tr>
+              </table></td>
+          </tr>
+		  <!-- Link list -->
+		  <script language="javascript">
+			if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {
+				var html = "";
+
+				html += '<tr><td>{$lang_link_list}:</td>';
+				html += '<td><select name="link_list" style="width: 200px" onchange="this.form.href.value=this.options[this.selectedIndex].value;">';
+				html += '<option value="">---</option>';
+
+				for (var i=0; i<tinyMCELinkList.length; i++)
+					html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';
+
+				html += '</select></td></tr>';
+
+				document.write(html);
+			}
+		  </script>
+		  <!-- /Link list -->
+          <tr>
+            <td nowrap="nowrap">{$lang_insert_link_target}:</td>
+            <td><select name="target" style="width: 200px">
+                <option value="_self">{$lang_insert_link_target_same}</option>
+                <option value="_blank">{$lang_insert_link_target_blank}</option>
+				<script language="javascript">
+					var html = "";
+					var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');
+
+					for (var i=0; i<targets.length; i++) {
+						var key, value;
+
+						if (targets[i] == "")
+							continue;
+
+						key = targets[i].split('=')[0];
+						value = targets[i].split('=')[1];
+
+						html += '<option value="' + value + '">' + key + '</option>';
+					}
+
+					document.write(html);
+				</script>
+            </select></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap">{$lang_theme_insert_link_titlefield}:</td>
+            <td><input name="linktitle" type="text" id="linktitle" value="" style="width: 200px"></td>
+          </tr>
+          <tr id="styleSelectRow">
+            <td><!--{$lang_class_name}:</td>
+            <td>
+			 <select id="styleSelect" name="styleSelect">
+                <option value="" selected>{$lang_theme_style_select}</option>
+             </select></td>
+            <td align="right">&nbsp;</td>
+            <td align="right">&nbsp;--></td>
+          </tr>
+          <tr>
+            <td><input type="submit" id="insert" name="insert" value="{$lang_insert}" onclick="insertLink();">
+            </td>
+            <td align="right"><input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();"></td>
+          </tr>
+        </table></td>
+    </tr>
+  </table>
+</form>
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/themes/advanced/source_editor.htm 2.0.4/wp-includes/js/tinymce/themes/advanced/source_editor.htm
--- 1.5.2/wp-includes/js/tinymce/themes/advanced/source_editor.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/themes/advanced/source_editor.htm	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,51 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<title>{$lang_theme_code_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/source_editor.js"></script>
+	<style type="text/css">
+		#insert, #cancel {
+			font: 13px Verdana, Arial, Helvetica, sans-serif;
+			height: auto;
+			width: auto;
+			background-color: transparent;
+			background-image: url(../../../../../wp-admin/images/fade-butt.png);
+			background-repeat: repeat;
+			border: 3px double;
+			border-right-color: rgb(153, 153, 153);
+			border-bottom-color: rgb(153, 153, 153);
+			border-left-color: rgb(204, 204, 204);
+			border-top-color: rgb(204, 204, 204);
+			color: rgb(51, 51, 51);
+			padding: 0.25em 0.75em;
+		}
+		#insert:active, #cancel:active {
+			background: #f4f4f4;
+			border-left-color: #999;
+			border-top-color: #999;
+		}
+	</style>
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');document.getElementById('htmlSource').focus();" onresize="resizeInputs();" style="display: none">
+	<form name="source" onsubmit="saveContent();" action="#">
+		<div style="float: left" class="title">{$lang_theme_code_title}</div>
+
+		<div style="float: right">
+			<script language="javascript" type="text/javascript">renderWordWrap();</script>
+		</div>
+
+		<textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft"></textarea>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="button" name="insert" value="{$lang_update}" onclick="saveContent();" id="insert" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
diff -ruN 1.5.2/wp-includes/js/tinymce/tiny_mce_gzip.php 2.0.4/wp-includes/js/tinymce/tiny_mce_gzip.php
--- 1.5.2/wp-includes/js/tinymce/tiny_mce_gzip.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/tiny_mce_gzip.php	2006-03-06 16:52:15.000000000 -0600
@@ -0,0 +1,172 @@
+<?php
+	/**
+	 * $RCSfile: tiny_mce_gzip.php,v $
+	 * $Revision: $
+	 * $Date: $
+	 *
+	 * @version 1.02
+	 * @author Moxiecode
+	 * @copyright Copyright  2005, Moxiecode Systems AB, All rights reserved.
+	 *
+	 * This file compresses the TinyMCE JavaScript using GZip and
+	 * enables the browser to do two requests instead of one for each .js file.
+	 * Notice: This script defaults the button_tile_map option to true for extra performance.
+	 *
+	 * Todo:
+	 *  - Add local file cache for the GZip:ed version.
+	 */
+
+	/* Heavily edited to add flexibilty in WordPress */
+	@ require('../../../wp-config.php');
+
+	function wp_translate_tinymce_lang($text) {
+		if ( ! function_exists('__') ) {
+			return $text;
+		} else {
+			$search1 = "/^tinyMCELang\\[(['\"])(.*)\\1\]( ?= ?)(['\"])(.*)\\4/Uem";
+			$replace1 = "'tinyMCELang[\\1\\2\\1]\\3'.stripslashes('\\4').__('\\5').stripslashes('\\4')";
+
+			$search2 = "/ : (['\"])(.*)\\1/Uem";
+			$replace2 = "' : '.stripslashes('\\1').__('\\2').stripslashes('\\1')";
+
+			$search = array($search1, $search2);
+			$replace = array($replace1, $replace2);
+
+			$text = preg_replace($search, $replace, $text);
+
+			return $text;
+		}
+	}
+
+	function wp_compact_tinymce_js($text) {
+		// This function was custom-made for TinyMCE 2.0, not expected to work with any other JS.
+
+		// Strip comments
+		$text = preg_replace("!(^|\s+)//.*$!m", '', $text);
+		$text = preg_replace("!/\*.*?\*/!s", '', $text);
+
+		// Strip leading tabs, carriage returns and unnecessary line breaks.
+		$text = preg_replace("!^\t+!m", '', $text);
+		$text = str_replace("\r", '', $text);
+		$text = preg_replace("!(^|{|}|;|:|\))\n!m", '\\1', $text);
+
+		return $text;
+	}
+
+	// General options
+	$expiresOffset = 3600 * 24 * 30; // 30 days util client cache expires
+
+	gzip_compression();
+
+	// Output rest of headers
+	header("Content-type: text/javascript; charset: UTF-8");
+	header("Vary: Accept-Encoding"); // Handle proxies
+	header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT");
+
+	// Write main script
+	$tinymce = file_get_contents(realpath("tiny_mce.js"));
+	echo wp_compact_tinymce_js($tinymce);
+	echo "\n\n";
+
+	// Remove some functions
+	echo "\n/* WP cancels all TinyMCE language and import handling */\n";
+	echo "TinyMCE.prototype.importThemeLanguagePack = function() {};\n";
+	echo "TinyMCE.prototype.importPluginLanguagePack = function() {};\n\n";
+	echo "TinyMCE.prototype.loadScript = function() {};\n";
+
+	// Load theme, language pack and theme language packs
+	$theme = apply_filters('mce_theme', 'advanced');
+
+	echo wp_compact_tinymce_js(file_get_contents(realpath("themes/" . $theme . "/editor_template.js")));
+
+	// Get the WordPress locale
+	$locale = get_locale();
+
+	$themeLanguageFile = realpath("themes/" . $theme . "/langs/" . $locale . ".js");
+
+	if (!file_exists($themeLanguageFile))
+		$themeLanguageFile = realpath("themes/" . $theme . "/langs/en.js");
+	echo wp_translate_tinymce_lang(file_get_contents($themeLanguageFile));
+
+	$tinymceLanguageFile = realpath("langs/" . $locale . ".js");
+
+	if (!file_exists($tinymceLanguageFile))
+		$tinymceLanguageFile = realpath("langs/en.js");
+	echo wp_translate_tinymce_lang(file_get_contents($tinymceLanguageFile));
+
+	// Load all plugins and their language packs
+	$plugins = apply_filters('mce_plugins', array('wordpress', 'autosave','wphelp'));
+
+	foreach ($plugins as $plugin) {
+		$pluginFile = realpath("plugins/" . $plugin . "/editor_plugin.js");
+		$languageFile = realpath("plugins/" . $plugin . "/langs/" . $locale . ".js");
+		if (!file_exists($languageFile))
+			$languageFile = realpath("plugins/" . $plugin . "/langs/en.js");
+
+		if ($pluginFile)
+			echo file_get_contents($pluginFile);
+
+		if ($languageFile)
+			echo wp_translate_tinymce_lang(file_get_contents($languageFile));
+	}
+
+	// Set up init variables
+	if ( current_user_can('unfiltered_html') ) // Use the full XHTML set provided in the docs
+		$valid_elements = 'a[accesskey|charset|class|coords|dir<ltr?rtl|href|hreflang|id|lang|name|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rel|rev|shape<circle?default?poly?rect|style|tabindex|title|target|type],abbr[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],acronym[class|dir<ltr?rtl|id|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],address[class|align|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],applet[align<bottom?left?middle?right?top|alt|archive|class|code|codebase|height|hspace|id|name|object|style|title|vspace|width],area[accesskey|alt|class|coords|dir<ltr?rtl|href|id|lang|nohref<nohref|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|shape<circle?default?poly?rect|style|tabindex|title|target],base[href|target],basefont[color|face|id|size],bdo[class|dir<ltr?rtl|id|lang|style|title],big[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],blockquote[dir|style|cite|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],body[alink|background|bgcolor|class|dir<ltr?rtl|id|lang|link|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onunload|style|title|text|vlink],br[class|clear<all?left?none?right|id|style|title],button[accesskey|class|dir<ltr?rtl|disabled<disabled|id|lang|name|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|tabindex|title|type|value],caption[align<bottom?left?right?top|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],center[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],'
+			. 'cite[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],code[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],col[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|span|style|title|valign<baseline?bottom?middle?top|width],colgroup[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|span|style|title|valign<baseline?bottom?middle?top|width],dd[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],del[cite|class|datetime|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],dfn[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],dir[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],div[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],dl[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],dt[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],em/i[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],'
+			. 'fieldset[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],font[class|color|dir<ltr?rtl|face|id|lang|size|style|title],form[accept|accept-charset|action|class|dir<ltr?rtl|enctype|id|lang|method<get?post|name|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onreset|onsubmit|style|title|target],frame[class|frameborder|id|longdesc|marginheight|marginwidth|name|noresize<noresize|scrolling<auto?no?yes|src|style|title],frameset[class|cols|id|onload|onunload|rows|style|title],h1[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],h2[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],h3[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],h4[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],h5[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],h6[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],head[dir<ltr?rtl|lang|profile],hr[align<center?left?right|class|dir<ltr?rtl|id|lang|noshade<noshade|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|size|style|title|width],html[dir<ltr?rtl|lang|version],'
+			. 'iframe[align<bottom?left?middle?right?top|class|frameborder|height|id|longdesc|marginheight|marginwidth|name|scrolling<auto?no?yes|src|style|title|width],img[align<bottom?left?middle?right?top|alt|border|class|dir<ltr?rtl|height|hspace|id|ismap<ismap|lang|longdesc|name|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|src|style|title|usemap|vspace|width],input[accept|accesskey|align<bottom?left?middle?right?top|alt|checked<checked|class|dir<ltr?rtl|disabled<disabled|id|ismap<ismap|lang|maxlength|name|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onselect|readonly<readonly|size|src|style|tabindex|title|type<button?checkbox?file?hidden?image?password?radio?reset?submit?text|usemap|value],ins[cite|class|datetime|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],isindex[class|dir<ltr?rtl|id|lang|prompt|style|title],kbd[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],label[accesskey|class|dir<ltr?rtl|for|id|lang|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],legend[align<bottom?left?right?top|accesskey|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],li[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|type|value],link[charset|class|dir<ltr?rtl|href|hreflang|id|lang|media|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rel|rev|style|title|target|type],map[class|dir<ltr?rtl|id|lang|name|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],'
+			. 'menu[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],meta[content|dir<ltr?rtl|http-equiv|lang|name|scheme],noframes[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],noscript[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],object[align<bottom?left?middle?right?top|archive|border|class|classid|codebase|codetype|data|declare|dir<ltr?rtl|height|hspace|id|lang|name|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|standby|style|tabindex|title|type|usemap|vspace|width],ol[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|start|style|title|type],optgroup[class|dir<ltr?rtl|disabled<disabled|id|label|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],option[class|dir<ltr?rtl|disabled<disabled|id|label|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|selected<selected|style|title|value],p[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],param[id|name|type|value|valuetype<DATA?OBJECT?REF],pre/listing/plaintext/xmp[align|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|width],q[cite|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],'
+			. 's[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],samp[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],script[charset|defer|language|src|type],select[class|dir<ltr?rtl|disabled<disabled|id|lang|multiple<multiple|name|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|size|style|tabindex|title],small[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],span[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],strike[class|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],strong/b[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],style[dir<ltr?rtl|lang|media|title|type],sub[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],sup[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],table[align<center?left?right|bgcolor|border|cellpadding|cellspacing|class|dir<ltr?rtl|frame|height|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rules|style|summary|title|width],'
+			. 'tbody[align<center?char?justify?left?right|char|class|charoff|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|valign<baseline?bottom?middle?top],td[abbr|align<center?char?justify?left?right|axis|bgcolor|char|charoff|class|colspan|dir<ltr?rtl|headers|height|id|lang|nowrap<nowrap|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rowspan|scope<col?colgroup?row?rowgroup|style|title|valign<baseline?bottom?middle?top|width],textarea[accesskey|class|cols|dir<ltr?rtl|disabled<disabled|id|lang|name|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onselect|readonly<readonly|rows|style|tabindex|title],tfoot[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|valign<baseline?bottom?middle?top],th[abbr|align<center?char?justify?left?right|axis|bgcolor|char|charoff|class|colspan|dir<ltr?rtl|headers|height|id|lang|nowrap<nowrap|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rowspan|scope<col?colgroup?row?rowgroup|style|title|valign<baseline?bottom?middle?top|width],thead[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|valign<baseline?bottom?middle?top],'
+			. 'title[dir<ltr?rtl|lang],tr[abbr|align<center?char?justify?left?right|bgcolor|char|charoff|class|rowspan|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|valign<baseline?bottom?middle?top],tt[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],u[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],ul[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|type],var[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title]';
+	else // Use a much smaller set
+		$valid_elements = '-a[id|href|title|rel],-strong/b,-em/i,-strike,-del,-u,p[class|align|dir],-ol,-ul,-li,br,img[class|src|alt|title|width|height|align],-sub,-sup,-blockquote[dir],-table[border|cellspacing|cellpadding|width|height|class|align|dir],thead[class|rowspan|width|height|align|valign|dir],tr[class|rowspan|width|height|align|valign|dir],th[dir|class|colspan|rowspan|width|height|align|valign|scope],td[dir|class|colspan|rowspan|width|height|align|valign],-div[dir|class|align],-span[class|align],-pre[class],-code[class],-address,-h1[class|align|dir],-h2[class|align|dir],-h3[class|align|dir],-h4[class|align|dir],-h5[class|align|dir],-h6[class|align|dir],hr';
+	$valid_elements = apply_filters('mce_valid_elements', $valid_elements);
+	$plugins = implode($plugins, ',');
+	$mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', 'separator', 'bullist', 'numlist', 'outdent', 'indent', 'separator', 'justifyleft', 'justifycenter', 'justifyright' ,'separator', 'link', 'unlink', 'image', 'wordpress', 'separator', 'undo', 'redo', 'code', 'wphelp'));
+	$mce_buttons = implode($mce_buttons, ',');
+	$mce_buttons_2 = apply_filters('mce_buttons_2', array());
+	$mce_buttons_2 = implode($mce_buttons_2, ',');
+	$mce_buttons_3 = apply_filters('mce_buttons_3', array());
+	$mce_buttons_3 = implode($mce_buttons_3, ',');
+	$mce_browsers = apply_filters('mce_browsers', array('msie', 'gecko', 'opera'));
+	$mce_browsers = implode($mce_browsers, ',');
+?>
+
+initArray = {
+	mode : "specific_textareas",
+	textarea_trigger : "title",
+	width : "100%",
+	theme : "advanced",
+	theme_advanced_buttons1 : "<?php echo $mce_buttons; ?>",
+	theme_advanced_buttons2 : "<?php echo $mce_buttons_2; ?>",
+	theme_advanced_buttons3 : "<?php echo $mce_buttons_3; ?>",
+	theme_advanced_toolbar_location : "top",
+	theme_advanced_toolbar_align : "left",
+	theme_advanced_path_location : "bottom",
+	theme_advanced_resizing : true,
+	browsers : "<?php echo $mce_browsers; ?>",
+	dialog_type : "modal",
+	theme_advanced_resize_horizontal : false,
+	entity_encoding : "raw",
+	relative_urls : false,
+	remove_script_host : false,
+	force_p_newlines : true,
+	force_br_newlines : false,
+	convert_newlines_to_brs : false,
+	remove_linebreaks : true,
+	save_callback : "wp_save_callback",
+	document_base_url : "<?php echo trailingslashit(get_bloginfo('home')); ?>",
+	valid_elements : "<?php echo $valid_elements; ?>",
+<?php do_action('mce_options'); ?>
+	plugins : "<?php echo $plugins; ?>"
+};
+
+<?php
+	// For people who really REALLY know what they're doing with TinyMCE
+	do_action('tinymce_before_init');
+?>
+
+tinyMCE.init(initArray);
+
diff -ruN 1.5.2/wp-includes/js/tinymce/tiny_mce.js 2.0.4/wp-includes/js/tinymce/tiny_mce.js
--- 1.5.2/wp-includes/js/tinymce/tiny_mce.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/tiny_mce.js	2005-12-10 19:32:05.000000000 -0600
@@ -0,0 +1,6081 @@
+/**
+ * $RCSfile: tiny_mce_src.js,v $
+ * $Revision: 1.281 $
+ * $Date: 2005/12/02 08:12:07 $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004, Moxiecode Systems AB, All rights reserved.
+ */
+
+function TinyMCE() {
+	this.majorVersion = "2";
+	this.minorVersion = "0";
+	this.releaseDate = "2005-12-01";
+
+	this.instances = new Array();
+	this.stickyClassesLookup = new Array();
+	this.windowArgs = new Array();
+	this.loadedFiles = new Array();
+	this.configs = new Array();
+	this.currentConfig = 0;
+	this.eventHandlers = new Array();
+
+	// Browser check
+	var ua = navigator.userAgent;
+	this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+	this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1);
+	this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1);
+	this.isGecko = ua.indexOf('Gecko') != -1;
+	this.isSafari = ua.indexOf('Safari') != -1;
+	this.isOpera = ua.indexOf('Opera') != -1;
+	this.isMac = ua.indexOf('Mac') != -1;
+	this.isNS7 = ua.indexOf('Netscape/7') != -1;
+	this.isNS71 = ua.indexOf('Netscape/7.1') != -1;
+	this.dialogCounter = 0;
+
+	// Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those
+	if (this.isOpera) {
+		this.isMSIE = true;
+		this.isGecko = false;
+		this.isSafari =  false;
+	}
+
+	// TinyMCE editor id instance counter
+	this.idCounter = 0;
+};
+
+TinyMCE.prototype.defParam = function(key, def_val) {
+	this.settings[key] = tinyMCE.getParam(key, def_val);
+};
+
+TinyMCE.prototype.init = function(settings) {
+	var theme;
+
+	this.settings = settings;
+
+	// Check if valid browser has execcommand support
+	if (typeof(document.execCommand) == 'undefined')
+		return;
+
+	// Get script base path
+	if (!tinyMCE.baseURL) {
+		var elements = document.getElementsByTagName('script');
+
+		for (var i=0; i<elements.length; i++) {
+			if (elements[i].src && (elements[i].src.indexOf("tiny_mce.js") != -1 || elements[i].src.indexOf("tiny_mce_src.js") != -1 || elements[i].src.indexOf("tiny_mce_gzip") != -1)) {
+				var src = elements[i].src;
+
+				tinyMCE.srcMode = (src.indexOf('_src') != -1) ? '_src' : '';
+				src = src.substring(0, src.lastIndexOf('/'));
+
+				tinyMCE.baseURL = src;
+				break;
+			}
+		}
+	}
+
+	// Get document base path
+	this.documentBasePath = document.location.href;
+	if (this.documentBasePath.indexOf('?') != -1)
+		this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));
+	this.documentURL = this.documentBasePath;
+	this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));
+
+	// If not HTTP absolute
+	if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {
+		// If site absolute
+		tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;
+	}
+
+	// Set default values on settings
+	this.defParam("mode", "none");
+	this.defParam("theme", "advanced");
+	this.defParam("plugins", "", true);
+	this.defParam("language", "en");
+	this.defParam("docs_language", this.settings['language']);
+	this.defParam("elements", "");
+	this.defParam("textarea_trigger", "mce_editable");
+	this.defParam("editor_selector", "");
+	this.defParam("editor_deselector", "mceNoEditor");
+	this.defParam("valid_elements", "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/b[class|style],-em/i[class|style],-strike[class|style],-u[class|style],+p[style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border=0|alt|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[style|dir|class|align],-h2[style|dir|class|align],-h3[style|dir|class|align],-h4[style|dir|class|align],-h5[style|dir|class|align],-h6[style|dir|class|align],hr[class|style],font[face|size|style|id|class|dir|color]");
+	this.defParam("extended_valid_elements", "");
+	this.defParam("invalid_elements", "");
+	this.defParam("encoding", "");
+	this.defParam("urlconverter_callback", tinyMCE.getParam("urlconvertor_callback", "TinyMCE.prototype.convertURL"));
+	this.defParam("save_callback", "");
+	this.defParam("debug", false);
+	this.defParam("force_br_newlines", false);
+	this.defParam("force_p_newlines", true);
+	this.defParam("add_form_submit_trigger", true);
+	this.defParam("relative_urls", true);
+	this.defParam("remove_script_host", true);
+	this.defParam("focus_alert", true);
+	this.defParam("document_base_url", this.documentURL);
+	this.defParam("visual", true);
+	this.defParam("visual_table_class", "mceVisualAid");
+	this.defParam("setupcontent_callback", "");
+	this.defParam("fix_content_duplication", true);
+	this.defParam("custom_undo_redo", true);
+	this.defParam("custom_undo_redo_levels", -1);
+	this.defParam("custom_undo_redo_keyboard_shortcuts", true);
+	this.defParam("verify_css_classes", false);
+	this.defParam("verify_html", true);
+	this.defParam("apply_source_formatting", false);
+	this.defParam("directionality", "ltr");
+	this.defParam("cleanup_on_startup", false);
+	this.defParam("inline_styles", false);
+	this.defParam("convert_newlines_to_brs", false);
+	this.defParam("auto_reset_designmode", true);
+	this.defParam("entities", "160,nbsp,38,amp,34,quot,162,cent,8364,euro,163,pound,165,yen,169,copy,174,reg,8482,trade,8240,permil,181,micro,183,middot,8226,bull,8230,hellip,8242,prime,8243,Prime,167,sect,182,para,223,szlig,8249,lsaquo,8250,rsaquo,171,laquo,187,raquo,8216,lsquo,8217,rsquo,8220,ldquo,8221,rdquo,8218,sbquo,8222,bdquo,60,lt,62,gt,8804,le,8805,ge,8211,ndash,8212,mdash,175,macr,8254,oline,164,curren,166,brvbar,168,uml,161,iexcl,191,iquest,710,circ,732,tilde,176,deg,8722,minus,177,plusmn,247,divide,8260,frasl,215,times,185,sup1,178,sup2,179,sup3,188,frac14,189,frac12,190,frac34,402,fnof,8747,int,8721,sum,8734,infin,8730,radic,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8712,isin,8713,notin,8715,ni,8719,prod,8743,and,8744,or,172,not,8745,cap,8746,cup,8706,part,8704,forall,8707,exist,8709,empty,8711,nabla,8727,lowast,8733,prop,8736,ang,180,acute,184,cedil,170,ordf,186,ordm,8224,dagger,8225,Dagger,192,Agrave,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,202,Ecirc,203,Euml,204,Igrave,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,212,Ocirc,213,Otilde,214,Ouml,216,Oslash,338,OElig,217,Ugrave,219,Ucirc,220,Uuml,376,Yuml,222,THORN,224,agrave,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,234,ecirc,235,euml,236,igrave,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,244,ocirc,245,otilde,246,ouml,248,oslash,339,oelig,249,ugrave,251,ucirc,252,uuml,254,thorn,255,yuml,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,8501,alefsym,982,piv,8476,real,977,thetasym,978,upsih,8472,weierp,8465,image,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8756,there4,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,173,shy,233,eacute,237,iacute,243,oacute,250,uacute,193,Aacute,225,aacute,201,Eacute,205,Iacute,211,Oacute,218,Uacute,221,Yacute,253,yacute");
+	this.defParam("entity_encoding", "named");
+	this.defParam("cleanup_callback", "");
+	this.defParam("add_unload_trigger", true);
+	this.defParam("ask", false);
+	this.defParam("nowrap", false);
+	this.defParam("auto_resize", false);
+	this.defParam("auto_focus", false);
+	this.defParam("cleanup", true);
+	this.defParam("remove_linebreaks", true);
+	this.defParam("button_tile_map", false);
+	this.defParam("submit_patch", true);
+	this.defParam("browsers", "msie,safari,gecko,opera");
+	this.defParam("dialog_type", "window");
+	this.defParam("accessibility_warnings", true);
+	this.defParam("merge_styles_invalid_parents", "");
+	this.defParam("force_hex_style_colors", true);
+	this.defParam("trim_span_elements", true);
+	this.defParam("convert_fonts_to_spans", false);
+	this.defParam("doctype", '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');
+	this.defParam("font_size_classes", '');
+	this.defParam("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large');
+	this.defParam("event_elements", 'a,img');
+	this.defParam("convert_urls", true);
+	this.defParam("table_inline_editing", false);
+	this.defParam("object_resizing", true);
+
+	// Browser check IE
+	if (this.isMSIE && this.settings['browsers'].indexOf('msie') == -1)
+		return;
+
+	// Browser check Gecko
+	if (this.isGecko && this.settings['browsers'].indexOf('gecko') == -1)
+		return;
+
+	// Browser check Safari
+	if (this.isSafari && this.settings['browsers'].indexOf('safari') == -1)
+		return;
+
+	// Browser check Opera
+	if (this.isOpera && this.settings['browsers'].indexOf('opera') == -1)
+		return;
+
+	// If not super absolute make it so
+	var baseHREF = tinyMCE.settings['document_base_url'];
+	var h = document.location.href;
+	var p = h.indexOf('://');
+	if (p > 0 && document.location.protocol != "file:") {
+		p = h.indexOf('/', p + 3);
+		h = h.substring(0, p);
+
+		if (baseHREF.indexOf('://') == -1)
+			baseHREF = h + baseHREF;
+
+		tinyMCE.settings['document_base_url'] = baseHREF;
+		tinyMCE.settings['document_base_prefix'] = h;
+	}
+
+	// Trim away query part
+	if (baseHREF.indexOf('?') != -1)
+		baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));
+
+	this.settings['base_href'] = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";
+
+	theme = this.settings['theme'];
+	this.blockRegExp = new RegExp("^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dir|fieldset|form|noscript|noframes|menu|isindex)$", "i");
+	this.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40);
+	this.uniqueURL = 'http://tinymce.moxiecode.cp/mce_temp_url'; // Make unique URL non real URL
+	this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';
+
+	// Theme url
+	this.settings['theme_href'] = tinyMCE.baseURL + "/themes/" + theme;
+
+	if (!tinyMCE.isMSIE)
+		this.settings['force_br_newlines'] = false;
+
+	if (tinyMCE.getParam("content_css", false)) {
+		var cssPath = tinyMCE.getParam("content_css", "");
+
+		// Is relative
+		if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
+			this.settings['content_css'] = this.documentBasePath + "/" + cssPath;
+		else
+			this.settings['content_css'] = cssPath;
+	} else
+		this.settings['content_css'] = '';
+
+	if (tinyMCE.getParam("popups_css", false)) {
+		var cssPath = tinyMCE.getParam("popups_css", "");
+
+		// Is relative
+		if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
+			this.settings['popups_css'] = this.documentBasePath + "/" + cssPath;
+		else
+			this.settings['popups_css'] = cssPath;
+	} else
+		this.settings['popups_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";
+
+	if (tinyMCE.getParam("editor_css", false)) {
+		var cssPath = tinyMCE.getParam("editor_css", "");
+
+		// Is relative
+		if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
+			this.settings['editor_css'] = this.documentBasePath + "/" + cssPath;
+		else
+			this.settings['editor_css'] = cssPath;
+	} else
+		this.settings['editor_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";
+
+	if (tinyMCE.settings['debug']) {
+		var msg = "Debug: \n";
+
+		msg += "baseURL: " + this.baseURL + "\n";
+		msg += "documentBasePath: " + this.documentBasePath + "\n";
+		msg += "content_css: " + this.settings['content_css'] + "\n";
+		msg += "popups_css: " + this.settings['popups_css'] + "\n";
+		msg += "editor_css: " + this.settings['editor_css'] + "\n";
+
+		alert(msg);
+	}
+
+	// Init HTML cleanup
+	this._initCleanup();
+
+	// Only do this once
+	if (this.configs.length == 0) {
+		// Is Safari enabled
+		if (this.isSafari && this.getParam('safari_warning', true))
+			alert("Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false");
+
+		tinyMCE.addEvent(window, "load", TinyMCE.prototype.onLoad);
+
+		if (tinyMCE.isMSIE) {
+			if (tinyMCE.settings['add_unload_trigger']) {
+				tinyMCE.addEvent(window, "unload", TinyMCE.prototype.unloadHandler);
+				tinyMCE.addEvent(window.document, "beforeunload", TinyMCE.prototype.unloadHandler);
+			}
+		} else {
+			if (tinyMCE.settings['add_unload_trigger'])
+				tinyMCE.addEvent(window, "unload", function () {tinyMCE.triggerSave(true, true);});
+		}
+	}
+
+	this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings['theme'] + '/editor_template' + tinyMCE.srcMode + '.js');
+	this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings['language'] +  '.js');
+	this.loadCSS(this.settings['editor_css']);
+
+	// Add plugins
+	var themePlugins = tinyMCE.getParam('plugins', '', true, ',');
+	if (this.settings['plugins'] != '') {
+		for (var i=0; i<themePlugins.length; i++)
+			this.loadScript(tinyMCE.baseURL + '/plugins/' + themePlugins[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');
+	}
+
+	// Setup entities
+	settings['cleanup_entities'] = new Array();
+	var entities = tinyMCE.getParam('entities', '', true, ',');
+	for (var i=0; i<entities.length; i+=2)
+		settings['cleanup_entities']['c' + entities[i]] = entities[i+1];
+
+	// Save away this config
+	settings['index'] = this.configs.length;
+	this.configs[this.configs.length] = settings;
+};
+
+TinyMCE.prototype.loadScript = function(url) {
+	for (var i=0; i<this.loadedFiles.length; i++) {
+		if (this.loadedFiles[i] == url)
+			return;
+	}
+
+	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></script>');
+
+	this.loadedFiles[this.loadedFiles.length] = url;
+};
+
+TinyMCE.prototype.loadCSS = function(url) {
+	for (var i=0; i<this.loadedFiles.length; i++) {
+		if (this.loadedFiles[i] == url)
+			return;
+	}
+
+	document.write('<link href="' + url + '" rel="stylesheet" type="text/css" />');
+
+	this.loadedFiles[this.loadedFiles.length] = url;
+};
+
+TinyMCE.prototype.importCSS = function(doc, css_file) {
+	if (css_file == '')
+		return;
+
+	if (typeof(doc.createStyleSheet) == "undefined") {
+		var elm = doc.createElement("link");
+
+		elm.rel = "stylesheet";
+		elm.href = css_file;
+
+		if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)
+			headArr[0].appendChild(elm);
+	} else
+		var styleSheet = doc.createStyleSheet(css_file);
+};
+
+TinyMCE.prototype.confirmAdd = function(e, settings) {
+	var elm = tinyMCE.isMSIE ? event.srcElement : e.target;
+	var elementId = elm.name ? elm.name : elm.id;
+
+	tinyMCE.settings = settings;
+
+	if (!elm.getAttribute('mce_noask') && confirm(tinyMCELang['lang_edit_confirm']))
+		tinyMCE.addMCEControl(elm, elementId);
+
+	elm.setAttribute('mce_noask', 'true');
+};
+
+TinyMCE.prototype.updateContent = function(form_element_name) {
+	// Find MCE instance linked to given form element and copy it's value
+	var formElement = document.getElementById(form_element_name);
+	for (var n in tinyMCE.instances) {
+		var inst = tinyMCE.instances[n];
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		inst.switchSettings();
+
+		if (inst.formElement == formElement) {
+			var doc = inst.getDoc();
+	
+			tinyMCE._setHTML(doc, inst.formElement.value);
+
+			if (!tinyMCE.isMSIE)
+				doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid);
+		}
+	}
+};
+
+TinyMCE.prototype.addMCEControl = function(replace_element, form_element_name, target_document) {
+	var id = "mce_editor_" + tinyMCE.idCounter++;
+	var inst = new TinyMCEControl(tinyMCE.settings);
+
+	inst.editorId = id;
+	this.instances[id] = inst;
+
+	inst.onAdd(replace_element, form_element_name, target_document);
+};
+
+TinyMCE.prototype.triggerSave = function(skip_cleanup, skip_callback) {
+	// Cleanup and set all form fields
+	for (var n in tinyMCE.instances) {
+		var inst = tinyMCE.instances[n];
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		inst.switchSettings();
+
+		tinyMCE.settings['preformatted'] = false;
+
+		// Default to false
+		if (typeof(skip_cleanup) == "undefined")
+			skip_cleanup = false;
+
+		// Default to false
+		if (typeof(skip_callback) == "undefined")
+			skip_callback = false;
+
+		tinyMCE._setHTML(inst.getDoc(), inst.getBody().innerHTML);
+
+		// Remove visual aids when cleanup is disabled
+		if (inst.settings['cleanup'] == false) {
+			tinyMCE.handleVisualAid(inst.getBody(), true, false, inst);
+			tinyMCE._setEventsEnabled(inst.getBody(), true);
+		}
+
+		tinyMCE._customCleanup(inst, "submit_content_dom", inst.contentWindow.document.body);
+		var htm = skip_cleanup ? inst.getBody().innerHTML : tinyMCE._cleanupHTML(inst, inst.getDoc(), this.settings, inst.getBody(), this.visualAid, true);
+		htm = tinyMCE._customCleanup(inst, "submit_content", htm);
+
+		if (tinyMCE.settings["encoding"] == "xml" || tinyMCE.settings["encoding"] == "html")
+			htm = tinyMCE.convertStringToXML(htm);
+
+		if (!skip_callback && tinyMCE.settings['save_callback'] != "")
+			var content = eval(tinyMCE.settings['save_callback'] + "(inst.formTargetElementId,htm,inst.getBody());");
+
+		// Use callback content if available
+		if ((typeof(content) != "undefined") && content != null)
+			htm = content;
+
+		// Replace some weird entities (Bug: #1056343)
+		htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");
+		htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");
+		htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");
+		htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");
+		htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");
+
+		if (inst.formElement)
+			inst.formElement.value = htm;
+	}
+};
+
+TinyMCE.prototype._setEventsEnabled = function(node, state) {
+	var events = new Array('onfocus','onblur','onclick','ondblclick',
+				'onmousedown','onmouseup','onmouseover','onmousemove',
+				'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup');
+
+	var evs = tinyMCE.settings['event_elements'].split(',');
+    for (var y=0; y<evs.length; y++){
+		var elms = node.getElementsByTagName(evs[y]);
+		for (var i=0; i<elms.length; i++) {
+			var event = "";
+
+			for (var x=0; x<events.length; x++) {
+				if ((event = tinyMCE.getAttrib(elms[i], events[x])) != '') {
+					event = tinyMCE.cleanupEventStr("" + event);
+
+					if (!state)
+						event = "return true;" + event;
+					else
+						event = event.replace(/^return true;/gi, '');
+
+					elms[i].removeAttribute(events[x]);
+					elms[i].setAttribute(events[x], event);
+				}
+			}
+		}
+	}
+};
+
+TinyMCE.prototype.resetForm = function(form_index) {
+	var formObj = document.forms[form_index];
+
+	for (var n in tinyMCE.instances) {
+		var inst = tinyMCE.instances[n];
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		inst.switchSettings();
+
+		for (var i=0; i<formObj.elements.length; i++) {
+			if (inst.formTargetElementId == formObj.elements[i].name)
+				inst.getBody().innerHTML = inst.startContent;
+		}
+	}
+};
+
+TinyMCE.prototype.execInstanceCommand = function(editor_id, command, user_interface, value, focus) {
+	var inst = tinyMCE.getInstanceById(editor_id);
+	if (inst) {
+		if (typeof(focus) == "undefined")
+			focus = true;
+
+		if (focus)
+			inst.contentWindow.focus();
+
+		// Reset design mode if lost
+		inst.autoResetDesignMode();
+
+		this.selectedElement = inst.getFocusElement();
+		this.selectedInstance = inst;
+		tinyMCE.execCommand(command, user_interface, value);
+
+		// Cancel event so it doesn't call onbeforeonunlaod
+		if (tinyMCE.isMSIE && window.event != null)
+			tinyMCE.cancelEvent(window.event);
+	}
+};
+
+TinyMCE.prototype.execCommand = function(command, user_interface, value) {
+	// Default input
+	user_interface = user_interface ? user_interface : false;
+	value = value ? value : null;
+
+	if (tinyMCE.selectedInstance)
+		tinyMCE.selectedInstance.switchSettings();
+
+	switch (command) {
+		case 'mceHelp':
+			var template = new Array();
+
+			template['file']   = 'about.htm';
+			template['width']  = 480;
+			template['height'] = 380;
+
+			tinyMCE.openWindow(template, {
+				tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion,
+				tinymce_releasedate : tinyMCE.releaseDate,
+				inline : "yes"
+			});
+		return;
+
+		case 'mceFocus':
+			var inst = tinyMCE.getInstanceById(value);
+			if (inst)
+				inst.contentWindow.focus();
+		return;
+
+		case "mceAddControl":
+		case "mceAddEditor":
+			tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
+			return;
+
+		case "mceAddFrameControl":
+			tinyMCE.addMCEControl(tinyMCE._getElementById(value), value['element'], value['document']);
+			return;
+
+		case "mceRemoveControl":
+		case "mceRemoveEditor":
+			tinyMCE.removeMCEControl(value);
+			return;
+
+		case "mceResetDesignMode":
+			// Resets the designmode state of the editors in Gecko
+			if (!tinyMCE.isMSIE) {
+				for (var n in tinyMCE.instances) {
+					if (!tinyMCE.isInstance(tinyMCE.instances[n]))
+						continue;
+
+					try {
+						tinyMCE.instances[n].getDoc().designMode = "on";
+					} catch (e) {
+						// Ignore any errors
+					}
+				}
+			}
+
+			return;
+	}
+
+	if (this.selectedInstance) {
+		this.selectedInstance.execCommand(command, user_interface, value);
+	} else if (tinyMCE.settings['focus_alert'])
+		alert(tinyMCELang['lang_focus_alert']);
+};
+
+TinyMCE.prototype.eventPatch = function(editor_id) {
+	// Remove odd, error
+	if (typeof(tinyMCE) == "undefined")
+		return true;
+
+	for (var i=0; i<document.frames.length; i++) {
+		try {
+			if (document.frames[i].event) {
+				var event = document.frames[i].event;
+
+				if (!event.target)
+					event.target = event.srcElement;
+
+				TinyMCE.prototype.handleEvent(event);
+				return;
+			}
+		} catch (ex) {
+			// Ignore error if iframe is pointing to external URL
+		}
+	}
+};
+
+TinyMCE.prototype.unloadHandler = function() {
+	tinyMCE.triggerSave(true, true);
+};
+
+TinyMCE.prototype.addEventHandlers = function(editor_id) {
+	if (tinyMCE.isMSIE) {
+		var doc = document.frames[editor_id].document;
+
+		// Event patch
+		tinyMCE.addEvent(doc, "keypress", TinyMCE.prototype.eventPatch);
+		tinyMCE.addEvent(doc, "keyup", TinyMCE.prototype.eventPatch);
+		tinyMCE.addEvent(doc, "keydown", TinyMCE.prototype.eventPatch);
+		tinyMCE.addEvent(doc, "mouseup", TinyMCE.prototype.eventPatch);
+		tinyMCE.addEvent(doc, "click", TinyMCE.prototype.eventPatch);
+	} else {
+		var inst = tinyMCE.instances[editor_id];
+		var doc = inst.getDoc();
+
+		inst.switchSettings();
+
+		tinyMCE.addEvent(doc, "keypress", tinyMCE.handleEvent);
+		tinyMCE.addEvent(doc, "keydown", tinyMCE.handleEvent);
+		tinyMCE.addEvent(doc, "keyup", tinyMCE.handleEvent);
+		tinyMCE.addEvent(doc, "click", tinyMCE.handleEvent);
+		tinyMCE.addEvent(doc, "mouseup", tinyMCE.handleEvent);
+		tinyMCE.addEvent(doc, "mousedown", tinyMCE.handleEvent);
+		tinyMCE.addEvent(doc, "focus", tinyMCE.handleEvent);
+		tinyMCE.addEvent(doc, "blur", tinyMCE.handleEvent);
+
+		eval('try { doc.designMode = "On"; } catch(e) {}');
+	}
+};
+
+TinyMCE.prototype._createIFrame = function(replace_element) {
+	var iframe = document.createElement("iframe");
+	var id = replace_element.getAttribute("id");
+	var aw, ah;
+
+	aw = "" + tinyMCE.settings['area_width'];
+	ah = "" + tinyMCE.settings['area_height'];
+
+	if (aw.indexOf('%') == -1) {
+		aw = parseInt(aw);
+		aw = aw < 0 ? 300 : aw;
+		aw = aw + "px";
+	}
+
+	if (ah.indexOf('%') == -1) {
+		ah = parseInt(ah);
+		ah = ah < 0 ? 240 : ah;
+		ah = ah + "px";
+	}
+
+	iframe.setAttribute("id", id);
+	//iframe.setAttribute("className", "mceEditorArea");
+	iframe.setAttribute("border", "0");
+	iframe.setAttribute("frameBorder", "0");
+	iframe.setAttribute("marginWidth", "0");
+	iframe.setAttribute("marginHeight", "0");
+	iframe.setAttribute("leftMargin", "0");
+	iframe.setAttribute("topMargin", "0");
+	iframe.setAttribute("width", aw);
+	iframe.setAttribute("height", ah);
+	iframe.setAttribute("allowtransparency", "true");
+
+	if (tinyMCE.settings["auto_resize"])
+		iframe.setAttribute("scrolling", "no");
+
+	// Must have a src element in MSIE HTTPs breaks aswell as absoute URLs
+	if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+		iframe.setAttribute("src", this.settings['default_document']);
+
+	iframe.style.width = aw;
+	iframe.style.height = ah;
+
+	// MSIE 5.0 issue
+	if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+		replace_element.outerHTML = iframe.outerHTML;
+	else
+		replace_element.parentNode.replaceChild(iframe, replace_element);
+
+	if (tinyMCE.isMSIE)
+		return window.frames[id];
+	else
+		return iframe;
+};
+
+TinyMCE.prototype.setupContent = function(editor_id) {
+	var inst = tinyMCE.instances[editor_id];
+	var doc = inst.getDoc();
+	var head = doc.getElementsByTagName('head').item(0);
+	var content = inst.startContent;
+
+	tinyMCE.operaOpacityCounter = 100 * tinyMCE.idCounter;
+
+	inst.switchSettings();
+
+	// Not loaded correctly hit it again, Mozilla bug #997860
+	if (!tinyMCE.isMSIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {
+		// This part will remove the designMode status
+		// Failes first time in Firefox 1.5b2 on Mac
+		try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}
+		window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);
+		return;
+	}
+
+	if (!head) {
+		window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);
+		return;
+	}
+
+	// Import theme specific content CSS the user specific
+	tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings['theme'] + "/css/editor_content.css");
+	tinyMCE.importCSS(inst.getDoc(), inst.settings['content_css']);
+	tinyMCE.executeCallback('init_instance_callback', '_initInstance', 0, inst);
+
+	// Setup span styles
+	if (tinyMCE.getParam("convert_fonts_to_spans"))
+		inst.getDoc().body.setAttribute('id', 'mceSpanFonts');
+
+	if (tinyMCE.settings['nowrap'])
+		doc.body.style.whiteSpace = "nowrap";
+
+	doc.body.dir = this.settings['directionality'];
+	doc.editorId = editor_id;
+
+	// Add on document element in Mozilla
+	if (!tinyMCE.isMSIE)
+		doc.documentElement.editorId = editor_id;
+
+	// Setup base element
+	var base = doc.createElement("base");
+	base.setAttribute('href', tinyMCE.settings['base_href']);
+	head.appendChild(base);
+
+	// Replace new line characters to BRs
+	if (tinyMCE.settings['convert_newlines_to_brs']) {
+		content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");
+		content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");
+		content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");
+	}
+
+	// Open closed anchors
+//	content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
+
+	// Call custom cleanup code
+	content = tinyMCE.storeAwayURLs(content);
+	content = tinyMCE._customCleanup(inst, "insert_to_editor", content);
+
+	if (tinyMCE.isMSIE) {
+		// Ugly!!!
+		window.setInterval('try{tinyMCE.getCSSClasses(document.frames["' + editor_id + '"].document, "' + editor_id + '");}catch(e){}', 500);
+
+		if (tinyMCE.settings["force_br_newlines"])
+			document.frames[editor_id].document.styleSheets[0].addRule("p", "margin: 0px;");
+
+		var body = document.frames[editor_id].document.body;
+
+		tinyMCE.addEvent(body, "beforepaste", TinyMCE.prototype.eventPatch);
+		tinyMCE.addEvent(body, "beforecut", TinyMCE.prototype.eventPatch);
+
+		body.editorId = editor_id;
+	}
+
+	content = tinyMCE.cleanupHTMLCode(content);
+
+	// Fix for bug #958637
+	if (!tinyMCE.isMSIE) {
+		var contentElement = inst.getDoc().createElement("body");
+		var doc = inst.getDoc();
+
+		contentElement.innerHTML = content;
+
+		// Remove weridness!
+		if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt'])
+			content = content.replace(new RegExp('&lt;&gt;', 'g'), "");
+
+		if (tinyMCE.settings['cleanup_on_startup'])
+			tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));
+		else {
+			// Convert all strong/em to b/i
+			content = tinyMCE.regexpReplace(content, "<strong", "<b", "gi");
+			content = tinyMCE.regexpReplace(content, "<em(/?)>", "<i$1>", "gi");
+			content = tinyMCE.regexpReplace(content, "<em ", "<i ", "gi");
+			content = tinyMCE.regexpReplace(content, "</strong>", "</b>", "gi");
+			content = tinyMCE.regexpReplace(content, "</em>", "</i>", "gi");
+			tinyMCE.setInnerHTML(inst.getBody(), content);
+		}
+
+		inst.convertAllRelativeURLs();
+	} else {
+		if (tinyMCE.settings['cleanup_on_startup']) {
+			tinyMCE._setHTML(inst.getDoc(), content);
+
+			// Produces permission denied error in MSIE 5.5
+			eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}');
+		} else
+			tinyMCE._setHTML(inst.getDoc(), content);
+	}
+
+	// Fix for bug #957681
+	//inst.getDoc().designMode = inst.getDoc().designMode;
+
+	// Setup element references
+	var parentElm = document.getElementById(inst.editorId + '_parent');
+	if (parentElm.lastChild.nodeName == "INPUT")
+		inst.formElement = tinyMCE.isGecko ? parentElm.firstChild : parentElm.lastChild;
+	else
+		inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
+
+	tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual'], inst);
+	tinyMCE.executeCallback('setupcontent_callback', '_setupContent', 0, editor_id, inst.getBody(), inst.getDoc());
+
+	// Re-add design mode on mozilla
+	if (!tinyMCE.isMSIE)
+		TinyMCE.prototype.addEventHandlers(editor_id);
+
+	// Add blur handler
+	if (tinyMCE.isMSIE)
+		tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE.prototype.eventPatch);
+
+	// Trigger node change, this call locks buttons for tables and so forth
+	tinyMCE.selectedInstance = inst;
+	tinyMCE.selectedElement = inst.contentWindow.document.body;
+
+	if (!inst.isHidden())
+		tinyMCE.triggerNodeChange(false, true);
+
+	// Call custom DOM cleanup
+	tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());
+	tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());
+	tinyMCE._setEventsEnabled(inst.getBody(), false);
+	tinyMCE.cleanupAnchors(inst.getDoc());
+
+	if (tinyMCE.getParam("convert_fonts_to_spans"))
+		tinyMCE.convertSpansToFonts(inst.getDoc());
+
+	inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);
+	inst.undoLevels[inst.undoLevels.length] = inst.startContent;
+
+	tinyMCE.operaOpacityCounter = -1;
+};
+
+TinyMCE.prototype.cleanupHTMLCode = function(s) {
+	s = s.replace(/<p \/>/gi, '<p>&nbsp;</p>');
+	s = s.replace(/<p>\s*<\/p>/gi, '<p>&nbsp;</p>');
+
+	// Open closed tags like <b/> to <b></b>
+//	tinyMCE.debug("f:" + s);
+	s = s.replace(/<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\|>]*?)\/>/gi, '<$1$2$3></$1$2>');
+//	tinyMCE.debug("e:" + s);
+
+	// Remove trailing space <b > to <b>
+	s = s.replace(new RegExp('\\s+></', 'gi'), '></');
+
+	// Close tags <img></img> to <img/>
+	s = s.replace(/<(img|br|hr)(.*?)><\/(img|br|hr)>/gi, '<$1$2 />');
+
+	// Weird MSIE bug, <p><hr /></p> breaks runtime?
+	if (tinyMCE.isMSIE)
+		s = s.replace(/<p><hr \/><\/p>/gi, "<hr>");
+
+	// Convert relative anchors to absolute URLs ex: #something to file.htm#something
+	s = s.replace(new RegExp('(href=\"?)(\\s*?#)', 'gi'), '$1' + tinyMCE.settings['document_base_url'] + "#");
+
+	return s;
+};
+
+TinyMCE.prototype.storeAwayURLs = function(s) {
+	// Remove all mce_src, mce_href and replace them with new ones
+	s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
+	s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
+	s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');
+	s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"');
+
+	return s;
+};
+
+TinyMCE.prototype.cancelEvent = function(e) {
+	if (tinyMCE.isMSIE) {
+		e.returnValue = false;
+		e.cancelBubble = true;
+	} else
+		e.preventDefault();
+};
+
+TinyMCE.prototype.removeTinyMCEFormElements = function(form_obj) {
+	// Check if form is valid
+	if (typeof(form_obj) == "undefined" || form_obj == null)
+		return;
+
+	// If not a form, find the form
+	if (form_obj.nodeName != "FORM") {
+		if (form_obj.form)
+			form_obj = form_obj.form;
+		else
+			form_obj = tinyMCE.getParentElement(form_obj, "form");
+	}
+
+	// Still nothing
+	if (form_obj == null)
+		return;
+
+	// Disable all UI form elements that TinyMCE created
+	for (var i=0; i<form_obj.elements.length; i++) {
+		var elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;
+
+		if (elementId.indexOf('mce_editor_') == 0)
+			form_obj.elements[i].disabled = true;
+	}
+};
+
+TinyMCE.prototype.accessibleEventHandler = function(e) {
+	var win = this._win;
+	e = tinyMCE.isMSIE ? win.event : e;
+	var elm = tinyMCE.isMSIE ? e.srcElement : e.target;
+
+	// Piggyback onchange
+	if (elm.nodeName == "SELECT" && !elm.oldonchange) {
+		elm.oldonchange = elm.onchange;
+		elm.onchange = null;
+	}
+
+	// Execute onchange and remove piggyback
+	if (e.keyCode == 13 || e.keyCode == 32) {
+		elm.onchange = elm.oldonchange;
+		elm.onchange();
+		elm.oldonchange = null;
+		tinyMCE.cancelEvent(e);
+	}
+};
+
+TinyMCE.prototype.addSelectAccessibility = function(e, select, win) {
+	// Add event handlers 
+	if (!select._isAccessible) {
+		select.onkeydown = tinyMCE.accessibleEventHandler;
+		select._isAccessible = true;
+		select._win = win;
+	}
+};
+
+TinyMCE.prototype.handleEvent = function(e) {
+	// Remove odd, error
+	if (typeof(tinyMCE) == "undefined")
+		return true;
+
+	//tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));
+
+	switch (e.type) {
+		case "blur":
+			if (tinyMCE.selectedInstance)
+				tinyMCE.selectedInstance.execCommand('mceEndTyping');
+
+			return;
+
+		case "submit":
+			tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE ? window.event.srcElement : e.target);
+			tinyMCE.triggerSave();
+			tinyMCE.isNotDirty = true;
+			return;
+
+		case "reset":
+			var formObj = tinyMCE.isMSIE ? window.event.srcElement : e.target;
+
+			for (var i=0; i<document.forms.length; i++) {
+				if (document.forms[i] == formObj)
+					window.setTimeout('tinyMCE.resetForm(' + i + ');', 10);
+			}
+
+			return;
+
+		case "keypress":
+			if (e.target.editorId) {
+				tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+			} else {
+				if (e.target.ownerDocument.editorId)
+					tinyMCE.selectedInstance = tinyMCE.instances[e.target.ownerDocument.editorId];
+			}
+
+			if (tinyMCE.selectedInstance)
+				tinyMCE.selectedInstance.switchSettings();
+
+			// Insert space instead of &nbsp;
+/*			if (tinyMCE.isGecko && e.charCode == 32) {
+				if (tinyMCE.selectedInstance._insertSpace()) {
+					// Cancel event
+					e.preventDefault();
+					return false;
+				}
+			}*/
+
+			// Insert P element
+			if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && e.keyCode == 13 && !e.shiftKey) {
+				// Insert P element instead of BR
+				if (tinyMCE.selectedInstance._insertPara(e)) {
+					// Cancel event
+					tinyMCE.execCommand("mceAddUndoLevel");
+					tinyMCE.cancelEvent(e);
+					return false;
+				}
+			}
+
+			// Handle backspace
+			if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+				// Insert P element instead of BR
+				if (tinyMCE.selectedInstance._handleBackSpace(e.type)) {
+					// Cancel event
+					tinyMCE.execCommand("mceAddUndoLevel");
+					tinyMCE.cancelEvent(e);
+					return false;
+				}
+			}
+
+			// Mozilla custom key handling
+			if (tinyMCE.isGecko && (e.ctrlKey && !e.altKey) && tinyMCE.settings['custom_undo_redo']) {
+				if (tinyMCE.settings['custom_undo_redo_keyboard_shortcuts']) {
+					if (e.charCode == 122) { // Ctrl+Z
+						tinyMCE.selectedInstance.execCommand("Undo");
+						tinyMCE.cancelEvent(e);
+						return false;
+					}
+
+					if (e.charCode == 121) { // Ctrl+Y
+						tinyMCE.selectedInstance.execCommand("Redo");
+						tinyMCE.cancelEvent(e);
+						return false;
+					}
+				}
+
+				if (e.charCode == 98) { // Ctrl+B
+					tinyMCE.selectedInstance.execCommand("Bold");
+					tinyMCE.cancelEvent(e);
+					return false;
+				}
+
+				if (e.charCode == 105) { // Ctrl+I
+					tinyMCE.selectedInstance.execCommand("Italic");
+					tinyMCE.cancelEvent(e);
+					return false;
+				}
+
+				if (e.charCode == 117) { // Ctrl+U
+					tinyMCE.selectedInstance.execCommand("Underline");
+					tinyMCE.cancelEvent(e);
+					return false;
+				}
+
+				if (e.charCode == 118) { // Ctrl+V
+					tinyMCE.selectedInstance.execCommand("mceInsertContent", false, '<geckopastefix/>');
+				}
+			}
+
+			// Return key pressed
+			if (tinyMCE.isMSIE && tinyMCE.settings['force_br_newlines'] && e.keyCode == 13) {
+				if (e.target.editorId)
+					tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+
+				if (tinyMCE.selectedInstance) {
+					var sel = tinyMCE.selectedInstance.getDoc().selection;
+					var rng = sel.createRange();
+
+					if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)
+						return false;
+
+					// Cancel event
+					e.returnValue = false;
+					e.cancelBubble = true;
+
+					// Insert BR element
+					rng.pasteHTML("<br />");
+					rng.collapse(false);
+					rng.select();
+
+					tinyMCE.execCommand("mceAddUndoLevel");
+					tinyMCE.triggerNodeChange(false);
+					return false;
+				}
+			}
+
+			// Backspace or delete
+			if (e.keyCode == 8 || e.keyCode == 46) {
+				tinyMCE.selectedElement = e.target;
+				tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");
+				tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");
+				tinyMCE.triggerNodeChange(false);
+			}
+
+			return false;
+		break;
+
+		case "keyup":
+		case "keydown":
+			if (e.target.editorId)
+				tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+			else
+				return;
+
+			if (tinyMCE.selectedInstance)
+				tinyMCE.selectedInstance.switchSettings();
+
+			var inst = tinyMCE.selectedInstance;
+
+			// Handle backspace
+			if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+				// Insert P element instead of BR
+				if (tinyMCE.selectedInstance._handleBackSpace(e.type)) {
+					// Cancel event
+					tinyMCE.execCommand("mceAddUndoLevel");
+					e.preventDefault();
+					return false;
+				}
+			}
+
+			tinyMCE.selectedElement = null;
+			tinyMCE.selectedNode = null;
+			var elm = tinyMCE.selectedInstance.getFocusElement();
+			tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");
+			tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");
+			tinyMCE.selectedElement = elm;
+
+			// Update visualaids on tabs
+			if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)
+				tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);
+
+			// Fix empty elements on return/enter, check where enter occured
+			if (tinyMCE.isMSIE && e.type == "keydown" && e.keyCode == 13)
+				tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();
+
+			// Fix empty elements on return/enter
+			if (tinyMCE.isMSIE && e.type == "keyup" && e.keyCode == 13) {
+				var elm = tinyMCE.enterKeyElement;
+				if (elm) {
+					var re = new RegExp('^HR|IMG|BR$','g'); // Skip these
+					var dre = new RegExp('^H[1-6]$','g'); // Add double on these
+
+					if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {
+						if (dre.test(elm.nodeName))
+							elm.innerHTML = "&nbsp;&nbsp;";
+						else
+							elm.innerHTML = "&nbsp;";
+					}
+				}
+			}
+
+			// Check if it's a position key
+			var keys = tinyMCE.posKeyCodes;
+			var posKey = false;
+			for (var i=0; i<keys.length; i++) {
+				if (keys[i] == e.keyCode) {
+					posKey = true;
+					break;
+				}
+			}
+
+			// MSIE custom key handling
+			if (tinyMCE.isMSIE && tinyMCE.settings['custom_undo_redo']) {
+				var keys = new Array(8,46); // Backspace,Delete
+				for (var i=0; i<keys.length; i++) {
+					if (keys[i] == e.keyCode) {
+						if (e.type == "keyup")
+							tinyMCE.triggerNodeChange(false);
+					}
+				}
+
+				if (tinyMCE.settings['custom_undo_redo_keyboard_shortcuts']) {
+					if (e.keyCode == 90 && (e.ctrlKey && !e.altKey) && e.type == "keydown") { // Ctrl+Z
+						tinyMCE.selectedInstance.execCommand("Undo");
+						tinyMCE.triggerNodeChange(false);
+					}
+
+					if (e.keyCode == 89 && (e.ctrlKey && !e.altKey) && e.type == "keydown") { // Ctrl+Y
+						tinyMCE.selectedInstance.execCommand("Redo");
+						tinyMCE.triggerNodeChange(false);
+					}
+
+					if ((e.keyCode == 90 || e.keyCode == 89) && (e.ctrlKey && !e.altKey)) {
+						// Cancel event
+						e.returnValue = false;
+						e.cancelBubble = true;
+						return false;
+					}
+				}
+			}
+
+			// If undo/redo key
+			if ((e.keyCode == 90 || e.keyCode == 89) && (e.ctrlKey && !e.altKey))
+				return true;
+
+			// If Ctrl key
+			if (e.keyCode == 17)
+				return true;
+
+			// Handle Undo/Redo when typing content
+
+			// Start typing (non position key)
+			if (!posKey && e.type == "keyup")
+				tinyMCE.execCommand("mceStartTyping");
+
+			// End typing (position key) or some Ctrl event
+			if (e.type == "keyup" && (posKey || e.ctrlKey))
+				tinyMCE.execCommand("mceEndTyping");
+
+			if (posKey && e.type == "keyup")
+				tinyMCE.triggerNodeChange(false);
+
+			if (tinyMCE.isMSIE && e.ctrlKey)
+				window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+		break;
+
+		case "mousedown":
+		case "mouseup":
+		case "click":
+		case "focus":
+			if (tinyMCE.selectedInstance)
+				tinyMCE.selectedInstance.switchSettings();
+
+			// Check instance event trigged on
+			var targetBody = tinyMCE.getParentElement(e.target, "body");
+			for (var instanceName in tinyMCE.instances) {
+				if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))
+					continue;
+
+				var inst = tinyMCE.instances[instanceName];
+
+				// Reset design mode if lost (on everything just in case)
+				inst.autoResetDesignMode();
+
+				if (inst.getBody() == targetBody) {
+					tinyMCE.selectedInstance = inst;
+					tinyMCE.selectedElement = e.target;
+					tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
+					tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");
+					break;
+				}
+			}
+
+			if (tinyMCE.isSafari) {
+				tinyMCE.selectedInstance.lastSafariSelection = tinyMCE.selectedInstance.getBookmark();
+				tinyMCE.selectedInstance.lastSafariSelectedElement = tinyMCE.selectedElement;
+
+				var lnk = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
+
+				// Patch the darned link
+				if (lnk && e.type == "mousedown") {
+					lnk.setAttribute("mce_real_href", lnk.getAttribute("href"));
+					lnk.setAttribute("href", "javascript:void(0);");
+				}
+
+				// Patch back
+				if (lnk && e.type == "click") {
+					window.setTimeout(function() {
+						lnk.setAttribute("href", lnk.getAttribute("mce_real_href"));
+						lnk.removeAttribute("mce_real_href");
+					}, 10);
+				}
+			}
+
+			// Reset selected node
+			if (e.type != "focus")
+				tinyMCE.selectedNode = null;
+
+			tinyMCE.triggerNodeChange(false);
+			tinyMCE.execCommand("mceEndTyping");
+
+			if (e.type == "mouseup")
+				tinyMCE.execCommand("mceAddUndoLevel");
+
+			// Just in case
+			if (!tinyMCE.selectedInstance && e.target.editorId)
+				tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+
+			return false;
+		break;
+    } // end switch
+}; // end function
+
+TinyMCE.prototype.switchClass = function(element, class_name, lock_state) {
+	var lockChanged = false;
+
+	if (typeof(lock_state) != "undefined" && element != null) {
+		element.classLock = lock_state;
+		lockChanged = true;
+	}
+
+	if (element != null && (lockChanged || !element.classLock)) {
+		element.oldClassName = element.className;
+		element.className = class_name;
+	}
+};
+
+TinyMCE.prototype.restoreAndSwitchClass = function(element, class_name) {
+	if (element != null && !element.classLock) {
+		this.restoreClass(element);
+		this.switchClass(element, class_name);
+	}
+};
+
+TinyMCE.prototype.switchClassSticky = function(element_name, class_name, lock_state) {
+	var element, lockChanged = false;
+
+	// Performance issue
+	if (!this.stickyClassesLookup[element_name])
+		this.stickyClassesLookup[element_name] = document.getElementById(element_name);
+
+//	element = document.getElementById(element_name);
+	element = this.stickyClassesLookup[element_name];
+
+	if (typeof(lock_state) != "undefined" && element != null) {
+		element.classLock = lock_state;
+		lockChanged = true;
+	}
+
+	if (element != null && (lockChanged || !element.classLock)) {
+		element.className = class_name;
+		element.oldClassName = class_name;
+
+		// Fix opacity in Opera
+		if (tinyMCE.isOpera) {
+			if (class_name == "mceButtonDisabled") {
+				var suffix = "";
+
+				if (!element.mceOldSrc)
+					element.mceOldSrc = element.src;
+
+				if (this.operaOpacityCounter > -1)
+					suffix = '?rnd=' + this.operaOpacityCounter++;
+
+				element.src = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/images/opacity.png" + suffix;
+				element.style.backgroundImage = "url('" + element.mceOldSrc + "')";
+			} else {
+				if (element.mceOldSrc) {
+					element.src = element.mceOldSrc;
+					element.parentNode.style.backgroundImage = "";
+					element.mceOldSrc = null;
+				}
+			}
+		}
+	}
+};
+
+TinyMCE.prototype.restoreClass = function(element) {
+	if (element != null && element.oldClassName && !element.classLock) {
+		element.className = element.oldClassName;
+		element.oldClassName = null;
+	}
+};
+
+TinyMCE.prototype.setClassLock = function(element, lock_state) {
+	if (element != null)
+		element.classLock = lock_state;
+};
+
+TinyMCE.prototype.addEvent = function(obj, name, handler) {
+	if (tinyMCE.isMSIE) {
+		obj.attachEvent("on" + name, handler);
+	} else
+		obj.addEventListener(name, handler, false);
+};
+
+TinyMCE.prototype.submitPatch = function() {
+	tinyMCE.removeTinyMCEFormElements(this);
+	tinyMCE.triggerSave();
+	this.mceOldSubmit();
+	tinyMCE.isNotDirty = true;
+};
+
+TinyMCE.prototype.onLoad = function() {
+	for (var c=0; c<tinyMCE.configs.length; c++) {
+		tinyMCE.settings = tinyMCE.configs[c];
+
+		var selector = tinyMCE.getParam("editor_selector");
+		var deselector = tinyMCE.getParam("editor_deselector");
+		var elementRefAr = new Array();
+
+		// Add submit triggers
+		if (document.forms && tinyMCE.settings['add_form_submit_trigger'] && !tinyMCE.submitTriggers) {
+			for (var i=0; i<document.forms.length; i++) {
+				var form = document.forms[i];
+
+				tinyMCE.addEvent(form, "submit", TinyMCE.prototype.handleEvent);
+				tinyMCE.addEvent(form, "reset", TinyMCE.prototype.handleEvent);
+				tinyMCE.submitTriggers = true; // Do it only once
+
+				// Patch the form.submit function
+				if (tinyMCE.settings['submit_patch']) {
+					try {
+						form.mceOldSubmit = form.submit;
+						form.submit = TinyMCE.prototype.submitPatch;
+					} catch (e) {
+						// Do nothing
+					}
+				}
+			}
+		}
+
+		// Add editor instances based on mode
+		var mode = tinyMCE.settings['mode'];
+		switch (mode) {
+			case "exact":
+				var elements = tinyMCE.getParam('elements', '', true, ',');
+
+				for (var i=0; i<elements.length; i++) {
+					var element = tinyMCE._getElementById(elements[i]);
+					var trigger = element ? element.getAttribute(tinyMCE.settings['textarea_trigger']) : "";
+
+					if (tinyMCE.getAttrib(element, "class").indexOf(deselector) != -1)
+						continue;
+
+					if (trigger == "false")
+						continue;
+
+					if (tinyMCE.settings['ask'] && element) {
+						elementRefAr[elementRefAr.length] = element;
+						continue;
+					}
+
+					if (element)
+						tinyMCE.addMCEControl(element, elements[i]);
+					else if (tinyMCE.settings['debug'])
+						alert("Error: Could not find element by id or name: " + elements[i]);
+				}
+			break;
+
+			case "specific_textareas":
+			case "textareas":
+				var nodeList = document.getElementsByTagName("textarea");
+
+				for (var i=0; i<nodeList.length; i++) {
+					var elm = nodeList.item(i);
+					var trigger = elm.getAttribute(tinyMCE.settings['textarea_trigger']);
+
+					if (selector != '' && tinyMCE.getAttrib(elm, "class").indexOf(selector) == -1)
+						continue;
+
+					if (selector != '')
+						trigger = selector != "" ? "true" : "";
+
+					if (tinyMCE.getAttrib(elm, "class").indexOf(deselector) != -1)
+						continue;
+
+					if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))
+						elementRefAr[elementRefAr.length] = elm;
+				}
+			break;
+		}
+
+		for (var i=0; i<elementRefAr.length; i++) {
+			var element = elementRefAr[i];
+			var elementId = element.name ? element.name : element.id;
+
+			if (tinyMCE.settings['ask']) {
+				// Focus breaks in Mozilla
+				if (tinyMCE.isGecko) {
+					var settings = tinyMCE.settings;
+
+					tinyMCE.addEvent(element, "focus", function (e) {window.setTimeout(function() {TinyMCE.prototype.confirmAdd(e, settings);}, 10);});
+				} else {
+					var settings = tinyMCE.settings;
+
+					tinyMCE.addEvent(element, "focus", function () { TinyMCE.prototype.confirmAdd(null, settings); });
+				}
+			} else
+				tinyMCE.addMCEControl(element, elementId);
+		}
+
+		// Handle auto focus
+		if (tinyMCE.settings['auto_focus']) {
+			window.setTimeout(function () {
+				var inst = tinyMCE.getInstanceById(tinyMCE.settings['auto_focus']);
+				inst.selectNode(inst.getBody(), true, true);
+				inst.contentWindow.focus();
+			}, 10);
+		}
+
+		tinyMCE.executeCallback('oninit', '_oninit', 0);
+	}
+};
+
+TinyMCE.prototype.removeMCEControl = function(editor_id) {
+	var inst = tinyMCE.getInstanceById(editor_id);
+
+	if (inst) {
+		inst.switchSettings();
+
+		editor_id = inst.editorId;
+		var html = tinyMCE.getContent(editor_id);
+
+		// Remove editor instance from instances array
+		var tmpInstances = new Array();
+		for (var instanceName in tinyMCE.instances) {
+			var instance = tinyMCE.instances[instanceName];
+			if (!tinyMCE.isInstance(instance))
+				continue;
+
+			if (instanceName != editor_id)
+					tmpInstances[instanceName] = instance;
+		}
+		tinyMCE.instances = tmpInstances;
+
+		tinyMCE.selectedElement = null;
+		tinyMCE.selectedInstance = null;
+
+		// Remove element
+		var replaceElement = document.getElementById(editor_id + "_parent");
+		var oldTargetElement = inst.oldTargetElement;
+		var targetName = oldTargetElement.nodeName.toLowerCase();
+
+		if (targetName == "textarea" || targetName == "input") {
+			// Just show the old text area
+			replaceElement.parentNode.removeChild(replaceElement);
+			oldTargetElement.style.display = "inline";
+			oldTargetElement.value = html;
+		} else {
+			oldTargetElement.innerHTML = html;
+
+			replaceElement.parentNode.insertBefore(oldTargetElement, replaceElement);
+			replaceElement.parentNode.removeChild(replaceElement);
+		}
+	}
+};
+
+TinyMCE.prototype._cleanupElementName = function(element_name, element) {
+	var name = "";
+
+	element_name = element_name.toLowerCase();
+
+	// Never include body
+	if (element_name == "body")
+		return null;
+
+	// If verification mode
+	if (tinyMCE.cleanup_verify_html) {
+		// Check if invalid element
+		for (var i=0; i<tinyMCE.cleanup_invalidElements.length; i++) {
+			if (tinyMCE.cleanup_invalidElements[i] == element_name)
+				return null;
+		}
+
+		// Check if valid element
+		var validElement = false;
+		var elementAttribs = null;
+		for (var i=0; i<tinyMCE.cleanup_validElements.length && !elementAttribs; i++) {
+			for (var x=0, n=tinyMCE.cleanup_validElements[i][0].length; x<n; x++) {
+				var elmMatch = tinyMCE.cleanup_validElements[i][0][x];
+
+				if (elmMatch.charAt(0) == '+' || elmMatch.charAt(0) == '-')
+					elmMatch = elmMatch.substring(1);
+
+				// Handle wildcard/regexp
+				if (elmMatch.match(new RegExp('\\*|\\?|\\+', 'g')) != null) {
+					elmMatch = elmMatch.replace(new RegExp('\\?', 'g'), '(\\S?)');
+					elmMatch = elmMatch.replace(new RegExp('\\+', 'g'), '(\\S+)');
+					elmMatch = elmMatch.replace(new RegExp('\\*', 'g'), '(\\S*)');
+					elmMatch = "^" + elmMatch + "$";
+					if (element_name.match(new RegExp(elmMatch, 'g'))) {
+						elementAttribs = tinyMCE.cleanup_validElements[i];
+						validElement = true;
+						break;
+					}
+				}
+
+				// Handle non regexp
+				if (element_name == elmMatch) {
+					elementAttribs = tinyMCE.cleanup_validElements[i];
+					validElement = true;
+					element_name = elementAttribs[0][0];
+					break;
+				}
+			}
+		}
+
+		if (!validElement)
+			return null;
+	}
+
+	if (element_name.charAt(0) == '+' || element_name.charAt(0) == '-')
+		name = element_name.substring(1);
+
+	// Special Mozilla stuff
+	if (!tinyMCE.isMSIE) {
+		// Fix for bug #958498
+		if (name == "strong" && !tinyMCE.cleanup_on_save)
+			element_name = "b";
+		else if (name == "em" && !tinyMCE.cleanup_on_save)
+			element_name = "i";
+	}
+
+	var elmData = new Object();
+
+	elmData.element_name = element_name;
+	elmData.valid_attribs = elementAttribs;
+
+	return elmData;
+};
+
+/**
+ * This function moves CSS styles to/from attributes.
+ */
+TinyMCE.prototype._moveStyle = function(elm, style, attrib) {
+	if (tinyMCE.cleanup_inline_styles) {
+		var val = tinyMCE.getAttrib(elm, attrib);
+
+		if (val != '') {
+			val = '' + val;
+
+			switch (attrib) {
+				case "background":
+					val = "url('" + val + "')";
+					break;
+
+				case "bordercolor":
+					if (elm.style.borderStyle == '' || elm.style.borderStyle == 'none')
+						elm.style.borderStyle = 'solid';
+					break;
+
+				case "border":
+				case "width":
+				case "height":
+					if (attrib == "border" && elm.style.borderWidth > 0)
+						return;
+
+					if (val.indexOf('%') == -1)
+						val += 'px';
+					break;
+
+				case "vspace":
+				case "hspace":
+					elm.style.marginTop = val + "px";
+					elm.style.marginBottom = val + "px";
+					elm.removeAttribute(attrib);
+					return;
+
+				case "align":
+					if (elm.nodeName == "IMG") {
+						if (tinyMCE.isMSIE)
+							elm.style.styleFloat = val;
+						else
+							elm.style.cssFloat = val;
+					} else
+						elm.style.textAlign = val;
+
+					elm.removeAttribute(attrib);
+					return;
+			}
+
+			if (val != '') {
+				eval('elm.style.' + style + ' = val;');
+				elm.removeAttribute(attrib);
+			}
+		}
+	} else {
+		if (style == '')
+			return;
+
+		var val = eval('elm.style.' + style) == '' ? tinyMCE.getAttrib(elm, attrib) : eval('elm.style.' + style);
+		val = val == null ? '' : '' + val;
+
+		switch (attrib) {
+			// Always move background to style
+			case "background":
+				if (val.indexOf('url') == -1 && val != '')
+					val = "url('" + val + "');";
+
+				if (val != '') {
+					elm.style.backgroundImage = val;
+					elm.removeAttribute(attrib);
+				}
+				return;
+
+			case "border":
+			case "width":
+			case "height":
+				val = val.replace('px', '');
+				break;
+
+			case "align":
+				if (tinyMCE.getAttrib(elm, 'align') == '') {
+					if (elm.nodeName == "IMG") {
+						if (tinyMCE.isMSIE && elm.style.styleFloat != '') {
+							val = elm.style.styleFloat;
+							style = 'styleFloat';
+						} else if (tinyMCE.isGecko && elm.style.cssFloat != '') {
+							val = elm.style.cssFloat;
+							style = 'cssFloat';
+						}
+					}
+				}
+				break;
+		}
+
+		if (val != '') {
+			elm.removeAttribute(attrib);
+			elm.setAttribute(attrib, val);
+			eval('elm.style.' + style + ' = "";');
+		}
+	}
+};
+
+TinyMCE.prototype._cleanupAttribute = function(valid_attributes, element_name, attribute_node, element_node) {
+	var attribName = attribute_node.nodeName.toLowerCase();
+	var attribValue = attribute_node.nodeValue;
+	var attribMustBeValue = null;
+	var verified = false;
+
+	// Mozilla attibute, remove them
+	if (attribName.indexOf('moz_') != -1)
+		return null;
+
+	if (!tinyMCE.cleanup_on_save && (attribName == "mce_href" || attribName == "mce_src"))
+		return {name : attribName, value : attribValue};
+
+	// Verify attrib
+	if (tinyMCE.cleanup_verify_html && !verified) {
+		for (var i=1; i<valid_attributes.length; i++) {
+			var attribMatch = valid_attributes[i][0];
+			var re = null;
+
+			// Build regexp from wildcard
+			if (attribMatch.match(new RegExp('\\*|\\?|\\+', 'g')) != null) {
+				attribMatch = attribMatch.replace(new RegExp('\\?', 'g'), '(\\S?)');
+				attribMatch = attribMatch.replace(new RegExp('\\+', 'g'), '(\\S+)');
+				attribMatch = attribMatch.replace(new RegExp('\\*', 'g'), '(\\S*)');
+				attribMatch = "^" + attribMatch + "$";
+				re = new RegExp(attribMatch, 'g');
+			}
+
+			if ((re && attribName.match(re) != null) || attribName == attribMatch) {
+				verified = true;
+				attribMustBeValue = valid_attributes[i][3];
+				break;
+			}
+		}
+
+		if (!verified)
+			return false;
+	} else
+		verified = true;
+
+	// Treat some attribs diffrent
+	switch (attribName) {
+		case "size":
+			if (tinyMCE.isMSIE5 && element_name == "font")
+				attribValue = element_node.size;
+			break;
+
+		case "width":
+		case "height":
+		case "border":
+			// Old MSIE needs this
+			if (tinyMCE.isMSIE5)
+				attribValue = eval("element_node." + attribName);
+			break;
+
+		case "shape":
+			attribValue = attribValue.toLowerCase();
+			break;
+
+		case "cellspacing":
+			if (tinyMCE.isMSIE5)
+				attribValue = element_node.cellSpacing;
+			break;
+
+		case "cellpadding":
+			if (tinyMCE.isMSIE5)
+				attribValue = element_node.cellPadding;
+			break;
+
+		case "color":
+			if (tinyMCE.isMSIE5 && element_name == "font")
+				attribValue = element_node.color;
+			break;
+
+		case "class":
+			// Remove mceItem classes from anchors
+			if (tinyMCE.cleanup_on_save && attribValue.indexOf('mceItemAnchor') != -1)
+				attribValue = attribValue.replace(/mceItem[a-z0-9]+/gi, '');
+
+			if (element_name == "table" || element_name == "td" || element_name == "th") {
+				// Handle visual aid
+				if (tinyMCE.cleanup_visual_table_class != "")
+					attribValue = tinyMCE.getVisualAidClass(attribValue, !tinyMCE.cleanup_on_save);
+			}
+
+			if (!tinyMCE._verifyClass(element_node) || attribValue == "")
+				return null;
+
+			break;
+
+		case "onfocus":
+		case "onblur":
+		case "onclick":
+		case "ondblclick":
+		case "onmousedown":
+		case "onmouseup":
+		case "onmouseover":
+		case "onmousemove":
+		case "onmouseout":
+		case "onkeypress":
+		case "onkeydown":
+		case "onkeydown":
+		case "onkeyup":
+			attribValue = tinyMCE.cleanupEventStr("" + attribValue);
+
+			if (attribValue.indexOf('return false;') == 0)
+				attribValue = attribValue.substring(14);
+
+			break;
+
+		case "style":
+			attribValue = tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(element_node, "style")));
+			break;
+
+		// Convert the URLs of these
+		case "href":
+		case "src":
+		case "longdesc":
+			attribValue = tinyMCE.getAttrib(element_node, attribName);
+
+			// Use mce_href instead
+			var href = tinyMCE.getAttrib(element_node, "mce_href");
+			if (attribName == "href" && href != "")
+				attribValue = href;
+
+			// Use mce_src instead
+			var src = tinyMCE.getAttrib(element_node, "mce_src");
+			if (attribName == "src" && src != "")
+				attribValue = src;
+
+			// Always use absolute URLs within TinyMCE
+			if (!tinyMCE.cleanup_on_save)
+				attribValue = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], attribValue);
+			else if (tinyMCE.getParam('convert_urls'))
+				attribValue = eval(tinyMCE.cleanup_urlconverter_callback + "(attribValue, element_node, tinyMCE.cleanup_on_save);");
+
+			break;
+
+		case "colspan":
+		case "rowspan":
+			// Not needed
+			if (attribValue == "1")
+				return null;
+			break;
+
+		// Skip these
+		case "_moz-userdefined":
+		case "editorid":
+		case "mce_href":
+		case "mce_src":
+			return null;
+	}
+
+	// Not the must be value
+	if (attribMustBeValue != null) {
+		var isCorrect = false;
+		for (var i=0; i<attribMustBeValue.length; i++) {
+			if (attribValue == attribMustBeValue[i]) {
+				isCorrect = true;
+				break;
+			}
+		}
+
+		if (!isCorrect)
+			return null;
+	}
+
+	var attrib = new Object();
+
+	attrib.name = attribName;
+	attrib.value = attribValue;
+
+	return attrib;
+};
+
+TinyMCE.prototype.clearArray = function(ar) {
+	// Since stupid people tend to extend core objects like
+	// Array with their own crap I needed to make functions that clean away
+	// this junk so the arrays get clean and nice as they should be
+	for (var key in ar)
+		ar[key] = null;
+};
+
+TinyMCE.prototype.isInstance = function(inst) {
+	return inst != null && typeof(inst) == "object" && inst.isTinyMCEControl;
+};
+
+TinyMCE.prototype.parseStyle = function(str) {
+	var ar = new Array();
+
+	if (str == null)
+		return ar;
+
+	var st = str.split(';');
+
+	tinyMCE.clearArray(ar);
+
+	for (var i=0; i<st.length; i++) {
+		if (st[i] == '')
+			continue;
+
+		var re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');
+		var pa = st[i].replace(re, '$1||$2').split('||');
+//tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));
+		if (pa.length == 2)
+			ar[pa[0].toLowerCase()] = pa[1];
+	}
+
+	return ar;
+};
+
+TinyMCE.prototype.compressStyle = function(ar, pr, sf, res) {
+	var box = new Array();
+
+	box[0] = ar[pr + '-top' + sf];
+	box[1] = ar[pr + '-left' + sf];
+	box[2] = ar[pr + '-right' + sf];
+	box[3] = ar[pr + '-bottom' + sf];
+
+	for (var i=0; i<box.length; i++) {
+		if (box[i] == null)
+			return;
+
+		for (var a=0; a<box.length; a++) {
+			if (box[a] != box[i])
+				return;
+		}
+	}
+
+	// They are all the same
+	ar[res] = box[0];
+	ar[pr + '-top' + sf] = null;
+	ar[pr + '-left' + sf] = null;
+	ar[pr + '-right' + sf] = null;
+	ar[pr + '-bottom' + sf] = null;
+};
+
+TinyMCE.prototype.serializeStyle = function(ar) {
+	var str = "";
+
+	// Compress box
+	tinyMCE.compressStyle(ar, "border", "", "border");
+	tinyMCE.compressStyle(ar, "border", "-width", "border-width");
+	tinyMCE.compressStyle(ar, "border", "-color", "border-color");
+
+	for (var key in ar) {
+		var val = ar[key];
+		if (typeof(val) == 'function')
+			continue;
+
+		if (val != null && val != '') {
+			val = '' + val; // Force string
+
+			// Fix style URL
+			val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");
+
+			// Convert URL
+			if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {
+				var m = new RegExp("url\\('(.*?)'\\)").exec(val);
+
+				if (m.length > 1)
+					val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";
+			}
+
+			// Force HEX colors
+			if (tinyMCE.getParam("force_hex_style_colors"))
+				val = tinyMCE.convertRGBToHex(val, true);
+
+			if (val != "url('')")
+				str += key.toLowerCase() + ": " + val + "; ";
+		}
+	}
+
+	if (new RegExp('; $').test(str))
+		str = str.substring(0, str.length - 2);
+
+	return str;
+};
+
+TinyMCE.prototype.convertRGBToHex = function(s, k) {
+	if (s.toLowerCase().indexOf('rgb') != -1) {
+		var re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");
+		var rgb = s.replace(re, "$1,$2,$3,$4,$5").split(',');
+		if (rgb.length == 5) {
+			r = parseInt(rgb[1]).toString(16);
+			g = parseInt(rgb[2]).toString(16);
+			b = parseInt(rgb[3]).toString(16);
+
+			r = r.length == 1 ? '0' + r : r;
+			g = g.length == 1 ? '0' + g : g;
+			b = b.length == 1 ? '0' + b : b;
+
+			s = "#" + r + g + b;
+
+			if (k)
+				s = rgb[0] + s + rgb[4];
+		}
+	}
+
+	return s;
+};
+
+TinyMCE.prototype.convertHexToRGB = function(s) {
+	if (s.indexOf('#') != -1) {
+		s = s.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+		return "rgb(" + parseInt(s.substring(0, 2), 16) + "," + parseInt(s.substring(2, 4), 16) + "," + parseInt(s.substring(4, 6), 16) + ")";
+	}
+
+	return s;
+};
+
+TinyMCE.prototype._verifyClass = function(node) {
+	// Sometimes the class gets set to null, weird Gecko bug?
+	if (tinyMCE.isGecko) {
+		var className = node.getAttribute('class');
+		if (!className)
+			return false;
+	}
+
+	// Trim CSS class
+	if (tinyMCE.isMSIE)
+		var className = node.getAttribute('className');
+
+	if (tinyMCE.cleanup_verify_css_classes && tinyMCE.cleanup_on_save) {
+		var csses = tinyMCE.getCSSClasses();
+		nonDefinedCSS = true;
+		for (var c=0; c<csses.length; c++) {
+			if (csses[c] == className) {
+				nonDefinedCSS = false;
+				break;
+			}
+		}
+
+		if (nonDefinedCSS && className.indexOf('mce_') != 0) {
+			node.removeAttribute('className');
+			node.removeAttribute('class');
+			return false;
+		}
+	}
+
+	return true;
+};
+
+TinyMCE.prototype.cleanupNode = function(node) {
+	var output = "";
+
+	switch (node.nodeType) {
+		case 1: // Element
+			var elementData = tinyMCE._cleanupElementName(node.nodeName, node);
+			var elementName = elementData ? elementData.element_name : null;
+			var elementValidAttribs = elementData ? elementData.valid_attribs : null;
+			var elementAttribs = "";
+			var openTag = false, nonEmptyTag = false;
+
+			if (elementName != null && elementName.charAt(0) == '+') {
+				elementName = elementName.substring(1);
+				openTag = true;
+			}
+
+			if (elementName != null && elementName.charAt(0) == '-') {
+				elementName = elementName.substring(1);
+				nonEmptyTag = true;
+			}
+
+			// Checking DOM tree for MSIE weirdness!!
+			if (tinyMCE.isMSIE && tinyMCE.settings['fix_content_duplication']) {
+				var lookup = tinyMCE.cleanup_elementLookupTable;
+
+				for (var i=0; i<lookup.length; i++) {
+					// Found element reference else were, hmm?
+					if (lookup[i] == node)
+						return output;
+				}
+
+				// Add element to lookup table
+				lookup[lookup.length] = node;
+			}
+
+			// Element not valid (only render children)
+			if (!elementName) {
+				if (node.hasChildNodes()) {
+					for (var i=0; i<node.childNodes.length; i++)
+						output += this.cleanupNode(node.childNodes[i]);
+				}
+
+				return output;
+			}
+
+			if (tinyMCE.cleanup_on_save) {
+				if (node.nodeName == "A" && node.className == "mceItemAnchor") {
+					if (node.hasChildNodes()) {
+						for (var i=0; i<node.childNodes.length; i++)
+							output += this.cleanupNode(node.childNodes[i]);
+					}
+
+					return '<a name="' + this.convertStringToXML(node.getAttribute("name")) + '"></a>' + output;
+				}
+			}
+
+			// Remove deprecated attributes
+			var re = new RegExp("^(TABLE|TD|TR)$");
+			if (re.test(node.nodeName)) {
+				// Move attrib to style
+				if ((node.nodeName != "TABLE" || tinyMCE.cleanup_inline_styles) && (width = tinyMCE.getAttrib(node, "width")) != '') {
+					node.style.width = width.indexOf('%') != -1 ? width : width.replace(/[^0-9]/gi, '') + "px";
+					node.removeAttribute("width");
+				}
+
+				// Is table and not inline
+				if ((node.nodeName == "TABLE" && !tinyMCE.cleanup_inline_styles) && node.style.width != '') {
+					tinyMCE.setAttrib(node, "width", node.style.width.replace('px',''));
+					node.style.width = '';
+				}
+
+				// Move attrib to style
+				if ((height = tinyMCE.getAttrib(node, "height")) != '') {
+					height = "" + height; // Force string
+					node.style.height = height.indexOf('%') != -1 ? height : height.replace(/[^0-9]/gi, '') + "px";
+					node.removeAttribute("height");
+				}
+			}
+
+			// Handle inline/outline styles
+			if (tinyMCE.cleanup_inline_styles) {
+				var re = new RegExp("^(TABLE|TD|TR|IMG|HR)$");
+				if (re.test(node.nodeName) && tinyMCE.getAttrib(node, "class").indexOf('mceItem') == -1) {
+					tinyMCE._moveStyle(node, 'width', 'width');
+					tinyMCE._moveStyle(node, 'height', 'height');
+					tinyMCE._moveStyle(node, 'borderWidth', 'border');
+					tinyMCE._moveStyle(node, '', 'vspace');
+					tinyMCE._moveStyle(node, '', 'hspace');
+					tinyMCE._moveStyle(node, 'textAlign', 'align');
+					tinyMCE._moveStyle(node, 'backgroundColor', 'bgColor');
+					tinyMCE._moveStyle(node, 'borderColor', 'borderColor');
+					tinyMCE._moveStyle(node, 'backgroundImage', 'background');
+
+					// Refresh element in old MSIE
+					if (tinyMCE.isMSIE5)
+						node.outerHTML = node.outerHTML;
+				} else if (tinyMCE.isBlockElement(node))
+					tinyMCE._moveStyle(node, 'textAlign', 'align');
+
+				if (node.nodeName == "FONT")
+					tinyMCE._moveStyle(node, 'color', 'color');
+			}
+
+			// Set attrib data
+			if (elementValidAttribs) {
+				for (var a=1; a<elementValidAttribs.length; a++) {
+					var attribName, attribDefaultValue, attribForceValue, attribValue;
+
+					attribName = elementValidAttribs[a][0];
+					attribDefaultValue = elementValidAttribs[a][1];
+					attribForceValue = elementValidAttribs[a][2];
+
+					if (attribDefaultValue != null || attribForceValue != null) {
+						var attribValue = node.getAttribute(attribName);
+
+						if (node.getAttribute(attribName) == null || node.getAttribute(attribName) == "")
+							attribValue = attribDefaultValue;
+
+						attribValue = attribForceValue ? attribForceValue : attribValue;
+
+						// Is to generate id
+						if (attribValue == "{$uid}")
+							attribValue = "uid_" + (tinyMCE.cleanup_idCount++);
+
+						// Add visual aid class
+						if (attribName == "class")
+							attribValue = tinyMCE.getVisualAidClass(attribValue, tinyMCE.cleanup_on_save);
+
+						node.setAttribute(attribName, attribValue);
+						//alert(attribName + "=" + attribValue);
+					}
+				}
+			}
+
+			if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && elementName == "style")
+				return "<style>" + node.innerHTML + "</style>";
+
+			// Remove empty tables
+			if (elementName == "table" && !node.hasChildNodes())
+				return "";
+
+			// Handle element attributes
+			if (node.attributes.length > 0) {
+				var lastAttrib = "";
+
+				for (var i=0; i<node.attributes.length; i++) {
+					if (node.attributes[i].specified) {
+						// Is the attrib already processed (removed duplicate attributes in opera TD[align=left])
+						if (tinyMCE.isOpera) {
+							if (node.attributes[i].nodeName == lastAttrib)
+								continue;
+
+							lastAttrib = node.attributes[i].nodeName;
+						}
+
+						// tinyMCE.debug(node.nodeName, node.attributes[i].nodeName, node.attributes[i].nodeValue, node.innerHTML);
+						var attrib = tinyMCE._cleanupAttribute(elementValidAttribs, elementName, node.attributes[i], node);
+						if (attrib && attrib.value != "")
+							elementAttribs += " " + attrib.name + "=" + '"' + this.convertStringToXML("" + attrib.value) + '"';
+					}
+				}
+			}
+
+			// MSIE table summary fix (MSIE 5.5)
+			if (tinyMCE.isMSIE && elementName == "table" && node.getAttribute("summary") != null && elementAttribs.indexOf('summary') == -1) {
+				var summary = tinyMCE.getAttrib(node, 'summary');
+				if (summary != '')
+					elementAttribs += " summary=" + '"' + this.convertStringToXML(summary) + '"';
+			}
+
+			// Handle missing attributes in MSIE 5.5
+			if (tinyMCE.isMSIE5 && /^(td|img|a)$/.test(elementName)) {
+				var ma = new Array("scope", "longdesc", "hreflang", "charset", "type");
+
+				for (var u=0; u<ma.length; u++) {
+					if (node.getAttribute(ma[u]) != null) {
+						var s = tinyMCE.getAttrib(node, ma[u]);
+
+						if (s != '')
+							elementAttribs += " " + ma[u] + "=" + '"' + this.convertStringToXML(s) + '"';
+					}
+				}
+			}
+
+			// MSIE form element issue
+			if (tinyMCE.isMSIE && elementName == "input") {
+				if (node.type) {
+					if (!elementAttribs.match(/ type=/g))
+						elementAttribs += " type=" + '"' + node.type + '"';
+				}
+
+				if (node.value) {
+					if (!elementAttribs.match(/ value=/g))
+						elementAttribs += " value=" + '"' + node.value + '"';
+				}
+			}
+
+			// Add nbsp to some elements
+			if ((elementName == "p" || elementName == "td") && (node.innerHTML == "" || node.innerHTML == "&nbsp;"))
+				return "<" + elementName + elementAttribs + ">" + this.convertStringToXML(String.fromCharCode(160)) + "</" + elementName + ">";
+
+			// Is MSIE script element
+			if (tinyMCE.isMSIE && elementName == "script")
+				return "<" + elementName + elementAttribs + ">" + node.text + "</" + elementName + ">";
+
+			// Clean up children
+			if (node.hasChildNodes()) {
+				// If not empty span
+				if (!(elementName == "span" && elementAttribs == "" && tinyMCE.getParam("trim_span_elements"))) {
+					// Force BR
+					if (elementName == "p" && tinyMCE.cleanup_force_br_newlines)
+						output += "<div" + elementAttribs + ">";
+					else
+						output += "<" + elementName + elementAttribs + ">";
+				}
+
+				for (var i=0; i<node.childNodes.length; i++)
+					output += this.cleanupNode(node.childNodes[i]);
+
+				// If not empty span
+				if (!(elementName == "span" && elementAttribs == "" && tinyMCE.getParam("trim_span_elements"))) {
+					// Force BR
+					if (elementName == "p" && tinyMCE.cleanup_force_br_newlines)
+						output += "</div><br />";
+					else
+						output += "</" + elementName + ">";
+				}
+			} else {
+				if (!nonEmptyTag) {
+					if (openTag)
+						output += "<" + elementName + elementAttribs + "></" + elementName + ">";
+					else
+						output += "<" + elementName + elementAttribs + " />";
+				}
+			}
+
+			return output;
+
+		case 3: // Text
+			// Do not convert script elements
+			if (node.parentNode.nodeName == "SCRIPT" || node.parentNode.nodeName == "NOSCRIPT" || node.parentNode.nodeName == "STYLE")
+				return node.nodeValue;
+
+			return this.convertStringToXML(node.nodeValue);
+
+		case 8: // Comment
+			return "<!--" + node.nodeValue + "-->";
+
+		default: // Unknown
+			return "[UNKNOWN NODETYPE " + node.nodeType + "]";
+	}
+};
+
+TinyMCE.prototype.convertStringToXML = function(html_data) {
+    var output = "";
+
+	for (var i=0; i<html_data.length; i++) {
+		var chr = html_data.charCodeAt(i);
+
+		// Numeric entities
+		if (tinyMCE.settings['entity_encoding'] == "numeric") {
+			if (chr > 127)
+				output += '&#' + chr + ";";
+			else
+				output += String.fromCharCode(chr);
+
+			continue;
+		}
+
+		// Raw entities
+		if (tinyMCE.settings['entity_encoding'] == "raw") {
+			output += String.fromCharCode(chr);
+			continue;
+		}
+
+		// Named entities
+		if (typeof(tinyMCE.settings['cleanup_entities']["c" + chr]) != 'undefined' && tinyMCE.settings['cleanup_entities']["c" + chr] != '')
+			output += '&' + tinyMCE.settings['cleanup_entities']["c" + chr] + ';';
+		else
+			output += '' + String.fromCharCode(chr);
+    }
+
+    return output;
+};
+
+TinyMCE.prototype._getCleanupElementName = function(chunk) {
+	var pos;
+
+	if (chunk.charAt(0) == '+')
+		chunk = chunk.substring(1);
+
+	if (chunk.charAt(0) == '-')
+		chunk = chunk.substring(1);
+
+	if ((pos = chunk.indexOf('/')) != -1)
+		chunk = chunk.substring(0, pos);
+
+	if ((pos = chunk.indexOf('[')) != -1)
+		chunk = chunk.substring(0, pos);
+
+	return chunk;
+};
+
+TinyMCE.prototype._initCleanup = function() {
+	// Parse valid elements and attributes
+	var validElements = tinyMCE.settings["valid_elements"];
+	validElements = validElements.split(',');
+
+	// Handle extended valid elements
+	var extendedValidElements = tinyMCE.settings["extended_valid_elements"];
+	extendedValidElements = extendedValidElements.split(',');
+	for (var i=0; i<extendedValidElements.length; i++) {
+		var elementName = this._getCleanupElementName(extendedValidElements[i]);
+		var skipAdd = false;
+
+		// Check if it's defined before, if so override that one
+		for (var x=0; x<validElements.length; x++) {
+			if (this._getCleanupElementName(validElements[x]) == elementName) {
+				validElements[x] = extendedValidElements[i];
+				skipAdd = true;
+				break;
+			}
+		}
+
+		if (!skipAdd)
+			validElements[validElements.length] = extendedValidElements[i];
+	}
+
+	for (var i=0; i<validElements.length; i++) {
+		var item = validElements[i];
+
+		item = item.replace('[','|');
+		item = item.replace(']','');
+
+		// Split and convert
+		var attribs = item.split('|');
+		for (var x=0; x<attribs.length; x++)
+			attribs[x] = attribs[x].toLowerCase();
+
+		// Handle change elements
+		attribs[0] = attribs[0].split('/');
+
+		// Handle default attribute values
+		for (var x=1; x<attribs.length; x++) {
+			var attribName = attribs[x];
+			var attribDefault = null;
+			var attribForce = null;
+			var attribMustBe = null;
+
+			// Default value
+			if ((pos = attribName.indexOf('=')) != -1) {
+				attribDefault = attribName.substring(pos+1);
+				attribName = attribName.substring(0, pos);
+			}
+
+			// Force check
+			if ((pos = attribName.indexOf(':')) != -1) {
+				attribForce = attribName.substring(pos+1);
+				attribName = attribName.substring(0, pos);
+			}
+
+			// Force check
+			if ((pos = attribName.indexOf('<')) != -1) {
+				attribMustBe = attribName.substring(pos+1).split('?');
+				attribName = attribName.substring(0, pos);
+			}
+
+			attribs[x] = new Array(attribName, attribDefault, attribForce, attribMustBe);
+		}
+
+		validElements[i] = attribs;
+	}
+
+	var invalidElements = tinyMCE.settings['invalid_elements'].split(',');
+	for (var i=0; i<invalidElements.length; i++)
+		invalidElements[i] = invalidElements[i].toLowerCase();
+
+	// Set these for performance
+	tinyMCE.settings['cleanup_validElements'] = validElements;
+	tinyMCE.settings['cleanup_invalidElements'] = invalidElements;
+};
+
+TinyMCE.prototype._cleanupHTML = function(inst, doc, config, element, visual, on_save) {
+	if (!tinyMCE.settings['cleanup']) {
+		tinyMCE.handleVisualAid(inst.getBody(), true, false, inst);
+
+		var html = element.innerHTML;
+
+		// Remove mce_href/mce_src
+		html = html.replace(new RegExp('(mce_href|mce_src)=".*?"', 'gi'), '');
+		html = html.replace(/\s+>/gi, '>');
+
+		return html;
+	}
+
+	if (on_save && tinyMCE.getParam("convert_fonts_to_spans"))
+		tinyMCE.convertFontsToSpans(doc);
+
+	// Call custom cleanup code
+	tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body);
+
+	// Move bgcolor to style
+	var n = doc.getElementsByTagName("font");
+	for (var i=0; i<n.length; i++) {
+		var c = "";
+		if ((c = tinyMCE.getAttrib(n[i], "bgcolor")) != "") {
+			n[i].style.backgroundColor = c;
+			tinyMCE.setAttrib(n[i], "bgcolor", "");
+		}
+	}
+
+	// Set these for performance
+	tinyMCE.cleanup_validElements = tinyMCE.settings['cleanup_validElements'];
+	tinyMCE.cleanup_invalidElements = tinyMCE.settings['cleanup_invalidElements'];
+	tinyMCE.cleanup_verify_html = tinyMCE.settings['verify_html'];
+	tinyMCE.cleanup_force_br_newlines = tinyMCE.settings['force_br_newlines'];
+	tinyMCE.cleanup_urlconverter_callback = tinyMCE.settings['urlconverter_callback'];
+	tinyMCE.cleanup_verify_css_classes = tinyMCE.settings['verify_css_classes'];
+	tinyMCE.cleanup_visual_table_class = tinyMCE.settings['visual_table_class'];
+	tinyMCE.cleanup_apply_source_formatting = tinyMCE.settings['apply_source_formatting'];
+	tinyMCE.cleanup_inline_styles = tinyMCE.settings['inline_styles'];
+	tinyMCE.cleanup_visual_aid = visual;
+	tinyMCE.cleanup_on_save = on_save;
+	tinyMCE.cleanup_idCount = 0;
+	tinyMCE.cleanup_elementLookupTable = new Array();
+
+	var startTime = new Date().getTime();
+
+	// Cleanup madness that breaks the editor in MSIE
+	if (tinyMCE.isMSIE) {
+		// Remove null ids from HR elements, results in runtime error
+		var nodes = element.getElementsByTagName("hr");
+		for (var i=0; i<nodes.length; i++) {
+			if (nodes[i].id == "null")
+				nodes[i].removeAttribute("id");
+		}
+
+		tinyMCE.setInnerHTML(element, tinyMCE.regexpReplace(element.innerHTML, '<p>[ \n\r]*<hr.*>[ \n\r]*</p>', '<hr />', 'gi'));
+		tinyMCE.setInnerHTML(element, tinyMCE.regexpReplace(element.innerHTML, '<!([^-(DOCTYPE)]* )|<!/[^-]*>', '', 'gi'));
+	}
+
+	var html = this.cleanupNode(element);
+
+	if (tinyMCE.settings['debug'])
+		tinyMCE.debug("Cleanup process executed in: " + (new Date().getTime()-startTime) + " ms.");
+
+	// Remove pesky HR paragraphs and other crap
+	html = tinyMCE.regexpReplace(html, '<p><hr /></p>', '<hr />');
+	html = tinyMCE.regexpReplace(html, '<p>&nbsp;</p><hr /><p>&nbsp;</p>', '<hr />');
+	html = tinyMCE.regexpReplace(html, '<td>\\s*<br />\\s*</td>', '<td>&nbsp;</td>');
+	html = tinyMCE.regexpReplace(html, '<p>\\s*<br />\\s*</p>', '<p>&nbsp;</p>');
+	html = tinyMCE.regexpReplace(html, '<p>\\s*&nbsp;\\s*<br />\\s*&nbsp;\\s*</p>', '<p>&nbsp;</p>');
+	html = tinyMCE.regexpReplace(html, '<p>\\s*&nbsp;\\s*<br />\\s*</p>', '<p>&nbsp;</p>');
+	html = tinyMCE.regexpReplace(html, '<p>\\s*<br />\\s*&nbsp;\\s*</p>', '<p>&nbsp;</p>');
+
+	// Remove empty anchors
+	html = html.replace(new RegExp('<a>(.*?)</a>', 'gi'), '$1');
+
+	// Remove some mozilla crap
+	if (!tinyMCE.isMSIE)
+		html = html.replace(new RegExp('<o:p _moz-userdefined="" />', 'g'), "");
+
+	if (tinyMCE.settings['remove_linebreaks'])
+		html = html.replace(new RegExp('\r|\n', 'g'), ' ');
+
+	if (tinyMCE.getParam('apply_source_formatting')) {
+		html = html.replace(new RegExp('<(p|div)([^>]*)>', 'g'), "\n<$1$2>\n");
+		html = html.replace(new RegExp('<\/(p|div)([^>]*)>', 'g'), "\n</$1$2>\n");
+		html = html.replace(new RegExp('<br />', 'g'), "<br />\n");
+	}
+
+	if (tinyMCE.settings['force_br_newlines']) {
+		var re = new RegExp('<p>&nbsp;</p>', 'g');
+		html = html.replace(re, "<br />");
+	}
+
+	if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt']) {
+		// Remove weridness!
+		var re = new RegExp('&lt;&gt;', 'g');
+		html = html.replace(re, "");
+	}
+
+	// Call custom cleanup code
+	html = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", html);
+
+	// Emtpy node, return empty
+	var chk = tinyMCE.regexpReplace(html, "[ \t\r\n]", "").toLowerCase();
+	if (chk == "<br/>" || chk == "<br>" || chk == "<p>&nbsp;</p>" || chk == "<p>&#160;</p>" || chk == "<p></p>")
+		html = "";
+
+	if (tinyMCE.settings["preformatted"])
+		return "<pre>" + html + "</pre>";
+
+	return html;
+};
+
+TinyMCE.prototype.insertLink = function(href, target, title, onclick, style_class) {
+	tinyMCE.execCommand('mceBeginUndoLevel');
+
+	if (this.selectedInstance && this.selectedElement && this.selectedElement.nodeName.toLowerCase() == "img") {
+		var doc = this.selectedInstance.getDoc();
+		var linkElement = tinyMCE.getParentElement(this.selectedElement, "a");
+		var newLink = false;
+
+		if (!linkElement) {
+			linkElement = doc.createElement("a");
+			newLink = true;
+		}
+
+		var mhref = href;
+		var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");
+		mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
+
+		tinyMCE.setAttrib(linkElement, 'href', thref);
+		tinyMCE.setAttrib(linkElement, 'mce_href', mhref);
+		tinyMCE.setAttrib(linkElement, 'target', target);
+		tinyMCE.setAttrib(linkElement, 'title', title);
+        tinyMCE.setAttrib(linkElement, 'onclick', onclick);
+		tinyMCE.setAttrib(linkElement, 'class', style_class);
+
+		if (newLink) {
+			linkElement.appendChild(this.selectedElement.cloneNode(true));
+			this.selectedElement.parentNode.replaceChild(linkElement, this.selectedElement);
+		}
+
+		return;
+	}
+
+	if (!this.linkElement && this.selectedInstance) {
+		if (tinyMCE.isSafari) {
+			tinyMCE.execCommand("mceInsertContent", false, '<a href="' + tinyMCE.uniqueURL + '">' + this.selectedInstance.getSelectedHTML() + '</a>');
+		} else
+			this.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL);
+
+		tinyMCE.linkElement = this.getElementByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);
+
+		var elementArray = this.getElementsByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);
+
+		for (var i=0; i<elementArray.length; i++) {
+			var mhref = href;
+			var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, elementArray[i]);");
+			mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
+
+			tinyMCE.setAttrib(elementArray[i], 'href', thref);
+			tinyMCE.setAttrib(elementArray[i], 'mce_href', mhref);
+			tinyMCE.setAttrib(elementArray[i], 'target', target);
+			tinyMCE.setAttrib(elementArray[i], 'title', title);
+            tinyMCE.setAttrib(elementArray[i], 'onclick', onclick);
+			tinyMCE.setAttrib(elementArray[i], 'class', style_class);
+		}
+
+		tinyMCE.linkElement = elementArray[0];
+	}
+
+	if (this.linkElement) {
+		var mhref = href;
+		href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, this.linkElement);");
+		mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
+
+		tinyMCE.setAttrib(this.linkElement, 'href', href);
+		tinyMCE.setAttrib(this.linkElement, 'mce_href', mhref);
+		tinyMCE.setAttrib(this.linkElement, 'target', target);
+		tinyMCE.setAttrib(this.linkElement, 'title', title);
+        tinyMCE.setAttrib(this.linkElement, 'onclick', onclick);
+		tinyMCE.setAttrib(this.linkElement, 'class', style_class);
+	}
+
+	tinyMCE.execCommand('mceEndUndoLevel');
+};
+
+TinyMCE.prototype.insertImage = function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {
+	tinyMCE.execCommand('mceBeginUndoLevel');
+
+	if (src == "")
+		return;
+
+	if (!this.imgElement && tinyMCE.isSafari) {
+		var html = "";
+
+		html += '<img src="' + src + '" alt="' + alt + '"';
+		html += ' border="' + border + '" hspace="' + hspace + '"';
+		html += ' vspace="' + vspace + '" width="' + width + '"';
+		html += ' height="' + height + '" align="' + align + '" title="' + title + '" onmouseover="' + onmouseover + '" onmouseout="' + onmouseout + '" />';
+
+		tinyMCE.execCommand("mceInsertContent", false, html);
+	} else {
+		if (!this.imgElement && this.selectedInstance) {
+			if (tinyMCE.isSafari)
+				tinyMCE.execCommand("mceInsertContent", false, '<img src="' + tinyMCE.uniqueURL + '" />');
+			else
+				this.selectedInstance.contentDocument.execCommand("insertimage", false, tinyMCE.uniqueURL);
+
+			tinyMCE.imgElement = this.getElementByAttributeValue(this.selectedInstance.contentDocument.body, "img", "src", tinyMCE.uniqueURL);
+		}
+	}
+
+	if (this.imgElement) {
+		var needsRepaint = false;
+		var msrc = src;
+
+		src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, tinyMCE.imgElement);");
+
+		if (tinyMCE.getParam('convert_urls'))
+			msrc = src;
+
+		if (onmouseover && onmouseover != "")
+			onmouseover = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, tinyMCE.imgElement);") + "';";
+
+		if (onmouseout && onmouseout != "")
+			onmouseout = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, tinyMCE.imgElement);") + "';";
+
+		// Use alt as title if it's undefined
+		if (typeof(title) == "undefined")
+			title = alt;
+
+		if (width != this.imgElement.getAttribute("width") || height != this.imgElement.getAttribute("height") || align != this.imgElement.getAttribute("align"))
+			needsRepaint = true;
+
+		tinyMCE.setAttrib(this.imgElement, 'src', src);
+		tinyMCE.setAttrib(this.imgElement, 'mce_src', msrc);
+		tinyMCE.setAttrib(this.imgElement, 'alt', alt);
+		tinyMCE.setAttrib(this.imgElement, 'title', title);
+		tinyMCE.setAttrib(this.imgElement, 'align', align);
+		tinyMCE.setAttrib(this.imgElement, 'border', border, true);
+		tinyMCE.setAttrib(this.imgElement, 'hspace', hspace, true);
+		tinyMCE.setAttrib(this.imgElement, 'vspace', vspace, true);
+		tinyMCE.setAttrib(this.imgElement, 'width', width, true);
+		tinyMCE.setAttrib(this.imgElement, 'height', height, true);
+		tinyMCE.setAttrib(this.imgElement, 'onmouseover', onmouseover);
+		tinyMCE.setAttrib(this.imgElement, 'onmouseout', onmouseout);
+
+		// Fix for bug #989846 - Image resize bug
+		if (width && width != "")
+			this.imgElement.style.pixelWidth = width;
+
+		if (height && height != "")
+			this.imgElement.style.pixelHeight = height;
+
+		if (needsRepaint)
+			tinyMCE.selectedInstance.repaint();
+	}
+
+	tinyMCE.execCommand('mceEndUndoLevel');
+};
+
+TinyMCE.prototype.getElementByAttributeValue = function(node, element_name, attrib, value) {
+	var elements = this.getElementsByAttributeValue(node, element_name, attrib, value);
+	if (elements.length == 0)
+		return null;
+
+	return elements[0];
+};
+
+TinyMCE.prototype.getElementsByAttributeValue = function(node, element_name, attrib, value) {
+	var elements = new Array();
+
+	if (node && node.nodeName.toLowerCase() == element_name) {
+		if (node.getAttribute(attrib) && node.getAttribute(attrib).indexOf(value) != -1)
+			elements[elements.length] = node;
+	}
+
+	if (node && node.hasChildNodes()) {
+		for (var x=0, n=node.childNodes.length; x<n; x++) {
+			var childElements = this.getElementsByAttributeValue(node.childNodes[x], element_name, attrib, value);
+			for (var i=0, m=childElements.length; i<m; i++)
+				elements[elements.length] = childElements[i];
+		}
+	}
+
+	return elements;
+};
+
+TinyMCE.prototype.isBlockElement = function(node) {
+	return node != null && node.nodeType == 1 && this.blockRegExp.test(node.nodeName);
+};
+
+TinyMCE.prototype.getParentBlockElement = function(node) {
+	// Search up the tree for block element
+	while (node) {
+		if (this.blockRegExp.test(node.nodeName))
+			return node;
+
+		node = node.parentNode;
+	}
+
+	return null;
+};
+
+TinyMCE.prototype.getNodeTree = function(node, node_array, type, node_name) {
+	if (typeof(type) == "undefined" || node.nodeType == type && (typeof(node_name) == "undefined" || node.nodeName == node_name))
+		node_array[node_array.length] = node;
+
+	if (node.hasChildNodes()) {
+		for (var i=0; i<node.childNodes.length; i++)
+			tinyMCE.getNodeTree(node.childNodes[i], node_array, type, node_name);
+	}
+
+	return node_array;
+};
+
+TinyMCE.prototype.getParentElement = function(node, names, attrib_name, attrib_value) {
+	if (typeof(names) == "undefined") {
+		if (node.nodeType == 1)
+			return node;
+
+		// Find parent node that is a element
+		while ((node = node.parentNode) != null && node.nodeType != 1) ;
+
+		return node;
+	}
+
+	var namesAr = names.split(',');
+
+	if (node == null)
+		return null;
+
+	do {
+		for (var i=0; i<namesAr.length; i++) {
+			if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() || names == "*") {
+				if (typeof(attrib_name) == "undefined")
+					return node;
+				else if (node.getAttribute(attrib_name)) {
+					if (typeof(attrib_value) == "undefined") {
+						if (node.getAttribute(attrib_name) != "")
+							return node;
+					} else if (node.getAttribute(attrib_name) == attrib_value)
+						return node;
+				}
+			}
+		}
+	} while ((node = node.parentNode) != null);
+
+	return null;
+};
+
+TinyMCE.prototype.convertURL = function(url, node, on_save) {
+	var prot = document.location.protocol;
+	var host = document.location.hostname;
+	var port = document.location.port;
+
+	// Pass through file protocol
+	if (prot == "file:")
+		return url;
+
+	// Something is wrong, remove weirdness
+	url = tinyMCE.regexpReplace(url, '(http|https):///', '/');
+
+	// Mailto link or anchor (Pass through)
+	if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0) == "#")
+		return url;
+
+	// Fix relative/Mozilla
+	if (!tinyMCE.isMSIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')
+		return tinyMCE.settings['base_href'] + url;
+
+	// Handle relative URLs
+	if (on_save && tinyMCE.getParam('relative_urls')) {
+		var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);
+		if (curl.charAt(0) == '/')
+			curl = tinyMCE.settings['document_base_prefix'] + curl;
+
+		var urlParts = tinyMCE.parseURL(curl);
+		var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings['document_base_url']);
+
+		// Force relative
+		if (urlParts['host'] == tmpUrlParts['host'] && (urlParts['port'] == tmpUrlParts['port']))
+			return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'], curl);
+	}
+
+	// Handle absolute URLs
+	if (!tinyMCE.getParam('relative_urls')) {
+		var urlParts = tinyMCE.parseURL(url);
+		var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings['base_href']);
+
+		// Force absolute URLs from relative URLs
+		url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);
+
+		// If anchor and path is the same page
+		if (urlParts['anchor'] && urlParts['path'] == baseUrlParts['path'])
+			return "#" + urlParts['anchor'];
+	}
+
+	// Remove current domain
+	if (tinyMCE.getParam('remove_script_host')) {
+		var start = "", portPart = "";
+
+		if (port != "")
+			portPart = ":" + port;
+
+		start = prot + "//" + host + portPart + "/";
+
+		if (url.indexOf(start) == 0)
+			url = url.substring(start.length-1);
+	}
+
+	return url;
+};
+
+/**
+ * Parses a URL in to its diffrent components.
+ */
+TinyMCE.prototype.parseURL = function(url_str) {
+	var urlParts = new Array();
+
+	if (url_str) {
+		var pos, lastPos;
+
+		// Parse protocol part
+		pos = url_str.indexOf('://');
+		if (pos != -1) {
+			urlParts['protocol'] = url_str.substring(0, pos);
+			lastPos = pos + 3;
+		}
+
+		// Find port or path start
+		for (var i=lastPos; i<url_str.length; i++) {
+			var chr = url_str.charAt(i);
+
+			if (chr == ':')
+				break;
+
+			if (chr == '/')
+				break;
+		}
+		pos = i;
+
+		// Get host
+		urlParts['host'] = url_str.substring(lastPos, pos);
+
+		// Get port
+		urlParts['port'] = "";
+		lastPos = pos;
+		if (url_str.charAt(pos) == ':') {
+			pos = url_str.indexOf('/', lastPos);
+			urlParts['port'] = url_str.substring(lastPos+1, pos);
+		}
+
+		// Get path
+		lastPos = pos;
+		pos = url_str.indexOf('?', lastPos);
+
+		if (pos == -1)
+			pos = url_str.indexOf('#', lastPos);
+
+		if (pos == -1)
+			pos = url_str.length;
+
+		urlParts['path'] = url_str.substring(lastPos, pos);
+
+		// Get query
+		lastPos = pos;
+		if (url_str.charAt(pos) == '?') {
+			pos = url_str.indexOf('#');
+			pos = (pos == -1) ? url_str.length : pos;
+			urlParts['query'] = url_str.substring(lastPos+1, pos);
+		}
+
+		// Get anchor
+		lastPos = pos;
+		if (url_str.charAt(pos) == '#') {
+			pos = url_str.length;
+			urlParts['anchor'] = url_str.substring(lastPos+1, pos);
+		}
+	}
+
+	return urlParts;
+};
+
+TinyMCE.prototype.serializeURL = function(up) {
+	var url = "";
+
+	if (up['protocol'])
+		url += up['protocol'] + "://";
+
+	if (up['host'])
+		url += up['host'];
+
+	if (up['port'])
+		url += ":" + up['port'];
+
+	if (up['path'])
+		url += up['path'];
+
+	if (up['query'])
+		url += "?" + up['query'];
+
+	if (up['anchor'])
+		url += "#" + up['anchor'];
+
+	return url;
+};
+
+/**
+ * Converts an absolute path to relative path.
+ */
+TinyMCE.prototype.convertAbsoluteURLToRelativeURL = function(base_url, url_to_relative) {
+	var baseURL = this.parseURL(base_url);
+	var targetURL = this.parseURL(url_to_relative);
+	var strTok1;
+	var strTok2;
+	var breakPoint = 0;
+	var outPath = "";
+	var forceSlash = false;
+
+	if (targetURL.path == "")
+		targetURL.path = "/";
+	else
+		forceSlash = true;
+
+	// Crop away last path part
+	base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));
+	strTok1 = base_url.split('/');
+	strTok2 = targetURL.path.split('/');
+
+	if (strTok1.length >= strTok2.length) {
+		for (var i=0; i<strTok1.length; i++) {
+			if (i >= strTok2.length || strTok1[i] != strTok2[i]) {
+				breakPoint = i + 1;
+				break;
+			}
+		}
+	}
+
+	if (strTok1.length < strTok2.length) {
+		for (var i=0; i<strTok2.length; i++) {
+			if (i >= strTok1.length || strTok1[i] != strTok2[i]) {
+				breakPoint = i + 1;
+				break;
+			}
+		}
+	}
+
+	if (breakPoint == 1)
+		return targetURL.path;
+
+	for (var i=0; i<(strTok1.length-(breakPoint-1)); i++)
+		outPath += "../";
+
+	for (var i=breakPoint-1; i<strTok2.length; i++) {
+		if (i != (breakPoint-1))
+			outPath += "/" + strTok2[i];
+		else
+			outPath += strTok2[i];
+	}
+
+	targetURL.protocol = null;
+	targetURL.host = null;
+	targetURL.port = null;
+	targetURL.path = outPath == "" && forceSlash ? "/" : outPath;
+
+	// Remove document prefix from local anchors
+	var fileName = baseURL.path;
+	var pos;
+
+	if ((pos = fileName.lastIndexOf('/')) != -1)
+		fileName = fileName.substring(pos + 1);
+
+	// Is local anchor
+	if (fileName == targetURL.path && targetURL.anchor != "")
+		targetURL.path = "";
+
+	return this.serializeURL(targetURL);
+};
+
+TinyMCE.prototype.convertRelativeToAbsoluteURL = function(base_url, relative_url) {
+	var baseURL = TinyMCE.prototype.parseURL(base_url);
+	var relURL = TinyMCE.prototype.parseURL(relative_url);
+
+	if (relative_url == "" || relative_url.charAt(0) == '/' || relative_url.indexOf('://') != -1 || relative_url.indexOf('mailto:') != -1 || relative_url.indexOf('javascript:') != -1)
+		return relative_url;
+
+	// Split parts
+	baseURLParts = baseURL['path'].split('/');
+	relURLParts = relURL['path'].split('/');
+
+	// Remove empty chunks
+	var newBaseURLParts = new Array();
+	for (var i=baseURLParts.length-1; i>=0; i--) {
+		if (baseURLParts[i].length == 0)
+			continue;
+
+		newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];
+	}
+	baseURLParts = newBaseURLParts.reverse();
+
+	// Merge relURLParts chunks
+	var newRelURLParts = new Array();
+	var numBack = 0;
+	for (var i=relURLParts.length-1; i>=0; i--) {
+		if (relURLParts[i].length == 0 || relURLParts[i] == ".")
+			continue;
+
+		if (relURLParts[i] == '..') {
+			numBack++;
+			continue;
+		}
+
+		if (numBack > 0) {
+			numBack--;
+			continue;
+		}
+
+		newRelURLParts[newRelURLParts.length] = relURLParts[i];
+	}
+
+	relURLParts = newRelURLParts.reverse();
+
+	// Remove end from absolute path
+	var len = baseURLParts.length-numBack;
+	var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');
+	var start = "", end = "";
+
+	// Build output URL
+	relURL.protocol = baseURL.protocol;
+	relURL.host = baseURL.host;
+	relURL.port = baseURL.port;
+
+	// Re-add trailing slash if it's removed
+	if (relURL.path.charAt(relURL.path.length-1) == "/")
+		absPath += "/";
+
+	relURL.path = absPath;
+
+	return TinyMCE.prototype.serializeURL(relURL);
+};
+
+TinyMCE.prototype.getParam = function(name, default_value, strip_whitespace, split_chr) {
+	var value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
+
+	// Fix bool values
+	if (value == "true" || value == "false")
+		return (value == "true");
+
+	if (strip_whitespace)
+		value = tinyMCE.regexpReplace(value, "[ \t\r\n]", "");
+
+	if (typeof(split_chr) != "undefined" && split_chr != null) {
+		value = value.split(split_chr);
+		var outArray = new Array();
+
+		for (var i=0; i<value.length; i++) {
+			if (value[i] && value[i] != "")
+				outArray[outArray.length] = value[i];
+		}
+
+		value = outArray;
+	}
+
+	return value;
+};
+
+TinyMCE.prototype.getLang = function(name, default_value, parse_entities) {
+	var value = (typeof(tinyMCELang[name]) == "undefined") ? default_value : tinyMCELang[name];
+
+	if (parse_entities)
+		value = tinyMCE.entityDecode(value);
+
+	return value;
+};
+
+TinyMCE.prototype.entityDecode = function(s) {
+	var e = document.createElement("div");
+	e.innerHTML = s;
+	return e.innerHTML;
+};
+
+TinyMCE.prototype.addToLang = function(prefix, ar) {
+	for (var key in ar) {
+		if (typeof(ar[key]) == 'function')
+			continue;
+
+		tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = ar[key];
+	}
+
+//	for (var key in ar)
+//		tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = "|" + ar[key] + "|";
+};
+
+TinyMCE.prototype.replaceVar = function(replace_haystack, replace_var, replace_str) {
+	var re = new RegExp('{\\\$' + replace_var + '}', 'g');
+	return replace_haystack.replace(re, replace_str);
+};
+
+TinyMCE.prototype.replaceVars = function(replace_haystack, replace_vars) {
+	for (var key in replace_vars) {
+		var value = replace_vars[key];
+		if (typeof(value) == 'function')
+			continue;
+
+		replace_haystack = tinyMCE.replaceVar(replace_haystack, key, value);
+	}
+
+	return replace_haystack;
+};
+
+TinyMCE.prototype.triggerNodeChange = function(focus, setup_content) {
+	if (tinyMCE.settings['handleNodeChangeCallback']) {
+		if (tinyMCE.selectedInstance) {
+			var inst = tinyMCE.selectedInstance;
+			var editorId = inst.editorId;
+			var elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
+			var undoIndex = -1;
+			var undoLevels = -1;
+			var anySelection = false;
+			var selectedText = inst.getSelectedText();
+
+			inst.switchSettings();
+
+			if (tinyMCE.settings["auto_resize"]) {
+				var doc = inst.getDoc();
+
+				inst.iframeElement.style.width = doc.body.offsetWidth + "px";
+				inst.iframeElement.style.height = doc.body.offsetHeight + "px";
+			}
+
+			if (tinyMCE.selectedElement)
+				anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.length > 0);
+
+			if (tinyMCE.settings['custom_undo_redo']) {
+				undoIndex = inst.undoIndex;
+				undoLevels = inst.undoLevels.length;
+			}
+
+			tinyMCE.executeCallback('handleNodeChangeCallback', '_handleNodeChange', 0, editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);
+		}
+	}
+
+	if (this.selectedInstance && (typeof(focus) == "undefined" || focus))
+		this.selectedInstance.contentWindow.focus();
+};
+
+TinyMCE.prototype._customCleanup = function(inst, type, content) {
+	// Call custom cleanup
+	var customCleanup = tinyMCE.settings['cleanup_callback'];
+	if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined")
+		content = eval(customCleanup + "(type, content, inst);");
+
+	// Trigger plugin cleanups
+	var plugins = tinyMCE.getParam('plugins', '', true, ',');
+	for (var i=0; i<plugins.length; i++) {
+		if (eval("typeof(TinyMCE_" + plugins[i] +  "_cleanup)") != "undefined")
+			content = eval("TinyMCE_" + plugins[i] +  "_cleanup(type, content, inst);");
+	}
+
+	return content;
+};
+
+TinyMCE.prototype.getContent = function(editor_id) {
+	if (typeof(editor_id) != "undefined")
+		tinyMCE.selectedInstance = tinyMCE.getInstanceById(editor_id);
+
+	if (tinyMCE.selectedInstance) {
+		var old = this.selectedInstance.getBody().innerHTML;
+		var html = tinyMCE._cleanupHTML(this.selectedInstance, this.selectedInstance.getDoc(), tinyMCE.settings, this.selectedInstance.getBody(), false, true);
+		tinyMCE.setInnerHTML(this.selectedInstance.getBody(), old);
+		return html;
+	}
+
+	return null;
+};
+
+TinyMCE.prototype.setContent = function(html_content) {
+	if (tinyMCE.selectedInstance) {
+		tinyMCE.selectedInstance.execCommand('mceSetContent', false, html_content);
+		tinyMCE.selectedInstance.repaint();
+	}
+};
+
+TinyMCE.prototype.importThemeLanguagePack = function(name) {
+	if (typeof(name) == "undefined")
+		name = tinyMCE.settings['theme'];
+
+	tinyMCE.loadScript(tinyMCE.baseURL + '/themes/' + name + '/langs/' + tinyMCE.settings['language'] + '.js');
+};
+
+TinyMCE.prototype.importPluginLanguagePack = function(name, valid_languages) {
+	var lang = "en";
+
+	valid_languages = valid_languages.split(',');
+	for (var i=0; i<valid_languages.length; i++) {
+		if (tinyMCE.settings['language'] == valid_languages[i])
+			lang = tinyMCE.settings['language'];
+	}
+
+	tinyMCE.loadScript(tinyMCE.baseURL + '/plugins/' + name + '/langs/' + lang +  '.js');
+};
+
+/**
+ * Adds themeurl, settings and lang to HTML code.
+ */
+TinyMCE.prototype.applyTemplate = function(html, args) {
+	html = tinyMCE.replaceVar(html, "themeurl", tinyMCE.themeURL);
+
+	if (typeof(args) != "undefined")
+		html = tinyMCE.replaceVars(html, args);
+
+	html = tinyMCE.replaceVars(html, tinyMCE.settings);
+	html = tinyMCE.replaceVars(html, tinyMCELang);
+
+	return html;
+};
+
+TinyMCE.prototype.openWindow = function(template, args) {
+	var html, width, height, x, y, resizable, scrollbars, url;
+
+	args['mce_template_file'] = template['file'];
+	args['mce_width'] = template['width'];
+	args['mce_height'] = template['height'];
+	tinyMCE.windowArgs = args;
+
+	html = template['html'];
+	if (!(width = parseInt(template['width'])))
+		width = 320;
+
+	if (!(height = parseInt(template['height'])))
+		height = 200;
+
+	// Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!
+	if (tinyMCE.isMSIE)
+		height += 40;
+	else
+		height += 20;
+
+	x = parseInt(screen.width / 2.0) - (width / 2.0);
+	y = parseInt(screen.height / 2.0) - (height / 2.0);
+
+	resizable = (args && args['resizable']) ? args['resizable'] : "no";
+	scrollbars = (args && args['scrollbars']) ? args['scrollbars'] : "no";
+
+	if (template['file'].charAt(0) != '/' && template['file'].indexOf('://') == -1)
+		url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template['file'];
+	else
+		url = template['file'];
+
+	// Replace all args as variables in URL
+	for (var name in args) {
+		if (typeof(args[name]) == 'function')
+			continue;
+
+		url = tinyMCE.replaceVar(url, name, escape(args[name]));
+	}
+
+	if (html) {
+		html = tinyMCE.replaceVar(html, "css", this.settings['popups_css']);
+		html = tinyMCE.applyTemplate(html, args);
+
+		var win = window.open("", "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable);
+		if (win == null) {
+			alert(tinyMCELang['lang_popup_blocked']);
+			return;
+		}
+
+		win.document.write(html);
+		win.document.close();
+		win.resizeTo(width, height);
+		win.focus();
+	} else {
+		if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && resizable != 'yes' && tinyMCE.settings["dialog_type"] == "modal") {
+            var features = "resizable:" + resizable 
+                + ";scroll:"
+                + scrollbars + ";status:yes;center:yes;help:no;dialogWidth:"
+                + width + "px;dialogHeight:" + height + "px;";
+
+			window.showModalDialog(url, window, features);
+		} else {
+			var modal = (resizable == "yes") ? "no" : "yes";
+
+			if (tinyMCE.isGecko && tinyMCE.isMac)
+				modal = "no";
+
+			if (template['close_previous'] != "no")
+				try {tinyMCE.lastWindow.close();} catch (ex) {}
+
+			var win = window.open(url, "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable);
+			if (win == null) {
+				alert(tinyMCELang['lang_popup_blocked']);
+				return;
+			}
+
+			if (template['close_previous'] != "no")
+				tinyMCE.lastWindow = win;
+
+			eval('try { win.resizeTo(width, height); } catch(e) { }');
+
+			// Make it bigger if statusbar is forced
+			if (tinyMCE.isGecko) {
+				if (win.document.defaultView.statusbar.visible)
+					win.resizeBy(0, tinyMCE.isMac ? 10 : 24);
+			}
+
+			win.focus();
+		}
+	}
+};
+
+TinyMCE.prototype.closeWindow = function(win) {
+	win.close();
+};
+
+TinyMCE.prototype.getVisualAidClass = function(class_name, state) {
+	var aidClass = tinyMCE.settings['visual_table_class'];
+
+	if (typeof(state) == "undefined")
+		state = tinyMCE.settings['visual'];
+
+	// Split
+	var classNames = new Array();
+	var ar = class_name.split(' ');
+	for (var i=0; i<ar.length; i++) {
+		if (ar[i] == aidClass)
+			ar[i] = "";
+
+		if (ar[i] != "")
+			classNames[classNames.length] = ar[i];
+	}
+
+	if (state)
+		classNames[classNames.length] = aidClass;
+
+	// Glue
+	var className = "";
+	for (var i=0; i<classNames.length; i++) {
+		if (i > 0)
+			className += " ";
+
+		className += classNames[i];
+	}
+
+	return className;
+};
+
+TinyMCE.prototype.handleVisualAid = function(el, deep, state, inst) {
+	if (!el)
+		return;
+
+	var tableElement = null;
+
+	switch (el.nodeName) {
+		case "TABLE":
+			var oldW = el.style.width;
+			var oldH = el.style.height;
+			var bo = tinyMCE.getAttrib(el, "border");
+
+			bo = bo == "" || bo == "0" ? true : false;
+
+			tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));
+
+			el.style.width = oldW;
+			el.style.height = oldH;
+
+			for (var y=0; y<el.rows.length; y++) {
+				for (var x=0; x<el.rows[y].cells.length; x++) {
+					var cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], "class"), state && bo);
+					tinyMCE.setAttrib(el.rows[y].cells[x], "class", cn);
+				}
+			}
+
+			break;
+
+		case "A":
+			var anchorName = tinyMCE.getAttrib(el, "name");
+
+			if (anchorName != '' && state) {
+				el.title = anchorName;
+				el.className = 'mceItemAnchor';
+			} else if (anchorName != '' && !state)
+				el.className = '';
+
+			break;
+	}
+
+	if (deep && el.hasChildNodes()) {
+		for (var i=0; i<el.childNodes.length; i++)
+			tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst);
+	}
+};
+
+TinyMCE.prototype.getAttrib = function(elm, name, default_value) {
+	if (typeof(default_value) == "undefined")
+		default_value = "";
+
+	// Not a element
+	if (!elm || elm.nodeType != 1)
+		return default_value;
+
+	var v = elm.getAttribute(name);
+
+	// Try className for class attrib
+	if (name == "class" && !v)
+		v = elm.className;
+
+	// Workaround for a issue with Firefox 1.5rc2+
+	if (tinyMCE.isGecko && name == "src" && elm.src != null && elm.src != "")
+		v = elm.src;
+
+	// Workaround for a issue with Firefox 1.5rc2+
+	if (tinyMCE.isGecko && name == "href" && elm.href != null && elm.href != "")
+		v = elm.href;
+
+	if (name == "style" && !tinyMCE.isOpera)
+		v = elm.style.cssText;
+
+	return (v && v != "") ? v : default_value;
+};
+
+TinyMCE.prototype.setAttrib = function(element, name, value, fix_value) {
+	if (typeof(value) == "number" && value != null)
+		value = "" + value;
+
+	if (fix_value) {
+		if (value == null)
+			value = "";
+
+		var re = new RegExp('[^0-9%]', 'g');
+		value = value.replace(re, '');
+	}
+
+	if (name == "style")
+		element.style.cssText = value;
+
+	if (name == "class")
+		element.className = value;
+
+	if (value != null && value != "" && value != -1)
+		element.setAttribute(name, value);
+	else
+		element.removeAttribute(name);
+};
+
+TinyMCE.prototype.setStyleAttrib = function(elm, name, value) {
+	eval('elm.style.' + name + '=value;');
+
+	// Style attrib deleted
+	if (tinyMCE.isMSIE && value == null || value == '') {
+		var str = tinyMCE.serializeStyle(tinyMCE.parseStyle(elm.style.cssText));
+		elm.style.cssText = str;
+		elm.setAttribute("style", str);
+	}
+};
+
+TinyMCE.prototype.convertSpansToFonts = function(doc) {
+	var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
+
+	var h = doc.body.innerHTML;
+	h = h.replace(/<span/gi, '<font');
+	h = h.replace(/<\/span/gi, '</font');
+	doc.body.innerHTML = h;
+
+	var s = doc.getElementsByTagName("font");
+	for (var i=0; i<s.length; i++) {
+		var size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();
+		var fSize = 0;
+
+		for (var x=0; x<sizes.length; x++) {
+			if (sizes[x] == size) {
+				fSize = x + 1;
+				break;
+			}
+		}
+
+		if (fSize > 0) {
+			tinyMCE.setAttrib(s[i], 'size', fSize);
+			s[i].style.fontSize = '';
+		}
+
+		var fFace = s[i].style.fontFamily;
+		if (fFace != null && fFace != "") {
+			tinyMCE.setAttrib(s[i], 'face', fFace);
+			s[i].style.fontFamily = '';
+		}
+
+		var fColor = s[i].style.color;
+		if (fColor != null && fColor != "") {
+			tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));
+			s[i].style.color = '';
+		}
+	}
+};
+
+TinyMCE.prototype.convertFontsToSpans = function(doc) {
+	var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
+
+	var h = doc.body.innerHTML;
+	h = h.replace(/<font/gi, '<span');
+	h = h.replace(/<\/font/gi, '</span');
+	doc.body.innerHTML = h;
+
+	var fsClasses = tinyMCE.getParam('font_size_classes');
+	if (fsClasses != '')
+		fsClasses = fsClasses.replace(/\s+/, '').split(',');
+	else
+		fsClasses = null;
+
+	var s = doc.getElementsByTagName("span");
+	for (var i=0; i<s.length; i++) {
+		var fSize, fFace, fColor;
+
+		fSize = tinyMCE.getAttrib(s[i], 'size');
+		fFace = tinyMCE.getAttrib(s[i], 'face');
+		fColor = tinyMCE.getAttrib(s[i], 'color');
+
+		if (fSize != "") {
+			fSize = parseInt(fSize);
+
+			if (fSize > 0 && fSize < 8) {
+				if (fsClasses != null)
+					tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]);
+				else
+					s[i].style.fontSize = sizes[fSize-1];
+			}
+
+			s[i].removeAttribute('size');
+		}
+
+		if (fFace != "") {
+			s[i].style.fontFamily = fFace;
+			s[i].removeAttribute('face');
+		}
+
+		if (fColor != "") {
+			s[i].style.color = fColor;
+			s[i].removeAttribute('color');
+		}
+	}
+};
+
+/*
+TinyMCE.prototype.applyClassesToFonts = function(doc, size) {
+	var f = doc.getElementsByTagName("font");
+	for (var i=0; i<f.length; i++) {
+		var s = tinyMCE.getAttrib(f[i], "size");
+
+		if (s != "")
+			tinyMCE.setAttrib(f[i], 'class', "mceItemFont" + s);
+	}
+
+	if (typeof(size) != "undefined") {
+		var css = "";
+
+		for (var x=0; x<doc.styleSheets.length; x++) {
+			for (var i=0; i<doc.styleSheets[x].rules.length; i++) {
+				if (doc.styleSheets[x].rules[i].selectorText == '#mceSpanFonts .mceItemFont' + size) {
+					css = doc.styleSheets[x].rules[i].style.cssText;
+					break;
+				}
+			}
+
+			if (css != "")
+				break;
+		}
+
+		if (doc.styleSheets[0].rules[0].selectorText == "FONT")
+			doc.styleSheets[0].removeRule(0);
+
+		doc.styleSheets[0].addRule("FONT", css, 0);
+	}
+};
+*/
+
+TinyMCE.prototype.setInnerHTML = function(e, h) {
+	if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+		e.innerHTML = tinyMCE.uniqueTag + h;
+		e.firstChild.removeNode(true);
+	} else {
+		h = this.fixGeckoBaseHREFBug(1, e, h);
+		e.innerHTML = h;
+		this.fixGeckoBaseHREFBug(2, e, h);
+	}
+};
+
+TinyMCE.prototype.fixGeckoBaseHREFBug = function(m, e, h) {
+	if (tinyMCE.isGecko) {
+		if (m == 1) {
+			h = h.replace(/\ssrc=/gi, " xsrc=");
+			h = h.replace(/\shref=/gi, " xhref=");
+
+			return h;
+		} else {
+			if (h.indexOf(' xsrc') != -1) {
+				var n = e.getElementsByTagName("img");
+				for (var i=0; i<n.length; i++) {
+					var xsrc = tinyMCE.getAttrib(n[i], "xsrc");
+
+					if (xsrc != "") {
+						n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);
+						n[i].removeAttribute("xsrc");
+					}
+				}
+
+				// Select image form fields
+				var n = e.getElementsByTagName("select");
+				for (var i=0; i<n.length; i++) {
+					var xsrc = tinyMCE.getAttrib(n[i], "xsrc");
+
+					if (xsrc != "") {
+						n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);
+						n[i].removeAttribute("xsrc");
+					}
+				}
+
+				// iframes
+				var n = e.getElementsByTagName("iframe");
+				for (var i=0; i<n.length; i++) {
+					var xsrc = tinyMCE.getAttrib(n[i], "xsrc");
+
+					if (xsrc != "") {
+						n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);
+						n[i].removeAttribute("xsrc");
+					}
+				}
+			}
+
+			if (h.indexOf(' xhref') != -1) {
+				var n = e.getElementsByTagName("a");
+				for (var i=0; i<n.length; i++) {
+					var xhref = tinyMCE.getAttrib(n[i], "xhref");
+
+					if (xhref != "") {
+						n[i].href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xhref);
+						n[i].removeAttribute("xhref");
+					}
+				}
+			}
+		}
+	}
+
+	return h;
+};
+
+TinyMCE.prototype.getOuterHTML = function(e) {
+	if (tinyMCE.isMSIE)
+		return e.outerHTML;
+
+	var d = e.ownerDocument.createElement("body");
+	d.appendChild(e);
+	return d.innerHTML;
+};
+
+TinyMCE.prototype.setOuterHTML = function(doc, e, h) {
+	if (tinyMCE.isMSIE) {
+		e.outerHTML = h;
+		return;
+	}
+
+	var d = e.ownerDocument.createElement("body");
+	d.innerHTML = h;
+	e.parentNode.replaceChild(d.firstChild, e);
+};
+
+TinyMCE.prototype.insertAfter = function(nc, rc){
+	if (rc.nextSibling)
+		rc.parentNode.insertBefore(nc, rc.nextSibling);
+	else
+		rc.parentNode.appendChild(nc);
+};
+
+TinyMCE.prototype.cleanupAnchors = function(doc) {
+	var an = doc.getElementsByTagName("a");
+
+	for (var i=0; i<an.length; i++) {
+		if (tinyMCE.getAttrib(an[i], "name") != "") {
+			var cn = an[i].childNodes;
+			for (var x=cn.length-1; x>=0; x--)
+				tinyMCE.insertAfter(cn[x], an[i]);
+		}
+	}
+};
+
+TinyMCE.prototype._setHTML = function(doc, html_content) {
+	// Force closed anchors open
+	//html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
+
+	html_content = tinyMCE.cleanupHTMLCode(html_content);
+
+	// Try innerHTML if it fails use pasteHTML in MSIE
+	try {
+		tinyMCE.setInnerHTML(doc.body, html_content);
+	} catch (e) {
+		if (this.isMSIE)
+			doc.body.createTextRange().pasteHTML(html_content);
+	}
+
+	// Content duplication bug fix
+	if (tinyMCE.isMSIE && tinyMCE.settings['fix_content_duplication']) {
+		// Remove P elements in P elements
+		var paras = doc.getElementsByTagName("P");
+		for (var i=0; i<paras.length; i++) {
+			var node = paras[i];
+			while ((node = node.parentNode) != null) {
+				if (node.nodeName == "P")
+					node.outerHTML = node.innerHTML;
+			}
+		}
+
+		// Content duplication bug fix (Seems to be word crap)
+		var html = doc.body.innerHTML;
+
+		if (html.indexOf('="mso') != -1) {
+			for (var i=0; i<doc.body.all.length; i++) {
+				var el = doc.body.all[i];
+				el.removeAttribute("className","",0);
+				el.removeAttribute("style","",0);
+			}
+
+			html = doc.body.innerHTML;
+			html = tinyMCE.regexpReplace(html, "<o:p><\/o:p>", "<br />");
+			html = tinyMCE.regexpReplace(html, "<o:p>&nbsp;<\/o:p>", "");
+			html = tinyMCE.regexpReplace(html, "<st1:.*?>", "");
+			html = tinyMCE.regexpReplace(html, "<p><\/p>", "");
+			html = tinyMCE.regexpReplace(html, "<p><\/p>\r\n<p><\/p>", "");
+			html = tinyMCE.regexpReplace(html, "<p>&nbsp;<\/p>", "<br />");
+			html = tinyMCE.regexpReplace(html, "<p>\s*(<p>\s*)?", "<p>");
+			html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "</p>");
+		}
+
+		// Always set the htmlText output
+		tinyMCE.setInnerHTML(doc.body, html);
+	}
+
+	tinyMCE.cleanupAnchors(doc);
+
+	if (tinyMCE.getParam("convert_fonts_to_spans"))
+		tinyMCE.convertSpansToFonts(doc);
+};
+
+TinyMCE.prototype.getImageSrc = function(str) {
+	var pos = -1;
+
+	if (!str)
+		return "";
+
+	if ((pos = str.indexOf('this.src=')) != -1) {
+		var src = str.substring(pos + 10);
+
+		src = src.substring(0, src.indexOf('\''));
+
+		return src;
+	}
+
+	return "";
+};
+
+TinyMCE.prototype._getElementById = function(element_id) {
+	var elm = document.getElementById(element_id);
+	if (!elm) {
+		// Check for element in forms
+		for (var j=0; j<document.forms.length; j++) {
+			for (var k=0; k<document.forms[j].elements.length; k++) {
+				if (document.forms[j].elements[k].name == element_id) {
+					elm = document.forms[j].elements[k];
+					break;
+				}
+			}
+		}
+	}
+
+	return elm;
+};
+
+TinyMCE.prototype.getEditorId = function(form_element) {
+	var inst = this.getInstanceById(form_element);
+	if (!inst)
+		return null;
+
+	return inst.editorId;
+};
+
+TinyMCE.prototype.getInstanceById = function(editor_id) {
+	var inst = this.instances[editor_id];
+	if (!inst) {
+		for (var n in tinyMCE.instances) {
+			var instance = tinyMCE.instances[n];
+			if (!tinyMCE.isInstance(instance))
+				continue;
+
+			if (instance.formTargetElementId == editor_id) {
+				inst = instance;
+				break;
+			}
+		}
+	}
+
+	return inst;
+};
+
+TinyMCE.prototype.queryInstanceCommandValue = function(editor_id, command) {
+	var inst = tinyMCE.getInstanceById(editor_id);
+	if (inst)
+		return inst.queryCommandValue(command);
+
+	return false;
+};
+
+TinyMCE.prototype.queryInstanceCommandState = function(editor_id, command) {
+	var inst = tinyMCE.getInstanceById(editor_id);
+	if (inst)
+		return inst.queryCommandState(command);
+
+	return null;
+};
+
+TinyMCE.prototype.setWindowArg = function(name, value) {
+	this.windowArgs[name] = value;
+};
+
+TinyMCE.prototype.getWindowArg = function(name, default_value) {
+	return (typeof(this.windowArgs[name]) == "undefined") ? default_value : this.windowArgs[name];
+};
+
+TinyMCE.prototype.getCSSClasses = function(editor_id, doc) {
+	var output = new Array();
+
+	// Is cached, use that
+	if (typeof(tinyMCE.cssClasses) != "undefined")
+		return tinyMCE.cssClasses;
+
+	if (typeof(editor_id) == "undefined" && typeof(doc) == "undefined") {
+		var instance;
+
+		for (var instanceName in tinyMCE.instances) {
+			instance = tinyMCE.instances[instanceName];
+			if (!tinyMCE.isInstance(instance))
+				continue;
+
+			break;
+		}
+
+		doc = instance.getDoc();
+	}
+
+	if (typeof(doc) == "undefined") {
+		var instance = tinyMCE.getInstanceById(editor_id);
+		doc = instance.getDoc();
+	}
+
+	if (doc) {
+		var styles = tinyMCE.isMSIE ? doc.styleSheets : doc.styleSheets;
+
+		if (styles && styles.length > 0) {
+			for (var x=0; x<styles.length; x++) {
+				var csses = null;
+
+				// Just ignore any errors
+				eval("try {var csses = tinyMCE.isMSIE ? doc.styleSheets(" + x + ").rules : doc.styleSheets[" + x + "].cssRules;} catch(e) {}");
+				if (!csses)
+					return new Array();
+
+				for (var i=0; i<csses.length; i++) {
+					var selectorText = csses[i].selectorText;
+
+					// Can be multiple rules per selector
+					if (selectorText) {
+						var rules = selectorText.split(',');
+						for (var c=0; c<rules.length; c++) {
+							// Invalid rule
+							if (rules[c].indexOf(' ') != -1 || rules[c].indexOf(':') != -1 || rules[c].indexOf('mceItem') != -1)
+								continue;
+
+							if (rules[c] == "." + tinyMCE.settings['visual_table_class'])
+								continue;
+
+							// Is class rule
+							if (rules[c].indexOf('.') != -1) {
+								//alert(rules[c].substring(rules[c].indexOf('.')));
+								output[output.length] = rules[c].substring(rules[c].indexOf('.')+1);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// Cache em
+	if (output.length > 0)
+		tinyMCE.cssClasses = output;
+
+	return output;
+};
+
+TinyMCE.prototype.regexpReplace = function(in_str, reg_exp, replace_str, opts) {
+	if (in_str == null)
+		return in_str;
+
+	if (typeof(opts) == "undefined")
+		opts = 'g';
+
+	var re = new RegExp(reg_exp, opts);
+	return in_str.replace(re, replace_str);
+};
+
+TinyMCE.prototype.trim = function(str) {
+	return str.replace(/^\s*|\s*$/g, "");
+};
+
+TinyMCE.prototype.cleanupEventStr = function(str) {
+	str = "" + str;
+	str = str.replace('function anonymous()\n{\n', '');
+	str = str.replace('\n}', '');
+	str = str.replace(/^return true;/gi, ''); // Remove event blocker
+
+	return str;
+};
+
+TinyMCE.prototype.getAbsPosition = function(node) {
+	var pos = new Object();
+
+	pos.absLeft = pos.absTop = 0;
+
+	var parentNode = node;
+	while (parentNode) {
+		pos.absLeft += parentNode.offsetLeft;
+		pos.absTop += parentNode.offsetTop;
+
+		parentNode = parentNode.offsetParent;
+	}
+
+	return pos;
+};
+
+TinyMCE.prototype.getControlHTML = function(control_name) {
+	var themePlugins = tinyMCE.getParam('plugins', '', true, ',');
+	var templateFunction;
+
+	// Is it defined in any plugins
+	for (var i=themePlugins.length; i>=0; i--) {
+		templateFunction = 'TinyMCE_' + themePlugins[i] + "_getControlHTML";
+		if (eval("typeof(" + templateFunction + ")") != 'undefined') {
+			var html = eval(templateFunction + "('" + control_name + "');");
+			if (html != "")
+				return tinyMCE.replaceVar(html, "pluginurl", tinyMCE.baseURL + "/plugins/" + themePlugins[i]);
+		}
+	}
+
+	return eval('TinyMCE_' + tinyMCE.settings['theme'] + "_getControlHTML" + "('" + control_name + "');");
+};
+
+TinyMCE.prototype._themeExecCommand = function(editor_id, element, command, user_interface, value) {
+	var themePlugins = tinyMCE.getParam('plugins', '', true, ',');
+	var templateFunction;
+
+	// Is it defined in any plugins
+	for (var i=themePlugins.length; i>=0; i--) {
+		templateFunction = 'TinyMCE_' + themePlugins[i] + "_execCommand";
+		if (eval("typeof(" + templateFunction + ")") != 'undefined') {
+			if (eval(templateFunction + "(editor_id, element, command, user_interface, value);"))
+				return true;
+		}
+	}
+
+	// Theme funtion
+	templateFunction = 'TinyMCE_' + tinyMCE.settings['theme'] + "_execCommand";
+	if (eval("typeof(" + templateFunction + ")") != 'undefined')
+		return eval(templateFunction + "(editor_id, element, command, user_interface, value);");
+
+	// Pass to normal
+	return false;
+};
+
+TinyMCE.prototype._getThemeFunction = function(suffix, skip_plugins) {
+	if (skip_plugins)
+		return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;
+
+	var themePlugins = tinyMCE.getParam('plugins', '', true, ',');
+	var templateFunction;
+
+	// Is it defined in any plugins
+	for (var i=themePlugins.length; i>=0; i--) {
+		templateFunction = 'TinyMCE_' + themePlugins[i] + suffix;
+		if (eval("typeof(" + templateFunction + ")") != 'undefined')
+			return templateFunction;
+	}
+
+	return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;
+};
+
+
+TinyMCE.prototype.isFunc = function(func_name) {
+	if (func_name == null || func_name == "")
+		return false;
+
+	return eval("typeof(" + func_name + ")") != "undefined";
+};
+
+TinyMCE.prototype.exec = function(func_name, args) {
+	var str = func_name + '(';
+
+	// Add all arguments
+	for (var i=3; i<args.length; i++) {
+		str += 'args[' + i + ']';
+
+		if (i < args.length-1)
+			str += ',';
+	}
+
+	str += ');';
+
+	return eval(str);
+};
+
+TinyMCE.prototype.executeCallback = function(param, suffix, mode) {
+	switch (mode) {
+		// No chain
+		case 0:
+			var state = false;
+
+			// Execute each plugin callback
+			var plugins = tinyMCE.getParam('plugins', '', true, ',');
+			for (var i=0; i<plugins.length; i++) {
+				var func = "TinyMCE_" + plugins[i] + suffix;
+				if (tinyMCE.isFunc(func)) {
+					tinyMCE.exec(func, this.executeCallback.arguments);
+					state = true;
+				}
+			}
+
+			// Execute theme callback
+			var func = 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;
+			if (tinyMCE.isFunc(func)) {
+				tinyMCE.exec(func, this.executeCallback.arguments);
+				state = true;
+			}
+
+			// Execute settings callback
+			var func = tinyMCE.getParam(param, '');
+			if (tinyMCE.isFunc(func)) {
+				tinyMCE.exec(func, this.executeCallback.arguments);
+				state = true;
+			}
+
+			return state;
+
+		// Chain mode
+		case 1:
+			// Execute each plugin callback
+			var plugins = tinyMCE.getParam('plugins', '', true, ',');
+			for (var i=0; i<plugins.length; i++) {
+				var func = "TinyMCE_" + plugins[i] + suffix;
+				if (tinyMCE.isFunc(func)) {
+					if (tinyMCE.exec(func, this.executeCallback.arguments))
+						return true;
+				}
+			}
+
+			// Execute theme callback
+			var func = 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;
+			if (tinyMCE.isFunc(func)) {
+				if (tinyMCE.exec(func, this.executeCallback.arguments))
+					return true;
+			}
+
+			// Execute settings callback
+			var func = tinyMCE.getParam(param, '');
+			if (tinyMCE.isFunc(func)) {
+				if (tinyMCE.exec(func, this.executeCallback.arguments))
+					return true;
+			}
+
+			return false;
+	}
+};
+
+TinyMCE.prototype.debug = function() {
+	var msg = "";
+
+	var elm = document.getElementById("tinymce_debug");
+	if (!elm) {
+		var debugDiv = document.createElement("div");
+		debugDiv.setAttribute("className", "debugger");
+		debugDiv.className = "debugger";
+		debugDiv.innerHTML = '\
+			Debug output:\
+			<textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap"></textarea>';
+
+		document.body.appendChild(debugDiv);
+		elm = document.getElementById("tinymce_debug");
+	}
+
+	var args = this.debug.arguments;
+	for (var i=0; i<args.length; i++) {
+		msg += args[i];
+		if (i<args.length-1)
+			msg += ', ';
+	}
+
+	elm.value += msg + "\n";
+};
+
+// TinyMCEControl
+function TinyMCEControl(settings) {
+	// Undo levels
+	this.undoLevels = new Array();
+	this.undoIndex = 0;
+	this.typingUndoIndex = -1;
+	this.undoRedo = true;
+	this.isTinyMCEControl = true;
+
+	// Default settings
+	this.settings = settings;
+	this.settings['theme'] = tinyMCE.getParam("theme", "default");
+	this.settings['width'] = tinyMCE.getParam("width", -1);
+	this.settings['height'] = tinyMCE.getParam("height", -1);
+};
+
+TinyMCEControl.prototype.repaint = function() {
+	if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+		return;
+
+	// Ugly mozilla hack to remove ghost resize handles
+	try {
+		this.getBody().style.display = 'none';
+		this.getDoc().execCommand('selectall', false, null);
+		this.getSel().collapseToStart();
+		this.getBody().style.display = 'block';
+	} catch (ex) {
+		// Could I care less!!
+	}
+};
+
+TinyMCEControl.prototype.switchSettings = function() {
+	if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings['index']) {
+		tinyMCE.settings = this.settings;
+		tinyMCE.currentConfig = this.settings['index'];
+	}
+};
+
+TinyMCEControl.prototype.convertAllRelativeURLs = function() {
+	var body = this.getBody();
+
+	// Convert all image URL:s to absolute URL
+	var elms = body.getElementsByTagName("img");
+	for (var i=0; i<elms.length; i++) {
+		var src = tinyMCE.getAttrib(elms[i], 'src');
+
+		var msrc = tinyMCE.getAttrib(elms[i], 'mce_src');
+		if (msrc != "")
+			src = msrc;
+
+		if (src != "") {
+			src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);
+			elms[i].setAttribute("src", src);
+		}
+	}
+
+	// Convert all link URL:s to absolute URL
+	var elms = body.getElementsByTagName("a");
+	for (var i=0; i<elms.length; i++) {
+		var href = tinyMCE.getAttrib(elms[i], 'href');
+
+		var mhref = tinyMCE.getAttrib(elms[i], 'mce_href');
+		if (mhref != "")
+			href = mhref;
+
+		if (href && href != "") {
+			href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], href);
+			elms[i].setAttribute("href", href);
+		}
+	}
+};
+
+TinyMCEControl.prototype.getSelectedHTML = function() {
+	if (tinyMCE.isSafari) {
+		// Not realy perfect!!
+
+		return this.getRng().toString();
+	}
+
+	var elm = document.createElement("body");
+
+	if (tinyMCE.isGecko)
+		elm.appendChild(this.getRng().cloneContents());
+	else
+		elm.innerHTML = this.getRng().htmlText;
+
+	return tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, elm, this.visualAid);
+};
+
+TinyMCEControl.prototype.getBookmark = function() {
+	var rng = this.getRng();
+
+	if (tinyMCE.isSafari)
+		return rng;
+
+	if (tinyMCE.isMSIE)
+		return rng;
+
+	if (tinyMCE.isGecko)
+		return rng.cloneRange();
+
+	return null;
+};
+
+TinyMCEControl.prototype.moveToBookmark = function(bookmark) {
+	if (tinyMCE.isSafari) {
+		var sel = this.getSel().realSelection;
+
+		sel.setBaseAndExtent(bookmark.startContainer, bookmark.startOffset, bookmark.endContainer, bookmark.endOffset);
+
+		return true;
+	}
+
+	if (tinyMCE.isMSIE)
+		return bookmark.select();
+
+	if (tinyMCE.isGecko) {
+		var rng = this.getDoc().createRange();
+		var sel = this.getSel();
+
+		rng.setStart(bookmark.startContainer, bookmark.startOffset);
+		rng.setEnd(bookmark.endContainer, bookmark.endOffset);
+
+		sel.removeAllRanges();
+		sel.addRange(rng);
+
+		return true;
+	}
+
+	return false;
+};
+
+TinyMCEControl.prototype.getSelectedText = function() {
+	if (tinyMCE.isMSIE) {
+		var doc = this.getDoc();
+
+		if (doc.selection.type == "Text") {
+			var rng = doc.selection.createRange();
+			selectedText = rng.text;
+		} else
+			selectedText = '';
+	} else {
+		var sel = this.getSel();
+
+		if (sel && sel.toString)
+			selectedText = sel.toString();
+		else
+			selectedText = '';
+	}
+
+	return selectedText;
+};
+
+TinyMCEControl.prototype.selectNode = function(node, collapse, select_text_node, to_start) {
+	if (!node)
+		return;
+
+	if (typeof(collapse) == "undefined")
+		collapse = true;
+
+	if (typeof(select_text_node) == "undefined")
+		select_text_node = false;
+
+	if (typeof(to_start) == "undefined")
+		to_start = true;
+
+	if (tinyMCE.isMSIE) {
+		var rng = this.getBody().createTextRange();
+
+		try {
+			rng.moveToElementText(node);
+
+			if (collapse)
+				rng.collapse(to_start);
+
+			rng.select();
+		} catch (e) {
+			// Throws illigal agrument in MSIE some times
+		}
+	} else {
+		var sel = this.getSel();
+
+		if (!sel)
+			return;
+
+		if (tinyMCE.isSafari) {
+			sel.realSelection.setBaseAndExtent(node, 0, node, node.innerText.length);
+
+			if (collapse) {
+				if (to_start)
+					sel.realSelection.collapseToStart();
+				else
+					sel.realSelection.collapseToEnd();
+			}
+
+			this.scrollToNode(node);
+
+			return;
+		}
+
+		var rng = this.getDoc().createRange();
+
+		if (select_text_node) {
+			// Find first textnode in tree
+			var nodes = tinyMCE.getNodeTree(node, new Array(), 3);
+			if (nodes.length > 0)
+				rng.selectNodeContents(nodes[0]);
+			else
+				rng.selectNodeContents(node);
+		} else
+			rng.selectNode(node);
+
+		if (collapse) {
+			// Special treatment of textnode collapse
+			if (!to_start && node.nodeType == 3) {
+				rng.setStart(node, node.nodeValue.length);
+				rng.setEnd(node, node.nodeValue.length);
+			} else
+				rng.collapse(to_start);
+		}
+
+		sel.removeAllRanges();
+		sel.addRange(rng);
+	}
+
+	this.scrollToNode(node);
+
+	// Set selected element
+	tinyMCE.selectedElement = null;
+	if (node.nodeType == 1)
+		tinyMCE.selectedElement = node;
+};
+
+TinyMCEControl.prototype.scrollToNode = function(node) {
+	// Scroll to node position
+	var pos = tinyMCE.getAbsPosition(node);
+	var doc = this.getDoc();
+	var scrollX = doc.body.scrollLeft + doc.documentElement.scrollLeft;
+	var scrollY = doc.body.scrollTop + doc.documentElement.scrollTop;
+	var height = tinyMCE.isMSIE ? document.getElementById(this.editorId).style.pixelHeight : this.targetElement.clientHeight;
+
+	// Only scroll if out of visible area
+	if (!tinyMCE.settings['auto_resize'] && !(pos.absTop > scrollY && pos.absTop < (scrollY - 25 + height)))
+		this.contentWindow.scrollTo(pos.absLeft, pos.absTop - height + 25); 
+};
+
+TinyMCEControl.prototype.getBody = function() {
+	return this.getDoc().body;
+};
+
+TinyMCEControl.prototype.getDoc = function() {
+	return this.contentWindow.document;
+};
+
+TinyMCEControl.prototype.getWin = function() {
+	return this.contentWindow;
+};
+
+TinyMCEControl.prototype.getSel = function() {
+	if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+		return this.getDoc().selection;
+
+	var sel = this.contentWindow.getSelection();
+
+	// Fake getRangeAt
+	if (tinyMCE.isSafari && !sel.getRangeAt) {
+		var newSel = new Object();
+		var doc = this.getDoc();
+
+		function getRangeAt(idx) {
+			var rng = new Object();
+
+			rng.startContainer = this.focusNode;
+			rng.endContainer = this.anchorNode;
+			rng.commonAncestorContainer = this.focusNode;
+			rng.createContextualFragment = function (html) {
+				// Seems to be a tag
+				if (html.charAt(0) == '<') {
+					var elm = doc.createElement("div");
+
+					elm.innerHTML = html;
+
+					return elm.firstChild;
+				}
+
+				return doc.createTextNode("UNSUPPORTED, DUE TO LIMITATIONS IN SAFARI!");
+			};
+
+			rng.deleteContents = function () {
+				doc.execCommand("Delete", false, "");
+			};
+
+			return rng;
+		}
+
+		// Patch selection
+
+		newSel.focusNode = sel.baseNode;
+		newSel.focusOffset = sel.baseOffset;
+		newSel.anchorNode = sel.extentNode;
+		newSel.anchorOffset = sel.extentOffset;
+		newSel.getRangeAt = getRangeAt;
+		newSel.text = "" + sel;
+		newSel.realSelection = sel;
+
+		newSel.toString = function () {return this.text;};
+
+		return newSel;
+	}
+
+	return sel;
+};
+
+TinyMCEControl.prototype.getRng = function() {
+	var sel = this.getSel();
+	if (sel == null)
+		return null;
+
+	if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+		return sel.createRange();
+
+	if (tinyMCE.isSafari) {
+		var rng = this.getDoc().createRange();
+		var sel = this.getSel().realSelection;
+
+		rng.setStart(sel.baseNode, sel.baseOffset);
+		rng.setEnd(sel.extentNode, sel.extentOffset);
+
+		return rng;
+	}
+
+	return this.getSel().getRangeAt(0);
+};
+
+TinyMCEControl.prototype._insertPara = function(e) {
+	function isEmpty(para) {
+		function isEmptyHTML(html) {
+			return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == "";
+		}
+
+		// Check for images
+		if (para.getElementsByTagName("img").length > 0)
+			return false;
+
+		// Check for tables
+		if (para.getElementsByTagName("table").length > 0)
+			return false;
+
+		// Check for HRs
+		if (para.getElementsByTagName("hr").length > 0)
+			return false;
+
+		// Check all textnodes
+		var nodes = tinyMCE.getNodeTree(para, new Array(), 3);
+		for (var i=0; i<nodes.length; i++) {
+			if (!isEmptyHTML(nodes[i].nodeValue))
+				return false;
+		}
+
+		// No images, no tables, no hrs, no text content then it's empty
+		return true;
+	}
+
+	var doc = this.getDoc();
+	var sel = this.getSel();
+	var win = this.contentWindow;
+	var rng = sel.getRangeAt(0);
+	var body = doc.body;
+	var rootElm = doc.documentElement;
+	var self = this;
+	var blockName = "P";
+
+//	tinyMCE.debug(body.innerHTML);
+
+//	debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());
+
+	// Setup before range
+	var rngBefore = doc.createRange();
+	rngBefore.setStart(sel.anchorNode, sel.anchorOffset);
+	rngBefore.collapse(true);
+
+	// Setup after range
+	var rngAfter = doc.createRange();
+	rngAfter.setStart(sel.focusNode, sel.focusOffset);
+	rngAfter.collapse(true);
+
+	// Setup start/end points
+	var direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;
+	var startNode = direct ? sel.anchorNode : sel.focusNode;
+	var startOffset = direct ? sel.anchorOffset : sel.focusOffset;
+	var endNode = direct ? sel.focusNode : sel.anchorNode;
+	var endOffset = direct ? sel.focusOffset : sel.anchorOffset;
+
+	startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;
+	endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;
+
+	// tinyMCE.debug(startNode, endNode);
+
+	// Get block elements
+	var startBlock = tinyMCE.getParentBlockElement(startNode);
+	var endBlock = tinyMCE.getParentBlockElement(endNode);
+
+	// Use current block name
+	if (startBlock != null) {
+		blockName = startBlock.nodeName;
+
+		// Use P instead
+		if (blockName == "TD" || blockName == "TABLE" || (blockName == "DIV" && new RegExp('left|right', 'gi').test(startBlock.style.cssFloat)))
+			blockName = "P";
+	}
+
+	// Within a list use normal behaviour
+	if (tinyMCE.getParentElement(startBlock, "OL,UL") != null)
+		return false;
+
+	// Within a table create new paragraphs
+	if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))
+		startBlock = endBlock = null;
+
+	// Setup new paragraphs
+	var paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);
+	var paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);
+
+	// Is header, then force paragraph under
+	if (/^(H[1-6])$/.test(blockName))
+		paraAfter = doc.createElement("p");
+
+	// Setup chop nodes
+	var startChop = startNode;
+	var endChop = endNode;
+
+	// Get startChop node
+	node = startChop;
+	do {
+		if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+			break;
+
+		startChop = node;
+	} while ((node = node.previousSibling ? node.previousSibling : node.parentNode));
+
+	// Get endChop node
+	node = endChop;
+	do {
+		if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+			break;
+
+		endChop = node;
+	} while ((node = node.nextSibling ? node.nextSibling : node.parentNode));
+
+	// Fix when only a image is within the TD
+	if (startChop.nodeName == "TD")
+		startChop = startChop.firstChild;
+
+	if (endChop.nodeName == "TD")
+		endChop = endChop.lastChild;
+
+	// If not in a block element
+	if (startBlock == null) {
+		// Delete selection
+		rng.deleteContents();
+		sel.removeAllRanges();
+
+		if (startChop != rootElm && endChop != rootElm) {
+			// Insert paragraph before
+			rngBefore = rng.cloneRange();
+
+			if (startChop == body)
+				rngBefore.setStart(startChop, 0);
+			else
+				rngBefore.setStartBefore(startChop);
+
+			paraBefore.appendChild(rngBefore.cloneContents());
+
+			// Insert paragraph after
+			if (endChop.parentNode.nodeName == blockName)
+				endChop = endChop.parentNode;
+
+			// If not after image
+			//if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")
+				rng.setEndAfter(endChop);
+
+			if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")
+				rngBefore.setEndAfter(endChop);
+
+			var contents = rng.cloneContents();
+			if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))
+				paraAfter.innerHTML = contents.firstChild.innerHTML;
+			else
+				paraAfter.appendChild(contents);
+
+			// Check if it's a empty paragraph
+			if (isEmpty(paraBefore))
+				paraBefore.innerHTML = "&nbsp;";
+
+			// Check if it's a empty paragraph
+			if (isEmpty(paraAfter))
+				paraAfter.innerHTML = "&nbsp;";
+
+			// Delete old contents
+			rng.deleteContents();
+			rngAfter.deleteContents();
+			rngBefore.deleteContents();
+
+			// Insert new paragraphs
+			paraAfter.normalize();
+			rngBefore.insertNode(paraAfter);
+			paraBefore.normalize();
+			rngBefore.insertNode(paraBefore);
+
+			// tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);
+		} else {
+			body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";
+			paraAfter = body.childNodes[1];
+		}
+
+		this.selectNode(paraAfter, true, true);
+
+		return true;
+	}
+
+	// Place first part within new paragraph
+	if (startChop.nodeName == blockName)
+		rngBefore.setStart(startChop, 0);
+	else
+		rngBefore.setStartBefore(startChop);
+
+	rngBefore.setEnd(startNode, startOffset);
+	paraBefore.appendChild(rngBefore.cloneContents());
+
+	// Place secound part within new paragraph
+	rngAfter.setEndAfter(endChop);
+	rngAfter.setStart(endNode, endOffset);
+	var contents = rngAfter.cloneContents();
+
+	if (contents.firstChild && contents.firstChild.nodeName == blockName) {
+/*		var nodes = contents.firstChild.childNodes;
+		for (var i=0; i<nodes.length; i++) {
+			//tinyMCE.debug(nodes[i].nodeName);
+			if (nodes[i].nodeName != "BODY")
+				paraAfter.appendChild(nodes[i]);
+		}
+*/
+		paraAfter.innerHTML = contents.firstChild.innerHTML;
+	} else
+		paraAfter.appendChild(contents);
+
+	// Check if it's a empty paragraph
+	if (isEmpty(paraBefore))
+		paraBefore.innerHTML = "&nbsp;";
+
+	// Check if it's a empty paragraph
+	if (isEmpty(paraAfter))
+		paraAfter.innerHTML = "&nbsp;";
+
+	// Create a range around everything
+	var rng = doc.createRange();
+
+	if (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {
+		rng.setStartBefore(startChop.parentNode);
+	} else {
+		if (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)
+			rng.setStartBefore(rngBefore.startContainer);
+		else
+			rng.setStart(rngBefore.startContainer, rngBefore.startOffset);
+	}
+
+	if (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)
+		rng.setEndAfter(endChop.parentNode);
+	else
+		rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);
+
+	// Delete all contents and insert new paragraphs
+	rng.deleteContents();
+	rng.insertNode(paraAfter);
+	rng.insertNode(paraBefore);
+	//tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);
+
+	// Normalize
+	paraAfter.normalize();
+	paraBefore.normalize();
+
+	this.selectNode(paraAfter, true, true);
+
+	return true;
+};
+
+TinyMCEControl.prototype._handleBackSpace = function(evt_type) {
+	var doc = this.getDoc();
+	var sel = this.getSel();
+	if (sel == null)
+		return false;
+
+	var rng = sel.getRangeAt(0);
+	var node = rng.startContainer;
+	var elm = node.nodeType == 3 ? node.parentNode : node;
+
+	if (node == null)
+		return;
+
+	// Empty node, wrap contents in paragraph
+	if (elm && elm.nodeName == "") {
+		var para = doc.createElement("p");
+
+		while (elm.firstChild)
+			para.appendChild(elm.firstChild);
+
+		elm.parentNode.insertBefore(para, elm);
+		elm.parentNode.removeChild(elm);
+
+		var rng = rng.cloneRange();
+		rng.setStartBefore(node.nextSibling);
+		rng.setEndAfter(node.nextSibling);
+		rng.extractContents();
+
+		this.selectNode(node.nextSibling, true, true);
+	}
+
+	// Remove empty paragraphs
+	var para = tinyMCE.getParentBlockElement(node);
+	if (para != null && para.nodeName.toLowerCase() == 'p' && evt_type == "keypress") {
+		var htm = para.innerHTML;
+		var block = tinyMCE.getParentBlockElement(node);
+
+		// Empty node, we do the killing!!
+		if (htm == "" || htm == "&nbsp;" || block.nodeName.toLowerCase() == "li") {
+			var prevElm = para.previousSibling;
+
+			while (prevElm != null && prevElm.nodeType != 1)
+				prevElm = prevElm.previousSibling;
+
+			if (prevElm == null)
+				return false;
+
+			// Get previous elements last text node
+			var nodes = tinyMCE.getNodeTree(prevElm, new Array(), 3);
+			var lastTextNode = nodes.length == 0 ? null : nodes[nodes.length-1];
+
+			// Select the last text node and move curstor to end
+			if (lastTextNode != null)
+				this.selectNode(lastTextNode, true, false, false);
+
+			// Remove the empty paragrapsh
+			para.parentNode.removeChild(para);
+
+			//debug("within p element" + para.innerHTML);
+			//showHTML(this.getBody().innerHTML);
+			return true;
+		}
+	}
+
+	// Remove BR elements
+/*	while (node != null && (node = node.nextSibling) != null) {
+		if (node.nodeName.toLowerCase() == 'br')
+			node.parentNode.removeChild(node);
+		else if (node.nodeType == 1) // Break at other element
+			break;
+	}*/
+
+	//showHTML(this.getBody().innerHTML);
+
+	return false;
+};
+
+TinyMCEControl.prototype._insertSpace = function() {
+	return true;
+};
+
+TinyMCEControl.prototype.autoResetDesignMode = function() {
+	// Add fix for tab/style.display none/block problems in Gecko
+	if (!tinyMCE.isMSIE && tinyMCE.settings['auto_reset_designmode'] && this.isHidden())
+		eval('try { this.getDoc().designMode = "On"; } catch(e) {}');
+};
+
+TinyMCEControl.prototype.isHidden = function() {
+	if (tinyMCE.isMSIE)
+		return false;
+
+	var sel = this.getSel();
+
+	// Weird, wheres that cursor selection?
+	return (!sel || !sel.rangeCount || sel.rangeCount == 0);
+};
+
+TinyMCEControl.prototype.isDirty = function() {
+	// Is content modified and not in a submit procedure
+	return this.startContent != tinyMCE.trim(this.getBody().innerHTML) && !tinyMCE.isNotDirty;
+};
+
+TinyMCEControl.prototype._mergeElements = function(scmd, pa, ch, override) {
+	if (scmd == "removeformat") {
+		pa.className = "";
+		pa.style.cssText = "";
+		ch.className = "";
+		ch.style.cssText = "";
+		return;
+	}
+
+	var st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));
+	var stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));
+	var className = tinyMCE.getAttrib(pa, "class");
+
+	className += " " + tinyMCE.getAttrib(ch, "class");
+
+	if (override) {
+		for (var n in st) {
+			if (typeof(st[n]) == 'function')
+				continue;
+
+			stc[n] = st[n];
+		}
+	} else {
+		for (var n in stc) {
+			if (typeof(stc[n]) == 'function')
+				continue;
+
+			st[n] = stc[n];
+		}
+	}
+
+	tinyMCE.setAttrib(pa, "style", tinyMCE.serializeStyle(st));
+	tinyMCE.setAttrib(pa, "class", tinyMCE.trim(className));
+	ch.className = "";
+	ch.style.cssText = "";
+	ch.removeAttribute("class");
+	ch.removeAttribute("style");
+};
+
+TinyMCEControl.prototype.setUseCSS = function(b) {
+	var doc = this.getDoc();
+	try {doc.execCommand("useCSS", false, !b);} catch (ex) {}
+	try {doc.execCommand("styleWithCSS", false, b);} catch (ex) {}
+
+	if (!tinyMCE.getParam("table_inline_editing"))
+		try {doc.execCommand('enableInlineTableEditing', false, "false");} catch (ex) {}
+
+	if (!tinyMCE.getParam("object_resizing"))
+		try {doc.execCommand('enableObjectResizing', false, "false");} catch (ex) {}
+};
+
+TinyMCEControl.prototype.execCommand = function(command, user_interface, value) {
+	var doc = this.getDoc();
+	var win = this.getWin();
+	var focusElm = this.getFocusElement();
+
+	if (this.lastSafariSelection && !new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command)) {
+		this.moveToBookmark(this.lastSafariSelection);
+		tinyMCE.selectedElement = this.lastSafariSelectedElement;
+	}
+
+	// Mozilla issue
+	if (!tinyMCE.isMSIE && !this.useCSS) {
+		this.setUseCSS(false);
+		this.useCSS = true;
+	}
+
+	//debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);
+	this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks
+
+	// Call theme execcommand
+	if (tinyMCE._themeExecCommand(this.editorId, this.getBody(), command, user_interface, value))
+		return;
+
+	// Fix align on images
+	if (focusElm && focusElm.nodeName == "IMG") {
+		var align = focusElm.getAttribute('align');
+		var img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;
+
+		switch (command) {
+			case "JustifyLeft":
+				if (align == 'left')
+					img.removeAttribute('align');
+				else
+					img.setAttribute('align', 'left');
+
+				// Remove the div
+				var div = focusElm.parentNode;
+				if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
+					div.parentNode.replaceChild(img, div);
+
+				this.selectNode(img);
+				this.repaint();
+				tinyMCE.triggerNodeChange();
+				return;
+
+			case "JustifyCenter":
+				img.removeAttribute('align');
+
+				// Is centered
+				var div = tinyMCE.getParentElement(focusElm, "div");
+				if (div && div.style.textAlign == "center") {
+					// Remove div
+					if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
+						div.parentNode.replaceChild(img, div);
+				} else {
+					// Add div
+					var div = this.getDoc().createElement("div");
+					div.style.textAlign = 'center';
+					div.appendChild(img);
+					focusElm.parentNode.replaceChild(div, focusElm);
+				}
+
+				this.selectNode(img);
+				this.repaint();
+				tinyMCE.triggerNodeChange();
+				return;
+
+			case "JustifyRight":
+				if (align == 'right')
+					img.removeAttribute('align');
+				else
+					img.setAttribute('align', 'right');
+
+				// Remove the div
+				var div = focusElm.parentNode;
+				if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
+					div.parentNode.replaceChild(img, div);
+
+				this.selectNode(img);
+				this.repaint();
+				tinyMCE.triggerNodeChange();
+				return;
+		}
+	}
+
+	if (tinyMCE.settings['force_br_newlines']) {
+		var alignValue = "";
+
+		if (doc.selection.type != "Control") {
+			switch (command) {
+					case "JustifyLeft":
+						alignValue = "left";
+						break;
+
+					case "JustifyCenter":
+						alignValue = "center";
+						break;
+
+					case "JustifyFull":
+						alignValue = "justify";
+						break;
+
+					case "JustifyRight":
+						alignValue = "right";
+						break;
+			}
+
+			if (alignValue != "") {
+				var rng = doc.selection.createRange();
+
+				if ((divElm = tinyMCE.getParentElement(rng.parentElement(), "div")) != null)
+					divElm.setAttribute("align", alignValue);
+				else if (rng.pasteHTML && rng.htmlText.length > 0)
+					rng.pasteHTML('<div align="' + alignValue + '">' + rng.htmlText + "</div>");
+
+				tinyMCE.triggerNodeChange();
+				return;
+			}
+		}
+	}
+
+	switch (command) {
+		case "mceRepaint":
+			this.repaint();
+			return true;
+
+		case "mceStoreSelection":
+			this.selectionBookmark = this.getBookmark();
+			return true;
+
+		case "mceRestoreSelection":
+			this.moveToBookmark(this.selectionBookmark);
+			return true;
+
+		case "InsertUnorderedList":
+		case "InsertOrderedList":
+			var tag = (command == "InsertUnorderedList") ? "ul" : "ol";
+
+			if (tinyMCE.isSafari)
+				this.execCommand("mceInsertContent", false, "<" + tag + "><li>&nbsp;</li><" + tag + ">");
+			else
+				this.getDoc().execCommand(command, user_interface, value);
+
+			tinyMCE.triggerNodeChange();
+			break;
+
+		case "Strikethrough":
+			if (tinyMCE.isSafari)
+				this.execCommand("mceInsertContent", false, "<strike>" + this.getSelectedHTML() + "</strike>");
+			else
+				this.getDoc().execCommand(command, user_interface, value);
+
+			tinyMCE.triggerNodeChange();
+			break;
+
+		case "mceSelectNode":
+			this.selectNode(value);
+			tinyMCE.triggerNodeChange();
+			tinyMCE.selectedNode = value;
+			break;
+
+		case "FormatBlock":
+			if (value == null || value == "") {
+				var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address");
+
+				if (elm)
+					this.execCommand("mceRemoveNode", false, elm);
+			} else
+				this.getDoc().execCommand("FormatBlock", false, value);
+
+			tinyMCE.triggerNodeChange();
+
+			break;
+
+		case "mceRemoveNode":
+			if (!value)
+				value = tinyMCE.getParentElement(this.getFocusElement());
+
+			if (tinyMCE.isMSIE) {
+				value.outerHTML = value.innerHTML;
+			} else {
+				var rng = value.ownerDocument.createRange();
+				rng.setStartBefore(value);
+				rng.setEndAfter(value);
+				rng.deleteContents();
+				rng.insertNode(rng.createContextualFragment(value.innerHTML));
+			}
+
+			tinyMCE.triggerNodeChange();
+
+			break;
+
+		case "mceSelectNodeDepth":
+			var parentNode = this.getFocusElement();
+			for (var i=0; parentNode; i++) {
+				if (parentNode.nodeName.toLowerCase() == "body")
+					break;
+
+				if (parentNode.nodeName.toLowerCase() == "#text") {
+					i--;
+					parentNode = parentNode.parentNode;
+					continue;
+				}
+
+				if (i == value) {
+					this.selectNode(parentNode, false);
+					tinyMCE.triggerNodeChange();
+					tinyMCE.selectedNode = parentNode;
+					return;
+				}
+
+				parentNode = parentNode.parentNode;
+			}
+
+			break;
+
+		case "SetStyleInfo":
+			var rng = this.getRng();
+			var sel = this.getSel();
+			var scmd = value['command'];
+			var sname = value['name'];
+			var svalue = value['value'] == null ? '' : value['value'];
+			//var svalue = value['value'] == null ? '' : value['value'];
+			var wrapper = value['wrapper'] ? value['wrapper'] : "span";
+			var parentElm = null;
+			var invalidRe = new RegExp("^BODY|HTML$", "g");
+			var invalidParentsRe = tinyMCE.settings['merge_styles_invalid_parents'] != '' ? new RegExp(tinyMCE.settings['merge_styles_invalid_parents'], "gi") : null;
+
+			// Whole element selected check
+			if (tinyMCE.isMSIE) {
+				// Control range
+				if (rng.item)
+					parentElm = rng.item(0);
+				else {
+					var pelm = rng.parentElement();
+					var prng = doc.selection.createRange();
+					prng.moveToElementText(pelm);
+
+					if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {
+						if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))
+							parentElm = pelm;
+					}
+				}
+			} else {
+				var felm = this.getFocusElement();
+				if (sel.isCollapsed || (/td|tr|tbody|table/ig.test(felm.nodeName) && sel.anchorNode == felm.parentNode))
+					parentElm = felm;
+			}
+
+			// Whole element selected
+			if (parentElm && !invalidRe.test(parentElm.nodeName)) {
+				if (scmd == "setstyle")
+					tinyMCE.setStyleAttrib(parentElm, sname, svalue);
+
+				if (scmd == "setattrib")
+					tinyMCE.setAttrib(parentElm, sname, svalue);
+
+				if (scmd == "removeformat") {
+					parentElm.style.cssText = '';
+					tinyMCE.setAttrib(parentElm, 'class', '');
+				}
+
+				// Remove style/attribs from all children
+				var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1);
+				for (var z=0; z<ch.length; z++) {
+					if (ch[z] == parentElm)
+						continue;
+
+					if (scmd == "setstyle")
+						tinyMCE.setStyleAttrib(ch[z], sname, '');
+
+					if (scmd == "setattrib")
+						tinyMCE.setAttrib(ch[z], sname, '');
+
+					if (scmd == "removeformat") {
+						ch[z].style.cssText = '';
+						tinyMCE.setAttrib(ch[z], 'class', '');
+					}
+				}
+			} else {
+				doc.execCommand("fontname", false, "#mce_temp_font#");
+				var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");
+
+				// Change them all
+				for (var x=0; x<elementArray.length; x++) {
+					elm = elementArray[x];
+					if (elm) {
+						var spanElm = doc.createElement(wrapper);
+
+						if (scmd == "setstyle")
+							tinyMCE.setStyleAttrib(spanElm, sname, svalue);
+
+						if (scmd == "setattrib")
+							tinyMCE.setAttrib(spanElm, sname, svalue);
+
+						if (scmd == "removeformat") {
+							spanElm.style.cssText = '';
+							tinyMCE.setAttrib(spanElm, 'class', '');
+						}
+
+						if (elm.hasChildNodes()) {
+							for (var i=0; i<elm.childNodes.length; i++)
+								spanElm.appendChild(elm.childNodes[i].cloneNode(true));
+						}
+
+						spanElm.setAttribute("mce_new", "true");
+						elm.parentNode.replaceChild(spanElm, elm);
+
+						// Remove style/attribs from all children
+						var ch = tinyMCE.getNodeTree(spanElm, new Array(), 1);
+						for (var z=0; z<ch.length; z++) {
+							if (ch[z] == spanElm)
+								continue;
+
+							if (scmd == "setstyle")
+								tinyMCE.setStyleAttrib(ch[z], sname, '');
+
+							if (scmd == "setattrib")
+								tinyMCE.setAttrib(ch[z], sname, '');
+
+							if (scmd == "removeformat") {
+								ch[z].style.cssText = '';
+								tinyMCE.setAttrib(ch[z], 'class', '');
+							}
+						}
+					}
+				}
+			}
+
+			// Cleaup wrappers
+			var nodes = doc.getElementsByTagName(wrapper);
+			for (var i=nodes.length-1; i>=0; i--) {
+				var elm = nodes[i];
+				var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";
+
+				elm.removeAttribute("mce_new");
+
+				// Is only child a element
+				if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {
+					//tinyMCE.debug("merge1" + isNew);
+					this._mergeElements(scmd, elm, elm.childNodes[0], isNew);
+					continue;
+				}
+
+				// Is I the only child
+				if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {
+					//tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);
+					if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))
+						this._mergeElements(scmd, elm.parentNode, elm, false);
+				}
+			}
+
+			// Remove empty wrappers
+			var nodes = doc.getElementsByTagName(wrapper);
+			for (var i=nodes.length-1; i>=0; i--) {
+				var elm = nodes[i];
+				var isEmpty = true;
+
+				// Check if it has any attribs
+				var tmp = doc.createElement("body");
+				tmp.appendChild(elm.cloneNode(false));
+
+				// Is empty span, remove it
+				tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');
+				//tinyMCE.debug(tmp.innerHTML);
+				if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {
+					for (var x=0; x<elm.childNodes.length; x++) {
+						if (elm.parentNode != null)
+							elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);
+					}
+
+					elm.parentNode.removeChild(elm);
+				}
+			}
+
+			// Re add the visual aids
+			if (scmd == "removeformat")
+				tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+
+			tinyMCE.triggerNodeChange();
+
+			break;
+
+		case "FontName":
+			if (value == null) {
+				var s = this.getSel();
+
+				// Find font and select it
+				if (tinyMCE.isGecko && s.isCollapsed) {
+					var f = tinyMCE.getParentElement(this.getFocusElement(), "font");
+
+					if (f != null)
+						this.selectNode(f, false);
+				}
+
+				// Remove format
+				this.getDoc().execCommand("RemoveFormat", false, null);
+
+				// Collapse range if font was found
+				if (f != null && tinyMCE.isGecko) {
+					var r = this.getRng().cloneRange();
+					r.collapse(true);
+					s.removeAllRanges();
+					s.addRange(r);
+				}
+			} else
+				this.getDoc().execCommand('FontName', false, value);
+
+			if (tinyMCE.isGecko)
+				window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+
+			return;
+
+		case "FontSize":
+			this.getDoc().execCommand('FontSize', false, value);
+
+			if (tinyMCE.isGecko)
+				window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+
+			return;
+
+		case "forecolor":
+			this.getDoc().execCommand('forecolor', false, value);
+			break;
+
+		case "HiliteColor":
+			if (tinyMCE.isGecko) {
+				this.setUseCSS(true);
+				this.getDoc().execCommand('hilitecolor', false, value);
+				this.setUseCSS(false);
+			} else
+				this.getDoc().execCommand('BackColor', false, value);
+			break;
+
+		case "Cut":
+		case "Copy":
+		case "Paste":
+			var cmdFailed = false;
+
+			// Try executing command
+			eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');
+
+			if (tinyMCE.isOpera && cmdFailed)
+				alert('Currently not supported by your browser, use keyboard shortcuts instead.');
+
+			// Alert error in gecko if command failed
+			if (tinyMCE.isGecko && cmdFailed) {
+				// Confirm more info
+				if (confirm(tinyMCE.getLang('lang_clipboard_msg')))
+					window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');
+
+				return;
+			} else
+				tinyMCE.triggerNodeChange();
+		break;
+
+		case "mceSetContent":
+			if (!value)
+				value = "";
+
+			// Call custom cleanup code
+			value = tinyMCE.storeAwayURLs(value);
+			//value = tinyMCE._customCleanup(this, "insert_to_editor", value);
+			tinyMCE._setHTML(doc, value);
+			tinyMCE.setInnerHTML(doc.body, tinyMCE._cleanupHTML(this, doc, tinyMCE.settings, doc.body));
+			this.convertAllRelativeURLs();
+			tinyMCE.handleVisualAid(doc.body, true, this.visualAid, this);
+			tinyMCE._setEventsEnabled(doc.body, false);
+			return true;
+
+		case "mceLink":
+			var selectedText = "";
+
+			if (tinyMCE.isMSIE) {
+				var rng = doc.selection.createRange();
+				selectedText = rng.text;
+			} else
+				selectedText = this.getSel().toString();
+
+			if (!tinyMCE.linkElement) {
+				if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))
+					return;
+			}
+
+			var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";
+
+			if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")
+				tinyMCE.linkElement = tinyMCE.selectedElement;
+
+			// Is anchor not a link
+			if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")
+				tinyMCE.linkElement = null;
+
+			if (tinyMCE.linkElement) {
+				href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');
+				target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');
+				title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');
+                onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
+				style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');
+
+				// Try old onclick to if copy/pasted content
+				if (onclick == "")
+					onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
+
+				onclick = tinyMCE.cleanupEventStr(onclick);
+
+				href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
+
+				// Use mce_href if defined
+				mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');
+				if (mceRealHref != "") {
+					href = mceRealHref;
+
+					if (tinyMCE.getParam('convert_urls'))
+						href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
+				}
+
+				action = "update";
+			}
+
+			if (this.settings['insertlink_callback']) {
+				var returnVal = eval(this.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");
+				if (returnVal && returnVal['href'])
+					tinyMCE.insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);
+			} else {
+				tinyMCE.openWindow(this.insertLinkTemplate, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});
+			}
+		break;
+
+		case "mceImage":
+			var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";
+			var title = "", onmouseover = "", onmouseout = "", action = "insert";
+			var img = tinyMCE.imgElement;
+
+			if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {
+				img = tinyMCE.selectedElement;
+				tinyMCE.imgElement = img;
+			}
+
+			if (img) {
+				// Is it a internal MCE visual aid image, then skip this one.
+				if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)
+					return;
+
+				src = tinyMCE.getAttrib(img, 'src');
+				alt = tinyMCE.getAttrib(img, 'alt');
+
+				// Try polling out the title
+				if (alt == "")
+					alt = tinyMCE.getAttrib(img, 'title');
+
+				// Fix width/height attributes if the styles is specified
+				if (tinyMCE.isGecko) {
+					var w = img.style.width;
+					if (w != null && w != "")
+						img.setAttribute("width", w);
+
+					var h = img.style.height;
+					if (h != null && h != "")
+						img.setAttribute("height", h);
+				}
+
+				border = tinyMCE.getAttrib(img, 'border');
+				hspace = tinyMCE.getAttrib(img, 'hspace');
+				vspace = tinyMCE.getAttrib(img, 'vspace');
+				width = tinyMCE.getAttrib(img, 'width');
+				height = tinyMCE.getAttrib(img, 'height');
+				align = tinyMCE.getAttrib(img, 'align');
+                onmouseover = tinyMCE.getAttrib(img, 'onmouseover');
+                onmouseout = tinyMCE.getAttrib(img, 'onmouseout');
+                title = tinyMCE.getAttrib(img, 'title');
+
+				// Is realy specified?
+				if (tinyMCE.isMSIE) {
+					width = img.attributes['width'].specified ? width : "";
+					height = img.attributes['height'].specified ? height : "";
+				}
+
+				onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));
+				onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));
+
+				src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
+
+				// Use mce_src if defined
+				mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');
+				if (mceRealSrc != "") {
+					src = mceRealSrc;
+
+					if (tinyMCE.getParam('convert_urls'))
+						src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
+				}
+
+				if (onmouseover != "")
+					onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");
+
+				if (onmouseout != "")
+					onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");
+
+				action = "update";
+			}
+
+			if (this.settings['insertimage_callback']) {
+				var returnVal = eval(this.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");
+				if (returnVal && returnVal['src'])
+					tinyMCE.insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']);
+			} else
+				tinyMCE.openWindow(this.insertImageTemplate, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"});
+		break;
+
+		case "mceCleanup":
+			tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML);
+			tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, this.getBody(), this.visualAid));
+			this.convertAllRelativeURLs();
+			tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+			tinyMCE._setEventsEnabled(this.getBody(), false);
+			this.repaint();
+			tinyMCE.triggerNodeChange();
+		break;
+
+		case "mceReplaceContent":
+			this.getWin().focus();
+
+			var selectedText = "";
+
+			if (tinyMCE.isMSIE) {
+				var rng = doc.selection.createRange();
+				selectedText = rng.text;
+			} else
+				selectedText = this.getSel().toString();
+
+			if (selectedText.length > 0) {
+				value = tinyMCE.replaceVar(value, "selection", selectedText);
+				tinyMCE.execCommand('mceInsertContent', false, value);
+			}
+
+			tinyMCE.triggerNodeChange();
+		break;
+
+		case "mceSetAttribute":
+			if (typeof(value) == 'object') {
+				var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets'];
+				var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);
+
+				if (targetNode) {
+					targetNode.setAttribute(value['name'], value['value']);
+					tinyMCE.triggerNodeChange();
+				}
+			}
+		break;
+
+		case "mceSetCSSClass":
+			this.execCommand("SetStyleInfo", false, {command : "setattrib", name : "class", value : value});
+		break;
+
+		case "mceInsertRawHTML":
+			var key = 'tiny_mce_marker';
+
+			this.execCommand('mceBeginUndoLevel');
+
+			// Insert marker key
+			this.execCommand('mceInsertContent', false, key);
+
+			// Store away scroll pos
+			var scrollX = this.getDoc().body.scrollLeft + this.getDoc().documentElement.scrollLeft;
+			var scrollY = this.getDoc().body.scrollTop + this.getDoc().documentElement.scrollTop;
+
+			// Find marker and replace with RAW HTML
+			var html = this.getBody().innerHTML;
+			if ((pos = html.indexOf(key)) != -1)
+				tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));
+
+			// Restore scoll pos
+			this.contentWindow.scrollTo(scrollX, scrollY);
+
+			this.execCommand('mceEndUndoLevel');
+
+			break;
+
+		case "mceInsertContent":
+			var insertHTMLFailed = false;
+			this.getWin().focus();
+/* WP
+			if (tinyMCE.isGecko || tinyMCE.isOpera) {
+				try {
+					// Is plain text or HTML
+					if (value.indexOf('<') == -1) {
+						var r = this.getRng();
+						var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value));
+						var s = this.getSel();
+						var r2 = r.cloneRange();
+
+						// Insert text at cursor position
+						s.removeAllRanges();
+						r.deleteContents();
+						r.insertNode(n);
+
+						// Move the cursor to the end of text
+						r2.selectNode(n);
+						r2.collapse(false);
+						s.removeAllRanges();
+						s.addRange(r2);
+					} else {
+						value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);
+						this.getDoc().execCommand('inserthtml', false, value);
+						tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);
+					}
+				} catch (ex) {
+					insertHTMLFailed = true;
+				}
+
+				if (!insertHTMLFailed) {
+					tinyMCE.triggerNodeChange();
+					return;
+				}
+			}
+*/
+			// Ugly hack in Opera due to non working "inserthtml"
+			if (tinyMCE.isOpera && insertHTMLFailed) {
+				this.getDoc().execCommand("insertimage", false, tinyMCE.uniqueURL);
+				var ar = tinyMCE.getElementsByAttributeValue(this.getBody(), "img", "src", tinyMCE.uniqueURL);
+				ar[0].outerHTML = value;
+				return;
+			}
+
+			if (!tinyMCE.isMSIE) {
+				var isHTML = value.indexOf('<') != -1;
+				var sel = this.getSel();
+				var rng = this.getRng();
+
+				if (isHTML) {
+					if (tinyMCE.isSafari) {
+						var tmpRng = this.getDoc().createRange();
+
+						tmpRng.setStart(this.getBody(), 0);
+						tmpRng.setEnd(this.getBody(), 0);
+
+						value = tmpRng.createContextualFragment(value);
+					} else
+						value = rng.createContextualFragment(value);
+				} else {
+					// Setup text node
+					var el = document.createElement("div");
+					el.innerHTML = value;
+					value = el.firstChild.nodeValue;
+					value = doc.createTextNode(value);
+				}
+
+				// Insert plain text in Safari
+				if (tinyMCE.isSafari && !isHTML) {
+					this.execCommand('InsertText', false, value.nodeValue);
+					tinyMCE.triggerNodeChange();
+					return true;
+				} else if (tinyMCE.isSafari && isHTML) {
+					rng.deleteContents();
+					rng.insertNode(value);
+					tinyMCE.triggerNodeChange();
+					return true;
+				}
+
+				rng.deleteContents();
+
+				// If target node is text do special treatment, (Mozilla 1.3 fix)
+				if (rng.startContainer.nodeType == 3) {
+					var node = rng.startContainer.splitText(rng.startOffset);
+					node.parentNode.insertBefore(value, node); 
+				} else
+					rng.insertNode(value);
+
+				if (!isHTML) {
+					// Removes weird selection trails
+					sel.selectAllChildren(doc.body);
+					sel.removeAllRanges();
+
+					// Move cursor to end of content
+					var rng = doc.createRange();
+
+					rng.selectNode(value);
+					rng.collapse(false);
+
+					sel.addRange(rng);
+				} else
+					rng.collapse(false);
+			} else {
+				var rng = doc.selection.createRange();
+				var c = value.indexOf('<!--') != -1;
+
+				// Fix comment bug, add tag before comments
+				if (c)
+					value = tinyMCE.uniqueTag + value;
+
+				if (rng.item)
+					rng.item(0).outerHTML = value;
+				else
+					rng.pasteHTML(value);
+
+				// Remove unique tag
+				if (c) {
+					var e = this.getDoc().getElementById('mceTMPElement');
+					e.parentNode.removeChild(e);
+				}
+			}
+
+			tinyMCE.triggerNodeChange();
+		break;
+
+		case "mceStartTyping":
+			if (tinyMCE.settings['custom_undo_redo'] && this.typingUndoIndex == -1) {
+				this.typingUndoIndex = this.undoIndex;
+				this.execCommand('mceAddUndoLevel');
+				//tinyMCE.debug("mceStartTyping");
+			}
+			break;
+
+		case "mceEndTyping":
+			if (tinyMCE.settings['custom_undo_redo'] && this.typingUndoIndex != -1) {
+				this.execCommand('mceAddUndoLevel');
+				this.typingUndoIndex = -1;
+				//tinyMCE.debug("mceEndTyping");
+			}
+			break;
+
+		case "mceBeginUndoLevel":
+			this.undoRedo = false;
+			break;
+
+		case "mceEndUndoLevel":
+			this.undoRedo = true;
+			this.execCommand('mceAddUndoLevel');
+			break;
+
+		case "mceAddUndoLevel":
+			if (tinyMCE.settings['custom_undo_redo'] && this.undoRedo) {
+				// tinyMCE.debug("add level");
+
+				if (this.typingUndoIndex != -1) {
+					this.undoIndex = this.typingUndoIndex;
+					// tinyMCE.debug("Override: " + this.undoIndex);
+				}
+
+				var newHTML = tinyMCE.trim(this.getBody().innerHTML);
+				if (newHTML != this.undoLevels[this.undoIndex]) {
+					tinyMCE.executeCallback('onchange_callback', '_onchange', 0, this);
+
+					// Time to compress
+					var customUndoLevels = tinyMCE.settings['custom_undo_redo_levels'];
+					if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {
+						for (var i=0; i<this.undoLevels.length-1; i++) {
+							//tinyMCE.debug(this.undoLevels[i] + "=" + this.undoLevels[i+1]);
+							this.undoLevels[i] = this.undoLevels[i+1];
+						}
+
+						this.undoLevels.length--;
+						this.undoIndex--;
+					}
+
+					this.undoIndex++;
+					this.undoLevels[this.undoIndex] = newHTML;
+					this.undoLevels.length = this.undoIndex + 1;
+
+					// tinyMCE.debug("level added" + this.undoIndex);
+					tinyMCE.triggerNodeChange(false);
+
+					// tinyMCE.debug(this.undoIndex + "," + (this.undoLevels.length-1));
+				}
+			}
+			break;
+
+		case "Undo":
+			if (tinyMCE.settings['custom_undo_redo']) {
+				tinyMCE.execCommand("mceEndTyping");
+
+				// Do undo
+				if (this.undoIndex > 0) {
+					this.undoIndex--;
+					tinyMCE.setInnerHTML(this.getBody(), this.undoLevels[this.undoIndex]);
+					this.repaint();
+				}
+
+				// tinyMCE.debug("Undo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);
+				tinyMCE.triggerNodeChange();
+			} else
+				this.getDoc().execCommand(command, user_interface, value);
+			break;
+
+		case "Redo":
+			if (tinyMCE.settings['custom_undo_redo']) {
+				tinyMCE.execCommand("mceEndTyping");
+
+				if (this.undoIndex < (this.undoLevels.length-1)) {
+					this.undoIndex++;
+					tinyMCE.setInnerHTML(this.getBody(), this.undoLevels[this.undoIndex]);
+					this.repaint();
+					// tinyMCE.debug("Redo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);
+				}
+
+				tinyMCE.triggerNodeChange();
+			} else
+				this.getDoc().execCommand(command, user_interface, value);
+			break;
+
+		case "mceToggleVisualAid":
+			this.visualAid = !this.visualAid;
+			tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+			tinyMCE.triggerNodeChange();
+			break;
+
+		case "Indent":
+			this.getDoc().execCommand(command, user_interface, value);
+			tinyMCE.triggerNodeChange();
+			if (tinyMCE.isMSIE) {
+				var n = tinyMCE.getParentElement(this.getFocusElement(), "blockquote");
+				do {
+					if (n && n.nodeName == "BLOCKQUOTE") {
+						n.removeAttribute("dir");
+						n.removeAttribute("style");
+					}
+				} while (n != null && (n = n.parentNode) != null);
+			}
+			break;
+
+		case "removeformat":
+			var text = this.getSelectedText();
+
+			if (tinyMCE.isOpera) {
+				this.getDoc().execCommand("RemoveFormat", false, null);
+				return;
+			}
+
+			if (tinyMCE.isMSIE) {
+				try {
+					var rng = doc.selection.createRange();
+					rng.execCommand("RemoveFormat", false, null);
+				} catch (e) {
+					// Do nothing
+				}
+
+				this.execCommand("SetStyleInfo", false, {command : "removeformat"});
+			} else {
+				this.getDoc().execCommand(command, user_interface, value);
+
+				this.execCommand("SetStyleInfo", false, {command : "removeformat"});
+			}
+
+			// Remove class
+			if (text.length == 0)
+				this.execCommand("mceSetCSSClass", false, "");
+
+			tinyMCE.triggerNodeChange();
+			break;
+
+		default:
+			this.getDoc().execCommand(command, user_interface, value);
+
+			if (tinyMCE.isGecko)
+				window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+			else
+				tinyMCE.triggerNodeChange();
+	}
+
+	// Add undo level after modification
+	if (command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping")
+		tinyMCE.execCommand("mceAddUndoLevel");
+};
+
+TinyMCEControl.prototype.queryCommandValue = function(command) {
+	try {
+		return this.getDoc().queryCommandValue(command);
+	} catch (ex) {
+		return null;
+	}
+};
+
+TinyMCEControl.prototype.queryCommandState = function(command) {
+	return this.getDoc().queryCommandState(command);
+};
+
+TinyMCEControl.prototype.onAdd = function(replace_element, form_element_name, target_document) {
+	var targetDoc = target_document ? target_document : document;
+
+	this.targetDoc = targetDoc;
+
+	tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings['theme'];
+	this.settings['themeurl'] = tinyMCE.themeURL;
+
+	if (!replace_element) {
+		alert("Error: Could not find the target element.");
+		return false;
+	}
+
+	var templateFunction = tinyMCE._getThemeFunction('_getInsertLinkTemplate');
+	if (eval("typeof(" + templateFunction + ")") != 'undefined')
+		this.insertLinkTemplate = eval(templateFunction + '(this.settings);');
+
+	var templateFunction = tinyMCE._getThemeFunction('_getInsertImageTemplate');
+	if (eval("typeof(" + templateFunction + ")") != 'undefined')
+		this.insertImageTemplate = eval(templateFunction + '(this.settings);');
+
+	var templateFunction = tinyMCE._getThemeFunction('_getEditorTemplate');
+	if (eval("typeof(" + templateFunction + ")") == 'undefined') {
+		alert("Error: Could not find the template function: " + templateFunction);
+		return false;
+	}
+
+	var editorTemplate = eval(templateFunction + '(this.settings, this.editorId);');
+
+	var deltaWidth = editorTemplate['delta_width'] ? editorTemplate['delta_width'] : 0;
+	var deltaHeight = editorTemplate['delta_height'] ? editorTemplate['delta_height'] : 0;
+	var html = '<span id="' + this.editorId + '_parent">' + editorTemplate['html'];
+
+	var templateFunction = tinyMCE._getThemeFunction('_handleNodeChange', true);
+	if (eval("typeof(" + templateFunction + ")") != 'undefined')
+		this.settings['handleNodeChangeCallback'] = templateFunction;
+
+	html = tinyMCE.replaceVar(html, "editor_id", this.editorId);
+	this.settings['default_document'] = tinyMCE.baseURL + "/blank.htm";
+
+	this.settings['old_width'] = this.settings['width'];
+	this.settings['old_height'] = this.settings['height'];
+
+	// Set default width, height
+	if (this.settings['width'] == -1)
+		this.settings['width'] = replace_element.offsetWidth;
+
+	if (this.settings['height'] == -1)
+		this.settings['height'] = replace_element.offsetHeight;
+
+	// Try the style width
+	if (this.settings['width'] == 0)
+		this.settings['width'] = replace_element.style.width;
+
+	// Try the style height
+	if (this.settings['height'] == 0)
+		this.settings['height'] = replace_element.style.height; 
+
+	// If no width/height then default to 320x240, better than nothing
+	if (this.settings['width'] == 0)
+		this.settings['width'] = 320;
+
+	if (this.settings['height'] == 0)
+		this.settings['height'] = 240;
+
+	this.settings['area_width'] = parseInt(this.settings['width']);
+	this.settings['area_height'] = parseInt(this.settings['height']);
+	this.settings['area_width'] += deltaWidth;
+	this.settings['area_height'] += deltaHeight;
+
+	// Special % handling
+	if (("" + this.settings['width']).indexOf('%') != -1)
+		this.settings['area_width'] = "100%";
+
+	if (("" + this.settings['height']).indexOf('%') != -1)
+		this.settings['area_height'] = "100%";
+
+	if (("" + replace_element.style.width).indexOf('%') != -1) {
+		this.settings['width'] = replace_element.style.width;
+		this.settings['area_width'] = "100%";
+	}
+
+	if (("" + replace_element.style.height).indexOf('%') != -1) {
+		this.settings['height'] = replace_element.style.height;
+		this.settings['area_height'] = "100%";
+	}
+
+	html = tinyMCE.applyTemplate(html);
+
+	this.settings['width'] = this.settings['old_width'];
+	this.settings['height'] = this.settings['old_height'];
+
+	this.visualAid = this.settings['visual'];
+	this.formTargetElementId = form_element_name;
+
+	// Get replace_element contents
+	if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")
+		this.startContent = replace_element.value;
+	else
+		this.startContent = replace_element.innerHTML;
+
+	// If not text area
+	if (replace_element.nodeName.toLowerCase() != "textarea") {
+		this.oldTargetElement = replace_element.cloneNode(true);
+
+		// Debug mode
+		if (tinyMCE.settings['debug'])
+			html += '<textarea wrap="off" id="' + form_element_name + '" name="' + form_element_name + '" cols="100" rows="15"></textarea>';
+		else
+			html += '<input type="hidden" type="text" id="' + form_element_name + '" name="' + form_element_name + '" />';
+
+		html += '</span>';
+
+		// Output HTML and set editable
+		if (!tinyMCE.isMSIE) {
+			var rng = replace_element.ownerDocument.createRange();
+			rng.setStartBefore(replace_element);
+
+			var fragment = rng.createContextualFragment(html);
+			replace_element.parentNode.replaceChild(fragment, replace_element);
+		} else
+			replace_element.outerHTML = html;
+	} else {
+		html += '</span>';
+
+		// Just hide the textarea element
+		this.oldTargetElement = replace_element;
+
+		if (!tinyMCE.settings['debug'])
+			this.oldTargetElement.style.display = "none";
+
+		// Output HTML and set editable
+		if (!tinyMCE.isMSIE) {
+			var rng = replace_element.ownerDocument.createRange();
+			rng.setStartBefore(replace_element);
+
+			var fragment = rng.createContextualFragment(html);
+
+			if (tinyMCE.isGecko)
+				tinyMCE.insertAfter(fragment, replace_element);
+			else
+				replace_element.parentNode.insertBefore(fragment, replace_element);
+		} else
+			replace_element.insertAdjacentHTML("beforeBegin", html);
+	}
+
+	// Setup iframe
+	var dynamicIFrame = false;
+	var tElm = targetDoc.getElementById(this.editorId);
+
+	if (!tinyMCE.isMSIE) {
+		if (tElm && tElm.nodeName.toLowerCase() == "span") {
+			tElm = tinyMCE._createIFrame(tElm);
+			dynamicIFrame = true;
+		}
+
+		this.targetElement = tElm;
+		this.iframeElement = tElm;
+		this.contentDocument = tElm.contentDocument;
+		this.contentWindow = tElm.contentWindow;
+
+		//this.getDoc().designMode = "on";
+	} else {
+		if (tElm && tElm.nodeName.toLowerCase() == "span")
+			tElm = tinyMCE._createIFrame(tElm);
+		else
+			tElm = targetDoc.frames[this.editorId];
+
+		this.targetElement = tElm;
+		this.iframeElement = targetDoc.getElementById(this.editorId);
+
+		if (tinyMCE.isOpera) {
+			this.contentDocument = this.iframeElement.contentDocument;
+			this.contentWindow = this.iframeElement.contentWindow;
+			dynamicIFrame = true;
+		} else {
+			this.contentDocument = tElm.window.document;
+			this.contentWindow = tElm.window;
+		}
+
+		this.getDoc().designMode = "on";
+	}
+
+	// Setup base HTML
+	var doc = this.contentDocument;
+	if (dynamicIFrame) {
+		var html = tinyMCE.getParam('doctype') + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE.settings['base_href'] + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';
+
+		try {
+			if (!this.isHidden())
+				this.getDoc().designMode = "on";
+
+			doc.open();
+			doc.write(html);
+			doc.close();
+		} catch (e) {
+			// Failed Mozilla 1.3
+			this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";
+		}
+	}
+
+	// This timeout is needed in MSIE 5.5 for some odd reason
+	// it seems that the document.frames isn't initialized yet?
+	if (tinyMCE.isMSIE)
+		window.setTimeout("TinyMCE.prototype.addEventHandlers('" + this.editorId + "');", 1);
+
+	tinyMCE.setupContent(this.editorId, true);
+
+	return true;
+};
+
+TinyMCEControl.prototype.getFocusElement = function() {
+	if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+		var doc = this.getDoc();
+		var rng = doc.selection.createRange();
+
+//		if (rng.collapse)
+//			rng.collapse(true);
+
+		var elm = rng.item ? rng.item(0) : rng.parentElement();
+	} else {
+		if (this.isHidden())
+			return this.getBody();
+
+		var sel = this.getSel();
+		var rng = this.getRng();
+
+		var elm = rng.commonAncestorContainer;
+		//var elm = (sel && sel.anchorNode) ? sel.anchorNode : null;
+
+		// Handle selection a image or other control like element such as anchors
+		if (!rng.collapsed) {
+			// Is selection small
+			if (rng.startContainer == rng.endContainer) {
+				if (rng.startOffset - rng.endOffset < 2) {
+					if (rng.startContainer.hasChildNodes())
+						elm = rng.startContainer.childNodes[rng.startOffset];
+				}
+			}
+		}
+
+		// Get the element parent of the node
+		elm = tinyMCE.getParentElement(elm);
+
+		//if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")
+		//	elm = tinyMCE.selectedElement;
+	}
+
+	return elm;
+};
+
+// Global instances
+var tinyMCE = new TinyMCE();
+var tinyMCELang = new Array();
diff -ruN 1.5.2/wp-includes/js/tinymce/tiny_mce_popup.js 2.0.4/wp-includes/js/tinymce/tiny_mce_popup.js
--- 1.5.2/wp-includes/js/tinymce/tiny_mce_popup.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/tiny_mce_popup.js	2005-11-05 21:30:11.000000000 -0600
@@ -0,0 +1,250 @@
+/**
+ * $RCSfile: tiny_mce_popup.js,v $
+ * $Revision: 1.18 $
+ * $Date: 2005/10/29 19:13:20 $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004, Moxiecode Systems AB, All rights reserved.
+ */
+
+var tinyMCE = null, tinyMCELang = null;
+
+function TinyMCEPopup() {
+};
+
+TinyMCEPopup.prototype.init = function() {
+	var win = window.opener ? window.opener : window.dialogArguments;
+
+	if (!win)
+		win = top;
+
+	window.opener = win;
+	this.windowOpener = win;
+	this.onLoadEval = "";
+
+	// Setup parent references
+	tinyMCE = win.tinyMCE;
+	tinyMCELang = win.tinyMCELang;
+
+	if (!tinyMCE) {
+		alert("tinyMCE object reference not found from popup.");
+		return;
+	}
+
+	this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;
+	this.storeSelection = tinyMCE.isMSIE && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);
+
+	if (this.isWindow)
+		window.focus();
+
+	// Store selection
+	if (this.storeSelection)
+		tinyMCE.selectedInstance.execCommand('mceStoreSelection');
+
+	// Setup dir
+	if (tinyMCELang['lang_dir'])
+		document.dir = tinyMCELang['lang_dir'];
+
+	// Setup title
+	var re = new RegExp('{|\\\$|}', 'g');
+	var title = document.title.replace(re, "");
+	if (typeof tinyMCELang[title] != "undefined") {
+		var divElm = document.createElement("div");
+		divElm.innerHTML = tinyMCELang[title];
+		document.title = divElm.innerHTML;
+
+		if (tinyMCE.setWindowTitle != null)
+			tinyMCE.setWindowTitle(window, divElm.innerHTML);
+	}
+
+	// Output Popup CSS class
+	document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');
+
+	tinyMCE.addEvent(window, "load", this.onLoad);
+};
+
+TinyMCEPopup.prototype.onLoad = function() {
+	var body = document.body;
+
+	body.onkeydown = function (e) {
+		e = e ? e : window.event;
+		if ( e.keyCode == 27 && !e.shiftKey && !e.controlKey && !e.altKey ) {
+			tinyMCEPopup.close();
+		}
+	}
+
+	if (tinyMCE.getWindowArg('mce_replacevariables', true))
+		body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
+
+	var dir = tinyMCE.selectedInstance.settings['directionality'];
+	if (dir == "rtl") {
+		var elms = document.forms[0].elements;
+		for (var i=0; i<elms.length; i++) {
+			if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")
+				elms[i].dir = dir;
+		}
+	}
+
+	if (body.style.display == 'none')
+		body.style.display = 'block';
+
+	// Execute real onload (Opera fix)
+	if (tinyMCEPopup.onLoadEval != "") {
+		eval(tinyMCEPopup.onLoadEval);
+	}
+};
+
+TinyMCEPopup.prototype.executeOnLoad = function(str) {
+	if (tinyMCE.isOpera)
+		this.onLoadEval = str;
+	else
+		eval(str);
+};
+
+TinyMCEPopup.prototype.resizeToInnerSize = function() {
+	// Netscape 7.1 workaround
+	if (this.isWindow && tinyMCE.isNS71) {
+		window.resizeBy(0, 10);
+		return;
+	}
+
+	if (this.isWindow) {
+		var doc = document;
+		var body = doc.body;
+		var oldMargin, wrapper, iframe, nodes, dx, dy;
+
+		if (body.style.display == 'none')
+			body.style.display = 'block';
+
+		// Remove margin
+		oldMargin = body.style.margin;
+		body.style.margin = '0px';
+
+		// Create wrapper
+		wrapper = doc.createElement("div");
+		wrapper.id = 'mcBodyWrapper';
+		wrapper.style.display = 'none';
+		wrapper.style.margin = '0px';
+
+		// Wrap body elements
+		nodes = doc.body.childNodes;
+		for (var i=nodes.length-1; i>=0; i--) {
+			if (wrapper.hasChildNodes())
+				wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);
+			else
+				wrapper.appendChild(nodes[i].cloneNode(true));
+
+			nodes[i].parentNode.removeChild(nodes[i]);
+		}
+
+		// Add wrapper
+		doc.body.appendChild(wrapper);
+
+		// Create iframe
+		iframe = document.createElement("iframe");
+		iframe.id = "mcWinIframe";
+		iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings['default_document'];
+		iframe.width = "100%";
+		iframe.height = "100%";
+		iframe.style.margin = '0px';
+
+		// Add iframe
+		doc.body.appendChild(iframe);
+
+		// Measure iframe
+		iframe = document.getElementById('mcWinIframe');
+		dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;
+		dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;
+
+		// Resize window
+		// tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);
+		window.resizeBy(dx, dy);
+
+		// Hide iframe and show wrapper
+		body.style.margin = oldMargin;
+		iframe.style.display = 'none';
+		wrapper.style.display = 'block';
+	}
+};
+
+TinyMCEPopup.prototype.resizeToContent = function() {
+	var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+	var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
+
+	if (isOpera)
+		return;
+
+	if (isMSIE) {
+		try { window.resizeTo(10, 10); } catch (e) {}
+
+		var elm = document.body;
+		var width = elm.offsetWidth;
+		var height = elm.offsetHeight;
+		var dx = (elm.scrollWidth - width) + 4;
+		var dy = elm.scrollHeight - height;
+
+		try { window.resizeBy(dx, dy); } catch (e) {}
+	} else {
+		window.scrollBy(1000, 1000);
+		if (window.scrollX > 0 || window.scrollY > 0) {
+			window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);
+			window.sizeToContent();
+			window.scrollTo(0, 0);
+			var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
+			var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
+			window.moveTo(x, y);
+		}
+	}
+};
+
+TinyMCEPopup.prototype.getWindowArg = function(name, default_value) {
+	return tinyMCE.getWindowArg(name, default_value);
+};
+
+TinyMCEPopup.prototype.execCommand = function(command, user_interface, value) {
+	var inst = tinyMCE.selectedInstance;
+
+	// Restore selection
+	if (this.storeSelection) {
+		inst.getWin().focus();
+		inst.execCommand('mceRestoreSelection');
+	}
+
+	inst.execCommand(command, user_interface, value);
+
+	// Store selection
+	if (this.storeSelection)
+		inst.execCommand('mceStoreSelection');
+};
+
+TinyMCEPopup.prototype.close = function() {
+	tinyMCE.closeWindow(window);
+};
+
+TinyMCEPopup.prototype.pickColor = function(e, element_id) {
+	tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {
+		element_id : element_id,
+		document : document,
+		window : window,
+		store_selection : false
+	});
+};
+
+TinyMCEPopup.prototype.openBrowser = function(element_id, type, option) {
+	var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
+	var url = document.getElementById(element_id).value;
+
+	tinyMCE.setWindowArg("window", window);
+	tinyMCE.setWindowArg("document", document);
+
+	// Call to external callback
+	if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")
+		alert("Callback function: " + cb + " could not be found.");
+	else
+		eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");
+};
+
+// Setup global instance
+var tinyMCEPopup = new TinyMCEPopup();
+
+tinyMCEPopup.init();
diff -ruN 1.5.2/wp-includes/js/tinymce/utils/form_utils.js 2.0.4/wp-includes/js/tinymce/utils/form_utils.js
--- 1.5.2/wp-includes/js/tinymce/utils/form_utils.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/utils/form_utils.js	2005-11-19 13:15:11.000000000 -0600
@@ -0,0 +1,204 @@
+/**
+ * $RCSfile: form_utils.js,v $
+ * $Revision: 1.5 $
+ * $Date: 2005/10/25 16:01:51 $
+ *
+ * Various form utilitiy functions.
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2005, Moxiecode Systems AB, All rights reserved.
+ */
+
+function getColorPickerHTML(id, target_form_element) {
+	var html = "";
+
+	html += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';
+	html += '<img id="' + id + '" src="../../themes/advanced/images/color.gif"';
+	html += ' onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');"';
+	html += ' onmouseout="tinyMCE.restoreClass(this);"';
+	html += ' onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');"';
+	html += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
+	html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
+
+	return html;
+}
+
+function pickColor(e, target_form_element) {
+	if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")
+		tinyMCEPopup.pickColor(e, target_form_element);
+}
+
+function updateColor(img_id, form_element_id) {
+	document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;
+}
+
+function setBrowserDisabled(id, state) {
+	var img = document.getElementById(id);
+	var lnk = document.getElementById(id + "_link");
+
+	if (lnk) {
+		if (state) {
+			lnk.setAttribute("realhref", lnk.getAttribute("href"));
+			lnk.removeAttribute("href");
+			tinyMCE.switchClass(img, 'mceButtonDisabled', true);
+		} else {
+			lnk.setAttribute("href", lnk.getAttribute("realhref"));
+			tinyMCE.switchClass(img, 'mceButtonNormal', false);
+		}
+	}
+}
+
+function getBrowserHTML(id, target_form_element, type, prefix) {
+	var option = prefix + "_" + type + "_browser_callback";
+	var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
+	if (cb == null)
+		return "";
+
+	var html = "";
+
+	html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';
+	html += '<img id="' + id + '" src="../../themes/advanced/images/browse.gif"';
+	html += ' onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');"';
+	html += ' onmouseout="tinyMCE.restoreClass(this);"';
+	html += ' onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');"';
+	html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
+	html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
+
+	return html;
+}
+
+function openBrower(img_id, target_form_element, type, option) {
+	var img = document.getElementById(img_id);
+
+	if (img.className != "mceButtonDisabled")
+		tinyMCEPopup.openBrowser(target_form_element, type, option);
+}
+
+function selectByValue(form_obj, field_name, value, add_custom) {
+	if (!form_obj || !form_obj.elements[field_name])
+		return;
+
+	var sel = form_obj.elements[field_name];
+
+	var found = false;
+	for (var i=0; i<sel.options.length; i++) {
+		var option = sel.options[i];
+
+		if (option.value == value) {
+			option.selected = true;
+			found = true;
+		} else
+			option.selected = false;
+	}
+
+	if (!found && add_custom && value != '') {
+		var option = new Option('Value: ' + value, value);
+		option.selected = true;
+		sel.options[sel.options.length] = option;
+	}
+
+	return found;
+}
+
+function getSelectValue(form_obj, field_name) {
+	var elm = form_obj.elements[field_name];
+
+	if (elm == null || elm.options == null)
+		return "";
+
+	return elm.options[elm.selectedIndex].value;
+}
+
+function addClassesToList(list_id, specific_option) {
+return;
+	// Setup class droplist
+	var styleSelectElm = document.getElementById(list_id);
+	var styles = tinyMCE.getParam('theme_advanced_styles', false);
+	styles = tinyMCE.getParam(specific_option, styles);
+
+	if (styles) {
+		var stylesAr = styles.split(';');
+
+		for (var i=0; i<stylesAr.length; i++) {
+			if (stylesAr != "") {
+				var key, value;
+
+				key = stylesAr[i].split('=')[0];
+				value = stylesAr[i].split('=')[1];
+
+				styleSelectElm.options[styleSelectElm.length] = new Option(key, value);
+			}
+		}
+	} else {
+		// Use auto impored classes
+		var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));
+		for (var i=0; i<csses.length; i++)
+			styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);
+	}
+}
+
+function isVisible(element_id) {
+	var elm = document.getElementById(element_id);
+
+	return elm && elm.style.display != "none";
+}
+
+function convertRGBToHex(col) {
+	var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+	var rgb = col.replace(re, "$1,$2,$3").split(',');
+	if (rgb.length == 3) {
+		r = parseInt(rgb[0]).toString(16);
+		g = parseInt(rgb[1]).toString(16);
+		b = parseInt(rgb[2]).toString(16);
+
+		r = r.length == 1 ? '0' + r : r;
+		g = g.length == 1 ? '0' + g : g;
+		b = b.length == 1 ? '0' + b : b;
+
+		return "#" + r + g + b;
+	}
+
+	return col;
+}
+
+function convertHexToRGB(col) {
+	if (col.indexOf('#') != -1) {
+		col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+
+		r = parseInt(col.substring(0, 2), 16);
+		g = parseInt(col.substring(2, 4), 16);
+		b = parseInt(col.substring(4, 6), 16);
+
+		return "rgb(" + r + "," + g + "," + b + ")";
+	}
+
+	return col;
+}
+
+function trimSize(size) {
+	return size.replace(new RegExp('[^0-9%]', 'gi'), '');
+}
+
+function getCSSSize(size) {
+	size = trimSize(size);
+
+	if (size == "")
+		return "";
+
+	return size.indexOf('%') != -1 ? size : size + "px";
+}
+
+function getStyle(elm, attrib, style) {
+	var val = tinyMCE.getAttrib(elm, attrib);
+
+	if (val != '')
+		return '' + val;
+
+	if (typeof(style) == 'undefined')
+		style = attrib;
+
+	val = eval('elm.style.' + style);
+
+	return val == null ? '' : '' + val;
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/utils/mctabs.js 2.0.4/wp-includes/js/tinymce/utils/mctabs.js
--- 1.5.2/wp-includes/js/tinymce/utils/mctabs.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/utils/mctabs.js	2005-10-18 11:40:06.000000000 -0500
@@ -0,0 +1,76 @@
+/**
+ * $RCSfile: mctabs.js,v $
+ * $Revision: 1.1 $
+ * $Date: 2005/08/01 18:36:35 $
+ *
+ * Moxiecode DHTML Tabs script.
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004, Moxiecode Systems AB, All rights reserved.
+ */
+
+function MCTabs() {
+	this.settings = new Array();
+};
+
+MCTabs.prototype.init = function(settings) {
+	this.settings = settings;
+};
+
+MCTabs.prototype.getParam = function(name, default_value) {
+	var value = null;
+
+	value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
+
+	// Fix bool values
+	if (value == "true" || value == "false")
+		return (value == "true");
+
+	return value;
+};
+
+MCTabs.prototype.displayTab = function(tab_id, panel_id) {
+	var panelElm = document.getElementById(panel_id);
+	var panelContainerElm = panelElm ? panelElm.parentNode : null;
+	var tabElm = document.getElementById(tab_id);
+	var tabContainerElm = tabElm ? tabElm.parentNode : null;
+	var selectionClass = this.getParam('selection_class', 'current');
+
+	if (tabElm && tabContainerElm) {
+		var nodes = tabContainerElm.childNodes;
+
+		// Hide all other tabs
+		for (var i=0; i<nodes.length; i++) {
+			if (nodes[i].nodeName == "LI")
+				nodes[i].className = '';
+		}
+
+		// Show selected tab
+		tabElm.className = 'current';
+	}
+
+	if (panelElm && panelContainerElm) {
+		var nodes = panelContainerElm.childNodes;
+
+		// Hide all other panels
+		for (var i=0; i<nodes.length; i++) {
+			if (nodes[i].nodeName == "DIV")
+				nodes[i].className = 'panel';
+		}
+
+		// Show selected panel
+		panelElm.className = 'current';
+	}
+};
+
+MCTabs.prototype.getAnchor = function() {
+	var pos, url = document.location.href;
+
+	if ((pos = url.lastIndexOf('#')) != -1)
+		return url.substring(pos + 1);
+
+	return "";
+};
+
+// Global instance
+var mcTabs = new MCTabs();
diff -ruN 1.5.2/wp-includes/js/tinymce/utils/validate.js 2.0.4/wp-includes/js/tinymce/utils/validate.js
--- 1.5.2/wp-includes/js/tinymce/utils/validate.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/utils/validate.js	2005-10-18 11:40:06.000000000 -0500
@@ -0,0 +1,50 @@
+/**
+ * $RCSfile: validate.js,v $
+ * $Revision: 1.2 $
+ * $Date: 2005/08/13 12:20:37 $
+ *
+ * Various form validation methods.
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2005, Moxiecode Systems AB, All rights reserved.
+ */
+
+function testRegExp(form_name, element_name, re) {
+	return new RegExp(re).test(document.forms[form_name].elements[element_name].value);
+}
+
+function validateString(form_name, element_name) {
+	return (document.forms[form_name].elements[element_name].value.length > 0);
+}
+
+function validateSelection(form_name, element_name) {
+	return (document.forms[form_name].elements[element_name].selectedIndex > 0);
+}
+
+function validateCheckBox(form_name, element_name) {
+	return document.forms[form_name].elements[element_name].checked;
+}
+
+function validateCleanString(form_name, element_name) {
+	return testRegExp(form_name, element_name, '^[A-Za-z0-9_]+$');
+}
+
+function validateEmail(form_name, element_name) {
+	return testRegExp(form_name, element_name, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');
+}
+
+function validateAbsUrl(form_name, element_name) {
+	return testRegExp(form_name, element_name, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+$');
+}
+
+function validateNumber(form_name, element_name, allow_blank) {
+	return (!allow_blank && value == '') ? false : testRegExp(form_name, element_name, '^-?[0-9]*\\.?[0-9]*$');
+}
+
+function validateSize(form_name, element_name,) {
+	return testRegExp(form_name, element_name, '^[0-9]+(px|%)?$');
+}
+
+function validateID(form_name, element_name,) {
+	return testRegExp(form_name, element_name, '^[A-Za-z_]([A-Za-z0-9_])*$');
+}
diff -ruN 1.5.2/wp-includes/js/tinymce/wp-mce-help.php 2.0.4/wp-includes/js/tinymce/wp-mce-help.php
--- 1.5.2/wp-includes/js/tinymce/wp-mce-help.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tinymce/wp-mce-help.php	2005-11-19 13:41:21.000000000 -0600
@@ -0,0 +1,172 @@
+<?php
+
+require_once('../../../wp-config.php');
+
+?>
+<!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>
+<title><?php _e('Rich Editor Help') ?></title>
+<link rel="stylesheet" href="<?php echo get_settings('siteurl') ?>/wp-admin/wp-admin.css?version=<?php bloginfo('version'); ?>" type="text/css" />
+<style type="text/css">
+	#wphead {
+		padding-top: 5px;
+		padding-bottom: 5px;
+		padding-left: 15px;
+		font-size: 90%;
+	}
+	#adminmenu {
+		padding-top: 2px;
+		padding-bottom: 2px;
+		padding-left: 15px;
+		font-size: 94%;
+	}
+	#user_info {
+		margin-top: 15px;
+	}
+	h2 {
+		font-size: 2em;
+		border-bottom-width: .5em;
+		margin-top: 12px;
+		margin-bottom: 2px;
+	}
+	h3 {
+		font-size: 1.1em;
+		margin-top: 20px;
+		margin-bottom: 0px;
+	}
+	#flipper {
+		margin: 5px 10px 3px;
+	}
+	#flipper div p {
+		margin-top: 0.4em;
+		margin-bottom: 0.8em;
+		text-align: justify;
+	}
+	th {
+		text-align: center;
+	}
+	.top th {
+		text-decoration: underline;
+	}
+	.top .key {
+		text-align: center;
+		width: 36px;
+	}
+	.top .action {
+		text-align: left;
+	}
+	.align {
+		border-left: 3px double #333;
+		border-right: 3px double #333;
+	}
+	#keys p {
+		display: inline-block;
+		margin: 0px;
+		padding: 0px;
+	}
+	#keys .left { text-align: left; }
+	#keys .center { text-align: center; }
+	#keys .right { text-align: right; }
+	td b {
+		font-family: "Times New Roman" Times serif;
+	}
+	#buttoncontainer {
+		text-align: center;
+	}
+	#buttoncontainer a, #buttoncontainer a:hover {
+		border-bottom: 0px;
+	}
+</style>
+<script type="text/javascript">
+	window.onkeydown = window.onkeypress = function (e) {
+		e = e ? e : window.event;
+		if ( e.keyCode == 27 && !e.shiftKey && !e.controlKey && !e.altKey ) {
+			window.close();
+		}
+	}
+
+	function d(id) { return document.getElementById(id); }
+
+	function flipTab(n) {
+		for (i=1;i<=4;i++) {
+			c = d('content'+i.toString());
+			t = d('tab'+i.toString());
+			if ( n == i ) {
+				c.className = '';	
+				t.className = 'current';
+			} else {
+				c.className = 'hidden';
+				t.className = '';
+			}
+		}
+	}
+</script>
+</head>
+<body>
+<div class="zerosize"></div>
+<div id="wphead"><h1><?php echo get_bloginfo('blogtitle'); ?></h1></div>
+<div id="user_info"><p><strong><?php _e('Rich Editor Help') ?></strong></p></div>
+<ul id="adminmenu">
+	<li><a id="tab1" href="javascript:flipTab(1)" title="<?php _e('Basics of Rich Editing') ?>" accesskey="1" class="current"><?php _e('Basics') ?></a></li>
+	<li><a id="tab2" href="javascript:flipTab(2)" title="<?php _e('Advanced use of the Rich Editor') ?>" accesskey="2"><?php _e('Advanced') ?></a></li>
+	<li><a id="tab3" href="javascript:flipTab(3)" title="<?php _e('Hotkeys') ?>" accesskey="3"><?php _e('Hotkeys') ?></a></li>
+	<li><a id="tab4" href="javascript:flipTab(4)" title="<?php _e('About the software') ?>" accesskey="4"><?php _e('About') ?></a></li>
+</ul>
+
+<div id="flipper" class="wrap">
+
+<div id="content1">
+	<h2><?php _e('Rich Editing Basics') ?></h2>
+	<p><?php _e('<em>Rich editing</em>, also called WYSIWYG for What You See Is What You Get, means your text is formatted as you type. The rich editor creates HTML code behind the scenes while you concentrate on writing. Font styles, links and images all appear just as they will on the internet.') ?></p>
+	<p><?php _e('WordPress includes TinyMCE, a rich editor that works well in most web browsers used today. It is powerful but it has limitations. Pasting text from other word processors may not give the results you expect. If you do not like the way the rich editor works, you may turn it off in the My Profile form, under Users in the admin menu.') ?></p>
+	<p><?php _e('Because HTML code depends on the less-than character (&lt;) to render web pages, this character is reserved for HTML code. If you want a "<" to be visible on your site, you must encode it as "&amp;lt;" without the quotes.') ?></p>
+</div>
+
+<div id="content2" class="hidden">
+	<h2><?php _e('Advanced Rich Editing') ?></h2>
+	<h3><?php _e('Images and Attachments') ?></h3>
+	<p><?php _e('Some (not all) browsers allow you to drag images and other items directly into the editor. Most <a href="http://www.mozilla.org/products/firefox/" title="Mozilla.org, home of the Firefox web browser" target="_blank">Firefox</a> users can drag images from the uploading box (directly below the editor) and see their images instantly, complete with a link. If you cannot do this, use your clipboard Copy and Paste functions to insert the image and link tags. The rich editor will display the images after you have saved the post or used the HTML Editor to refresh the display.') ?></p>
+	<h3><?php _e('HTML in the Rich Editor') ?></h3>
+	<p><?php _e('When you want to include HTML elements that are not generated by the toolbar buttons, you must enter it by hand. Examples are &lt;pre> and &lt;code>. Simply type the code into the editor. If the code is valid and allowed by the editor, you should see it rendered the next time you update the display, usually by saving or using the HTML Editor. If you want to display "&lt;" on the web, you must encode it as "&amp;lt;" in the editor.') ?></p>
+	<h3><?php _e('The HTML Editor') ?></h3>
+	<p><?php _e('The editor will not always understand your intentions as your editing gets more complex. Use the HTML Editor to sort out any rough spots, such as extra elements or attributes. WordPress will strip all empty &lt;p> tags and &lt;br /> tags in favor of simple newline characters. However, it will preserve any tag such as this: &lt;p class="anyclass">&lt;/p>. When using the HTML editor, all less-thans are double-encoded: &amp;amp;lt;. This ensures they display as &amp;lt; in the rich editor and &lt; on the web.') ?></p>
+</div>
+
+<div id="content3" class="hidden">
+	<h2><?php _e('Writing at Full Speed') ?></h2>
+	<p><?php _e('Rather than reaching for your mouse to click on the toolbar, use these access keys. Windows and Linux use Alt+&lt;letter>. Macintosh uses Ctrl+&lt;letter>.') ?></p>
+	<table id="keys" width="100%" border="0">
+		<tr class="top"><th class="key center"><?php _e('Key') ?></th><th class="left"><?php _e('Action') ?></th><th class="key center"><?php _e('Key') ?></th><th class="left"><?php _e('Action') ?></th></tr>
+		<tr><th>b</th><td><strong><?php _e('Bold') ?></strong></td><th>f</th><td class="align left"><?php _e('Align Left') ?></td></tr>
+		<tr><th>i</th><td><em><?php _e('Italic') ?></em></td><th>c</th><td class="align center"><?php _e('Align Center') ?></td></tr>
+		<tr><th>d</th><td><strike><?php _e('Strikethrough') ?></strike></td><th>r</th><td class="align right"><?php _e('Align Right') ?></td></tr>
+		<tr><th>l</th><td><b>&bull;</b> <?php _e('List') ?></td><th>a</th><td><?php _e('Insert <span class="anchor">Anchor</span>') ?></td></tr>
+		<tr><th>o</th><td>1. <?php _e('List') ?></td><th>s</th><td><?php _e('Unlink Anchor') ?></td></tr>
+		<tr><th>q</th><td>&rarr;<?php _e('Quote/Indent') ?></td><th>m</th><td><?php _e('Insert Image') ?></td></tr>
+		<tr><th>w</th><td>&larr;<?php _e('Unquote/Outdent') ?></td><th>t</th><td><?php _e('Insert "More" Tag') ?></td></tr>
+		<tr><th>u</th><td><?php _e('Undo') ?></td><th>e</th><td><?php _e('Edit HTML') ?></td></tr>
+		<tr><th>y</th><td><?php _e('Redo') ?></td><th>h</th><td><?php _e('Open Help') ?></td></tr>
+	</table>
+</div>
+
+<div id="content4" class="hidden">
+	<h2><?php _e('About TinyMCE'); ?></h2>
+	<p><?php printf(__('Version: %s'), '2.0RC4') ?></p>
+	<p><?php printf(__('TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under %sLGPL</a>	by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.'), '<a href="'.get_bloginfo('home').'/wp-includes/js/tinymce/license.txt" target="_blank" title="'.__('GNU Library General Public Licence').'">') ?></p>
+	<p><?php _e('Copyright &copy; 2005, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.') ?></p>
+	<p><?php _e('For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.') ?></p>
+
+	<div id="buttoncontainer">
+		<a href="http://www.moxiecode.com" target="_new"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="<?php _e('Got Moxie?') ?>" border="0" /></a>
+		<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="<?php _e('Hosted By Sourceforge') ?>" border="0" /></a>
+		<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="<?php _e('Also on freshmeat') ?>" border="0" /></a>
+	</div>
+
+</div>
+
+</div>
+
+</body>
+</html>
+
diff -ruN 1.5.2/wp-includes/js/tw-sack.js 2.0.4/wp-includes/js/tw-sack.js
--- 1.5.2/wp-includes/js/tw-sack.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/js/tw-sack.js	2005-08-27 13:48:56.000000000 -0500
@@ -0,0 +1,133 @@
+/* Simple AJAX Code-Kit (SACK) */
+/* 2005 Gregory Wild-Smith */
+/* www.twilightuniverse.com */
+/* Software licenced under a modified X11 licence, see documentation or authors website for more details */
+
+function sack(file){
+	this.AjaxFailedAlert = "Your browser does not support the enhanced functionality of this website, and therefore you will have an experience that differs from the intended one.\n";
+	this.requestFile = file;
+	this.method = "POST";
+	this.URLString = "";
+	this.encodeURIString = true;
+	this.execute = false;
+
+	this.onLoading = function() { };
+	this.onLoaded = function() { };
+	this.onInteractive = function() { };
+	this.onCompletion = function() { };
+
+	this.createAJAX = function() {
+		try {
+			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+		} catch (e) {
+			try {
+				this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+			} catch (err) {
+				this.xmlhttp = null;
+			}
+		}
+		if(!this.xmlhttp && typeof XMLHttpRequest != "undefined")
+			this.xmlhttp = new XMLHttpRequest();
+		if (!this.xmlhttp){
+			this.failed = true; 
+		}
+	};
+	
+	this.setVar = function(name, value){
+		if (this.URLString.length < 3){
+			this.URLString = name + "=" + value;
+		} else {
+			this.URLString += "&" + name + "=" + value;
+		}
+	}
+	
+	this.encVar = function(name, value){
+		var varString = encodeURIComponent(name) + "=" + encodeURIComponent(value);
+	return varString;
+	}
+	
+	this.encodeURLString = function(string){
+		varArray = string.split('&');
+		for (i = 0; i < varArray.length; i++){
+			urlVars = varArray[i].split('=');
+			if (urlVars[0].indexOf('amp;') != -1){
+				urlVars[0] = urlVars[0].substring(4);
+			}
+			varArray[i] = this.encVar(urlVars[0],urlVars[1]);
+		}
+	return varArray.join('&');
+	}
+	
+	this.runResponse = function(){
+		eval(this.response);
+	}
+	
+	this.runAJAX = function(urlstring){
+		this.responseStatus = new Array(2);
+		if(this.failed && this.AjaxFailedAlert){ 
+			alert(this.AjaxFailedAlert); 
+		} else {
+			if (urlstring){ 
+				if (this.URLString.length){
+					this.URLString = this.URLString + "&" + urlstring; 
+				} else {
+					this.URLString = urlstring; 
+				}
+			}
+			if (this.encodeURIString){
+				var timeval = new Date().getTime(); 
+				this.URLString = this.encodeURLString(this.URLString);
+				this.setVar("rndval", timeval);
+			}
+			if (this.element) { this.elementObj = document.getElementById(this.element); }
+			if (this.xmlhttp) {
+				var self = this;
+				if (this.method == "GET") {
+					var totalurlstring = this.requestFile + "?" + this.URLString;
+					this.xmlhttp.open(this.method, totalurlstring, true);
+				} else {
+					this.xmlhttp.open(this.method, this.requestFile, true);
+				}
+				if (this.method == "POST"){
+  					try {
+						this.xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded')  
+					} catch (e) {}
+				}
+
+				this.xmlhttp.send(this.URLString);
+				this.xmlhttp.onreadystatechange = function() {
+					switch (self.xmlhttp.readyState){
+						case 1:
+							self.onLoading();
+						break;
+						case 2:
+							self.onLoaded();
+						break;
+						case 3:
+							self.onInteractive();
+						break;
+						case 4:
+							self.response = self.xmlhttp.responseText;
+							self.responseXML = self.xmlhttp.responseXML;
+							self.responseStatus[0] = self.xmlhttp.status;
+							self.responseStatus[1] = self.xmlhttp.statusText;
+							self.onCompletion();
+							if(self.execute){ self.runResponse(); }
+							if (self.elementObj) {
+								var elemNodeName = self.elementObj.nodeName;
+								elemNodeName.toLowerCase();
+								if (elemNodeName == "input" || elemNodeName == "select" || elemNodeName == "option" || elemNodeName == "textarea"){
+									self.elementObj.value = self.response;
+								} else {
+									self.elementObj.innerHTML = self.response;
+								}
+							}
+							self.URLString = "";
+						break;
+					}
+				};
+			}
+		}
+	};
+this.createAJAX();
+}
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/kses.php 2.0.4/wp-includes/kses.php
--- 1.5.2/wp-includes/kses.php	2005-01-26 16:29:18.000000000 -0600
+++ 2.0.4/wp-includes/kses.php	2006-07-05 17:39:56.000000000 -0500
@@ -1,101 +1,86 @@
 <?php
+
 // Added wp_ prefix to avoid conflicts with existing kses users
-# kses 0.2.1 - HTML/XHTML filter that only allows some elements and attributes
-# Copyright (C) 2002, 2003  Ulf Harnhammar
+# kses 0.2.2 - HTML/XHTML filter that only allows some elements and attributes
+# Copyright (C) 2002, 2003, 2005  Ulf Harnhammar
 # *** CONTACT INFORMATION ***
 #
 # E-mail:      metaur at users dot sourceforge dot net
 # Web page:    http://sourceforge.net/projects/kses
-# Paper mail:  (not at the moment)
+# Paper mail:  Ulf Harnhammar
+#              Ymergatan 17 C
+#              753 25  Uppsala
+#              SWEDEN
 #
 # [kses strips evil scripts!]
 if (!defined('CUSTOM_TAGS'))
 	define('CUSTOM_TAGS', false);
-	
+
 // You can override this in your my-hacks.php file
 if (!CUSTOM_TAGS) {
-$allowedtags = array(
-	'a' => array(
-		'href' => array(),
-		'title' => array()
-		),
-	'abbr' => array('title' => array()),
-	'acronym' => array('title' => array()),
-	'b' => array(),
-	'blockquote' => array('cite' => array()),
-//	'br' => array(),
-	'code' => array(),
-//	'del' => array('datetime' => array()),
-//	'dd' => array(),
-//	'dl' => array(),
-//	'dt' => array(),
-	'em' => array(),
-	'i' => array(),
-//	'ins' => array('datetime' => array(), 'cite' => array()),
-//	'li' => array(),
-//	'ol' => array(),
-//	'p' => array(),
-//	'q' => array(),
-	'strike' => array(),
-	'strong' => array(),
-//	'sub' => array(),
-//	'sup' => array(),
-//	'u' => array(),
-//	'ul' => array(),
+	$allowedposttags = array ('address' => array (), 'a' => array ('href' => array (), 'title' => array (), 'rel' => array (), 'rev' => array (), 'name' => array ()), 'abbr' => array ('title' => array ()), 'acronym' => array ('title' => array ()), 'b' => array (), 'big' => array (), 'blockquote' => array ('cite' => array ()), 'br' => array (), 'button' => array ('disabled' => array (), 'name' => array (), 'type' => array (), 'value' => array ()), 'caption' => array ('align' => array ()), 'code' => array (), 'col' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'span' => array (), 'valign' => array (), 'width' => array ()), 'del' => array ('datetime' => array ()), 'dd' => array (), 'div' => array ('align' => array ()), 'dl' => array (), 'dt' => array (), 'em' => array (), 'fieldset' => array (), 'font' => array ('color' => array (), 'face' => array (), 'size' => array ()), 'form' => array ('action' => array (), 'accept' => array (), 'accept-charset' => array (), 'enctype' => array (), 'method' => array (), 'name' => array (), 'target' => array ()), 'h1' => array ('align' => array ()), 'h2' => array ('align' => array ()), 'h3' => array ('align' => array ()), 'h4' => array ('align' => array ()), 'h5' => array ('align' => array ()), 'h6' => array ('align' => array ()), 'hr' => array ('align' => array (), 'noshade' => array (), 'size' => array (), 'width' => array ()), 'i' => array (), 'img' => array ('alt' => array (), 'align' => array (), 'border' => array (), 'height' => array (), 'hspace' => array (), 'longdesc' => array (), 'vspace' => array (), 'src' => array (), 'width' => array ()), 'ins' => array ('datetime' => array (), 'cite' => array ()), 'kbd' => array (), 'label' => array ('for' => array ()), 'legend' => array ('align' => array ()), 'li' => array (), 'p' => array ('align' => array ()), 'pre' => array ('width' => array ()), 'q' => array ('cite' => array ()), 's' => array (), 'strike' => array (), 'strong' => array (), 'sub' => array (), 'sup' => array (), 'table' => array ('align' => array (), 'bgcolor' => array (), 'border' => array (), 'cellpadding' => array (), 'cellspacing' => array (), 'rules' => array (), 'summary' => array (), 'width' => array ()), 'tbody' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'td' => array ('abbr' => array (), 'align' => array (), 'axis' => array (), 'bgcolor' => array (), 'char' => array (), 'charoff' => array (), 'colspan' => array (), 'headers' => array (), 'height' => array (), 'nowrap' => array (), 'rowspan' => array (), 'scope' => array (), 'valign' => array (), 'width' => array ()), 'textarea' => array ('cols' => array (), 'rows' => array (), 'disabled' => array (), 'name' => array (), 'readonly' => array ()), 'tfoot' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'th' => array ('abbr' => array (), 'align' => array (), 'axis' => array (), 'bgcolor' => array (), 'char' => array (), 'charoff' => array (), 'colspan' => array (), 'headers' => array (), 'height' => array (), 'nowrap' => array (), 'rowspan' => array (), 'scope' => array (), 'valign' => array (), 'width' => array ()), 'thead' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'title' => array (), 'tr' => array ('align' => array (), 'bgcolor' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'tt' => array (), 'u' => array (), 'ul' => array (), 'ol' => array (), 'var' => array () );
+	$allowedtags = array ('a' => array ('href' => array (), 'title' => array ()), 'abbr' => array ('title' => array ()), 'acronym' => array ('title' => array ()), 'b' => array (), 'blockquote' => array ('cite' => array ()),
+		//	'br' => array(),
+	'code' => array (),
+		//	'del' => array('datetime' => array()),
+		//	'dd' => array(),
+		//	'dl' => array(),
+		//	'dt' => array(),
+	'em' => array (), 'i' => array (),
+		//	'ins' => array('datetime' => array(), 'cite' => array()),
+		//	'li' => array(),
+		//	'ol' => array(),
+		//	'p' => array(),
+		//	'q' => array(),
+	'strike' => array (), 'strong' => array (),
+		//	'sub' => array(),
+		//	'sup' => array(),
+		//	'u' => array(),
+		//	'ul' => array(),
 	);
 }
-function wp_kses($string, $allowed_html, $allowed_protocols =
-               array('http', 'https', 'ftp', 'news', 'nntp', 'feed', 'gopher', 'mailto'))
-###############################################################################
-# This function makes sure that only the allowed HTML element names, attribute
-# names and attribute values plus only sane HTML entities will occur in
-# $string. You have to remove any slashes from PHP's magic quotes before you
-# call this function.
-###############################################################################
-{
-  $string = wp_kses_no_null($string);
-  $string = wp_kses_js_entities($string);
-  $string = wp_kses_normalize_entities($string);
-  $string = wp_kses_hook($string);
-  $allowed_html_fixed = wp_kses_array_lc($allowed_html);
-  return wp_kses_split($string, $allowed_html_fixed, $allowed_protocols);
+function wp_kses($string, $allowed_html, $allowed_protocols = array ('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'feed', 'gopher', 'mailto'))
+	###############################################################################
+		# This function makes sure that only the allowed HTML element names, attribute
+		# names and attribute values plus only sane HTML entities will occur in
+		# $string. You have to remove any slashes from PHP's magic quotes before you
+		# call this function.
+		###############################################################################
+	{
+	$string = wp_kses_no_null($string);
+	$string = wp_kses_js_entities($string);
+	$string = wp_kses_normalize_entities($string);
+	$string = wp_kses_hook($string);
+	$allowed_html_fixed = wp_kses_array_lc($allowed_html);
+	return wp_kses_split($string, $allowed_html_fixed, $allowed_protocols);
 } # function wp_kses
 
-
 function wp_kses_hook($string)
 ###############################################################################
 # You add any kses hooks here.
 ###############################################################################
 {
-  return $string;
+	return $string;
 } # function wp_kses_hook
 
-
 function wp_kses_version()
 ###############################################################################
 # This function returns kses' version number.
 ###############################################################################
 {
-  return '0.2.1';
+	return '0.2.2';
 } # function wp_kses_version
 
-
 function wp_kses_split($string, $allowed_html, $allowed_protocols)
 ###############################################################################
 # This function searches for HTML tags, no matter how malformed. It also
 # matches stray ">" characters.
 ###############################################################################
 {
-  return preg_replace('%(<'.   # EITHER: <
-                      '[^>]*'. # things that aren't >
-                      '(>|$)'. # > or end of string
-                      '|>)%e', # OR: just a >
-                      "wp_kses_split2('\\1', \$allowed_html, ".
-                      '$allowed_protocols)',
-                      $string);
+	return preg_replace('%((<!--.*?(-->|$))|(<[^>]*(>|$)|>))%e',
+	"wp_kses_split2('\\1', \$allowed_html, ".'$allowed_protocols)', $string);
 } # function wp_kses_split
 
-
 function wp_kses_split2($string, $allowed_html, $allowed_protocols)
 ###############################################################################
 # This function does a lot of work. It rejects some very malformed things
@@ -104,29 +89,41 @@
 # attribute list.
 ###############################################################################
 {
-  $string = wp_kses_stripslashes($string);
+	$string = wp_kses_stripslashes($string);
 
-  if (substr($string, 0, 1) != '<')
-    return '&gt;';
-    # It matched a ">" character
-
-  if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9]+)([^>]*)>?$%', $string, $matches))
-    return '';
-    # It's seriously malformed
-
-  $slash = trim($matches[1]);
-  $elem = $matches[2];
-  $attrlist = $matches[3];
-
-  if (!is_array($allowed_html[strtolower($elem)]))
-    return '';
-    # They are using a not allowed HTML element
+	if (substr($string, 0, 1) != '<')
+		return '&gt;';
+	# It matched a ">" character
+
+	if (preg_match('%^<!--(.*?)(-->)?$%', $string, $matches)) {
+		$string = str_replace(array('<!--', '-->'), '', $matches[1]);
+		while ( $string != $newstring = wp_kses($string, $allowed_html, $allowed_protocols) )
+			$string = $newstring;
+		if ( $string == '' )
+			return '';
+		return "<!--{$string}-->";
+	}
+	# Allow HTML comments
+
+	if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9]+)([^>]*)>?$%', $string, $matches))
+		return '';
+	# It's seriously malformed
+
+	$slash = trim($matches[1]);
+	$elem = $matches[2];
+	$attrlist = $matches[3];
+
+	if (!@isset($allowed_html[strtolower($elem)]))
+		return '';
+	# They are using a not allowed HTML element
+
+	if ($slash != '')
+		return "<$slash$elem>";
+	# No attributes are allowed for closing elements
 
-  return wp_kses_attr("$slash$elem", $attrlist, $allowed_html,
-                   $allowed_protocols);
+	return wp_kses_attr("$slash$elem", $attrlist, $allowed_html, $allowed_protocols);
 } # function wp_kses_split2
 
-
 function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols)
 ###############################################################################
 # This function removes all attributes, if none are allowed for this element.
@@ -137,58 +134,58 @@
 # it puts one in the returned code as well.
 ###############################################################################
 {
-# Is there a closing XHTML slash at the end of the attributes?
+	# Is there a closing XHTML slash at the end of the attributes?
 
-  $xhtml_slash = '';
-  if (preg_match('%\s/\s*$%', $attr))
-    $xhtml_slash = ' /';
+	$xhtml_slash = '';
+	if (preg_match('%\s/\s*$%', $attr))
+		$xhtml_slash = ' /';
 
-# Are any attributes allowed at all for this element?
+	# Are any attributes allowed at all for this element?
 
-  if (count($allowed_html[strtolower($element)]) == 0)
-    return "<$element$xhtml_slash>";
+	if (@ count($allowed_html[strtolower($element)]) == 0)
+		return "<$element$xhtml_slash>";
 
-# Split it
+	# Split it
 
-  $attrarr = wp_kses_hair($attr, $allowed_protocols);
+	$attrarr = wp_kses_hair($attr, $allowed_protocols);
 
-# Go through $attrarr, and save the allowed attributes for this element
-# in $attr2
+	# Go through $attrarr, and save the allowed attributes for this element
+	# in $attr2
 
-  $attr2 = '';
+	$attr2 = '';
 
-  foreach ($attrarr as $arreach)
-  {
-    $current = $allowed_html[strtolower($element)]
-                            [strtolower($arreach['name'])];
-    if ($current == '')
-      continue; # the attribute is not allowed
+	foreach ($attrarr as $arreach) {
+		if (!@ isset ($allowed_html[strtolower($element)][strtolower($arreach['name'])]))
+			continue; # the attribute is not allowed
 
-    if (!is_array($current))
-      $attr2 .= ' '.$arreach['whole'];
-    # there are no checks
+		$current = $allowed_html[strtolower($element)][strtolower($arreach['name'])];
+		if ($current == '')
+			continue; # the attribute is not allowed
 
-    else
-    {
-    # there are some checks
-      $ok = true;
-      foreach ($current as $currkey => $currval)
-        if (!wp_kses_check_attr_val($arreach['value'], $arreach['vless'],
-                                 $currkey, $currval))
-        { $ok = false; break; }
+		if (!is_array($current))
+			$attr2 .= ' '.$arreach['whole'];
+		# there are no checks
 
-      if ($ok)
-        $attr2 .= ' '.$arreach['whole']; # it passed them
-    } # if !is_array($current)
-  } # foreach
+		else {
+			# there are some checks
+			$ok = true;
+			foreach ($current as $currkey => $currval)
+				if (!wp_kses_check_attr_val($arreach['value'], $arreach['vless'], $currkey, $currval)) {
+					$ok = false;
+					break;
+				}
 
-# Remove any "<" or ">" characters
+			if ($ok)
+				$attr2 .= ' '.$arreach['whole']; # it passed them
+		} # if !is_array($current)
+	} # foreach
 
-  $attr2 = preg_replace('/[<>]/', '', $attr2);
+	# Remove any "<" or ">" characters
 
-  return "<$element$attr2$xhtml_slash>";
-} # function wp_kses_attr
+	$attr2 = preg_replace('/[<>]/', '', $attr2);
 
+	return "<$element$attr2$xhtml_slash>";
+} # function wp_kses_attr
 
 function wp_kses_hair($attr, $allowed_protocols)
 ###############################################################################
@@ -200,121 +197,102 @@
 # from attribute values.
 ###############################################################################
 {
-  $attrarr = array();
-  $mode = 0;
-  $attrname = '';
-
-# Loop through the whole attribute list
-
-  while (strlen($attr) != 0)
-  {
-    $working = 0; # Was the last operation successful?
-
-    switch ($mode)
-    {
-      case 0: # attribute name, href for instance
-
-        if (preg_match('/^([-a-zA-Z]+)/', $attr, $match))
-        {
-          $attrname = $match[1];
-          $working = $mode = 1;
-          $attr = preg_replace('/^[-a-zA-Z]+/', '', $attr);
-        }
-
-        break;
-
-      case 1: # equals sign or valueless ("selected")
-
-        if (preg_match('/^\s*=\s*/', $attr)) # equals sign
-        {
-          $working = 1; $mode = 2;
-          $attr = preg_replace('/^\s*=\s*/', '', $attr);
-          break;
-        }
-
-        if (preg_match('/^\s+/', $attr)) # valueless
-        {
-          $working = 1; $mode = 0;
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => '',
-                         'whole' => $attrname,
-                         'vless' => 'y');
-          $attr = preg_replace('/^\s+/', '', $attr);
-        }
-
-        break;
-
-      case 2: # attribute value, a URL after href= for instance
-
-        if (preg_match('/^"([^"]*)"(\s+|$)/', $attr, $match))
-         # "value"
-        {
-          $thisval = wp_kses_bad_protocol($match[1], $allowed_protocols);
-
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => $thisval,
-                         'whole' => "$attrname=\"$thisval\"",
-                         'vless' => 'n');
-          $working = 1; $mode = 0;
-          $attr = preg_replace('/^"[^"]*"(\s+|$)/', '', $attr);
-          break;
-        }
-
-        if (preg_match("/^'([^']*)'(\s+|$)/", $attr, $match))
-         # 'value'
-        {
-          $thisval = wp_kses_bad_protocol($match[1], $allowed_protocols);
-
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => $thisval,
-                         'whole' => "$attrname='$thisval'",
-                         'vless' => 'n');
-          $working = 1; $mode = 0;
-          $attr = preg_replace("/^'[^']*'(\s+|$)/", '', $attr);
-          break;
-        }
-
-        if (preg_match("%^([^\s\"']+)(\s+|$)%", $attr, $match))
-         # value
-        {
-          $thisval = wp_kses_bad_protocol($match[1], $allowed_protocols);
-
-          $attrarr[] = array
-                        ('name'  => $attrname,
-                         'value' => $thisval,
-                         'whole' => "$attrname=\"$thisval\"",
-                         'vless' => 'n');
-                         # We add quotes to conform to W3C's HTML spec.
-          $working = 1; $mode = 0;
-          $attr = preg_replace("%^[^\s\"']+(\s+|$)%", '', $attr);
-        }
-
-        break;
-    } # switch
-
-    if ($working == 0) # not well formed, remove and try again
-    {
-      $attr = wp_kses_html_error($attr);
-      $mode = 0;
-    }
-  } # while
-
-  if ($mode == 1)
-  # special case, for when the attribute list ends with a valueless
-  # attribute like "selected"
-    $attrarr[] = array
-                  ('name'  => $attrname,
-                   'value' => '',
-                   'whole' => $attrname,
-                   'vless' => 'y');
+	$attrarr = array ();
+	$mode = 0;
+	$attrname = '';
+
+	# Loop through the whole attribute list
+
+	while (strlen($attr) != 0) {
+		$working = 0; # Was the last operation successful?
+
+		switch ($mode) {
+			case 0 : # attribute name, href for instance
+
+				if (preg_match('/^([-a-zA-Z]+)/', $attr, $match)) {
+					$attrname = $match[1];
+					$working = $mode = 1;
+					$attr = preg_replace('/^[-a-zA-Z]+/', '', $attr);
+				}
+
+				break;
+
+			case 1 : # equals sign or valueless ("selected")
+
+				if (preg_match('/^\s*=\s*/', $attr)) # equals sign
+					{
+					$working = 1;
+					$mode = 2;
+					$attr = preg_replace('/^\s*=\s*/', '', $attr);
+					break;
+				}
+
+				if (preg_match('/^\s+/', $attr)) # valueless
+					{
+					$working = 1;
+					$mode = 0;
+					$attrarr[] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');
+					$attr = preg_replace('/^\s+/', '', $attr);
+				}
+
+				break;
+
+			case 2 : # attribute value, a URL after href= for instance
+
+				if (preg_match('/^"([^"]*)"(\s+|$)/', $attr, $match))
+					# "value"
+					{
+					$thisval = wp_kses_bad_protocol($match[1], $allowed_protocols);
+
+					$attrarr[] = array ('name' => $attrname, 'value' => $thisval, 'whole' => "$attrname=\"$thisval\"", 'vless' => 'n');
+					$working = 1;
+					$mode = 0;
+					$attr = preg_replace('/^"[^"]*"(\s+|$)/', '', $attr);
+					break;
+				}
+
+				if (preg_match("/^'([^']*)'(\s+|$)/", $attr, $match))
+					# 'value'
+					{
+					$thisval = wp_kses_bad_protocol($match[1], $allowed_protocols);
+
+					$attrarr[] = array ('name' => $attrname, 'value' => $thisval, 'whole' => "$attrname='$thisval'", 'vless' => 'n');
+					$working = 1;
+					$mode = 0;
+					$attr = preg_replace("/^'[^']*'(\s+|$)/", '', $attr);
+					break;
+				}
+
+				if (preg_match("%^([^\s\"']+)(\s+|$)%", $attr, $match))
+					# value
+					{
+					$thisval = wp_kses_bad_protocol($match[1], $allowed_protocols);
+
+					$attrarr[] = array ('name' => $attrname, 'value' => $thisval, 'whole' => "$attrname=\"$thisval\"", 'vless' => 'n');
+					# We add quotes to conform to W3C's HTML spec.
+					$working = 1;
+					$mode = 0;
+					$attr = preg_replace("%^[^\s\"']+(\s+|$)%", '', $attr);
+				}
+
+				break;
+		} # switch
+
+		if ($working == 0) # not well formed, remove and try again
+			{
+			$attr = wp_kses_html_error($attr);
+			$mode = 0;
+		}
+	} # while
+
+	if ($mode == 1)
+		# special case, for when the attribute list ends with a valueless
+		# attribute like "selected"
+		$attrarr[] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');
 
-  return $attrarr;
+	return $attrarr;
 } # function wp_kses_hair
 
-
 function wp_kses_check_attr_val($value, $vless, $checkname, $checkvalue)
 ###############################################################################
 # This function performs different checks for attribute values. The currently
@@ -322,65 +300,63 @@
 # with even more checks to come soon.
 ###############################################################################
 {
-  $ok = true;
+	$ok = true;
 
-  switch (strtolower($checkname))
-  {
-    case 'maxlen':
-    # The maxlen check makes sure that the attribute value has a length not
-    # greater than the given value. This can be used to avoid Buffer Overflows
-    # in WWW clients and various Internet servers.
-
-      if (strlen($value) > $checkvalue)
-        $ok = false;
-      break;
-
-    case 'minlen':
-    # The minlen check makes sure that the attribute value has a length not
-    # smaller than the given value.
-
-      if (strlen($value) < $checkvalue)
-        $ok = false;
-      break;
-
-    case 'maxval':
-    # The maxval check does two things: it checks that the attribute value is
-    # an integer from 0 and up, without an excessive amount of zeroes or
-    # whitespace (to avoid Buffer Overflows). It also checks that the attribute
-    # value is not greater than the given value.
-    # This check can be used to avoid Denial of Service attacks.
-
-      if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
-        $ok = false;
-      if ($value > $checkvalue)
-        $ok = false;
-      break;
-
-    case 'minval':
-    # The minval check checks that the attribute value is a positive integer,
-    # and that it is not smaller than the given value.
-
-      if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
-        $ok = false;
-      if ($value < $checkvalue)
-        $ok = false;
-      break;
-
-    case 'valueless':
-    # The valueless check checks if the attribute has a value
-    # (like <a href="blah">) or not (<option selected>). If the given value
-    # is a "y" or a "Y", the attribute must not have a value.
-    # If the given value is an "n" or an "N", the attribute must have one.
-
-      if (strtolower($checkvalue) != $vless)
-        $ok = false;
-      break;
-  } # switch
+	switch (strtolower($checkname)) {
+		case 'maxlen' :
+			# The maxlen check makes sure that the attribute value has a length not
+			# greater than the given value. This can be used to avoid Buffer Overflows
+			# in WWW clients and various Internet servers.
+
+			if (strlen($value) > $checkvalue)
+				$ok = false;
+			break;
+
+		case 'minlen' :
+			# The minlen check makes sure that the attribute value has a length not
+			# smaller than the given value.
+
+			if (strlen($value) < $checkvalue)
+				$ok = false;
+			break;
+
+		case 'maxval' :
+			# The maxval check does two things: it checks that the attribute value is
+			# an integer from 0 and up, without an excessive amount of zeroes or
+			# whitespace (to avoid Buffer Overflows). It also checks that the attribute
+			# value is not greater than the given value.
+			# This check can be used to avoid Denial of Service attacks.
+
+			if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
+				$ok = false;
+			if ($value > $checkvalue)
+				$ok = false;
+			break;
+
+		case 'minval' :
+			# The minval check checks that the attribute value is a positive integer,
+			# and that it is not smaller than the given value.
+
+			if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
+				$ok = false;
+			if ($value < $checkvalue)
+				$ok = false;
+			break;
+
+		case 'valueless' :
+			# The valueless check checks if the attribute has a value
+			# (like <a href="blah">) or not (<option selected>). If the given value
+			# is a "y" or a "Y", the attribute must not have a value.
+			# If the given value is an "n" or an "N", the attribute must have one.
+
+			if (strtolower($checkvalue) != $vless)
+				$ok = false;
+			break;
+	} # switch
 
-  return $ok;
+	return $ok;
 } # function wp_kses_check_attr_val
 
-
 function wp_kses_bad_protocol($string, $allowed_protocols)
 ###############################################################################
 # This function removes all non-allowed protocols from the beginning of
@@ -389,31 +365,29 @@
 # fooled by a string like "javascript:javascript:alert(57)".
 ###############################################################################
 {
-  $string = wp_kses_no_null($string);
-  $string2 = $string.'a';
+	$string = wp_kses_no_null($string);
+	$string = preg_replace('/\xad+/', '', $string); # deals with Opera "feature"
+	$string2 = $string.'a';
+
+	while ($string != $string2) {
+		$string2 = $string;
+		$string = wp_kses_bad_protocol_once($string, $allowed_protocols);
+	} # while
 
-  while ($string != $string2)
-  {
-    $string2 = $string;
-    $string = wp_kses_bad_protocol_once($string, $allowed_protocols);
-  } # while
-
-  return $string;
+	return $string;
 } # function wp_kses_bad_protocol
 
-
 function wp_kses_no_null($string)
 ###############################################################################
-# This function removes any NULL or chr(173) characters in $string.
+# This function removes any NULL characters in $string.
 ###############################################################################
 {
-  $string = preg_replace('/\0+/', '', $string);
-  $string = preg_replace('/(\\\\0)+/', '', $string);
+	$string = preg_replace('/\0+/', '', $string);
+	$string = preg_replace('/(\\\\0)+/', '', $string);
 
-  return $string;
+	return $string;
 } # function wp_kses_no_null
 
-
 function wp_kses_stripslashes($string)
 ###############################################################################
 # This function changes the character sequence  \"  to just  "
@@ -421,43 +395,38 @@
 # preg_replace(//e) seems to require this.
 ###############################################################################
 {
-  return preg_replace('%\\\\"%', '"', $string);
+	return preg_replace('%\\\\"%', '"', $string);
 } # function wp_kses_stripslashes
 
-
 function wp_kses_array_lc($inarray)
 ###############################################################################
 # This function goes through an array, and changes the keys to all lower case.
 ###############################################################################
 {
-  $outarray = array();
+	$outarray = array ();
 
-  foreach ($inarray as $inkey => $inval)
-  {
-    $outkey = strtolower($inkey);
-    $outarray[$outkey] = array();
-
-    foreach ($inval as $inkey2 => $inval2)
-    {
-      $outkey2 = strtolower($inkey2);
-      $outarray[$outkey][$outkey2] = $inval2;
-    } # foreach $inval
-  } # foreach $inarray
+	foreach ($inarray as $inkey => $inval) {
+		$outkey = strtolower($inkey);
+		$outarray[$outkey] = array ();
+
+		foreach ($inval as $inkey2 => $inval2) {
+			$outkey2 = strtolower($inkey2);
+			$outarray[$outkey][$outkey2] = $inval2;
+		} # foreach $inval
+	} # foreach $inarray
 
-  return $outarray;
+	return $outarray;
 } # function wp_kses_array_lc
 
-
 function wp_kses_js_entities($string)
 ###############################################################################
 # This function removes the HTML JavaScript entities found in early versions of
 # Netscape 4.
 ###############################################################################
 {
-  return preg_replace('%&\s*\{[^}]*(\}\s*;?|$)%', '', $string);
+	return preg_replace('%&\s*\{[^}]*(\}\s*;?|$)%', '', $string);
 } # function wp_kses_js_entities
 
-
 function wp_kses_html_error($string)
 ###############################################################################
 # This function deals with parsing errors in wp_kses_hair(). The general plan is
@@ -465,82 +434,72 @@
 # quotes and apostrophes as well.
 ###############################################################################
 {
-  return preg_replace('/^("[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*/', '', $string);
+	return preg_replace('/^("[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*/', '', $string);
 } # function wp_kses_html_error
 
-
 function wp_kses_bad_protocol_once($string, $allowed_protocols)
 ###############################################################################
 # This function searches for URL protocols at the beginning of $string, while
 # handling whitespace and HTML entities.
 ###############################################################################
 {
-  return preg_replace('/^((&[^;]*;|[\sA-Za-z0-9])*)'.
-                      '(:|&#58;|&#[Xx]3[Aa];)\s*/e',
-                      'wp_kses_bad_protocol_once2("\\1", $allowed_protocols)',
-                      $string);
+	return preg_replace('/^((&[^;]*;|[\sA-Za-z0-9])*)'.'(:|&#58;|&#[Xx]3[Aa];)\s*/e', 'wp_kses_bad_protocol_once2("\\1", $allowed_protocols)', $string);
 } # function wp_kses_bad_protocol_once
 
-
 function wp_kses_bad_protocol_once2($string, $allowed_protocols)
 ###############################################################################
 # This function processes URL protocols, checks to see if they're in the white-
 # list or not, and returns different data depending on the answer.
 ###############################################################################
 {
-  $string2 = wp_kses_decode_entities($string);
-  $string2 = preg_replace('/\s/', '', $string2);
-  $string2 = wp_kses_no_null($string2);
-  $string2 = strtolower($string2);
-
-  $allowed = false;
-  foreach ($allowed_protocols as $one_protocol)
-    if (strtolower($one_protocol) == $string2)
-    {
-      $allowed = true;
-      break;
-    }
-
-  if ($allowed)
-    return "$string2:";
-  else
-    return '';
+	$string2 = wp_kses_decode_entities($string);
+	$string2 = preg_replace('/\s/', '', $string2);
+	$string2 = wp_kses_no_null($string2);
+	$string2 = preg_replace('/\xad+/', '', $string2);
+	# deals with Opera "feature"
+	$string2 = strtolower($string2);
+
+	$allowed = false;
+	foreach ($allowed_protocols as $one_protocol)
+		if (strtolower($one_protocol) == $string2) {
+			$allowed = true;
+			break;
+		}
+
+	if ($allowed)
+		return "$string2:";
+	else
+		return '';
 } # function wp_kses_bad_protocol_once2
 
-
 function wp_kses_normalize_entities($string)
 ###############################################################################
 # This function normalizes HTML entities. It will convert "AT&T" to the correct
 # "AT&amp;T", "&#00058;" to "&#58;", "&#XYZZY;" to "&amp;#XYZZY;" and so on.
 ###############################################################################
 {
-# Disarm all entities by converting & to &amp;
+	# Disarm all entities by converting & to &amp;
 
-  $string = str_replace('&', '&amp;', $string);
+	$string = str_replace('&', '&amp;', $string);
 
-# Change back the allowed entities in our entity whitelist
+	# Change back the allowed entities in our entity whitelist
 
-  $string = preg_replace('/&amp;([A-Za-z][A-Za-z0-9]{0,19});/',
-                         '&\\1;', $string);
-  $string = preg_replace('/&amp;#0*([0-9]{1,5});/e',
-                         'wp_kses_normalize_entities2("\\1")', $string);
-  $string = preg_replace('/&amp;#([Xx])0*(([0-9A-Fa-f]{2}){1,2});/',
-                         '&#\\1\\2;', $string);
+	$string = preg_replace('/&amp;([A-Za-z][A-Za-z0-9]{0,19});/', '&\\1;', $string);
+	$string = preg_replace('/&amp;#0*([0-9]{1,5});/e', 'wp_kses_normalize_entities2("\\1")', $string);
+	$string = preg_replace('/&amp;#([Xx])0*(([0-9A-Fa-f]{2}){1,2});/', '&#\\1\\2;', $string);
 
-  return $string;
+	return $string;
 } # function wp_kses_normalize_entities
 
-
 function wp_kses_normalize_entities2($i)
 ###############################################################################
 # This function helps wp_kses_normalize_entities() to only accept 16 bit values
 # and nothing more for &#number; entities.
 ###############################################################################
 {
-  return (($i > 65535) ? "&amp;#$i;" : "&#$i;");
+	return (($i > 65535) ? "&amp;#$i;" : "&#$i;");
 } # function wp_kses_normalize_entities2
 
-
 function wp_kses_decode_entities($string)
 ###############################################################################
 # This function decodes numeric HTML entities (&#65; and &#x41;). It doesn't
@@ -548,16 +507,38 @@
 # URL protocol whitelisting system anyway.
 ###############################################################################
 {
-  $string = preg_replace('/&#([0-9]+);/e', 'chr("\\1")', $string);
-  $string = preg_replace('/&#[Xx]([0-9A-Fa-f]+);/e', 'chr(hexdec("\\1"))',
-                         $string);
+	$string = preg_replace('/&#([0-9]+);/e', 'chr("\\1")', $string);
+	$string = preg_replace('/&#[Xx]([0-9A-Fa-f]+);/e', 'chr(hexdec("\\1"))', $string);
 
-  return $string;
+	return $string;
 } # function wp_kses_decode_entities
 
-function wp_filter_kses( $string ) {
+function wp_filter_kses($data) {
 	global $allowedtags;
-	return wp_kses($string, $allowedtags);
+	return wp_kses($data, $allowedtags);
+}
+
+function wp_filter_post_kses($data) {
+	global $allowedposttags;
+	return addslashes ( wp_kses(stripslashes( $data ), $allowedposttags) );
 }
 
-?>
\ No newline at end of file
+function kses_init_filters() {
+		add_filter('pre_comment_author', 'wp_filter_kses');
+		add_filter('pre_comment_content', 'wp_filter_kses');
+		add_filter('content_save_pre', 'wp_filter_post_kses');
+		add_filter('title_save_pre', 'wp_filter_kses');
+}
+
+function kses_init() {
+	remove_filter('pre_comment_author', 'wp_filter_kses');
+	remove_filter('pre_comment_content', 'wp_filter_kses');
+	remove_filter('content_save_pre', 'wp_filter_post_kses');
+	remove_filter('title_save_pre', 'wp_filter_kses');
+
+	if (current_user_can('unfiltered_html') == false)
+		kses_init_filters();
+}
+add_action('init', 'kses_init');
+add_action('set_current_user', 'kses_init');
+?>
diff -ruN 1.5.2/wp-includes/links.php 2.0.4/wp-includes/links.php
--- 1.5.2/wp-includes/links.php	2005-03-31 23:45:26.000000000 -0600
+++ 2.0.4/wp-includes/links.php	2006-05-04 17:25:24.000000000 -0500
@@ -113,7 +113,7 @@
 		if (! isset($show_updated)) $show_updated = 1;
 		if (! isset($echo)) $echo = true;
 
-		get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated, $echo);
+		return get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated, $echo);
 	}
 } // end wp_get_links
 
@@ -125,7 +125,7 @@
  **   before (default '')  - the html to output before the link
  **   after (default '<br />')  - the html to output after the link
  **   between (default ' ')  - the html to output between the link/image
- **     and it's description. Not used if no image or show_images == true
+ **     and its description. Not used if no image or show_images == true
  **   show_images (default true) - whether to show images (if defined).
  **   orderby (default 'id') - the order to output the links. E.g. 'id', 'name',
  **     'url', 'description', or 'rating'. Or maybe owner. If you start the
@@ -138,136 +138,133 @@
  **   limit (default -1) - Limit to X entries. If not specified, all entries
  **     are shown.
  **   show_updated (default 0) - whether to show last updated timestamp
+ **   echo (default true) - whether to echo the results, or return them instead
  */
-function get_links($category = -1, $before = '', $after = '<br />',
-                   $between = ' ', $show_images = true, $orderby = 'name',
-                   $show_description = true, $show_rating = false,
-                   $limit = -1, $show_updated = 1, $echo = true) {
+function get_links($category = -1,
+			$before = '',
+			$after = '<br />',
+			$between = ' ',
+			$show_images = true,
+			$orderby = 'name',
+			$show_description = true,
+			$show_rating = false,
+			$limit = -1,
+			$show_updated = 1,
+			$echo = true) {
 
-    global $wpdb;
+	global $wpdb;
 
-    $direction = ' ASC';
-    $category_query = "";
-    if ($category != -1) {
-        $category_query = " AND link_category = $category ";
-    }
-    if (get_settings('links_recently_updated_time')) {
-        $recently_updated_test = ", IF (DATE_ADD(link_updated, INTERVAL ".get_settings('links_recently_updated_time')." MINUTE) >= NOW(), 1,0) as recently_updated ";
-    } else {
+	$direction = ' ASC';
+	$category_query = '';
+	if ($category != -1) {
+		$category_query = " AND link_category = $category ";
+	}
+	if (get_settings('links_recently_updated_time')) {
+		$recently_updated_test = ", IF (DATE_ADD(link_updated, INTERVAL " . get_settings('links_recently_updated_time') . " MINUTE) >= NOW(), 1,0) as recently_updated ";
+	} else {
 		$recently_updated_test = '';
 	}
-    if ($show_updated) {
-        $get_updated = ", UNIX_TIMESTAMP(link_updated) AS link_updated_f ";
-    }
+	if ($show_updated) {
+		$get_updated = ", UNIX_TIMESTAMP(link_updated) AS link_updated_f ";
+	}
 
-    $orderby=strtolower($orderby);
-    if ($orderby == '')
-        $orderby = 'id';
-    if (substr($orderby,0,1) == '_') {
-        $direction = ' DESC';
-        $orderby = substr($orderby,1);
-    }
+	$orderby = strtolower($orderby);
+	if ($orderby == '')
+		$orderby = 'id';
+	if (substr($orderby, 0, 1) == '_') {
+		$direction = ' DESC';
+		$orderby = substr($orderby, 1);
+	}
 
-    switch($orderby) {
-        case 'length':
-        $length = ",CHAR_LENGTH(link_name) AS length";
-        break;
-        case 'rand':
-            $orderby = 'rand()';
-            break;
-        default:
-            $orderby = " link_" . $orderby;
-    }
+	switch($orderby) {
+		case 'length':
+		$length = ", CHAR_LENGTH(link_name) AS length";
+		break;
+		case 'rand':
+			$orderby = 'rand()';
+			break;
+		default:
+			$orderby = " link_" . $orderby;
+	}
 
-    if (!isset($length)) {
-		$length = "";
+	if (!isset($length)) {
+		$length = '';
 	}
 
-    $sql = "SELECT link_url, link_name, link_image, link_target,
-            link_description, link_rating, link_rel $length $recently_updated_test $get_updated
-            FROM $wpdb->links
-            WHERE link_visible = 'Y' " .
-           $category_query;
-    $sql .= ' ORDER BY ' . $orderby;
-    $sql .= $direction;
-    /* The next 2 lines implement LIMIT TO processing */
-    if ($limit != -1)
-        $sql .= " LIMIT $limit";
-    //echo $sql;
-    $results = $wpdb->get_results($sql);
-    if (!$results) {
-        return;
-    }
-    
-    $output = "";
-    
-    foreach ($results as $row) {
+	$sql = "SELECT link_url, link_name, link_image, link_target, link_description, link_rating, link_rel $length $recently_updated_test $get_updated FROM $wpdb->links WHERE link_visible = 'Y' " . $category_query;
+	$sql .= ' ORDER BY ' . $orderby . $direction;
+	/* The next 2 lines implement LIMIT TO processing */
+	if ($limit != -1)
+		$sql .= " LIMIT $limit";
+	$results = $wpdb->get_results($sql);
+	if (!$results) {
+		return;
+	}
+
+	$output = '';
+
+	foreach ($results as $row) {
 		if (!isset($row->recently_updated)) $row->recently_updated = false;
-        $output .= ($before);
-        
-        if ($show_updated && $row->recently_updated) {
-            $output .= get_settings('links_recently_updated_prepend');
-        }
-        
-        $the_link = '#';
-        
-        if ( !empty($row->link_url) )
-            $the_link = wp_specialchars($row->link_url);
-        $rel = $row->link_rel;
-        
-        if ($rel != '') {
-            $rel = " rel='$rel'";
-        }
-        
-        $desc = wp_specialchars($row->link_description, ENT_QUOTES);
-        $name = wp_specialchars($row->link_name, ENT_QUOTES);
-
-        $title = $desc;
-
-        if ($show_updated) {
-           if (substr($row->link_updated_f,0,2) != '00') {
-                $title .= ' (Last updated ' . date(get_settings('links_updated_date_format'), $row->link_updated_f + (get_settings('gmt_offset') * 3600)) .')';
-            }
-        }
+			$output .= $before;
+		if ($show_updated && $row->recently_updated) {
+			$output .= get_settings('links_recently_updated_prepend');
+		}
 
-        if ('' != $title) {
-            $title = " title='$title'";
-        }
+		$the_link = '#';
+		if (!empty($row->link_url))
+			$the_link = wp_specialchars($row->link_url);
+
+		$rel = $row->link_rel;
+		if ($rel != '') {
+			$rel = ' rel="' . $rel . '"';
+		}
 
-        $alt = " alt='$name'";
-            
-        $target = $row->link_target;
-        if ('' != $target) {
-            $target = " target='$target'";
-        }
-        
-        $output.= "<a href='$the_link'";
-        $output.= $rel . $title . $target;
-        $output.= '>';
-        
-        if (($row->link_image != null) && $show_images) {
+		$desc = wp_specialchars($row->link_description, ENT_QUOTES);
+		$name = wp_specialchars($row->link_name, ENT_QUOTES);
+		$title = $desc;
+
+		if ($show_updated) {
+			if (substr($row->link_updated_f, 0, 2) != '00') {
+				$title .= ' (Last updated ' . date(get_settings('links_updated_date_format'), $row->link_updated_f + (get_settings('gmt_offset') * 3600)) . ')';
+			}
+		}
+
+		if ('' != $title) {
+			$title = ' title="' . $title . '"';
+		}
+
+		$alt = ' alt="' . $name . '"';
+
+		$target = $row->link_target;
+		if ('' != $target) {
+			$target = ' target="' . $target . '"';
+		}
+
+		$output .= '<a href="' . $the_link . '"' . $rel . $title . $target. '>';
+
+		if (($row->link_image != null) && $show_images) {
 			if (strstr($row->link_image, 'http'))
-				$output.= "<img src='$row->link_image' $alt $title />";
+				$output .= "<img src=\"$row->link_image\" $alt $title />";
 			else // If it's a relative path
-            	$output.= "<img src='" . get_settings('siteurl') . "$row->link_image' $alt $title />";
-        } else {
-            $output.= $name;
-        }
-        
-        $output.= '</a>';
-        
-        if ($show_updated && $row->recently_updated) {
-            $output.= get_settings('links_recently_updated_append');
-        }
+				$output .= "<img src=\"" . get_settings('siteurl') . "$row->link_image\" $alt $title />";
+		} else {
+			$output .= $name;
+		}
 
-        if ($show_description && ($desc != '')) {
-            $output.= $between.$desc;
-        }
-        $output.= "$after\n";
-    } // end while
-    
-    if($echo) {
-	    echo $output;
+		$output .= '</a>';
+
+		if ($show_updated && $row->recently_updated) {
+			$output .= get_settings('links_recently_updated_append');
+		}
+
+		if ($show_description && ($desc != '')) {
+			$output .= $between . $desc;
+		}
+		$output .= "$after\n";
+	} // end while
+
+	if ($echo) {
+		echo $output;
 	} else {
 		return $output;
 	}
@@ -448,9 +445,10 @@
  **                uses 0
  */
 function get_linkcatname($id = 0) {
+    $id = (int) $id;
     global $wpdb;
     $cat_name = '';
-    if ('' != $id) {
+    if ( !empty($id) ) {
         $cat_name = $wpdb->get_var("SELECT cat_name FROM $wpdb->linkcategories WHERE cat_id=$id");
     }
     return $cat_name;
@@ -565,4 +563,4 @@
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-includes/pluggable-functions.php 2.0.4/wp-includes/pluggable-functions.php
--- 1.5.2/wp-includes/pluggable-functions.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/wp-includes/pluggable-functions.php	2006-07-27 02:11:46.000000000 -0500
@@ -3,57 +3,158 @@
 	/* These functions can be replaced via plugins.  They are loaded after
 	 plugins are loaded. */
 
+if ( !function_exists('set_current_user') ) :
+function set_current_user($id, $name = '') {
+	return wp_set_current_user($id, $name);
+}
+endif;
+
+if ( !function_exists('wp_set_current_user') ) :
+function wp_set_current_user($id, $name = '') {
+	global $current_user;
+
+	if ( isset($current_user) && ($id == $current_user->ID) )
+		return $current_user;
+
+	$current_user = new WP_User($id, $name);
+
+	setup_userdata($current_user->ID);
+
+	do_action('set_current_user');
+
+	return $current_user;
+}
+endif;
+
+if ( !function_exists('wp_get_current_user') ) :
+function wp_get_current_user() {
+	global $current_user;
+
+	get_currentuserinfo();
+
+	return $current_user;
+}
+endif;
 
 if ( !function_exists('get_currentuserinfo') ) :
 function get_currentuserinfo() {
-	global $user_login, $userdata, $user_level, $user_ID, $user_nickname, $user_email, $user_url, $user_pass_md5, $user_identity;
-	// *** retrieving user's data from cookies and db - no spoofing
+	global $current_user;
+
+	if ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST )
+		return false;
+
+	if ( ! empty($current_user) )
+		return;
+
+	if ( empty($_COOKIE[USER_COOKIE]) || empty($_COOKIE[PASS_COOKIE]) || 
+		!wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true) ) {
+		wp_set_current_user(0);
+		return false;
+	}
 
-	if (isset($_COOKIE['wordpressuser_' . COOKIEHASH])) 
-		$user_login = $_COOKIE['wordpressuser_' . COOKIEHASH];
-	$userdata = get_userdatabylogin($user_login);
-	$user_level = $userdata->user_level;
-	$user_ID = $userdata->ID;
-	$user_nickname = $userdata->user_nickname;
-	$user_email = $userdata->user_email;
-	$user_url = $userdata->user_url;
-	$user_pass_md5 = md5($userdata->user_pass);
-
-	$idmode = $userdata->user_idmode;
-	if ($idmode == 'nickname')  $user_identity = $userdata->user_nickname;
-	if ($idmode == 'login')     $user_identity = $userdata->user_login;
-	if ($idmode == 'firstname') $user_identity = $userdata->user_firstname;
-	if ($idmode == 'lastname')  $user_identity = $userdata->user_lastname;
-	if ($idmode == 'namefl')    $user_identity = $userdata->user_firstname.' '.$userdata->user_lastname;
-	if ($idmode == 'namelf')    $user_identity = $userdata->user_lastname.' '.$userdata->user_firstname;
-	if (!$idmode) $user_identity = $userdata->user_nickname;
+	$user_login = $_COOKIE[USER_COOKIE];
+	wp_set_current_user(0, $user_login);
 }
 endif;
 
 if ( !function_exists('get_userdata') ) :
-function get_userdata($userid) {
-	global $wpdb, $cache_userdata;
-	$userid = (int) $userid;
-	if ( empty($cache_userdata[$userid]) && $userid != 0) {
-		$cache_userdata[$userid] = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID = $userid");
-		$cache_userdata[$cache_userdata[$userid]->user_login] =& $cache_userdata[$userid];
-	} 
+function get_userdata( $user_id ) {
+	global $wpdb;
+	$user_id = (int) $user_id;
+	if ( $user_id == 0 )
+		return false;
+
+	$user = wp_cache_get($user_id, 'users');
+	
+	if ( $user )
+		return $user;
+
+	if ( !$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID = '$user_id' LIMIT 1") )
+		return false;
 
-	return $cache_userdata[$userid];
+	$wpdb->hide_errors();
+	$metavalues = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = '$user_id'");
+	$wpdb->show_errors();
+
+	if ($metavalues) {
+		foreach ( $metavalues as $meta ) {
+			@ $value = unserialize($meta->meta_value);
+			if ($value === FALSE)
+				$value = $meta->meta_value;
+			$user->{$meta->meta_key} = $value;
+
+			// We need to set user_level from meta, not row
+			if ( $wpdb->prefix . 'user_level' == $meta->meta_key )
+				$user->user_level = $meta->meta_value;
+		} // end foreach
+	} //end if
+
+	// For backwards compat.
+	if ( isset($user->first_name) )
+		$user->user_firstname = $user->first_name;
+	if ( isset($user->last_name) )
+		$user->user_lastname = $user->last_name;
+	if ( isset($user->description) )
+		$user->user_description = $user->description;
+		
+	wp_cache_add($user_id, $user, 'users');
+	wp_cache_add($user->user_login, $user, 'userlogins');
+	
+	return $user;
+}
+endif;
+
+if ( !function_exists('update_user_cache') ) :
+function update_user_cache() {
+	return true;
 }
 endif;
 
 if ( !function_exists('get_userdatabylogin') ) :
 function get_userdatabylogin($user_login) {
-	global $cache_userdata, $wpdb;
-	if ( !empty($user_login) && empty($cache_userdata[$user_login]) ) {
-		$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_login = '$user_login'"); /* todo: get rid of this intermediate var */
-		$cache_userdata[$user->ID] = $user;
-		$cache_userdata[$user_login] =& $cache_userdata[$user->ID];
-	} else {
-		$user = $cache_userdata[$user_login];
+	global $wpdb;
+	$user_login = sanitize_user( $user_login );
+
+	if ( empty( $user_login ) )
+		return false;
+		
+	$userdata = wp_cache_get($user_login, 'userlogins');
+	if ( $userdata )
+		return $userdata;
+
+	if ( !$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_login = '$user_login'") )
+		return false;
+
+	$wpdb->hide_errors();
+	$metavalues = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = '$user->ID'");
+	$wpdb->show_errors();
+
+	if ($metavalues) {
+		foreach ( $metavalues as $meta ) {
+			@ $value = unserialize($meta->meta_value);
+			if ($value === FALSE)
+				$value = $meta->meta_value;
+			$user->{$meta->meta_key} = $value;
+
+			// We need to set user_level from meta, not row
+			if ( $wpdb->prefix . 'user_level' == $meta->meta_key )
+				$user->user_level = $meta->meta_value;
+		}
 	}
+
+	// For backwards compat.
+	if ( isset($user->first_name) )
+		$user->user_firstname = $user->first_name;
+	if ( isset($user->last_name) )
+		$user->user_lastname = $user->last_name;
+	if ( isset($user->description) )
+		$user->user_description = $user->description;
+
+	wp_cache_add($user->ID, $user, 'users');
+	wp_cache_add($user->user_login, $user, 'userlogins');
+
 	return $user;
+
 }
 endif;
 
@@ -61,7 +162,7 @@
 function wp_mail($to, $subject, $message, $headers = '') {
 	if( $headers == '' ) {
 		$headers = "MIME-Version: 1.0\n" .
-			"From: " . get_settings('admin_email') . "\n" . 
+			"From: wordpress@" . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])) . "\n" . 
 			"Content-Type: text/plain; charset=\"" . get_settings('blog_charset') . "\"\n";
 	}
 
@@ -73,15 +174,16 @@
 function wp_login($username, $password, $already_md5 = false) {
 	global $wpdb, $error;
 
-	if ( !$username )
+	if ( '' == $username )
 		return false;
 
-	if ( !$password ) {
+	if ( '' == $password ) {
 		$error = __('<strong>Error</strong>: The password field is empty.');
 		return false;
 	}
 
-	$login = $wpdb->get_row("SELECT ID, user_login, user_pass FROM $wpdb->users WHERE user_login = '$username'");
+	$login = get_userdatabylogin($username);
+	//$login = $wpdb->get_row("SELECT ID, user_login, user_pass FROM $wpdb->users WHERE user_login = '$username'");
 
 	if (!$login) {
 		$error = __('<strong>Error</strong>: Wrong username.');
@@ -89,7 +191,7 @@
 	} else {
 		// If the password is already_md5, it has been double hashed.
 		// Otherwise, it is plain text.
-		if ( ($already_md5 && $login->user_login == $username && md5($login->user_pass) == $password) || ($login->user_login == $username && $login->user_pass == md5($password)) ) {
+		if ( ($already_md5 && md5($login->user_pass) == $password) || ($login->user_login == $username && $login->user_pass == md5($password)) ) {
 			return true;
 		} else {
 			$error = __('<strong>Error</strong>: Incorrect password.');
@@ -100,29 +202,70 @@
 }
 endif;
 
+if ( !function_exists('is_user_logged_in') ) :
+function is_user_logged_in() {
+	$user = wp_get_current_user();
+	
+	if ( $user->id == 0 )
+		return false;
+
+	return true;
+}
+endif;
+
 if ( !function_exists('auth_redirect') ) :
 function auth_redirect() {
 	// Checks if a user is logged in, if not redirects them to the login page
-	if ( (!empty($_COOKIE['wordpressuser_' . COOKIEHASH]) && 
-				!wp_login($_COOKIE['wordpressuser_' . COOKIEHASH], $_COOKIE['wordpresspass_' . COOKIEHASH], true)) ||
-			 (empty($_COOKIE['wordpressuser_' . COOKIEHASH])) ) {
-		header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
-		header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-		header('Cache-Control: no-cache, must-revalidate, max-age=0');
-		header('Pragma: no-cache');
+	if ( (!empty($_COOKIE[USER_COOKIE]) && 
+				!wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true)) ||
+			 (empty($_COOKIE[USER_COOKIE])) ) {
+		nocache_headers();
 	
-		header('Location: ' . get_settings('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI']));
+		wp_redirect(get_settings('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI']));
 		exit();
 	}
 }
 endif;
 
+if ( !function_exists('check_admin_referer') ) :
+function check_admin_referer($action = -1) {
+	$adminurl = strtolower(get_settings('siteurl')).'/wp-admin';
+	$referer = strtolower(wp_get_referer());
+	if ( !wp_verify_nonce($_REQUEST['_wpnonce'], $action) &&
+		!(-1 == $action && strstr($referer, $adminurl)) ) {
+		wp_nonce_ays($action);
+		die();
+	}
+	do_action('check_admin_referer', $action);
+}
+endif;
+
+if ( !function_exists('check_ajax_referer') ) :
+function check_ajax_referer() {
+	$cookie = explode('; ', urldecode(empty($_POST['cookie']) ? $_GET['cookie'] : $_POST['cookie'])); // AJAX scripts must pass cookie=document.cookie
+	foreach ( $cookie as $tasty ) {
+		if ( false !== strpos($tasty, USER_COOKIE) )
+			$user = urldecode(substr(strstr($tasty, '='), 1)); // Nasty double encoding
+		if ( false !== strpos($tasty, PASS_COOKIE) )
+			$pass = urldecode(substr(strstr($tasty, '='), 1));
+	}
+	if ( wp_login( $user, $pass, true ) )
+		return true;
+	return false;
+}
+endif;
+
 // Cookie safe redirect.  Works around IIS Set-Cookie bug.
 // http://support.microsoft.com/kb/q176113/
 if ( !function_exists('wp_redirect') ) :
 function wp_redirect($location) {
 	global $is_IIS;
 
+	$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%]|i', '', $location);
+
+	$strip = array('%0d', '%0a');
+	$location = str_replace($strip, '', $location);
+
 	if ($is_IIS)
 		header("Refresh: 0;url=$location");
 	else
@@ -130,8 +273,18 @@
 }
 endif;
 
+if ( !function_exists('wp_get_cookie_login') ):
+function wp_get_cookie_login() {
+	if ( empty($_COOKIE[USER_COOKIE]) || empty($_COOKIE[PASS_COOKIE]) )
+		return false;
+
+	return array('login' => $_COOKIE[USER_COOKIE],	'password' => $_COOKIE[PASS_COOKIE]);
+}
+
+endif;
+
 if ( !function_exists('wp_setcookie') ) :
-function wp_setcookie($username, $password, $already_md5 = false, $home = '', $siteurl = '') {
+function wp_setcookie($username, $password, $already_md5 = false, $home = '', $siteurl = '', $remember = false) {
 	if ( !$already_md5 )
 		$password = md5( md5($password) ); // Double hash the password in the cookie.
 
@@ -148,22 +301,27 @@
 		$cookiehash = md5($siteurl);
 	}
 
-	setcookie('wordpressuser_'. $cookiehash, $username, time() + 31536000, $cookiepath);
-	setcookie('wordpresspass_'. $cookiehash, $password, time() + 31536000, $cookiepath);
+	if ( $remember )
+		$expire = time() + 31536000;
+	else
+		$expire = 0;
+
+	setcookie(USER_COOKIE, $username, $expire, $cookiepath, COOKIE_DOMAIN);
+	setcookie(PASS_COOKIE, $password, $expire, $cookiepath, COOKIE_DOMAIN);
 
 	if ( $cookiepath != $sitecookiepath ) {
-		setcookie('wordpressuser_'. $cookiehash, $username, time() + 31536000, $sitecookiepath);
-		setcookie('wordpresspass_'. $cookiehash, $password, time() + 31536000, $sitecookiepath);
+		setcookie(USER_COOKIE, $username, $expire, $sitecookiepath, COOKIE_DOMAIN);
+		setcookie(PASS_COOKIE, $password, $expire, $sitecookiepath, COOKIE_DOMAIN);
 	}
 }
 endif;
 
 if ( !function_exists('wp_clearcookie') ) :
 function wp_clearcookie() {
-	setcookie('wordpressuser_' . COOKIEHASH, ' ', time() - 31536000, COOKIEPATH);
-	setcookie('wordpresspass_' . COOKIEHASH, ' ', time() - 31536000, COOKIEPATH);
-	setcookie('wordpressuser_' . COOKIEHASH, ' ', time() - 31536000, SITECOOKIEPATH);
-	setcookie('wordpresspass_' . COOKIEHASH, ' ', time() - 31536000, SITECOOKIEPATH);
+	setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
+	setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
+	setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
+	setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
 }
 endif;
 
@@ -171,9 +329,9 @@
 function wp_notify_postauthor($comment_id, $comment_type='') {
 	global $wpdb;
     
-	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1");
-	$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID='$comment->comment_post_ID' LIMIT 1");
-	$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID='$post->post_author' LIMIT 1");
+	$comment = get_comment($comment_id);
+	$post    = get_post($comment->comment_post_ID);
+	$user    = get_userdata( $post->post_author );
 
 	if ('' == $user->user_email) return false; // If there's no email to send the comment to
 
@@ -203,27 +361,36 @@
 		$notify_message  = sprintf( __('New pingback on your post #%1$s "%2$s"'), $comment->comment_post_ID, $post->post_title ) . "\r\n";
 		$notify_message .= sprintf( __('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
 		$notify_message .= sprintf( __('URI    : %s'), $comment->comment_author_url ) . "\r\n";
-		$notify_message .= __('Excerpt: ') . "\r\n" . sprintf( __('[...] %s [...]'), $comment->comment_content ) . "\r\n\r\n";
+		$notify_message .= __('Excerpt: ') . "\r\n" . sprintf('[...] %s [...]', $comment->comment_content ) . "\r\n\r\n";
 		$notify_message .= __('You can see all pingbacks on this post here: ') . "\r\n";
 		$subject = sprintf( __('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title );
 	}
 	$notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
 	$notify_message .= sprintf( __('To delete this comment, visit: %s'), get_settings('siteurl').'/wp-admin/post.php?action=confirmdeletecomment&p='.$comment->comment_post_ID."&comment=$comment_id" ) . "\r\n";
 
-	if ('' == $comment->comment_author_email || '' == $comment->comment_author) {
-		$from = "From: \"$blogname\" <wordpress@" . $_SERVER['SERVER_NAME'] . '>';
-	} else {
-		$from = 'From: "' . $comment->comment_author . "\" <$comment->comment_author_email>";
-	}
+	$wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
 
-	$notify_message = apply_filters('comment_notification_text', $notify_message);
-	$subject = apply_filters('comment_notification_subject', $subject);
-	$message_headers = apply_filters('comment_notification_headers', $message_headers);
+	if ( '' == $comment->comment_author ) {
+		$from = "From: \"$blogname\" <$wp_email>";
+		if ( '' != $comment->comment_author_email )
+			$reply_to = "Reply-To: $comment->comment_author_email";
+ 	} else {
+		$from = "From: \"$comment->comment_author\" <$wp_email>";
+		if ( '' != $comment->comment_author_email )
+			$reply_to = "Reply-To: \"$comment->comment_author_email\" <$comment->comment_author_email>";
+ 	}
 
 	$message_headers = "MIME-Version: 1.0\n"
 		. "$from\n"
 		. "Content-Type: text/plain; charset=\"" . get_settings('blog_charset') . "\"\n";
 
+	if ( isset($reply_to) )
+		$message_headers .= $reply_to . "\n";
+
+	$notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
+	$subject = apply_filters('comment_notification_subject', $subject, $comment_id);
+	$message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
+
 	@wp_mail($user->user_email, $subject, $notify_message, $message_headers);
    
 	return true;
@@ -261,10 +428,10 @@
 	$notify_message .= get_settings('siteurl') . "/wp-admin/moderation.php\r\n";
 
 	$subject = sprintf( __('[%1$s] Please moderate: "%2$s"'), get_settings('blogname'), $post->post_title );
-	$admin_email = get_settings("admin_email");
+	$admin_email = get_settings('admin_email');
 
-	$notify_message = apply_filters('comment_moderation_text', $notify_message);
-	$subject = apply_filters('comment_moderation_subject', $subject);
+	$notify_message = apply_filters('comment_moderation_text', $notify_message, $comment_id);
+	$subject = apply_filters('comment_moderation_subject', $subject, $comment_id);
 
 	@wp_mail($admin_email, $subject, $notify_message);
     
@@ -272,4 +439,76 @@
 }
 endif;
 
-?>
\ No newline at end of file
+if ( !function_exists('wp_new_user_notification') ) :
+function wp_new_user_notification($user_id, $plaintext_pass = '') {
+	$user = new WP_User($user_id);
+	
+	$user_login = stripslashes($user->user_login);
+	$user_email = stripslashes($user->user_email);
+	
+	$message  = sprintf(__('New user registration on your blog %s:'), get_settings('blogname')) . "\r\n\r\n";
+	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
+	$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
+	
+	@wp_mail(get_settings('admin_email'), sprintf(__('[%s] New User Registration'), get_settings('blogname')), $message);
+
+	if ( empty($plaintext_pass) )
+		return;
+
+	$message  = sprintf(__('Username: %s'), $user_login) . "\r\n";
+	$message .= sprintf(__('Password: %s'), $plaintext_pass) . "\r\n";
+	$message .= get_settings('siteurl') . "/wp-login.php\r\n";
+		
+	wp_mail($user_email, sprintf(__('[%s] Your username and password'), get_settings('blogname')), $message);
+	
+}
+endif;
+
+if ( !function_exists('wp_verify_nonce') ) :
+function wp_verify_nonce($nonce, $action = -1) {
+	$user = wp_get_current_user();
+	$uid = $user->id;
+
+	$i = ceil(time() / 43200);
+
+	//Allow for expanding range, but only do one check if we can
+	if( substr(wp_hash($i . $action . $uid), -12, 10) == $nonce || substr(wp_hash(($i - 1) . $action . $uid), -12, 10) == $nonce )
+		return true;
+	return false;
+}
+endif;
+
+if ( !function_exists('wp_create_nonce') ) :
+function wp_create_nonce($action = -1) {
+	$user = wp_get_current_user();
+	$uid = $user->id;
+
+	$i = ceil(time() / 43200);
+	
+	return substr(wp_hash($i . $action . $uid), -12, 10);
+}
+endif;
+
+if ( !function_exists('wp_salt') ) :
+function wp_salt() {
+	$salt = get_option('secret');
+	if ( empty($salt) )
+		$salt = DB_PASSWORD . DB_USER . DB_NAME . DB_HOST . ABSPATH;
+
+	return $salt;
+}
+endif;
+
+if ( !function_exists('wp_hash') ) :
+function wp_hash($data) {
+	$salt = wp_salt();
+
+	if ( function_exists('hash_hmac') ) {
+		return hash_hmac('md5', $data, $salt);
+	} else {
+		return md5($data . $salt);
+	}
+}
+endif;
+
+?>
diff -ruN 1.5.2/wp-includes/registration-functions.php 2.0.4/wp-includes/registration-functions.php
--- 1.5.2/wp-includes/registration-functions.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/registration-functions.php	2006-05-26 17:49:31.000000000 -0500
@@ -0,0 +1,170 @@
+<?php
+
+function username_exists( $username ) {
+	global $wpdb;
+	$username = sanitize_user( $username );
+	$user = get_userdatabylogin($username);
+	if ( $user )
+		return $user->ID;
+
+	return null;
+}
+
+function validate_username( $username ) {
+	$name = sanitize_user($username, true);
+	$valid = true;
+
+	if ( $name != $username )
+		$valid = false;	
+
+	return apply_filters('validate_username', $valid, $username);	
+}
+
+function wp_insert_user($userdata) {
+	global $wpdb;
+
+	extract($userdata);
+
+	// Are we updating or creating?
+	if ( !empty($ID) ) {
+		$ID = (int) $ID;
+		$update = true;
+	} else {
+		$update = false;
+		// Password is not hashed when creating new user.
+		$user_pass = md5($user_pass);
+	}
+	
+	$user_login = sanitize_user($user_login, true);
+	$user_login = apply_filters('pre_user_login', $user_login);
+
+	if ( empty($user_nicename) )
+		$user_nicename = sanitize_title( $user_login );
+	$user_nicename = apply_filters('pre_user_nicename', $user_nicename);
+
+	if ( empty($user_url) )
+		$user_url = '';
+	$user_url = apply_filters('pre_user_url', $user_url);
+
+	if ( empty($user_email) )
+		$user_email = '';
+	$user_email = apply_filters('pre_user_email', $user_email);
+
+	if ( empty($display_name) )
+		$display_name = $user_login;
+	$display_name = apply_filters('pre_user_display_name', $display_name);
+
+	if ( empty($nickname) )
+		$nickname = $user_login;
+	$nickname = apply_filters('pre_user_nickname', $nickname);
+
+	if ( empty($first_name) )
+		$first_name = '';
+	$first_name = apply_filters('pre_user_first_name', $first_name);
+
+	if ( empty($last_name) )
+		$last_name = '';
+	$last_name = apply_filters('pre_user_last_name', $last_name);
+
+	if ( empty($description) )
+		$description = '';
+	$description = apply_filters('pre_user_description', $description);
+
+	if ( empty($user_registered) )
+		$user_registered = gmdate('Y-m-d H:i:s');
+
+	if ( $update ) {
+		$query = "UPDATE $wpdb->users SET user_pass='$user_pass', user_email='$user_email', user_url='$user_url', user_nicename = '$user_nicename', display_name = '$display_name' WHERE ID = '$ID'";
+		$query = apply_filters('update_user_query', $query);
+		$wpdb->query( $query );
+		$user_id = $ID;
+	} else {
+		$query = "INSERT INTO $wpdb->users 
+		(user_login, user_pass, user_email, user_url, user_registered, user_nicename, display_name)
+	VALUES 
+		('$user_login', '$user_pass', '$user_email', '$user_url', '$user_registered', '$user_nicename', '$display_name')";
+		$query = apply_filters('create_user_query', $query);
+		$wpdb->query( $query );
+		$user_id = $wpdb->insert_id;
+	}
+	
+	update_usermeta( $user_id, 'first_name', $first_name);
+	update_usermeta( $user_id, 'last_name', $last_name);
+	update_usermeta( $user_id, 'nickname', $nickname );
+	update_usermeta( $user_id, 'description', $description );
+	update_usermeta( $user_id, 'jabber', $jabber );
+	update_usermeta( $user_id, 'aim', $aim );
+	update_usermeta( $user_id, 'yim', $yim );
+
+	if ($update && !empty($role)) {
+		$user = new WP_User($user_id);
+		$user->set_role($role);
+	}
+
+	if ( !$update ) {
+		$user = new WP_User($user_id);
+		$user->set_role(get_settings('default_role'));
+	}
+
+	wp_cache_delete($user_id, 'users');
+	wp_cache_delete($user_login, 'userlogins');
+	
+	if ( $update )
+		do_action('profile_update', $user_id);
+	else
+		do_action('user_register', $user_id);
+		
+	return $user_id;	
+}
+
+function wp_update_user($userdata) {
+	global $wpdb;
+
+	$ID = (int) $userdata['ID'];
+	
+	// First, get all of the original fields
+	$user = get_userdata($ID);	
+
+	// Escape data pulled from DB.
+	$user = add_magic_quotes(get_object_vars($user));
+
+	// If password is changing, hash it now.
+	if ( ! empty($userdata['user_pass']) ) {
+		$plaintext_pass = $userdata['user_pass'];
+		$userdata['user_pass'] = md5($userdata['user_pass']);
+	}
+
+	// Merge old and new fields with new fields overwriting old ones.
+	$userdata = array_merge($user, $userdata);
+	$user_id = wp_insert_user($userdata);
+
+	// Update the cookies if the password changed.	
+	$current_user = wp_get_current_user();
+	if( $current_user->id == $ID ) {
+		if ( isset($plaintext_pass) ) {
+			wp_clearcookie();
+			wp_setcookie($userdata['user_login'], $plaintext_pass);
+		}
+	}
+	
+	return $user_id;
+}
+
+function wp_create_user( $username, $password, $email = '') {
+	global $wpdb;
+	
+	$user_login = $wpdb->escape( $username );
+	$user_email = $wpdb->escape( $email );
+	$user_pass = $password;
+
+	$userdata = compact('user_login', 'user_email', 'user_pass');
+	return wp_insert_user($userdata);
+}
+
+
+function create_user( $username, $password, $email ) {
+	return wp_create_user( $username, $password, $email );	
+}
+
+
+?>
diff -ruN 1.5.2/wp-includes/rss-functions.php 2.0.4/wp-includes/rss-functions.php
--- 1.5.2/wp-includes/rss-functions.php	2005-02-01 03:52:36.000000000 -0600
+++ 2.0.4/wp-includes/rss-functions.php	2005-11-14 04:21:39.000000000 -0600
@@ -39,20 +39,13 @@
 		
 		# if PHP xml isn't compiled in, die
 		#
-		if (!function_exists('xml_parser_create')) {
-			$this->error( "Failed to load PHP's XML Extension. " . 
-						  "http://www.php.net/manual/en/ref.xml.php",
-						   E_USER_ERROR );
-		}
+		if ( !function_exists('xml_parser_create') )
+			trigger_error( "Failed to load PHP's XML Extension. http://www.php.net/manual/en/ref.xml.php" );
 		
 		$parser = @xml_parser_create();
 		
-		if (!is_resource($parser))
-		{
-			$this->error( "Failed to create an instance of PHP's XML parser. " .
-						  "http://www.php.net/manual/en/ref.xml.php",
-						  E_USER_ERROR );
-		}
+		if ( !is_resource($parser) )
+			trigger_error( "Failed to create an instance of PHP's XML parser. http://www.php.net/manual/en/ref.xml.php");
 
 		
 		$this->parser = $parser;
@@ -363,9 +356,22 @@
 		}
 	}
 
-function map_attrs($k, $v) {
-	return "$k=\"$v\"";
+	function map_attrs($k, $v) {
+		return "$k=\"$v\"";
 	}
+
+	function error( $errormsg, $lvl = E_USER_WARNING ) {
+		// append PHP's error message if track_errors enabled
+		if ( isset($php_errormsg) ) {
+			$errormsg .= " ($php_errormsg)";
+		}
+		if ( MAGPIE_DEBUG ) {
+			trigger_error( $errormsg, $lvl);
+		} else {
+			error_log( $errormsg, 0);
+		}
+	}
+
 }
 require_once( dirname(__FILE__) . '/class-snoopy.php');
 
@@ -374,7 +380,7 @@
 	init();
 	
 	if ( !isset($url) ) {
-		error("fetch_rss called without a url");
+		// error("fetch_rss called without a url");
 		return false;
 	}
 	
@@ -386,7 +392,7 @@
 			return _response_to_rss( $resp );
 		}
 		else {
-			error("Failed to fetch $url and cache is off");
+			// error("Failed to fetch $url and cache is off");
 			return false;
 		}
 	} 
@@ -489,7 +495,7 @@
 		}
 		
 		// else we totally failed
-		error( $errormsg );	
+		// error( $errormsg );	
 		
 		return false;
 		
@@ -545,7 +551,7 @@
 		if ($rss) {
 			$errormsg .= " (" . $rss->ERROR . ")";
 		}
-		error($errormsg);
+		// error($errormsg);
 		
 		return false;
 	} // end if ($rss and !$rss->error)
diff -ruN 1.5.2/wp-includes/streams.php 2.0.4/wp-includes/streams.php
--- 1.5.2/wp-includes/streams.php	2005-04-19 21:46:48.000000000 -0500
+++ 2.0.4/wp-includes/streams.php	2006-07-06 17:36:44.000000000 -0500
@@ -105,7 +105,14 @@
   function read($bytes) {
     if ($bytes) {
       fseek($this->_fd, $this->_pos);
-      $data = fread($this->_fd, $bytes);
+
+      // 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;
diff -ruN 1.5.2/wp-includes/template-functions-author.php 2.0.4/wp-includes/template-functions-author.php
--- 1.5.2/wp-includes/template-functions-author.php	2005-03-13 19:09:49.000000000 -0600
+++ 2.0.4/wp-includes/template-functions-author.php	2006-07-28 05:50:21.000000000 -0500
@@ -1,66 +1,65 @@
 <?php
+
 function get_the_author($idmode = '') {
-    global $authordata;
-    if (empty($idmode)) {
-        $idmode = $authordata->user_idmode;
-    }
-
-    if ($idmode == 'nickname')    $id = $authordata->user_nickname;
-    if ($idmode == 'login')    $id = $authordata->user_login;
-    if ($idmode == 'firstname')    $id = $authordata->user_firstname;
-    if ($idmode == 'lastname')    $id = $authordata->user_lastname;
-    if ($idmode == 'namefl')    $id = $authordata->user_firstname.' '.$authordata->user_lastname;
-    if ($idmode == 'namelf')    $id = $authordata->user_lastname.' '.$authordata->user_firstname;
-    if (!$idmode) $id = $authordata->user_nickname;
-    
-    return $id;
+	global $authordata;
+	return apply_filters('the_author', $authordata->display_name);
 }
+
 function the_author($idmode = '', $echo = true) {
-	if ($echo) echo get_the_author($idmode);
+	if ( $echo )
+		echo get_the_author($idmode);
 	return get_the_author($idmode);
 }
 
 function get_the_author_description() {
-    global $authordata;
-    return $authordata->user_description;
+	global $authordata;
+	return $authordata->description;
 }
 function the_author_description() {
-    echo get_the_author_description();
+	echo get_the_author_description();
 }
 
 function get_the_author_login() {
-    global $id,$authordata;    return $authordata->user_login;
+	global $authordata;
+	return $authordata->user_login;
 }
+
 function the_author_login() {
-    echo get_the_author_login();
+	echo get_the_author_login();
 }
 
 function get_the_author_firstname() {
-    global $id,$authordata;    return $authordata->user_firstname;
+	global $authordata;
+	return $authordata->first_name;
 }
 function the_author_firstname() {
-    echo get_the_author_firstname();
+	echo get_the_author_firstname();
 }
 
 function get_the_author_lastname() {
-    global $id,$authordata;    return $authordata->user_lastname;
+	global $authordata;
+	return $authordata->last_name;
 }
+
 function the_author_lastname() {
-    echo get_the_author_lastname();
+	echo get_the_author_lastname();
 }
 
 function get_the_author_nickname() {
-    global $id,$authordata;    return $authordata->user_nickname;
+	global $authordata;
+	return $authordata->nickname;
 }
+
 function the_author_nickname() {
-    echo get_the_author_nickname();
+	echo get_the_author_nickname();
 }
 
 function get_the_author_ID() {
-    global $id,$authordata;    return $authordata->ID;
+	global $authordata;
+	return $authordata->ID;
 }
 function the_author_ID() {
-    echo get_the_author_id();
+	echo get_the_author_id();
 }
 
 function get_the_author_email() {
@@ -73,146 +72,166 @@
 }
 
 function get_the_author_url() {
-    global $id,$authordata;    return $authordata->user_url;
+	global $authordata;
+	return $authordata->user_url;
 }
+
 function the_author_url() {
-    echo get_the_author_url();
+	echo get_the_author_url();
 }
 
 function get_the_author_icq() {
-    global $id,$authordata;    return $authordata->user_icq;
+	global $authordata;
+	return $authordata->icq;
 }
+
 function the_author_icq() {
-    echo get_the_author_icq();
+	echo get_the_author_icq();
 }
 
 function get_the_author_aim() {
-    global $id,$authordata;    return str_replace(' ', '+', $authordata->user_aim);
+	global $authordata;
+	return str_replace(' ', '+', $authordata->aim);
 }
+
 function the_author_aim() {
-    echo get_the_author_aim();
+	echo get_the_author_aim();
 }
 
 function get_the_author_yim() {
-    global $id,$authordata;    return $authordata->user_yim;
+	global $authordata;
+	return $authordata->yim;
 }
+
 function the_author_yim() {
-    echo get_the_author_yim();
+	echo get_the_author_yim();
 }
 
 function get_the_author_msn() {
-    global $id,$authordata;    return $authordata->user_msn;
+	global $authordata;
+	return $authordata->msn;
 }
+
 function the_author_msn() {
-    echo get_the_author_msn();
+	echo get_the_author_msn();
 }
 
 function get_the_author_posts() {
-    global $id,$post;    $posts=get_usernumposts($post->post_author);    return $posts;
+	global $post;
+	$posts = get_usernumposts($post->post_author);
+	return $posts;
 }
+
 function the_author_posts() {
-    echo get_the_author_posts();
+	echo get_the_author_posts();
 }
 
 /* the_author_posts_link() requires no get_, use get_author_link() */
 function the_author_posts_link($idmode='') {
-    global $id, $authordata;
+	global $authordata;
 
-    echo '<a href="' . get_author_link(0, $authordata->ID, $authordata->user_nicename) . '" title="' . sprintf(__("Posts by %s"), wp_specialchars(the_author($idmode, false))) . '">' . the_author($idmode, false) . '</a>';
+	echo '<a href="' . get_author_link(0, $authordata->ID, $authordata->user_nicename) . '" title="' . sprintf(__("Posts by %s"), wp_specialchars(the_author($idmode, false))) . '">' . the_author($idmode, false) . '</a>';
 }
 
-
-function get_author_link($echo = false, $author_id, $author_nicename) {
+function get_author_link($echo = false, $author_id, $author_nicename = '') {
 	global $wpdb, $wp_rewrite, $post, $cache_userdata;
-    $auth_ID = $author_id;
-    $link = $wp_rewrite->get_author_permastruct();
-    
-    if (empty($link)) {
-        $file = get_settings('home') . '/';
-        $link = $file . '?author=' . $auth_ID;
-    } else {
-        if ('' == $author_nicename) $author_nicename = $cache_userdata[$author_id]->author_nicename;
-				$link = str_replace('%author%', $author_nicename, $link);
-				$link = get_settings('home') . trailingslashit($link);
-    }
-
-		$link = apply_filters('author_link', $link, $author_id, $author_nicename);
-    if ($echo) echo $link;
-    return $link;
+	$auth_ID = $author_id;
+	$link = $wp_rewrite->get_author_permastruct();
+
+	if ( empty($link) ) {
+		$file = get_settings('home') . '/';
+		$link = $file . '?author=' . $auth_ID;
+	} else {
+		if ( '' == $author_nicename ) {
+			$user = get_userdata($author_id);
+			if ( !empty($user->user_nicename) )
+				$author_nicename = $user->user_nicename;
+		}
+		$link = str_replace('%author%', $author_nicename, $link);
+		$link = get_settings('home') . trailingslashit($link);
+	}
+
+	$link = apply_filters('author_link', $link, $author_id, $author_nicename);
+
+	if ( $echo )
+		echo $link;
+	return $link;
 }
 
 function wp_list_authors($args = '') {
 	parse_str($args, $r);
-	if (!isset($r['optioncount'])) $r['optioncount'] = false;
-    if (!isset($r['exclude_admin'])) $r['exclude_admin'] = true;
-    if (!isset($r['show_fullname'])) $r['show_fullname'] = false;
-	if (!isset($r['hide_empty'])) $r['hide_empty'] = true;
-    if (!isset($r['feed'])) $r['feed'] = '';
-    if (!isset($r['feed_image'])) $r['feed_image'] = '';
+
+	if ( !isset($r['optioncount']) )
+		$r['optioncount'] = false;
+	if ( !isset($r['exclude_admin']) )
+		$r['exclude_admin'] = true;
+	if ( !isset($r['show_fullname']) )
+		$r['show_fullname'] = false;
+	if ( !isset($r['hide_empty']) )
+		$r['hide_empty'] = true;
+	if ( !isset($r['feed']) )
+		$r['feed'] = '';
+	if ( !isset($r['feed_image']) )
+		$r['feed_image'] = '';
 
 	list_authors($r['optioncount'], $r['exclude_admin'], $r['show_fullname'], $r['hide_empty'], $r['feed'], $r['feed_image']);
 }
 
 function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') {
-    global $wpdb;
-
-    $query = "SELECT ID, user_nickname, user_firstname, user_lastname, user_nicename from $wpdb->users " . ($exclude_admin ? "WHERE user_login <> 'admin' " : '') . "ORDER BY user_nickname";
-    $authors = $wpdb->get_results($query);
-
-    foreach($authors as $author) {
-        $posts = get_usernumposts($author->ID);
-        $name = $author->user_nickname;
-
-        if ($show_fullname && ($author->user_firstname != '' && $author->user_lastname != '')) {
-            $name = "$author->user_firstname $author->user_lastname";
-        }
-        
-        if (! ($posts == 0 && $hide_empty)) echo "<li>";
-        if ($posts == 0) {
-            if ( !$hide_empty )
+	global $wpdb;
+	$query = "SELECT ID, user_nicename from $wpdb->users " . ($exclude_admin ? "WHERE user_login <> 'admin' " : '') . "ORDER BY display_name";
+	$authors = $wpdb->get_results($query);
+
+	foreach ( $authors as $author ) {
+		$author = get_userdata( $author->ID );
+		$posts = get_usernumposts($author->ID);
+		$name = $author->nickname;
+
+		if ( $show_fullname && ($author->first_name != '' && $author->last_name != '') )
+			$name = "$author->first_name $author->last_name";
+
+		if ( !($posts == 0 && $hide_empty) )
+			echo "<li>";
+		if ( $posts == 0 ) {
+			if ( !$hide_empty )
 				$link = $name;
-        } else {
-            $link = '<a href="' . get_author_link(0, $author->ID, $author->user_nicename) . '" title="' . sprintf(__("Posts by %s"), wp_specialchars($author->user_nickname)) . '">' . $name . '</a>';
-
-            if ( (! empty($feed_image)) || (! empty($feed)) ) {
-                
-                $link .= ' ';
-
-                if (empty($feed_image)) {
-                    $link .= '(';
-                }
-
-                $link .= '<a href="' . get_author_rss_link(0, $author->ID, $author->user_nicename)  . '"';
-
-                if (! empty($feed)) {
-                    $title =  ' title="' . $feed . '"';
-                    $alt = ' alt="' . $feed . '"';
-                    $name = $feed;
-                    $link .= $title;
-                }
-
-                $link .= '>';
-
-                if (! empty($feed_image)) {
-                    $link .= "<img src=\"$feed_image\" border=\"0\"$alt$title" . ' />';
-                } else {
-                    $link .= $name;
-                }
-                
-                $link .= '</a>';
-
-                if (empty($feed_image)) {
-                    $link .= ')';
-                }
-            }
-
-            if ($optioncount) {
-                $link .= ' ('. $posts . ')';
-            }
-        }
+		} else {
+			$link = '<a href="' . get_author_link(0, $author->ID, $author->user_nicename) . '" title="' . sprintf(__("Posts by %s"), wp_specialchars($author->display_name)) . '">' . $name . '</a>';
 
-        if (! ($posts == 0 && $hide_empty)) echo "$link</li>";
-    }
+			if ( (! empty($feed_image)) || (! empty($feed)) ) {
+				$link .= ' ';
+				if (empty($feed_image))
+					$link .= '(';
+				$link .= '<a href="' . get_author_rss_link(0, $author->ID, $author->user_nicename) . '"';
+
+				if ( !empty($feed) ) {
+					$title = ' title="' . $feed . '"';
+					$alt = ' alt="' . $feed . '"';
+					$name = $feed;
+					$link .= $title;
+				}
+
+				$link .= '>';
+
+				if ( !empty($feed_image) )
+					$link .= "<img src=\"$feed_image\" border=\"0\"$alt$title" . ' />';
+				else
+					$link .= $name;
+
+				$link .= '</a>';
+
+				if ( empty($feed_image) )
+					$link .= ')';
+			}
+
+			if ( $optioncount )
+				$link .= ' ('. $posts . ')';
+
+		}
+
+		if ( !($posts == 0 && $hide_empty) )
+			echo "$link</li>";
+	}
 }
 
 ?>
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/template-functions-category.php 2.0.4/wp-includes/template-functions-category.php
--- 1.5.2/wp-includes/template-functions-category.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/wp-includes/template-functions-category.php	2005-12-21 22:31:48.000000000 -0600
@@ -1,17 +1,17 @@
 <?php
 
 function get_the_category($id = false) {
-    global $post, $category_cache;
+global $post, $category_cache;
 
 	if ( !$id )
 		$id = $post->ID;
 
-	if ( ! isset($category_cache[$id]) )
+	if ( !isset($category_cache[$id]) )
 		update_post_category_cache($id);
 
 	$categories = $category_cache[$id];
 
-	if (!empty($categories))
+	if ( !empty($categories) )
 		sort($categories);
 	else
 		$categories = array();
@@ -24,13 +24,13 @@
 	$catlink = $wp_rewrite->get_category_permastruct();
 
 	if ( empty($catlink) ) {
-		$file = get_settings('home') . '/' . get_settings('blogfilename');
+		$file = get_settings('home') . '/';
 		$catlink = $file . '?cat=' . $category_id;
 	} else {
 		$category = &get_category($category_id);
 		$category_nicename = $category->category_nicename;
 
-		if ($parent = $category->category_parent) 
+		if ( $parent = $category->category_parent )
 			$category_nicename = get_category_parents($parent, false, '/', true) . $category_nicename . '/';
 
 		$catlink = str_replace('%category%', $category_nicename, $catlink);
@@ -40,60 +40,60 @@
 }
 
 function get_the_category_list($separator = '', $parents='') {
-    $categories = get_the_category();
-    if (empty($categories)) {
-			return apply_filters('the_category', __('Uncategorized'), $separator, $parents);
-    }
-
-    $thelist = '';
-    if ('' == $separator) {
-        $thelist .= '<ul class="post-categories">';
-        foreach ($categories as $category) {
-            $category->cat_name = $category->cat_name;
-            $thelist .= "\n\t<li>";
-            switch(strtolower($parents)) {
-                case 'multiple':
-                    if ($category->category_parent) {
-                        $thelist .= get_category_parents($category->category_parent, TRUE);
-                    }
-                    $thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a></li>';
-                    break;
-                case 'single':
-                    $thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . ' rel="category tag">';
-                    if ($category->category_parent) {
-                        $thelist .= get_category_parents($category->category_parent, FALSE);
-                    }
-                    $thelist .= $category->cat_name.'</a></li>';
-                    break;
-                case '':
-                default:
-                    $thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a></li>';
-            }
-        }
-        $thelist .= '</ul>';
-    } else {
-        $i = 0;
-        foreach ($categories as $category) {
-            $category->cat_name = $category->cat_name;
-            if (0 < $i) $thelist .= $separator . ' ';
-            switch(strtolower($parents)) {
-                case 'multiple':
-                    if ($category->category_parent)    $thelist .= get_category_parents($category->category_parent, TRUE);
-                    $thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a>';
-                    break;
-                case 'single':
-                    $thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">';
-                    if ($category->category_parent)    $thelist .= get_category_parents($category->category_parent, FALSE);
-                    $thelist .= "$category->cat_name</a>";
-                    break;
-                case '':
-                default:
-                    $thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a>';
-            }
-            ++$i;
-        }
-    }
-    return apply_filters('the_category', $thelist, $separator, $parents);
+	$categories = get_the_category();
+	if (empty($categories))
+		return apply_filters('the_category', __('Uncategorized'), $separator, $parents);
+
+	$thelist = '';
+	if ( '' == $separator ) {
+		$thelist .= '<ul class="post-categories">';
+		foreach ( $categories as $category ) {
+			$category->cat_name = $category->cat_name;
+			$thelist .= "\n\t<li>";
+			switch ( strtolower($parents) ) {
+				case 'multiple':
+					if ($category->category_parent)
+						$thelist .= get_category_parents($category->category_parent, TRUE);
+					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a></li>';
+					break;
+				case 'single':
+					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . ' rel="category tag">';
+					if ($category->category_parent)
+						$thelist .= get_category_parents($category->category_parent, FALSE);
+					$thelist .= $category->cat_name.'</a></li>';
+					break;
+				case '':
+				default:
+					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a></li>';
+			}
+		}
+		$thelist .= '</ul>';
+	} else {
+		$i = 0;
+		foreach ( $categories as $category ) {
+			$category->cat_name = $category->cat_name;
+			if ( 0 < $i )
+				$thelist .= $separator . ' ';
+			switch ( strtolower($parents) ) {
+				case 'multiple':
+					if ( $category->category_parent )
+						$thelist .= get_category_parents($category->category_parent, TRUE);
+					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a>';
+					break;
+				case 'single':
+					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">';
+					if ( $category->category_parent )
+						$thelist .= get_category_parents($category->category_parent, FALSE);
+					$thelist .= "$category->cat_name</a>";
+					break;
+				case '':
+				default:
+					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" rel="category tag">'.$category->cat_name.'</a>';
+			}
+			++$i;
+		}
+	}
+	return apply_filters('the_category', $thelist, $separator, $parents);
 }
 
 function the_category($separator = '', $parents='') {
@@ -107,32 +107,35 @@
 }
 
 function get_category_parents($id, $link = FALSE, $separator = '/', $nicename = FALSE){
-    $chain = '';
-		$parent = &get_category($id);
-    if ($nicename) {
-        $name = $parent->category_nicename;
-    } else {
-        $name = $parent->cat_name;
-    }
-    if ($parent->category_parent) $chain .= get_category_parents($parent->category_parent, $link, $separator, $nicename);
-    if ($link) {
-        $chain .= '<a href="' . get_category_link($parent->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $parent->cat_name) . '">'.$name.'</a>' . $separator;
-    } else {
-        $chain .= $name.$separator;
-    }
-    return $chain;
+	$chain = '';
+	$parent = &get_category($id);
+
+	if ( $nicename )
+		$name = $parent->category_nicename;
+	else
+		$name = $parent->cat_name;
+
+	if ( $parent->category_parent )
+		$chain .= get_category_parents($parent->category_parent, $link, $separator, $nicename);
+
+	if ( $link )
+		$chain .= '<a href="' . get_category_link($parent->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $parent->cat_name) . '">'.$name.'</a>' . $separator;
+	else
+		$chain .= $name.$separator;
+	return $chain;
 }
 
 function get_category_children($id, $before = '/', $after = '') {
-	global $cache_categories;
+	if ( 0 == $id )
+		return '';
 
-	if ( ! isset($cache_categories))
-		update_category_cache();
-		
-	$c_cache = $cache_categories; // Can't do recursive foreach on a global, have to make a copy
-	$chain = '';
-	foreach ($c_cache as $category){
-		if ($category->category_parent == $id){
+	$cat_ids = get_all_category_ids();
+	foreach ( $cat_ids as $cat_id ) {
+		if ( $cat_id == $id)
+			continue;
+
+		$category = get_category($cat_id);
+		if ( $category->category_parent == $id ) {
 			$chain .= $before.$category->cat_ID.$after;
 			$chain .= get_category_children($category->cat_ID, $before, $after);
 		}
@@ -142,196 +145,201 @@
 
 // Deprecated.
 function the_category_ID($echo = true) {
-    // Grab the first cat in the list.
-    $categories = get_the_category();
-    $cat = $categories[0]->cat_ID;
-    
-    if ($echo) echo $cat;
+	// Grab the first cat in the list.
+	$categories = get_the_category();
+	$cat = $categories[0]->cat_ID;
+
+	if ( $echo )
+		echo $cat;
 
-    return $cat;
+	return $cat;
 }
 
 // Deprecated.
 function the_category_head($before='', $after='') {
-    global $currentcat, $previouscat;
-    // Grab the first cat in the list.
-    $categories = get_the_category();
-    $currentcat = $categories[0]->category_id;
-    if ($currentcat != $previouscat) {
-        echo $before;
-        echo get_the_category_by_ID($currentcat);
-        echo $after;
-        $previouscat = $currentcat;
-    }
+	global $currentcat, $previouscat;
+	// Grab the first cat in the list.
+	$categories = get_the_category();
+	$currentcat = $categories[0]->category_id;
+	if ( $currentcat != $previouscat ) {
+		echo $before;
+		echo get_the_category_by_ID($currentcat);
+		echo $after;
+		$previouscat = $currentcat;
+	}
 }
 
 function category_description($category = 0) {
-    global $cat;
-    if (!$category) $category = $cat;
-		$category = & get_category($category);
-    return apply_filters('category_description', $category->category_description, $category->cat_ID);
+	global $cat;
+	if ( !$category )
+		$category = $cat;
+	$category = & get_category($category);
+	return apply_filters('category_description', $category->category_description, $category->cat_ID);
 }
 
 // out of the WordPress loop
 function dropdown_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc',
-        $optiondates = 0, $optioncount = 0, $hide_empty = 1, $optionnone=FALSE,
-        $selected=0, $hide=0) {
-    global $wpdb;
-    if (($file == 'blah') || ($file == '')) $file = get_settings('home') . '/';
-    if (!$selected) $selected=$cat;
-    $sort_column = 'cat_'.$sort_column;
-
-    $query = "
-        SELECT cat_ID, cat_name, category_nicename,category_parent,
-        COUNT($wpdb->post2cat.post_id) AS cat_count,
-        DAYOFMONTH(MAX(post_date)) AS lastday, MONTH(MAX(post_date)) AS lastmonth
-        FROM $wpdb->categories LEFT JOIN $wpdb->post2cat ON (cat_ID = category_id)
-        LEFT JOIN $wpdb->posts ON (ID = post_id)
-        WHERE cat_ID > 0
-        ";
-    if ($hide) {
-        $query .= " AND cat_ID != $hide";
-        $query .= get_category_children($hide, " AND cat_ID != ");
-    }
-    $query .=" GROUP BY cat_ID";
-    if (intval($hide_empty) == 1) $query .= " HAVING cat_count > 0";
-    $query .= " ORDER BY $sort_column $sort_order, post_date DESC";
-
-    $categories = $wpdb->get_results($query);
-    echo "<select name='cat' class='postform'>\n";
-    if (intval($optionall) == 1) {
-        $all = apply_filters('list_cats', $all);
-        echo "\t<option value='0'>$all</option>\n";
-    }
-    if (intval($optionnone) == 1) echo "\t<option value='-1'>".__('None')."</option>\n";
-    if ($categories) {
-        foreach ($categories as $category) {
-            $cat_name = apply_filters('list_cats', $category->cat_name, $category);
-            echo "\t<option value=\"".$category->cat_ID."\"";
-            if ($category->cat_ID == $selected)
-                echo ' selected="selected"';
-            echo '>';
-            echo $cat_name;
-            if (intval($optioncount) == 1) echo '&nbsp;&nbsp;('.$category->cat_count.')';
-            if (intval($optiondates) == 1) echo '&nbsp;&nbsp;'.$category->lastday.'/'.$category->lastmonth;
-            echo "</option>\n";
-        }
-    }
-    echo "</select>\n";
+		$optiondates = 0, $optioncount = 0, $hide_empty = 1, $optionnone=FALSE,
+		$selected=0, $hide=0) {
+	global $wpdb;
+	if ( ($file == 'blah') || ($file == '') )
+		$file = get_settings('home') . '/';
+	if ( !$selected )
+		$selected=$cat;
+	$sort_column = 'cat_'.$sort_column;
+
+	$query = "
+		SELECT cat_ID, cat_name, category_nicename,category_parent,
+		COUNT($wpdb->post2cat.post_id) AS cat_count,
+		DAYOFMONTH(MAX(post_date)) AS lastday, MONTH(MAX(post_date)) AS lastmonth
+		FROM $wpdb->categories LEFT JOIN $wpdb->post2cat ON (cat_ID = category_id)
+		LEFT JOIN $wpdb->posts ON (ID = post_id)
+		WHERE cat_ID > 0
+		";
+	if ( $hide ) {
+		$query .= " AND cat_ID != $hide";
+		$query .= get_category_children($hide, " AND cat_ID != ");
+	}
+	$query .=" GROUP BY cat_ID";
+	if ( intval($hide_empty) == 1 )
+		$query .= " HAVING cat_count > 0";
+	$query .= " ORDER BY $sort_column $sort_order, post_date DESC";
+
+	$categories = $wpdb->get_results($query);
+	echo "<select name='cat' class='postform'>\n";
+	if ( intval($optionall) == 1 ) {
+		$all = apply_filters('list_cats', $all);
+		echo "\t<option value='0'>$all</option>\n";
+	}
+	if ( intval($optionnone) == 1 )
+		echo "\t<option value='-1'>".__('None')."</option>\n";
+	if ( $categories ) {
+		foreach ( $categories as $category ) {
+			$cat_name = apply_filters('list_cats', $category->cat_name, $category);
+			echo "\t<option value=\"".$category->cat_ID."\"";
+			if ( $category->cat_ID == $selected )
+				echo ' selected="selected"';
+			echo '>';
+			echo $cat_name;
+			if ( intval($optioncount) == 1 )
+				echo '&nbsp;&nbsp;('.$category->cat_count.')';
+			if ( intval($optiondates) == 1 )
+				echo '&nbsp;&nbsp;'.$category->lastday.'/'.$category->lastmonth;
+			echo "</option>\n";
+		}
+	}
+	echo "</select>\n";
 }
 
 // out of the WordPress loop
 function wp_list_cats($args = '') {
 	parse_str($args, $r);
-	if (!isset($r['optionall'])) $r['optionall'] = 0;
-    if (!isset($r['all'])) $r['all'] = 'All';
-	if (!isset($r['sort_column'])) $r['sort_column'] = 'ID';
-	if (!isset($r['sort_order'])) $r['sort_order'] = 'asc';
-	if (!isset($r['file'])) $r['file'] = '';
-	if (!isset($r['list'])) $r['list'] = true;
-	if (!isset($r['optiondates'])) $r['optiondates'] = 0;
-	if (!isset($r['optioncount'])) $r['optioncount'] = 0;
-	if (!isset($r['hide_empty'])) $r['hide_empty'] = 1;
-	if (!isset($r['use_desc_for_title'])) $r['use_desc_for_title'] = 1;
-	if (!isset($r['children'])) $r['children'] = true;
-	if (!isset($r['child_of'])) $r['child_of'] = 0;
-	if (!isset($r['categories'])) $r['categories'] = 0;
-	if (!isset($r['recurse'])) $r['recurse'] = 0;
-	if (!isset($r['feed'])) $r['feed'] = '';
-	if (!isset($r['feed_image'])) $r['feed_image'] = '';
-	if (!isset($r['exclude'])) $r['exclude'] = '';
-	if (!isset($r['hierarchical'])) $r['hierarchical'] = true;
+	if ( !isset($r['optionall']))
+		$r['optionall'] = 0;
+	if ( !isset($r['all']))
+		$r['all'] = 'All';
+	if ( !isset($r['sort_column']) )
+		$r['sort_column'] = 'ID';
+	if ( !isset($r['sort_order']) )
+		$r['sort_order'] = 'asc';
+	if ( !isset($r['file']) )
+		$r['file'] = '';
+	if ( !isset($r['list']) )
+		$r['list'] = true;
+	if ( !isset($r['optiondates']) )
+		$r['optiondates'] = 0;
+	if ( !isset($r['optioncount']) )
+		$r['optioncount'] = 0;
+	if ( !isset($r['hide_empty']) )
+		$r['hide_empty'] = 1;
+	if ( !isset($r['use_desc_for_title']) )
+		$r['use_desc_for_title'] = 1;
+	if ( !isset($r['children']) )
+		$r['children'] = true;
+	if ( !isset($r['child_of']) )
+		$r['child_of'] = 0;
+	if ( !isset($r['categories']) )
+		$r['categories'] = 0;
+	if ( !isset($r['recurse']) )
+		$r['recurse'] = 0;
+	if ( !isset($r['feed']) )
+		$r['feed'] = '';
+	if ( !isset($r['feed_image']) )
+		$r['feed_image'] = '';
+	if ( !isset($r['exclude']) )
+		$r['exclude'] = '';
+	if ( !isset($r['hierarchical']) )
+		$r['hierarchical'] = true;
 
-	list_cats($r['optionall'], $r['all'], $r['sort_column'], $r['sort_order'], $r['file'],	$r['list'], $r['optiondates'], $r['optioncount'], $r['hide_empty'], $r['use_desc_for_title'], $r['children'], $r['child_of'], $r['categories'], $r['recurse'], $r['feed'], $r['feed_image'], $r['exclude'], $r['hierarchical']);
+	return list_cats($r['optionall'], $r['all'], $r['sort_column'], $r['sort_order'], $r['file'],	$r['list'], $r['optiondates'], $r['optioncount'], $r['hide_empty'], $r['use_desc_for_title'], $r['children'], $r['child_of'], $r['categories'], $r['recurse'], $r['feed'], $r['feed_image'], $r['exclude'], $r['hierarchical']);
 }
 
 function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0, $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=FALSE, $child_of=0, $categories=0, $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=FALSE) {
-	global $wpdb, $category_posts;
+	global $wpdb, $wp_query;
 	// Optiondates now works
-	if ('' == $file) {
+	if ( '' == $file )
 		$file = get_settings('home') . '/';
-	}
 
 	$exclusions = '';
-	if (!empty($exclude)) {
+	if ( !empty($exclude) ) {
 		$excats = preg_split('/[\s,]+/',$exclude);
-		if (count($excats)) {
-			foreach ($excats as $excat) {
+		if ( count($excats) ) {
+			foreach ( $excats as $excat ) {
 				$exclusions .= ' AND cat_ID <> ' . intval($excat) . ' ';
 			}
 		}
 	}
 
-	$exclusions = apply_filters('list_cats_exclusions', $exclusions);
+	$exclusions = apply_filters('list_cats_exclusions', $exclusions );
 
-	if (intval($categories)==0){
+	if ( intval($categories) == 0 ) {
 		$sort_column = 'cat_'.$sort_column;
 
-		$query  = "
-			SELECT cat_ID, cat_name, category_nicename, category_description, category_parent
+		$query = "
+			SELECT cat_ID, cat_name, category_nicename, category_description, category_parent, category_count
 			FROM $wpdb->categories
 			WHERE cat_ID > 0 $exclusions
 			ORDER BY $sort_column $sort_order";
 
 		$categories = $wpdb->get_results($query);
 	}
-	if (!count($category_posts)) {
-		$now = current_time('mysql', 1);
-		$cat_counts = $wpdb->get_results("	SELECT cat_ID,
-		COUNT($wpdb->post2cat.post_id) AS cat_count
-		FROM $wpdb->categories 
-		INNER JOIN $wpdb->post2cat ON (cat_ID = category_id)
-		INNER JOIN $wpdb->posts ON (ID = post_id)
-		WHERE post_status = 'publish'
-		AND post_date_gmt < '$now' $exclusions
-		GROUP BY category_id");
-        if (! empty($cat_counts)) {
-            foreach ($cat_counts as $cat_count) {
-                if (1 != intval($hide_empty) || $cat_count > 0) {
-                    $category_posts["$cat_count->cat_ID"] = $cat_count->cat_count;
-                }
-            }
-        }
-	}
-	
+
 	if ( $optiondates ) {
 		$cat_dates = $wpdb->get_results("	SELECT category_id,
 		UNIX_TIMESTAMP( MAX(post_date) ) AS ts
-		FROM $wpdb->posts, $wpdb->post2cat
+		FROM $wpdb->posts, $wpdb->post2cat, $wpdb->categories
 		WHERE post_status = 'publish' AND post_id = ID $exclusions
 		GROUP BY category_id");
-		foreach ($cat_dates as $cat_date) {
+		foreach ( $cat_dates as $cat_date ) {
 			$category_timestamp["$cat_date->category_id"] = $cat_date->ts;
 		}
 	}
-	
+
 	$num_found=0;
 	$thelist = "";
-	
-	foreach ($categories as $category) {
-		if ((intval($hide_empty) == 0 || isset($category_posts["$category->cat_ID"])) && (!$hierarchical || $category->category_parent == $child_of) ) {
+
+	foreach ( $categories as $category ) {
+		if ( ( intval($hide_empty) == 0 || $category->category_count) && (!$hierarchical || $category->category_parent == $child_of) ) {
 			$num_found++;
 			$link = '<a href="'.get_category_link($category->cat_ID).'" ';
-			if ($use_desc_for_title == 0 || empty($category->category_description)) {
+			if ( $use_desc_for_title == 0 || empty($category->category_description) )
 				$link .= 'title="'. sprintf(__("View all posts filed under %s"), wp_specialchars($category->cat_name)) . '"';
-			} else {
+			else
 				$link .= 'title="' . wp_specialchars(apply_filters('category_description',$category->category_description,$category)) . '"';
-			}
 			$link .= '>';
 			$link .= apply_filters('list_cats', $category->cat_name, $category).'</a>';
 
 			if ( (! empty($feed_image)) || (! empty($feed)) ) {
-				
+
 				$link .= ' ';
 
-				if (empty($feed_image)) {
+				if ( empty($feed_image) )
 					$link .= '(';
-				}
 
-				$link .= '<a href="' . get_category_rss_link(0, $category->cat_ID, $category->category_nicename)  . '"';
+				$link .= '<a href="' . get_category_rss_link(0, $category->cat_ID, $category->category_nicename) . '"';
 
 				if ( !empty($feed) ) {
-					$title =  ' title="' . $feed . '"';
+					$title = ' title="' . $feed . '"';
 					$alt = ' alt="' . $feed . '"';
 					$name = $feed;
 					$link .= $title;
@@ -339,66 +347,69 @@
 
 				$link .= '>';
 
-				if (! empty($feed_image)) {
+				if ( !empty($feed_image) )
 					$link .= "<img src='$feed_image' $alt$title" . ' />';
-				} else {
+				else
 					$link .= $name;
-				}
-				
+
 				$link .= '</a>';
 
-				if (empty($feed_image)) {
+				if (empty($feed_image))
 					$link .= ')';
-				}
 			}
 
-			if (intval($optioncount) == 1) {
-				$link .= ' ('.intval($category_posts["$category->cat_ID"]).')';
-			}
+			if ( intval($optioncount) == 1 )
+				$link .= ' ('.intval($category->category_count).')';
+
 			if ( $optiondates ) {
-				if ( $optiondates == 1 ) $optiondates = 'Y-m-d';
+				if ( $optiondates == 1 )
+					$optiondates = 'Y-m-d';
 				$link .= ' ' . gmdate($optiondates, $category_timestamp["$category->cat_ID"]);
 			}
-			if ($list) {
-				$thelist .= "\t<li>$link\n";
+
+			if ( $list ) {
+				$thelist .= "\t<li";
+				if (($category->cat_ID == $wp_query->get_queried_object_id()) && is_category()) {
+					$thelist .=  ' class="current-cat"';
+				}
+				$thelist .= ">$link\n";
 			} else {
 				$thelist .= "\t$link<br />\n";
 			}
-			if ($hierarchical && $children) $thelist .= list_cats($optionall, $all, $sort_column, $sort_order, $file, $list, $optiondates, $optioncount, $hide_empty, $use_desc_for_title, $hierarchical, $category->cat_ID, $categories, 1, $feed, $feed_image, $exclude, $hierarchical);
-			if ($list) $thelist .= "</li>\n";
-			}
+
+			if ($hierarchical && $children)
+				$thelist .= list_cats($optionall, $all, $sort_column, $sort_order, $file, $list, $optiondates, $optioncount, $hide_empty, $use_desc_for_title, $hierarchical, $category->cat_ID, $categories, 1, $feed, $feed_image, $exclude, $hierarchical);
+			if ($list)
+				$thelist .= "</li>\n";
+		}
 	}
-	if (!$num_found && !$child_of){
-		if ($list) {
+	if ( !$num_found && !$child_of ) {
+		if ( $list ) {
 			$before = '<li>';
 			$after = '</li>';
 		}
 		echo $before . __("No categories") . $after . "\n";
 		return;
 	}
-	if ($list && $child_of && $num_found && $recurse) {
+	if ( $list && $child_of && $num_found && $recurse ) {
 		$pre = "\t\t<ul class='children'>";
 		$post = "\t\t</ul>\n";
 	} else {
 		$pre = $post = '';
 	}
 	$thelist = $pre . $thelist . $post;
-	if ($recurse) {
+	if ( $recurse )
 		return $thelist;
-	}
 	echo apply_filters('list_cats', $thelist);
 }
 
 function in_category($category) { // Check if the current post is in the given category
-	global $post, $category_cache;
-	$cats = '';
-	foreach ($category_cache[$post->ID] as $cat) :
-		$cats[] = $cat->cat_ID;
-	endforeach;
+	global $category_cache, $post;
 
-	if ( in_array($category, $cats) )
+	if ( isset( $category_cache[$post->ID][$category] ) )
 		return true;
 	else
 		return false;
 }
+
 ?>
diff -ruN 1.5.2/wp-includes/template-functions-general.php 2.0.4/wp-includes/template-functions-general.php
--- 1.5.2/wp-includes/template-functions-general.php	2005-05-27 01:10:41.000000000 -0500
+++ 2.0.4/wp-includes/template-functions-general.php	2006-07-21 14:03:21.000000000 -0500
@@ -9,6 +9,7 @@
 		load_template( ABSPATH . 'wp-content/themes/default/header.php');
 }
 
+
 function get_footer() {
 	if ( file_exists( TEMPLATEPATH . '/footer.php') )
 		load_template( TEMPLATEPATH . '/footer.php');
@@ -16,6 +17,7 @@
 		load_template( ABSPATH . 'wp-content/themes/default/footer.php');
 }
 
+
 function get_sidebar() {
 	if ( file_exists( TEMPLATEPATH . '/sidebar.php') )
 		load_template( TEMPLATEPATH . '/sidebar.php');
@@ -25,191 +27,212 @@
 
 
 function wp_loginout() {
-	global $user_ID;
-	get_currentuserinfo();
-
-	if ('' == $user_ID) :
+	if ( ! is_user_logged_in() )
 		$link = '<a href="' . get_settings('siteurl') . '/wp-login.php">' . __('Login') . '</a>';
-	else :
+	else
 		$link = '<a href="' . get_settings('siteurl') . '/wp-login.php?action=logout">' . __('Logout') . '</a>';
-	endif;
 
 	echo apply_filters('loginout', $link);
 }
 
-function wp_register( $before = '<li>', $after = '</li>' ) {
-	global $user_ID;
 
-	get_currentuserinfo();
+function wp_register( $before = '<li>', $after = '</li>' ) {
 
-	if ('' == $user_ID && get_settings('users_can_register') ) :
-		$link = $before . '<a href="' . get_settings('siteurl') . '/wp-register.php">' . __('Register') . '</a>' . $after;
-	elseif ('' == $user_ID && !get_settings('users_can_register') ) : 
-		$link = '';
-	else :
+	if ( ! is_user_logged_in() ) {
+		if ( get_settings('users_can_register') )
+			$link = $before . '<a href="' . get_settings('siteurl') . '/wp-register.php">' . __('Register') . '</a>' . $after;
+		else
+			$link = '';
+	} else {
 		$link = $before . '<a href="' . get_settings('siteurl') . '/wp-admin/">' . __('Site Admin') . '</a>' . $after;
-	endif;
+	}
 
 	echo apply_filters('register', $link);
 }
 
+
 function wp_meta() {
 	do_action('wp_meta');
 }
 
+
 function bloginfo($show='') {
-    $info = get_bloginfo($show);
-    $info = apply_filters('bloginfo', $info, $show);
-    echo convert_chars($info);
+	$info = get_bloginfo($show);
+	if (!strstr($show, 'url') && //don't filter URLs
+		!strstr($show, 'directory') &&
+		!strstr($show, 'home')) {
+		$info = apply_filters('bloginfo', $info, $show);
+		$info = convert_chars($info);
+	}
+
+	echo $info;
 }
 
+
 function get_bloginfo($show='') {
 
 	switch($show) {
-	case 'url' :
-	case 'home' : 
-	case 'siteurl' :
-		$output = get_settings('home');
-		break;
-	case 'wpurl' :
-		$output = get_settings('siteurl');
-		break;
-	case 'description':
-		$output = get_settings('blogdescription');
-		break;
-	case 'rdf_url':
-		$output = get_feed_link('rdf');
-		break;
-	case 'rss_url':
-		$output = get_feed_link('rss');
-		break;
-	case 'rss2_url':
-		$output = get_feed_link('rss2');
-		break;
-	case 'atom_url':
-		$output = get_feed_link('atom');
-		break;        
-	case 'comments_rss2_url':
-		$output = get_feed_link('comments_rss2');
-		break;
-	case 'pingback_url':
-		$output = get_settings('siteurl') .'/xmlrpc.php';
-		break;
-	case 'stylesheet_url':
-		$output = get_stylesheet_uri();
-		break;
-	case 'stylesheet_directory':
-		$output = get_stylesheet_directory_uri();
-		break;
-	case 'template_directory':
-	case 'template_url':
-		$output = get_template_directory_uri();
-		break;
-	case 'admin_email':
-		$output = get_settings('admin_email');
-		break;
-	case 'charset':
-		$output = get_settings('blog_charset');
-		if ('' == $output) $output = 'UTF-8';
-		break;
-	case 'html_type' :
-		$output = get_option('html_type');
-		break;
-	case 'version':
-		global $wp_version;
-		$output = $wp_version;
-		break;
-	case 'name':
-	default:
-		$output = get_settings('blogname');
-		break;
+		case 'url' :
+		case 'home' :
+		case 'siteurl' :
+			$output = get_settings('home');
+			break;
+		case 'wpurl' :
+			$output = get_settings('siteurl');
+			break;
+		case 'description':
+			$output = get_settings('blogdescription');
+			break;
+		case 'rdf_url':
+			$output = get_feed_link('rdf');
+			break;
+		case 'rss_url':
+			$output = get_feed_link('rss');
+			break;
+		case 'rss2_url':
+			$output = get_feed_link('rss2');
+			break;
+		case 'atom_url':
+			$output = get_feed_link('atom');
+			break;
+		case 'comments_rss2_url':
+			$output = get_feed_link('comments_rss2');
+			break;
+		case 'pingback_url':
+			$output = get_settings('siteurl') .'/xmlrpc.php';
+			break;
+		case 'stylesheet_url':
+			$output = get_stylesheet_uri();
+			break;
+		case 'stylesheet_directory':
+			$output = get_stylesheet_directory_uri();
+			break;
+		case 'template_directory':
+		case 'template_url':
+			$output = get_template_directory_uri();
+			break;
+		case 'admin_email':
+			$output = get_settings('admin_email');
+			break;
+		case 'charset':
+			$output = get_settings('blog_charset');
+			if ('' == $output) $output = 'UTF-8';
+			break;
+		case 'html_type' :
+			$output = get_option('html_type');
+			break;
+		case 'version':
+			global $wp_version;
+			$output = $wp_version;
+			break;
+		case 'name':
+		default:
+			$output = get_settings('blogname');
+			break;
 	}
 	return $output;
 }
 
+
 function wp_title($sep = '&raquo;', $display = true) {
-    global $wpdb;
-    global $m, $year, $monthnum, $day, $category_name, $month, $posts;
+	global $wpdb;
+	global $m, $year, $monthnum, $day, $category_name, $month, $posts;
+
+	$cat = get_query_var('cat');
+	$p = get_query_var('p');
+	$name = get_query_var('name');
+	$category_name = get_query_var('category_name');
+	$author = get_query_var('author');
+	$author_name = get_query_var('author_name');
+
+	// If there's a category
+	if ( !empty($cat) ) {
+			// category exclusion
+			if ( !stristr($cat,'-') )
+				$title = get_the_category_by_ID($cat);
+	}
+	if ( !empty($category_name) ) {
+		if ( stristr($category_name,'/') ) {
+				$category_name = explode('/',$category_name);
+				if ( $category_name[count($category_name)-1] )
+					$category_name = $category_name[count($category_name)-1]; // no trailing slash
+				else
+					$category_name = $category_name[count($category_name)-2]; // there was a trailling slash
+		}
+		$title = $wpdb->get_var("SELECT cat_name FROM $wpdb->categories WHERE category_nicename = '$category_name'");
+	}
+
+	// If there's an author
+	if ( !empty($author) ) {
+		$title = get_userdata($author);
+		$title = $title->display_name;
+	}
+	if ( !empty($author_name) ) {
+		// We do a direct query here because we don't cache by nicename.
+		$title = $wpdb->get_var("SELECT display_name FROM $wpdb->users WHERE user_nicename = '$author_name'");
+	}
+
+	// If there's a month
+	if ( !empty($m) ) {
+		$my_year = substr($m, 0, 4);
+		$my_month = $month[substr($m, 4, 2)];
+		$title = "$my_year $sep $my_month";
+	}
+
+	if ( !empty($year) ) {
+		$title = $year;
+		if ( !empty($monthnum) )
+			$title .= " $sep ".$month[zeroise($monthnum, 2)];
+		if ( !empty($day) )
+			$title .= " $sep ".zeroise($day, 2);
+	}
+
+	// If there is a post
+	if ( is_single() || is_page() ) {
+		$title = strip_tags($posts[0]->post_title);
+		$title = apply_filters('single_post_title', $title);
+	}
 
-		$cat = get_query_var('cat');
-		$p = get_query_var('p');
-		$name = get_query_var('name');
-		$category_name = get_query_var('category_name');
-
-    // If there's a category
-    if(!empty($cat)) {
-        if (!stristr($cat,'-')) { // category excluded
-            $title = get_the_category_by_ID($cat);
-        }
-    }
-    if (!empty($category_name)) {
-        if (stristr($category_name,'/')) {
-            $category_name = explode('/',$category_name);
-            if ($category_name[count($category_name)-1]) {
-                $category_name = $category_name[count($category_name)-1]; // no trailing slash
-            } else {
-                $category_name = $category_name[count($category_name)-2]; // there was a trailling slash
-            }
-        }
-        $title = $wpdb->get_var("SELECT cat_name FROM $wpdb->categories WHERE category_nicename = '$category_name'");
-    }
-
-    // If there's a month
-    if(!empty($m)) {
-        $my_year = substr($m, 0, 4);
-        $my_month = $month[substr($m, 4, 2)];
-        $title = "$my_year $sep $my_month";
-
-    }
-    if (!empty($year)) {
-        $title = $year;
-        if (!empty($monthnum)) {
-            $title .= " $sep ".$month[zeroise($monthnum, 2)];
-        }
-        if (!empty($day)) {
-            $title .= " $sep ".zeroise($day, 2);
-        }
-    }
-
-    // If there's a post
-    if (is_single() || is_page()) {
-        $title = strip_tags($posts[0]->post_title);
-        $title = apply_filters('single_post_title', $title);
-    }
-
-    // Send it out
-    if ($display && isset($title)) {
-        echo " $sep $title";
-    } elseif (!$display && isset($title)) {
-        return " $sep $title";
-    }
+	$prefix = '';
+	if ( isset($title) )
+		$prefix = " $sep ";
+
+	$title = $prefix . $title;
+	$title = apply_filters('wp_title', $title, $sep);
+
+	// Send it out
+	if ( $display )
+		echo $title;
+	else
+		return $title;
 }
 
+
 function single_post_title($prefix = '', $display = true) {
-    global $wpdb;
-		$p = get_query_var('p');
-		$name = get_query_var('name');
-    if (intval($p) || '' != $name) {
-        if (!$p) {
-            $p = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '$name'");
-        }
-        $post = & get_post($p);
-        $title = $post->post_title;
-        $title = apply_filters('single_post_title', $title);
-        if ($display) {
-            echo $prefix.strip_tags($title);
-        } else {
-            return strip_tags($title);
-        }
-    }
+	global $wpdb;
+	$p = get_query_var('p');
+	$name = get_query_var('name');
+
+	if ( intval($p) || '' != $name ) {
+		if ( !$p )
+			$p = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '$name'");
+		$post = & get_post($p);
+		$title = $post->post_title;
+		$title = apply_filters('single_post_title', $title);
+		if ( $display )
+			echo $prefix.strip_tags($title);
+		else
+			return strip_tags($title);
+	}
 }
 
+
 function single_cat_title($prefix = '', $display = true ) {
 	$cat = intval( get_query_var('cat') );
-	if( !empty($cat) && !(strtoupper($cat) == 'ALL') ) {
+	if ( !empty($cat) && !(strtoupper($cat) == 'ALL') ) {
 		$my_cat_name = get_the_category_by_ID($cat);
-		if( !empty($my_cat_name) ) {
-			if ($display)
+		if ( !empty($my_cat_name) ) {
+			if ( $display )
 				echo $prefix.strip_tags($my_cat_name);
 			else
 				return strip_tags($my_cat_name);
@@ -217,391 +240,398 @@
 	}
 }
 
+
 function single_month_title($prefix = '', $display = true ) {
 	global $m, $monthnum, $month, $year;
-	if(!empty($monthnum) && !empty($year)) {
+	if ( !empty($monthnum) && !empty($year) ) {
 		$my_year = $year;
 		$my_month = $month[str_pad($monthnum, 2, '0', STR_PAD_LEFT)];
-	} elseif(!empty($m)) {
+	} elseif ( !empty($m) ) {
 		$my_year = substr($m, 0, 4);
 		$my_month = $month[substr($m, 4, 2)];
 	}
 
-	if (!empty($my_month) && $display) {
+	if ( !empty($my_month) && $display )
 		echo $prefix . $my_month . $prefix . $my_year;
-	} else {
+	else
 		return $monthnum;
-	}
 }
 
+
 /* link navigation hack by Orien http://icecode.com/ */
 function get_archives_link($url, $text, $format = 'html', $before = '', $after = '') {
 	$text = wptexturize($text);
-    $title_text = wp_specialchars($text, 1);
+	$title_text = wp_specialchars($text, 1);
 
-	if ('link' == $format) {
+	if ('link' == $format)
 		return "\t<link rel='archives' title='$title_text' href='$url' />\n";
-	} elseif ('option' == $format) {
+	elseif ('option' == $format)
 		return "\t<option value='$url'>$before $text $after</option>\n";
-	} elseif ('html' == $format) {
+	elseif ('html' == $format)
 		return "\t<li>$before<a href='$url' title='$title_text'>$text</a>$after</li>\n";
-	} else { // custom
+	else // custom
 		return "\t$before<a href='$url' title='$title_text'>$text</a>$after\n";
-	}
 }
 
+
 function wp_get_archives($args = '') {
 	parse_str($args, $r);
-	if (!isset($r['type'])) $r['type'] = '';
-	if (!isset($r['limit'])) $r['limit'] = '';
-	if (!isset($r['format'])) $r['format'] = 'html';
-	if (!isset($r['before'])) $r['before'] = '';
-	if (!isset($r['after'])) $r['after'] = '';
-	if (!isset($r['show_post_count'])) $r['show_post_count'] = false;
+	if ( !isset($r['type']) )
+		$r['type'] = '';
+	if ( !isset($r['limit']) )
+		$r['limit'] = '';
+	if ( !isset($r['format']) )
+		$r['format'] = 'html';
+	if ( !isset($r['before']) )
+		$r['before'] = '';
+	if ( !isset($r['after']) )
+		$r['after'] = '';
+	if ( !isset($r['show_post_count']) )
+		$r['show_post_count'] = false;
+
 	get_archives($r['type'], $r['limit'], $r['format'], $r['before'], $r['after'], $r['show_post_count']);
 }
 
+
 function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) {
-    global $month, $wpdb;
+	global $month, $wpdb;
+
+	if ( '' == $type )
+		$type = 'monthly';
+
+	if ( '' != $limit ) {
+		$limit = (int) $limit;
+		$limit = ' LIMIT '.$limit;
+	}
+	// this is what will separate dates on weekly archive links
+	$archive_week_separator = '&#8211;';
+
+	// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride
+	$archive_date_format_over_ride = 0;
+
+	// options for daily archive (only if you over-ride the general date format)
+	$archive_day_date_format = 'Y/m/d';
+
+	// options for weekly archive (only if you over-ride the general date format)
+	$archive_week_start_date_format = 'Y/m/d';
+	$archive_week_end_date_format	= 'Y/m/d';
+
+	if ( !$archive_date_format_over_ride ) {
+		$archive_day_date_format = get_settings('date_format');
+		$archive_week_start_date_format = get_settings('date_format');
+		$archive_week_end_date_format = get_settings('date_format');
+	}
+
+	$add_hours = intval(get_settings('gmt_offset'));
+	$add_minutes = intval(60 * (get_settings('gmt_offset') - $add_hours));
 
-    if ('' == $type) {
-        $type = 'monthly';
-    }
-
-    if ('' != $limit) {
-        $limit = (int) $limit;
-        $limit = ' LIMIT '.$limit;
-    }
-    // this is what will separate dates on weekly archive links
-    $archive_week_separator = '&#8211;';
-
-    // over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride
-    $archive_date_format_over_ride = 0;
-
-    // options for daily archive (only if you over-ride the general date format)
-    $archive_day_date_format = 'Y/m/d';
-
-    // options for weekly archive (only if you over-ride the general date format)
-    $archive_week_start_date_format = 'Y/m/d';
-    $archive_week_end_date_format   = 'Y/m/d';
-
-    if (!$archive_date_format_over_ride) {
-        $archive_day_date_format = get_settings('date_format');
-        $archive_week_start_date_format = get_settings('date_format');
-        $archive_week_end_date_format = get_settings('date_format');
-    }
-
-    $add_hours = intval(get_settings('gmt_offset'));
-    $add_minutes = intval(60 * (get_settings('gmt_offset') - $add_hours));
-
-    $now = current_time('mysql');
-
-    if ('monthly' == $type) {
-        $arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts WHERE post_date < '$now' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC" . $limit);
-        if ($arcresults) {
-            $afterafter = $after;
-            foreach ($arcresults as $arcresult) {
-                $url  = get_month_link($arcresult->year,   $arcresult->month);
-                if ($show_post_count) {
-                    $text = sprintf('%s %d', $month[zeroise($arcresult->month,2)], $arcresult->year);
-                    $after = '&nbsp;('.$arcresult->posts.')' . $afterafter;
-                } else {
-                    $text = sprintf('%s %d', $month[zeroise($arcresult->month,2)], $arcresult->year);
-                }
-                echo get_archives_link($url, $text, $format, $before, $after);
-            }
-        }
-    } elseif ('daily' == $type) {
-        $arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth` FROM $wpdb->posts WHERE post_date < '$now' AND post_status = 'publish' ORDER BY post_date DESC" . $limit);
-        if ($arcresults) {
-            foreach ($arcresults as $arcresult) {
-                $url  = get_day_link($arcresult->year, $arcresult->month, $arcresult->dayofmonth);
-                $date = sprintf("%d-%02d-%02d 00:00:00", $arcresult->year, $arcresult->month, $arcresult->dayofmonth);
-                $text = mysql2date($archive_day_date_format, $date);
-                echo get_archives_link($url, $text, $format, $before, $after);
-            }
-        }
-    } elseif ('weekly' == $type) {
-	$start_of_week = get_settings('start_of_week');
-        $arcresults = $wpdb->get_results("SELECT DISTINCT WEEK(post_date, $start_of_week) AS `week`, YEAR(post_date) AS yr, DATE_FORMAT(post_date, '%Y-%m-%d') AS yyyymmdd FROM $wpdb->posts WHERE post_date < '$now' AND post_status = 'publish' ORDER BY post_date DESC" . $limit);
-        $arc_w_last = '';
-        if ($arcresults) {
-            foreach ($arcresults as $arcresult) {
-                if ($arcresult->week != $arc_w_last) {
-                    $arc_year = $arcresult->yr;
-                    $arc_w_last = $arcresult->week;
-                    $arc_week = get_weekstartend($arcresult->yyyymmdd, get_settings('start_of_week'));
-                    $arc_week_start = date_i18n($archive_week_start_date_format, $arc_week['start']);
-                    $arc_week_end = date_i18n($archive_week_end_date_format, $arc_week['end']);
-                    $url  = sprintf('%s/%s%sm%s%s%sw%s%d', get_settings('home'), '', '?',
-                                    '=', $arc_year, '&amp;',
-                                    '=', $arcresult->week);
-                    $text = $arc_week_start . $archive_week_separator . $arc_week_end;
-                    echo get_archives_link($url, $text, $format, $before, $after);
-                }
-            }
-        }
-    } elseif ('postbypost' == $type) {
-        $arcresults = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_date < '$now' AND post_status = 'publish' ORDER BY post_date DESC" . $limit);
-        if ($arcresults) {
-            foreach ($arcresults as $arcresult) {
-                if ($arcresult->post_date != '0000-00-00 00:00:00') {
-                    $url  = get_permalink($arcresult);
-                    $arc_title = $arcresult->post_title;
-                    if ($arc_title) {
-                        $text = strip_tags($arc_title);
-                    } else {
-                        $text = $arcresult->ID;
-                    }
-                    echo get_archives_link($url, $text, $format, $before, $after);
-                }
-            }
-        }
-    }
+	$now = current_time('mysql');
+
+	if ( 'monthly' == $type ) {
+		$arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts WHERE post_date < '$now' AND post_date != '0000-00-00 00:00:00' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC" . $limit);
+		if ( $arcresults ) {
+			$afterafter = $after;
+			foreach ( $arcresults as $arcresult ) {
+				$url	= get_month_link($arcresult->year,	$arcresult->month);
+				if ( $show_post_count ) {
+					$text = sprintf('%s %d', $month[zeroise($arcresult->month,2)], $arcresult->year);
+					$after = '&nbsp;('.$arcresult->posts.')' . $afterafter;
+				} else {
+					$text = sprintf('%s %d', $month[zeroise($arcresult->month,2)], $arcresult->year);
+				}
+				echo get_archives_link($url, $text, $format, $before, $after);
+			}
+		}
+	} elseif ( 'daily' == $type ) {
+		$arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth` FROM $wpdb->posts WHERE post_date < '$now' AND post_date != '0000-00-00 00:00:00' AND post_status = 'publish' ORDER BY post_date DESC" . $limit);
+		if ( $arcresults ) {
+			foreach ( $arcresults as $arcresult ) {
+				$url	= get_day_link($arcresult->year, $arcresult->month, $arcresult->dayofmonth);
+				$date = sprintf("%d-%02d-%02d 00:00:00", $arcresult->year, $arcresult->month, $arcresult->dayofmonth);
+				$text = mysql2date($archive_day_date_format, $date);
+				echo get_archives_link($url, $text, $format, $before, $after);
+			}
+		}
+	} elseif ( 'weekly' == $type ) {
+		$start_of_week = get_settings('start_of_week');
+		$arcresults = $wpdb->get_results("SELECT DISTINCT WEEK(post_date, $start_of_week) AS `week`, YEAR(post_date) AS yr, DATE_FORMAT(post_date, '%Y-%m-%d') AS yyyymmdd FROM $wpdb->posts WHERE post_date < '$now' AND post_status = 'publish' ORDER BY post_date DESC" . $limit);
+		$arc_w_last = '';
+		if ( $arcresults ) {
+				foreach ( $arcresults as $arcresult ) {
+					if ( $arcresult->week != $arc_w_last ) {
+						$arc_year = $arcresult->yr;
+						$arc_w_last = $arcresult->week;
+						$arc_week = get_weekstartend($arcresult->yyyymmdd, get_settings('start_of_week'));
+						$arc_week_start = date_i18n($archive_week_start_date_format, $arc_week['start']);
+						$arc_week_end = date_i18n($archive_week_end_date_format, $arc_week['end']);
+						$url  = sprintf('%s/%s%sm%s%s%sw%s%d', get_settings('home'), '', '?', '=', $arc_year, '&amp;', '=', $arcresult->week);
+						$text = $arc_week_start . $archive_week_separator . $arc_week_end;
+						echo get_archives_link($url, $text, $format, $before, $after);
+					}
+				}
+		}
+	} elseif ( 'postbypost' == $type ) {
+		$arcresults = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_date < '$now' AND post_status = 'publish' ORDER BY post_date DESC" . $limit);
+		if ( $arcresults ) {
+			foreach ( $arcresults as $arcresult ) {
+				if ( $arcresult->post_date != '0000-00-00 00:00:00' ) {
+					$url  = get_permalink($arcresult);
+					$arc_title = $arcresult->post_title;
+					if ( $arc_title )
+						$text = strip_tags($arc_title);
+					else
+						$text = $arcresult->ID;
+					echo get_archives_link($url, $text, $format, $before, $after);
+				}
+			}
+		}
+	}
 }
 
+
 // Used in get_calendar
 function calendar_week_mod($num) {
 	$base = 7;
 	return ($num - $base*floor($num/$base));
 }
 
+
 function get_calendar($daylength = 1) {
-    global $wpdb, $m, $monthnum, $year, $timedifference, $month, $month_abbrev, $weekday, $weekday_initial, $weekday_abbrev, $posts;
+	global $wpdb, $m, $monthnum, $year, $timedifference, $month, $month_abbrev, $weekday, $weekday_initial, $weekday_abbrev, $posts;
+
+	$now = current_time('mysql');
+
+	// Quick check. If we have no posts yet published, abort!
+	if ( !$posts ) {
+		$gotsome = $wpdb->get_var("SELECT ID from $wpdb->posts WHERE post_status = 'publish' AND post_date < '$now' ORDER BY post_date DESC LIMIT 1");
+		if ( !$gotsome )
+			return;
+	}
+
+	if ( isset($_GET['w']) )
+		$w = ''.intval($_GET['w']);
+
+	// week_begins = 0 stands for Sunday
+	$week_begins = intval(get_settings('start_of_week'));
+	$add_hours = intval(get_settings('gmt_offset'));
+	$add_minutes = intval(60 * (get_settings('gmt_offset') - $add_hours));
+
+	// Let's figure out when we are
+	if ( !empty($monthnum) && !empty($year) ) {
+		$thismonth = ''.zeroise(intval($monthnum), 2);
+		$thisyear = ''.intval($year);
+	} elseif ( !empty($w) ) {
+		// We need to get the month from MySQL
+		$thisyear = ''.intval(substr($m, 0, 4));
+		$d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's
+		$thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('${thisyear}0101', INTERVAL $d DAY) ), '%m')");
+	} elseif ( !empty($m) ) {
+		$calendar = substr($m, 0, 6);
+		$thisyear = ''.intval(substr($m, 0, 4));
+		if ( strlen($m) < 6 )
+				$thismonth = '01';
+		else
+				$thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2);
+	} else {
+		$thisyear = gmdate('Y', current_time('timestamp') + get_settings('gmt_offset') * 3600);
+		$thismonth = gmdate('m', current_time('timestamp') + get_settings('gmt_offset') * 3600);
+	}
+
+	$unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear);
+
+	// Get the next and previous month and year with at least one post
+	$previous = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year
+		FROM $wpdb->posts
+		WHERE post_date < '$thisyear-$thismonth-01'
+		AND post_status = 'publish'
+			ORDER BY post_date DESC
+			LIMIT 1");
+	$next = $wpdb->get_row("SELECT	DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year
+		FROM $wpdb->posts
+		WHERE post_date >	'$thisyear-$thismonth-01'
+		AND post_date < '$now'
+		AND MONTH( post_date ) != MONTH( '$thisyear-$thismonth-01' )
+		AND post_status = 'publish' 
+			ORDER	BY post_date ASC
+			LIMIT 1");
+
+	echo '<table id="wp-calendar">
+	<caption>' . $month[zeroise($thismonth, 2)] . ' ' . date('Y', $unixmonth) . '</caption>
+	<thead>
+	<tr>';
+
+	$day_abbrev = $weekday_initial;
+	if ( $daylength > 1 )
+		$day_abbrev = $weekday_abbrev;
+
+	$myweek = array();
+
+	for ( $wdcount=0; $wdcount<=6; $wdcount++ ) {
+		$myweek[]=$weekday[($wdcount+$week_begins)%7];
+	}
+
+	foreach ( $myweek as $wd ) {
+		echo "\n\t\t<th abbr=\"$wd\" scope=\"col\" title=\"$wd\">" . $day_abbrev[$wd] . '</th>';
+	}
+
+	echo '
+	</tr>
+	</thead>
+
+	<tfoot>
+	<tr>';
+
+	if ( $previous ) {
+		echo "\n\t\t".'<td abbr="' . $month[zeroise($previous->month, 2)] . '" colspan="3" id="prev"><a href="' .
+		get_month_link($previous->year, $previous->month) . '" title="' . sprintf(__('View posts for %1$s %2$s'), $month[zeroise($previous->month, 2)],
+			date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year))) . '">&laquo; ' . $month_abbrev[$month[zeroise($previous->month, 2)]] . '</a></td>';
+	} else {
+		echo "\n\t\t".'<td colspan="3" id="prev" class="pad">&nbsp;</td>';
+	}
+
+	echo "\n\t\t".'<td class="pad">&nbsp;</td>';
+
+	if ( $next ) {
+		echo "\n\t\t".'<td abbr="' . $month[zeroise($next->month, 2)] . '" colspan="3" id="next"><a href="' .
+		get_month_link($next->year, $next->month) . '" title="' . sprintf(__('View posts for %1$s %2$s'), $month[zeroise($next->month, 2)],
+			date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year))) . '">' . $month_abbrev[$month[zeroise($next->month, 2)]] . ' &raquo;</a></td>';
+	} else {
+		echo "\n\t\t".'<td colspan="3" id="next" class="pad">&nbsp;</td>';
+	}
+
+	echo '
+	</tr>
+	</tfoot>
+
+	<tbody>
+	<tr>';
+
+	// Get days with posts
+	$dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
+		FROM $wpdb->posts WHERE MONTH(post_date) = '$thismonth'
+		AND YEAR(post_date) = '$thisyear'
+		AND post_status = 'publish'
+		AND post_date < '" . current_time('mysql') . '\'', ARRAY_N);
+	if ( $dayswithposts ) {
+		foreach ( $dayswithposts as $daywith ) {
+			$daywithpost[] = $daywith[0];
+		}
+	} else {
+		$daywithpost = array();
+	}
+
+
+
+	if ( strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE') || strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'camino') || strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'safari') )
+		$ak_title_separator = "\n";
+	else
+		$ak_title_separator = ', ';
+
+	$ak_titles_for_day = array();
+	$ak_post_titles = $wpdb->get_results("SELECT post_title, DAYOFMONTH(post_date) as dom "
+		."FROM $wpdb->posts "
+		."WHERE YEAR(post_date) = '$thisyear' "
+		."AND MONTH(post_date) = '$thismonth' "
+		."AND post_date < '".current_time('mysql')."' "
+		."AND post_status = 'publish'"
+	);
+	if ( $ak_post_titles ) {
+		foreach ( $ak_post_titles as $ak_post_title ) {
+				if ( empty($ak_titles_for_day['day_'.$ak_post_title->dom]) )
+					$ak_titles_for_day['day_'.$ak_post_title->dom] = '';
+				if ( empty($ak_titles_for_day["$ak_post_title->dom"]) ) // first one
+					$ak_titles_for_day["$ak_post_title->dom"] = str_replace('"', '&quot;', wptexturize($ak_post_title->post_title));
+				else
+					$ak_titles_for_day["$ak_post_title->dom"] .= $ak_title_separator . str_replace('"', '&quot;', wptexturize($ak_post_title->post_title));
+		}
+	}
+
+
+	// See how much we should pad in the beginning
+	$pad = calendar_week_mod(date('w', $unixmonth)-$week_begins);
+	if ( 0 != $pad )
+		echo "\n\t\t".'<td colspan="'.$pad.'" class="pad">&nbsp;</td>';
+
+	$daysinmonth = intval(date('t', $unixmonth));
+	for ( $day = 1; $day <= $daysinmonth; ++$day ) {
+		if ( isset($newrow) && $newrow )
+			echo "\n\t</tr>\n\t<tr>\n\t\t";
+		$newrow = false;
+
+		if ( $day == gmdate('j', (time() + (get_settings('gmt_offset') * 3600))) && $thismonth == gmdate('m', time()+(get_settings('gmt_offset') * 3600)) && $thisyear == gmdate('Y', time()+(get_settings('gmt_offset') * 3600)) )
+			echo '<td id="today">';
+		else
+			echo '<td>';
+
+		if ( in_array($day, $daywithpost) ) // any posts today?
+				echo '<a href="' . get_day_link($thisyear, $thismonth, $day) . "\" title=\"$ak_titles_for_day[$day]\">$day</a>";
+		else
+			echo $day;
+		echo '</td>';
 
-    // Quick check. If we have no posts at all, abort!
-    if (!$posts) {
-        $gotsome = $wpdb->get_var("SELECT ID from $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date DESC LIMIT 1");
-        if (!$gotsome)
-            return;
-    }
-
-    if (isset($_GET['w'])) {
-        $w = ''.intval($_GET['w']);
-    }
-
-    // week_begins = 0 stands for sunday
-    $week_begins = intval(get_settings('start_of_week'));
-    $add_hours = intval(get_settings('gmt_offset'));
-    $add_minutes = intval(60 * (get_settings('gmt_offset') - $add_hours));
-
-    // Let's figure out when we are
-    if (!empty($monthnum) && !empty($year)) {
-        $thismonth = ''.zeroise(intval($monthnum), 2);
-        $thisyear = ''.intval($year);
-    } elseif (!empty($w)) {
-        // We need to get the month from MySQL
-        $thisyear = ''.intval(substr($m, 0, 4));
-        $d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's
-        $thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('${thisyear}0101', INTERVAL $d DAY) ), '%m')");
-    } elseif (!empty($m)) {
-        $calendar = substr($m, 0, 6);
-        $thisyear = ''.intval(substr($m, 0, 4));
-        if (strlen($m) < 6) {
-            $thismonth = '01';
-        } else {
-            $thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2);
-        }
-    } else {
-        $thisyear = gmdate('Y', current_time('timestamp') + get_settings('gmt_offset') * 3600);
-        $thismonth = gmdate('m', current_time('timestamp') + get_settings('gmt_offset') * 3600);
-    }
-
-    $unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear);
-
-    // Get the next and previous month and year with at least one post
-    $previous = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year
-            FROM $wpdb->posts
-            WHERE post_date < '$thisyear-$thismonth-01'
-            AND post_status = 'publish'
-                              ORDER BY post_date DESC
-                              LIMIT 1");
-    $next = $wpdb->get_row("SELECT  DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year
-            FROM $wpdb->posts
-            WHERE post_date >  '$thisyear-$thismonth-01'
-            AND MONTH( post_date ) != MONTH( '$thisyear-$thismonth-01' )
-            AND post_status = 'publish'
-                              ORDER  BY post_date ASC
-                              LIMIT 1");
-
-    echo '<table id="wp-calendar">
-    <caption>' . $month[zeroise($thismonth, 2)] . ' ' . date('Y', $unixmonth) . '</caption>
-    <thead>
-    <tr>';
-
-    $day_abbrev = $weekday_initial;
-    if ($daylength > 1) {
-        $day_abbrev = $weekday_abbrev;
-    }
-
-    $myweek = array();
-	
-    for ($wdcount=0; $wdcount<=6; $wdcount++) {
-        $myweek[]=$weekday[($wdcount+$week_begins)%7];
-    }
-	
-    foreach ($myweek as $wd) {
-        echo "\n\t\t<th abbr=\"$wd\" scope=\"col\" title=\"$wd\">" . $day_abbrev[$wd] . '</th>';
-    }
-
-    echo '
-    </tr>
-    </thead>
-
-    <tfoot>
-    <tr>';
-
-    if ($previous) {
-        echo "\n\t\t".'<td abbr="' . $month[zeroise($previous->month, 2)] . '" colspan="3" id="prev"><a href="' .
-            get_month_link($previous->year, $previous->month) . '" title="' . sprintf(__('View posts for %1$s %2$s'), $month[zeroise($previous->month, 2)], date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year))) . '">&laquo; ' . $month_abbrev[$month[zeroise($previous->month, 2)]] . '</a></td>';
-    } else {
-        echo "\n\t\t".'<td colspan="3" id="prev" class="pad">&nbsp;</td>';
-    }
-
-    echo "\n\t\t".'<td class="pad">&nbsp;</td>';
-
-    if ($next) {
-        echo "\n\t\t".'<td abbr="' . $month[zeroise($next->month, 2)] . '" colspan="3" id="next"><a href="' .
-                get_month_link($next->year, $next->month) . '" title="View posts for ' . $month[zeroise($next->month, 2)] . ' ' .
-                date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year)) . '">' . $month_abbrev[$month[zeroise($next->month, 2)]] . ' &raquo;</a></td>';
-    } else {
-        echo "\n\t\t".'<td colspan="3" id="next" class="pad">&nbsp;</td>';
-    }
-
-    echo '
-    </tr>
-    </tfoot>
-
-    <tbody>
-    <tr>';
-
-    // Get days with posts
-    $dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
-            FROM $wpdb->posts WHERE MONTH(post_date) = $thismonth
-            AND YEAR(post_date) = $thisyear
-            AND post_status = 'publish'
-            AND post_date < '" . current_time('mysql') . '\'', ARRAY_N);
-    if ($dayswithposts) {
-        foreach ($dayswithposts as $daywith) {
-            $daywithpost[] = $daywith[0];
-        }
-    } else {
-        $daywithpost = array();
-    }
-
-
-
-    if (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE') ||
-          strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'camino') ||
-          strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'safari')) {
-        $ak_title_separator = "\n";
-    } else {
-        $ak_title_separator = ', ';
-    }
-
-    $ak_titles_for_day = array();
-    $ak_post_titles = $wpdb->get_results("SELECT post_title, DAYOFMONTH(post_date) as dom "
-                                         ."FROM $wpdb->posts "
-                                         ."WHERE YEAR(post_date) = '$thisyear' "
-                                         ."AND MONTH(post_date) = '$thismonth' "
-                                         ."AND post_date < '".current_time('mysql')."' "
-                                         ."AND post_status = 'publish'"
-                                        );
-    if ($ak_post_titles) {
-        foreach ($ak_post_titles as $ak_post_title) {
-            if (empty($ak_titles_for_day['day_'.$ak_post_title->dom])) {
-                $ak_titles_for_day['day_'.$ak_post_title->dom] = '';
-            }
-            if (empty($ak_titles_for_day["$ak_post_title->dom"])) { // first one
-                $ak_titles_for_day["$ak_post_title->dom"] = str_replace('"', '&quot;', wptexturize($ak_post_title->post_title));
-            } else {
-                $ak_titles_for_day["$ak_post_title->dom"] .= $ak_title_separator . str_replace('"', '&quot;', wptexturize($ak_post_title->post_title));
-            }
-        }
-    }
-
-
-    // See how much we should pad in the beginning
-    $pad = calendar_week_mod(date('w', $unixmonth)-$week_begins);
-    if (0 != $pad) echo "\n\t\t".'<td colspan="'.$pad.'" class="pad">&nbsp;</td>';
-
-    $daysinmonth = intval(date('t', $unixmonth));
-    for ($day = 1; $day <= $daysinmonth; ++$day) {
-        if (isset($newrow) && $newrow)
-            echo "\n\t</tr>\n\t<tr>\n\t\t";
-        $newrow = false;
-
-        if ($day == gmdate('j', (time() + (get_settings('gmt_offset') * 3600))) && $thismonth == gmdate('m', time()+(get_settings('gmt_offset') * 3600)) && $thisyear == gmdate('Y', time()+(get_settings('gmt_offset') * 3600)))
-            echo '<td id="today">';
-        else
-            echo '<td>';
-
-        if (in_array($day, $daywithpost)) { // any posts today?
-            echo '<a href="' . get_day_link($thisyear, $thismonth, $day) . "\" title=\"$ak_titles_for_day[$day]\">$day</a>";
-        } else {
-            echo $day;
-        }
-        echo '</td>';
-
-	if (6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins))
-            $newrow = true;
-    }
-
-    $pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins);
-    if ($pad != 0 && $pad != 7)
-        echo "\n\t\t".'<td class="pad" colspan="'.$pad.'">&nbsp;</td>';
+		if ( 6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins) )
+			$newrow = true;
+	}
+
+	$pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins);
+	if ( $pad != 0 && $pad != 7 )
+		echo "\n\t\t".'<td class="pad" colspan="'.$pad.'">&nbsp;</td>';
 
-    echo "\n\t</tr>\n\t</tbody>\n\t</table>";
+	echo "\n\t</tr>\n\t</tbody>\n\t</table>";
 }
 
+
 function allowed_tags() {
-    global $allowedtags;
+	global $allowedtags;
 	$allowed = '';
-    foreach($allowedtags as $tag => $attributes) {
-        $allowed .= '<'.$tag;
-        if (0 < count($attributes)) {
-            foreach ($attributes as $attribute => $limits) {
-                $allowed .= ' '.$attribute.'=""';
-            }
-        }
-        $allowed .= '> ';
-    }
-    return htmlentities($allowed);
+	foreach ( $allowedtags as $tag => $attributes ) {
+		$allowed .= '<'.$tag;
+		if ( 0 < count($attributes) ) {
+			foreach ( $attributes as $attribute => $limits ) {
+				$allowed .= ' '.$attribute.'=""';
+			}
+		}
+		$allowed .= '> ';
+	}
+	return htmlentities($allowed);
 }
 
+
 /***** Date/Time tags *****/
 
+
 function the_date_xml() {
-    global $post;
-    echo mysql2date('Y-m-d', $post->post_date);
-    //echo ""+$post->post_date;
+	global $post;
+	echo mysql2date('Y-m-d', $post->post_date);
+	//echo ""+$post->post_date;
 }
 
+
 function the_date($d='', $before='', $after='', $echo = true) {
-    global $id, $post, $day, $previousday, $newday;
-    $the_date = '';
-    if ($day != $previousday) {
-        $the_date .= $before;
-        if ($d=='') {
-	    $the_date .= mysql2date(get_settings('date_format'), $post->post_date);
-        } else {
-	    $the_date .= mysql2date($d, $post->post_date);
-        }
-        $the_date .= $after;
-        $previousday = $day;
-    }
-    $the_date = apply_filters('the_date', $the_date, $d, $before, $after);
-    if ($echo) {
-        echo $the_date;
-    } else {
-        return $the_date;
-    }
+	global $id, $post, $day, $previousday, $newday;
+	$the_date = '';
+	if ( $day != $previousday ) {
+		$the_date .= $before;
+		if ( $d=='' )
+			$the_date .= mysql2date(get_settings('date_format'), $post->post_date);
+		else
+			$the_date .= mysql2date($d, $post->post_date);
+		$the_date .= $after;
+		$previousday = $day;
+	}
+	$the_date = apply_filters('the_date', $the_date, $d, $before, $after);
+	if ( $echo )
+		echo $the_date;
+	else
+		return $the_date;
 }
 
+
 function the_time( $d = '' ) {
 	echo apply_filters('the_time', get_the_time( $d ), $d);
 }
 
+
 function get_the_time( $d = '' ) {
 	if ( '' == $d )
 		$the_time = get_post_time(get_settings('time_format'));
@@ -610,6 +640,7 @@
 	return apply_filters('get_the_time', $the_time, $d);
 }
 
+
 function get_post_time( $d = 'U', $gmt = false ) { // returns timestamp
 	global $post;
 	if ( $gmt )
@@ -621,24 +652,57 @@
 	return apply_filters('get_the_time', $time, $d, $gmt);
 }
 
+
+function the_modified_time($d = '') {
+	echo apply_filters('the_modified_time', get_the_modified_time($d), $d);
+}
+
+
+function get_the_modified_time($d = '') {
+	if ( '' == $d )
+		$the_time = get_post_modified_time(get_settings('time_format'));
+	else
+		$the_time = get_post_modified_time($d);
+	return apply_filters('get_the_modified_time', $the_time, $d);
+}
+
+
+function get_post_modified_time( $d = 'U', $gmt = false ) { // returns timestamp
+	global $post;
+
+	if ( $gmt )
+		$time = $post->post_modified_gmt;
+	else
+		$time = $post->post_modified;
+	$time = mysql2date($d, $time);
+
+	return apply_filters('get_the_modified_time', $time, $d, $gmt);
+}
+
+
 function the_weekday() {
-    global $weekday, $id, $post;
-    $the_weekday = $weekday[mysql2date('w', $post->post_date)];
-    $the_weekday = apply_filters('the_weekday', $the_weekday);
-    echo $the_weekday;
+	global $weekday, $id, $post;
+	$the_weekday = $weekday[mysql2date('w', $post->post_date)];
+	$the_weekday = apply_filters('the_weekday', $the_weekday);
+	echo $the_weekday;
 }
 
+
 function the_weekday_date($before='',$after='') {
-    global $weekday, $id, $post, $day, $previousweekday;
-    $the_weekday_date = '';
-    if ($day != $previousweekday) {
-        $the_weekday_date .= $before;
-        $the_weekday_date .= $weekday[mysql2date('w', $post->post_date)];
-        $the_weekday_date .= $after;
-        $previousweekday = $day;
-    }
-    $the_weekday_date = apply_filters('the_weekday_date', $the_weekday_date, $before, $after);
-    echo $the_weekday_date;
+	global $weekday, $id, $post, $day, $previousweekday;
+	$the_weekday_date = '';
+	if ( $day != $previousweekday ) {
+		$the_weekday_date .= $before;
+		$the_weekday_date .= $weekday[mysql2date('w', $post->post_date)];
+		$the_weekday_date .= $after;
+		$previousweekday = $day;
+	}
+	$the_weekday_date = apply_filters('the_weekday_date', $the_weekday_date, $before, $after);
+	echo $the_weekday_date;
+}
+
+function rsd_link() {
+	echo '<link rel="EditURI" type="application/rsd+xml" title="RSD" href="' . get_bloginfo('wpurl') . "/xmlrpc.php?rsd\" />\n";
 }
 
 ?>
diff -ruN 1.5.2/wp-includes/template-functions-links.php 2.0.4/wp-includes/template-functions-links.php
--- 1.5.2/wp-includes/template-functions-links.php	2005-05-13 16:11:26.000000000 -0500
+++ 2.0.4/wp-includes/template-functions-links.php	2006-06-01 00:48:36.000000000 -0500
@@ -1,27 +1,31 @@
 <?php
 
+
 function the_permalink() {
 	echo apply_filters('the_permalink', get_permalink());
 }
 
+
 function permalink_link() { // For backwards compatibility
 	echo apply_filters('the_permalink', get_permalink());
 }
 
+
 function permalink_anchor($mode = 'id') {
-    global $id, $post;
-    switch(strtolower($mode)) {
-        case 'title':
-            $title = sanitize_title($post->post_title) . '-' . $id;
-            echo '<a id="'.$title.'"></a>';
-            break;
-        case 'id':
-        default:
-            echo '<a id="post-'.$id.'"></a>';
-            break;
-    }
+	global $post;
+	switch ( strtolower($mode) ) {
+		case 'title':
+			$title = sanitize_title($post->post_title) . '-' . $id;
+			echo '<a id="'.$title.'"></a>';
+			break;
+		case 'id':
+		default:
+			echo '<a id="post-' . $post->ID . '"></a>';
+			break;
+	}
 }
 
+
 function get_permalink($id = 0) {
 	$rewritecode = array(
 		'%year%',
@@ -37,33 +41,36 @@
 		'%pagename%'
 	);
 
-	$post = & get_post($id);
-	if ($post->post_status == 'static') {
+	$post = &get_post($id);
+	if ( $post->post_status == 'static' )
 		return get_page_link($post->ID);
-	}
+	elseif ($post->post_status == 'attachment')
+		return get_attachment_link($post->ID);
 
 	$permalink = get_settings('permalink_structure');
 
-	if ('' != $permalink && 'draft' != $post->post_status) {
+	if ( '' != $permalink && 'draft' != $post->post_status ) {
 		$unixtime = strtotime($post->post_date);
 
 		$category = '';
-		if (strstr($permalink, '%category%')) {
+		if ( strstr($permalink, '%category%') ) {
 			$cats = get_the_category($post->ID);
 			$category = $cats[0]->category_nicename;
-			if ($parent=$cats[0]->category_parent) $category = get_category_parents($parent, FALSE, '/', TRUE) . $category;
+			if ( $parent=$cats[0]->category_parent )
+				$category = get_category_parents($parent, FALSE, '/', TRUE) . $category;
 		}
 
 		$authordata = get_userdata($post->post_author);
 		$author = $authordata->user_nicename;
+		$date = explode(" ",date('Y m d H i s', $unixtime));
 		$rewritereplace = 
 		array(
-			date('Y', $unixtime),
-			date('m', $unixtime),
-			date('d', $unixtime),
-			date('H', $unixtime),
-			date('i', $unixtime),
-			date('s', $unixtime),
+			$date[0],
+			$date[1],
+			$date[2],
+			$date[3],
+			$date[4],
+			$date[5],
 			$post->post_name,
 			$post->ID,
 			$category,
@@ -80,13 +87,12 @@
 function get_page_link($id = false) {
 	global $post, $wp_rewrite;
 
-	if (! $id) {
+	if ( !$id )
 		$id = $post->ID;
-	}
 
 	$pagestruct = $wp_rewrite->get_page_permastruct();
 
-	if ('' != $pagestruct) {
+	if ( '' != $pagestruct ) {
 		$link = get_page_uri($id);
 		$link = str_replace('%pagename%', $link, $pagestruct);
 		$link = get_settings('home') . "/$link/";
@@ -97,47 +103,77 @@
 	return apply_filters('page_link', $link, $id);
 }
 
+function get_attachment_link($id = false) {
+	global $post, $wp_rewrite;
+
+	$link = false;
+
+	if (! $id) {
+		$id = $post->ID;
+	}
+
+	$object = get_post($id);
+	if ( $wp_rewrite->using_permalinks() && ($object->post_parent > 0) ) {
+		$parent = get_post($object->post_parent);
+		$parentlink = get_permalink($object->post_parent);
+		if (! strstr($parentlink, '?') )
+			$link = trim($parentlink, '/') . '/' . $object->post_name . '/';
+	}
+
+	if (! $link ) {
+		$link = get_bloginfo('home') . "/?attachment_id=$id";
+	}
+
+	return apply_filters('attachment_link', $link, $id);
+}
+
 function get_year_link($year) {
 	global $wp_rewrite;
-    if (!$year) $year = gmdate('Y', time()+(get_settings('gmt_offset') * 3600));
-		$yearlink = $wp_rewrite->get_year_permastruct();
-    if (!empty($yearlink)) {
-        $yearlink = str_replace('%year%', $year, $yearlink);
-        return apply_filters('year_link', get_settings('home') . trailingslashit($yearlink), $year);
-    } else {
-        return apply_filters('year_link', get_settings('home') . '/?m=' . $year, $year);
-    }
+	if ( !$year )
+		$year = gmdate('Y', time()+(get_settings('gmt_offset') * 3600));
+	$yearlink = $wp_rewrite->get_year_permastruct();
+	if ( !empty($yearlink) ) {
+		$yearlink = str_replace('%year%', $year, $yearlink);
+		return apply_filters('year_link', get_settings('home') . trailingslashit($yearlink), $year);
+	} else {
+		return apply_filters('year_link', get_settings('home') . '/?m=' . $year, $year);
+	}
 }
 
 function get_month_link($year, $month) {
-    global $wp_rewrite;
-    if (!$year) $year = gmdate('Y', time()+(get_settings('gmt_offset') * 3600));
-    if (!$month) $month = gmdate('m', time()+(get_settings('gmt_offset') * 3600));
-		$monthlink = $wp_rewrite->get_month_permastruct();
-    if (!empty($monthlink)) {
-        $monthlink = str_replace('%year%', $year, $monthlink);
-        $monthlink = str_replace('%monthnum%', zeroise(intval($month), 2), $monthlink);
-        return apply_filters('month_link', get_settings('home') . trailingslashit($monthlink), $year, $month);
-    } else {
-        return apply_filters('month_link', get_settings('home') . '/?m=' . $year . zeroise($month, 2), $year, $month);
-    }
+	global $wp_rewrite;
+	if ( !$year )
+		$year = gmdate('Y', time()+(get_settings('gmt_offset') * 3600));
+	if ( !$month )
+		$month = gmdate('m', time()+(get_settings('gmt_offset') * 3600));
+	$monthlink = $wp_rewrite->get_month_permastruct();
+	if ( !empty($monthlink) ) {
+		$monthlink = str_replace('%year%', $year, $monthlink);
+		$monthlink = str_replace('%monthnum%', zeroise(intval($month), 2), $monthlink);
+		return apply_filters('month_link', get_settings('home') . trailingslashit($monthlink), $year, $month);
+	} else {
+		return apply_filters('month_link', get_settings('home') . '/?m=' . $year . zeroise($month, 2), $year, $month);
+	}
 }
 
 function get_day_link($year, $month, $day) {
-    global $wp_rewrite;
-    if (!$year) $year = gmdate('Y', time()+(get_settings('gmt_offset') * 3600));
-    if (!$month) $month = gmdate('m', time()+(get_settings('gmt_offset') * 3600));
-    if (!$day) $day = gmdate('j', time()+(get_settings('gmt_offset') * 3600));
-
-		$daylink = $wp_rewrite->get_day_permastruct();
-    if (!empty($daylink)) {
-        $daylink = str_replace('%year%', $year, $daylink);
-        $daylink = str_replace('%monthnum%', zeroise(intval($month), 2), $daylink);
-        $daylink = str_replace('%day%', zeroise(intval($day), 2), $daylink);
-        return apply_filters('day_link', get_settings('home') . trailingslashit($daylink), $year, $month, $day);
-    } else {
-        return apply_filters('day_link', get_settings('home') . '/?m=' . $year . zeroise($month, 2) . zeroise($day, 2), $year, $month, $day);
-    }
+	global $wp_rewrite;
+	if ( !$year )
+		$year = gmdate('Y', time()+(get_settings('gmt_offset') * 3600));
+	if ( !$month )
+		$month = gmdate('m', time()+(get_settings('gmt_offset') * 3600));
+	if ( !$day )
+		$day = gmdate('j', time()+(get_settings('gmt_offset') * 3600));
+
+	$daylink = $wp_rewrite->get_day_permastruct();
+	if ( !empty($daylink) ) {
+		$daylink = str_replace('%year%', $year, $daylink);
+		$daylink = str_replace('%monthnum%', zeroise(intval($month), 2), $daylink);
+		$daylink = str_replace('%day%', zeroise(intval($day), 2), $daylink);
+		return apply_filters('day_link', get_settings('home') . trailingslashit($daylink), $year, $month, $day);
+	} else {
+		return apply_filters('day_link', get_settings('home') . '/?m=' . $year . zeroise($month, 2) . zeroise($day, 2), $year, $month, $day);
+	}
 }
 
 function get_feed_link($feed='rss2') {
@@ -147,7 +183,7 @@
 	$comment_feed_url = $feed_url;
 
 	$permalink = $wp_rewrite->get_feed_permastruct();
-	if ('' != $permalink) {
+	if ( '' != $permalink ) {
 		if ( false !== strpos($feed, 'comments_') ) {
 			$feed = str_replace('comments_', '', $feed);
 			$permalink = $wp_rewrite->get_comment_feed_permastruct();
@@ -170,29 +206,28 @@
 }
 
 function edit_post_link($link = 'Edit This', $before = '', $after = '') {
-    global $user_ID, $post;
+	global $post;
 
-    get_currentuserinfo();
+	if ( ! current_user_can('edit_post', $post->ID) )
+		return;
 
-	if (!user_can_edit_post($user_ID, $post->ID)) {
-        return;
-    }
+	if ( is_attachment() )
+		return;
+	else
+		$file = 'post';
 
-    $location = get_settings('siteurl') . "/wp-admin/post.php?action=edit&amp;post=$post->ID";
-    echo "$before <a href=\"$location\">$link</a> $after";
+	$location = get_settings('siteurl') . "/wp-admin/{$file}.php?action=edit&amp;post=$post->ID";
+	echo $before . "<a href=\"$location\">$link</a>" . $after;
 }
 
 function edit_comment_link($link = 'Edit This', $before = '', $after = '') {
-    global $user_ID, $post, $comment;
-
-    get_currentuserinfo();
+	global $post, $comment;
 
-	if (!user_can_edit_post_comments($user_ID, $post->ID)) {
-        return;
-    }
+	if ( ! current_user_can('edit_post', $post->ID) )
+		return;
 
-    $location = get_settings('siteurl') . "/wp-admin/post.php?action=editcomment&amp;comment=$comment->comment_ID";
-    echo "$before <a href='$location'>$link</a> $after";
+	$location = get_settings('siteurl') . "/wp-admin/post.php?action=editcomment&amp;comment=$comment->comment_ID";
+	echo $before . "<a href='$location'>$link</a>" . $after;
 }
 
 // Navigation links
@@ -200,27 +235,26 @@
 function get_previous_post($in_same_cat = false, $excluded_categories = '') {
 	global $post, $wpdb;
 
-	if(! is_single()) {
+	if( !is_single() || is_attachment() )
 		return null;
-	}
-    
+
 	$current_post_date = $post->post_date;
-    
+
 	$join = '';
-	if ($in_same_cat) {
+	if ( $in_same_cat ) {
 		$join = " INNER JOIN $wpdb->post2cat ON $wpdb->posts.ID= $wpdb->post2cat.post_id ";
 		$cat_array = get_the_category($post->ID);
-	 	$join .= ' AND (category_id = ' . intval($cat_array[0]->cat_ID);
-		for ($i = 1; $i < (count($cat_array)); $i++) {
+		$join .= ' AND (category_id = ' . intval($cat_array[0]->cat_ID);
+		for ( $i = 1; $i < (count($cat_array)); $i++ ) {
 			$join .= ' OR category_id = ' . intval($cat_array[$i]->cat_ID);
 		}
 		$join .= ')'; 
 	}
 
 	$sql_exclude_cats = '';
-	if (!empty($excluded_categories)) {
+	if ( !empty($excluded_categories) ) {
 		$blah = explode('and', $excluded_categories);
-		foreach($blah as $category) {
+		foreach ( $blah as $category ) {
 			$category = intval($category);
 			$sql_exclude_cats .= " AND post_category != $category";
 		}
@@ -232,78 +266,74 @@
 function get_next_post($in_same_cat = false, $excluded_categories = '') {
 	global $post, $wpdb;
 
-	if(! is_single()) {
+	if( !is_single() || is_attachment() )
 		return null;
-	}
 
 	$current_post_date = $post->post_date;
-    
+	
 	$join = '';
-	if ($in_same_cat) {
+	if ( $in_same_cat ) {
 		$join = " INNER JOIN $wpdb->post2cat ON $wpdb->posts.ID= $wpdb->post2cat.post_id ";
 		$cat_array = get_the_category($post->ID);
-	 	$join .= ' AND (category_id = ' . intval($cat_array[0]->cat_ID);
-		for ($i = 1; $i < (count($cat_array)); $i++) {
+		$join .= ' AND (category_id = ' . intval($cat_array[0]->cat_ID);
+		for ( $i = 1; $i < (count($cat_array)); $i++ ) {
 			$join .= ' OR category_id = ' . intval($cat_array[$i]->cat_ID);
 		}
 		$join .= ')'; 
 	}
 
 	$sql_exclude_cats = '';
-	if (!empty($excluded_categories)) {
+	if ( !empty($excluded_categories) ) {
 		$blah = explode('and', $excluded_categories);
-		foreach($blah as $category) {
+		foreach ( $blah as $category ) {
 			$category = intval($category);
 			$sql_exclude_cats .= " AND post_category != $category";
 		}
 	}
 
 	$now = current_time('mysql');
-    
+	
 	return @$wpdb->get_row("SELECT ID,post_title FROM $wpdb->posts $join WHERE post_date > '$current_post_date' AND post_date < '$now' AND post_status = 'publish' $sqlcat $sql_exclude_cats AND ID != $post->ID ORDER BY post_date ASC LIMIT 1");
 }
 
-function previous_post_link($format='&laquo; %link', $link='%title', $in_same_cat = false, $excluded_categories = '') {
-  $post = get_previous_post($in_same_cat, $excluded_categories);
-
-  if(! $post) {
-    return;
-  }
 
-  $title = apply_filters('the_title', $post->post_title, $post);
+function previous_post_link($format='&laquo; %link', $link='%title', $in_same_cat = false, $excluded_categories = '') {
 
-  $string = '<a href="'.get_permalink($post->ID).'">';
+	if ( is_attachment() )
+		$post = & get_post($GLOBALS['post']->post_parent);
+	else
+		$post = get_previous_post($in_same_cat, $excluded_categories);
 
-  $link = str_replace('%title', $title, $link);
+	if ( !$post )
+		return;
 
-  $link = $string . $link . '</a>';
+	$title = apply_filters('the_title', $post->post_title, $post);
+	$string = '<a href="'.get_permalink($post->ID).'">';
+	$link = str_replace('%title', $title, $link);
+	$link = $pre . $string . $link . '</a>';
 
-  $format = str_replace('%link', $link, $format);
+	$format = str_replace('%link', $link, $format);
 
-  echo $format;	    
+	echo $format;	    
 }
 
 function next_post_link($format='%link &raquo;', $link='%title', $in_same_cat = false, $excluded_categories = '') {
-  $post = get_next_post($in_same_cat, $excluded_categories);
-
-  if(! $post) {
-    return;
-  }
-
-  $title = apply_filters('the_title', $post->post_title, $post);
+	$post = get_next_post($in_same_cat, $excluded_categories);
 
-  $string = '<a href="'.get_permalink($post->ID).'">';
+	if ( !$post )
+		return;
 
-  $link = str_replace('%title', $title, $link);
+	$title = apply_filters('the_title', $post->post_title, $post);
+	$string = '<a href="'.get_permalink($post->ID).'">';
+	$link = str_replace('%title', $title, $link);
+	$link = $string . $link . '</a>';
+	$format = str_replace('%link', $link, $format);
 
-  $link = $string . $link . '</a>';
-
-  $format = str_replace('%link', $link, $format);
-
-  echo $format;	    
+	echo $format;	    
 }
 
-// Deprecated.  Use previous_post_link().
+
+// Deprecated.	Use previous_post_link().
 function previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') {
 
 	if ( empty($in_same_cat) || 'no' == $in_same_cat )
@@ -311,39 +341,35 @@
 	else
 		$in_same_cat = true;
 
-  $post = get_previous_post($in_same_cat, $excluded_categories);
+	$post = get_previous_post($in_same_cat, $excluded_categories);
 
-  if(! $post) {
-    return;
-  }
+	if ( !$post )
+		return;
 
 	$string = '<a href="'.get_permalink($post->ID).'">'.$previous;
-	if ($title == 'yes') {
+	if ( 'yes' == $title )
 		$string .= apply_filters('the_title', $post->post_title, $post);
-	}
 	$string .= '</a>';
 	$format = str_replace('%', $string, $format);
 	echo $format;
 }
 
-// Deprecated.  Use next_post_link().
+// Deprecated.	Use next_post_link().
 function next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') {
-	
+
 	if ( empty($in_same_cat) || 'no' == $in_same_cat )
 		$in_same_cat = false;
 	else
 		$in_same_cat = true;
 
-  $post = get_next_post($in_same_cat, $excluded_categories);
+	$post = get_next_post($in_same_cat, $excluded_categories);
 
-  if(! $post) {
-    return;
-  }
+	if ( !$post	)
+		return;
 
 	$string = '<a href="'.get_permalink($post->ID).'">'.$next;
-	if ($title=='yes') {
+	if ( 'yes' == $title )
 		$string .= apply_filters('the_title', $post->post_title, $nextpost);
-	}
 	$string .= '</a>';
 	$format = str_replace('%', $string, $format);
 	echo $format;
@@ -352,7 +378,7 @@
 function get_pagenum_link($pagenum = 1) {
 	global $wp_rewrite;
 
-	$qstr = $_SERVER['REQUEST_URI'];
+	$qstr = wp_specialchars($_SERVER['REQUEST_URI']);
 
 	$page_querystring = "paged"; 
 	$page_modstring = "page/";
@@ -370,11 +396,11 @@
 	$index = preg_replace('|^/+|', '', $index);
 
 	// if we already have a QUERY style page string
-	if( stristr( $qstr, $page_querystring ) ) {
+	if ( stristr( $qstr, $page_querystring ) ) {
 		$replacement = "$page_querystring=$pagenum";
 		$qstr = preg_replace("/".$page_querystring."[^\d]+\d+/", $replacement, $qstr);
 		// if we already have a mod_rewrite style page string
-	} elseif ( preg_match( '|'.$page_modregex.'\d+|', $qstr ) ){
+	} elseif ( preg_match( '|'.$page_modregex.'\d+|', $qstr ) ) {
 		$permalink = 1;
 		$qstr = preg_replace('|'.$page_modregex.'\d+|',"$page_modstring$pagenum",$qstr);
 
@@ -383,110 +409,119 @@
 	} else {
 		// we need to know the way queries are being written
 		// if there's a querystring_start (a "?" usually), it's definitely not mod_rewritten
-		if ( stristr( $qstr, '?' ) ){
+		if ( stristr( $qstr, '?' ) ) {
 			// so append the query string (using &, since we already have ?)
-			$qstr .=  '&amp;' . $page_querystring . '=' . $pagenum;
+			$qstr .=	'&amp;' . $page_querystring . '=' . $pagenum;
 			// otherwise, it could be rewritten, OR just the default index ...
-		} elseif( '' != get_settings('permalink_structure') && ! is_admin()) {
+		} elseif( '' != get_settings('permalink_structure') && ! is_admin() ) {
 			$permalink = 1;
 			$index = $wp_rewrite->index;
 			// If it's not a path info permalink structure, trim the index.
-			if (! $wp_rewrite->using_index_permalinks()) {
+			if ( !$wp_rewrite->using_index_permalinks() ) {
 				$qstr = preg_replace("#/*" . $index . "/*#", '/', $qstr);
 			} else {
 				// If using path info style permalinks, make sure the index is in
 				// the URI.
-				if (strpos($qstr, $index) === false) {
+				if ( strpos($qstr, $index) === false )
 					$qstr = '/' . $index . $qstr;
-				}
 			}
 
-			$qstr =  trailingslashit($qstr) . $page_modstring . $pagenum;
+			$qstr =	trailingslashit($qstr) . $page_modstring . $pagenum;
 		} else {
 			$qstr = $index . '?' . $page_querystring . '=' . $pagenum;
 		}
 	}
 
 	$qstr = preg_replace('|^/+|', '', $qstr);
-	if ($permalink) $qstr = trailingslashit($qstr);
-	return preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', trailingslashit( get_settings('home') ) . $qstr );
+	if ( $permalink )
+		$qstr = trailingslashit($qstr);
+	$qstr = preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', trailingslashit( get_settings('home') ) . $qstr );
+	
+	// showing /page/1/ or ?paged=1 is redundant
+	if ( 1 === $pagenum ) {
+		$qstr = str_replace('page/1/', '', $qstr); // for mod_rewrite style
+		$qstr = remove_query_arg('paged', $qstr); // for query style
+	}
+	return $qstr;
 }
 
 function next_posts($max_page = 0) { // original by cfactor at cooltux.org
-    global $paged, $pagenow;
+	global $paged, $pagenow;
 
-     if (! is_single()) {
-         if (!$paged) $paged = 1;
-         $nextpage = intval($paged) + 1;
-         if (!$max_page || $max_page >= $nextpage) {
-             echo get_pagenum_link($nextpage);
-         }         
-     }
+	if ( !is_single() ) {
+		if ( !$paged )
+			$paged = 1;
+		$nextpage = intval($paged) + 1;
+		if ( !$max_page || $max_page >= $nextpage )
+			echo get_pagenum_link($nextpage);
+	}
 }
 
 function next_posts_link($label='Next Page &raquo;', $max_page=0) {
 	global $paged, $result, $request, $posts_per_page, $wpdb, $max_num_pages;
-    if (!$max_page) {
+	if ( !$max_page ) {
 			if ( isset($max_num_pages) ) {
 				$max_page = $max_num_pages;
 			} else {
-        preg_match('#FROM (.*) GROUP BY#', $request, $matches);
-        $fromwhere = $matches[1];
-        $numposts = $wpdb->get_var("SELECT COUNT(ID) FROM $fromwhere");
-        $max_page = $max_num_pages = ceil($numposts / $posts_per_page);
+				preg_match('#FROM\s(.*)\sGROUP BY#siU', $request, $matches);
+				$fromwhere = $matches[1];
+				$numposts = $wpdb->get_var("SELECT COUNT(DISTINCT ID) FROM $fromwhere");
+				$max_page = $max_num_pages = ceil($numposts / $posts_per_page);
 			}
-    }
-    if (!$paged)
-        $paged = 1;
-    $nextpage = intval($paged) + 1;
-    if ((! is_single()) && (empty($paged) || $nextpage <= $max_page)) {
-        echo '<a href="';
-        next_posts($max_page);
-        echo '">'. preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', $label) .'</a>';
-    }
+	}
+	if ( !$paged )
+		$paged = 1;
+	$nextpage = intval($paged) + 1;
+	if ( (! is_single()) && (empty($paged) || $nextpage <= $max_page) ) {
+		echo '<a href="';
+		next_posts($max_page);
+		echo '">'. preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', $label) .'</a>';
+	}
 }
 
 
 function previous_posts() { // original by cfactor at cooltux.org
-    global $_SERVER, $paged, $pagenow;
+	global $paged, $pagenow;
 
-     if (! is_single()) {
-         $nextpage = intval($paged) - 1;
-         if ($nextpage < 1) $nextpage = 1;
-         echo get_pagenum_link($nextpage);
-     }
+	if ( !is_single() ) {
+		$nextpage = intval($paged) - 1;
+		if ( $nextpage < 1 )
+			$nextpage = 1;
+		echo get_pagenum_link($nextpage);
+	}
 }
 
+
 function previous_posts_link($label='&laquo; Previous Page') {
-    global $paged;
-    if ((! is_single())  && ($paged > 1) ) {
-        echo '<a href="';
-        previous_posts();
-        echo '">'. preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', $label) .'</a>';
-    }
+	global $paged;
+	if ( (!is_single())	&& ($paged > 1) ) {
+		echo '<a href="';
+		previous_posts();
+		echo '">'. preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', $label) .'</a>';
+	}
 }
 
 function posts_nav_link($sep=' &#8212; ', $prelabel='&laquo; Previous Page', $nxtlabel='Next Page &raquo;') {
 	global $request, $posts_per_page, $wpdb, $max_num_pages;
-	if (! is_single()) {
+	if ( !is_single() ) {
 
-		if (get_query_var('what_to_show') == 'posts') {
-			if ( ! isset($max_num_pages) ) {
-				preg_match('#FROM (.*) GROUP BY#', $request, $matches);
+		if ( 'posts' == get_query_var('what_to_show') ) {
+			if ( !isset($max_num_pages) ) {
+				preg_match('#FROM\s(.*)\sGROUP BY#siU', $request, $matches);
 				$fromwhere = $matches[1];
-				$numposts = $wpdb->get_var("SELECT COUNT(ID) FROM $fromwhere");
+				$numposts = $wpdb->get_var("SELECT COUNT(DISTINCT ID) FROM $fromwhere");
 				$max_num_pages = ceil($numposts / $posts_per_page);
 			}
 		} else {
 			$max_num_pages = 999999;
 		}
 
-        if ($max_num_pages > 1) {
-            previous_posts_link($prelabel);
-            echo preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', $sep);
-            next_posts_link($nxtlabel, $max_page);
-        }
-    }
+		if ( $max_num_pages > 1 ) {
+			previous_posts_link($prelabel);
+			echo preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', $sep);
+			next_posts_link($nxtlabel, $max_page);
+		}
+	}
 }
 
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-includes/template-functions-post.php 2.0.4/wp-includes/template-functions-post.php
--- 1.5.2/wp-includes/template-functions-post.php	2005-05-13 16:09:21.000000000 -0500
+++ 2.0.4/wp-includes/template-functions-post.php	2006-01-25 01:38:43.000000000 -0600
@@ -1,107 +1,114 @@
 <?php
 
 function get_the_password_form() {
-    $output = '<form action="' . get_settings('siteurl') . '/wp-pass.php" method="post">
-    <p>' . __("This post is password protected. To view it please enter your password below:") . '</p>
-    <p><label>' . __("Password:") . ' <input name="post_password" type="password" size="20" /></label> <input type="submit" name="Submit" value="Submit" /></p>
-    </form>
-    ';
+	$output = '<form action="' . get_settings('siteurl') . '/wp-pass.php" method="post">
+	<p>' . __("This post is password protected. To view it please enter your password below:") . '</p>
+	<p><label>' . __("Password:") . ' <input name="post_password" type="password" size="20" /></label> <input type="submit" name="Submit" value="' . __("Submit") . '" /></p>
+	</form>
+	';
 	return $output;
 }
 
+
 function the_ID() {
 	global $id;
 	echo $id;
 }
 
+
 function the_title($before = '', $after = '', $echo = true) {
 	$title = get_the_title();
 	if ( strlen($title) > 0 ) {
 		$title = apply_filters('the_title', $before . $title . $after, $before, $after);
-		if ($echo)
+		if ( $echo )
 			echo $title;
 		else
 			return $title;
 	}
 }
 
+
 function get_the_title($id = 0) {
 	$post = &get_post($id);
 
 	$title = $post->post_title;
-	if (!empty($post->post_password))
+	if ( !empty($post->post_password) )
 		$title = sprintf(__('Protected: %s'), $title);
 
 	return $title;
 }
 
+
 function get_the_guid( $id = 0 ) {
 	$post = &get_post($id);
-	
+
 	return apply_filters('get_the_guid', $post->guid);
 }
 
+
 function the_guid( $id = 0 ) {
 	echo get_the_guid($id);
 }
 
 
 function the_content($more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
-    $content = get_the_content($more_link_text, $stripteaser, $more_file);
-    $content = apply_filters('the_content', $content);
-    $content = str_replace(']]>', ']]&gt;', $content);
-    echo $content;
+	$content = get_the_content($more_link_text, $stripteaser, $more_file);
+	$content = apply_filters('the_content', $content);
+	$content = str_replace(']]>', ']]&gt;', $content);
+	echo $content;
 }
 
+
 function get_the_content($more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
-    global $id, $post, $more, $single, $withcomments, $page, $pages, $multipage, $numpages;
-    global $preview;
-    global $pagenow;
-    $output = '';
-
-    if (!empty($post->post_password)) { // if there's a password
-        if (stripslashes($_COOKIE['wp-postpass_'.COOKIEHASH]) != $post->post_password) {  // and it doesn't match the cookie
-            $output = get_the_password_form();
-            return $output;
-        }
-    }
-
-    if ($more_file != '') {
-        $file = $more_file;
-    } else {
-        $file = $pagenow; //$_SERVER['PHP_SELF'];
-    }
-    $content = $pages[$page-1];
-    $content = explode('<!--more-->', $content, 2);
-    if ((preg_match('/<!--noteaser-->/', $post->post_content) && ((!$multipage) || ($page==1))))
-        $stripteaser = 1;
-    $teaser = $content[0];
-    if (($more) && ($stripteaser))
-        $teaser = '';
-    $output .= $teaser;
-    if (count($content)>1) {
-        if ($more) {
-            $output .= '<a id="more-'.$id.'"></a>'.$content[1];
-        } else {
-            $output .= ' <a href="'. get_permalink() . "#more-$id\">$more_link_text</a>";
-        }
-    }
-    if ($preview) { // preview fix for javascript bug with foreign languages
-        $output =  preg_replace('/\%u([0-9A-F]{4,4})/e',  "'&#'.base_convert('\\1',16,10).';'", $output);
-    }
-    return $output;
+	global $id, $post, $more, $single, $withcomments, $page, $pages, $multipage, $numpages;
+	global $preview;
+	global $pagenow;
+	$output = '';
+
+	if ( !empty($post->post_password) ) { // if there's a password
+		if ( stripslashes($_COOKIE['wp-postpass_'.COOKIEHASH]) != $post->post_password ) {	// and it doesn't match the cookie
+			$output = get_the_password_form();
+			return $output;
+		}
+	}
+
+	if ( $more_file != '' )
+		$file = $more_file;
+	else
+		$file = $pagenow; //$_SERVER['PHP_SELF'];
+
+	$content = $pages[$page-1];
+	$content = explode('<!--more-->', $content, 2);
+	if ( (preg_match('/<!--noteaser-->/', $post->post_content) && ((!$multipage) || ($page==1))) )
+		$stripteaser = 1;
+	$teaser = $content[0];
+	if ( ($more) && ($stripteaser) )
+		$teaser = '';
+	$output .= $teaser;
+	if ( count($content) > 1 ) {
+		if ( $more )
+			$output .= '<a id="more-'.$id.'"></a>'.$content[1];
+		else
+			$output .= ' <a href="'. get_permalink() . "#more-$id\">$more_link_text</a>";
+	}
+	if ( $preview ) // preview fix for javascript bug with foreign languages
+		$output =	preg_replace('/\%u([0-9A-F]{4,4})/e',	"'&#'.base_convert('\\1',16,10).';'", $output);
+
+	return $output;
 }
 
+
 function the_excerpt() {
 	echo apply_filters('the_excerpt', get_the_excerpt());
 }
 
+
 function get_the_excerpt($fakeit = true) {
 	global $id, $post;
 	$output = '';
 	$output = $post->post_excerpt;
-	if (!empty($post->post_password)) { // if there's a password
-		if ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) {  // and it doesn't match the cookie
+	if ( !empty($post->post_password) ) { // if there's a password
+		if ( $_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password ) {  // and it doesn't match the cookie
 			$output = __('There is no excerpt because this is a protected post.');
 			return $output;
 		}
@@ -110,135 +117,149 @@
 	return apply_filters('get_the_excerpt', $output);
 }
 
+
 function wp_link_pages($args = '') {
 	parse_str($args, $r);
-	if (!isset($r['before'])) $r['before'] = '<p>' . __('Pages:');
-	if (!isset($r['after'])) $r['after'] = '</p>';
-	if (!isset($r['next_or_number'])) $r['next_or_number'] = 'number';
-	if (!isset($r['nextpagelink'])) $r['nextpagelink'] = 'Next page';
-	if (!isset($r['previouspagelink'])) $r['previouspagelink'] = 'Previous page';
-	if (!isset($r['pagelink'])) $r['pagelink'] = '%';
-	if (!isset($r['more_file'])) $r['more_file'] = '';
+	if ( !isset($r['before']) )
+		$r['before'] = '<p>' . __('Pages:');
+	if ( !isset($r['after']) )
+		$r['after'] = '</p>';
+	if ( !isset($r['next_or_number']) )
+		$r['next_or_number'] = 'number';
+	if ( !isset($r['nextpagelink']) )
+		$r['nextpagelink'] = 'Next page';
+	if ( !isset($r['previouspagelink']) )
+		$r['previouspagelink'] = 'Previous page';
+	if ( !isset($r['pagelink']) )
+		$r['pagelink'] = '%';
+	if ( !isset($r['more_file']) )
+		$r['more_file'] = '';
+
 	link_pages($r['before'], $r['after'], $r['next_or_number'], $r['nextpagelink'], $r['previouspagelink'], $r['pagelink'], $r['more_file']);
 }
 
+
 function link_pages($before='<br />', $after='<br />', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page', $pagelink='%', $more_file='') {
-    global $id, $page, $numpages, $multipage, $more;
-    global $pagenow;
-    if ($more_file != '') {
-        $file = $more_file;
-    } else {
-        $file = $pagenow;
-    }
-    if (($multipage)) {
-        if ($next_or_number=='number') {
-            echo $before;
-            for ($i = 1; $i < ($numpages+1); $i = $i + 1) {
-                $j=str_replace('%',"$i",$pagelink);
-                echo ' ';
-                if (($i != $page) || ((!$more) && ($page==1))) {
-                    if ('' == get_settings('permalink_structure')) {
-                        echo '<a href="' . get_permalink() . '&amp;page=' . $i . '">';
-                    } else {
-                        echo '<a href="' . trailingslashit( get_permalink() ) . $i . '/">';
-                    }
-                }
-                echo $j;
-                if (($i != $page) || ((!$more) && ($page==1)))
-                    echo '</a>';
-            }
-            echo $after;
-        } else {
-            if ($more) {
-                echo $before;
-                $i=$page-1;
-                if ($i && $more) {
-                    if ('' == get_settings('permalink_structure')) {
-                        echo '<a href="' . get_permalink() . '&amp;page=' . $i . '">'.$previouspagelink.'</a>';
-                    } else {
-                        echo '<a href="' . get_permalink() . $i . '/">'.$previouspagelink.'</a>';
-                    }
-                }
-                $i=$page+1;
-                if ($i<=$numpages && $more) {
-                    if ('' == get_settings('permalink_structure')) {
-                        echo '<a href="'.get_permalink() . '&amp;page=' . $i . '">'.$nextpagelink.'</a>';
-                    } else {
-                        echo '<a href="'.get_permalink().$i.'/">'.$nextpagelink.'</a>';
-                    }
-                }
-                echo $after;
-            }
-        }
-    }
+	global $id, $page, $numpages, $multipage, $more, $pagenow;
+	if ( $more_file != '' )
+		$file = $more_file;
+	else
+		$file = $pagenow;
+	if ( $multipage ) {
+		if ( 'number' == $next_or_number ) {
+			echo $before;
+			for ( $i = 1; $i < ($numpages+1); $i = $i + 1 ) {
+				$j = str_replace('%',"$i",$pagelink);
+				echo ' ';
+				if ( ($i != $page) || ((!$more) && ($page==1)) ) {
+					if ( '' == get_settings('permalink_structure') )
+						echo '<a href="' . get_permalink() . '&amp;page=' . $i . '">';
+					else
+						echo '<a href="' . trailingslashit( get_permalink() ) . $i . '/">';
+				}
+				echo $j;
+				if ( ($i != $page) || ((!$more) && ($page==1)) )
+					echo '</a>';
+			}
+			echo $after;
+		} else {
+			if ( $more ) {
+				echo $before;
+				$i = $page - 1;
+				if ( $i && $more ) {
+					if ( '' == get_settings('permalink_structure') )
+						echo '<a href="' . get_permalink() . '&amp;page=' . $i . '">'.$previouspagelink.'</a>';
+					else
+						echo '<a href="' . get_permalink() . $i . '/">'.$previouspagelink.'</a>';
+				}
+				$i = $page + 1;
+				if ( $i <= $numpages && $more ) {
+					if ( '' == get_settings('permalink_structure') )
+						echo '<a href="'.get_permalink() . '&amp;page=' . $i . '">'.$nextpagelink.'</a>';
+					else
+						echo '<a href="'.get_permalink().$i.'/">'.$nextpagelink.'</a>';
+				}
+				echo $after;
+			}
+		}
+	}
 }
 
+
 /*
- * Post-meta: Custom per-post fields.
- */
- 
+Post-meta: Custom per-post fields.
+*/
+
+
 function get_post_custom( $post_id = 0 ) {
 	global $id, $post_meta_cache, $wpdb;
-	if ( $post_id )
-		$id = $post_id;
-	if ( isset($post_meta_cache[$id]) ) {
-		return $post_meta_cache[$id];
-	} else {
-	if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta  WHERE post_id = '$id' ORDER BY post_id, meta_key", ARRAY_A) ) {
-		
-	// Change from flat structure to hierarchical:
-	$post_meta_cache = array();
-		foreach ($meta_list as $metarow) {
+
+	if ( ! $post_id )
+		$post_id = $id;
+
+	if ( isset($post_meta_cache[$post_id]) )
+		return $post_meta_cache[$post_id];
+
+	if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta	WHERE post_id = '$post_id' ORDER BY post_id, meta_key", ARRAY_A) ) {
+		// Change from flat structure to hierarchical:
+		$post_meta_cache = array();
+		foreach ( $meta_list as $metarow ) {
 			$mpid = $metarow['post_id'];
 			$mkey = $metarow['meta_key'];
 			$mval = $metarow['meta_value'];
-			
+
 			// Force subkeys to be array type:
-			if (!isset($post_meta_cache[$mpid]) || !is_array($post_meta_cache[$mpid]))
-			$post_meta_cache[$mpid] = array();
-			if (!isset($post_meta_cache[$mpid]["$mkey"]) || !is_array($post_meta_cache[$mpid]["$mkey"]))
-			$post_meta_cache[$mpid]["$mkey"] = array();
-			
+			if ( !isset($post_meta_cache[$mpid]) || !is_array($post_meta_cache[$mpid]) )
+				$post_meta_cache[$mpid] = array();
+				
+			if ( !isset($post_meta_cache[$mpid]["$mkey"]) || !is_array($post_meta_cache[$mpid]["$mkey"]) )
+				$post_meta_cache[$mpid]["$mkey"] = array();
+
 			// Add a value to the current pid/key:
 			$post_meta_cache[$mpid][$mkey][] = $mval;
 		}
-	return $post_meta_cache[$mpid];
-    }
+		return $post_meta_cache[$mpid];
 	}
 }
 
+
 function get_post_custom_keys() {
-	global $id, $post_meta_cache;
-	
-	if (!is_array($post_meta_cache[$id]))
+	$custom = get_post_custom();
+
+	if ( ! is_array($custom) )
 		return;
-	if ($keys = array_keys($post_meta_cache[$id]))
+
+	if ( $keys = array_keys($custom) )
 		return $keys;
 }
 
-function get_post_custom_values($key='') {
-	global $id, $post_meta_cache;
 
-	return $post_meta_cache[$id][$key];
+function get_post_custom_values( $key = '' ) {
+	$custom = get_post_custom();
+
+	return $custom[$key];
 }
 
+
 function post_custom( $key = '' ) {
-	global $id, $post_meta_cache;
-	
-	if ( 1 == count($post_meta_cache[$id][$key]) ) return $post_meta_cache[$id][$key][0];
-	else return $post_meta_cache[$id][$key];
+	$custom = get_post_custom();
+
+	if ( 1 == count($custom[$key]) )
+		return $custom[$key][0];
+	else
+		return $custom[$key];
 }
 
+
 // this will probably change at some point...
 function the_meta() {
 	global $id, $post_meta_cache;
-	
-	if ($keys = get_post_custom_keys()) {
+
+	if ( $keys = get_post_custom_keys() ) {
 		echo "<ul class='post-meta'>\n";
-		foreach ($keys as $key) {
-			$values = array_map('trim',$post_meta_cache[$id][$key]);
+		foreach ( $keys as $key ) {
+			$values = array_map('trim', get_post_custom_values($key));
 			$value = implode($values,', ');
-			
 			echo "<li><span class='post-meta-key'>$key:</span> $value</li>\n";
 		}
 		echo "</ul>\n";
@@ -246,9 +267,10 @@
 }
 
 
-//
-// Pages
-//
+/*
+Pages
+*/
+
 
 function &get_page_children($page_id, $pages) {
 	global $page_cache;
@@ -257,42 +279,44 @@
 		$pages = &$page_cache;
 
 	$page_list = array();
-	foreach ($pages as $page) {
-		if ($page->post_parent == $page_id) {
+	foreach ( $pages as $page ) {
+		if ( $page->post_parent == $page_id ) {
 			$page_list[] = $page;
-			if ( $children = get_page_children($page->ID, $pages)) {
+			if ( $children = get_page_children($page->ID, $pages) )
 				$page_list = array_merge($page_list, $children);
-			}
 		}
 	}
-
 	return $page_list;
 }
 
+
 function &get_pages($args = '') {
 	global $wpdb;
 
 	parse_str($args, $r);
 
-	if (!isset($r['child_of'])) $r['child_of'] = 0;
-	if (!isset($r['sort_column'])) $r['sort_column'] = 'post_title';
-	if (!isset($r['sort_order'])) $r['sort_order'] = 'ASC';
+	if ( !isset($r['child_of']) )
+		$r['child_of'] = 0;
+	if ( !isset($r['sort_column']) )
+		$r['sort_column'] = 'post_title';
+	if ( !isset($r['sort_order']) )
+		$r['sort_order'] = 'ASC';
 
 	$exclusions = '';
-	if (!empty($r['exclude'])) {
+	if ( !empty($r['exclude']) ) {
 		$expages = preg_split('/[\s,]+/',$r['exclude']);
-		if (count($expages)) {
-			foreach ($expages as $expage) {
+		if ( count($expages) ) {
+			foreach ( $expages as $expage ) {
 				$exclusions .= ' AND ID <> ' . intval($expage) . ' ';
 			}
 		}
 	}
 
 	$pages = $wpdb->get_results("SELECT * " .
-															"FROM $wpdb->posts " .
-															"WHERE post_status = 'static' " .
-															"$exclusions " .
-															"ORDER BY " . $r['sort_column'] . " " . $r['sort_order']);
+		"FROM $wpdb->posts " .
+		"WHERE post_status = 'static' " .
+		"$exclusions " .
+		"ORDER BY " . $r['sort_column'] . " " . $r['sort_order']);
 
 	if ( empty($pages) )
 		return array();
@@ -300,104 +324,111 @@
 	// Update cache.
 	update_page_cache($pages);
 
-	if ($r['child_of'])
+	if ( $r['child_of'] )
 		$pages = & get_page_children($r['child_of'], $pages);
 
 	return $pages;
 }
 
+
 function wp_list_pages($args = '') {
 	parse_str($args, $r);
-	if ( !isset($r['depth']) ) $r['depth'] = 0;
-	if ( !isset($r['show_date']) ) $r['show_date'] = '';
-	if ( !isset($r['child_of']) ) $r['child_of'] = 0;
-	if ( !isset($r['title_li']) ) $r['title_li'] = __('Pages');
-	if ( !isset($r['echo']) ) $r['echo'] = 1;
-	
+	if ( !isset($r['depth']) )
+		$r['depth'] = 0;
+	if ( !isset($r['show_date']) )
+		$r['show_date'] = '';
+	if ( !isset($r['child_of']) )
+		$r['child_of'] = 0;
+	if ( !isset($r['title_li']) )
+		$r['title_li'] = __('Pages');
+	if ( !isset($r['echo']) )
+		$r['echo'] = 1;
+
 	$output = '';
 
 	// Query pages.
 	$pages = & get_pages($args);
-	if ( $pages ) :
+	if ( $pages ) {
+
+		if ( $r['title_li'] )
+			$output .= '<li class="pagenav">' . $r['title_li'] . '<ul>';
+
+		// Now loop over all pages that were selected
+		$page_tree = Array();
+		foreach ( $pages as $page ) {
+			// set the title for the current page
+			$page_tree[$page->ID]['title'] = $page->post_title;
+			$page_tree[$page->ID]['name'] = $page->post_name;
+
+			// set the selected date for the current page
+			// depending on the query arguments this is either
+			// the createtion date or the modification date
+			// as a unix timestamp. It will also always be in the
+			// ts field.
+			if ( !empty($r['show_date']) ) {
+				if ( 'modified' == $r['show_date'] )
+					$page_tree[$page->ID]['ts'] = $page->post_modified;
+				else
+					$page_tree[$page->ID]['ts'] = $page->post_date;
+			}
+
+			// The tricky bit!!
+			// Using the parent ID of the current page as the
+			// array index we set the curent page as a child of that page.
+			// We can now start looping over the $page_tree array
+			// with any ID which will output the page links from that ID downwards.
+			if ( $page->post_parent != $page->ID)
+				$page_tree[$page->post_parent]['children'][] = $page->ID;
+		}
+		// Output of the pages starting with child_of as the root ID.
+		// child_of defaults to 0 if not supplied in the query.
+		$output .= _page_level_out($r['child_of'],$page_tree, $r, 0, false);
+		if ( $r['title_li'] )
+			$output .= '</ul></li>';
+	}
 
-	if ( $r['title_li'] )
-		$output .= '<li class="pagenav">' . $r['title_li'] . '<ul>';
-	// Now loop over all pages that were selected
-	$page_tree = Array();
-	foreach($pages as $page) {
-		// set the title for the current page
-		$page_tree[$page->ID]['title'] = $page->post_title;
-		$page_tree[$page->ID]['name'] = $page->post_name;
-
-		// set the selected date for the current page
-		// depending on the query arguments this is either
-		// the createtion date or the modification date
-		// as a unix timestamp. It will also always be in the
-		// ts field.
-		if (! empty($r['show_date'])) {
-			if ('modified' == $r['show_date'])
-				$page_tree[$page->ID]['ts'] = $page->post_modified;
-			else
-				$page_tree[$page->ID]['ts'] = $page->post_date;
-		}
-
-		// The tricky bit!!
-		// Using the parent ID of the current page as the
-		// array index we set the curent page as a child of that page.
-		// We can now start looping over the $page_tree array
-		// with any ID which will output the page links from that ID downwards.
-		if ( $page->post_parent != $page->ID)
-			$page_tree[$page->post_parent]['children'][] = $page->ID;
-	}
-	// Output of the pages starting with child_of as the root ID.
-	// child_of defaults to 0 if not supplied in the query.
-	$output .= _page_level_out($r['child_of'],$page_tree, $r, 0, false);
-	if ( $r['title_li'] )
-		$output .= '</ul></li>';
-	endif;
-	
 	$output = apply_filters('wp_list_pages', $output);
-	
+
 	if ( $r['echo'] )
 		echo $output;
-	else 
+	else
 		return $output;
 }
 
+
 function _page_level_out($parent, $page_tree, $args, $depth = 0, $echo = true) {
 	global $wp_query;
-
 	$queried_obj = $wp_query->get_queried_object();
-
 	$output = '';
 
-	if($depth)
+	if ( $depth )
 		$indent = str_repeat("\t", $depth);
-	//$indent = join('', array_fill(0,$depth,"\t"));
+		//$indent = join('', array_fill(0,$depth,"\t"));
+
+	if ( !is_array($page_tree[$parent]['children']) )
+		return false;
 
-	foreach($page_tree[$parent]['children'] as $page_id) {
+	foreach ( $page_tree[$parent]['children'] as $page_id ) {
 		$cur_page = $page_tree[$page_id];
 		$title = $cur_page['title'];
 
 		$css_class = 'page_item';
-		if( $page_id == $queried_obj->ID) {
+		if ( $page_id == $queried_obj->ID )
 			$css_class .= ' current_page_item';
-		}
 
 		$output .= $indent . '<li class="' . $css_class . '"><a href="' . get_page_link($page_id) . '" title="' . wp_specialchars($title) . '">' . $title . '</a>';
 
-		if(isset($cur_page['ts'])) {
+		if ( isset($cur_page['ts']) ) {
 			$format = get_settings('date_format');
-			if(isset($args['date_format']))
+			if ( isset($args['date_format']) )
 				$format = $args['date_format'];
 			$output .= " " . mysql2date($format, $cur_page['ts']);
 		}
-		echo "\n";
 
-		if(isset($cur_page['children']) && is_array($cur_page['children'])) {
+		if ( isset($cur_page['children']) && is_array($cur_page['children']) ) {
 			$new_depth = $depth + 1;
 
-			if(!$args['depth'] || $depth < ($args['depth']-1)) {
+			if ( !$args['depth'] || $depth < ($args['depth']-1) ) {
 				$output .= "$indent<ul>\n";
 				$output .= _page_level_out($page_id, $page_tree, $args, $new_depth, false);
 				$output .= "$indent</ul>\n";
@@ -411,4 +442,126 @@
 		return $output;
 }
 
+function the_attachment_link($id = 0, $fullsize = false, $max_dims = false) {
+	echo get_the_attachment_link($id, $fullsize, $max_dims);
+}
+
+function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false) {
+	$id = (int) $id;
+	$_post = & get_post($id);
+
+	if ( ('attachment' != $_post->post_status) || ('' == $_post->guid) )
+		return __('Missing Attachment');
+
+	if (! empty($_post->guid) ) {
+		$innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims);
+
+		return "<a href=\"{$_post->guid}\" title=\"{$_post->post_title}\" >{$innerHTML}</a>";
+
+	} else {
+		$p .= __('Missing attachment');
+	}
+	return $p;
+}
+
+function get_attachment_icon($id = 0, $fullsize = false, $max_dims = false) {
+	$id = (int) $id;
+	$post = & get_post($id);
+
+	$mime = $post->post_mime_type;
+
+	$imagedata = get_post_meta($post->ID, '_wp_attachment_metadata', true);
+
+	$file = get_post_meta($post->ID, '_wp_attached_file', true);
+
+	if ( !$fullsize && !empty($imagedata['thumb'])
+			&& ($thumbfile = str_replace(basename($file), $imagedata['thumb'], $file))
+			&& file_exists($thumbfile) ) {
+
+		// We have a thumbnail desired, specified and existing
+
+		$src = str_replace(basename($post->guid), $imagedata['thumb'], $post->guid);
+		$src_file = $thumbfile;
+		$class = 'attachmentthumb';
+
+	} elseif ( substr($mime, 0, 6) == 'image/'
+			&& file_exists($file) ) {
+
+		// We have an image without a thumbnail
+
+		$src = $post->guid;
+		$src_file = & $file;
+		$class = 'attachmentimage';
+	} elseif (! empty($mime) ) {
+
+		// No thumb, no image. We'll look for a mime-related icon instead.
+		$icon_dir = apply_filters('icon_dir', get_template_directory().'/images');
+		$icon_dir_uri = apply_filters('icon_dir_uri', get_template_directory_uri().'/images');
+
+		$types = array(substr($mime, 0, strpos($mime, '/')), substr($mime, strpos($mime, '/') + 1), str_replace('/', '_', $mime));
+		$exts = array('jpg', 'gif', 'png');
+		foreach ($types as $type) {
+			foreach ($exts as $ext) {
+				$src_file = "$icon_dir/$type.$ext";
+				if ( file_exists($src_file) ) {
+					$src = "$icon_dir_uri/$type.$ext";
+					break 2;
+				}
+			}
+		}
+	}
+
+	if (! isset($src) )
+		return false;
+
+	// Do we need to constrain the image?
+	if ( ($max_dims = apply_filters('attachment_max_dims', $max_dims)) && file_exists($src_file) ) {
+
+		$imagesize = getimagesize($src_file);
+
+		if (($imagesize[0] > $max_dims[0]) || $imagesize[1] > $max_dims[1] ) {
+			$actual_aspect = $imagesize[0] / $imagesize[1];
+			$desired_aspect = $max_dims[0] / $max_dims[1];
+
+			if ( $actual_aspect >= $desired_aspect ) {
+				$height = $actual_aspect * $max_dims[0];
+				$constraint = "width=\"{$max_dims[0]}\" ";
+				$post->iconsize = array($max_dims[0], $height);
+			} else {
+				$width = $max_dims[1] / $actual_aspect;
+				$constraint = "height=\"{$max_dims[1]}\" ";
+				$post->iconsize = array($width, $max_dims[1]);
+			}
+		} else {
+			$post->iconsize = array($imagesize[0], $imagesize[1]);
+		}
+	}
+
+	$icon = "<img src=\"{$src}\" title=\"{$post->post_title}\" alt=\"{$post->post_title}\" {$constraint}/>";
+
+	return apply_filters('attachment_icon', $icon, $post->ID);
+}
+
+function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) {
+	$id = (int) $id;
+
+	if ( $innerHTML = get_attachment_icon($id, $fullsize, $max_dims))
+		return $innerHTML;
+
+	$post = & get_post($id);
+
+	$innerHTML = $post->post_title;
+
+	return apply_filters('attachment_innerHTML', $innerHTML, $post->ID);
+}
+
+function prepend_attachment($content) {
+	$p = '<p class="attachment">';
+	$p .= get_the_attachment_link(false, true, array(400, 300));
+	$p .= '</p>';
+	$p = apply_filters('prepend_attachment', $p);
+
+	return "$p\n$content";
+}
+
 ?>
diff -ruN 1.5.2/wp-includes/template-loader.php 2.0.4/wp-includes/template-loader.php
--- 1.5.2/wp-includes/template-loader.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.0.4/wp-includes/template-loader.php	2006-01-05 19:09:16.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+if ( defined('WP_USE_THEMES') && constant('WP_USE_THEMES') ) {
+	do_action('template_redirect');
+	if ( is_feed() ) {
+		include(ABSPATH . '/wp-feed.php');
+		exit;
+	} else if ( is_trackback() ) {
+		include(ABSPATH . '/wp-trackback.php');
+		exit;
+	} else if ( is_404() && $template = get_404_template() ) {
+		include($template);
+		exit;
+	} else if ( is_search() && $template = get_search_template() ) {
+		include($template);
+		exit;
+	} else if ( is_home() && $template = get_home_template() ) {
+		include($template);
+		exit;
+	} else if ( is_attachment() && $template = get_attachment_template() ) {
+		include($template);
+		exit;
+	} else if ( is_single() && $template = get_single_template() ) {
+		if ( is_attachment() )
+			add_filter('the_content', 'prepend_attachment');
+		include($template);
+		exit;
+	} else if ( is_page() && $template = get_page_template() ) {
+		if ( is_attachment() )
+			add_filter('the_content', 'prepend_attachment');
+		include($template);
+		exit;
+	} else if ( is_category() && $template = get_category_template()) {
+		include($template);
+		exit;		
+	} else if ( is_author() && $template = get_author_template() ) {
+		include($template);
+		exit;
+	} else if ( is_date() && $template = get_date_template() ) {
+		include($template);
+		exit;
+	} else if ( is_archive() && $template = get_archive_template() ) {
+		include($template);
+		exit;
+	} else if ( is_comments_popup() && $template = get_comments_popup_template() ) {
+		include($template);
+		exit;
+	} else if ( is_paged() && $template = get_paged_template() ) {
+		include($template);
+		exit;
+	} else if ( file_exists(TEMPLATEPATH . "/index.php") ) {
+		if ( is_attachment() )
+			add_filter('the_content', 'prepend_attachment');
+		include(TEMPLATEPATH . "/index.php");
+		exit;
+	}
+} else {
+	// Process feeds and trackbacks even if not using themes.
+	if ( is_feed() ) {
+		include(ABSPATH . '/wp-feed.php');
+		exit;
+	} else if ( is_trackback() ) {
+		include(ABSPATH . '/wp-trackback.php');
+		exit;
+	}
+}
+
+?>
\ No newline at end of file
diff -ruN 1.5.2/wp-includes/vars.php 2.0.4/wp-includes/vars.php
--- 1.5.2/wp-includes/vars.php	2005-03-13 10:36:09.000000000 -0600
+++ 2.0.4/wp-includes/vars.php	2006-07-05 19:08:53.000000000 -0500
@@ -1,8 +1,7 @@
 <?php
 
 // On which page are we ?
-$PHP_SELF = $_SERVER['PHP_SELF'];
-if (preg_match('#([^/]+.php)#', $PHP_SELF, $self_matches)) {
+if (preg_match('#([^/]+\.php)$#', $PHP_SELF, $self_matches)) {
 	$pagenow = $self_matches[1];
 } else if (strstr($PHP_SELF, '?')) {
 	$pagenow = explode('/', $PHP_SELF);
@@ -15,99 +14,87 @@
 
 // Simple browser detection
 $is_lynx = 0; $is_gecko = 0; $is_winIE = 0; $is_macIE = 0; $is_opera = 0; $is_NS4 = 0;
-if (!isset($HTTP_USER_AGENT)) {
-	$HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
-}
-if (preg_match('/Lynx/', $HTTP_USER_AGENT)) {
+
+if (preg_match('/Lynx/', $_SERVER['HTTP_USER_AGENT'])) {
 	$is_lynx = 1;
-} elseif (preg_match('/Gecko/', $HTTP_USER_AGENT)) {
+} elseif (preg_match('/Gecko/', $_SERVER['HTTP_USER_AGENT'])) {
 	$is_gecko = 1;
-} elseif ((preg_match('/MSIE/', $HTTP_USER_AGENT)) && (preg_match('/Win/', $HTTP_USER_AGENT))) {
+} elseif ((preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) && (preg_match('/Win/', $_SERVER['HTTP_USER_AGENT']))) {
 	$is_winIE = 1;
-} elseif ((preg_match('/MSIE/', $HTTP_USER_AGENT)) && (preg_match('/Mac/', $HTTP_USER_AGENT))) {
+} elseif ((preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) && (preg_match('/Mac/', $_SERVER['HTTP_USER_AGENT']))) {
 	$is_macIE = 1;
-} elseif (preg_match('/Opera/', $HTTP_USER_AGENT)) {
+} elseif (preg_match('/Opera/', $_SERVER['HTTP_USER_AGENT'])) {
 	$is_opera = 1;
-} elseif ((preg_match('/Nav/', $HTTP_USER_AGENT) ) || (preg_match('/Mozilla\/4\./', $HTTP_USER_AGENT))) {
+} elseif ((preg_match('/Nav/', $_SERVER['HTTP_USER_AGENT']) ) || (preg_match('/Mozilla\/4\./', $_SERVER['HTTP_USER_AGENT']))) {
 	$is_NS4 = 1;
 }
 $is_IE    = (($is_macIE) || ($is_winIE));
 
 // Server detection
-$is_apache = strstr($_SERVER['SERVER_SOFTWARE'], 'Apache') ? 1 : 0;
+$is_apache = ( strstr($_SERVER['SERVER_SOFTWARE'], 'Apache') || strstr($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') ) ? 1 : 0;
 $is_IIS = strstr($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') ? 1 : 0;
 
+// On OS X Server, $_SERVER['REMOTE_ADDR'] is the server's address. Workaround this 
+// by using $_SERVER['HTTP_PC_REMOTE_ADDR'], which *is* the remote address.
+if ( isset($_SERVER['HTTP_PC_REMOTE_ADDR']) )
+	$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_PC_REMOTE_ADDR'];
+
 // if the config file does not provide the smilies array, let's define it here
 if (!isset($wpsmiliestrans)) {
 	$wpsmiliestrans = array(
-	' :)'        => 'icon_smile.gif',
-	' :D'        => 'icon_biggrin.gif',
-	' :-D'       => 'icon_biggrin.gif',
-	':grin:'    => 'icon_biggrin.gif',
-	' :)'        => 'icon_smile.gif',
-	' :-)'       => 'icon_smile.gif',
-	':smile:'   => 'icon_smile.gif',
-	' :('        => 'icon_sad.gif',
-	' :-('       => 'icon_sad.gif',
-	':sad:'     => 'icon_sad.gif',
-	' :o'        => 'icon_surprised.gif',
-	' :-o'       => 'icon_surprised.gif',
-	':eek:'     => 'icon_surprised.gif',
-	' 8O'        => 'icon_eek.gif',
-	' 8-O'       => 'icon_eek.gif',
-	':shock:'   => 'icon_eek.gif',
-	' :?'        => 'icon_confused.gif',
-	' :-?'       => 'icon_confused.gif',
-	' :???:'     => 'icon_confused.gif',
-	' 8)'        => 'icon_cool.gif',
-	' 8-)'       => 'icon_cool.gif',
-	':cool:'    => 'icon_cool.gif',
-	':lol:'     => 'icon_lol.gif',
-	' :x'        => 'icon_mad.gif',
-	' :-x'       => 'icon_mad.gif',
-	':mad:'     => 'icon_mad.gif',
-	' :P'        => 'icon_razz.gif',
-	' :-P'       => 'icon_razz.gif',
-	':razz:'    => 'icon_razz.gif',
-	':oops:'    => 'icon_redface.gif',
-	':cry:'     => 'icon_cry.gif',
-	':evil:'    => 'icon_evil.gif',
-	':twisted:' => 'icon_twisted.gif',
-	':roll:'    => 'icon_rolleyes.gif',
-	':wink:'    => 'icon_wink.gif',
-	' ;)'        => 'icon_wink.gif',
-	' ;-)'       => 'icon_wink.gif',
-	':!:'       => 'icon_exclaim.gif',
-	':?:'       => 'icon_question.gif',
-	':idea:'    => 'icon_idea.gif',
-	':arrow:'   => 'icon_arrow.gif',
-	' :|'        => 'icon_neutral.gif',
-	' :-|'       => 'icon_neutral.gif',
-	':neutral:' => 'icon_neutral.gif',
-	':mrgreen:' => 'icon_mrgreen.gif',
+	':mrgreen:'	=> 'icon_mrgreen.gif',
+	':neutral:'	=> 'icon_neutral.gif',
+	':twisted:'	=> 'icon_twisted.gif',
+	':arrow:'	=> 'icon_arrow.gif',
+	':shock:'	=> 'icon_eek.gif',
+	':smile:'	=> 'icon_smile.gif',
+	' :???:'	=> 'icon_confused.gif',
+	':cool:'	=> 'icon_cool.gif',
+	':evil:'	=> 'icon_evil.gif',
+	':grin:'	=> 'icon_biggrin.gif',
+	':idea:'	=> 'icon_idea.gif',
+	':oops:'	=> 'icon_redface.gif',
+	':razz:'	=> 'icon_razz.gif',
+	':roll:'	=> 'icon_rolleyes.gif',
+	':wink:'	=> 'icon_wink.gif',
+	':cry:'		=> 'icon_cry.gif',
+	':eek:'		=> 'icon_surprised.gif',
+	':lol:'		=> 'icon_lol.gif',
+	':mad:'		=> 'icon_mad.gif',
+	':sad:'		=> 'icon_sad.gif',
+	' 8-)'		=> 'icon_cool.gif',
+	' 8-O'		=> 'icon_eek.gif',
+	' :-('		=> 'icon_sad.gif',
+	' :-)'		=> 'icon_smile.gif',
+	' :-?'		=> 'icon_confused.gif',
+	' :-D'		=> 'icon_biggrin.gif',
+	' :-P'		=> 'icon_razz.gif',
+	' :-o'		=> 'icon_surprised.gif',
+	' :-x'		=> 'icon_mad.gif',
+	' :-|'		=> 'icon_neutral.gif',
+	' ;-)'		=> 'icon_wink.gif',
+	' 8)'		=> 'icon_cool.gif',
+	' 8O'		=> 'icon_eek.gif',
+	' :('		=> 'icon_sad.gif',
+	' :)'		=> 'icon_smile.gif',
+	' :?'		=> 'icon_confused.gif',
+	' :D'		=> 'icon_biggrin.gif',
+	' :P'		=> 'icon_razz.gif',
+	' :o'		=> 'icon_surprised.gif',
+	' :x'		=> 'icon_mad.gif',
+	' :|'		=> 'icon_neutral.gif',
+	' ;)'		=> 'icon_wink.gif',
+	':!:'		=> 'icon_exclaim.gif',
+	':?:'		=> 'icon_question.gif',
 	);
 }
 
-// sorts the smilies' array
-if (!function_exists('smiliescmp')) {
-function smiliescmp ($a, $b) {
-	if (strlen($a) == strlen($b)) {
-		return strcmp($a, $b);
-	}
-		return (strlen($a) > strlen($b)) ? -1 : 1;
-	}
-}
-uksort($wpsmiliestrans, 'smiliescmp');
 
 // generates smilies' search & replace arrays
 foreach($wpsmiliestrans as $smiley => $img) {
 	$wp_smiliessearch[] = $smiley;
 	$smiley_masked = htmlspecialchars( trim($smiley) , ENT_QUOTES);
-	$wp_smiliesreplace[] = " <img src='" . get_settings('siteurl') . "/wp-images/smilies/$img' alt='$smiley_masked' class='wp-smiley' /> ";
+	$wp_smiliesreplace[] = " <img src='" . get_settings('siteurl') . "/wp-includes/images/smilies/$img' alt='$smiley_masked' class='wp-smiley' /> ";
 }
 
-// Path for cookies
-define('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_settings('home') . '/' ) );
-define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_settings('siteurl') . '/' ) );
-
-?>
\ No newline at end of file
+?>
diff -ruN 1.5.2/wp-includes/version.php 2.0.4/wp-includes/version.php
--- 1.5.2/wp-includes/version.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/wp-includes/version.php	2006-07-28 18:38:34.000000000 -0500
@@ -2,6 +2,7 @@
 
 // This just holds the version number, in a separate file so we can bump it without cluttering the SVN
 
-$wp_version = '1.5.2';
+$wp_version = '2.0.4';
+$wp_db_version = 3440;
 
 ?>
diff -ruN 1.5.2/wp-includes/wp-db.php 2.0.4/wp-includes/wp-db.php
--- 1.5.2/wp-includes/wp-db.php	2005-05-13 15:31:59.000000000 -0500
+++ 2.0.4/wp-includes/wp-db.php	2006-07-28 20:44:58.000000000 -0500
@@ -76,8 +76,12 @@
 	// ====================================================================
 	//	Format a string correctly for safe insert under all PHP conditions
 	
-	function escape($str) {
-		return addslashes($str);				
+	function escape($string) {
+		return addslashes( $string ); // Disable rest for now, causing problems
+		if( !$this->dbh || version_compare( phpversion(), '4.3.0' ) == '-1' )
+			return mysql_escape_string( $string );
+		else
+			return mysql_real_escape_string( $string, $this->dbh );
 	}
 
 	// ==================================================================
@@ -89,12 +93,14 @@
 		$EZSQL_ERROR[] = 
 		array ('query' => $this->last_query, 'error_str' => $str);
 
+		$str = htmlspecialchars($str, ENT_QUOTES);
+		$query = htmlspecialchars($this->last_query, ENT_QUOTES);
 		// Is error output turned on or not..
 		if ( $this->show_errors ) {
 			// If there is an error then take note of it
 			print "<div id='error'>
 			<p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
-			<code>$this->last_query</code></p>
+			<code>$query</code></p>
 			</div>";
 		} else {
 			return false;	
diff -ruN 1.5.2/wp-includes/wp-l10n.php 2.0.4/wp-includes/wp-l10n.php
--- 1.5.2/wp-includes/wp-l10n.php	2005-03-17 12:15:18.000000000 -0600
+++ 2.0.4/wp-includes/wp-l10n.php	2006-01-10 16:53:40.000000000 -0600
@@ -12,13 +12,11 @@
 		return $locale;
 
 	// WPLANG is defined in wp-config.
-	if (defined('WPLANG')) {
-    $locale = WPLANG;
-	}
+	if (defined('WPLANG'))
+		$locale = WPLANG;
 	
-	if (empty($locale)) {
-    $locale = 'en_US';
-	}
+	if (empty($locale))
+		$locale = 'en_US';
 
 	$locale = apply_filters('locale', $locale);
 
@@ -29,22 +27,20 @@
 function __($text, $domain = 'default') {
 	global $l10n;
 
-	if (isset($l10n[$domain])) {
-		return $l10n[$domain]->translate($text);
-	} else {
+	if (isset($l10n[$domain]))
+		return apply_filters('gettext', $l10n[$domain]->translate($text), $text);
+	else
 		return $text;
-	}
 }
 
 // Echo a translated string.
 function _e($text, $domain = 'default') {
 	global $l10n;
 
-	if (isset($l10n[$domain])) {
-		echo $l10n[$domain]->translate($text);
-	} else {
+	if (isset($l10n[$domain]))
+		echo apply_filters('gettext', $l10n[$domain]->translate($text), $text);
+	else
 		echo $text;
-	}
 }
 
 // Return the plural form.
@@ -64,15 +60,13 @@
 function load_textdomain($domain, $mofile) {
 	global $l10n;
 
-	if (isset($l10n[$domain])) {
+	if (isset($l10n[$domain]))
 		return;
-	}
 
-	if ( is_readable($mofile)) {
-    $input = new CachedFileReader($mofile);
-	}	else {
+	if ( is_readable($mofile))
+		$input = new CachedFileReader($mofile);
+	else
 		return;
-	}
 
 	$l10n[$domain] = new gettext_reader($input);
 }
@@ -86,10 +80,10 @@
 	load_textdomain('default', $mofile);
 }
 
-function load_plugin_textdomain($domain) {
+function load_plugin_textdomain($domain, $path = 'wp-content/plugins') {
 	$locale = get_locale();
 	
-	$mofile = ABSPATH . "wp-content/plugins/$domain-$locale.mo";
+	$mofile = ABSPATH . "$path/$domain-$locale.mo";
 	load_textdomain($domain, $mofile);
 }
 
diff -ruN 1.5.2/wp-links-opml.php 2.0.4/wp-links-opml.php
--- 1.5.2/wp-links-opml.php	2005-03-22 15:56:59.000000000 -0600
+++ 2.0.4/wp-links-opml.php	2006-01-23 17:10:08.000000000 -0600
@@ -29,6 +29,7 @@
 <?php $sql = "SELECT $wpdb->links.link_url, link_rss, $wpdb->links.link_name, $wpdb->links.link_category, $wpdb->linkcategories.cat_name, link_updated 
 FROM $wpdb->links 
  JOIN $wpdb->linkcategories on $wpdb->links.link_category = $wpdb->linkcategories.cat_id
+ AND $wpdb->links.link_visible = 'Y'
  $sql_cat
  ORDER BY $wpdb->linkcategories.cat_name, $wpdb->links.link_name \n";
  //echo("<!-- $sql -->");
@@ -48,11 +49,13 @@
              $prev_cat_id = $result->link_category;
         } // end if new category
 ?>
-            <outline title="<?php echo wp_specialchars($result->link_name); ?>" type="link" xmlUrl="<?php echo wp_specialchars($result->link_rss); ?>" htmlUrl="<?php echo wp_specialchars($result->link_url); ?>" updated="<?php if ('0000-00-00 00:00:00' != $result->link_updated) echo $result->link_updated; ?>" />
+            <outline text="<?php echo wp_specialchars($result->link_name); ?>" type="link" xmlUrl="<?php echo wp_specialchars($result->link_rss); ?>" htmlUrl="<?php echo wp_specialchars($result->link_url); ?>" updated="<?php if ('0000-00-00 00:00:00' != $result->link_updated) echo $result->link_updated; ?>" />
 <?php
         } // end foreach
+?>
+	</outline>
+<?php
     } // end if
 ?>
-        </outline>
-    </body>
+</body>
 </opml>
\ No newline at end of file
diff -ruN 1.5.2/wp-login.php 2.0.4/wp-login.php
--- 1.5.2/wp-login.php	2005-06-26 11:27:37.000000000 -0500
+++ 2.0.4/wp-login.php	2006-07-05 04:44:43.000000000 -0500
@@ -4,18 +4,17 @@
 $action = $_REQUEST['action'];
 $error = '';
 
-header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-header('Cache-Control: no-cache, must-revalidate');
-header('Pragma: no-cache');
+nocache_headers();
+
 header('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset'));
 
 if ( defined('RELOCATE') ) { // Move flag is set
 	if ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) )
 		$_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
-	
-	if ( dirname('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) != get_settings('siteurl') )
-		update_option('siteurl', dirname('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) );
+
+	$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
+	if ( dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) != get_settings('siteurl') )
+		update_option('siteurl', dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) );
 }
 
 switch($action) {
@@ -24,11 +23,13 @@
 
 	wp_clearcookie();
 	do_action('wp_logout');
-	header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
-	header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-	header('Cache-Control: no-cache, must-revalidate, max-age=0');
-	header('Pragma: no-cache');
-	wp_redirect('wp-login.php');
+	nocache_headers();
+
+	$redirect_to = 'wp-login.php';
+	if ( isset($_REQUEST['redirect_to']) )
+		$redirect_to = $_REQUEST['redirect_to'];
+			
+	wp_redirect($redirect_to);
 	exit();
 
 break;
@@ -75,7 +76,7 @@
 <p class="submit"><input type="submit" name="submit" id="submit" value="<?php _e('Retrieve Password'); ?> &raquo;" tabindex="3" /></p>
 </form>
 <ul>
-	<li><a href="<?php bloginfo('home'); ?>" title="<?php _e('Are you lost?') ?>">&laquo; <?php _e('Back to blog') ?></a></li>
+	<li><a href="<?php bloginfo('home'); ?>/" title="<?php _e('Are you lost?') ?>">&laquo; <?php _e('Back to blog') ?></a></li>
 <?php if (get_settings('users_can_register')) : ?>
 	<li><a href="<?php bloginfo('wpurl'); ?>/wp-register.php"><?php _e('Register') ?></a></li>
 <?php endif; ?>
@@ -126,7 +127,7 @@
 case 'resetpass' :
 
 	// Generate something random for a password... md5'ing current time with a rand salt
-	$key = $_GET['key'];
+	$key = preg_replace('/a-z0-9/i', '', $_GET['key']);
 	if ( empty($key) )
 		die( __('Sorry, that key does not appear to be valid.') );
 	$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_activation_key = '$key'");
@@ -137,6 +138,8 @@
 
 	$new_pass = substr( md5( uniqid( microtime() ) ), 0, 7);
  	$wpdb->query("UPDATE $wpdb->users SET user_pass = MD5('$new_pass'), user_activation_key = '' WHERE user_login = '$user->user_login'");
+	wp_cache_delete($user->ID, 'users');
+	wp_cache_delete($user->user_login, 'userlogins');	
 	$message  = sprintf(__('Username: %s'), $user->user_login) . "\r\n";
 	$message .= sprintf(__('Password: %s'), $new_pass) . "\r\n";
 	$message .= get_settings('siteurl') . "/wp-login.php\r\n";
@@ -162,43 +165,48 @@
 
 	$user_login = '';
 	$user_pass = '';
-	$redirect_to = 'wp-admin/';
 	$using_cookie = false;
+	if ( !isset( $_REQUEST['redirect_to'] ) )
+		$redirect_to = 'wp-admin/';
+	else
+		$redirect_to = $_REQUEST['redirect_to'];
 
-	if( !empty($_POST) ) {
+	if( $_POST ) {
 		$user_login = $_POST['log'];
+		$user_login = sanitize_user( $user_login );
 		$user_pass  = $_POST['pwd'];
-		$redirect_to = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $_POST['redirect_to']);
-	} elseif ( !empty($_COOKIE) ) {
-		if (! empty($_COOKIE['wordpressuser_' . COOKIEHASH]) )
-			$user_login = $_COOKIE['wordpressuser_' . COOKIEHASH];
-		if (! empty($_COOKIE['wordpresspass_' . COOKIEHASH]) ) {
-			$user_pass = $_COOKIE['wordpresspass_' . COOKIEHASH];
+		$rememberme = $_POST['rememberme'];
+	} else {
+		$cookie_login = wp_get_cookie_login();
+		if ( ! empty($cookie_login) ) {
 			$using_cookie = true;
+			$user_login = $cookie_login['login'];
+			$user_pass = $cookie_login['password'];
 		}
 	}
 
 	do_action('wp_authenticate', array(&$user_login, &$user_pass));
 
-	if ($user_login && $user_pass) {
-		$user = get_userdatabylogin($user_login);
-		if ( 0 == $user->user_level )
+	if ( $user_login && $user_pass ) {
+		$user = new WP_User(0, $user_login);
+	
+		// If the user can't edit posts, send them to their profile.
+		if ( !$user->has_cap('edit_posts') && ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' ) )
 			$redirect_to = get_settings('siteurl') . '/wp-admin/profile.php';
-
+	
 		if ( wp_login($user_login, $user_pass, $using_cookie) ) {
-			if (! $using_cookie) {
-				wp_setcookie($user_login, $user_pass);
-			}
+			if ( !$using_cookie )
+				wp_setcookie($user_login, $user_pass, false, '', '', $rememberme);
 			do_action('wp_login', $user_login);
 			wp_redirect($redirect_to);
-			exit();
+			exit;
 		} else {
-			if ($using_cookie)			
+			if ( $using_cookie )			
 				$error = __('Your session has expired.');
 		}
+	} else if ( $user_login || $user_pass ) {
+		$error = __('<strong>Error</strong>: The password field is empty.');
 	}
-	if ( isset($_REQUEST['redirect_to']) )
-		$redirect_to = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $_REQUEST['redirect_to']);
 ?>
 <!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">
@@ -212,11 +220,6 @@
 	}
 	window.onload = focusit;
 	</script>
-	<style type="text/css">
-	#log, #pwd, #submit {
-		font-size: 1.7em;
-	}
-	</style>
 </head>
 <body>
 
@@ -228,15 +231,18 @@
 ?>
 
 <form name="loginform" id="loginform" action="wp-login.php" method="post">
-<p><label><?php _e('Username:') ?><br /><input type="text" name="log" id="log" value="" size="20" tabindex="1" /></label></p>
+<p><label><?php _e('Username:') ?><br /><input type="text" name="log" id="log" value="<?php echo wp_specialchars(stripslashes($user_login), 1); ?>" size="20" tabindex="1" /></label></p>
 <p><label><?php _e('Password:') ?><br /> <input type="password" name="pwd" id="pwd" value="" size="20" tabindex="2" /></label></p>
+<p>
+  <label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="3" /> 
+  <?php _e('Remember me'); ?></label></p>
 <p class="submit">
-	<input type="submit" name="submit" id="submit" value="<?php _e('Login'); ?> &raquo;" tabindex="3" />
-	<input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>" />
+	<input type="submit" name="submit" id="submit" value="<?php _e('Login'); ?> &raquo;" tabindex="4" />
+	<input type="hidden" name="redirect_to" value="<?php echo wp_specialchars($redirect_to); ?>" />
 </p>
 </form>
 <ul>
-	<li><a href="<?php bloginfo('home'); ?>" title="<?php _e('Are you lost?') ?>">&laquo; <?php _e('Back to blog') ?></a></li>
+	<li><a href="<?php bloginfo('home'); ?>/" title="<?php _e('Are you lost?') ?>">&laquo; <?php _e('Back to blog') ?></a></li>
 <?php if (get_settings('users_can_register')) : ?>
 	<li><a href="<?php bloginfo('wpurl'); ?>/wp-register.php"><?php _e('Register') ?></a></li>
 <?php endif; ?>
diff -ruN 1.5.2/wp-mail.php 2.0.4/wp-mail.php
--- 1.5.2/wp-mail.php	2005-02-01 07:21:12.000000000 -0600
+++ 2.0.4/wp-mail.php	2006-01-23 17:49:22.000000000 -0600
@@ -50,9 +50,7 @@
 			if (preg_match('/Subject: /i', $line)) {
 				$subject = trim($line);
 				$subject = substr($subject, 9, strlen($subject)-9);
-				if (!preg_match('#\=\?(.+)\?Q\?(.+)\?\=#i', $subject)) {
-				  $subject = wp_iso_descrambler($subject);
-				}
+				$subject = wp_iso_descrambler($subject);
 				// Captures any text in the subject before $phone_delim as the subject
 				$subject = explode($phone_delim, $subject);
 				$subject = $subject[0];
@@ -63,8 +61,10 @@
 			if (preg_match('/From: /', $line) | preg_match('Reply-To: /', $line))  {
 				$author=trim($line);
 			if ( ereg("([a-zA-Z0-9\_\-\.]+@[\a-zA-z0-9\_\-\.]+)", $author , $regs) ) {
-				echo "Author = {$regs[1]} <p>";
-				$result = $wpdb->get_row("SELECT ID FROM $tableusers WHERE user_email='$regs[1]' ORDER BY ID DESC LIMIT 1");
+				$author = $regs[1];
+				echo "Author = {$author} <p>";
+				$author = $wpdb->escape($author);
+				$result = $wpdb->get_row("SELECT ID FROM $wpdb->users WHERE user_email='$author' LIMIT 1");
 				if (!$result)
 					$post_author = 1;
 				else
@@ -136,6 +136,7 @@
 	$post_status = 'publish';
 
 	$post_data = compact('post_content','post_title','post_date','post_date_gmt','post_author','post_category', 'post_status');
+	$post_data = add_magic_quotes($post_data);
 
 	$post_ID = wp_insert_post($post_data);
 
@@ -150,23 +151,6 @@
 	echo "\n<p><b>Posted title:</b> $post_title<br />";
 	echo "\n<b>Posted content:</b><br /><pre>".$content.'</pre></p>';
 
-	if (!$post_categories) $post_categories[] = 1;
-	foreach ($post_categories as $post_category) :
-		$post_category = intval($post_category);
-
-		// Double check it's not there already
-		$exists = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post_ID AND category_id = $post_category");
-
-		if (!$exists && $result) { 
-			$wpdb->query("
-			INSERT INTO $wpdb->post2cat
-			(post_id, category_id)
-			VALUES
-			($post_ID, $post_category)
-			");
-		}
-	endforeach;
-
 	if(!$pop3->delete($i)) {
 		echo '<p>Oops '.$pop3->ERROR.'</p></div>';
 		$pop3->reset();
diff -ruN 1.5.2/wp-pass.php 2.0.4/wp-pass.php
--- 1.5.2/wp-pass.php	2005-03-13 10:36:09.000000000 -0600
+++ 2.0.4/wp-pass.php	2006-06-24 16:37:24.000000000 -0500
@@ -7,5 +7,5 @@
 // 10 days
 setcookie('wp-postpass_' . COOKIEHASH, $_POST['post_password'], time() + 864000, COOKIEPATH);
 
-wp_redirect($_SERVER['HTTP_REFERER']);
+wp_redirect(wp_get_referer());
 ?>
\ No newline at end of file
diff -ruN 1.5.2/wp.php 2.0.4/wp.php
--- 1.5.2/wp.php	2005-02-13 22:36:57.000000000 -0600
+++ 2.0.4/wp.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,48 +0,0 @@
-<?php
-// This is an example of a very simple template
-require_once('./wp-blog-header.php');
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml/DTD/xhtml-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title><?php bloginfo('name'); ?><?php wp_title(); ?></title>
-	<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_settings('blog_charset'); ?>" />
-	<meta name="generator" content="WordPress <?php $wp_version ?>" /> <!-- leave this for stats -->
-	<link rel="alternate" type="text/xml" title="RSS" href="<?php bloginfo('rss2_url'); ?>" />
-	<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />
-</head>
-<body>
-<h1 id="header"><a href="<?php echo get_settings('home'); ?>" title="<?php bloginfo('name'); ?>"><?php bloginfo('name'); ?></a></h1>
-
-<!-- // loop start -->
-<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
-<?php the_date('d.m.y', '<h2>','</h2>'); ?>
-<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h3>
-
-<?php the_content(); ?>
-
-<?php link_pages('<br />Pages: ', '<br />', 'number') ?>
-
-<p><em>Posted by <strong><?php the_author() ?></strong> @ <a href="<?php the_permalink() ?>"><?php the_time() ?></a></em></p>
-<p>Filed under: <?php the_category(',') ?></p>
-
-<?php comments_popup_link('comments ?', '1 comment', '% comments') ?>
-
-<?php comments_template(); ?>
-
-
-<!-- // this is just the end of the motor - don't touch that line either :) -->
-<?php endwhile; else: ?>
-<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
-<?php endif; ?>
-
-<div align="right"><cite>Powered by <a href="http://wordpress.org"><strong>Wordpress</strong></a></cite><br />
-<br />
-<a href="wp-login.php">login</a><br />
-<a href="wp-register.php">register</a>
-</div>
-
-
-</body>
-</html>
\ No newline at end of file
diff -ruN 1.5.2/wp-rdf.php 2.0.4/wp-rdf.php
--- 1.5.2/wp-rdf.php	2005-02-20 22:19:43.000000000 -0600
+++ 2.0.4/wp-rdf.php	2005-09-08 17:02:14.000000000 -0500
@@ -1,10 +1,8 @@
 <?php /* RDF 1.0 generator, original version by garym@teledyn.com */
 
-if (empty($feed)) {
-    $blog = 1; // enter your blog's ID
-		$feed = 'rdf';
-    $doing_rss = 1;
-    require('wp-blog-header.php');
+if (empty($wp)) {
+	require_once('wp-config.php');
+	wp('feed=rdf');
 }
 
 header('Content-type: application/rdf+xml; charset=' . get_settings('blog_charset'), true);
@@ -20,6 +18,7 @@
 	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
 	xmlns:admin="http://webns.net/mvcb/"
 	xmlns:content="http://purl.org/rss/1.0/modules/content/"
+	<?php do_action('rdf_ns'); ?>
 >
 <channel rdf:about="<?php bloginfo_rss("url") ?>">
 	<title><?php bloginfo_rss('name') ?></title>
@@ -30,15 +29,16 @@
 	<sy:updatePeriod>hourly</sy:updatePeriod>
 	<sy:updateFrequency>1</sy:updateFrequency>
 	<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
+	<?php do_action('rdf_header'); ?>
 	<items>
 		<rdf:Seq>
-		<?php $items_count = 0; if ($posts) { foreach ($posts as $post) { start_wp(); ?>
+		<?php while (have_posts()): the_post(); ?>
 			<rdf:li rdf:resource="<?php permalink_single_rss() ?>"/>
-		<?php $wp_items[] = $row; $items_count++; if (($items_count == get_settings('posts_per_rss')) && empty($m)) { break; } } } ?>
+		<?php endwhile; ?>
 		</rdf:Seq>
 	</items>
 </channel>
-<?php if ($posts) { foreach ($posts as $post) { start_wp(); ?>
+<?php rewind_posts(); while (have_posts()): the_post(); ?>
 <item rdf:about="<?php permalink_single_rss() ?>">
 	<title><?php the_title_rss() ?></title>
 	<link><?php permalink_single_rss() ?></link>
@@ -51,7 +51,7 @@
 	<description><?php the_content_rss('', 0, '', get_settings('rss_excerpt_length'), 2) ?></description>
 	<content:encoded><![CDATA[<?php the_content('', 0, '') ?>]]></content:encoded>
 <?php endif; ?>
-	
+	<?php do_action('rdf_item'); ?>
 </item>
-<?php } }  ?>
-</rdf:RDF>
\ No newline at end of file
+<?php endwhile;  ?>
+</rdf:RDF>
diff -ruN 1.5.2/wp-register.php 2.0.4/wp-register.php
--- 1.5.2/wp-register.php	2005-04-18 22:35:48.000000000 -0500
+++ 2.0.4/wp-register.php	2006-03-07 01:06:43.000000000 -0600
@@ -1,91 +1,58 @@
 <?php
 require('./wp-config.php');
+require_once( ABSPATH . WPINC . '/registration-functions.php');
 
-$wpvarstoreset = array('action');
-for ($i=0; $i<count($wpvarstoreset); $i += 1) {
-	$wpvar = $wpvarstoreset[$i];
-	if (!isset($$wpvar)) {
-		if (empty($_POST["$wpvar"])) {
-			if (empty($_GET["$wpvar"])) {
-				$$wpvar = '';
-			} else {
-				$$wpvar = $_GET["$wpvar"];
-			}
-		} else {
-			$$wpvar = $_POST["$wpvar"];
-		}
-	}
-}
-
+$action = $_REQUEST['action'];
 if ( !get_settings('users_can_register') )
 	$action = 'disabled';
 
 header( 'Content-Type: ' . get_bloginfo('html_type') . '; charset=' . get_bloginfo('charset') );
 
-switch($action) {
+switch( $action ) {
 
 case 'register':
 
-	$user_login = $_POST['user_login'];
+	$user_login = sanitize_user( $_POST['user_login'] );
 	$user_email = $_POST['user_email'];
+	
+	$errors = array();
 		
-	/* checking that username has been typed */
-	if ($user_login == '') {
-		die (__('<strong>ERROR</strong>: Please enter a username.'));
-	}
+	if ( $user_login == '' )
+		$errors['user_login'] = __('<strong>ERROR</strong>: Please enter a username.');
 
 	/* checking e-mail address */
 	if ($user_email == '') {
-		die (__('<strong>ERROR</strong>: Please type your e-mail address.'));
+		$errors['user_email'] = __('<strong>ERROR</strong>: Please type your e-mail address.');
 	} else if (!is_email($user_email)) {
-		die (__('<strong>ERROR</strong>: The email address isn&#8217;t correct.'));
+		$errors['user_email'] = __('<strong>ERROR</strong>: The email address isn&#8217;t correct.');
+		$user_email = '';
 	}
 
-	/* checking the username isn't already used by another user */
-	$result = $wpdb->get_results("SELECT user_login FROM $wpdb->users WHERE user_login = '$user_login'");
-    if (count($result) >= 1) {
-		die (__('<strong>ERROR</strong>: This username is already registered, please choose another one.'));
+	if ( ! validate_username($user_login) ) {
+		$errors['user_login'] = __('<strong>ERROR</strong>: This username is invalid.  Please enter a valid username.');
+		$user_login = '';
 	}
 
-	$user_ip = $_SERVER['REMOTE_ADDR'] ;
+	if ( username_exists( $user_login ) )
+		$errors['user_login'] = __('<strong>ERROR</strong>: This username is already registered, please choose another one.');
 
-	$user_browser = $wpdb->escape($_SERVER['HTTP_USER_AGENT']);
+	/* checking the email isn't already used by another user */
+	$email_exists = $wpdb->get_row("SELECT user_email FROM $wpdb->users WHERE user_email = '$user_email'");
+	if ( $email_exists)
+		die (__('<strong>ERROR</strong>: This email address is already registered, please supply another.'));
 
-	$user_login = $wpdb->escape( preg_replace('|a-z0-9 _.-|i', '', $user_login) );
-	$user_nickname = $user_login;
-   $user_nicename = sanitize_title($user_nickname);
-	$now = gmdate('Y-m-d H:i:s');
-	$user_level = get_settings('new_users_can_blog');
-	$password = substr( md5( uniqid( microtime() ) ), 0, 7);
-
-	$result = $wpdb->query("INSERT INTO $wpdb->users 
-		(user_login, user_pass, user_nickname, user_email, user_ip, user_browser, user_registered, user_level, user_idmode, user_nicename)
-	VALUES 
-		('$user_login', MD5('$password'), '$user_nickname', '$user_email', '$user_ip', '$user_browser', '$now', '$user_level', 'nickname', '$user_nicename')");
-
-	do_action('user_register', $wpdb->insert_id);
-
-	if ($result == false) {
-		die (sprintf(__('<strong>ERROR</strong>: Couldn&#8217;t register you... please contact the <a href="mailto:%s">webmaster</a> !'), get_settings('admin_email')));
-	}
+	if ( 0 == count($errors) ) {
+		$password = substr( md5( uniqid( microtime() ) ), 0, 7);
 
-	$stars = '';
-	for ($i = 0; $i < strlen($pass1); $i = $i + 1) {
-		$stars .= '*';
+		$user_id = wp_create_user( $user_login, $password, $user_email );
+		if ( !$user_id )
+			$errors['user_id'] = sprintf(__('<strong>ERROR</strong>: Couldn&#8217;t register you... please contact the <a href="mailto:%s">webmaster</a> !'), get_settings('admin_email'));
+		else
+			wp_new_user_notification($user_id, $password);
 	}
 	
-	$message  = sprintf(__('Username: %s'), $user_login) . "\r\n";
-	$message .= sprintf(__('Password: %s'), $password) . "\r\n";
-	$message .= get_settings('siteurl') . "/wp-login.php\r\n";
-	
-	wp_mail($user_email, sprintf(__('[%s] Your username and password'), get_settings('blogname')), $message);
-
-	$message  = sprintf(__('New user registration on your blog %s:'), get_settings('blogname')) . "\r\n\r\n";
-	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
-	$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
-
-	@wp_mail(get_settings('admin_email'), sprintf(__('[%s] New User Registration'), get_settings('blogname')), $message);
-
+	if ( 0 == count($errors) ) {
+			
 	?>
 <!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">
@@ -103,42 +70,17 @@
 
 <div id="login"> 
 	<h2><?php _e('Registration Complete') ?></h2>
-	<p><?php printf(__('Username: %s'), "<strong>$user_login</strong>") ?><br />
+	<p><?php printf(__('Username: %s'), "<strong>" . wp_specialchars($user_login) . "</strong>") ?><br />
 	<?php printf(__('Password: %s'), '<strong>' . __('emailed to you') . '</strong>') ?> <br />
-	<?php printf(__('E-mail: %s'), "<strong>$user_email</strong>") ?></p>
+	<?php printf(__('E-mail: %s'), "<strong>" . wp_specialchars($user_email) . "</strong>") ?></p>
 	<p class="submit"><a href="wp-login.php"><?php _e('Login'); ?> &raquo;</a></p>
 </div>
 </body>
 </html>
 
-	<?php
-break;
-
-case 'disabled':
-
-	?>
-<!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>
-	<title>WordPress &raquo; <?php _e('Registration Currently Disabled') ?></title>
-	<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_settings('blog_charset'); ?>">
-	<link rel="stylesheet" href="wp-admin/wp-admin.css" type="text/css">
-</head>
-
-<body>
-
-<div id="login">
-	<h2><?php _e('Registration Disabled') ?></h2>
-	<p><?php _e('User registration is currently not allowed.') ?><br />
-	<a href="<?php echo get_settings('home') . '/'; ?>" title="<?php _e('Go back to the blog') ?>"><?php _e('Home') ?></a>
-	</p>
-</div>
-
-</body>
-</html>
-
-	<?php
-break;
+		<?php
+		break;
+	}
 
 default:
 
@@ -160,16 +102,24 @@
 <div id="login">
 <h1><a href="http://wordpress.org/">WordPress</a></h1>
 <h2><?php _e('Register for this blog') ?></h2>
-
+<?php if ( isset($errors) ) : ?>
+<div class="error">
+	<ul>
+	<?php
+	foreach($errors as $error) echo "<li>$error</li>";
+	?>
+	</ul>
+</div>
+<?php endif; ?>
 <form method="post" action="wp-register.php" id="registerform">
 	<p><input type="hidden" name="action" value="register" />
-	<label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="user_login" id="user_login" size="20" maxlength="20" /><br /></p>
-	<p><label for="user_email"><?php _e('E-mail:') ?></label><br /> <input type="text" name="user_email" id="user_email" size="25" maxlength="100" /></p>
-	<p>A password will be emailed to you.</p>
+	<label for="user_login"><?php _e('Username:') ?></label><br /> <input type="text" name="user_login" id="user_login" size="20" maxlength="20" value="<?php echo wp_specialchars($user_login); ?>" /><br /></p>
+	<p><label for="user_email"><?php _e('E-mail:') ?></label><br /> <input type="text" name="user_email" id="user_email" size="25" maxlength="100" value="<?php echo wp_specialchars($user_email); ?>" /></p>
+	<p><?php _e('A password will be emailed to you.') ?></p>
 	<p class="submit"><input type="submit" value="<?php _e('Register') ?> &raquo;" id="submit" name="submit" /></p>
 </form>
 <ul>
-	<li><a href="<?php bloginfo('home'); ?>" title="<?php _e('Are you lost?') ?>">&laquo; <?php _e('Back to blog') ?></a></li>
+	<li><a href="<?php bloginfo('home'); ?>/" title="<?php _e('Are you lost?') ?>">&laquo; <?php _e('Back to blog') ?></a></li>
 	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php"><?php _e('Login') ?></a></li>
 	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=lostpassword" title="<?php _e('Password Lost and Found') ?>"><?php _e('Lost your password?') ?></a></li>
 </ul>
@@ -180,5 +130,32 @@
 <?php
 
 break;
+
+case 'disabled':
+
+	?>
+<!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>
+	<title>WordPress &raquo; <?php _e('Registration Currently Disabled') ?></title>
+	<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_settings('blog_charset'); ?>" />
+	<link rel="stylesheet" href="wp-admin/wp-admin.css" type="text/css">
+</head>
+
+<body>
+
+<div id="login">
+	<h2><?php _e('Registration Disabled') ?></h2>
+	<p><?php _e('User registration is currently not allowed.') ?><br />
+	<a href="<?php echo get_settings('home'); ?>/" title="<?php _e('Go back to the blog') ?>"><?php _e('Home') ?></a>
+	</p>
+</div>
+
+</body>
+</html>
+
+	<?php
+break;
+
 }
 ?>
diff -ruN 1.5.2/wp-rss2.php 2.0.4/wp-rss2.php
--- 1.5.2/wp-rss2.php	2005-02-24 12:29:41.000000000 -0600
+++ 2.0.4/wp-rss2.php	2005-11-28 18:16:04.000000000 -0600
@@ -1,10 +1,8 @@
 <?php
 
-if (empty($feed)) {
-	$blog = 1;
-	$feed = 'rss2';
-	$doing_rss = 1;
-	require('wp-blog-header.php');
+if (empty($wp)) {
+	require_once('wp-config.php');
+	wp('feed=rss2');
 }
 
 header('Content-type: text/xml; charset=' . get_settings('blog_charset'), true);
@@ -18,6 +16,7 @@
 	xmlns:content="http://purl.org/rss/1.0/modules/content/"
 	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
 	xmlns:dc="http://purl.org/dc/elements/1.1/"
+	<?php do_action('rss2_ns'); ?>
 >
 
 <channel>
@@ -27,7 +26,7 @@
 	<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></pubDate>
 	<generator>http://wordpress.org/?v=<?php bloginfo_rss('version'); ?></generator>
 	<language><?php echo get_option('rss_language'); ?></language>
-
+	<?php do_action('rss2_head'); ?>
 	<?php $items_count = 0; if ($posts) { foreach ($posts as $post) { start_wp(); ?>
 	<item>
 		<title><?php the_title_rss() ?></title>
@@ -37,7 +36,7 @@
 		<dc:creator><?php the_author() ?></dc:creator>
 		<?php the_category_rss() ?>
 
-		<guid><?php the_permalink($id); ?></guid>
+		<guid isPermaLink="false"><?php the_guid(); ?></guid>
 <?php if (get_settings('rss_use_excerpt')) : ?>
 		<description><![CDATA[<?php the_excerpt_rss() ?>]]></description>
 <?php else : ?>
@@ -50,6 +49,7 @@
 <?php endif; ?>
 		<wfw:commentRSS><?php echo comments_rss(); ?></wfw:commentRSS>
 <?php rss_enclosure(); ?>
+	<?php do_action('rss2_item'); ?>
 	</item>
 	<?php $items_count++; if (($items_count == get_settings('posts_per_rss')) && empty($m)) { break; } } } ?>
 </channel>
diff -ruN 1.5.2/wp-rss.php 2.0.4/wp-rss.php
--- 1.5.2/wp-rss.php	2005-02-20 22:19:43.000000000 -0600
+++ 2.0.4/wp-rss.php	2005-06-10 18:15:13.000000000 -0500
@@ -1,10 +1,8 @@
 <?php
 
-if (empty($feed)) {
-    $blog = 1;
-		$feed = 'rss';
-    $doing_rss = 1;
-    require('wp-blog-header.php');
+if (empty($wp)) {
+	require_once('wp-config.php');
+	wp('feed=rss');
 }
 
 header('Content-type: text/xml; charset=' . get_settings('blog_charset'), true);
@@ -21,6 +19,7 @@
 	<lastBuildDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></lastBuildDate>
 	<docs>http://backend.userland.com/rss092</docs>
 	<language><?php echo get_option('rss_language'); ?></language>
+	<?php do_action('rss_head'); ?>
 
 <?php $items_count = 0; if ($posts) { foreach ($posts as $post) { start_wp(); ?>
 	<item>
@@ -31,6 +30,7 @@
 		<description><?php the_content_rss('', 0, '', get_settings('rss_excerpt_length')) ?></description>
 <?php } ?>
 		<link><?php permalink_single_rss() ?></link>
+		<?php do_action('rss_item'); ?>
 	</item>
 <?php $items_count++; if (($items_count == get_settings('posts_per_rss')) && empty($m)) { break; } } } ?>
 </channel>
diff -ruN 1.5.2/wp-settings.php 2.0.4/wp-settings.php
--- 1.5.2/wp-settings.php	2005-08-14 22:57:54.000000000 -0500
+++ 2.0.4/wp-settings.php	2006-07-05 19:08:53.000000000 -0500
@@ -18,14 +18,14 @@
 
 unregister_GLOBALS(); 
 
-$HTTP_HOST = getenv('HTTP_HOST');  /* domain name */
-$REMOTE_ADDR = getenv('REMOTE_ADDR'); /* visitor's IP */
-$HTTP_USER_AGENT = getenv('HTTP_USER_AGENT'); /* visitor's browser */
 unset( $wp_filter, $cache_userdata, $cache_lastcommentmodified, $cache_lastpostdate, $cache_settings, $category_cache, $cache_categories );
 
+if ( ! isset($blog_id) )
+	$blog_id = 1;
+
 // Fix for IIS, which doesn't set REQUEST_URI
-if (! isset($_SERVER['REQUEST_URI'])) {
-	$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
+if ( empty( $_SERVER['REQUEST_URI'] ) ) {
+	$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME']; // Does this work under CGI?
 	
 	// Append the query string if it exists and isn't null
 	if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
@@ -33,6 +33,19 @@
 	}
 }
 
+// Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests
+if ( isset($_SERVER['SCRIPT_FILENAME']) && ( strpos($_SERVER['SCRIPT_FILENAME'], 'php.cgi') == strlen($_SERVER['SCRIPT_FILENAME']) - 7 ) )
+	$_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];
+
+// Fix for Dreamhost and other PHP as CGI hosts
+if ( strstr( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) )
+	unset($_SERVER['PATH_INFO']);
+
+// Fix empty PHP_SELF
+$PHP_SELF = $_SERVER['PHP_SELF'];
+if ( empty($PHP_SELF) )
+	$_SERVER['PHP_SELF'] = $PHP_SELF = preg_replace("/(\?.*)?$/",'',$_SERVER["REQUEST_URI"]);
+
 if ( !(phpversion() >= '4.1') )
 	die( 'Your server is running PHP version ' . phpversion() . ' but WordPress requires at least 4.1' );
 
@@ -68,9 +81,14 @@
 $wpdb->linkcategories   = $table_prefix . 'linkcategories';
 $wpdb->options          = $table_prefix . 'options';
 $wpdb->postmeta         = $table_prefix . 'postmeta';
+$wpdb->usermeta         = $table_prefix . 'usermeta';
+
+$wpdb->prefix           = $table_prefix;
 
 if ( defined('CUSTOM_USER_TABLE') )
 	$wpdb->users = CUSTOM_USER_TABLE;
+if ( defined('CUSTOM_USER_META_TABLE') )
+	$wpdb->usermeta = CUSTOM_USER_META_TABLE;
 
 // We're going to need to keep this around for a few months even though we're not using it internally
 
@@ -84,12 +102,23 @@
 $tableoptions = $wpdb->options;
 $tablepostmeta = $wpdb->postmeta;
 
+if ( file_exists(ABSPATH . 'wp-content/object-cache.php') )
+	require (ABSPATH . 'wp-content/object-cache.php');
+else
+	require (ABSPATH . WPINC . '/cache.php');
+
+// To disable persistant caching, add the below line to your wp-config.php file, uncommented of course.
+// define('DISABLE_CACHE', true);
+
+wp_cache_init();
+
 require (ABSPATH . WPINC . '/functions.php');
 require (ABSPATH . WPINC . '/default-filters.php');
 require_once (ABSPATH . WPINC . '/wp-l10n.php');
 
 $wpdb->hide_errors();
-if ( !update_user_cache() && (!strstr($_SERVER['PHP_SELF'], 'install.php') && !defined('WP_INSTALLING')) ) {
+$db_check = $wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'");
+if ( !$db_check && (!strstr($_SERVER['PHP_SELF'], 'install.php') && !defined('WP_INSTALLING')) ) {
 	if ( strstr($_SERVER['PHP_SELF'], 'wp-admin') )
 		$link = 'install.php';
 	else
@@ -100,6 +129,7 @@
 
 require (ABSPATH . WPINC . '/functions-formatting.php');
 require (ABSPATH . WPINC . '/functions-post.php');
+require (ABSPATH . WPINC . '/capabilities.php');
 require (ABSPATH . WPINC . '/classes.php');
 require (ABSPATH . WPINC . '/template-functions-general.php');
 require (ABSPATH . WPINC . '/template-functions-links.php');
@@ -112,15 +142,24 @@
 require (ABSPATH . WPINC . '/kses.php');
 require (ABSPATH . WPINC . '/version.php');
 
-if (!strstr($_SERVER['PHP_SELF'], 'install.php') && !strstr($_SERVER['PHP_SELF'], 'wp-admin/import')) :
+if (!strstr($_SERVER['PHP_SELF'], 'install.php')) :
     // Used to guarantee unique hash cookies
     $cookiehash = md5(get_settings('siteurl')); // Remove in 1.4
 	define('COOKIEHASH', $cookiehash); 
 endif;
 
-require (ABSPATH . WPINC . '/vars.php');
+if ( !defined('USER_COOKIE') )
+	define('USER_COOKIE', 'wordpressuser_'. COOKIEHASH);
+if ( !defined('PASS_COOKIE') )
+	define('PASS_COOKIE', 'wordpresspass_'. COOKIEHASH);
+if ( !defined('COOKIEPATH') )
+	define('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_settings('home') . '/' ) );
+if ( !defined('SITECOOKIEPATH') )
+	define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_settings('siteurl') . '/' ) );
+if ( !defined('COOKIE_DOMAIN') )
+	define('COOKIE_DOMAIN', false);
 
-do_action('core_files_loaded');
+require (ABSPATH . WPINC . '/vars.php');
 
 // Check for hacks file if the option is enabled
 if (get_settings('hack_file')) {
@@ -145,6 +184,25 @@
 
 do_action('plugins_loaded');
 
+// If already slashed, strip.
+if ( get_magic_quotes_gpc() ) {
+	$_GET    = stripslashes_deep($_GET   );
+	$_POST   = stripslashes_deep($_POST  );
+	$_COOKIE = stripslashes_deep($_COOKIE);
+}
+
+// Escape with wpdb.
+$_GET    = add_magic_quotes($_GET   );
+$_POST   = add_magic_quotes($_POST  );
+$_COOKIE = add_magic_quotes($_COOKIE);
+$_SERVER = add_magic_quotes($_SERVER);
+
+do_action('sanitize_comment_cookies');
+
+$wp_query   = new WP_Query();
+$wp_rewrite = new WP_Rewrite();
+$wp         = new WP();
+
 define('TEMPLATEPATH', get_template_directory());
 
 // Load the default text localization domain.
@@ -153,18 +211,17 @@
 // Pull in locale data after loading text domain.
 require_once(ABSPATH . WPINC . '/locale.php');
 
-if ( !get_magic_quotes_gpc() ) {
-	$_GET    = add_magic_quotes($_GET   );
-	$_POST   = add_magic_quotes($_POST  );
-	$_COOKIE = add_magic_quotes($_COOKIE);
-	$_SERVER = add_magic_quotes($_SERVER);
-}
+// Load functions for active theme.
+if ( file_exists(TEMPLATEPATH . "/functions.php") )
+	include(TEMPLATEPATH . "/functions.php");
 
 function shutdown_action_hook() {
 	do_action('shutdown');
+	wp_cache_close();
 }
 register_shutdown_function('shutdown_action_hook');
 
-// Everything is loaded.
+// Everything is loaded and initialized.
 do_action('init');
-?>
+
+?>
\ No newline at end of file
diff -ruN 1.5.2/wp-trackback.php 2.0.4/wp-trackback.php
--- 1.5.2/wp-trackback.php	2005-04-20 17:06:28.000000000 -0500
+++ 2.0.4/wp-trackback.php	2006-06-27 18:10:02.000000000 -0500
@@ -1,10 +1,8 @@
 <?php
-require_once( dirname(__FILE__) . '/wp-config.php' );
 
-if ( empty($doing_trackback) ) {
-	$doing_trackback = true;
-	$tb = true;
-	require_once('wp-blog-header.php');
+if (empty($wp)) {
+	require_once('wp-config.php');
+	wp('tb=1');
 }
 
 function trackback_response($error = 0, $error_message = '') {
@@ -57,7 +55,7 @@
 
 if (empty($title) && empty($tb_url) && empty($blog_name)) {
 	// If it doesn't look like a trackback at all...
-	header('Location: ' . get_permalink($tb_id));
+	wp_redirect(get_permalink($tb_id));
 	exit;
 }
 
@@ -70,9 +68,14 @@
 		trackback_response(1, 'Sorry, trackbacks are closed for this item.');
 
 	$title =  wp_specialchars( strip_tags( $title ) );
-	$title = (strlen($title) > 250) ? substr($title, 0, 250) . '...' : $title;
 	$excerpt = strip_tags($excerpt);
-	$excerpt = (strlen($excerpt) > 255) ? substr($excerpt, 0, 252) . '...' : $excerpt;
+	if ( function_exists('mb_strcut') ) { // For international trackbacks
+		$excerpt = mb_strcut($excerpt, 0, 252, get_settings('blog_charset')) . '...';
+		$title = mb_strcut($title, 0, 250, get_settings('blog_charset')) . '...';
+	} else {
+		$excerpt = (strlen($excerpt) > 255) ? substr($excerpt, 0, 252) . '...' : $excerpt;
+		$title = (strlen($title) > 250) ? substr($title, 0, 250) . '...' : $title;
+	}
 
 	$comment_post_ID = $tb_id;
 	$comment_author = $blog_name;
diff -ruN 1.5.2/xmlrpc.php 2.0.4/xmlrpc.php
--- 1.5.2/xmlrpc.php	2005-08-14 13:06:02.000000000 -0500
+++ 2.0.4/xmlrpc.php	2006-07-26 17:56:56.000000000 -0500
@@ -1,9 +1,37 @@
 <?php
 
+define('XMLRPC_REQUEST', true);
+
+// Some browser-embedded clients send cookies. We don't want them.
+$_COOKIE = array();
+
 # fix for mozBlog and other cases where '<?xml' isn't on the very first line
-$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
+if ( isset($HTTP_RAW_POST_DATA) )
+	$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
 
 include('./wp-config.php');
+
+if ( isset( $_GET['rsd'] ) ) { // http://archipelago.phrasewise.com/rsd 
+header('Content-type: text/xml; charset=' . get_settings('blog_charset'), true);
+
+?>
+<?php echo '<?xml version="1.0" encoding="'.get_settings('blog_charset').'"?'.'>'; ?>
+<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
+  <service>
+    <engineName>WordPress</engineName>
+    <engineLink>http://wordpress.org/</engineLink>
+    <homePageLink><?php bloginfo_rss('url') ?></homePageLink>
+    <apis>
+      <api name="Movable Type" blogID="1" preferred="true" apiLink="<?php bloginfo_rss('url') ?>/xmlrpc.php" />
+      <api name="MetaWeblog" blogID="1" preferred="false" apiLink="<?php bloginfo_rss('url') ?>/xmlrpc.php" />
+      <api name="Blogger" blogID="1" preferred="false" apiLink="<?php bloginfo_rss('url') ?>/xmlrpc.php" />
+    </apis>
+  </service>
+</rsd>
+<?php
+exit;
+}
+
 include_once(ABSPATH . WPINC . '/class-IXR.php');
 
 // Turn off all warnings and errors.
@@ -157,8 +185,8 @@
 	    return $this->error;
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-	  $is_admin = $user_data->user_level > 3;
+	  set_current_user(0, $user_login);
+	  $is_admin = current_user_can('level_8');
 
 	  $struct = array(
 	    'isAdmin'  => $is_admin,
@@ -186,12 +214,12 @@
 	  $user_data = get_userdatabylogin($user_login);
 
 	  $struct = array(
-	    'nickname'  => $user_data->user_nickname,
+	    'nickname'  => $user_data->nickname,
 	    'userid'    => $user_data->ID,
 	    'url'       => $user_data->user_url,
 	    'email'     => $user_data->user_email,
-	    'lastname'  => $user_data->user_lastname,
-	    'firstname' => $user_data->user_firstname
+	    'lastname'  => $user_data->last_name,
+	    'firstname' => $user_data->first_name
 	  );
 
 	  return $struct;
@@ -295,15 +323,14 @@
 	    return $this->error;
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-
-	  if ($user_data->user_level < 3) {
-	    return new IXR_Error(401, 'Sorry, users whose level is less than 3, can not edit the template.');
+	  set_current_user(0, $user_login);
+	  if ( !current_user_can('edit_themes') ) {
+	    return new IXR_Error(401, 'Sorry, this user can not edit the template.');
 	  }
 
 	  /* warning: here we make the assumption that the weblog's URI is on the same server */
 	  $filename = get_settings('home') . '/';
-	  $filename = preg_replace('#http://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename);
+	  $filename = preg_replace('#https?://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename);
 
 	  $f = fopen($filename, 'r');
 	  $content = fread($f, filesize($filename));
@@ -331,15 +358,14 @@
 	    return $this->error;
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-
-	  if ($user_data->user_level < 3) {
-	    return new IXR_Error(401, 'Sorry, users whose level is less than 3, can not edit the template.');
+	  set_current_user(0, $user_login);
+	  if ( !current_user_can('edit_themes') ) {
+	    return new IXR_Error(401, 'Sorry, this user can not edit the template.');
 	  }
 
 	  /* warning: here we make the assumption that the weblog's URI is on the same server */
 	  $filename = get_settings('home') . '/';
-	  $filename = preg_replace('#http://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename);
+	  $filename = preg_replace('#https?://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename);
 
 	  if ($f = fopen($filename, 'w+')) {
 	    fwrite($f, $content);
@@ -368,21 +394,19 @@
 	  if (!$this->login_pass_ok($user_login, $user_pass)) {
 	    return $this->error;
 	  }
-
-	  $user_data = get_userdatabylogin($user_login);
-	  if (!user_can_create_post($user_data->ID, $blog_ID)) {
+	  
+	  $cap = ($publish) ? 'publish_posts' : 'edit_posts';
+	  $user = set_current_user(0, $user_login);
+	  if ( !current_user_can($cap) )
 	    return new IXR_Error(401, 'Sorry, you can not post on this weblog or category.');
-	  }
 
 	  $post_status = ($publish) ? 'publish' : 'draft';
 
-	  $post_author = $user_data->ID;
+	  $post_author = $user->ID;
 
 	  $post_title = xmlrpc_getposttitle($content);
 	  $post_category = xmlrpc_getpostcategory($content);
-
-	  $content = xmlrpc_removepostdata($content);
-	  $post_content = apply_filters( 'content_save_pre', $content );
+	  $post_content = xmlrpc_removepostdata($content);
 
 	  $post_date = current_time('mysql');
 	  $post_date_gmt = current_time('mysql', 1);
@@ -411,7 +435,7 @@
 	  $post_ID     = $args[1];
 	  $user_login  = $args[2];
 	  $user_pass   = $args[3];
-	  $new_content = $args[4];
+	  $content     = $args[4];
 	  $publish     = $args[5];
 
 	  if (!$this->login_pass_ok($user_login, $user_pass)) {
@@ -426,22 +450,15 @@
 
 		$this->escape($actual_post);
 
-	  $post_author_data = get_userdata($actual_post['post_author']);
-	  $user_data = get_userdatabylogin($user_login);
-
-	  if (!user_can_edit_post($user_data->ID, $post_ID)) {
+	  set_current_user(0, $user_login);
+	  if ( !current_user_can('edit_post', $post_ID) )
 	    return new IXR_Error(401, 'Sorry, you do not have the right to edit this post.');
-	  }
 
 	  extract($actual_post);
 
-	  $content = $newcontent;
-
 	  $post_title = xmlrpc_getposttitle($content);
 	  $post_category = xmlrpc_getpostcategory($content);
-
-	  $content = xmlrpc_removepostdata($content);
-	  $post_content = apply_filters( 'content_save_pre', $content );
+	  $post_content = xmlrpc_removepostdata($content);
 
 	  $postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt');
 
@@ -477,11 +494,9 @@
 	  	return new IXR_Error(404, 'Sorry, no such post.');
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-
-	  if (!user_can_delete_post($user_data->ID, $post_ID)) {
+	  set_current_user(0, $user_login);
+	  if ( !current_user_can('edit_post', $post_ID) )
 	    return new IXR_Error(401, 'Sorry, you do not have the right to delete this post.');
-	  }
 
 	  $result = wp_delete_post($post_ID);
 
@@ -515,12 +530,11 @@
 	    return $this->error;
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-	  if (!user_can_create_post($user_data->ID, $blog_ID)) {
+	  $user = set_current_user(0, $user_login);
+	  if ( !current_user_can('publish_posts') )
 	    return new IXR_Error(401, 'Sorry, you can not post on this weblog or category.');
-	  }
 
-	  $post_author = $user_data->ID;
+	  $post_author = $user->ID;
 
 	  $post_title = $content_struct['title'];
 	  $post_content = apply_filters( 'content_save_pre', $content_struct['description'] );
@@ -575,16 +589,6 @@
 
 	  logIO('O', "Posted ! ID: $post_ID");
 
-	  // FIXME: do we pingback always? pingback($content, $post_ID);
-	  // trackback_url_list($content_struct['mt_tb_ping_urls'],$post_ID);
-
-		if ('publish' == $post_status) {
-			if ($post_pingback) pingback($content, $post_ID);
-			do_enclose( $content, $post_ID );
-			do_trackbacks($post_ID);
-			do_action('publish_post', $post_ID);
-		}  
-
 	  return strval($post_ID);
 	}
 
@@ -606,10 +610,9 @@
 	    return $this->error;
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-	  if (!user_can_edit_post($user_data->ID, $post_ID)) {
+	  set_current_user(0, $user_login);
+	  if ( !current_user_can('edit_post', $post_ID) )
 	    return new IXR_Error(401, 'Sorry, you can not edit this post.');
-	  }
 
 	  $postdata = wp_get_single_post($post_ID, ARRAY_A);
 	  extract($postdata);
@@ -666,16 +669,6 @@
 
 	  logIO('O',"(MW) Edited ! ID: $post_ID");
 
-	  // FIXME: do we pingback always? pingback($content, $post_ID);
-	  // trackback_url_list($content_struct['mt_tb_ping_urls'], $post_ID);
-		if ('publish' == $post_status) {
-			if ($post_pingback) pingback($content, $post_ID);
-			do_enclose( $content, $post_ID );
-			do_trackbacks($post_ID);
-			do_action('publish_post', $post_ID);
-		}	
-		do_action('edit_post', $post_ID);
-
 	  return true;
 	}
 
@@ -837,83 +830,42 @@
 
 	/* metaweblog.newMediaObject uploads a file, following your settings */
 	function mw_newMediaObject($args) {
-	  // adapted from a patch by Johann Richard
-	  // http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/
+		// adapted from a patch by Johann Richard
+		// http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/
 
 		global $wpdb;
 
-	  $blog_ID     = $wpdb->escape($args[0]);
-	  $user_login  = $wpdb->escape($args[1]);
+		$blog_ID     = $wpdb->escape($args[0]);
+		$user_login  = $wpdb->escape($args[1]);
 		$user_pass   = $wpdb->escape($args[2]);
-	  $data        = $args[3];
+		$data        = $args[3];
 
-	  $name = $data['name'];
-	  $type = $data['type'];
-	  $bits = $data['bits'];
-
-	  $file_realpath = get_settings('fileupload_realpath'); 
-	  $file_url = get_settings('fileupload_url');
-
-	  logIO('O', '(MW) Received '.strlen($bits).' bytes');
-
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
-
-	  $user_data = get_userdatabylogin($user_login);
-
-	  if(!get_settings('use_fileupload')) {
-	    // Uploads not allowed
-	    logIO('O', '(MW) Uploads not allowed');
-	    $this->error = new IXR_Error(405, 'No uploads allowed for this site.');
-	    return $this->error;
-	  } 
-
-	  if(get_settings('fileupload_minlevel') > $user_data->user_level) {
-	    // User has not enough privileges
-	    logIO('O', '(MW) Not enough privilege: user level too low');
-	    $this->error = new IXR_Error(401, 'You are not allowed to upload files to this site.');
-	    return $this->error;
-	  }
-
-	  if(trim($file_realpath) == '' || trim($file_url) == '' ) {
-	    // WordPress is not correctly configured
-	    logIO('O', '(MW) Bad configuration. Real/URL path not defined');
-	    $this->error = new IXR_Error(500, 'Please configure WordPress with valid paths for file upload.');
-	    return $this->error;
-	  }
-
-	  $prefix = '/';
-
-	  if(!empty($name)) {
-	    // Create the path
-	    $localpath = $file_realpath.$prefix.$name;
-	    $url = $file_url.$prefix.$name;
-
-	    if (mkdir_p(dirname($localpath))) {
-
-	      /* encode & write data (binary) */
-	      $ifp = fopen($localpath, 'wb');
-	      $success = fwrite($ifp, $bits);
-	      fclose($ifp);
-	      @chmod($localpath, 0666);
-
-	      if($success) {
-	        $resp = array('url' => $url);
-	        return $resp;
-	      } else {
-	        logIO('O', '(MW) Could not write file '.$name.' to '.$localpath);
-	        return new IXR_Error(500, 'Could not write file '.$name);
-	      }
+		$name = $data['name'];
+		$type = $data['type'];
+		$bits = $data['bits'];
+
+		logIO('O', '(MW) Received '.strlen($bits).' bytes');
+
+		if ( !$this->login_pass_ok($user_login, $user_pass) )
+			return $this->error;
+
+		set_current_user(0, $user_login);
+		if ( !current_user_can('upload_files') ) {
+			logIO('O', '(MW) User does not have upload_files capability');
+			$this->error = new IXR_Error(401, 'You are not allowed to upload files to this site.');
+			return $this->error;
+		}
 
-	    } else {
-	      return new IXR_Error(500, 'Could not create directories for '.$name);
-	    }
-	  }
+		$upload = wp_upload_bits($name, $type, $bits);
+		if ( ! empty($upload['error']) ) {
+			logIO('O', '(MW) Could not write file '.$name);
+			return new IXR_Error(500, 'Could not write file '.$name);
+		}
+		
+		return array('url' => $upload['url']);
 	}
 
 
-
 	/* MovableType API functions
 	 * specs on http://www.movabletype.org/docs/mtmanual_programmatic.html
 	 */
@@ -1036,10 +988,9 @@
 	    return $this->error;
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-	  if (!user_can_edit_post($user_data->ID, $post_ID)) {
+	  set_current_user(0, $user_login);
+	  if ( !current_user_can('edit_post', $post_ID) )
 	    return new IXR_Error(401, 'Sorry, you can not edit this post.');
-	  }
 
 	  foreach($categories as $cat) {
 	    $catids[] = $cat['categoryId'];
@@ -1119,10 +1070,9 @@
 	    return $this->error;
 	  }
 
-	  $user_data = get_userdatabylogin($user_login);
-	  if (!user_can_edit_post($user_data->ID, $post_ID)) {
+	  set_current_user(0, $user_login);
+	  if ( !current_user_can('edit_post', $post_ID) )
 	    return new IXR_Error(401, 'Sorry, you can not edit this post.');
-	  }
 
 	  $postdata = wp_get_single_post($post_ID,ARRAY_A);
 
@@ -1161,7 +1111,7 @@
 		$error_code = -1;
 
 		// Check if the page linked to is in our site
-		$pos1 = strpos($pagelinkedto, str_replace('http://', '', str_replace('www.', '', get_settings('home'))));
+		$pos1 = strpos($pagelinkedto, str_replace(array('http://www.','http://','https://www.','https://'), '', get_settings('home')));
 		if( !$pos1 )
 	  		return new IXR_Error(0, 'Is there no link to us?');
 
@@ -1215,6 +1165,9 @@
 		if ( !$post ) // Post_ID not found
 	  		return new IXR_Error(33, 'The specified target URI cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.');
 
+		if ( $post_ID == url_to_postid($pagelinkedfrom) )
+			return new IXR_Error(0, 'The source URI and the target URI cannot both point to the same resource.');
+
 		// Check if pings are on
 		if ( 'closed' == $post->ping_status )
 	  		return new IXR_Error(33, 'The specified target URI cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.');
@@ -1265,20 +1218,22 @@
 			}
 		}
 
-		if ( empty($context) )  // URL pattern not found
+		if ( empty($context) ) // URL pattern not found
 			return new IXR_Error(17, 'The source URI does not contain a link to the target URI, and so cannot be used as a source.');
 
 		$pagelinkedfrom = preg_replace('#&([^amp\;])#is', '&amp;$1', $pagelinkedfrom);
 
 		$context = '[...] ' . wp_specialchars( $excerpt ) . ' [...]';
 		$original_pagelinkedfrom = $pagelinkedfrom;
-		$pagelinkedfrom = addslashes( $pagelinkedfrom );
+		$pagelinkedfrom = $wpdb->escape( $pagelinkedfrom );
 		$original_title = $title;
 
-		$comment_post_ID = $post_ID;
+		$comment_post_ID = (int) $post_ID;
 		$comment_author = $title;
+		$this->escape($comment_author);
 		$comment_author_url = $pagelinkedfrom;
 		$comment_content = $context;
+		$this->escape($comment_content);
 		$comment_type = 'pingback';
 
 		$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_content', 'comment_type');
