### Eclipse Workspace Patch 1.0
#P wordpress-trunk
Index: wp-includes/widgets.php
===================================================================
--- wp-includes/widgets.php	(revision 14691)
+++ wp-includes/widgets.php	(working copy)
@@ -844,41 +844,57 @@
 	if ( is_int($index) ) {
 		$index = "sidebar-$index";
 	} else {
-		$index = sanitize_title($index);
-		foreach ( (array) $wp_registered_sidebars as $key => $value ) {
-			if ( sanitize_title($value['name']) == $index ) {
-				$index = $key;
-				break;
-			}
-		}
+		$names = array_map( create_function( '$b', 'return $b["name"];' ), $wp_registered_sidebars );
+		$names = array_flip( $names );
+		if ( isset( $names[$index] ) )
+			$index = $names[$index];
+		$index = sanitize_title( $index );
 	}
 
 	$sidebars_widgets = wp_get_sidebars_widgets();
 
-	if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
+	if ( empty( $wp_registered_sidebars[$index] ) || !is_array($sidebars_widgets[$index]) || empty( $sidebars_widgets[$index] ) )
 		return false;
 
 	$sidebar = $wp_registered_sidebars[$index];
+	
+	// only take those id that are in sidebar and exist in registered widgets
+	$sidebars_widgets_ids = array_intersect( $sidebars_widgets[$index], array_keys( $wp_registered_widgets ) );
 
+	// look for additional css classnames - first, last ...
+	$find = array();
+	foreach ( $sidebars_widgets_ids as $id ) {
+		// normalize classname(s) into array if they are not yet
+		if ( ! is_array( $wp_registered_widgets[$id]['classname'] ) )
+			$wp_registered_widgets[$id]['classname'] = (array) $wp_registered_widgets[$id]['classname'];
+			
+		$callback = $wp_registered_widgets[$id]['callback'];
+		if ( is_callable( $callback ) ) {
+			if ( empty( $find['first'] ) ) $find['first'] = $id;  
+			$find['last'] = $id;
+		}
+	}
+	
+	// ... and add classnames as needed
+	foreach ( $find as $class => $id ) {
+		$wp_registered_widgets[$id]['classname'][] = $class;			
+	}
+	
 	$did_one = false;
-	foreach ( (array) $sidebars_widgets[$index] as $id ) {
+	foreach ( $sidebars_widgets_ids as $id ) {
 
-		if ( !isset($wp_registered_widgets[$id]) ) continue;
-
 		$params = array_merge(
 			array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),
 			(array) $wp_registered_widgets[$id]['params']
 		);
 
-		// Substitute HTML id and class attributes into before_widget
-		$classname_ = '';
-		foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
-			if ( is_string($cn) )
-				$classname_ .= '_' . $cn;
-			elseif ( is_object($cn) )
-				$classname_ .= '_' . get_class($cn);
+		// Substitute HTML id and class attributes into before_widget		
+		$classes = array();
+		foreach ( $wp_registered_widgets[$id]['classname'] as $cn ) {
+			if ( is_object($cn) ) $cn = get_class($cn); 
+			if ( is_string($cn) ) $classes[] = $cn;
 		}
-		$classname_ = ltrim($classname_, '_');
+		$classname_ = implode(' ', $classes);
 		$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);
 
 		$params = apply_filters( 'dynamic_sidebar_params', $params );
