/**
 * Load and fill the requested $display object(s).
 * 
 * Helper function primarily for for panels_load_display().
 *
 * @param array $dids
 *  An indexed array of dids to be loaded from the database.
 * @return $displays
 *  An array of displays, keyed by their display dids.
 */
function panels_load_displays($dids, $load_hidden = TRUE) {
  $displays = array();
  if (empty($dids) || !is_array($dids)) {
    return $displays;
  }

  $subs = implode(', ', array_fill(0, count($dids), '%d'));

  $result = db_query("SELECT * FROM {panels_display} WHERE did IN ($subs)", $dids);
  
  $all_pids = array();
  while ($obj = db_fetch_array($result)) {
    $display = new panels_display();

    foreach ($obj as $key => $value) {
      $display->$key = $value;
    }
    
    // unserialize important bits:
    $display->layout_settings = empty($display->layout_settings) ? array() : unserialize($display->layout_settings);
    $display->panel_settings = empty($display->panel_settings) ? array() : unserialize($display->panel_settings);
    $display->cache = empty($display->cache) ? array() : unserialize($display->cache);

    $display->panels = $display->content = array();

    $displays[$display->did] = $display;
    $all_pids = array_merge($all_pids, $display->shown);
  }
  
  $all_pids = array_unique($all_pids);
  $pid_subs = $load_hidden ? '' : "AND pid IN (" . implode(', ', array_fill(0, count($all_pids), '%d')) . ") ";
  $result = db_query("SELECT * FROM {panels_pane} WHERE did IN ($subs) {$pid_subs}ORDER BY did, panel, position", array_merge($dids, $all_pids));

  while ($pane = db_fetch_object($result)) {
    $pane->configuration = unserialize($pane->configuration);
    $pane->cache = empty($pane->cache) ? array() : unserialize($pane->cache);
    $pane->access = ($pane->access ? explode(', ', $pane->access) : array());

    $displays[$pane->did]->panels[$pane->panel][] = $pane->pid;
    $displays[$pane->did]->content[$pane->pid] = $pane;
  }
  return $displays;
}
