Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 14679)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -3697,14 +3697,48 @@
 }
 
 /* Custom Header */
+.appearance_page_custom-header #headimg  {
+	position: relative;
+}
 
-table#available-headers td {
-	padding: 0 20px 10px 0;
+.appearance_page_custom-header #headimg img {
+	z-index: -1;
+	width: 100%;
+	height: 100%;
+	top: 0;
+	left: 0;
+	position: absolute;
 }
-table#available-headers label input {
-	margin-right: 8px;
+
+.appearance_page_custom-header #headimg h1 {
+	font-family: 'Trebuchet MS', 'Lucida Grande', Verdana,Arial, Sans-Serif;
+	font-size: 18px;
+	font-weight: bold;
+	margin: 0;
+	padding-top: 5%;
+	text-align: center;
 }
-table#available-headers label img {
+
+.appearance_page_custom-header #headimg #desc {
+	font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
+	font-size: 10px;
+	text-align: center;
+}
+
+.appearance_page_custom-header #upload-form p label {
+	font-size: 11px;
+}
+
+.appearance_page_custom-header  #available-headers .default-header {
+	float: left;
+	margin: 0 20px 20px 0;
+}
+
+.appearance_page_custom-header #available-headers label input {
+	margin-right: 10px;
+}
+
+.appearance_page_custom-header #available-headers label img {
 	vertical-align: middle;
 }
 
Index: wp-admin/custom-header.php
===================================================================
--- wp-admin/custom-header.php	(revision 14679)
+++ wp-admin/custom-header.php	(working copy)
@@ -50,7 +50,7 @@
 	 * @param callback $admin_image_div_callback Optional custom image div output callback.
 	 * @return Custom_Image_Header
 	 */
