Index: general-template.php
===================================================================
--- general-template.php	(revision 13702)
+++ general-template.php	(working copy)
@@ -234,52 +234,76 @@
 }
 
 /**
- * Provides a simple login form for use anywhere within WordPress. By default, it echos
- * the HTML immediately. Pass array('echo'=>false) to return the string instead.
+ * Provides a simple login form for use anywhere within WordPress.
  *
+ * This function does not check to see whether a user is logged in.
+ *
  * @since 3.0.0
- * @param array $args Configuration options to modify the form output
- * @return Void, or string containing the form
+ *
+ * @param array $args Optional. Configuration options to modify the form output
+ * @param array $fields Optional. Add or replace login form fields.
+ * @return null|string Pass <code>array( 'echo' => false )</code> to return the form HTML. Defaults to echoing.
  */
-function wp_login_form( $args = array() ) {
-	$defaults = array( 'echo' => true,
-						'redirect' => site_url( $_SERVER['REQUEST_URI'] ), // Default redirect is back to the current page
-	 					'form_id' => 'loginform',
-						'label_username' => __( 'Username' ),
-						'label_password' => __( 'Password' ),
-						'label_remember' => __( 'Remember Me' ),
-						'label_log_in' => __( 'Log In' ),
-						'id_username' => 'user_login',
-						'id_password' => 'user_pass',
-						'id_remember' => 'rememberme',
-						'id_submit' => 'wp-submit',
-						'remember' => true,
-						'value_username' => '',
-						'value_remember' => false, // Set this to true to default the "Remember me" checkbox to checked
-					);
-	$args = wp_parse_args( $args, apply_filters( 'login_form_defaults', $defaults ) );
+function wp_login_form( $args = array(), $fields = array() ) {
+	$default_args = array(
+		'echo' => true,
+		'redirect' => site_url( $_SERVER['REQUEST_URI'] ), // Default redirect is back to the current page
+		'form_id' => 'loginform',
+		'label_username' => __( 'Username' ),
+		'label_password' => __( 'Password' ),
+		'label_remember' => __( 'Remember Me' ),
+		'label_log_in' => __( 'Log In' ),
+		'id_username' => 'user_login',
+		'id_password' => 'user_pass',
+		'id_remember' => 'rememberme',
+		'id_submit' => 'wp-submit',
+		'remember' => true,
+		'value_username' => '',
+		'value_remember' => false, // Set this to true to default the "Remember me" checkbox to checked
+	);
 
+	$args = wp_parse_args( $args, apply_filters( 'wp_login_form_defaults', $default_args ) );
+	extract( $args, EXTR_SKIP );
+	
+	$default_fields = array(
+		'login_user' => '<p class="login-username">' .
+						'<label for="' . esc_attr( $id_username ) . '">' . esc_html( $label_username ) . '</label>'.
+						'<input type="text" name="log" id="' . esc_attr( $id_username ) . '" class="input" value="' . esc_attr( $value_username ) . '" size="20" tabindex="10" />'.
+						'</p><!-- /.login-username -->',
+		'login_pass' => '<p class="login-password">' .
+						'<label for="' . esc_attr( $id_password ) . '">' . esc_html( $label_password ) . '</label>'.
+						'<input type="password" name="pwd" id="' . esc_attr( $id_password ) . '" class="input" value="" size="20" tabindex="20" />'.
+						'</p><!-- /.login-password -->',
+						
+		'login_remember' => ( $remember ? '<p class="login-remember"><label for="rememberme"><input id="rememberme" name="rememberme" type="checkbox" id="' . esc_attr( $id_remember ) . '" value="forever" tabindex="90"' . ( $value_remember ? ' checked="checked"' : '' ) . ' /> ' . esc_html( $label_remember ) . '</label></p>' : '' ),
+		
+		'login_submit' => '<p class="login-submit">' .
+						'<input type="submit" name="wp-submit" id="' . esc_attr( $id_submit ) . '" class="button-primary" value="' . esc_attr( $label_log_in ) . '" tabindex="100" />'.
+						'<input type="hidden" name="redirect_to" value="' . esc_attr( $redirect ) . '" />'.
+						'</p><!-- /.login-submit -->',
+	);
+	
+	$fields = wp_parse_args( $fields, apply_filters( 'wp_login_form_default_fields', $default_fields ) );
+	
+	$attributes  = ' action="' . site_url( 'wp-login.php', 'login' ) . '" method="post"';
+	$attributes .= $form_id ? ' name="'. $form_id .'" id="'. $form_id .'"' : $attributes;
+
 	$form = '
-		<form name="' . $args['form_id'] . '" id="' . $args['form_id'] . '" action="' . site_url( 'wp-login.php', 'login' ) . '" method="post">
-			' . do_action( 'login_form_top' ) . '
-			<p class="login-username">
-				<label for="' . esc_attr( $args['id_username'] ) . '">' . esc_html( $args['label_username'] ) . '</label>
-				<input type="text" name="log" id="' . esc_attr( $args['id_username'] ) . '" class="input" value="' . esc_attr( $args['value_username'] ) . '" size="20" tabindex="10" />
-			</p>
-			<p class="login-password">
-				<label for="' . esc_attr( $args['id_password'] ) . '">' . esc_html( $args['label_password'] ) . '</label>
-				<input type="password" name="pwd" id="' . esc_attr( $args['id_password'] ) . '" class="input" value="" size="20" tabindex="20" />
-			</p>
-			' . do_action( 'login_form_middle' ) . '
-			' . ( $args['remember'] ? '<p class="login-remember"><label><input name="rememberme" type="checkbox" id="' . esc_attr( $args['id_remember'] ) . '" value="forever" tabindex="90"' . ( $args['value_remember'] ? ' checked="checked"' : '' ) . ' /> ' . esc_html( $args['label_remember'] ) . '</label></p>' : '' ) . '
-			<p class="login-submit">
-				<input type="submit" name="wp-submit" id="' . esc_attr( $args['id_submit'] ) . '" class="button-primary" value="' . esc_attr( $args['label_log_in'] ) . '" tabindex="100" />
-				<input type="hidden" name="redirect_to" value="' . esc_attr( $args['redirect'] ) . '" />
-			</p>
-			' . do_action( 'login_form_bottom' ) . '
+		<form'. $attributes .'>
+			' . do_action( 'wp_login_form_before', $args );
+				
+				foreach ( (array) $fields as $name => $field ) {
+					$form .= do_action( "wp_login_form_field_before_{$name}", $field );
+					$form .= apply_filters( "wp_login_form_field_{$name}", $field ) . "\n";
+					$form .= do_action( "wp_login_form_field_after_{$name}", $field );
+				}
+			
+	$form .= do_action( 'wp_login_form_after', $args ) . '
 		</form>';
 
-	if ( $args['echo'] )
+	$form = apply_filters( 'wp_login_form', $form, $args );
+	
+	if ( $echo )
 		echo $form;
 	else
 		return $form;
