Index: wp-admin/edit.php
===================================================================
--- wp-admin/edit.php	(revision 13703)
+++ wp-admin/edit.php	(working copy)
@@ -278,8 +279,6 @@
 $page_links = paginate_links( array(
 	'base' => add_query_arg( 'paged', '%#%' ),
 	'format' => '',
-	'prev_text' => __('&laquo;'),
-	'next_text' => __('&raquo;'),
 	'total' => $num_pages,
 	'current' => $pagenum
 ));
Index: wp-admin/css/colors-fresh.dev.css
===================================================================
--- wp-admin/css/colors-fresh.dev.css	(revision 13703)
+++ wp-admin/css/colors-fresh.dev.css	(working copy)
@@ -419,18 +419,6 @@
 	border-color: transparent;
 }
 
-.tablenav .next,
-.tablenav .prev {
-	border-color: transparent;
-	color: #21759b;
-}
-
-.tablenav .next:hover,
-.tablenav .prev:hover {
-	border-color: transparent;
-	color: #d54e21;
-}
-
 .updated,
 .login .message {
 	background-color: #ffffe0;
@@ -1391,27 +1379,11 @@
 	background: #eaf2fa;
 }
 
-.tablenav .tablenav-pages {
-	color: #555;
-}
-
-.tablenav .tablenav-pages a {
-	border-color: #e3e3e3;
-	background: #eee url('../images/menu-bits.gif') repeat-x scroll left -379px;
-}
 
-.tablenav .tablenav-pages a:hover {
-	color: #d54e21;
-	border-color: #d54321;
-}
-
-.tablenav .tablenav-pages a:active {
-	color: #fff !important;
-}
-
-.tablenav .tablenav-pages .current {
-	background: #dfdfdf;
-	border-color: #d3d3d3;
+.tablenav .parts .sprite, .tablenav .parts .sprite a
+{
+	/** The navigation text shouldn't be visible because there are sprites underneath. **/
+	color: transparent;
 }
 
 #availablethemes,
Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 13703)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -746,6 +746,58 @@
 	margin-top: 3px;
 }
 
+.tablenav {
+	clear: both;
+}
+
+.tablenav .tablenav-pages {
+	float: right;
+}
+
+.tablenav .parts
+{
+	clear: both;
+	overflow: hidden;
+}
+
+.tablenav .part
+{
+	float: left;
+	overflow: hidden;
+}
+
+.tablenav .page div
+{
+	float: left;
+	padding: 0 1px;
+}
+
+.tablenav .parts .sprite
+{
+	background-image: url("../images/tablenav-sprites.png");
+	width: 22px;
+	height: 15px;
+	margin: 4px 3px 3px 3px;
+}
+
+.tablenav .parts .sprite a
+{
+	/** Make the whole sprite clickable. **/
+	display: block;
+	height: 100%;
+	width: 100%;
+}
+
+.tablenav .parts .first_enabled		{		background-position: 0px 0px;		}
+.tablenav .parts .first_disabled	{		background-position: 0px 15px;		}
+.tablenav .parts .prev_enabled		{		background-position: 66px 0px;		}
+.tablenav .parts .prev_disabled		{		background-position: 66px 15px;		}
+.tablenav .parts .next_enabled		{		background-position: 44px 0px;		}
+.tablenav .parts .next_disabled		{		background-position: 44px 15px;		}
+.tablenav .parts .last_enabled		{		background-position: 22px 0px;		}
+.tablenav .parts .last_disabled		{		background-position: 22px 15px;		}
+
+/**
 .tablenav a.button-secondary {
 	display: block;
 	margin: 3px 8px 0 0;
@@ -786,6 +838,7 @@
 	font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif;
 	font-style: italic;
 }
+**/
 
 .tablenav .actions {
 	padding: 2px 8px 0 0;
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 13703)
+++ wp-includes/general-template.php	(working copy)
@@ -1903,13 +1903,6 @@
  * previous text, by using the 'prev_text' argument. You can set the next text
  * by setting the 'next_text' argument.
  *
- * If the 'show_all' argument is set to true, then it will show all of the pages
- * instead of a short list of the pages near the current page. By default, the
- * 'show_all' is set to false and controlled by the 'end_size' and 'mid_size'
- * arguments. The 'end_size' argument is how many numbers on either the start
- * and the end list edges, by default is 1. The 'mid_size' argument is how many
- * numbers to either side of current page, but not including current page.
- *
  * It is possible to add query vars to the link by using the 'add_args' argument
  * and see {@link add_query_arg()} for more information.
  *
