Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 17852)
+++ wp-includes/functions.php	(working copy)
@@ -600,7 +600,7 @@
 
 	wp_protect_special_option( $option );
 
-	/* 
+	/*
 	 * FIXME the next two lines of code are not necessary and should be removed.
 	 * @see http://core.trac.wordpress.org/ticket/13480
 	 */
@@ -2876,26 +2876,26 @@
  * @param string $title Error title.
  * @param string|array $args Optional arguements to control behaviour.
  */
-function _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) { 
+function _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) {
 	global $wp_xmlrpc_server;
 	$defaults = array( 'response' => 500 );
 
 	$r = wp_parse_args($args, $defaults);
 
-	if ( $wp_xmlrpc_server ) { 
-		$error = new IXR_Error( $r['response'] , $message); 
-		$wp_xmlrpc_server->output( $error->getXml() ); 
+	if ( $wp_xmlrpc_server ) {
+		$error = new IXR_Error( $r['response'] , $message);
+		$wp_xmlrpc_server->output( $error->getXml() );
 	}
 	die();
 }
 
 /**
  * Filter to enable special wp_die handler for xmlrpc requests.
- * 
+ *
  * @since 3.2.0
  * @access private
  */
-function _xmlrpc_wp_die_filter() { 
+function _xmlrpc_wp_die_filter() {
 	return '_xmlrpc_wp_die_handler';
 }
 
@@ -4556,4 +4556,43 @@
 	@header( 'X-Frame-Options: SAMEORIGIN' );
 }
 
+/**
+ * Check if the user needs a browser update
+ *
+ * @since 3.2
+ */
+function wp_check_browser_version() {
+	$key = md5( $_SERVER['HTTP_USER_AGENT'] );
+
+	if ( false === ($response = get_site_transient('browsehappy_' . $key) ) ) {
+		global $wp_version;
+
+		$options = array(
+			'body'			=> array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ),
+			'user-agent'	=> 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
+		);
+
+		$raw_response = wp_remote_post( 'http://api.wordpress.org/core/browse-happy/1.0/', $options );
+
+		if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code'] )
+			return;
+
+		/**
+		 * Response should be an array with:
+		 *  'name' - string- A user friendly browser name
+		 *  'version' - string - The most recent version of the browser
+		 *  'current_version' - string - The version of the browser the user is using
+		 *  'upgrade' - boolean - Whether the browser needs an upgrade
+		 *  'insecure' - boolean - Whether the browser is deemed insecure
+		 */
+		$response = unserialize( $raw_response['body'] );
+
+		if ( ! $response )
+			return;
+
+		set_site_transient( 'browsehappy_' . $key, $response, 604800 ); // cache for 1 week
+	}
+
+	return $response;
+}
 ?>
Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 17852)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -1011,9 +1011,6 @@
 	break;
 case 'closed-postboxes' :
 	check_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' );
-	$closed = isset( $_POST['closed'] ) ? explode( ',', $_POST['closed']) : array();
-	$closed = array_filter($closed);
-
 	$hidden = isset( $_POST['hidden'] ) ? explode( ',', $_POST['hidden']) : array();
 	$hidden = array_filter($hidden);
 
@@ -1025,9 +1022,6 @@
 	if ( ! $user = wp_get_current_user() )
 		die('-1');
 
-	if ( is_array($closed) )
-		update_user_option($user->ID, "closedpostboxes_$page", $closed, true);
-
 	if ( is_array($hidden) ) {
 		$hidden = array_diff( $hidden, array('submitdiv', 'linksubmitdiv', 'manage-menu', 'create-menu') ); // postboxes that are always shown
 		update_user_option($user->ID, "metaboxhidden_$page", $hidden, true);
Index: wp-admin/includes/dashboard.php
===================================================================
--- wp-admin/includes/dashboard.php	(revision 17852)
+++ wp-admin/includes/dashboard.php	(working copy)
@@ -25,6 +25,15 @@
 
 	/* Register Widgets and Controls */
 
+	$response = wp_check_browser_version();
+
+	if ( $response['upgrade'] ) {
+		if ( $response['insecure'] )
+			wp_add_dashboard_widget( 'dashboard_browser_nag_insecure', __( 'You are using an insecure browser!' ), 'wp_dashboard_browser_nag' );
+		else
+			wp_add_dashboard_widget( 'dashboard_browser_nag_update', __( 'Your browser is out of date!' ), 'wp_dashboard_browser_nag' );
+	}
+
 	// Right Now
 	if ( is_blog_admin() && current_user_can('edit_posts') )
 		wp_add_dashboard_widget( 'dashboard_right_now', __( 'Right Now' ), 'wp_dashboard_right_now' );
@@ -1147,6 +1156,24 @@
 }
 add_action( 'activity_box_end', 'wp_dashboard_quota' );
 
