Changeset 12324

Show
Ignore:
Timestamp:
02/08/08 21:59:44 (11 months ago)
Author:
pottedmeat
Message:

Refs #5602. Figured I'd check in my progress on theming

Location:
util
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • util/branches/dev/jsdoc/jsdoc.module

    r12211 r12324  
    6767      'access' => false 
    6868    ); 
     69 
     70    $items[] = array( 
     71      'path' => 'jsdoc/jsonp', 
     72      'type' => MENU_CALLBACK, 
     73      'callback' => 'jsdoc_jsonp', 
     74      'access' => true 
     75    ); 
    6976  } 
    7077  else { 
     
    7986    } 
    8087 
    81     if (arg(0) == 'jsdoc' && arg(3) == 'resource') { 
    82       // jsdoc/namespace/'HEAD'/'resource'/resource 
    83  
    84       $node = jsdoc_resource_node_load(arg(1), arg(2), str_replace('__', '/', arg(4))); 
    85       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/resource/' . arg(4), 
    86         'title' => t('View'), 
    87         'callback' => 'jsdoc_resource_node_view', 
    88         'callback arguments' => array($node), 
    89         'access' => node_access('view', $node), 
    90         'type' => MENU_CALLBACK, 
    91       ); 
    92       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/resource/' . arg(4) . '/view', 
    93         'title' => t('View'), 
    94         'type' => MENU_DEFAULT_LOCAL_TASK, 
    95         'weight' => -10 
    96       ); 
    97       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/resource/' . arg(4) . '/private', 
    98         'title' => t('View w/ Private'), 
    99         'callback' => 'jsdoc_resource_node_view', 
    100         'callback arguments' => array($node), 
    101         'access' => node_access('view', $node), 
    102         'weight' => -9, 
    103         'type' => MENU_LOCAL_TASK 
    104       ); 
    105       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/resource/' . arg(4) . '/edit', 
    106         'title' => t('Edit'), 
    107         'callback' => 'jsdoc_resource_edit_redirect', 
    108         'callback arguments' => array($node), 
    109         'access' => node_access('update', $node), 
    110         'weight' => 1, 
    111         'type' => MENU_LOCAL_TASK 
    112       ); 
    113     } 
    114  
    115     if (arg(0) == 'jsdoc' && arg(3) == 'object' && arg(4)) { 
    116       // jsdoc/namespace/'HEAD'/'object'/resource/object 
    117       if (arg(5) && arg(5) != 'view' && arg(5) != 'edit' && arg(5) != 'private') { 
    118         $item = arg(4) . '/' . arg(5); 
    119         $object = $node = jsdoc_object_node_load(arg(1), arg(2), arg(5), str_replace('__', '/', arg(4))); 
    120       } 
    121       // jsdoc/namespace/'HEAD'/'object'/object 
     88    if (arg(0) == 'jsdoc') { 
     89      $project = false; 
     90      $version = false; 
     91      $resource = false; 
     92      $name = ''; 
     93      $path = ''; 
     94      if (arg(4)) { 
     95        // If we have 4 arguments, assume that we've been passed a resource 
     96        $project = arg(1); 
     97        $version = arg(2); 
     98        $resource = str_replace('__', '/', arg(3)); 
     99        $name = arg(4); 
     100        $path = "jsdoc/$project/$version/" . arg(3) . "/$name"; 
     101      } 
     102      elseif (arg(3)) { 
     103        // If we have 3 arguments, assume that we don't have a resource 
     104        $project = arg(1); 
     105        $version = arg(2); 
     106        $name = arg(3); 
     107        $path = "jsdoc/$project/$version/$name"; 
     108      } 
     109      elseif (arg(2)) { 
     110        // If we have 2 arguments, assume that we don't have a resource or project 
     111        // So basically, we assume that version is more important than project 
     112        $version = arg(1); 
     113        $name = arg(2); 
     114        $path = "jsdoc/$version/$name"; 
     115      } 
     116      elseif (arg(1)) { 
     117        // Allow the user to only pass the name 
     118        $name = arg(1); 
     119        $path = "jsdoc/$name"; 
     120      } 
     121 
     122      if ($node = jsdoc_object_node_load($name, $project, $version, $resource)) { 
     123        $item = array( 
     124          'path' => $path, 
     125          'title' => t('View'), 
     126          'access' => node_access('view', $node), 
     127          'type' => MENU_CALLBACK 
     128        ); 
     129        if (is_array($node)) { 
     130          $item['callback'] = 'jsdoc_variables_node_view'; 
     131          $item['callback arguments'] = array($node); 
     132        } 
     133        else { 
     134          if ($node->type == 'jsdoc_object') { 
     135            $item['callback'] = 'jsdoc_object_node_view'; 
     136            $item['callback arguments'] = array($node); 
     137          } 
     138          else { 
     139            $item['callback'] = 'jsdoc_variable_node_view'; 
     140            $item['callback arguments'] = array($node); 
     141          } 
     142        } 
     143        $items[] = $item; 
     144      } 
     145    } 
     146 
     147    /* 
     148    if (arg(0) == 'jsdoc' && arg(3)) { 
     149      // jsdoc/namespace/'HEAD'/resource/object 
     150      if (arg(4) && arg(4) != 'view' && arg(4) != 'edit' && arg(4) != 'private') { 
     151        $item = arg(3) . '/' . arg(4); 
     152        $object = $node = jsdoc_object_node_load(arg(4), arg(1), arg(2), str_replace('__', '/', arg(3))); 
     153      } 
     154      // jsdoc/namespace/'HEAD'/object 
    122155      else { 
    123         $item = arg(4); 
    124         $object = $node = jsdoc_object_node_load(arg(1), arg(2), arg(4)); 
     156        $item = arg(3); 
     157        $object = $node = jsdoc_object_node_load(arg(3), arg(1), arg(2)); 
    125158      } 
    126159 
     
    128161        $object = jsdoc_get_variable_object($node); 
    129162      } 
    130       $items[] = array('path' => 'jsdoc/' . arg(1) . '/' . arg(2) . '/object/' . $item, 
     163      $items[] = array('path' => 'jsdoc/' . arg(1) . '/' . arg(2) . '/' . $item, 
    131164        'title' => t('View'), 
    132165        'callback' => 'jsdoc_object_node_view', 
     
    135168        'type' => MENU_CALLBACK 
    136169      ); 
    137       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/view', 
     170      $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/view', 
    138171        'title' => t('View'), 
    139172        'type' => MENU_DEFAULT_LOCAL_TASK, 
    140173        'weight' => -10 
    141174      ); 
    142       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/private', 
     175      $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/private', 
    143176        'title' => t('View w/ Private'), 
    144177        'callback' => 'jsdoc_object_node_view', 
     
    148181        'type' => MENU_LOCAL_TASK 
    149182      ); 
    150       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/edit', 
     183      $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/edit', 
    151184        'title' => t('Edit'), 
    152185        'callback' => 'jsdoc_object_edit_redirect', 
     
    156189        'type' => MENU_LOCAL_TASK 
    157190      ); 
    158       $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/edit/' . arg(6), 
     191      $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/edit/' . arg(6), 
    159192        'title' => t('Edit'), 
    160193        'callback' => 'jsdoc_object_edit_redirect', 
     
    167200      if (jsdoc_get_type($object) == 'Function') { 
    168201        if (jsdoc_get_classlike($object) || jsdoc_is_initialized($object)) { 
    169           $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/view/init', 
     202          $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/view/init', 
    170203            'title' => t('Initialized'), 
    171204            'type' => MENU_DEFAULT_LOCAL_TASK, 
     
    173206          ); 
    174207          if (!jsdoc_is_initialized($object)) { 
    175             $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/view/normal', 
     208            $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/view/normal', 
    176209              'title' => t('Uninitialized'), 
    177210              'callback' => 'jsdoc_object_node_view', 
     
    180213              'type' => MENU_LOCAL_TASK 
    181214            ); 
    182             $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/private/init', 
     215            $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/private/init', 
    183216              'title' => t('Initialized'), 
    184217              'type' => MENU_DEFAULT_LOCAL_TASK, 
    185218              'weight' => -10 
    186219            ); 
    187             $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/private/normal', 
     220            $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/private/normal', 
    188221              'title' => t('Uninitialized'), 
    189222              'callback' => 'jsdoc_object_node_view', 
     
    195228        } 
    196229        else { 
    197           $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/view/normal', 
     230          $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/view/normal', 
    198231            'title' => t('Uninitialized'), 
    199232            'type' => MENU_DEFAULT_LOCAL_TASK, 
    200233            'weight' => -10 
    201234          ); 
    202           $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/view/init', 
     235          $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/view/init', 
    203236            'title' => t('Initialized'), 
    204237            'callback' => 'jsdoc_object_node_view', 
     
    207240            'type' => MENU_LOCAL_TASK 
    208241          ); 
    209           $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/private/normal', 
     242          $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/private/normal', 
    210243            'title' => t('Uninitialized'), 
    211244            'type' => MENU_DEFAULT_LOCAL_TASK, 
    212245            'weight' => -10 
    213246          ); 
    214           $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/object/' . $item . '/private/init', 
     247          $items[] = array('path' => 'jsdoc/'. arg(1) . '/' . arg(2) . '/' . $item . '/private/init', 
    215248            'title' => t('Initialized'), 
    216249            'callback' => 'jsdoc_object_node_view', 
     
    222255      } 
    223256    } 
     257    */ 
    224258  } 
    225259 
     
    9991033  $node->jsdoc_version = $additions->jsdoc_version; 
    10001034 
    1001   $node->jsdoc_full_url = 'jsdoc/' . jsdoc_get_project($node)->title . '/HEAD/object/' . str_replace('/', '__', db_result(db_query("SELECT title FROM {node_revisions} WHERE vid = %d", $additions->jsdoc_resource_vid))) . '/' . $node->title; 
    1002   $node->jsdoc_url = 'jsdoc/' . jsdoc_get_project($node)->title . '/HEAD/object/' . $node->title; 
     1035  $node->jsdoc_full_url = 'jsdoc/' . jsdoc_get_project($node)->title . '/HEAD/' . str_replace('/', '__', db_result(db_query("SELECT title FROM {node_revisions} WHERE vid = %d", $additions->jsdoc_resource_vid))) . '/' . $node->title; 
     1036  $node->jsdoc_url = 'jsdoc/' . jsdoc_get_project($node)->title . '/HEAD/' . $node->title; 
    10031037 
    10041038  return $additions; 
     
    10511085    jsdoc_get_resource($disambiguation); 
    10521086    jsdoc_get_provide($disambiguation); 
    1053     $form['jsdoc_disambiguation']['jsdoc_disambiguation']['#options'][$disambiguation->jsdoc_resource->vid] = t('Use the summary and description in ' . $disambiguation->jsdoc_resource->title . ' (' . l('Edit object', 'jsdoc/' . jsdoc_get_project($node)->title . '/' . jsdoc_get_version($node)->title . '/object/' . $node->title . '/edit/' . $disambiguation->jsdoc_resource->vid) . ')'); 
     1087    $form['jsdoc_disambiguation']['jsdoc_disambiguation']['#options'][$disambiguation->jsdoc_resource->vid] = t('Use the summary and description in ' . $disambiguation->jsdoc_resource->title . ' (' . l('Edit object', 'jsdoc/' . jsdoc_get_project($node)->title . '/' . jsdoc_get_version($node)->title . '/' . $node->title . '/edit/' . $disambiguation->jsdoc_resource->vid) . ')'); 
    10541088  } 
    10551089 
     
    12631297  } 
    12641298 
    1265   $node->jsdoc_parameters = array(); 
    1266   $query = db_query("SELECT * FROM {jsdoc_parameters} WHERE vid = %d ORDER BY weight", $node->vid); 
     1299  $object = jsdoc_get_variable_object($node); 
     1300 
     1301  $object->jsdoc_parameters = array(); 
     1302  $query = db_query("SELECT * FROM {jsdoc_parameters} WHERE vid = %d ORDER BY weight", $object->vid); 
    12671303  while ($parameter = db_fetch_array($query)) { 
    12681304    $parameter['jsdoc_formatted'] = _jsdoc_format_type($parameter['type'], $parameter['optional'], $parameter['recurring']); 
    1269     $node->jsdoc_parameters[$parameter['name']] = $parameter; 
    1270   } 
    1271   return $node->jsdoc_parameters; 
     1305    $object->jsdoc_parameters[$parameter['name']] = $parameter; 
     1306  } 
     1307  return $object->jsdoc_parameters; 
    12721308} 
    12731309 
     
    12861322} 
    12871323 
     1324function jsdoc_get_parent_mixins(&$node) { 
     1325  return jsdoc_get_parents($node)->mixin; 
     1326} 
     1327 
    12881328/** 
    12891329 * 
    12901330 */ 
    12911331function jsdoc_get_parents(&$node) { 
    1292   if (isset($node->jsdoc_parents)) return $node->jsdoc_parents; 
     1332  if (isset($node->jsdoc_parents)) { 
     1333    return $node->jsdoc_parents; 
     1334  } 
    12931335 
    12941336  $node->jsdoc_parents = array(); 
     
    13421384  } 
    13431385 
     1386  $node->jsdoc_parents = (object)$node->jsdoc_parents; 
    13441387  return $node->jsdoc_parents; 
    13451388} 
     
    14161459    return $node->jsdoc_type; 
    14171460  } 
     1461 
     1462  $type = ''; 
    14181463 
    14191464  if ($node->type == 'jsdoc_variable') { 
     
    14271472    $types = array_unique($types); 
    14281473    if (count($types) == 1) { 
    1429       return $node->jsdoc_type = $types[0]; 
     1474      $type = $types[0]; 
    14301475    } 
    14311476    elseif (count($types) > 1) { 
    1432       return $node->jsdoc_type = 'mixed'; 
    1433     } 
    1434   } 
    1435  
    1436   return ''; 
     1477      $type = 'mixed'; 
     1478    } 
     1479  } 
     1480 
     1481  if ($type == 'Function' && jsdoc_get_classlike($node)) { 
     1482    $type = 'Class'; 
     1483  } 
     1484 
     1485  return ($node->jsdoc_type = $type); 
    14371486} 
    14381487 
     
    14461495 
    14471496function jsdoc_get_provide(&$node) { 
    1448   if (is_numeric($node->jsdoc_provide)) { 
    1449     $node->jsdoc_provide = _jsdoc_node_load($node->jsdoc_provide, $node->jsdoc_provide_vid); 
    1450   } 
    1451   return $node->jsdoc_provide; 
    1452 } 
    1453  
    1454 function jsdoc_load_children(&$node, $with_private=false) { 
    1455   if (isset($node->jsdoc_variables)) return; 
     1497  $object = $node; 
     1498  if ($node->type == 'jsdoc_variable') { 
     1499    $object = jsdoc_get_variable_object($node); 
     1500  } 
     1501  if (is_numeric($object->jsdoc_provide)) { 
     1502    $object->jsdoc_provide = _jsdoc_node_load($object->jsdoc_provide, $object->jsdoc_provide_vid); 
     1503  } 
     1504  return $object->jsdoc_provide; 
     1505} 
     1506 
     1507function jsdoc_get_child_instances(&$node, $with_private=false) { 
     1508  return jsdoc_get_children($node, $with_private)->instances; 
     1509} 
     1510 
     1511function jsdoc_get_child_prototypes(&$node, $with_private=false) { 
     1512  return jsdoc_get_children($node, $with_private)->prototypes; 
     1513} 
     1514 
     1515function jsdoc_get_child_variables(&$node, $with_private=false) { 
     1516  return jsdoc_get_children($node, $with_private)->variables; 
     1517} 
     1518 
     1519function jsdoc_get_child_chains(&$node, $with_private=false) { 
     1520  return jsdoc_get_children($node, $with_private)->chains; 
     1521} 
     1522 
     1523function jsdoc_get_child_mixins(&$node, $with_private=false) { 
     1524  return jsdoc_get_children($node, $with_private)->mixins; 
     1525} 
     1526 
     1527function jsdoc_get_children(&$node, $with_private=false) { 
     1528  if (isset($node->jsdoc_variables)) { 
     1529    return (object)array( 
     1530      'instances' => $node->jsdoc_instances, 
     1531      'prototypes' => $node->jsdoc_prototypes, 
     1532      'variables' => $node->jsdoc_variables, 
     1533      'chains' => $node->jsdoc_chains, 
     1534      'mixins' => $node->jsdoc_mixins 
     1535    ); 
     1536  } 
    14561537 
    14571538  $node->jsdoc_instances = array(); 
     
    14791560    $node->jsdoc_variables = array(); 
    14801561    while ($object = db_fetch_object($query)) { 
    1481       $object = jsdoc_object_node_load(jsdoc_get_project($node), jsdoc_get_version($node), $object->title); 
     1562      $object = jsdoc_object_node_load($object->title, jsdoc_get_project($node), jsdoc_get_version($node)); 
    14821563      $node->jsdoc_variables[$object->title] = $object; 
    14831564    } 
     
    14851566  } 
    14861567  elseif ($node->type == "jsdoc_object") { 
    1487     $query = db_query("SELECT j.type, j.subtype, nr.nid, MAX(nr.vid) FROM {jsdoc_variable_hierarchy} j JOIN {node_revisions} nr ON (nr.vid = j.vid) JOIN {node_revisions} nr2 ON (nr2.vid = j.parent_vid) JOIN {jsdoc_objects} jo ON (jo.vid = nr.vid) WHERE nr2.title = '%s' AND BINARY nr2.title = '%s' " . $with_private . " AND j.version = %d GROUP BY nr.nid", $node->title, $node->title, jsdoc_get_version($node)->nid); 
     1568    $query = db_query("SELECT j.type, j.subtype, nr.nid, MAX(nr.vid) AS vid FROM {jsdoc_variable_hierarchy} j JOIN {node_revisions} nr ON (nr.vid = j.vid) JOIN {node_revisions} nr2 ON (nr2.vid = j.parent_vid) JOIN {jsdoc_objects} jo ON (jo.vid = nr.vid) WHERE nr2.title = '%s' AND BINARY nr2.title = '%s' " . $with_private . " AND j.version = %d GROUP BY nr.nid, j.type, j.subtype", $node->title, $node->title, jsdoc_get_version($node)->nid); 
    14881569    while ($join = db_fetch_object($query)) { 
    14891570      $object = _jsdoc_node_load($join->nid, $join->vid); 
     
    15201601    uksort($node->jsdoc_mixins['prototype'], 'strnatcasecmp'); 
    15211602  } 
     1603 
     1604  return jsdoc_get_children($node, $with_private); 
    15221605} 
    15231606 
     
    15291612  $version = jsdoc_get_version($node); 
    15301613  $node->jsdoc_version = $additions->jsdoc_version; 
    1531   $additions->jsdoc_url = 'jsdoc/' . jsdoc_get_project($node)->title . '/HEAD/resource/' . str_replace('/', '__', $node->title); 
    1532   $additions->jsdoc_anchor = l($node->title, $additions->jsdoc_url); 
    15331614  return $additions; 
    15341615} 
     
    15411622  $additions = db_fetch_object(db_query("SELECT version AS jsdoc_version, resource_nid AS jsdoc_resource, resource_vid AS jsdoc_resource_vid, private AS jsdoc_private FROM {jsdoc_variables} WHERE vid = %d", $node->vid)); 
    15421623  $node->jsdoc_version = $additions->jsdoc_version; 
    1543   $additions->jsdoc_url = 'jsdoc/' . jsdoc_get_project($node)->title . '/' . jsdoc_get_version($node)->title . '/object/' . $node->title; 
     1624  $additions->jsdoc_url = 'jsdoc/' . jsdoc_get_project($node)->title . '/' . jsdoc_get_version($node)->title . '/' . $node->title; 
    15441625 
    15451626  return $additions; 
     
    15501631 */ 
    15511632function jsdoc_resource_view($node, $teaser = false, $page = false) { 
    1552   $node = node_prepare($node, $teaser); 
    1553  
    1554   $ending = ''; 
    1555   if (strpos($node->title, '.js') !== false) { 
    1556     $separator = '/'; 
    1557     $ending = '.js'; 
    1558   } 
    1559   elseif (strpos($node->title, '/') !== false) { 
    1560     $separator = '/'; 
    1561   } 
    1562   else { 
    1563     $separator = '.'; 
    1564   } 
    1565   $parts = explode($separator, $node->title); 
    1566   $title_text = ""; 
    1567   $end = array_pop($parts); 
    1568   $title = ''; 
    1569   $last_part = ''; 
    1570   foreach ($parts as $part) { 
    1571     if (!empty($title_text)) { 
    1572       $title_text .= $separator; 
    1573     } 
    1574     $title_text .= $part; 
    1575     $obj = jsdoc_resource_node_load(jsdoc_get_project($node)->nid, jsdoc_get_version($node), $title_text . $ending); 
    1576     if (!empty($title)) { 
    1577       $title .= $separator; 
    1578     } 
    1579     if ($obj) { 
    1580       $title .= l($part, $obj->jsdoc_url); 
    1581     } 
    1582     else { 
    1583       $title .= $part; 
    1584     } 
    1585   } 
    1586   if (!empty($title)) { 
    1587     $title .= $separator; 
    1588   } 
    1589   drupal_set_title($title . $end); 
    1590  
    1591   jsdoc_get_resources($node, array(3, 4)); 
    1592  
    1593   $resources = array(); 
    1594   $expanded = _jsdoc_resource_expand($node->jsdoc_resources, $node->vid, 0, $resources); 
    1595  
    1596   $depth = 1; 
    1597   while ($depth < 20) { 
    1598     $found = false; 
    1599  
    1600     for ($i = 0; $i < count($expanded); $i++) { 
    1601       $leaf = $expanded[$i]; 
    1602       if ($leaf->depth == $depth - 1) { 
    1603         $leaf = _jsdoc_resource_expand($node->jsdoc_resources, $leaf->vid, $depth, $resources); 
    1604         if (!empty($leaf)) { 
    1605           $found = true; 
    1606           array_splice($expanded, $i + 1, 0, $leaf); 
    1607           $i += count($leaf); 
    1608         } 
    1609       } 
    1610     } 
    1611     ++$depth; 
    1612     if (!$found) break; 
    1613   } 
    1614  
    1615   $resources = ''; 
    1616   foreach ($expanded as $leaf) { 
    1617     if ($leaf->depth == 0) { 
    1618       $resources .= '<span style="color: red;">'; 
    1619     } 
    1620     $resources .= str_pad('', $leaf->depth, '-') . ' ' . $leaf->name . '<br>'; 
    1621     if ($leaf->depth == 0) { 
    1622       $resources .= '</span>'; 
    1623     } 
    1624   } 
    1625    
    1626   if (count($expanded)) { 
    1627     $node->content['resources'] = array( 
    1628       '#type' => 'fieldset', 
    1629       '#collapsible' => true, 
    1630       '#collapsed' => true, 
    1631       '#title' => t('Uses') . ' ' . count($expanded) . ' ' . t('resources') . '<br>', 
    1632       '#weight' => 5 
    1633     ); 
    1634     $node->content['resources']['resources'] = array( 
    1635       '#type' => 'item', 
    1636       '#value' => $resources 
    1637     ); 
    1638   } 
    1639  
    1640   if ($node->teaser) { 
    1641     $node->content['teaser'] = array( 
    1642       '#type' => 'item', 
    1643       '#title' => t('Summary'), 
    1644       '#value' => '<p>' . $node->teaser . '</p>', 
    1645       '#weight' => -24 
    1646     ); 
    1647   } 
    1648  
    1649   $children = jsdoc_resource_object_list($node); 
    1650   if (count($children)) { 
    1651     $node->content['jsdoc_children'] = array( 
    1652       '#type' => 'fieldset', 
    1653       '#collapsible' => true, 
    1654       '#collapsed' => true, 
    1655       '#title' => t('Objects in this resource'), 
    1656       '#weight' => 10 
    1657     ); 
    1658   } 
    1659   uksort($children, "strnatcmp"); 
    1660  
    1661   $i = 0; 
    1662   $last = ""; 
    1663   foreach ($children as $child) { 
    1664     $child = _jsdoc_node_load($child->nid, $child->vid); 
    1665     if($last && strpos($child->title, $last) === 0 && strpos($child->title, $node->title . '.') === 0){ 
    1666       continue; 
    1667     } 
    1668     $node->content['jsdoc_children']['children'][] = array( 
    1669       '#type' => 'item', 
    1670       '#weight' => $i++, 
    1671       '#value' => $child->jsdoc_formatted['type'] . $child->jsdoc_formatted['separator'] . l($child->title, $child->jsdoc_url, array(), null, null, null, true) 
    1672     ); 
    1673     if (strpos($child->title, $node->title . '.') === 0) { 
    1674       $last = $child->title . '.'; 
    1675     } 
    1676   } 
    1677  
    1678   if ($node->content['jsdoc_children']) { 
    1679     $node->content['jsdoc_children']['#title'] = ($i == 1) ? t('1 object in this resource') : t($i . ' objects in this resource'); 
    1680   } 
    1681  
    1682   if (!$node->content['jsdoc_children']['children']) { 
    1683     unset($node->children['jsdoc_children']); 
    1684   } 
    1685  
    1686   return $node; 
     1633  $node->title = ''; 
     1634  $node->teaser = ''; 
     1635  $node->body = ''; 
    16871636} 
    16881637 
     
    17581707      $node->content['detail']['jsdoc_disambiguations'][] = array( 
    17591708        '#type' => 'item', 
    1760         '#value' => l($disambiguation->jsdoc_resource->title, 'jsdoc/' . jsdoc_get_project($node)->title . '/HEAD/object/' . str_replace('/', '__', $disambiguation->jsdoc_resource->title) . '/' . $node->title) 
     1709        '#value' => l($disambiguation->jsdoc_resource->title, 'jsdoc/' . jsdoc_get_project($node)->title . '/HEAD/' . str_replace('/', '__', $disambiguation->jsdoc_resource->title) . '/' . $node->title) 
    17611710      ); 
    17621711    } 
     
    23712320 * Custom version of node_load for objects 
    23722321 */ 
    2373 function jsdoc_object_node_load($project, $version, $name, $resource = false) { 
     2322function jsdoc_object_node_load($name, $project, $version, $resource = false) { 
    23742323  $lower_name = strtolower($name); 
    23752324 
     
    24142363  } 
    24152364 
     2365  // Resolve the project the best that we can 
    24162366  if (is_object($project) && $project->nid) { 
    24172367    $project_nid = $project->nid; 
     
    24242374  } 
    24252375 
     2376  // Resolve the version the best that we can 
    24262377  if (is_object($version) && $version->nid) { 
    24272378    $version_nid = $version->nid; 
     
    24342385  } 
    24352386 
    2436   if (is_array($resource) && !empty($resource) && ($node = db_fetch_object(db_query("SELECT n.nid, n.vid FROM {node_revisions} n JOIN {jsdoc_objects} j ON (j.vid = n.vid) WHERE j.used != -1 AND j.new = 0 AND n.title = '%s' AND BINARY n.title = '%s' AND j.provide_vid IN (%s)", $name, $name, implode(',', $resource))))) { 
    2437     return _jsdoc_node_load($node->nid, $node->vid); 
    2438   } 
    2439   elseif ($resource && is_string($resource) && ($resource = db_fetch_object(db_query("SELECT n.nid, n.vid FROM {node_revisions} n JOIN {jsdoc_resources} j ON (j.vid = n.vid) AND n.title = '%s' AND BINARY n.title = '%s' AND j.version = %d", $resource, $resource, $version_nid)))) { 
    2440     if ($node = db_fetch_object(db_query("SELECT n.nid, n.vid FROM {node_revisions} n JOIN {jsdoc_objects} j ON (j.vid = n.vid) WHERE j.used != -1 AND j.new = 0 AND n.title = '%s' AND BINARY n.title = '%s' AND j.resource_vid = %d", $name, $name, $resource->vid))) { 
    2441       $node = _jsdoc_node_load($node->nid, $node->vid); 
    2442       if ($node->jsdoc_used != -1) { 
     2387  // We have a few situations: 
     2388  //    name 
     2389  //    project, name 
     2390  //    project, version, name 
     2391  //    project, version, resource, name 
     2392 
     2393  // If we're missing the version, assume the latest release 
     2394  // If we're missing the project, look up stuff by name 
     2395 
     2396  if (!$project_nid) { 
     2397    // We can't look up the proper version without knowing the project 
     2398    $query = db_query("SELECT nr.nid, MAX(nr.vid) AS vid FROM {node_revisions} nr JOIN {node} n ON (n.vid = nr.vid) WHERE nr.title = '%s' AND BINARY nr.title = '%s' AND n.type = 'jsdoc_variable' GROUP BY nr.nid", $name, $name); 
     2399    if (db_num_rows($query) == 1) { 
     2400      $result = db_fetch_object($query); 
     2401      $node = _jsdoc_node_load($result->nid, $result->vid); 
     2402      if ($object = jsdoc_get_variable_object($node)) { 
     2403        if (!$version) { 
     2404          // In the future, figure out the latest non-HEAD 
     2405          $version = 'HEAD'; 
     2406        } 
     2407        $version = jsdoc_version_node_load($version, jsdoc_get_project($object)); 
     2408        $versioned_query = db_query("SELECT vid FROM {jsdoc_objects} WHERE nid = %d AND version = %d", $object->nid, $version->nid); 
     2409        if ($result = db_fetch_object($versioned_query)) { 
     2410          return _jsdoc_node_load($object->nid, $result->vid); 
     2411        } 
     2412        else { 
     2413          return $node; 
     2414        } 
     2415      } 
     2416      else { 
    24432417        return $node; 
    24442418      } 
    24452419    } 
    2446   } 
    2447   if ($node = db_fetch_object(db_query("SELECT n.nid, n.vid FROM {node_revisions} n JOIN {jsdoc_variables} j ON (j.vid = n.vid) WHERE n.title = '%s' AND BINARY n.title = '%s' AND j.version = %d", $name, $name, $version_nid))) { 
    2448     return _jsdoc_node_load($node->nid, $node->vid); 
    2449   } 
    2450 } 
    2451  
    2452 /** 
    2453  * Path: jsdoc/VERSION/object/NAME 
     2420    else { 
     2421      $nodes = array(); 
     2422      while ($result = db_fetch_object($query)) { 
     2423        $nodes[] = _jsdoc_node_load($result->nid, $result->vid); 
     2424      } 
     2425      return $nodes; 
     2426    } 
     2427  } 
     2428  else { 
     2429    if ($resource) { 
     2430      if (is_object($resource)) { 
     2431        $resources = array($resource->nid); 
     2432      } 
     2433      elseif (is_numeric($resource)) { 
     2434        $resources = array($resource); 
     2435      } 
     2436      elseif (is_array($resource)) { 
     2437        $resources = $resource; 
     2438      } 
     2439      else { 
     2440        $resources = array(jsdoc_resource_node_load($project_nid, $version_nid, $resource)->nid); 
     2441      } 
     2442      $query = db_query("SELECT nr.nid, MAX(nr.vid) AS vid FROM {node_revisions} nr INNER JOIN {jsdoc_objects} j ON (j.vid = nr.vid) WHERE nr.title = '%s' AND BINARY nr.title = '%s' AND j.version = %d AND (j.resource_nid IN (%s) OR j.provide_nid IN (%s)) GROUP BY nr.nid", $name, $name, $version_nid, implode(',', $resources), implode(',', $resources)); 
     2443    } 
     2444    else {