@@ -1918,76 +1911,132 @@
  * @param string|array $args Optional. Override defaults.
  * @return array|string String of page links or array of page links.
  */
-function paginate_links( $args = '' ) {
+function paginate_links($args = '') {
 	$defaults = array(
-		'base' => '%_%', // http://example.com/all_posts.php%_% : %_% is replaced by format (below)
-		'format' => '?page=%#%', // ?page=%#% : %#% is replaced by the page number
-		'total' => 1,
-		'current' => 0,
-		'show_all' => false,
-		'prev_next' => true,
-		'prev_text' => __('&laquo; Previous'),
-		'next_text' => __('Next &raquo;'),
-		'end_size' => 1,
-		'mid_size' => 2,
-		'type' => 'plain',
-		'add_args' => false, // array of query args to add
-		'add_fragment' => ''
+		'base' => '%_%',							// http://example.com/all_posts.php%_% : %_% is replaced by format (below)
+		'format' => '?page=%#%',					// ?page=%#% : %#% is replaced by the page number
+		'total' => 1,								// How many pages there are in total
+		'current' => 0,								// Current page. First page is 1, not 0.
+		'type' => 'plain',							// Plain for text, array or list for a ul.
+		'text_page' => __('Page'),					// Text: Page (shown in the titles)
+		'add_args' => false,						// array of query args to add
+		'add_fragment' => '',						// ???
 	);
-
+	
 	$args = wp_parse_args( $args, $defaults );
-	extract($args, EXTR_SKIP);
+	$current = $args['current'];					// Convenience.
+	$total = $args['total'];						// Convenience.
 
-	// Who knows what else people pass in $args
-	$total = (int) $total;
-	if ( $total < 2 )
+	// No point on having navigation on one page.	
+	if ( intval($total) < 2 )
 		return;
-	$current  = (int) $current;
-	$end_size = 0  < (int) $end_size ? (int) $end_size : 1; // Out of bounds?  Make it the default.
-	$mid_size = 0 <= (int) $mid_size ? (int) $mid_size : 2;
-	$add_args = is_array($add_args) ? $add_args : false;
-	$r = '';
+		
+	if (!function_exists('paginate_link_prepare')):
+		/**
+		 * Shorthand function to prepare the first/prev/next/last page links.
+		 * 
+		 * @param array $args		See above. Default options.
+		 * @param array $options	Specificically for this page link. Basically only 'page' => int  is specified.
+		 */
+		function paginate_link_prepare($args, $options) {
+			$args = array_merge($args, $options);
+			$link = str_replace('%_%', $args['format'], $args['base']);
+			$link = str_replace('%#%', $args['page'], $link);
+			$link = esc_url( apply_filters( 'paginate_links', $link ) );
+			if ( $args['add_args'] )
+				$link = add_query_arg( $args['add_args'], $link );
+			$link .= $args['$add_fragment'];
+			return $link;
+		}
+	endif;
+		
+	$neighborPages = array(
+		'first' => 1,
+		'prev' => ($current > 1 ? $current-1 : 1),
+		'next' => ($current < $total ? $current+1 : $total),
+		'last' => $total,
+	);
+		
+	// Prepare the titles that will be displayed when hovering over the sprites
+	$titles = array(
+		'first' => $args['text_page'].' '.number_format_i18n( $neighborPages['first'] ),
+		'prev' => $args['text_page'].' '.number_format_i18n( $neighborPages['prev'] ),
+		'next' => $args['text_page'].' '.number_format_i18n( $neighborPages['next'] ),
+		'last' => $args['text_page'].' '.number_format_i18n( $neighborPages['last'] ),
+	);
+	
 	$page_links = array();
-	$n = 0;
-	$dots = false;
-
-	if ( $prev_next && $current && 1 < $current ) :
-		$link = str_replace('%_%', 2 == $current ? '' : $format, $base);
-		$link = str_replace('%#%', $current - 1, $link);
-		if ( $add_args )
-			$link = add_query_arg( $add_args, $link );
-		$link .= $add_fragment;
-		$page_links[] = "<a class='prev page-numbers' href='" . esc_url( apply_filters( 'paginate_links', $link ) ) . "'>$prev_text</a>";
+	
+	// First and previous links. Do they need to be active?
+	if ($current > 1):
+		// First
+		$link = paginate_link_prepare($args, array('page' => 0));
+		$page_links[] = '<div class="part sprite first first_enabled" title="'.$titles['first'].'"><a href="'.$link.'">'.$neighborPages['first'].'</a></div>';
+		
+		// Previous
+		$link = paginate_link_prepare($args, array('page' => $neighborPages['prev']));
+		$page_links[] = '<div class="part sprite prev prev_enabled" title="'.$titles['prev'].'"><a href="'.$link.'">'.$neighborPages['prev'].'</a></div>';
+	else:
+		$page_links[] = '<div class="part sprite first first_disabled" title="'.$titles['first'].'">'.$neighborPages['first'].'</div>';
+		$page_links[] = '<div class="part sprite prev prev_disabled" title="'.$titles['prev'].'">'.$neighborPages['prev'].'</div>';
 	endif;
-	for ( $n = 1; $n <= $total; $n++ ) :
-		$n_display = number_format_i18n($n);
-		if ( $n == $current ) :
-			$page_links[] = "<span class='page-numbers current'>$n_display</span>";
-			$dots = true;
-		else :
-			if ( $show_all || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
-				$link = str_replace('%_%', 1 == $n ? '' : $format, $base);
-				$link = str_replace('%#%', $n, $link);
-				if ( $add_args )
-					$link = add_query_arg( $add_args, $link );
-				$link .= $add_fragment;
-				$page_links[] = "<a class='page-numbers' href='" . esc_url( apply_filters( 'paginate_links', $link ) ) . "'>$n_display</a>";
-				$dots = true;
-			elseif ( $dots && !$show_all ) :
-				$page_links[] = "<span class='page-numbers dots'>...</span>";
-				$dots = false;
-			endif;
-		endif;
+	
+	// Create a javascript array of filtered page links.
+	$linksJSArray = array();
+	for($n = 1; $n <= $total; $n++):
+		$link = paginate_link_prepare($args, array('page' => $n));
+		$linksJSArray[] = "$n : \"" . $link . "\"";
 	endfor;
-	if ( $prev_next && $current && ( $current < $total || -1 == $total ) ) :
-		$link = str_replace('%_%', $format, $base);
-		$link = str_replace('%#%', $current + 1, $link);
-		if ( $add_args )
-			$link = add_query_arg( $add_args, $link );
-		$link .= $add_fragment;
-		$page_links[] = "<a class='next page-numbers' href='" . esc_url( apply_filters( 'paginate_links', $link ) ) . "'>$next_text</a>";
+	
+	// Page select box thing
+	$page_selector_class = 'page_selector_' . rand(0, time());
+	$size = strlen($total);								// It shouldn't be bigger than necessary.
+	$page_links[] =
+	'
+		<div class="part page">
+			<div class="current">
+				<input type="text" class="'.$page_selector_class.'" value="'.number_format_i18n($current).'" size="'.$size.'" maxlength="'.$size.'" style="text-align: center;" />
+			</div>
+
+			<script type="text/javascript">
+				var pages = {'.implode(',', $linksJSArray).'};
+
+				jQuery(document).ready(function(){
+					jQuery(".'.$page_selector_class.'").click(function(){
+						jQuery(this).select();
+					});
+
+					jQuery(".'.$page_selector_class.'").keyup(function(e){
+						if(e.keyCode == 13){
+							var value = parseInt(jQuery(this).val());
+							if (value == Number.NaN)
+							{
+								value = 1;
+							}
+							window.location(pages[value]);
+						}
+					})
+				});
+			</script>
+		</div>
+	';
+
+	// And finally, the  next and last page links
+	if ($current < $total):
+		// Next
+		$link = paginate_link_prepare($args, array('page' => $neighborPages['next']));
+		$page_links[] = '<div class="part sprite next next_enabled" title="'.$titles['next'].'"><a href="'.$link.'">'.$neighborPages['next'].'</a></div>';
+
+		// Last
+
+		$link = paginate_link_prepare($args, array('page' => $neighborPages['last']));
+		$page_links[] = '<div class="part sprite last last_enabled" title="'.$titles['last'].'"><a href="'.$link.'">'.$neighborPages['last'].'</a></div>';
+	else:
+		$page_links[] = '<div class="part sprite next next_disabled" title="'.$titles['next'].'">'.$neighborPages['next'].'</div>';
+		$page_links[] = '<div class="part sprite last last_disabled" title="'.$titles['last'].'">'.$neighborPages['last'].'</div>';
 	endif;
-	switch ( $type ) :
+	
+	switch ( $args['type'] ) :
 		case 'array' :
 			return $page_links;
 			break;
@@ -1997,9 +2046,10 @@
 			$r .= "</li>\n</ul>\n";
 			break;
 		default :
-			$r = join("\n", $page_links);
+			$r = '<div class="parts">' . join("\n", $page_links) . '</div>';
 			break;
 	endswitch;
+	
 	return $r;
 }
 