+// Display Browser Nag Meta Box
+function wp_dashboard_browser_nag() {
+	$response = wp_check_browser_version();
+
+	if ( $response['insecure'] ) {
+		$msg = sprintf( __( 'It looks like you\'re using an insecure version of %1$s. Using an outdated browser makes your computer unsafe.  For the best WordPress experience, please update your browser.' ), $response['name'] );
+	} else {
+		$msg = sprintf( __( 'It looks like you\'re using an old version of %1$s. Using an outdated browser makes your computer unsafe.  For the best WordPress experience, please update your browser.' ), $response['name'] );
+	}
+
+	$msg = "<div class='icon " . sanitize_html_class( strtolower( $response['name'] ) ) . "'></div><p class='browser-update-nag'>{$msg}</p>";
+	$msg .= sprintf( __( '<p><a href="%1$s" class="update-browser-link">Update %2$s</a> or learn how to <a href="%3$s" class="browse-happy-link">browse happy</a></p>' ), $response['update_url'], $response['name'], 'http://browsehappy.com/' );
+	$msg .= '<div class="clear"></div>';
+
+	echo apply_filters( 'browse-happy-notice', $msg );
+}
+
+
 /**
  * Empty function usable by plugins to output empty dashboard widget (to be populated later by JS).
  */
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 17852)
+++ wp-admin/includes/template.php	(working copy)
@@ -957,7 +957,6 @@
 					$style = '';
 					$hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : '';
 					echo '<div id="' . $box['id'] . '" class="postbox ' . postbox_classes($box['id'], $page) . $hidden_class . '" ' . '>' . "\n";
-					echo '<div class="handlediv" title="' . esc_attr__('Click to toggle') . '"><br /></div>';
 					echo "<h3 class='hndle'><span>{$box['title']}</span></h3>\n";
 					echo '<div class="inside">' . "\n";
 					call_user_func($box['callback'], $object, $box);
Index: wp-admin/js/postbox.dev.js
===================================================================
--- wp-admin/js/postbox.dev.js	(revision 17852)
+++ wp-admin/js/postbox.dev.js	(working copy)
@@ -3,18 +3,6 @@
 	postboxes = {
 		add_postbox_toggles : function(page,args) {
 			this.init(page,args);
-			$('.postbox h3, .postbox .handlediv').click( function() {
-				var p = $(this).parent('.postbox'), id = p.attr('id');
-
-				p.toggleClass('closed');
-				postboxes.save_state(page);
-				if ( id ) {
-					if ( !p.hasClass('closed') && $.isFunction(postboxes.pbshow) )
-						postboxes.pbshow(id);
-					else if ( p.hasClass('closed') && $.isFunction(postboxes.pbhide) )
-						postboxes.pbhide(id);
-				}
-			} );
 			$('.postbox h3 a').click( function(e) {
 				e.stopPropagation();
 			} );
@@ -116,12 +104,10 @@
 		},
 
 		save_state : function(page) {
-			var closed = $('.postbox').filter('.closed').map(function() { return this.id; }).get().join(','),
-				hidden = $('.postbox').filter(':hidden').map(function() { return this.id; }).get().join(',');
+			var hidden = $('.postbox').filter(':hidden').map(function() { return this.id; }).get().join(',');
 
 			$.post(ajaxurl, {
 				action: 'closed-postboxes',
-				closed: closed,
 				hidden: hidden,
 				closedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),
 				page: page
Index: wp-admin/images/browsers-sprite.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: wp-admin/images/browsers-sprite.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: wp-admin/press-this.php
===================================================================
--- wp-admin/press-this.php	(revision 17852)
+++ wp-admin/press-this.php	(working copy)
@@ -459,10 +459,6 @@
 		<?php } ?>
 		jQuery('#title').unbind();
 		jQuery('#publish, #save').click(function() { jQuery('#saving').css('display', 'inline'); });
-
-		$('#tagsdiv-post_tag, #categorydiv').children('h3, .handlediv').click(function(){
-			$(this).siblings('.inside').toggle();
-		});
 	});
 </script>
 </head>
