 onepageprofile.module |   99 +++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 79 insertions(+), 20 deletions(-)

diff --git a/onepageprofile.module b/onepageprofile.module
index 2daa074..25d98a7 100644
--- a/onepageprofile.module
+++ b/onepageprofile.module
@@ -7,7 +7,7 @@
 function onepageprofile_menu() {
   $items = array();
 
-  $items['admin/settings/onepageprofile'] = array(
+  $items['admin/config/people/onepageprofile'] = array(
     'title'            => 'One page profile',
     'description'      => 'Assign weight to profile categories',
     'page callback'    => 'drupal_get_form',
@@ -25,8 +25,8 @@ function onepageprofile_menu() {
  * Here we remove the sub-navigation on the account edit page
  */
 function onepageprofile_menu_alter(&$items) {
-  // Get each of the links that we have taken over
-    // Unset them
+  // TODO: Get each of the links that we have taken over
+  // Unset them
 }
 
 
@@ -36,7 +36,7 @@ function onepageprofile_menu_alter(&$items) {
 function onepageprofile_theme() {
   return array(
     'onepageprofile_settings' => array(
-      'arguments' => array('form' => array()),
+      'render element' => 'form',
     )
   );
 }
@@ -46,9 +46,23 @@ function onepageprofile_theme() {
  * Implements hook_form_user_profile_form_alter().
  */
 function onepageprofile_form_user_profile_form_alter(&$form, &$form_state) {
-
-  // Find each of the subpages implemented by profile2
-    // Pull their forms into this form
+  // Find each of the subpages implemented by profile2,
+  if (module_exists('profile2')) {
+    $types = profile2_get_types();
+    foreach (array_keys($types) as $type_name) {
+      if (($type = profile2_get_types($type_name)) && $type->userCategory) {
+        if (empty($form_state['profiles'][$type_name])) {
+          $profile = profile2_load_by_user($form['#user'], $type_name);
+          if (empty($profile)) {
+            $profile = profile_create(array('type' => $type_name, 'uid' => $form['#user']->uid));
+          }
+
+          $form_state['profiles'][$profile->type] = $profile;
+        }
+        profile2_attach_form($form, $form_state);
+      }
+    }
+  }
 
   // Order the form elements
   if ($weights = variable_get('onepageprofile_weights', '')) {
@@ -56,12 +70,19 @@ function onepageprofile_form_user_profile_form_alter(&$form, &$form_state) {
       if (!empty($weights[$field])) {
         $form[$field]['#weight'] = $weights[$field];
       }
+
+      // Profile2
+      if (strpos($field, 'profile_') === 0) {
+        $field = str_replace('profile_', '', $field);
+        if (!empty($weights['profile2_' . $field])) {
+          $form['profile_' . $field]['#weight'] = $weights['profile2_' . $field];
+        }
+      }
     }
     uasort($form, 'element_sort');
   }
 }
 
-
 /**
  * Implements hook_user_update().
  */
@@ -89,8 +110,6 @@ function onepageprofile_profile_alter(&$account) {
  * Admin page to change category weights
  */
 function onepageprofile_settings() {
-
-  // Build the form
   $form = array();
 
   $form['onepageprofile_categories'] = array(
@@ -102,7 +121,7 @@ function onepageprofile_settings() {
   $tree       = &$form['onepageprofile_categories'];
   foreach ($categories as $key => $category) {
     $tree[$key]['title'] = array(
-      '#value' => $category['#title'],
+      '#markup' => $category['#title'],
     );
 
     $tree[$key]['weight'] = array(
@@ -167,7 +186,31 @@ function onepageprofile_domainignore() {
 /**
  * Theme admin settings form
  */
-function theme_onepageprofile_settings($form) {
+function theme_onepageprofile_settings($variables) {
+  drupal_add_tabledrag('onepageprofile-categories', 'order', 'sibling', 'onepageprofile-element');
+  $form = $variables['form'];
+  $header = array(
+    t('Category'),
+    t('Weight'),
+  );
+
+  $tree = &$form['onepageprofile_categories'];
+  foreach (element_children($form['onepageprofile_categories']) as $key) {
+    $tree[$key]['weight']['#attributes']['class'] = array('onepageprofile-element');
+
+    $row = array();
+    $row[] = array('data' => drupal_render($tree[$key]['title']));
+    $row[] = array('data' => drupal_render($tree[$key]['weight']));
+    $rows[] = array('data' => $row, 'class' => array('draggable'));
+  }
+
+  $output  = '<p>' . t('Use this form to set the order of the fieldsets appearing on the user profile editing page.') . '</p>';
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'onepageprofile-categories')));
+  $output .= drupal_render_children($form);
+
+  return $output;
+
+  $form = $vars['form'];
   drupal_add_tabledrag('onepageprofile-categories', 'order', 'sibling', 'onepageprofile-element');
 
   // Header
@@ -181,19 +224,23 @@ function theme_onepageprofile_settings($form) {
 
   $tree = &$form['onepageprofile_categories'];
   foreach (element_children($tree) as $key) {
-    $tree[$key]['weight']['#attributes']['class'] = 'onepageprofile-element';
+    $tree[$key]['weight']['#attributes']['class'] = array('onepageprofile-element');
 
     $row = array();
-    $row[] = drupal_render($tree[$key]['title']);
-    $row[] = drupal_render($tree[$key]['weight']);
+    $row[] = array('data' => drupal_render($tree[$key]['title']));
+    $row[] = array('data' => drupal_render($tree[$key]['weight']));
 
     $rows[] = array('data' => $row, 'class' => 'draggable');
   }
 
   // Build the output
   $output  = '<p>' . t('Use this form to set the order of the fieldsets appearing on the user profile editing page.') . '</p>';
-  $output .= theme('table', $header, $rows, array('id' => 'onepageprofile-categories'));
-  $output .= drupal_render($form);
+  $output .= theme('table', array(
+    'header' => $header,
+    'rows' => $rows,
+    'attributes' => array('id' => 'onepageprofile-categories'),
+  ));
+  $output .= drupal_render_children($form);
 
   return $output;
 }
@@ -229,13 +276,25 @@ function _onepageprofile_check_access($account, $category) {
 function _onepageprofile_get_categories() {
   module_load_include('inc', 'user', 'user.pages');
 
+  $form = array();
   $form_state = array();
-  $account    = $GLOBALS['user'];
-  $form       = user_profile_form($form_state, $account);
+  $account = $GLOBALS['user'];
+  $form = user_profile_form($form, $form_state, $account);
+
   $categories = array();
 
-  foreach (element_children($form) as $field) {
+  // Load profile 2 and build categories also
+  if (module_exists('profile2')) {
+    $types = profile2_get_types();
+    foreach (array_keys($types) as $type_name) {
+      $categories['profile2_' . $type_name] = array(
+        '#weight' => 0,
+        '#title'  => t('Profile !profile', array('!profile' => $type_name)),
+      );
+    }
+  }
 
+  foreach (element_children($form) as $field) {
     // Special check for theme_select
     if ($field == 'theme_select' && isset($form[$field])) {
       $categories[$field] = array(