-	function Custom_Image_Header($admin_header_callback, $admin_image_div_callback = '') {
+	function Custom_Image_Header( $admin_header_callback, $admin_image_div_callback = '' ) {
 		$this->admin_header_callback = $admin_header_callback;
 		$this->admin_image_div_callback = $admin_image_div_callback;
 	}
@@ -61,16 +61,16 @@
 	 * @since 2.1.0
 	 */
 	function init() {
-		if ( ! current_user_can('edit_theme_options') )
+		if ( ! current_user_can( 'edit_theme_options' ) )
 			return;
 
-		$page = add_theme_page(__('Header'), __('Header'), 'edit_theme_options', 'custom-header', array(&$this, 'admin_page'));
+		$page = add_theme_page( __( 'Header' ), __( 'Header' ), 'edit_theme_options', 'custom-header', array( &$this, 'admin_page' ) );
 
-		add_action("admin_print_scripts-$page", array(&$this, 'js_includes'));
-		add_action("admin_print_styles-$page", array(&$this, 'css_includes'));
-		add_action("admin_head-$page", array(&$this, 'take_action'), 50);
-		add_action("admin_head-$page", array(&$this, 'js'), 50);
-		add_action("admin_head-$page", $this->admin_header_callback, 51);
+		add_action( "admin_print_scripts-$page", array( &$this, 'js_includes' ) );
+		add_action( "admin_print_styles-$page", array( &$this, 'css_includes' ) );
+		add_action( "admin_head-$page", array( &$this, 'take_action' ), 50);
+		add_action( "admin_head-$page", array( &$this, 'js' ), 50 );
+		add_action( "admin_head-$page", $this->admin_header_callback, 51 );
 	}
 
 	/**
@@ -99,10 +99,10 @@
 	function js_includes() {
 		$step = $this->step();
 
-		if ( 1 == $step )
-			wp_enqueue_script('farbtastic');
+		if ( ( 1 == $step || 3 == $step ) && $this->header_text() )
+			wp_enqueue_script( 'farbtastic' );
 		elseif ( 2 == $step )
-			wp_enqueue_script('jcrop');
+			wp_enqueue_script( 'imgareaselect' );
 	}
 
 	/**
@@ -113,11 +113,23 @@
 	function css_includes() {
 		$step = $this->step();
 
-		if ( 1 == $step )
-			wp_enqueue_style('farbtastic');
+		if ( ( 1 == $step || 3 == $step ) && $this->header_text() )
+			wp_enqueue_style( 'farbtastic' );
 		elseif ( 2 == $step )
-			wp_enqueue_style('jcrop');
+			wp_enqueue_style( 'imgareaselect' );
 	}
+	
+	/**
+	 * Check if header text is allowed
+	 *
+	 * @since 3.0.0
+	 */
+	function header_text() {
+		if ( defined( 'NO_HEADER_TEXT' ) && NO_HEADER_TEXT )
+			return false;
+		
+		return true;
+	}
 
 	/**
 	 * Execute custom header modification.
@@ -125,31 +137,51 @@
 	 * @since 2.6.0
 	 */
 	function take_action() {
-		if ( ! current_user_can('edit_theme_options') )
+		if ( ! current_user_can( 'edit_theme_options' ) )
 			return;
+			
+		if ( empty( $_POST ) )
+			return;
+			
+		$this->updated = true;
+			
+		if ( isset( $_POST['resetheader'] ) ) {
+			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
+			remove_theme_mod( 'header_image' );
+			return;
+		}
+		
+		if ( isset( $_POST['resettext'] ) ) {
+			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
+			remove_theme_mod('header_textcolor');
+			return;
+		}
+		
+		if ( isset( $_POST['removeheader'] ) ) {
+			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
+			set_theme_mod( 'header_image', '' );
+			return;
+		}
 
-		if ( isset( $_POST['textcolor'] ) ) {
-			check_admin_referer('custom-header');
-			if ( 'blank' == $_POST['textcolor'] ) {
-				set_theme_mod('header_textcolor', 'blank');
+		if ( isset( $_POST['text-color'] ) ) {
+			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
+			$_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] );
+			if ( 'blank' == $_POST['text-color'] ) {
+				set_theme_mod( 'header_textcolor', 'blank' );
 			} else {
-				$color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['textcolor']);
+				$color = preg_replace( '/[^0-9a-fA-F]/', '', $_POST['text-color'] );
 				if ( strlen($color) == 6 || strlen($color) == 3 )
-					set_theme_mod('header_textcolor', $color);
+					set_theme_mod( 'header_textcolor', $color );
 			}
 		}
 
-		if ( isset($_POST['resetheader']) ) {
-			check_admin_referer('custom-header');
-			remove_theme_mods();
+		if ( isset( $_POST['default-header'] ) ) {
+			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
+			$this->process_default_headers();
+			if ( isset( $this->default_headers[$_POST['default-header']] ) )
+				set_theme_mod( 'header_image', esc_url( $this->default_headers[$_POST['default-header']]['url'] ) );
 		}
 
-		if ( isset($_POST['default-header']) ) {
-			check_admin_referer('custom-header');
-			$this->process_default_headers();
-			if ( isset($this->default_headers[$_POST['default-header']]) )
-				set_theme_mod('header_image', esc_url($this->default_headers[$_POST['default-header']]['url']));
-		}
 	}
 
 	/**
@@ -160,10 +192,10 @@
 	function process_default_headers() {
 		global $_wp_default_headers;
 
-		if ( !empty($this->headers) )
+		if ( ! empty( $this->headers ) )
 			return;
 
-		if ( !isset($_wp_default_headers) )
+		if ( ! isset( $_wp_default_headers ) )
 			return;
 
 		$this->default_headers = $_wp_default_headers;
@@ -179,39 +211,19 @@
 	 * @since 3.0.0
 	 */
 	function show_default_header_selector() {
-		echo '<table id="available-headers" cellspacing="0" cellpadding="0">';
+		echo '<div id="available-headers">';
 
-		$headers = array_keys($this->default_headers);
-		$table = array();
-		$rows = ceil(count($headers) / 3);
-		for ( $row = 1; $row <= $rows; $row++ ) {
-			for ( $col = 1; $col <= 3; $col++ ) {
-				$table[$row][$col] = array_shift($headers);
-			}
+		foreach ( $this->default_headers as $header_key => $header ) {
+			$header_thumbnail = $header['thumbnail_url'];
+			$header_url = $header['url'];
+			$header_desc = $header['description'];
+			echo '<div class="default-header">';
+			echo '<label><input name="default-header" type="radio" value="' . esc_attr($header_key) . '" ' . checked($header_url, get_theme_mod( 'header_image' ), false) . ' />';
+			echo '<img src="' . $header_thumbnail . '" alt="' . esc_attr($header_desc) .'" title="' . esc_attr($header_desc) .'" /></label>';
+			echo '</div>';
 		}
-
-		foreach ( $table as $row => $cols ) {
-			echo '<tr>';
-			foreach ( $cols as $col => $header_key ) {
-				if ( !$header_key )
-					continue;
-				$class = array('available-header');
-				if ( $row == 1 ) $class[] = 'top';
-				if ( $col == 1 ) $class[] = 'left';
-				if ( $row == $rows ) $class[] = 'bottom';
-				if ( $col == 3 ) $class[] = 'right';
-				if ( !isset($this->headers[$header_key]))
-				echo '<td class="' . join(' ', $class) . '">';
-				$header_thumbnail = $this->default_headers[$header_key]['thumbnail_url'];
-				$header_url = $this->default_headers[$header_key]['url'];
-				$header_desc = $this->default_headers[$header_key]['description'];
-				echo '<label><input name="default-header" type="radio" value="' . esc_attr($header_key) . '" ' . checked($header_url, get_header_image(), false) . ' />';
-				echo '<img src="' . $header_thumbnail . '" alt="' . esc_attr($header_desc) .'" /></label>';
-				echo  '</td>';
-			}
-			echo '</tr>';
-		}
-		echo '</table>';
+		
+		echo '<div class="clear"></div></div>';
 	}
 
 	/**
@@ -221,87 +233,101 @@
 	 */
 	function js() {
 		$step = $this->step();
-		if ( 1 == $step )
+		if ( ( 1 == $step || 3 == $step ) && $this->header_text() )
 			$this->js_1();
 		elseif ( 2 == $step )
 			$this->js_2();
 	}
 
 	/**
-	 * Display Javascript based on Step 1.
+	 * Display Javascript based on Step 1 and 3.
 	 *
 	 * @since 2.6.0
 	 */
 	function js_1() { ?>
 <script type="text/javascript">
-	var buttons = ['#name', '#desc', '#pickcolor', '#defaultcolor'];
+/* <![CDATA[ */
+	var text_objects = ['#name', '#desc', '#text-color-row'];
 	var farbtastic;
+	var default_color = '#<?php echo HEADER_TEXTCOLOR; ?>';
+	var old_color = null;
 
 	function pickColor(color) {
 		jQuery('#name').css('color', color);
 		jQuery('#desc').css('color', color);
-		jQuery('#textcolor').val(color);
+		jQuery('#text-color').val(color);
 		farbtastic.setColor(color);
 	}
+	
+	function toggle_text(s) {
+		if (jQuery(s).attr('id') == 'showtext' && jQuery('#text-color').val() != 'blank')
+			return;
+		
+		if (jQuery(s).attr('id') == 'hidetext' && jQuery('#text-color').val() == 'blank')
+			return;
 
+		if (jQuery('#text-color').val() == 'blank') {
+			//Show text
+			if (old_color == '#blank')
+				old_color = default_color;
+	
+			jQuery( text_objects.toString() ).show();
+			jQuery('#text-color').val(old_color);
+			jQuery('#name').css('color', old_color);
+			jQuery('#desc').css('color', old_color);
+			pickColor(old_color); 
+		} else {
+			//Hide text
+			jQuery( text_objects.toString() ).hide();
+			old_color = jQuery('#text-color').val();
+			jQuery('#text-color').val('blank');
+		}
+	}
+
 	jQuery(document).ready(function() {
 		jQuery('#pickcolor').click(function() {
-			jQuery('#colorPickerDiv').show();
+			jQuery('#color-picker').show();
 		});
 
-		jQuery('#hidetext').click(function() {
-			toggle_text();
+		jQuery('input[name="hidetext"]').click(function() {
+			toggle_text(this);
 		});
+		
+		jQuery('#defaultcolor').click(function() {
+			pickColor(default_color);
+			jQuery('#text-color').val(default_color)
+		});
+		
+		jQuery('#text-color').keyup(function() {
+			var _hex = jQuery('#text-color').val();
+			var hex = _hex;
+			if ( hex[0] != '#' )
+				hex = '#' + hex;
+			hex = hex.replace(/[^#a-fA-F0-9]+/, '');
+			if ( hex != _hex )
+				jQuery('#text-color').val(hex);
+			if ( hex.length == 4 || hex.length == 7 )
+				pickColor( hex );
+		});
+		
+		jQuery(document).mousedown(function(){
+			jQuery('#color-picker').each( function() {
+				var display = jQuery(this).css('display');
+				if (display == 'block')
+					jQuery(this).fadeOut(2);
+			});
+		});
 
-		farbtastic = jQuery.farbtastic('#colorPickerDiv', function(color) { pickColor(color); });
+		farbtastic = jQuery.farbtastic('#color-picker', function(color) { pickColor(color); });
 		pickColor('#<?php echo get_theme_mod('header_textcolor', HEADER_TEXTCOLOR); ?>');
 
-		<?php if ( 'blank' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) ) { ?>
+		<?php if ( 'blank' == get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) || '' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || ! $this->header_text() ) { ?>
 		toggle_text();
 		<?php } ?>
-	});
-
-	jQuery(document).mousedown(function(){
-		// Make the picker disappear, since we're using it in an independant div
-		hide_picker();
-	});
-
-	function colorDefault() {
-		pickColor('#<?php echo HEADER_TEXTCOLOR; ?>');
-	}
-
-	function hide_picker(what) {
-		var update = false;
-		jQuery('#colorPickerDiv').each(function(){
-			var id = jQuery(this).attr('id');
-			if (id == what) {
-				return;
-			}
-			var display = jQuery(this).css('display');
-			if (display == 'block') {
-				jQuery(this).fadeOut(2);
-			}
 		});
-	}
 
-	function toggle_text(force) {
-		if (jQuery('#textcolor').val() == 'blank') {
-			//Show text
-			jQuery( buttons.toString() ).show();
-			jQuery('#textcolor').val('<?php echo HEADER_TEXTCOLOR; ?>');
-			jQuery('#hidetext').val('<?php _e('Hide Text'); ?>');
-		}
-		else {
-			//Hide text
-			jQuery( buttons.toString() ).hide();
-			jQuery('#textcolor').val('blank');
-			jQuery('#hidetext').val('<?php _e('Show Text'); ?>');
-		}
-	}
+</script>
 
-
-
-</script>
 <?php
 	}
 
@@ -312,47 +338,36 @@
 	 */
 	function js_2() { ?>
 <script type="text/javascript">
+/* <![CDATA[ */
 	function onEndCrop( coords ) {
 		jQuery( '#x1' ).val(coords.x);
 		jQuery( '#y1' ).val(coords.y);
-		jQuery( '#x2' ).val(coords.x2);
-		jQuery( '#y2' ).val(coords.y2);
-		jQuery( '#width' ).val(coords.w);
-		jQuery( '#height' ).val(coords.h);
+		jQuery('#width').val(coords.w);
+		jQuery('#height').val(coords.h);
 	}
 
-	// with a supplied ratio
 	jQuery(document).ready(function() {
 		var xinit = <?php echo HEADER_IMAGE_WIDTH; ?>;
 		var yinit = <?php echo HEADER_IMAGE_HEIGHT; ?>;
-		var ratio = xinit / yinit;
+		var ratio = xinit +  ':' + yinit;
 		var ximg = jQuery('#upload').width();
 		var yimg = jQuery('#upload').height();
 
-		//set up default values
-		jQuery( '#x1' ).val(0);
-		jQuery( '#y1' ).val(0);
-		jQuery( '#x2' ).val(xinit);
-		jQuery( '#y2' ).val(yinit);
-		jQuery( '#width' ).val(xinit);
-		jQuery( '#height' ).val(yinit);
-
-		if ( yimg < yinit || ximg < xinit ) {
-			if ( ximg / yimg > ratio ) {
-				yinit = yimg;
-				xinit = yinit * ratio;
-			} else {
-				xinit = ximg;
-				yinit = xinit / ratio;
-			}
-		}
-
-		jQuery('#upload').Jcrop({
+		jQuery('#upload').imgAreaSelect({
+			handles: true,
+			keys: true,
 			aspectRatio: ratio,
-			setSelect: [ 0, 0, xinit, yinit ],
-			onSelect: onEndCrop
+			maxHeight: <?php echo HEADER_IMAGE_HEIGHT; ?>,
+			maxWidth: <?php echo HEADER_IMAGE_WIDTH; ?>,
+			onSelectChange: function(img, c) {
+				jQuery('#x1').val(c.x1);
+				jQuery('#y1').val(c.y1);
+				jQuery('#width').val(c.width);
+				jQuery('#height').val(c.height);
+			},
 		});
 	});
+/* ]]> */
 </script>
 <?php
 	}
@@ -368,89 +383,144 @@
 
 <div class="wrap">
 <?php screen_icon(); ?>
-<h2><?php _e('Your Header Image'); ?></h2>
+<h2><?php _e( 'Custom Header' ); ?></h2>
 
-<?php
-if ( isset($_GET['updated']) && $_GET['updated'] ) { ?>
+<?php if ( ! empty( $this->updated ) ) { ?>
 <div id="message" class="updated">
 <p><?php printf( __( 'Header updated. <a href="%s">Visit your site</a> to see how it looks.' ), home_url( '/' ) ); ?></p>
 </div>
-<?php }
+<?php } ?>
 
-if ( get_theme_mod('header_image') || empty($this->default_headers) ) :
-?>
-<p><?php _e('This is your header image. You can change the text color or upload and crop a new image.'); ?></p>
-<?php
+<h3><?php _e( 'Header Image' ) ?></h3>
+<table class="form-table">
+<tbody>
 
-if ( $this->admin_image_div_callback ) {
-  call_user_func($this->admin_image_div_callback);
-} else {
-?>
-<div id="headimg" style="background-image: url(<?php esc_url(header_image()) ?>);">
-<h1><a onclick="return false;" href="<?php bloginfo('url'); ?>" title="<?php bloginfo('name'); ?>" id="name"><?php bloginfo('name'); ?></a></h1>
-<div id="desc"><?php bloginfo('description');?></div>
-</div>
-<?php } ?>
+	<?php if ( get_header_image() ) : ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Current Header' ); ?></th>
+<td >
+	<?php if ( $this->admin_image_div_callback ) {
+	  call_user_func( $this->admin_image_div_callback );
+	} else {
+	?>
+	<div id="headimg" style="max-width:<?php echo HEADER_IMAGE_WIDTH; ?>px;;height:<?php echo HEADER_IMAGE_HEIGHT; ?>px">
+		<img id="image" src="<?php esc_url ( header_image() ) ?>" alt="" />
+		<?php
+		if ( 'blank' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || '' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || ! $this->header_text() )
+			$style = ' style="display:none;"';
+		else
+			$style = ' style="color:#' . get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) . ';"';
+		?>
+		<h1 id="name"<?php echo $style; ?>><?php bloginfo( 'name' ); ?></h1>
+		<div id="desc"<?php echo $style; ?>><?php bloginfo( 'description' ); ?></div>
+	</div>
+	<?php } ?>
+</td>
+</tr>
+	<?php endif; ?>
 
-<?php if ( !defined( 'NO_HEADER_TEXT' ) ) { ?>
-<form method="post" action="<?php echo admin_url('themes.php?page=custom-header&amp;updated=true') ?>">
-<input type="button" class="button" value="<?php esc_attr_e('Hide Text'); ?>" onclick="hide_text()" id="hidetext" />
-<input type="button" class="button" value="<?php esc_attr_e('Select a Text Color'); ?>" id="pickcolor" /><input type="button" class="button" value="<?php esc_attr_e('Use Original Color'); ?>" onclick="colorDefault()" id="defaultcolor" />
-<?php wp_nonce_field('custom-header'); ?>
-<input type="hidden" name="textcolor" id="textcolor" value="#<?php esc_attr(header_textcolor()) ?>" /><input name="submit" type="submit" class="button" value="<?php esc_attr_e('Save Changes'); ?>" /></form>
-<?php } ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Upload Image' ); ?></th>
+<td>
+	<p><?php _e( 'Here you can upload a custom header image to be shown at the top of your site instead of the default one. On the next screen you will be able to crop the image.' ); ?><br />
+	<?php printf( __( 'Images of exactly <strong>%1$d x %2$d pixels</strong> will be used as-is.' ), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); ?></p>
+	<form enctype="multipart/form-data" id="upload-form" method="post" action="<?php echo esc_attr( add_query_arg( 'step', 2 ) ) ?>">
+	<p>
+		<label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br />
+		<input type="file" id="upload" name="import" />
+		<input type="hidden" name="action" value="save" />
+		<?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ) ?>
+		<input type="submit" class="button" value="<?php esc_attr_e( 'Upload' ); ?>" />
+	</p>
+	</form>
+</td>
+</tr>
+</tbody>
+</table>
+<form method="post" action="<?php echo esc_attr( add_query_arg( 'step', 1 ) ) ?>">
+<table class="form-table">
+<tbody>
+	<?php if ( ! empty( $this->default_headers ) ) : ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Default Images' ); ?></th>
+<td>
+	<p><?php _e( 'If you didn&lsquo;t want to upload your own image, you can use one of these cool headers.' ) ?></p>
+	<?php
+		$this->show_default_header_selector();
+	?>
+</td>
+</tr>
+	<?php endif;
 
-<div id="colorPickerDiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none;"> </div>
-</div>
-<?php
-else:
-	echo '<p>' . __('Choose one of these cool headers, or upload your own image below.') . '</p>';
-	echo '<form method="post" action="' . admin_url('themes.php?page=custom-header&amp;updated=true') . '">';
-	wp_nonce_field('custom-header');
-	$this->show_default_header_selector();
-	echo '<input type="submit" class="button" value="' . esc_attr__('Save Changes') . '"  />';
-	echo '</form>';
-	echo '</div>';
-endif;
-?>
-<div class="wrap">
-<h3><?php _e('Upload New Header Image'); ?></h3><p><?php _e('Here you can upload a custom header image to be shown at the top of your site instead of the default one. On the next screen you will be able to crop the image.'); ?> <?php printf(__('Images of exactly <strong>%1$d x %2$d pixels</strong> will be used as-is.'), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT); ?></p>
+	if ( get_header_image() ) : ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Remove Image' ); ?></th>
+<td>
+	<p><?php _e( 'This will remove the header image. You will not be able to retrieve any customizations.' ) ?></p>
+	<input type="submit" class="button" name="removeheader" value="<?php esc_attr_e( 'Remove Header Image' ); ?>" />
+</td>
+</tr>
+	<?php endif;
+	
+	if ( defined( 'HEADER_IMAGE' ) ) : ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Reset Image' ); ?></th>
+<td>
+	<p><?php _e( 'This will restore the original header image. You will not be able to retrieve any customizations.' ) ?></p>
+	<input type="submit" class="button" name="resetheader" value="<?php esc_attr_e( 'Restore Original Header Image' ); ?>" />
+</td>
+</tr>
+	<?php endif; ?>
+</tbody>
+</table>
 
-<form enctype="multipart/form-data" id="uploadForm" method="post" action="<?php echo esc_attr(add_query_arg('step', 2)) ?>">
-<label for="upload"><?php _e('Choose an image from your computer:'); ?></label><br /><input type="file" id="upload" name="import" />
-<input type="hidden" name="action" value="save" />
-<?php wp_nonce_field('custom-header') ?>
-<p class="submit">
-<input type="submit" value="<?php esc_attr_e('Upload'); ?>" />
-</p>
-</form>
+	<?php if ( $this->header_text() ) : ?>
+<h3><?php _e( 'Header Text' ) ?></h3>
+<table class="form-table">
+<tbody>
+<tr valign="top" class="hide-if-no-js">
+<th scope="row"><?php _e( 'Display Text' ); ?></th>
+<td>
+	<p>
+	<?php $hidetext = get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ); ?>
+	<label><input type="radio" value="1" name="hidetext" id="hidetext"<?php checked( ( 'blank' == $hidetext || empty( $hidetext ) )  ? true : false ); ?> /> <?php _e( 'No' ); ?></label>
+	<label><input type="radio" value="0" name="hidetext" id="showtext"<?php checked( ( 'blank' == $hidetext || empty( $hidetext ) ) ? false : true ); ?> /> <?php _e( 'Yes' ); ?></label>
+	</p>
+</td>
+</tr>
 
-</div>
+<tr valign="top" id="text-color-row">
+<th scope="row"><?php _e( 'Text Color' ); ?></th>
+<td>
+	<p>
+		<input type="text" name="text-color" id="text-color" value="#<?php echo esc_attr( get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) ); ?>" />
+		<span class="description hide-if-js"><?php _e( 'If you want to hide header text, add <strong>#blank</strong> as text color.' );?></span>
+		<input type="button" class="button hide-if-no-js" value="<?php esc_attr_e( 'Select a Color' ); ?>" id="pickcolor" />
+	</p>
+	<div id="color-picker" style="z-index: 100; background:#eee; border:1px solid #ccc; position:absolute; display:none;"></div>
+</td>
+</tr>
 
-		<?php if ( get_theme_mod('header_image') || get_theme_mod('header_textcolor') ) : ?>
-<div class="wrap">
-<h3><?php _e('Reset Header Image and Color'); ?></h3>
-<form method="post" action="<?php echo esc_attr(add_query_arg('step', 1)) ?>">
-<?php
-wp_nonce_field('custom-header');
-if ( !empty($this->default_headers) ) {
-?>
-<p><?php _e('Use one of these cool headers.') ?></p>
-<?php
-	$this->show_default_header_selector();
-?>
-	<input type="submit" class="button" name="resetheader" value="<?php esc_attr_e('Save Changes'); ?>" />
-<?php
-} else {
-?>
-<p><?php _e('This will restore the original header image and color. You will not be able to retrieve any customizations.') ?></p>
-<input type="submit" class="button" name="resetheader" value="<?php esc_attr_e('Restore Original Header'); ?>" />
-<?php } ?>
+	<?php if ( defined( 'HEADER_TEXTCOLOR' ) && get_theme_mod( 'header_textcolor' ) ) { ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Reset Text Color' ); ?></th>
+<td>
+	<p><?php _e( 'This will restore the original header text color. You will not be able to retrieve any customizations.' ) ?></p>
+	<input type="submit" class="button" name="resettext" value="<?php esc_attr_e( 'Restore Original Header Text Color' ); ?>" />
+</td>
+</tr>
+	<?php } ?>
+
+</tbody>
+</table>
+	<?php endif;
+
+wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>
+<p class="submit"><input type="submit" class="button-primary" name="save-header-options" value="<?php esc_attr_e( 'Save Changes' ); ?>" /></p>
 </form>
 </div>
-		<?php endif;
 
-	}
+<?php }
 
 	/**
 	 * Display second step of custom header image page.
@@ -458,13 +528,14 @@
 	 * @since 2.1.0
 	 */
 	function step_2() {
-		check_admin_referer('custom-header');
-		$overrides = array('test_form' => false);
-		$file = wp_handle_upload($_FILES['import'], $overrides);
+		check_admin_referer( 'custom-header-upload', '_wpnonce-custom-header-upload' );
 
-		if ( isset($file['error']) )
-		die( $file['error'] );
+		$overrides = array( 'test_form' => false );
+		$file = wp_handle_upload( $_FILES['import'], $overrides );
 
+		if ( isset( $file['error'] ) )
+			wp_die( $file['error'],  __( 'Image Upload Error' ) );
+
 		$url = $file['url'];
 		$type = $file['type'];
 		$file = $file['file'];
@@ -472,32 +543,33 @@
 
 		// Construct the object array
 		$object = array(
-		'post_title' => $filename,
-		'post_content' => $url,
-		'post_mime_type' => $type,
-		'guid' => $url);
+			'post_title' => $filename,
+			'post_content' => __( 'This is your header image, if you delete it, you will lost your header image.' ),
+			'post_mime_type' => $type,
+			'guid' => $url
+		);
 
 		// Save the data
-		$id = wp_insert_attachment($object, $file);
+		$id = wp_insert_attachment( $object, $file );
 
-		list($width, $height, $type, $attr) = getimagesize( $file );
+		list( $width, $height, $type, $attr) = getimagesize( $file );
 
 		if ( $width == HEADER_IMAGE_WIDTH && $height == HEADER_IMAGE_HEIGHT ) {
 			// Add the meta-data
 			wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
 
-			set_theme_mod('header_image', esc_url($url));
-			do_action('wp_create_file_in_uploads', $file, $id); // For replication
+			set_theme_mod( 'header_image', esc_url( $url ) );
+			do_action( 'wp_create_file_in_uploads', $file, $id ); // For replication
 			return $this->finished();
 		} elseif ( $width > HEADER_IMAGE_WIDTH ) {
 			$oitar = $width / HEADER_IMAGE_WIDTH;
-			$image = wp_crop_image($file, 0, 0, $width, $height, HEADER_IMAGE_WIDTH, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file));
+			$image = wp_crop_image( $file, 0, 0, $width, $height, HEADER_IMAGE_WIDTH, $height / $oitar, false, str_replace( basename( $file ), 'midsize-'.basename( $file ), $file ) );
 			if ( is_wp_error( $image ) )
 				wp_die( __( 'Image could not be processed.  Please go back and try again.' ), __( 'Image Processing Error' ) );
 
-			$image = apply_filters('wp_create_file_in_uploads', $image, $id); // For replication
+			$image = apply_filters( 'wp_create_file_in_uploads', $image, $id ); // For replication
 
-			$url = str_replace(basename($url), basename($image), $url);
+			$url = str_replace( basename( $url ), basename( $image ), $url );
 			$width = $width / $oitar;
 			$height = $height / $oitar;
 		} else {
@@ -506,27 +578,25 @@
 		?>
 
 <div class="wrap">
+<?php screen_icon(); ?>
+<h2><?php _e( 'Crop Header Image' ); ?></h2>
 
-<form method="post" action="<?php echo esc_attr(add_query_arg('step', 3)) ?>">
+<form method="post" action="<?php echo esc_attr( add_query_arg( 'step', 3 ) ); ?>">
+	<p class="hide-if-no-js"><?php _e( 'Choose the part of the image you want to use as your header.' ); ?></p>
+	<p class="hide-if-js"><strong><?php _e( 'You need Javascript to choose a part of the image.' ); ?></strong></p>
+	<p><?php printf( __( 'Images smaller then <strong>%1$d x %2$d pixels</strong> will be zoomed.' ), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); ?></p>
+	<div id="crop_image" style="position: relative">
+		<img src="<?php echo esc_url( $url ); ?>" id="upload" width="<?php echo $width; ?>" height="<?php echo $height; ?>" />
+	</div>
 
-<p><?php _e('Choose the part of the image you want to use as your header.'); ?></p>
-<div id="testWrap" style="position: relative">
-<img src="<?php echo $url; ?>" id="upload" width="<?php echo $width; ?>" height="<?php echo $height; ?>" />
-</div>
-
-<p class="submit">
-<input type="hidden" name="x1" id="x1" />
-<input type="hidden" name="y1" id="y1" />
-<input type="hidden" name="x2" id="x2" />
-<input type="hidden" name="y2" id="y2" />
-<input type="hidden" name="width" id="width" />
-<input type="hidden" name="height" id="height" />
-<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr($id); ?>" />
-<input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr($oitar); ?>" />
-<?php wp_nonce_field('custom-header') ?>
-<input type="submit" value="<?php esc_attr_e('Crop Header'); ?>" />
-</p>
-
+	<input type="hidden" name="x1" id="x1" value="0"/>
+	<input type="hidden" name="y1" id="y1" value="0"/>
+	<input type="hidden" name="width" id="width" value="<?php echo esc_attr( $width ); ?>"/>
+	<input type="hidden" name="height" id="height" value="<?php echo esc_attr( $height ); ?>"/>
+	<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $id ); ?>" />
+	<input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr( $oitar ); ?>" />
+	<?php wp_nonce_field( 'custom-header-crop-image' ) ?>
+	<p class="submit"><input type="submit" value="<?php esc_attr_e( 'Crop Header' ); ?>" /></p>
 </form>
 </div>
 		<?php
@@ -538,7 +608,8 @@
 	 * @since 2.1.0
 	 */
 	function step_3() {
-		check_admin_referer('custom-header');
+		check_admin_referer( 'custom-header-crop-image' );
+
 		if ( $_POST['oitar'] > 1 ) {
 			$_POST['x1'] = $_POST['x1'] * $_POST['oitar'];
 			$_POST['y1'] = $_POST['y1'] * $_POST['oitar'];
@@ -548,21 +619,22 @@
 
 		$original = get_attached_file( $_POST['attachment_id'] );
 
-		$cropped = wp_crop_image($_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT);
+		// Crop the image
+		$cropped = wp_crop_image( $_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT );
 		if ( is_wp_error( $cropped ) )
-			wp_die( __( 'Image could not be processed.  Please go back and try again.' ), __( 'Image Processing Error' ) );
+			wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
 
-		$cropped = apply_filters('wp_create_file_in_uploads', $cropped, $_POST['attachment_id']); // For replication
+		$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $_POST['attachment_id'] ); // For replication
 
-		$parent = get_post($_POST['attachment_id']);
+		$parent = get_post( $_POST['attachment_id'] );
 		$parent_url = $parent->guid;
-		$url = str_replace(basename($parent_url), basename($cropped), $parent_url);
+		$url = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url );
 
 		// Construct the object array
 		$object = array(
 			'ID' => $_POST['attachment_id'],
-			'post_title' => basename($cropped),
-			'post_content' => $url,
+			'post_title' => basename( $cropped ),
+			'post_content' => __( 'This is your header image, if you delete it, you will lost your header image.' ),
 			'post_mime_type' => 'image/jpeg',
 			'guid' => $url
 		);
@@ -571,10 +643,10 @@
 		wp_insert_attachment($object, $cropped);
 		wp_update_attachment_metadata( $_POST['attachment_id'], wp_generate_attachment_metadata( $_POST['attachment_id'], $cropped ) );
 
-		set_theme_mod('header_image', $url);
+		set_theme_mod( 'header_image', $url );
 
 		// cleanup
-		$medium = str_replace(basename($original), 'midsize-'.basename($original), $original);
+		$medium = str_replace( basename( $original ), 'midsize-'.basename( $original ), $original );
 		@unlink( apply_filters( 'wp_delete_file', $medium ) );
 		@unlink( apply_filters( 'wp_delete_file', $original ) );
 
@@ -587,8 +659,8 @@
 	 * @since 2.1.0
 	 */
 	function finished() {
-		$_GET['updated'] = 1;
-	  $this->step_1();
+		$this->updated = true;
+		$this->step_1();
 	}
 
 	/**
@@ -597,8 +669,9 @@
 	 * @since 2.1.0
 	 */
 	function admin_page() {
-		if ( ! current_user_can('edit_theme_options') )
-			wp_die(__('You do not have permission to customize headers.'));
+		if ( ! current_user_can( 'edit_theme_options' ) )
+			wp_die( __( 'You do not have permission to customize headers.' ) );
+
 		$step = $this->step();
 		if ( 1 == $step )
 			$this->step_1();
Index: wp-content/themes/twentyten/functions.php
===================================================================
--- wp-content/themes/twentyten/functions.php	(revision 14679)
+++ wp-content/themes/twentyten/functions.php	(working copy)
@@ -187,13 +187,11 @@
 function twentyten_admin_header_style() {
 ?>
 <style type="text/css">
-#headimg {
-	height: <?php echo HEADER_IMAGE_HEIGHT; ?>px;
-	width: <?php echo HEADER_IMAGE_WIDTH; ?>px;
+/* Shows the same border as on front page */
+.appearance_page_custom-header #headimg {
+	border-bottom: 1px solid #000000;
+	border-top: 4px solid #000000;
 }
-#headimg h1, #headimg #desc {
-	display: none;
-}
 </style>
 <?php
 }