@@ -516,7 +512,6 @@
 
 			<?php $tax = get_taxonomy( 'category' ); ?>
 			<div id="categorydiv" class="postbox">
-				<div class="handlediv" title="<?php _e( 'Click to toggle' ); ?>"><br /></div>
 				<h3 class="hndle"><?php _e('Categories') ?></h3>
 				<div class="inside">
 				<div id="taxonomy-category" class="categorydiv">
@@ -566,9 +561,6 @@
 			</div>
 
 			<div id="tagsdiv-post_tag" class="stuffbox" >
-				<div class="handlediv" title="<?php _e( 'Click to toggle' ); ?>">
-					<br/>
-				</div>
 				<h3><span><?php _e('Post Tags'); ?></span></h3>
 				<div class="inside">
 					<div class="tagsdiv" id="post_tag">
Index: wp-admin/css/dashboard.dev.css
===================================================================
--- wp-admin/css/dashboard.dev.css	(revision 17852)
+++ wp-admin/css/dashboard.dev.css	(working copy)
@@ -73,10 +73,44 @@
 	text-decoration: none;
 }
 
+#dashboard-widgets a.update-browser-link {
+	font-size:1.2em;
+	font-weight:bold;
+}
+
+#dashboard-widgets a.browse-happy-link,
+#dashboard-widgets a.update-browser-link,
 #dashboard-widgets h3 a {
 	text-decoration: underline;
 }
 
+#dashboard-widgets p.browser-update-nag {
+	padding-right:125px;
+}
+
+#dashboard-widgets .icon {
+	float: right;
+	width: 125px;
+	height: 135px;
+	margin: -35px auto 0;
+	background: -625px 0 url(../images/browsers-sprite.png) no-repeat;
+}
+#dashboard-widgets .chrome.icon {
+	background-position: 0 0;
+}
+#dashboard-widgets .firefox.icon {
+	background-position: -125px 0;
+}
+#dashboard-widgets .opera.icon {
+	background-position: -250px 0;
+}
+#dashboard-widgets .safari.icon {
+	background-position: -375px 0;
+}
+#dashboard-widgets .internetexplorer.icon {
+	background-position: -500px 0;
+}
+
 #dashboard-widgets h3 .postbox-title-action {
 	position: absolute;
 	right: 30px;
Index: wp-admin/css/ie.dev.css
===================================================================
--- wp-admin/css/ie.dev.css	(revision 17852)
+++ wp-admin/css/ie.dev.css	(working copy)
@@ -21,10 +21,6 @@
 	margin-bottom: -1px;
 }
 
-* html .meta-box-sortables .postbox .handlediv {
-	background: transparent url(../images/menu-bits-vs.gif) no-repeat scroll left -111px;
-}
-
 * html .edit-box {
 	display: inline;
 }
Index: wp-admin/css/colors-classic-rtl.dev.css
===================================================================
--- wp-admin/css/colors-classic-rtl.dev.css	(revision 17852)
+++ wp-admin/css/colors-classic-rtl.dev.css	(working copy)
@@ -70,9 +70,6 @@
 	background: #b5b5b5 url(../images/menu-bits-rtl-vs.gif?ver=20101117) repeat-x scroll right top;
 }
 
-.meta-box-sortables .postbox:hover .handlediv {
-	background: transparent url(../images/menu-bits-rtl-vs.gif?ver=20101117) no-repeat scroll right -111px;
-}
 #favorite-toggle {
 	background: transparent url(../images/fav-arrow-rtl.gif?ver=20100531) no-repeat right -4px;
 }
Index: wp-admin/css/global.dev.css
===================================================================
--- wp-admin/css/global.dev.css	(revision 17852)
+++ wp-admin/css/global.dev.css	(working copy)
@@ -209,7 +209,6 @@
 }
 
 .hidden,
-.js .closed .inside,
 .js .hide-if-js,
 .no-js .hide-if-no-js {
 	display: none;
Index: wp-admin/css/colors-fresh-rtl.dev.css
===================================================================
--- wp-admin/css/colors-fresh-rtl.dev.css	(revision 17852)
+++ wp-admin/css/colors-fresh-rtl.dev.css	(working copy)
@@ -70,9 +70,6 @@
 	background: #b5b5b5 url(../images/menu-bits-rtl.gif?ver=20100531) repeat-x scroll right top;
 }
 
-.meta-box-sortables .postbox:hover .handlediv {
-	background: transparent url(../images/menu-bits-rtl.gif?ver=20100531) no-repeat scroll right -111px;
-}
 #favorite-toggle {
 	background: transparent url(../images/fav-arrow-rtl.gif?ver=20100531) no-repeat right -4px;
 }
Index: wp-admin/css/wp-admin-rtl.dev.css
===================================================================
--- wp-admin/css/wp-admin-rtl.dev.css	(revision 17852)
+++ wp-admin/css/wp-admin-rtl.dev.css	(working copy)
@@ -296,9 +296,6 @@
 	padding: 2px 2px 2px 15px;
 	text-align: left;
 }
-.meta-box-sortables .postbox .handlediv {
-	float: left;
-}
 .howto {
 	font-family: Tahoma, Arial, sans-serif;
 }
Index: wp-admin/css/colors-classic.dev.css
===================================================================
--- wp-admin/css/colors-classic.dev.css	(revision 17852)
+++ wp-admin/css/colors-classic.dev.css	(working copy)
@@ -641,6 +641,61 @@
 	border-color: #D1E5EE;
 }
 
+#dashboard_browser_nag_insecure.postbox {
+	background-color: #AC1B1B;
+	border-color: #AC1B1B;
+}
+
+#dashboard_browser_nag_update.postbox {
+	background-color: #e29808;
+	border-color: #EDC048;
+}
+
+#dashboard_browser_nag_insecure.postbox,
+#dashboard_browser_nag_update.postbox {
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow:none;
+}
+
+#dashboard_browser_nag_insecure.postbox h3 {
+	border-bottom-color: #CD5A5A;
+}
+
+#dashboard_browser_nag_update.postbox h3 {
+	border-bottom-color: #F6E2AC;
+}
+
+#dashboard_browser_nag_insecure.postbox h3,
+#dashboard_browser_nag_update.postbox h3 {
+	background:none;
+	text-shadow: none;
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+.ui-sortable #dashboard_browser_nag_insecure.postbox,
+.ui-sortable #dashboard_browser_nag_insecure.postbox h3,
+.ui-sortable #dashboard_browser_nag_update.postbox,
+.ui-sortable #dashboard_browser_nag_update.postbox h3 {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a,
+#dashboard_browser_nag_update a {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a.browse-happy-link,
+#dashboard_browser_nag_insecure a.update-browser-link {
+	text-shadow: #871B15 0 1px 0;
+}
+
+#dashboard_browser_nag_update a.browse-happy-link,
+#dashboard_browser_nag_update a.update-browser-link {
+	text-shadow: #D29A04 0 1px 0;
+}
+
 .widget,
 .postbox {
 	background-color: #fff;
@@ -1446,12 +1501,6 @@
 	color: #D54E21;
 }
 
-body.press-this .postbox:hover .handlediv,
-body.press-this .stuffbox:hover .handlediv,
-.meta-box-sortables .postbox:hover .handlediv {
-	background: transparent url(../images/menu-bits-vs.gif?ver=20101102) no-repeat scroll left -111px;
-}
-
 #major-publishing-actions {
 	background: #eaf2fa;
 }
Index: wp-admin/css/press-this.dev.css
===================================================================
--- wp-admin/css/press-this.dev.css	(revision 17852)
+++ wp-admin/css/press-this.dev.css	(working copy)
@@ -145,17 +145,6 @@
 	border-radius: 3px;
 }
 
-.postbox:hover .handlediv,
-.stuffbox:hover .handlediv {
-	background: transparent url(../images/menu-bits.gif) no-repeat scroll left -111px;
-}
-
-.handlediv {
-	float: right;
-	height: 26px;
-	width: 23px;
-}
-
 #title,
 .tbtitle {
 	-moz-border-radius: 3px;
Index: wp-admin/css/colors-fresh.dev.css
===================================================================
--- wp-admin/css/colors-fresh.dev.css	(revision 17852)
+++ wp-admin/css/colors-fresh.dev.css	(working copy)
@@ -665,6 +665,60 @@
 	background-color: #f9f9f9;
 }
 
+#dashboard_browser_nag_insecure.postbox {
+	background-color: #AC1B1B;
+	border-color: #AC1B1B;
+}
+
+#dashboard_browser_nag_update.postbox {
+	background-color: #e29808;
+	border-color: #EDC048;
+}
+
+#dashboard_browser_nag_insecure.postbox,
+#dashboard_browser_nag_update.postbox {
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow:none;
+}
+
+#dashboard_browser_nag_insecure.postbox h3 {
+	border-bottom-color: #CD5A5A;
+}
+
+#dashboard_browser_nag_update.postbox h3 {
+	border-bottom-color: #F6E2AC;
+}
+
+#dashboard_browser_nag_insecure.postbox h3,
+#dashboard_browser_nag_update.postbox h3 {
+	text-shadow: none;
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+.ui-sortable #dashboard_browser_nag_insecure.postbox,
+.ui-sortable #dashboard_browser_nag_insecure.postbox h3,
+.ui-sortable #dashboard_browser_nag_update.postbox,
+.ui-sortable #dashboard_browser_nag_update.postbox h3 {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a,
+#dashboard_browser_nag_update a {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a.browse-happy-link,
+#dashboard_browser_nag_insecure a.update-browser-link {
+	text-shadow: #871B15 0 1px 0;
+}
+
+#dashboard_browser_nag_update a.browse-happy-link,
+#dashboard_browser_nag_update a.update-browser-link {
+	text-shadow: #D29A04 0 1px 0;
+}
+
 .ui-sortable .postbox h3 {
 	color: #464646;
 }
@@ -1535,10 +1589,6 @@
 	color: #D54E21;
 }
 
-.meta-box-sortables .postbox:hover .handlediv {
-	background: transparent url(../images/menu-bits.gif?ver=20100610) no-repeat scroll left -111px;
-}
-
 .tablenav .tablenav-pages {
 	color: #555;
 }
Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 17852)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -1540,12 +1540,6 @@
 	font-weight: normal;
 }
 
-.postbox .handlediv {
-	float: right;
-	width: 23px;
-	height: 26px;
-}
-
 .sortable-placeholder {
 	border-width: 1px;
 	border-style: dashed;
@@ -1569,13 +1563,6 @@
 	border-style: solid;
 }
 
-.postbox.closed h3 {
-	border: none;
-	-moz-box-shadow: none;
-	-webkit-box-shadow: none;
-	box-shadow: none;
-}
-
 .postbox table.form-table {
 	margin-bottom: 0;
 }
Index: wp-admin/css/ie-rtl.dev.css
===================================================================
--- wp-admin/css/ie-rtl.dev.css	(revision 17852)
+++ wp-admin/css/ie-rtl.dev.css	(working copy)
@@ -96,10 +96,6 @@
 	position: static;
 }
 
-* html .meta-box-sortables .postbox .handlediv {
-	background: transparent url(../images/menu-bits-rtl-vs.gif) no-repeat scroll right -111px;
-}
-
 /* nav menus */
 .menu-max-depth-0 #menu-management { width: 460px; }
 .menu-max-depth-1 #menu-management { width: 490px; }
