Esempio n. 1
0
    ?>
</a>
	<ul class="dropdown-menu" id="browse-menu">
		<li class="browseNavFacet">			
			<div class="browseMenuContent container">
<?php 
    if (sizeof($va_browse_types) > 1) {
        # --- only show browse targets if there are more than one
        ?>
	
				<div class="mainfacet">
						<ul class="nav nav-pills">			
<?php 
        foreach ($va_browse_types as $vs_browse_name => $va_browse_type) {
            #print "<div class='browseHeadernav'><a href='#'>".$vs_browse_name."</a></div>";
            print "<div class='browseHeadernav caps'><li " . (!$vs_first_browse_name ? "class='active'" : "") . "><a href='#' onclick='jQuery(\"#browseMenuTypeFacet\").load(\"" . caNavUrl($this->request, '*', 'Browse', 'getBrowseNavBarByTarget', array('target' => $vs_browse_name)) . "\"); jQuery(this).parent().siblings().removeClass(\"active\"); jQuery(this).parent().addClass(\"active\"); return false;'>" . caUcFirstUTF8Safe($va_browse_type['displayName']) . "</a></li></div>";
            if (!$vs_first_browse_name) {
                $vs_first_browse_name = $va_browse_type['displayName'];
            }
        }
        ?>
						</ul>
				</div><!--end main facet-->
<?php 
    }
    ?>
				<div id="browseMenuTypeFacet"> </div>
			</div><!-- end browseMenuContent container -->		
		</li><!-- end browseNavFacet -->
	</ul> <!--end dropdown-browse-menu -->	
 </li><!-- end dropdown -->
        print "<a href='#{$vs_block}'>" . $va_results[$vs_block]['displayName'] . " (" . $va_results[$vs_block]['count'] . ")</a>";
    }
    ?>
		</small>
		<h1><?php 
    print _t("Search results for %1", caUcFirstUTF8Safe($this->getVar('search')));
    ?>
</h1>
<?php 
    //
    // Print out block content (results for each type of search)
    //
    foreach ($this->getVar('blockNames') as $vs_block) {
        ?>
			<a name='<?php 
        print $vs_block;
        ?>
'></a>
			<div id="<?php 
        print $vs_block;
        ?>
Block" >
				<?php 
        print $va_results[$vs_block]['html'];
        ?>
			</div>
<?php 
    }
} else {
    print "<H1>" . _t("Your search for %1 returned no results", caUcFirstUTF8Safe($this->getVar('search'))) . "</H1>";
}
 /**
  * Returns summary of current browse parameters suitable for display.
  *
  * @return string Summary of current browse criteria ready for display
  */
 public function getCriteriaForDisplay()
 {
     $va_criteria = $this->opo_browse->getCriteriaWithLabels();
     if (!sizeof($va_criteria)) {
         return '';
     }
     $va_criteria_info = $this->opo_browse->getInfoForFacets();
     $va_buf = array();
     foreach ($va_criteria as $vs_facet => $va_vals) {
         $va_buf[] = caUcFirstUTF8Safe($va_criteria_info[$vs_facet]['label_singular']) . ': ' . join(", ", $va_vals);
     }
     return join("; ", $va_buf);
 }
Esempio n. 4
0
 *
 * ----------------------------------------------------------------------
 */
$va_browse_types = caGetBrowseTypes();
if (sizeof($va_browse_types)) {
    ?>
 <li class="dropdown yamm-fw"> <!-- add class yamm-fw for full width-->
	<a href="#" class="dropdown-toggle" data-toggle="dropdown"><?php 
    print _t("Browse");
    ?>
</a>
	<ul class="dropdown-menu" id="browse-menu">
		<li class="browseNavFacet">			
			<div class="browseMenuContent container text-center">
<?php 
    if (sizeof($va_browse_types) > 1) {
        ?>
	
			Find: 
<?php 
        foreach ($va_browse_types as $vs_browse_name => $va_browse_type) {
            print caNavLink($this->request, caUcFirstUTF8Safe($vs_browse_name) . ' &nbsp;' . $va_browse_type["icon_class"] . '', 'browseMenuBrowseAll btn btn-default btn-lg', '', 'Browse', $vs_browse_name, '');
        }
    }
    ?>
			</div><!-- end browseMenuContent container -->		
		</li><!-- end browseNavFacet -->
	</ul> <!--end dropdown-browse-menu -->	
 </li><!-- end dropdown -->
<?php 
}
 /**
  * Returns list of placements in the currently loaded screen
  *
  * @param array $pa_options Optional array of options. Supported options are:
  *		noCache = if set to true, no caching of placement values is performed.
  *		user_id = if specified then placements are only returned if the user has at least read access to the screen
  * @return array List of placements. Each element in the list is an array with the following keys:
  *		display = A display label for the bundle
  *		bundle = The bundle name
  */
 public function getPlacementsInScreen($pa_options = null)
 {
     if (!is_array($pa_options)) {
         $pa_options = array();
     }
     $pb_no_cache = isset($pa_options['noCache']) ? (bool) $pa_options['noCache'] : false;
     $pn_user_id = isset($pa_options['user_id']) ? $pa_options['user_id'] : null;
     //if ($pn_user_id && !$this->haveAccessToDisplay($pn_user_id, __CA_BUNDLE_DISPLAY_READ_ACCESS__)) {
     //	return array();
     //}
     if (!($pn_table_num = $this->getTableNum())) {
         return null;
     }
     if (!($t_instance = $this->_DATAMODEL->getInstanceByTableNum($pn_table_num, true))) {
         return null;
     }
     if (!is_array($va_placements = $this->getPlacements($pa_options))) {
         $va_placements = array();
     }
     $va_placements_in_screen = array();
     foreach ($va_placements as $vn_placement_id => $va_placement) {
         $vs_bundle_proc = preg_replace('!^ca_attribute_!', '', $va_placement['bundle_name']);
         $vs_label = ($vs_label = $t_instance->getDisplayLabel($t_instance->tableName() . '.' . $vs_bundle_proc)) ? $vs_label : $va_placement['bundle_name'];
         if (is_array($va_placement['settings']['label'])) {
             $va_tmp = caExtractValuesByUserLocale(array($va_placement['settings']['label']));
             if ($vs_user_set_label = array_shift($va_tmp)) {
                 $vs_label = "{$vs_label} (<em>{$vs_user_set_label}</em>)";
             }
         }
         $vs_display = "<div id='uiEditor_{$vn_placement_id}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_instance->getProperty('NAME_SINGULAR')) . "</span> {$vs_label}</div>";
         $va_placement['display'] = $vs_display;
         $va_placement['bundle'] = $va_placement['bundle_name'];
         // we used 'bundle' in the arrays, but the database field is called 'bundle_name' and getPlacements() returns data directly from the database
         unset($va_placement['bundle_name']);
         $va_placements_in_screen[$vn_placement_id] = $va_placement;
         $vs_description = $t_instance->getDisplayDescription($t_instance->tableName() . '.' . $vs_bundle_proc);
         TooltipManager::add("#uiEditor_{$vn_placement_id}", "<h2>{$vs_label}</h2>" . _t("Bundle name") . ": {$vs_bundle_proc}<br />" . (strlen($vs_description) > 0 ? _t("Description") . ": {$vs_description}<br />" : ""));
     }
     return $va_placements_in_screen;
 }
 /**
  *
  */
 private function _getChangeLogFromRawData($pa_data, $pn_table_num, $pa_options = null)
 {
     //print "<pre>".print_r($pa_data, true)."</pre>\n";
     $va_log_output = array();
     $vs_blank_placeholder = '&lt;' . _t('BLANK') . '&gt;';
     if (!$pa_options) {
         $pa_options = array();
     }
     if (sizeof($pa_data)) {
         //
         // Init
         //
         $o_datamodel = Datamodel::load();
         $va_change_types = array('I' => _t('Added'), 'U' => _t('Edited'), 'D' => _t('Deleted'));
         $vs_label_table_name = $vs_label_display_name = '';
         $t_item = $o_datamodel->getInstanceByTableNum($pn_table_num, true);
         $vs_label_table_name = $vn_label_table_num = $vs_label_display_name = null;
         if (method_exists($t_item, 'getLabelTableName')) {
             $t_item_label = $t_item->getLabelTableInstance();
             $vs_label_table_name = $t_item->getLabelTableName();
             $vn_label_table_num = $t_item_label->tableNum();
             $vs_label_display_name = $t_item_label->getProperty('NAME_SINGULAR');
         }
         //
         // Group data by unit
         //
         $va_grouped_data = array();
         foreach ($pa_data as $va_log_entry) {
             $va_grouped_data[$va_log_entry['unit_id']]['ca_table_num_' . $va_log_entry['logged_table_num']][] = $va_log_entry;
         }
         //
         // Process units
         //
         $va_attributes = array();
         foreach ($va_grouped_data as $vn_unit_id => $va_log_entries_by_table) {
             foreach ($va_log_entries_by_table as $vs_table_key => $va_log_entries) {
                 foreach ($va_log_entries as $va_log_entry) {
                     $va_changes = array();
                     if (!is_array($va_log_entry['snapshot'])) {
                         $va_log_entry['snapshot'] = array();
                     }
                     //
                     // Get date/time stamp for display
                     //
                     $vs_datetime = date("n/d/Y@g:i:sa T", $va_log_entry['log_datetime']);
                     //
                     // Get user name
                     //
                     $vs_user = $va_log_entry['fname'] . ' ' . $va_log_entry['lname'];
                     $vs_email = $va_log_entry['email'];
                     // The "logged" table/row is the row to which the change was actually applied
                     // The "subject" table/row is the row to which the change is considered to have been made for workflow purposes.
                     //
                     // For example: if an entity is related to an object, strictly speaking the logging occurs on the ca_objects_x_entities
                     // row (ca_objects_x_entities is the "logged" table), but the subject is ca_objects since it's only in the context of the
                     // object (and probably the ca_entities row as well) that you can about the change.
                     //
                     $t_obj = $o_datamodel->getInstanceByTableNum($va_log_entry['logged_table_num'], true);
                     // get instance for logged table
                     if (!$t_obj) {
                         continue;
                     }
                     $vs_subject_display_name = '???';
                     $vn_subject_row_id = null;
                     $vn_subject_table_num = null;
                     if (isset($pa_options['return_item_names']) && $pa_options['return_item_names']) {
                         if (!($vn_subject_table_num = $va_log_entry['subject_table_num'])) {
                             $vn_subject_table_num = $va_log_entry['logged_table_num'];
                             $vn_subject_row_id = $va_log_entry['logged_row_id'];
                         } else {
                             $vn_subject_row_id = $va_log_entry['subject_row_id'];
                         }
                         if ($t_subject = $o_datamodel->getInstanceByTableNum($vn_subject_table_num, true)) {
                             if ($t_subject->load($vn_subject_row_id)) {
                                 if (method_exists($t_subject, 'getLabelForDisplay')) {
                                     $vs_subject_display_name = $t_subject->getLabelForDisplay(false);
                                 } else {
                                     if ($vs_idno_field = $t_subject->getProperty('ID_NUMBERING_ID_FIELD')) {
                                         $vs_subject_display_name = $t_subject->getProperty('NAME_SINGULAR') . ' [' . $t_subject->get($vs_idno_field) . ']';
                                     } else {
                                         $vs_subject_display_name = $t_subject->getProperty('NAME_SINGULAR') . ' [' . $vn_subject_row_id . ']';
                                     }
                                 }
                             }
                         }
                     }
                     //
                     // Get item changes
                     //
                     // ---------------------------------------------------------------
                     // is this an intrinsic field?
                     if ($pn_table_num == $va_log_entry['logged_table_num']) {
                         foreach ($va_log_entry['snapshot'] as $vs_field => $vs_value) {
                             $va_field_info = $t_obj->getFieldInfo($vs_field);
                             if (isset($va_field_info['IDENTITY']) && $va_field_info['IDENTITY']) {
                                 continue;
                             }
                             if (isset($va_field_info['DISPLAY_TYPE']) && $va_field_info['DISPLAY_TYPE'] == DT_OMIT) {
                                 continue;
                             }
                             if (isset($va_field_info['DISPLAY_FIELD']) && is_array($va_field_info['DISPLAY_FIELD']) && ($va_disp_fields = $va_field_info['DISPLAY_FIELD'])) {
                                 //
                                 // Lookup value in related table
                                 //
                                 if (!$vs_value) {
                                     continue;
                                 }
                                 if (sizeof($va_disp_fields)) {
                                     $va_rel = $o_datamodel->getManyToOneRelations($t_obj->tableName(), $vs_field);
                                     $va_rel_values = array();
                                     if ($t_rel_obj = $o_datamodel->getTableInstance($va_rel['one_table'], true)) {
                                         $t_rel_obj->load($vs_value);
                                         foreach ($va_disp_fields as $vs_display_field) {
                                             $va_tmp = explode('.', $vs_display_field);
                                             if (($vs_tmp = $t_rel_obj->get($va_tmp[1])) !== '') {
                                                 $va_rel_values[] = $vs_tmp;
                                             }
                                         }
                                     }
                                     $vs_proc_val = join(', ', $va_rel_values);
                                 }
                             } else {
                                 // Is field a foreign key?
                                 $va_keys = $o_datamodel->getManyToOneRelations($t_obj->tableName(), $vs_field);
                                 if (sizeof($va_keys)) {
                                     // yep, it's a foreign key
                                     $va_rel_values = array();
                                     if ($t_rel_obj = $o_datamodel->getTableInstance($va_keys['one_table'], true)) {
                                         if ($t_rel_obj->load($vs_value)) {
                                             if (method_exists($t_rel_obj, 'getLabelForDisplay')) {
                                                 $vs_proc_val = $t_rel_obj->getLabelForDisplay(false);
                                             } else {
                                                 $va_disp_fields = $t_rel_obj->getProperty('LIST_FIELDS');
                                                 foreach ($va_disp_fields as $vs_display_field) {
                                                     if (($vs_tmp = $t_rel_obj->get($vs_display_field)) !== '') {
                                                         $va_rel_values[] = $vs_tmp;
                                                     }
                                                 }
                                                 $vs_proc_val = join(' ', $va_rel_values);
                                             }
                                             if (!$vs_proc_val) {
                                                 $vs_proc_val = '???';
                                             }
                                         } else {
                                             $vs_proc_val = _t("Not set");
                                         }
                                     } else {
                                         $vs_proc_val = _t('Non-existent');
                                     }
                                 } else {
                                     // Adjust display of value for different field types
                                     switch ($va_field_info['FIELD_TYPE']) {
                                         case FT_BIT:
                                             $vs_proc_val = $vs_value ? 'Yes' : 'No';
                                             break;
                                         default:
                                             $vs_proc_val = $vs_value;
                                             break;
                                     }
                                     // Adjust display of value for lists
                                     if ($va_field_info['LIST']) {
                                         $t_list = new ca_lists();
                                         if ($t_list->load(array('list_code' => $va_field_info['LIST']))) {
                                             $vn_list_id = $t_list->getPrimaryKey();
                                             $t_list_item = new ca_list_items();
                                             if ($t_list_item->load(array('list_id' => $vn_list_id, 'item_value' => $vs_value))) {
                                                 $vs_proc_val = $t_list_item->getLabelForDisplay();
                                             }
                                         }
                                     } else {
                                         if ($va_field_info['BOUNDS_CHOICE_LIST']) {
                                             // TODO
                                         }
                                     }
                                 }
                             }
                             $va_changes[] = array('label' => $va_field_info['LABEL'], 'description' => strlen((string) $vs_proc_val) ? $vs_proc_val : $vs_blank_placeholder, 'value' => $vs_value);
                         }
                     }
                     // ---------------------------------------------------------------
                     // is this a label row?
                     if ($va_log_entry['logged_table_num'] == $vn_label_table_num) {
                         foreach ($va_log_entry['snapshot'] as $vs_field => $vs_value) {
                             $va_changes[] = array('label' => $t_item_label->getFieldInfo($vs_field, 'LABEL'), 'description' => $vs_value);
                         }
                     }
                     // ---------------------------------------------------------------
                     // is this an attribute?
                     if ($va_log_entry['logged_table_num'] == 3) {
                         // attribute_values
                         if ($t_element = ca_attributes::getElementInstance($va_log_entry['snapshot']['element_id'])) {
                             if ($o_attr_val = Attribute::getValueInstance($t_element->get('datatype'))) {
                                 $o_attr_val->loadValueFromRow($va_log_entry['snapshot']);
                                 $vs_attr_val = $o_attr_val->getDisplayValue();
                             } else {
                                 $vs_attr_val = '?';
                             }
                             // Convert list-based attributes to text
                             if ($vn_list_id = $t_element->get('list_id')) {
                                 $t_list = new ca_lists();
                                 $vs_attr_val = $t_list->getItemFromListForDisplayByItemID($vn_list_id, $vs_attr_val, true);
                             }
                             if (!$vs_attr_val) {
                                 $vs_attr_val = $vs_blank_placeholder;
                             }
                             $vs_label = $t_element->getLabelForDisplay();
                             $va_attributes[$va_log_entry['snapshot']['attribute_id']]['values'][] = array('label' => $vs_label, 'value' => $vs_attr_val);
                             $va_changes[] = array('label' => $vs_label, 'description' => $vs_attr_val);
                         }
                     }
                     // ---------------------------------------------------------------
                     // is this a related (many-many) row?
                     $va_keys = $o_datamodel->getOneToManyRelations($t_item->tableName(), $t_obj->tableName());
                     if (sizeof($va_keys) > 0) {
                         if (method_exists($t_obj, 'getLeftTableNum')) {
                             if ($t_obj->getLeftTableNum() == $t_item->tableNum()) {
                                 // other side of rel is on right
                                 $t_related_table = $o_datamodel->getInstanceByTableNum($t_obj->getRightTableNum(), true);
                                 $t_related_table->load($va_log_entry['snapshot'][$t_obj->getRightTableFieldName()]);
                             } else {
                                 // other side of rel is on left
                                 $t_related_table = $o_datamodel->getInstanceByTableNum($t_obj->getLeftTableNum(), true);
                                 $t_related_table->load($va_log_entry['snapshot'][$t_obj->getLeftTableFieldName()]);
                             }
                             $t_rel = $o_datamodel->getInstanceByTableNum($t_obj->tableNum(), true);
                             $va_changes[] = array('label' => caUcFirstUTF8Safe($t_related_table->getProperty('NAME_SINGULAR')), 'idno' => ($vs_idno_field = $t_related_table->getProperty('ID_NUMBERING_ID_FIELD')) ? $t_related_table->get($vs_idno_field) : null, 'description' => $t_related_table->getLabelForDisplay(), 'table_name' => $t_related_table->tableName(), 'table_num' => $t_related_table->tableNum(), 'row_id' => $t_related_table->getPrimaryKey(), 'rel_type_id' => $va_log_entry['snapshot']['type_id'], 'rel_typename' => $t_rel->getRelationshipTypename('ltor', $va_log_entry['snapshot']['type_id']));
                         }
                     }
                     // ---------------------------------------------------------------
                     // record log line
                     if (sizeof($va_changes)) {
                         $va_log_output[$vn_unit_id][] = array('datetime' => $vs_datetime, 'user_fullname' => $vs_user, 'user_email' => $vs_email, 'user' => $vs_user . ' (' . $vs_email . ')', 'changetype_display' => $va_change_types[$va_log_entry['changetype']], 'changetype' => $va_log_entry['changetype'], 'changes' => $va_changes, 'subject' => $vs_subject_display_name, 'subject_id' => $vn_subject_row_id, 'subject_table_num' => $vn_subject_table_num, 'logged_table_num' => $va_log_entry['logged_table_num'], 'logged_table' => $t_obj->tableName(), 'logged_row_id' => $va_log_entry['logged_row_id']);
                     }
                 }
             }
         }
     }
     return $va_log_output;
 }
Esempio n. 7
0
/**
 * Generates standard-format inspector panels for editors
 *
 * @param View $po_view Inspector view object
 * @param array $pa_options Optional array of options. Supported options are:
 *		backText = a string to use as the "back" button text; default is "Results"
 *
 * @return string HTML implementing the inspector
 */
function caEditorInspector($po_view, $pa_options = null)
{
    require_once __CA_MODELS_DIR__ . '/ca_sets.php';
    require_once __CA_MODELS_DIR__ . '/ca_data_exporters.php';
    $t_item = $po_view->getVar('t_item');
    $vs_table_name = $t_item->tableName();
    if (($vs_priv_table_name = $vs_table_name) == 'ca_list_items') {
        $vs_priv_table_name = 'ca_lists';
    }
    $vn_item_id = $t_item->getPrimaryKey();
    $o_result_context = $po_view->getVar('result_context');
    $t_ui = $po_view->getVar('t_ui');
    $t_type = method_exists($t_item, "getTypeInstance") ? $t_item->getTypeInstance() : null;
    $vs_type_name = method_exists($t_item, "getTypeName") ? $t_item->getTypeName() : '';
    if (!$vs_type_name) {
        $vs_type_name = $t_item->getProperty('NAME_SINGULAR');
    }
    $va_reps = $po_view->getVar('representations');
    $o_dm = Datamodel::load();
    if ($t_item->isHierarchical()) {
        $va_ancestors = $po_view->getVar('ancestors');
        $vn_parent_id = $t_item->get($t_item->getProperty('HIERARCHY_PARENT_ID_FLD'));
    } else {
        $va_ancestors = array();
        $vn_parent_id = null;
    }
    // action extra to preserve currently open screen across next/previous links
    $vs_screen_extra = $po_view->getVar('screen') ? '/' . $po_view->getVar('screen') : '';
    if ($vs_type_name == "list item") {
        $vs_style = "style='height:auto;'";
    }
    if ($vn_item_id | $po_view->request->getAction() === 'Delete') {
        $vs_buf = '<h3 class="nextPrevious" ' . $vs_style . '>' . caEditorFindResultNavigation($po_view->request, $t_item, $o_result_context, $pa_options) . "</h3>\n";
    }
    $vs_color = null;
    if ($t_type) {
        $vs_color = trim($t_type->get('color'));
    }
    if (!$vs_color && $t_ui) {
        $vs_color = trim($t_ui->get('color'));
    }
    if (!$vs_color) {
        $vs_color = "FFFFFF";
    }
    $vs_buf .= "<h4><div id='caColorbox' style='border: 6px solid #{$vs_color};'>\n";
    $vs_icon = null;
    if ($t_type) {
        $vs_icon = $t_type->getMediaTag('icon', 'icon');
    }
    if (!$vs_icon && $t_ui) {
        $vs_icon = $t_ui->getMediaTag('icon', 'icon');
    }
    if ($vs_icon) {
        $vs_buf .= "<div id='inspectoricon' style='border-right: 6px solid #{$vs_color}; border-bottom: 6px solid #{$vs_color}; -moz-border-radius-bottomright: 8px; -webkit-border-bottom-right-radius: 8px;'>\n{$vs_icon}</div>\n";
    }
    if ($po_view->request->getAction() === 'Delete' && $po_view->request->getParameter('confirm', pInteger)) {
        $vs_buf .= "<strong>" . _t("Deleted %1", $vs_type_name) . "</strong>\n";
        $vs_buf .= "<br style='clear: both;'/></div></h4>\n";
    } else {
        if ($vn_item_id) {
            if (!$po_view->request->config->get("{$vs_priv_table_name}_inspector_disable_headline")) {
                if ($po_view->request->user->canDoAction("can_edit_" . $vs_priv_table_name) && sizeof($t_item->getTypeList()) > 1) {
                    $vs_buf .= "<strong>" . _t("Editing %1", $vs_type_name) . ": </strong>\n";
                } else {
                    $vs_buf .= "<strong>" . _t("Viewing %1", $vs_type_name) . ": </strong>\n";
                }
            }
            if ($t_item->hasField('is_deaccessioned') && $t_item->get('is_deaccessioned') && $t_item->get('deaccession_date', array('getDirectDate' => true)) <= caDateToHistoricTimestamp(_t('now'))) {
                // If currently deaccessioned then display deaccession message
                $vs_buf .= "<br/><div class='inspectorDeaccessioned'>" . _t('Deaccessioned %1', $t_item->get('deaccession_date')) . "</div>\n";
                if ($vs_deaccession_notes = $t_item->get('deaccession_notes')) {
                    TooltipManager::add(".inspectorDeaccessioned", $vs_deaccession_notes);
                }
            } else {
                if ($po_view->request->user->canDoAction('can_see_current_location_in_inspector_ca_objects')) {
                    if ($t_ui && method_exists($t_item, "getObjectHistory") && (is_array($va_placements = $t_ui->getPlacementsForBundle('ca_objects_history')) && sizeof($va_placements) > 0)) {
                        //
                        // Output current "location" of object in life cycle. Configuration is taken from a ca_objects_history bundle configured for the current editor
                        //
                        $va_placement = array_shift($va_placements);
                        $va_bundle_settings = $va_placement['settings'];
                        if (is_array($va_history = $t_item->getObjectHistory($va_bundle_settings, array('limit' => 1, 'currentOnly' => true))) && sizeof($va_history) > 0) {
                            $va_current_location = array_shift(array_shift($va_history));
                            if (!($vs_inspector_current_location_label = $po_view->request->config->get("ca_objects_inspector_current_location_label"))) {
                                $vs_inspector_current_location_label = _t('Current');
                            }
                            if ($va_current_location['display']) {
                                $vs_buf .= "<div class='inspectorCurrentLocation'><strong>" . $vs_inspector_current_location_label . ':</strong><br/>' . $va_current_location['display'] . "</div>";
                            }
                        }
                    } elseif (method_exists($t_item, "getLastLocationForDisplay")) {
                        // If no ca_objects_history bundle is configured then display the last storage location
                        if ($vs_current_location = $t_item->getLastLocationForDisplay("<ifdef code='ca_storage_locations.parent.preferred_labels'>^ca_storage_locations.parent.preferred_labels ➜ </ifdef>^ca_storage_locations.preferred_labels.name")) {
                            $vs_buf .= "<br/><div class='inspectorCurrentLocation'>" . _t('Location: %1', $vs_current_location) . "</div>\n";
                            $vs_full_location_hierarchy = $t_item->getLastLocationForDisplay("^ca_storage_locations.hierarchy.preferred_labels.name%delimiter=_➜_");
                            if ($vs_full_location_hierarchy !== $vs_current_location) {
                                TooltipManager::add(".inspectorCurrentLocation", $vs_full_location_hierarchy);
                            }
                        }
                    }
                }
            }
            //
            // Display flags; expressions for these are defined in app.conf in the <table_name>_inspector_display_flags directive
            //
            if (is_array($va_display_flags = $po_view->request->config->getAssoc("{$vs_table_name}_inspector_display_flags"))) {
                $va_display_flag_buf = array();
                foreach ($va_display_flags as $vs_exp => $vs_display_flag) {
                    $va_exp_vars = array();
                    foreach (ExpressionParser::getVariableList($vs_exp) as $vs_var_name) {
                        $va_exp_vars[$vs_var_name] = $t_item->get($vs_var_name, array('returnIdno' => true));
                    }
                    if (ExpressionParser::evaluate($vs_exp, $va_exp_vars)) {
                        $va_display_flag_buf[] = $t_item->getWithTemplate("{$vs_display_flag}");
                    }
                }
                if (sizeof($va_display_flag_buf) > 0) {
                    $vs_buf .= join("; ", $va_display_flag_buf);
                }
            }
            $vs_label = '';
            $vb_dont_use_labels_for_ca_objects = (bool) $t_item->getAppConfig()->get('ca_objects_dont_use_labels');
            if (!($vs_table_name === 'ca_objects' && $vb_dont_use_labels_for_ca_objects)) {
                if ($vs_get_spec = $po_view->request->config->get("{$vs_table_name}_inspector_display_title")) {
                    $vs_label = caProcessTemplateForIDs($vs_get_spec, $vs_table_name, array($t_item->getPrimaryKey()));
                } else {
                    $va_object_collection_collection_ancestors = $po_view->getVar('object_collection_collection_ancestors');
                    if ($t_item->tableName() == 'ca_objects' && $t_item->getAppConfig()->get('ca_objects_x_collections_hierarchy_enabled') && is_array($va_object_collection_collection_ancestors) && sizeof($va_object_collection_collection_ancestors)) {
                        $va_collection_links = array();
                        foreach ($va_object_collection_collection_ancestors as $va_collection_ancestor) {
                            $va_collection_links[] = caEditorLink($po_view->request, $va_collection_ancestor['label'], '', 'ca_collections', $va_collection_ancestor['collection_id']);
                        }
                        $vs_label .= join(" / ", $va_collection_links) . ' &gt; ';
                    }
                    if (method_exists($t_item, 'getLabelForDisplay')) {
                        $vn_parent_index = sizeof($va_ancestors) - 1;
                        if ($vn_parent_id && ($vs_table_name != 'ca_places' || $vn_parent_index > 0)) {
                            $va_parent = $va_ancestors[$vn_parent_index];
                            $vs_disp_fld = $t_item->getLabelDisplayField();
                            if ($va_parent['NODE'][$vs_disp_fld] && ($vs_editor_link = caEditorLink($po_view->request, $va_parent['NODE'][$vs_disp_fld], '', $vs_table_name, $va_parent['NODE'][$t_item->primaryKey()]))) {
                                $vs_label .= $vs_editor_link . ' &gt; ' . $t_item->getLabelForDisplay();
                            } else {
                                $vs_label .= ($va_parent['NODE'][$vs_disp_fld] ? $va_parent['NODE'][$vs_disp_fld] . ' &gt; ' : '') . $t_item->getLabelForDisplay();
                            }
                        } else {
                            $vs_label .= $t_item->getLabelForDisplay();
                            if ($vs_table_name === 'ca_editor_uis' && in_array($po_view->request->getAction(), array('EditScreen', 'DeleteScreen', 'SaveScreen'))) {
                                $t_screen = new ca_editor_ui_screens($po_view->request->getParameter('screen_id', pInteger));
                                if (!($vs_screen_name = $t_screen->getLabelForDisplay())) {
                                    $vs_screen_name = _t('new screen');
                                }
                                $vs_label .= " &gt; " . $vs_screen_name;
                            }
                        }
                    } else {
                        $vs_label .= $t_item->get('name');
                    }
                }
            }
            $vb_show_idno = (bool) ($vs_idno = $t_item->get($t_item->getProperty('ID_NUMBERING_ID_FIELD')));
            if (!$vs_label) {
                switch ($vs_table_name) {
                    case 'ca_commerce_orders':
                        if ($t_item->get('order_type') == 'L') {
                            if ($vs_org = $t_item->get('billing_organization')) {
                                $vs_label = _t('%5 #%4 on %1 to %2 (%3)', caGetLocalizedDate($t_item->get('created_on', array('getDirectDate' => true)), array('dateFormat' => 'delimited', 'timeOmit' => true)), $t_item->get('billing_fname') . ' ' . $t_item->get('billing_lname'), $vs_org, $t_item->getOrderNumber(), caUcFirstUTF8Safe($t_item->getProperty('NAME_SINGULAR')));
                            } else {
                                $vs_label = _t('%4 #%3 on %1 to %2', caGetLocalizedDate($t_item->get('created_on', array('getDirectDate' => true)), array('dateFormat' => 'delimited', 'timeOmit' => true)), $t_item->get('billing_fname') . ' ' . $t_item->get('billing_lname'), $t_item->getOrderNumber(), caUcFirstUTF8Safe($t_item->getProperty('NAME_SINGULAR')));
                            }
                        } else {
                            if ($vs_org = $t_item->get('billing_organization')) {
                                $vs_label = _t('%5 #%4 on %1 from %2 (%3)', caGetLocalizedDate($t_item->get('created_on', array('getDirectDate' => true)), array('dateFormat' => 'delimited', 'timeOmit' => true)), $t_item->get('billing_fname') . ' ' . $t_item->get('billing_lname'), $vs_org, $t_item->getOrderNumber(), caUcFirstUTF8Safe($t_item->getProperty('NAME_SINGULAR')));
                            } else {
                                $vs_label = _t('%4 #%3 on %1 from %2', caGetLocalizedDate($t_item->get('created_on', array('getDirectDate' => true)), array('dateFormat' => 'delimited', 'timeOmit' => true)), $t_item->get('billing_fname') . ' ' . $t_item->get('billing_lname'), $t_item->getOrderNumber(), caUcFirstUTF8Safe($t_item->getProperty('NAME_SINGULAR')));
                            }
                        }
                        break;
                    default:
                        if ($vs_table_name === 'ca_objects' && $vb_dont_use_labels_for_ca_objects) {
                            $vs_label = $vs_idno;
                            $vb_show_idno = false;
                        } else {
                            $vs_label = '[' . _t('BLANK') . ']';
                        }
                        break;
                }
            }
            $vs_buf .= "<div class='recordTitle {$vs_table_name}' style='width:190px; overflow:hidden;'>{$vs_label}" . ($vb_show_idno ? "<a title='{$vs_idno}'>" . ($vs_idno ? " ({$vs_idno})" : '') : "") . "</a></div>";
            if ($vs_table_name === 'ca_object_lots' && $t_item->getPrimaryKey()) {
                $vs_buf .= "<div id='inspectorLotMediaDownload'><strong>" . (($vn_num_objects = $t_item->numObjects()) == 1 ? _t('Lot contains %1 object', $vn_num_objects) : _t('Lot contains %1 objects', $vn_num_objects)) . "</strong>\n";
            }
            if ($po_view->request->config->get("include_custom_inspector")) {
                if (file_exists($po_view->request->getViewsDirectoryPath() . "/bundles/inspector_info.php")) {
                    $vo_inspector_view = new View($po_view->request, $po_view->request->getViewsDirectoryPath() . "/bundles/");
                    $vo_inspector_view->setVar('t_item', $t_item);
                    $vs_buf .= $vo_inspector_view->render('inspector_info.php');
                }
            }
        } else {
            $vs_parent_name = '';
            if ($vn_parent_id = $po_view->request->getParameter('parent_id', pInteger)) {
                $t_parent = clone $t_item;
                $t_parent->load($vn_parent_id);
                $vs_parent_name = $t_parent->getLabelForDisplay();
            }
            $vs_buf .= "<div class='creatingNew'>" . _t("Creating new %1", $vs_type_name) . " " . ($vs_parent_name ? _t("%1 &gt; New %2", $vs_parent_name, $vs_type_name) : '') . "</div>\n";
            $vs_buf .= "<br/>\n";
        }
        // -------------------------------------------------------------------------------------
        if ($t_item->getPrimaryKey()) {
            if (sizeof($va_reps) > 0) {
                $va_imgs = array();
                $vs_buf .= "<div id='inspectorMedia'>";
                $vn_r = $vn_primary_index = 0;
                foreach ($va_reps as $va_rep) {
                    if (!($va_rep['info']['preview170']['WIDTH'] && $va_rep['info']['preview170']['HEIGHT'])) {
                        continue;
                    }
                    if ($vb_is_primary = isset($va_rep['is_primary']) && (bool) $va_rep['is_primary']) {
                        $vn_primary_index = $vn_r;
                    }
                    $va_imgs[] = "{url:'" . $va_rep['urls']['preview170'] . "', width: " . $va_rep['info']['preview170']['WIDTH'] . ", height: " . $va_rep['info']['preview170']['HEIGHT'] . ", link: '#', onclick:  'caMediaPanel.showPanel(\\'" . caNavUrl($po_view->request, '*', '*', 'GetMediaOverlay', array($t_item->primaryKey() => $vn_item_id, 'representation_id' => $va_rep['representation_id'])) . "\\')'}";
                    $vn_r++;
                }
                if (sizeof($va_reps) > 1) {
                    $vs_buf .= "\n\t\t\t\t\t<div class='leftScroll'>\n\t\t\t\t\t\t<a href='#' onclick='inspectorInfoRepScroller.scrollToPreviousImage(); return false;'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_SCROLL_LT__) . "</a>\n\t\t\t\t\t</div>\n\t\t";
                }
                if (sizeof($va_imgs) > 0) {
                    $vs_buf .= "\n\t\t\t\t<div id='inspectorInfoRepScrollingViewer' style='position: relative;'>\n\t\t\t\t\t<div id='inspectorInfoRepScrollingViewerContainer'>\n\t\t\t\t\t\t<div id='inspectorInfoRepScrollingViewerImageContainer'></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t";
                    if (sizeof($va_reps) > 1) {
                        $vs_buf .= "\n\t\t\t\t\t<div class='rightScroll'>\n\t\t\t\t\t\t<a href='#' onclick='inspectorInfoRepScroller.scrollToNextImage(); return false;'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_SCROLL_RT__) . "</a>\n\t\t\t\t\t</div>\n\t\t";
                    }
                    TooltipManager::add(".leftScroll", _t('Previous'));
                    TooltipManager::add(".rightScroll", _t('Next'));
                    $vs_buf .= "<script type='text/javascript'>";
                    $vs_buf .= "\n\t\t\t\t\tvar inspectorInfoRepScroller = caUI.initImageScroller([" . join(",", $va_imgs) . "], 'inspectorInfoRepScrollingViewerImageContainer', {\n\t\t\t\t\t\t\tcontainerWidth: 170, containerHeight: 170,\n\t\t\t\t\t\t\timageCounterID: 'inspectorInfoRepScrollingViewerCounter',\n\t\t\t\t\t\t\tscrollingImageClass: 'inspectorInfoRepScrollerImage',\n\t\t\t\t\t\t\tscrollingImagePrefixID: 'inspectorInfoRep',\n\t\t\t\t\t\t\tinitialIndex: {$vn_primary_index}\n\t\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t</script>";
                }
                $vs_buf .= "</div>\n";
                if ($vs_get_spec = $po_view->request->config->get("{$vs_table_name}_inspector_display_below_media")) {
                    $vs_buf .= caProcessTemplateForIDs($vs_get_spec, $vs_table_name, array($t_item->getPrimaryKey()));
                }
            }
            $vs_buf .= "<div id='toolIcons'>";
            if ($vn_item_id) {
                # --- watch this link
                $vs_watch = "";
                if (in_array($vs_table_name, array('ca_objects', 'ca_object_lots', 'ca_entities', 'ca_places', 'ca_occurrences', 'ca_collections', 'ca_storage_locations'))) {
                    require_once __CA_MODELS_DIR__ . '/ca_watch_list.php';
                    $t_watch_list = new ca_watch_list();
                    $vs_watch = "<div class='watchThis'><a href='#' title='" . _t('Add/remove item to/from watch list.') . "' onclick='caToggleItemWatch(); return false;' id='caWatchItemButton'>" . caNavIcon($po_view->request, $t_watch_list->isItemWatched($vn_item_id, $t_item->tableNum(), $po_view->request->user->get("user_id")) ? __CA_NAV_BUTTON_UNWATCH__ : __CA_NAV_BUTTON_WATCH__) . "</a></div>";
                    $vs_buf .= "\n<script type='text/javascript'>\n\t\tfunction caToggleItemWatch() {\n\t\t\tvar url = '" . caNavUrl($po_view->request, $po_view->request->getModulePath(), $po_view->request->getController(), 'toggleWatch', array($t_item->primaryKey() => $vn_item_id)) . "';\n\t\t\t\n\t\t\tjQuery.getJSON(url, {}, function(data, status) {\n\t\t\t\tif (data['status'] == 'ok') {\n\t\t\t\t\tjQuery('#caWatchItemButton').html((data['state'] == 'watched') ? '" . addslashes(caNavIcon($po_view->request, __CA_NAV_BUTTON_UNWATCH__)) . "' : '" . addslashes(caNavIcon($po_view->request, __CA_NAV_BUTTON_WATCH__)) . "');\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Error toggling watch status for item: ' + data['errors']);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t</script>\n";
                }
                $vs_buf .= "{$vs_watch}\n";
                TooltipManager::add("#caWatchItemButton", _t('Watch/Unwatch this record'));
                if ($po_view->request->user->canDoAction("can_change_type_{$vs_table_name}")) {
                    $vs_buf .= "<div id='inspectorChangeType'><div id='inspectorChangeTypeButton'><a href='#' onclick='caTypeChangePanel.showPanel(); return false;'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_CHANGE__ . " Change Type", array('title' => _t('Change type'))) . "</a></div></div>\n";
                    $vo_change_type_view = new View($po_view->request, $po_view->request->getViewsDirectoryPath() . "/bundles/");
                    $vo_change_type_view->setVar('t_item', $t_item);
                    FooterManager::add($vo_change_type_view->render("change_type_html.php"));
                    TooltipManager::add("#inspectorChangeType", _t('Change Record Type'));
                }
                if ($t_item->getPrimaryKey() && $po_view->request->config->get($vs_table_name . '_show_add_child_control_in_inspector')) {
                    $vb_show_add_child_control = true;
                    if (is_array($va_restrict_add_child_control_to_types = $po_view->request->config->getList($vs_table_name . '_restrict_child_control_in_inspector_to_types')) && sizeof($va_restrict_add_child_control_to_types)) {
                        $t_type_instance = $t_item->getTypeInstance();
                        if (!in_array($t_type_instance->get('idno'), $va_restrict_add_child_control_to_types) && !in_array($t_type_instance->getPrimaryKey(), $va_restrict_add_child_control_to_types)) {
                            $vb_show_add_child_control = false;
                        }
                    }
                    if ($vb_show_add_child_control) {
                        if ((bool) $po_view->request->config->get($vs_table_name . '_enforce_strict_type_hierarchy')) {
                            // strict menu
                            $vs_type_list = $t_item->getTypeListAsHTMLFormElement('type_id', array('style' => 'width: 90px; font-size: 9px;'), array('childrenOfCurrentTypeOnly' => true, 'directChildrenOnly' => $po_view->request->config->get($vs_table_name . '_enforce_strict_type_hierarchy') == '~' ? false : true, 'returnHierarchyLevels' => true, 'access' => __CA_BUNDLE_ACCESS_EDIT__));
                        } else {
                            // all types
                            $vs_type_list = $t_item->getTypeListAsHTMLFormElement('type_id', array('style' => 'width: 90px; font-size: 9px;'), array('access' => __CA_BUNDLE_ACCESS_EDIT__));
                        }
                        if ($vs_type_list) {
                            $vs_buf .= "<div id='inspectorCreateChild'><div id='inspectorCreateChildButton'><a href='#' onclick='caCreateChildPanel.showPanel(); return false;'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_CHILD__, array('title' => _t('Create Child Record'))) . "</a></div></div>\n";
                            $vo_create_child_view = new View($po_view->request, $po_view->request->getViewsDirectoryPath() . "/bundles/");
                            $vo_create_child_view->setVar('t_item', $t_item);
                            $vo_create_child_view->setVar('type_list', $vs_type_list);
                            FooterManager::add($vo_create_child_view->render("create_child_html.php"));
                            TooltipManager::add("#inspectorCreateChildButton", _t('Create a child record under this one'));
                        }
                    }
                }
            }
            if ($po_view->request->user->canDoAction('can_duplicate_' . $vs_table_name) && $t_item->getPrimaryKey()) {
                $vs_buf .= '<div id="caDuplicateItemButton">';
                $vs_buf .= caFormTag($po_view->request, 'Edit', 'DuplicateItemForm', $po_view->request->getModulePath() . '/' . $po_view->request->getController(), 'post', 'multipart/form-data', '_top', array('disableUnsavedChangesWarning' => true, 'noTimestamp' => true));
                $vs_buf .= caFormSubmitLink($po_view->request, caNavIcon($po_view->request, __CA_NAV_BUTTON_DUPLICATE__), '', 'DuplicateItemForm');
                $vs_buf .= caHTMLHiddenInput($t_item->primaryKey(), array('value' => $t_item->getPrimaryKey()));
                $vs_buf .= caHTMLHiddenInput('mode', array('value' => 'dupe'));
                $vs_buf .= "</form>";
                $vs_buf .= "</div>";
                TooltipManager::add("#caDuplicateItemButton", _t('Duplicate this %1', mb_strtolower($vs_type_name, 'UTF-8')));
            }
            //
            // Download media in lot ($vn_num_objects is only set for object lots)
            if ($vn_num_objects > 0) {
                $vs_buf .= "<div id='inspectorLotMediaDownloadButton'>" . caNavLink($po_view->request, caNavIcon($po_view->request, __CA_NAV_BUTTON_DOWNLOAD__), "button", $po_view->request->getModulePath(), $po_view->request->getController(), 'getLotMedia', array('lot_id' => $t_item->getPrimaryKey(), 'download' => 1), array()) . "</div>\n";
                TooltipManager::add('#inspectorLotMediaDownloadButton', _t("Download all media associated with objects in this lot"));
            }
            //
            // Download media in set
            if ($vs_table_name == 'ca_sets' && sizeof($t_item->getItemRowIDs()) > 0) {
                $vs_buf .= "<div id='inspectorSetMediaDownloadButton'>" . caNavLink($po_view->request, caNavIcon($po_view->request, __CA_NAV_BUTTON_DOWNLOAD__), "button", $po_view->request->getModulePath(), $po_view->request->getController(), 'getSetMedia', array('set_id' => $t_item->getPrimaryKey(), 'download' => 1), array()) . "</div>\n";
                TooltipManager::add('#inspectorSetMediaDownloadButton', _t("Download all media associated with records in this set"));
            }
            $vs_more_info = '';
            // list of sets in which item is a member
            $t_set = new ca_sets();
            if (is_array($va_sets = caExtractValuesByUserLocale($t_set->getSetsForItem($t_item->tableNum(), $t_item->getPrimaryKey(), array('user_id' => $po_view->request->getUserID(), 'access' => __CA_SET_READ_ACCESS__)))) && sizeof($va_sets)) {
                $va_links = array();
                foreach ($va_sets as $vn_set_id => $va_set) {
                    $va_links[] = "<a href='" . caEditorUrl($po_view->request, 'ca_sets', $vn_set_id) . "'>" . $va_set['name'] . "</a>";
                }
                $vs_more_info .= "<div><strong>" . (sizeof($va_links) == 1 ? _t("In set") : _t("In sets")) . "</strong> " . join(", ", $va_links) . "</div>\n";
            }
            // export options
            if ($vn_item_id && ($vs_select = $po_view->getVar('available_mappings_as_html_select'))) {
                $vs_more_info .= "<div class='inspectorExportControls'>" . caFormTag($po_view->request, 'exportItem', 'caExportForm', null, 'post', 'multipart/form-data', '_top', array('disableUnsavedChangesWarning' => true));
                $vs_more_info .= $vs_select;
                $vs_more_info .= caHTMLHiddenInput($t_item->primaryKey(), array('value' => $t_item->getPrimaryKey()));
                $vs_more_info .= caHTMLHiddenInput('download', array('value' => 1));
                $vs_more_info .= caFormSubmitLink($po_view->request, 'Export &rsaquo;', 'button', 'caExportForm');
                $vs_more_info .= "</form></div>";
            }
            $va_creation = $t_item->getCreationTimestamp();
            $va_last_change = $t_item->getLastChangeTimestamp();
            if ($va_creation['timestamp'] || $va_last_change['timestamp']) {
                $vs_more_info .= "<div class='inspectorChangeDateList'>";
                if ($va_creation['timestamp']) {
                    if (!trim($vs_name = $va_creation['fname'] . ' ' . $va_creation['lname'])) {
                        $vs_name = null;
                    }
                    $vs_interval = ($vn_t = time() - $va_creation['timestamp']) == 0 ? _t('Just now') : _t('%1 ago', caFormatInterval($vn_t, 2));
                    $vs_more_info .= "<div class='inspectorChangeDateListLine'  id='caInspectorCreationDate'>" . ($vs_name ? _t('<strong>Created</strong><br/>%1 by %2', $vs_interval, $vs_name) : _t('<strong>Created</strong><br/>%1', $vs_interval)) . "</div>";
                    TooltipManager::add("#caInspectorCreationDate", "<h2>" . _t('Created on') . "</h2>" . _t('Created on %1', caGetLocalizedDate($va_creation['timestamp'], array('dateFormat' => 'delimited'))));
                }
                if ($va_last_change['timestamp'] && $va_creation['timestamp'] != $va_last_change['timestamp']) {
                    if (!trim($vs_name = $va_last_change['fname'] . ' ' . $va_last_change['lname'])) {
                        $vs_name = null;
                    }
                    $vs_interval = ($vn_t = time() - $va_last_change['timestamp']) == 0 ? _t('Just now') : _t('%1 ago', caFormatInterval($vn_t, 2));
                    $vs_more_info .= "<div class='inspectorChangeDateListLine' id='caInspectorChangeDate'>" . ($vs_name ? _t('<strong>Last changed</strong><br/>%1 by %2', $vs_interval, $vs_name) : _t('<strong>Last changed</strong><br/>%1', $vs_interval)) . "</div>";
                    TooltipManager::add("#caInspectorChangeDate", "<h2>" . _t('Last changed on') . "</h2>" . _t('Last changed on %1', caGetLocalizedDate($va_last_change['timestamp'], array('dateFormat' => 'delimited'))));
                }
                if (method_exists($t_item, 'getMetadataDictionaryRuleViolations') && is_array($va_violations = $t_item->getMetadataDictionaryRuleViolations()) && ($vn_num_violations = sizeof($va_violations)) > 0) {
                    $va_violation_messages = array();
                    foreach ($va_violations as $vn_violation_id => $va_violation) {
                        $vs_label = $t_item->getDisplayLabel($va_violation['bundle_name']);
                        $va_violation_messages[] = "<li><em><u>{$vs_label}</u></em> " . $va_violation['violationMessage'] . "</li>";
                    }
                    $vs_more_info .= "<div id='caInspectorViolationsList'>" . ($vs_num_violations_display = "<img src='" . $po_view->request->getThemeUrlPath() . "/graphics/icons/warning_small.gif' border='0'/> " . ($vn_num_violations > 1 ? _t('%1 problems require attention', $vn_num_violations) : _t('%1 problem requires attention', $vn_num_violations))) . "</div>\n";
                    TooltipManager::add("#caInspectorViolationsList", "<h2>{$vs_num_violations_display}</h2><ol>" . join("\n", $va_violation_messages)) . "</ol>\n";
                }
                $vs_more_info .= "</div>\n";
            }
            if ($vs_get_spec = $po_view->request->config->get("{$vs_table_name}_inspector_display_more_info")) {
                $vs_more_info .= caProcessTemplateForIDs($vs_get_spec, $vs_table_name, array($t_item->getPrimaryKey()));
            }
            if ($vs_more_info) {
                $vs_buf .= "<div class='button info'><a href='#' id='inspectorMoreInfo'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_INFO2__) . "</a></div>\n\t\t\t<div id='inspectorInfo' >";
                $vs_buf .= $vs_more_info . "</div>\n";
                TooltipManager::add("#inspectorMoreInfo", _t('See more information about this record'));
            }
            $vs_buf .= "</div><!--End tooIcons-->";
        }
        // -------------------------------------------------------------------------------------
        //
        // Item-specific information
        //
        //
        // Output info for related items
        //
        if (!$t_item->getPrimaryKey()) {
            // only applies to new records
            $vs_rel_table = $po_view->request->getParameter('rel_table', pString);
            $vn_rel_type_id = $po_view->request->getParameter('rel_type_id', pString);
            $vn_rel_id = $po_view->request->getParameter('rel_id', pInteger);
            if ($vs_rel_table && $po_view->request->datamodel->tableExists($vs_rel_table) && $vn_rel_type_id && $vn_rel_id) {
                $t_rel = $po_view->request->datamodel->getTableInstance($vs_rel_table);
                if ($t_rel && $t_rel->load($vn_rel_id)) {
                    $vs_buf .= '<strong>' . _t("Will be related to %1", $t_rel->getTypeName()) . '</strong>: ' . $t_rel->getLabelForDisplay();
                }
            }
        }
        //
        // Output lot info for ca_objects
        //
        $vb_is_currently_part_of_lot = true;
        if (!($vn_lot_id = $t_item->get('lot_id'))) {
            $vn_lot_id = $po_view->request->getParameter('lot_id', pInteger);
            $vb_is_currently_part_of_lot = false;
        }
        if ($vs_table_name === 'ca_objects' && $vn_lot_id) {
            require_once __CA_MODELS_DIR__ . '/ca_object_lots.php';
            $va_lot_lots = caGetTypeListForUser('ca_object_lots', array('access' => __CA_BUNDLE_ACCESS_READONLY__));
            $t_lot = new ca_object_lots($vn_lot_id);
            if ($t_lot->get('deleted') == 0 && in_array($t_lot->get('type_id'), $va_lot_lots)) {
                if (!($vs_lot_displayname = $t_lot->get('idno_stub'))) {
                    if (!($vs_lot_displayname = $t_lot->getLabelForDisplay())) {
                        $vs_lot_displayname = "Lot {$vn_lot_id}";
                    }
                }
                if ($vs_lot_displayname) {
                    if (!($vs_part_of_lot_msg = $po_view->request->config->get("ca_objects_inspector_part_of_lot_msg"))) {
                        $vs_part_of_lot_msg = _t('Part of lot');
                    }
                    if (!($vs_will_be_part_of_lot_msg = $po_view->request->config->get("ca_objects_inspector_will_be_part_of_lot_msg"))) {
                        $vs_will_be_part_of_lot_msg = _t('Will be part of lot');
                    }
                    $vs_buf .= "<strong>" . ($vb_is_currently_part_of_lot ? $vs_part_of_lot_msg : $vs_will_be_part_of_lot_msg) . "</strong>: " . caNavLink($po_view->request, $vs_lot_displayname, '', 'editor/object_lots', 'ObjectLotEditor', 'Edit', array('lot_id' => $vn_lot_id));
                }
            }
        }
        $va_object_container_types = $po_view->request->config->getList('ca_objects_container_types');
        $va_object_component_types = $po_view->request->config->getList('ca_objects_component_types');
        $vb_can_add_component = $vs_table_name === 'ca_objects' && $t_item->getPrimaryKey() && $po_view->request->user->canDoAction('can_create_ca_objects') && $t_item->canTakeComponents();
        if (method_exists($t_item, 'getComponentCount')) {
            if ($vn_component_count = $t_item->getComponentCount()) {
                if ($t_ui && ($vs_component_list_screen = $t_ui->getScreenWithBundle("ca_objects_components_list", $po_view->request)) && $vs_component_list_screen !== $po_view->request->getActionExtra()) {
                    $vs_component_count_link = caNavLink($po_view->request, $vn_component_count == 1 ? _t('%1 component', $vn_component_count) : _t('%1 components', $vn_component_count), '', '*', '*', $po_view->request->getAction() . '/' . $vs_component_list_screen, array($t_item->primaryKey() => $t_item->getPrimaryKey()));
                } else {
                    $vs_component_count_link = $vn_component_count == 1 ? _t('%1 component', $vn_component_count) : _t('%1 components', $vn_component_count);
                }
                $vs_buf .= "<br/><strong>" . _t('Has') . ":</strong> {$vs_component_count_link}";
            }
        }
        if ($vb_can_add_component) {
            $vs_buf .= ' <a href="#" onclick=\'caObjectComponentPanel.showPanel("' . caNavUrl($po_view->request, '*', 'ObjectComponent', 'Form', array('parent_id' => $t_item->getPrimaryKey())) . '"); return false;\')>' . caNavIcon($po_view->request, __CA_NAV_BUTTON_ADD__) . '</a>';
            $vo_change_type_view = new View($po_view->request, $po_view->request->getViewsDirectoryPath() . "/bundles/");
            $vo_change_type_view->setVar('t_item', $t_item);
            FooterManager::add($vo_change_type_view->render("create_component_html.php"));
        }
        //
        // Output lot info for ca_object_lots
        //
        if ($vs_table_name === 'ca_object_lots' && $t_item->getPrimaryKey()) {
            $va_component_types = $po_view->request->config->getList('ca_objects_component_types');
            if (is_array($va_component_types) && sizeof($va_component_types)) {
                $vs_buf .= "<strong>" . (($vn_num_objects = $t_item->numObjects(null, array('return' => 'objects'))) == 1 ? _t('Lot contains %1 object', $vn_num_objects) : _t('Lot contains %1 objects', $vn_num_objects)) . "</strong>\n";
                $vs_buf .= "<strong>" . (($vn_num_components = $t_item->numObjects(null, array('return' => 'components'))) == 1 ? _t('Lot contains %1 component', $vn_num_components) : _t('Lot contains %1 components', $vn_num_components)) . "</strong>\n";
            } else {
                $vs_buf .= "<strong>" . (($vn_num_objects = $t_item->numObjects()) == 1 ? _t('Lot contains %1 object', $vn_num_objects) : _t('Lot contains %1 objects', $vn_num_objects)) . "</strong>\n";
            }
            if ((bool) $po_view->request->config->get('allow_automated_renumbering_of_objects_in_a_lot') && ($va_nonconforming_objects = $t_item->getObjectsWithNonConformingIdnos())) {
                $vs_buf .= '<br/><br/><em>' . (($vn_c = sizeof($va_nonconforming_objects)) == 1 ? _t('There is %1 object with non-conforming numbering', $vn_c) : _t('There are %1 objects with non-conforming numbering', $vn_c)) . "</em>\n";
                $vs_buf .= "<a href='#' onclick='jQuery(\"#inspectorNonConformingNumberList\").toggle(250); return false;'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_ADD__);
                $vs_buf .= "<div id='inspectorNonConformingNumberList' class='inspectorNonConformingNumberList'><div class='inspectorNonConformingNumberListScroll'><ol>\n";
                foreach ($va_nonconforming_objects as $vn_object_id => $va_object_info) {
                    $vs_buf .= '<li>' . caEditorLink($po_view->request, $va_object_info['idno'], '', 'ca_objects', $vn_object_id) . "</li>\n";
                }
                $vs_buf .= "</ol></div>";
                $vs_buf .= caNavLink($po_view->request, _t('Re-number objects') . ' &rsaquo;', 'button', $po_view->request->getModulePath(), $po_view->request->getController(), 'renumberObjects', array('lot_id' => $t_item->getPrimaryKey()));
                $vs_buf .= "</div>\n";
            }
            require_once __CA_MODELS_DIR__ . '/ca_objects.php';
            $t_object = new ca_objects();
            $vs_buf .= "<div class='inspectorLotObjectTypeControls'><form action='#' id='caAddObjectToLotForm'>";
            if ((bool) $po_view->request->config->get('ca_objects_enforce_strict_type_hierarchy')) {
                // strict menu
                $vs_buf .= _t('Add new %1 to lot', $t_object->getTypeListAsHTMLFormElement('type_id', array('id' => 'caAddObjectToLotForm_type_id'), array('childrenOfCurrentTypeOnly' => true, 'directChildrenOnly' => $po_view->request->config->get('ca_objects_enforce_strict_type_hierarchy') == '~' ? false : true, 'returnHierarchyLevels' => true, 'access' => __CA_BUNDLE_ACCESS_EDIT__)));
            } else {
                // all types
                $vs_buf .= _t('Add new %1 to lot', $t_object->getTypeListAsHTMLFormElement('type_id', array('id' => 'caAddObjectToLotForm_type_id'), array('access' => __CA_BUNDLE_ACCESS_EDIT__)));
            }
            $vs_buf .= " <a href='#' onclick='caAddObjectToLotForm()'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_ADD__) . '</a>';
            $vs_buf .= "</form></div>\n";
            $vs_buf .= "<script type='text/javascript'>\n\tfunction caAddObjectToLotForm() { \n\t\twindow.location='" . caEditorUrl($po_view->request, 'ca_objects', 0, false, array('lot_id' => $t_item->getPrimaryKey(), 'rel' => 1, 'type_id' => '')) . "' + jQuery('#caAddObjectToLotForm_type_id').val();\n\t}\n\tjQuery(document).ready(function() {\n\t\tjQuery('#objectLotsNonConformingNumberList').hide();\n\t});\n</script>\n";
        }
        if ($vs_table_name === 'ca_objects') {
            //
            // Output loan info for ca_objects
            //
            if ($po_view->request->user->canDoAction('can_manage_clients') && ($va_loan_details = $t_item->isOnLoan())) {
                $vs_buf .= "<div>" . caNavLink($po_view->request, _t('On loan to %1', $va_loan_details['billing_fname'] . ' ' . $va_loan_details['billing_lname']), 'inspectorOnLoan', 'client/library', 'OrderEditor', 'Edit', array('order_id' => $va_loan_details['order_id'])) . "</div>";
            }
            //
            // Output checkout info for ca_objects
            //
            if ((bool) $po_view->request->config->get('enable_client_services') && ((bool) $po_view->request->config->get('enable_client_services_sales') || (bool) $po_view->request->config->get('enable_client_services_library')) && $t_item->canBeCheckedOut() && ($va_checkout_status = $t_item->getCheckoutStatus(array('returnAsArray' => true)))) {
                $vs_buf .= "<div class='inspectorCheckedOut'>" . $va_checkout_status['status_display'];
                if ($va_checkout_status['user_name']) {
                    $vs_buf .= _t("; checked out by %1", $va_checkout_status['user_name']);
                }
                $vs_buf .= "</div>";
            }
        }
        //
        // Output related objects for ca_object_representations
        //
        if ($vs_table_name === 'ca_object_representations') {
            foreach (array('ca_objects', 'ca_object_lots', 'ca_entities', 'ca_places', 'ca_occurrences', 'ca_collections', 'ca_storage_locations', 'ca_loans', 'ca_movements') as $vs_rel_table) {
                if (sizeof($va_objects = $t_item->getRelatedItems($vs_rel_table))) {
                    $vs_buf .= "<div><strong>" . _t("Related %1", $o_dm->getTableProperty($vs_rel_table, 'NAME_PLURAL')) . "</strong>: <br/>\n";
                    $vs_screen = '';
                    if ($t_ui = ca_editor_uis::loadDefaultUI($vs_rel_table, $po_view->request, null)) {
                        $vs_screen = $t_ui->getScreenWithBundle('ca_object_representations', $po_view->request);
                    }
                    foreach ($va_objects as $vn_rel_id => $va_rel_info) {
                        if ($vs_label = array_shift($va_rel_info['labels'])) {
                            $vs_buf .= caEditorLink($po_view->request, '&larr; ' . $vs_label . ' (' . $va_rel_info['idno'] . ')', '', $vs_rel_table, $va_rel_info[$o_dm->getTablePrimaryKeyName($vs_rel_table)], array(), array(), array('action' => 'Edit' . ($vs_screen ? "/{$vs_screen}" : ""))) . "<br/>\n";
                        }
                    }
                    $vs_buf .= "</div>\n";
                }
            }
        }
        //
        // Output related object reprsentation for ca_representation_annotation
        //
        if ($vs_table_name === 'ca_representation_annotations') {
            if ($vn_representation_id = $t_item->get('representation_id')) {
                $vs_buf .= "<div><strong>" . _t("Applied to representation") . "</strong>: <br/>\n";
                $t_rep = new ca_object_representations($vn_representation_id);
                $vs_buf .= caNavLink($po_view->request, '&larr; ' . $t_rep->getLabelForDisplay(), '', 'editor/object_representations', 'ObjectRepresentationEditor', 'Edit/' . $po_view->getVar('representation_editor_screen'), array('representation_id' => $vn_representation_id)) . '<br/>';
                $vs_buf .= "</div>\n";
            }
        }
        //
        // Output extra useful info for sets
        //
        if ($vs_table_name === 'ca_sets') {
            $vn_set_item_count = $t_item->getItemCount(array('user_id' => $po_view->request->getUserID()));
            if ($vn_set_item_count > 0 && $po_view->request->user->canDoAction('can_batch_edit_' . $o_dm->getTableName($t_item->get('table_num')))) {
                $vs_buf .= caNavButton($po_view->request, __CA_NAV_BUTTON_BATCH_EDIT__, _t('Batch edit'), 'editorBatchSetEditorLink', 'batch', 'Editor', 'Edit', array('set_id' => $t_item->getPrimaryKey()), array(), array('icon_position' => __CA_NAV_BUTTON_ICON_POS_LEFT__, 'no_background' => true, 'dont_show_content' => true));
            }
            $vs_buf .= "<div><strong>" . _t("Number of items") . "</strong>: {$vn_set_item_count}<br/>\n";
            if ($t_item->getPrimaryKey()) {
                $vn_set_table_num = $t_item->get('table_num');
                $vs_set_table_name = $o_dm->getTableName($vn_set_table_num);
                $vs_buf .= "<strong>" . _t("Type of content") . "</strong>: " . caGetTableDisplayName($vn_set_table_num) . "<br/>\n";
                $vs_buf .= "</div>\n";
            } else {
                if ($vn_set_table_num = $po_view->request->getParameter('table_num', pInteger)) {
                    $vs_buf .= "<div><strong>" . _t("Type of content") . "</strong>: " . caGetTableDisplayName($vn_set_table_num) . "<br/>\n";
                    $vs_buf .= "</div>\n";
                }
            }
            $t_user = new ca_users(($vn_user_id = $t_item->get('user_id')) ? $vn_user_id : $po_view->request->getUserID());
            if ($t_user->getPrimaryKey()) {
                $vs_buf .= "<div><strong>" . _t('Owner') . "</strong>: " . $t_user->get('fname') . ' ' . $t_user->get('lname') . "</div>\n";
            }
            if ($po_view->request->user->canDoAction('can_export_' . $vs_set_table_name) && $t_item->getPrimaryKey() && sizeof(ca_data_exporters::getExporters($vn_set_table_num)) > 0) {
                $vs_buf .= '<div style="border-top: 1px solid #aaaaaa; margin-top: 5px; font-size: 10px; text-align: right;" id="caExportItemButton">';
                $vs_buf .= _t('Export this set of records') . "&nbsp; ";
                $vs_buf .= "<a class='button' onclick='jQuery(\"#exporterFormList\").show();' style='text-align:right;' href='#'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_ADD__) . "</a>";
                $vs_buf .= caFormTag($po_view->request, 'ExportData', 'caExportForm', 'manage/MetadataExport', 'post', 'multipart/form-data', '_top', array('disableUnsavedChangesWarning' => true));
                $vs_buf .= "<div id='exporterFormList'>";
                $vs_buf .= ca_data_exporters::getExporterListAsHTMLFormElement('exporter_id', $vn_set_table_num, array('id' => 'caExporterList'), array('width' => '135px'));
                $vs_buf .= caHTMLHiddenInput('set_id', array('value' => $t_item->getPrimaryKey()));
                $vs_buf .= caFormSubmitLink($po_view->request, _t('Export') . " &rsaquo;", "button", "caExportForm");
                $vs_buf .= "</div>\n";
                $vs_buf .= "</form>";
                $vs_buf .= "</div>";
                $vs_buf .= "<script type='text/javascript'>";
                $vs_buf .= "jQuery(document).ready(function() {";
                $vs_buf .= "jQuery(\"#exporterFormList\").hide();";
                $vs_buf .= "});";
                $vs_buf .= "</script>";
            }
        }
        //
        // Output extra useful info for set items
        //
        if ($vs_table_name === 'ca_set_items') {
            AssetLoadManager::register("panel");
            $t_set = new ca_sets();
            if ($t_set->load($vn_set_id = $t_item->get('set_id'))) {
                $vs_buf .= "<div><strong>" . _t("Part of set") . "</strong>: " . caEditorLink($po_view->request, $t_set->getLabelForDisplay(), '', 'ca_sets', $vn_set_id) . "<br/>\n";
                $t_content_instance = $t_item->getAppDatamodel()->getInstanceByTableNum($vn_item_table_num = $t_item->get('table_num'));
                if ($t_content_instance->load($vn_row_id = $t_item->get('row_id'))) {
                    $vs_label = $t_content_instance->getLabelForDisplay();
                    if ($vs_id_fld = $t_content_instance->getProperty('ID_NUMBERING_ID_FIELD')) {
                        $vs_label .= " (" . $t_content_instance->get($vs_id_fld) . ")";
                    }
                    $vs_buf .= "<strong>" . _t("Is %1", caGetTableDisplayName($vn_item_table_num, false) . "</strong>: " . caEditorLink($po_view->request, $vs_label, '', $vn_item_table_num, $vn_row_id)) . "<br/>\n";
                }
                $vs_buf .= "</div>\n";
            }
        }
        //
        // Output extra useful info for lists
        //
        if ($vs_table_name === 'ca_lists' && $t_item->getPrimaryKey()) {
            $vs_buf .= "<strong>" . _t("Number of items") . "</strong>: " . $t_item->numItemsInList() . "<br/>\n";
            $t_list_item = new ca_list_items();
            $t_list_item->load(array('list_id' => $t_item->getPrimaryKey(), 'parent_id' => null));
            $vs_type_list = $t_list_item->getTypeListAsHTMLFormElement('type_id', array('style' => 'width: 90px; font-size: 9px;'), array('access' => __CA_BUNDLE_ACCESS_EDIT__));
            if ($vs_type_list) {
                $vs_buf .= '<div style="border-top: 1px solid #aaaaaa; margin-top: 5px; font-size: 10px;">';
                $vs_buf .= caFormTag($po_view->request, 'Edit', 'NewChildForm', 'administrate/setup/list_item_editor/ListItemEditor', 'post', 'multipart/form-data', '_top', array('disableUnsavedChangesWarning' => true));
                $vs_buf .= _t('Add a %1 to this list', $vs_type_list) . caHTMLHiddenInput($t_list_item->primaryKey(), array('value' => '0')) . caHTMLHiddenInput('parent_id', array('value' => $t_list_item->getPrimaryKey()));
                $vs_buf .= caFormSubmitLink($po_view->request, caNavIcon($po_view->request, __CA_NAV_BUTTON_ADD__), '', 'NewChildForm');
                $vs_buf .= "</form></div>\n";
            }
        }
        //
        // Output containing list for list items
        //
        if ($vs_table_name === 'ca_list_items') {
            if ($t_list = $po_view->getVar('t_list')) {
                $vn_list_id = $t_list->getPrimaryKey();
                $vs_buf .= "<strong>" . _t("Part of") . "</strong>: " . caEditorLink($po_view->request, $t_list->getLabelForDisplay(), '', 'ca_lists', $vn_list_id) . "<br/>\n";
                if ($t_item->get('is_default')) {
                    $vs_buf .= "<strong>" . _t("Is default for list") . "</strong><br/>\n";
                }
            }
        }
        //
        // Output containing relationship type name for relationship types
        //
        if ($vs_table_name === 'ca_relationship_types') {
            if (!($t_rel_instance = $t_item->getAppDatamodel()->getInstanceByTableNum($t_item->get('table_num'), true))) {
                if ($vn_parent_id = $po_view->request->getParameter('parent_id', pInteger)) {
                    $t_rel_type = new ca_relationship_types($vn_parent_id);
                    $t_rel_instance = $t_item->getAppDatamodel()->getInstanceByTableNum($t_rel_type->get('table_num'), true);
                }
            }
            if ($t_rel_instance) {
                $vs_buf .= "<div><strong>" . _t("Is a") . "</strong>: " . $t_rel_instance->getProperty('NAME_SINGULAR') . "<br/></div>\n";
            }
        }
        //
        // Output extra useful info for metadata elements
        //
        if ($vs_table_name === 'ca_metadata_elements' && $t_item->getPrimaryKey()) {
            $vs_buf .= "<div><strong>" . _t("Element code") . "</strong>: " . $t_item->get('element_code') . "<br/></div>\n";
            if (sizeof($va_uis = $t_item->getUIs()) > 0) {
                $vs_buf .= "<div><strong>" . _t("Referenced by user interfaces") . "</strong>:<br/>\n";
                foreach ($va_uis as $vn_ui_id => $va_ui_info) {
                    $vs_buf .= caNavLink($po_view->request, $va_ui_info['name'], '', 'administrate/setup/interface_screen_editor', 'InterfaceScreenEditor', 'Edit', array('ui_id' => $vn_ui_id, 'screen_id' => $va_ui_info['screen_id']));
                    $vs_buf .= " (" . $o_dm->getTableProperty($va_ui_info['editor_type'], 'NAME_PLURAL') . ")<br/>\n";
                }
                $vs_buf .= "</div>\n";
            }
        }
        //
        // Output related objects for ca_editor_uis and ca_editor_ui_screens
        //
        if ($vs_table_name === 'ca_editor_uis') {
            $vs_buf .= "<div><strong>" . _t("Number of screens") . "</strong>: " . (int) $t_item->getScreenCount() . "\n";
            if ($t_item->getPrimaryKey()) {
                $vs_buf .= "<div><strong>" . _t("Edits") . "</strong>: " . caGetTableDisplayName($t_item->get('editor_type')) . "<br/>\n";
            } else {
                $vs_buf .= "<div><strong>" . _t("Edits") . "</strong>: " . caGetTableDisplayName($po_view->request->getParameter('editor_type', pInteger)) . "<br/>\n";
            }
            $vs_buf .= "</div>\n";
        }
        //
        // Output related objects for ca_editor_uis and ca_editor_ui_screens
        //
        if ($vs_table_name === 'ca_editor_ui_screens') {
            $t_ui = new ca_editor_uis($vn_ui_id = $t_item->get('ui_id'));
            $vs_buf .= "<div><strong>" . _t("Part of") . "</strong>: " . caNavLink($po_view->request, $t_ui->getLabelForDisplay(), '', 'administrate/setup/interface_editor', 'InterfaceEditor', 'Edit', array('ui_id' => $vn_ui_id)) . "\n";
            $vs_buf .= "</div>\n";
        }
        //
        // Output extra useful info for bundle displays
        //
        if ($vs_table_name === 'ca_bundle_displays') {
            $vs_buf .= "<div><strong>" . _t("Number of placements") . "</strong>: " . $t_item->getPlacementCount(array('user_id' => $po_view->request->getUserID())) . "<br/>\n";
            if ($t_item->getPrimaryKey()) {
                $vn_content_table_num = $t_item->get('table_num');
                $vs_buf .= "<strong>" . _t("Type of content") . "</strong>: " . caGetTableDisplayName($vn_content_table_num) . "\n";
                $vs_buf .= "</div>\n";
            } else {
                if ($vn_content_table_num = $po_view->request->getParameter('table_num', pInteger)) {
                    $vs_buf .= "<div><strong>" . _t("Type of content") . "</strong>: " . caGetTableDisplayName($vn_content_table_num) . "\n";
                    $vs_buf .= "</div>\n";
                }
            }
            $t_user = new ca_users(($vn_user_id = $t_item->get('user_id')) ? $vn_user_id : $po_view->request->getUserID());
            if ($t_user->getPrimaryKey()) {
                $vs_buf .= "<div><strong>" . _t('Owner') . "</strong>: " . $t_user->get('fname') . ' ' . $t_user->get('lname') . "</div>\n";
            }
        }
        //
        // Output extra useful info for search forms
        //
        if ($vs_table_name === 'ca_search_forms') {
            $vs_buf .= "<div><strong>" . _t("Number of placements") . "</strong>: " . $t_item->getPlacementCount(array('user_id' => $po_view->request->getUserID())) . "<br/>\n";
            if ($t_item->getPrimaryKey()) {
                $vn_content_table_num = $t_item->get('table_num');
                $vs_buf .= "<strong>" . _t("Searches for") . "</strong>: " . caGetTableDisplayName($vn_content_table_num) . "\n";
                $vs_buf .= "</div>\n";
            } else {
                if ($vn_content_table_num = $po_view->request->getParameter('table_num', pInteger)) {
                    $vs_buf .= "<strong>" . _t("Searches for") . "</strong>: " . caGetTableDisplayName($vn_content_table_num) . "\n";
                    $vs_buf .= "</div>\n";
                }
            }
            $t_user = new ca_users(($vn_user_id = $t_item->get('user_id')) ? $vn_user_id : $po_view->request->getUserID());
            if ($t_user->getPrimaryKey()) {
                $vs_buf .= "<div><strong>" . _t('Owner') . "</strong>: " . $t_user->get('fname') . ' ' . $t_user->get('lname') . "</div>\n";
            }
        }
        //
        // Output extra useful info for tours
        //
        if ($vs_table_name === 'ca_tours' && $t_item->getPrimaryKey()) {
            $vs_buf .= "<br/><strong>" . _t("Number of stops") . "</strong>: " . $t_item->getStopCount() . "<br/>\n";
        }
        //
        // Output containing tour for tour stops
        //
        if ($vs_table_name === 'ca_tour_stops') {
            $t_tour = new ca_tours($vn_tour_id = $t_item->get('tour_id'));
            $vs_buf .= "<strong>" . _t("Part of") . "</strong>: " . caEditorLink($po_view->request, $t_tour->getLabelForDisplay(), '', 'ca_tours', $vn_tour_id) . "<br/>\n";
        }
        //
        // Output extra useful info for bundle mappings
        //
        if ($vs_table_name === 'ca_bundle_mappings') {
            if ($t_item->getPrimaryKey()) {
                $vn_content_table_num = $t_item->get('table_num');
                $vs_buf .= "<br/><strong>" . _t("Type of content") . "</strong>: " . caGetTableDisplayName($vn_content_table_num) . "<br/>\n";
                $vs_buf .= "<strong>" . _t("Type") . "</strong>: " . $t_item->getChoiceListValue('direction', $t_item->get('direction')) . "<br/>\n";
                $vs_buf .= "<strong>" . _t("Target format") . "</strong>: " . $t_item->get('target') . "<br/>\n";
                $va_stats = $t_item->getMappingStatistics();
                $vs_buf .= "<div><strong>" . _t("Number of groups") . "</strong>: " . $va_stats['groupCount'] . "<br/>\n";
                $vs_buf .= "<strong>" . _t("Number of rules") . "</strong>: " . $va_stats['ruleCount'] . "<br/>\n";
                $vs_buf .= "</div>\n";
            } else {
                if ($vn_content_table_num = $po_view->request->getParameter('table_num', pInteger)) {
                    $vs_buf .= "<div><strong>" . _t("Type of content") . "</strong>: " . caGetTableDisplayName($vn_content_table_num) . "<br/>\n";
                    $vs_buf .= "<strong>" . _t("Type") . "</strong>: " . $t_item->getChoiceListValue('direction', $po_view->request->getParameter('direction', pString)) . "<br/>\n";
                    $vs_buf .= "<strong>" . _t("Target format") . "</strong>: " . $po_view->request->getParameter('target', pString) . "<br/>\n";
                    $vs_buf .= "<div><strong>" . _t("Number of groups") . "</strong>: 0<br/>\n";
                    $vs_buf .= "<strong>" . _t("Number of rules") . "</strong>: 0</div>\n";
                    $vs_buf .= "</div>\n";
                }
            }
        }
        //
        // Output extra useful info for client services/commerce orders
        //
        if ($vs_table_name === 'ca_commerce_orders') {
            $o_client_services_config = Configuration::load($po_view->request->config->get('client_services_config'));
            $va_order_totals = $t_item->getOrderTotals();
            if ($va_order_totals['fee'] + $va_order_totals['tax'] + $va_order_totals['shipping'] + $va_order_totals['handling'] + $va_order_totals['additional_order_fees'] + $va_order_totals['additional_item_fees'] != 0) {
                $vs_currency_symbol = $o_client_services_config->get('currency_symbol');
                $vs_buf .= "<table style='margin-left: 10px;'>";
                $vs_buf .= "<tr><td><strong>" . _t("Items") . '</strong></td><td>' . $vs_currency_symbol . sprintf("%4.2f", $va_order_totals['fee']) . " (" . (int) $va_order_totals['items'] . ")</td></tr>\n";
                $vs_buf .= "<tr><td><strong>" . _t("S+H") . '</strong></td><td>' . $vs_currency_symbol . sprintf("%4.2f", $va_order_totals['shipping'] + $va_order_totals['handling']) . "</td></tr>\n";
                $vs_buf .= "<tr><td><strong>" . _t("Tax") . '</strong></td><td>' . $vs_currency_symbol . sprintf("%4.2f", $va_order_totals['tax']) . "</td></tr>\n";
                $vs_buf .= "<tr><td><strong>" . _t("Addtl fees") . '</strong></td><td>' . $vs_currency_symbol . sprintf("%4.2f", $va_order_totals['additional_order_fees'] + $va_order_totals['additional_item_fees']) . "</td></tr>\n";
                $vs_buf .= "<tr><td><strong>" . _t("Total") . '</strong></td><td>' . $vs_currency_symbol . sprintf("%4.2f", $va_order_totals['fee'] + $va_order_totals['tax'] + $va_order_totals['shipping'] + $va_order_totals['handling'] + $va_order_totals['additional_order_fees'] + $va_order_totals['additional_item_fees']) . "</td></tr>\n";
                $vs_buf .= "</table>";
                $vs_buf .= "<strong>" . $t_item->getFieldInfo('payment_status', 'LABEL') . "</strong>: " . $t_item->getChoiceListValue('payment_status', $t_item->get('payment_status')) . "<br/>\n";
            }
            $vs_buf .= "<br/><strong>" . $t_item->getFieldInfo('order_status', 'LABEL') . "</strong>: " . $t_item->getChoiceListValue('order_status', $t_item->get('order_status')) . "<br/>\n";
            if ($vs_shipping_date = $t_item->get('shipping_date', array('dateFormat' => 'delimited', 'timeOmit' => true))) {
                $vs_buf .= "<strong>" . $t_item->getFieldInfo('shipping_date', 'LABEL') . "</strong>: " . $vs_shipping_date;
                if ($vs_shipped_on_date = $t_item->get('shipped_on_date', array('dateFormat' => 'delimited'))) {
                    $vs_buf .= " (" . _t('shipped %1', $vs_shipped_on_date) . ")";
                } else {
                    $vs_buf .= " (" . _t('not shipped') . ")";
                }
                $vs_buf .= "<br/>\n";
            }
            if (($vn_shipping_method = $t_item->get('shipping_method')) && $t_item->getChoiceListValue('shipping_method', $vn_shipping_method) != 'None') {
                $vs_buf .= "<strong>" . $t_item->getFieldInfo('shipping_method', 'LABEL') . "</strong>: " . $t_item->getChoiceListValue('shipping_method', $vn_shipping_method) . "<br/>\n";
            }
        }
        //
        // Output configurable additional info from config, if set
        //
        if ($vs_additional_info = $po_view->request->config->get("{$vs_table_name}_inspector_additional_info")) {
            if (is_array($vs_additional_info)) {
                $vs_buf .= "<br/>";
                foreach ($vs_additional_info as $vs_info) {
                    $vs_buf .= caProcessTemplateForIDs($vs_info, $vs_table_name, array($t_item->getPrimaryKey()), array('requireLinkTags' => true)) . "<br/>\n";
                }
            } else {
                $vs_buf .= "<br/>" . caProcessTemplateForIDs($vs_additional_info, $vs_table_name, array($t_item->getPrimaryKey()), array('requireLinkTags' => true)) . "<br/>\n";
            }
        }
        // -------------------------------------------------------------------------------------
        // Export
        if ($t_item->getPrimaryKey() && $po_view->request->config->get($vs_table_name . '_show_add_child_control_in_inspector')) {
            $vb_show_add_child_control = true;
            if (is_array($va_restrict_add_child_control_to_types = $po_view->request->config->getList($vs_table_name . '_restrict_child_control_in_inspector_to_types')) && sizeof($va_restrict_add_child_control_to_types)) {
                $t_type_instance = $t_item->getTypeInstance();
                if (!in_array($t_type_instance->get('idno'), $va_restrict_add_child_control_to_types) && !in_array($t_type_instance->getPrimaryKey(), $va_restrict_add_child_control_to_types)) {
                    $vb_show_add_child_control = false;
                }
            }
        }
        if ($po_view->request->user->canDoAction('can_export_' . $vs_table_name) && $t_item->getPrimaryKey() && sizeof(ca_data_exporters::getExporters($t_item->tableNum())) > 0) {
            $vs_buf .= '<div style="border-top: 1px solid #aaaaaa; margin-top: 5px; font-size: 10px; text-align: right;" id="caExportItemButton">';
            $vs_buf .= _t('Export this %1', mb_strtolower($vs_type_name, 'UTF-8')) . " ";
            $vs_buf .= "<a class='button' onclick='jQuery(\"#exporterFormList\").show();' style='text-align:right;' href='#'>" . caNavIcon($po_view->request, __CA_NAV_BUTTON_ADD__) . "</a>";
            $vs_buf .= caFormTag($po_view->request, 'ExportSingleData', 'caExportForm', 'manage/MetadataExport', 'post', 'multipart/form-data', '_top', array('disableUnsavedChangesWarning' => true));
            $vs_buf .= "<div id='exporterFormList'>";
            $vs_buf .= ca_data_exporters::getExporterListAsHTMLFormElement('exporter_id', $t_item->tableNum(), array('id' => 'caExporterList'), array('width' => '120px'));
            $vs_buf .= caHTMLHiddenInput('item_id', array('value' => $t_item->getPrimaryKey()));
            $vs_buf .= caFormSubmitLink($po_view->request, _t('Export') . " &rsaquo;", "button", "caExportForm");
            $vs_buf .= "</div>\n";
            $vs_buf .= "</form>";
            $vs_buf .= "</div>";
            $vs_buf .= "<script type='text/javascript'>";
            $vs_buf .= "jQuery(document).ready(function() {";
            $vs_buf .= "jQuery(\"#exporterFormList\").hide();";
            $vs_buf .= "});";
            $vs_buf .= "</script>";
        }
        $vs_buf .= "</div></h4>\n";
        $vs_buf .= "<script type='text/javascript'>\n\t\t\tvar inspectorCookieJar = jQuery.cookieJar('caCookieJar');";
        if ($t_item->getPrimaryKey()) {
            if ($vs_more_info) {
                $vs_buf .= "\t\t\t\n\t\t\tif (inspectorCookieJar.get('inspectorMoreInfoIsOpen') == undefined) {\t\t// default is to have info open\n\t\t\t\tinspectorCookieJar.set('inspectorMoreInfoIsOpen', 1);\n\t\t\t}\n\t\t\tif (inspectorCookieJar.get('inspectorMoreInfoIsOpen') == 1) {\n\t\t\t\tjQuery('#inspectorInfo').toggle(0);\n\t\t\t\tjQuery('#inspectorMoreInfo').html('" . addslashes(caNavIcon($po_view->request, __CA_NAV_BUTTON_COLLAPSE__)) . "');\n\t\t\t}\n\t\t\n\t\t\tjQuery('#inspectorMoreInfo').click(function() {\n\t\t\t\tjQuery('#inspectorInfo').slideToggle(350, function() { \n\t\t\t\t\tinspectorCookieJar.set('inspectorMoreInfoIsOpen', (this.style.display == 'block') ? 1 : 0); \n\t\t\t\t\tjQuery('#inspectorMoreInfo').html((this.style.display == 'block') ? '" . addslashes(caNavIcon($po_view->request, __CA_NAV_BUTTON_COLLAPSE__)) . "' : '" . addslashes(caNavIcon($po_view->request, __CA_NAV_BUTTON_INFO2__)) . "');\n\t\t\t\t\tcaResizeSideNav();\n\t\t\t\t}); \n\t\t\t\treturn false;\n\t\t\t});\n\t\t";
            }
            if (sizeof($va_reps)) {
                $vs_buf .= "\n\t\tif (inspectorCookieJar.get('inspectorShowMediaIsOpen') == undefined) {\t\t// default is to have media open\n\t\t\tinspectorCookieJar.set('inspectorShowMediaIsOpen', 1);\n\t\t}\n\t\t\n\t\tif (inspectorCookieJar.get('inspectorShowMediaIsOpen') == 1) {\n\t\t\tjQuery('#inspectorMedia').toggle();\n\t\t}\n\t\n\t\tjQuery('#caColorbox').on('click', function(e) {\n\t\t\tif (e.altKey) {\n\t\t\t\tjQuery('#inspectorMedia').slideToggle(200, function() { \n\t\t\t\t\tinspectorCookieJar.set('inspectorShowMediaIsOpen', (this.style.display == 'block') ? 1 : 0); \n\t\t\t\t\t\tcaResizeSideNav();\n\t\t\t\t}); \n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\t\t\t\t";
            }
        }
        $vs_buf .= "</script>\n";
    }
    $o_app_plugin_manager = new ApplicationPluginManager();
    $va_hookAppend = $o_app_plugin_manager->hookAppendToEditorInspector(array("t_item" => $t_item));
    if (is_string($va_hookAppend["caEditorInspectorAppend"])) {
        $vs_buf .= $va_hookAppend["caEditorInspectorAppend"];
    }
    return $vs_buf;
}
Esempio n. 8
0
<?php 
if ($this->request->isLoggedIn() && $this->request->user->getPreference('ui_show_breadcrumbs') == 1) {
    if (trim($vs_trail = join('<img src="' . $this->request->getThemeUrlPath() . '/graphics/arrows/breadcrumb.jpg">', $va_breadcrumb = $this->getVar('nav')->getDestinationAsBreadCrumbTrail()))) {
        ?>
<div class='navBreadCrumbContainer'>
	<div class='navBreadCrumbs'>
<?php 
        $count = count($va_breadcrumb);
        $i = 1;
        print '<div class="crumb"><div class="crumbtext navBreadCrumbLabel">' . _t('Current location') . '</div><img src="' . $this->request->getThemeUrlPath() . '/graphics/arrows/breadcrumbloc.png" width="16" height="19" border="0"></div>';
        foreach ($va_breadcrumb as $crumb) {
            if ($i == $count) {
                print '<div class="lastcrumb"><nobr><div class="crumbtext">' . caUcFirstUTF8Safe($crumb) . '</div><img src="' . $this->request->getThemeUrlPath() . '/graphics/arrows/breadcrumb.png" width="16" height="19" border="0"></nobr></div>';
            } else {
                print '<div class="crumb"><nobr><div class="crumbtext">' . caUcFirstUTF8Safe($crumb) . '</div><img src="' . $this->request->getThemeUrlPath() . '/graphics/arrows/breadcrumb.png" width="16" height="19" border="0"></nobr></div>';
                $i++;
            }
        }
        if (substr($this->request->getModulePath(), 0, 7) == 'editor/') {
            print "<div class='expandCollapse'>";
            print "<div style='padding: 5px; text-align: center;'><a href='#' id='expandAll' onclick='caBundleVisibilityManager.open(); return false;' style='margin-right: 5px;'><img src='" . $this->request->getThemeUrlPath() . "/graphics/arrows/collapsedown.png' width='16' height='12' border='0'></a> ";
            print "<a href='#' id='collapseAll' onclick='caBundleVisibilityManager.close(); return false;'><img src='" . $this->request->getThemeUrlPath() . "/graphics/arrows/collapseup.png' width='16' height='12' border='0'></a></div>";
            print "</div><!-- end expandCollapse-->";
            TooltipManager::add('#expandAll', _t("Expand all metadata elements"));
            TooltipManager::add('#collapseAll', _t("Collapse all metadata elements"));
        }
        ?>
	
	</div><!-- end navBreadCrumbs-->
</div><!-- end navBreadCrumbContainer -->
Esempio n. 9
0
/**
 * 
 *
 * @return (string)
 */
function caGetFacetForMenuBar($po_request, $vs_browse_type)
{
    $vs_key = '';
    //$po_request->session->getVar('objects_last_browse_id');
    if (!($va_browse_info = caGetInfoForBrowseType($vs_browse_type))) {
        // invalid browse type – throw error
        return null;
    }
    $o_browse = caGetBrowseInstance($va_browse_info["table"]);
    if ($vs_key) {
        $o_browse->reload($vs_key);
    }
    $o_browse->execute(array('checkAccess' => caGetUserAccessValues($po_request), 'showAllForNoCriteriaBrowse' => true));
    $va_facets = $o_browse->getInfoForAvailableFacets();
    $vs_buf = '';
    $vs_default_facet = null;
    foreach ($va_facets as $vs_facet_name => $va_facet_info) {
        if (!$vs_default_facet) {
            $vs_default_facet = $vs_facet_name;
        }
        $vs_buf .= "<li " . (!$vs_buf ? "class='active'" : "") . "><a href='#' onclick='jQuery(\".browseMenuFacet\").load(\"" . caNavUrl($po_request, '*', 'Browse', $vs_browse_type, array('facet' => $vs_facet_name, 'getFacet' => 1, 'key' => $vs_key, 'isNav' => 1)) . "\", function() { jQuery(this).parent().scrollTop(0); }); jQuery(this).parent().siblings().removeClass(\"active\"); jQuery(this).parent().addClass(\"active\"); return false;'>" . caUcFirstUTF8Safe($va_facet_info['label_plural']) . "</a></li>\n";
    }
    if ($vs_default_facet) {
        $vs_buf .= "<script type='text/javascript'>jQuery(document).ready(function() { jQuery(\".browseMenuFacet\").load(\"" . caNavUrl($po_request, '*', 'Browse', $vs_browse_type, array('facet' => $vs_default_facet, 'getFacet' => 1, 'key' => $vs_key, 'isNav' => 1)) . "\"); });</script>\n";
    }
    return $vs_buf;
}
Esempio n. 10
0
 /**
  * Performs two-step delete of an existing record. The first step is a confirmation dialog, followed by actual deletion upon user confirmation
  *
  * @param array $pa_options Array of options passed through to _initView 
  */
 public function Delete($pa_options = null)
 {
     list($vn_subject_id, $t_subject, $t_ui) = $this->_initView($pa_options);
     if (!$vn_subject_id) {
         return;
     }
     if (!$this->_checkAccess($t_subject)) {
         return false;
     }
     if (!($vs_type_name = $t_subject->getTypeName())) {
         $vs_type_name = $t_subject->getProperty('NAME_SINGULAR');
     }
     //
     // Does user have access to row?
     //
     if ($t_subject->getAppConfig()->get('perform_item_level_access_checking')) {
         if ($t_subject->checkACLAccessForUser($this->request->user) < __CA_ACL_EDIT_DELETE_ACCESS__) {
             $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/2580?r=' . urlencode($this->request->getFullUrlPath()));
             return;
         }
     }
     // get parent_id, if it exists, prior to deleting so we can
     // set the browse_last_id parameter to something sensible
     $vn_parent_id = null;
     if ($vs_parent_fld = $t_subject->getProperty('HIERARCHY_PARENT_ID_FLD')) {
         $vn_parent_id = $t_subject->get($vs_parent_fld);
     }
     if ($vn_subject_id && !$t_subject->getPrimaryKey()) {
         $this->notification->addNotification(_t("%1 does not exist", $vs_type_name), __NOTIFICATION_TYPE_ERROR__);
         return;
     }
     // Don't allow deletion of roots in simple mono-hierarchies... that's bad.
     if (!$vn_parent_id && in_array($t_subject->getProperty('HIERARCHY_TYPE'), array(__CA_HIER_TYPE_SIMPLE_MONO__, __CA_HIER_TYPE_MULTI_MONO__))) {
         $this->notification->addNotification(_t("Cannot delete root of hierarchy"), __NOTIFICATION_TYPE_ERROR__);
         return;
     }
     if ($vb_confirm = $this->request->getParameter('confirm', pInteger) == 1 ? true : false) {
         $vb_we_set_transaction = false;
         if (!$t_subject->inTransaction()) {
             $o_t = new Transaction();
             $t_subject->setTransaction($o_t);
             $vb_we_set_transaction = true;
         }
         // Do we need to move relationships?
         if (($vn_remap_id = $this->request->getParameter('remapToID', pInteger)) && $this->request->getParameter('referenceHandling', pString) == 'remap') {
             switch ($t_subject->tableName()) {
                 case 'ca_relationship_types':
                     if ($vn_c = $t_subject->moveRelationshipsToType($vn_remap_id)) {
                         $t_target = new ca_relationship_types($vn_remap_id);
                         $this->notification->addNotification($vn_c == 1 ? _t("Transferred %1 relationship to type <em>%2</em>", $vn_c, $t_target->getLabelForDisplay()) : _t("Transferred %1 relationships to type <em>%2</em>", $vn_c, $t_target->getLabelForDisplay()), __NOTIFICATION_TYPE_INFO__);
                     }
                     break;
                 default:
                     // update relationships
                     $va_tables = array('ca_objects', 'ca_entities', 'ca_places', 'ca_occurrences', 'ca_collections', 'ca_storage_locations', 'ca_list_items', 'ca_loans', 'ca_movements', 'ca_tours', 'ca_tour_stops', 'ca_object_representations', 'ca_list_items');
                     $vn_c = 0;
                     foreach ($va_tables as $vs_table) {
                         $vn_c += $t_subject->moveRelationships($vs_table, $vn_remap_id);
                     }
                     // update existing metadata attributes to use remapped value
                     $t_subject->moveAuthorityElementReferences($vn_remap_id);
                     if ($vn_c > 0) {
                         $t_target = $this->opo_datamodel->getInstanceByTableName($this->ops_table_name);
                         $t_target->load($vn_remap_id);
                         $this->notification->addNotification($vn_c == 1 ? _t("Transferred %1 relationship to <em>%2</em> (%3)", $vn_c, $t_target->getLabelForDisplay(), $t_target->get($t_target->getProperty('ID_NUMBERING_ID_FIELD'))) : _t("Transferred %1 relationships to <em>%2</em> (%3)", $vn_c, $t_target->getLabelForDisplay(), $t_target->get($t_target->getProperty('ID_NUMBERING_ID_FIELD'))), __NOTIFICATION_TYPE_INFO__);
                     }
                     break;
             }
         } else {
             $t_subject->deleteAuthorityElementReferences();
         }
         $t_subject->setMode(ACCESS_WRITE);
         $vb_rc = false;
         if ($this->_beforeDelete($t_subject)) {
             if ($vb_rc = $t_subject->delete(true)) {
                 $this->_afterDelete($t_subject);
             }
         }
         if ($vb_we_set_transaction) {
             if (!$vb_rc) {
                 $o_t->rollbackTransaction();
             } else {
                 $o_t->commitTransaction();
             }
         }
     }
     $this->view->setVar('confirmed', $vb_confirm);
     if ($t_subject->numErrors()) {
         foreach ($t_subject->errors() as $o_e) {
             $this->notification->addNotification($o_e->getErrorDescription(), __NOTIFICATION_TYPE_ERROR__);
         }
     } else {
         if ($vb_confirm) {
             $this->notification->addNotification(_t("%1 was deleted", caUcFirstUTF8Safe($vs_type_name)), __NOTIFICATION_TYPE_INFO__);
             // update result list since it has changed
             $this->opo_result_context->removeIDFromResults($vn_subject_id);
             $this->opo_result_context->invalidateCache();
             $this->opo_result_context->saveContext();
             // clear subject_id - it's no longer valid
             $t_subject->clear();
             $this->view->setVar($t_subject->primaryKey(), null);
             $this->request->setParameter($t_subject->primaryKey(), null, 'PATH');
             // set last browse id for hierarchy browser
             $this->request->session->setVar($this->ops_table_name . '_browse_last_id', $vn_parent_id);
             // Clear out row_id so sidenav is disabled
             $this->request->setParameter($t_subject->primaryKey(), null, 'POST');
             # trigger "DeleteItem" hook
             $this->opo_app_plugin_manager->hookDeleteItem(array('id' => $vn_subject_id, 'table_num' => $t_subject->tableNum(), 'table_name' => $t_subject->tableName(), 'instance' => $t_subject));
         }
     }
     $this->view->setVar('subject_name', $t_subject->getLabelForDisplay(false));
     $this->render('delete_html.php');
 }
 /**
  *
  */
 public function refine(&$pa_destination_data, $pa_group, $pa_item, $pa_source_data, $pa_options = null)
 {
     global $g_ui_locale_id;
     $vs_delimiter = caGetOption('delimiter', $pa_options, null);
     if (!($pn_locale_id = ca_locales::getDefaultCataloguingLocaleID())) {
         $pn_locale_id = $g_ui_locale_id;
     }
     $o_log = isset($pa_options['log']) && is_object($pa_options['log']) ? $pa_options['log'] : null;
     $t_mapping = caGetOption('mapping', $pa_options, null);
     if ($t_mapping) {
         $o_dm = Datamodel::load();
         if ($t_mapping->get('table_num') != $o_dm->getTableNum('ca_list_items')) {
             if ($o_log) {
                 $o_log->logError(_t("listItemIndentedHierarchyBuilder refinery may only be used in imports to ca_list_items"));
             }
             return null;
         }
     }
     $va_group_dest = explode(".", $pa_group['destination']);
     $vs_terminal = array_pop($va_group_dest);
     $pm_value = $pa_source_data[$pa_item['source']];
     // Get list of fields to insert
     if (!is_array($va_levels = $pa_item['settings']['listItemIndentedHierarchyBuilder_levels'])) {
         if ($o_log) {
             $o_log->logError(_t("listItemIndentedHierarchyBuilder requires levels option be set to a list of data source placeholders"));
         }
         return null;
     } else {
         $va_level_types = $pa_item['settings']['listItemIndentedHierarchyBuilder_levelTypes'];
     }
     // Get list, or create if it doesn't already exist
     if (!($vs_list_code = $pa_item['settings']['listItemIndentedHierarchyBuilder_list'])) {
         if ($o_log) {
             $o_log->logError(_t("listItemIndentedHierarchyBuilder requires list option be set"));
         }
         return null;
     }
     $t_list = new ca_lists();
     if (!$t_list->load(array('list_code' => $vs_list_code))) {
         // create list
         $t_list->set('list_code', $vs_list_code);
         $t_list->setMode(ACCESS_WRITE);
         $t_list->insert();
         if ($t_list->numErrors()) {
             if ($o_log) {
                 $o_log->logError(_t("listItemIndentedHierarchyBuilder could not create list %1: %2", $vs_list_code, join("; ", $t_list->getErrors())));
             }
             return null;
         }
         $t_list->addLabel(array('name' => caUcFirstUTF8Safe($vs_list_code)), $pn_locale_id, null, true);
         if ($t_list->numErrors()) {
             if ($o_log) {
                 $o_log->logError(_t("listItemIndentedHierarchyBuilder could not create list label %1: %2", $vs_list_code, join("; ", $t_list->getErrors())));
             }
             return null;
         }
     }
     // Handle each level
     if (!is_array($va_level_values = listItemIndentedHierarchyBuilderRefinery::$opa_level_values)) {
         $va_level_values = $va_level_value_ids = array();
     }
     $va_level_value_ids = listItemIndentedHierarchyBuilderRefinery::$opa_level_value_ids;
     $vn_max_level = 0;
     $vn_parent_id = null;
     foreach ($va_levels as $vn_i => $vs_level_placeholder) {
         $vs_level_value = null;
         if (strlen($vs_level_placeholder)) {
             if ($vs_level_value = BaseRefinery::parsePlaceholder($vs_level_placeholder, $pa_source_data, $pa_item, 0, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true))) {
                 if (!$vn_parent_id && isset(listItemIndentedHierarchyBuilderRefinery::$opa_level_value_ids[$vn_i - 1])) {
                     $vn_parent_id = listItemIndentedHierarchyBuilderRefinery::$opa_level_value_ids[$vn_i - 1];
                 }
                 $vs_type = isset($va_level_types[$vn_i]) ? $va_level_types[$vn_i] : null;
                 if ($vn_item_id = DataMigrationUtils::getListItemID($vs_list_code, preg_replace("![^A-Za-z0-9_]+!", "_", $vs_level_value), $vs_type, $pn_locale_id, array('is_enabled' => 1, 'parent_id' => $vn_parent_id, 'preferred_labels' => array('name_singular' => $vs_level_value, 'name_plural' => $vs_level_value)), array('matchOnIdno' => true, 'log' => $o_log, 'transaction' => caGetOption('transaction', $pa_options, null), 'importEvent' => caGetOption('event', $pa_options, null), 'importEventSource' => 'listItemIndentedHierarchyBuilder'))) {
                     $vn_parent_id = $vn_item_id;
                     $va_level_values[$vn_i] = $vs_level_value;
                     $va_level_value_ids[$vn_i] = $vn_item_id;
                     $vn_max_level = $vn_i;
                 }
             }
         }
     }
     listItemIndentedHierarchyBuilderRefinery::$opa_level_values = array_slice($va_level_values, 0, $vn_max_level + 1);
     listItemIndentedHierarchyBuilderRefinery::$opa_level_value_ids = array_slice($va_level_value_ids, 0, $vn_max_level + 1);
     if ($pa_item['settings']['listItemIndentedHierarchyBuilder_list'] == 'returnData') {
         return $vn_parent_id;
     }
     return null;
 }
Esempio n. 12
0
 /**
  * Returns summary of current browse parameters suitable for display.
  *
  * @return string Summary of current browse criteria ready for display
  */
 public function getCriteriaForDisplay($po_browse)
 {
     $va_criteria = $po_browse->getCriteriaWithLabels();
     if (!sizeof($va_criteria)) {
         return '';
     }
     $va_criteria_info = $po_browse->getInfoForFacets();
     $va_buf = array();
     foreach ($va_criteria as $vs_facet => $va_vals) {
         foreach ($va_vals as $vn_i => $vs_val) {
             $va_vals[$vn_i] = preg_replace("![A-Za-z_\\./]+[:]{1}!", "", $vs_val);
             $va_vals[$vn_i] = trim(preg_replace("![\\*].!", "", $va_vals[$vn_i]));
             $va_vals[$vn_i] = trim(preg_replace("![\\(\\)]+!", " ", $va_vals[$vn_i]));
         }
         $va_buf[] = caUcFirstUTF8Safe($va_criteria_info[$vs_facet]['label_singular']) . ': ' . join(", ", $va_vals);
     }
     return join(" / ", $va_buf);
 }
Esempio n. 13
0
/**
 * Returns all available search form placements - those data bundles that can be searches for the given content type, in other words.
 * The returned value is a list of arrays; each array contains a 'bundle' specifier than can be passed got Model::get() or SearchResult::get() and a display name
 *
 * @param mixed $pm_table_name_or_num The table name or number specifying the content type to fetch bundles for. If omitted the content table of the currently loaded search form will be used.
 * @return array And array of bundles keyed on display label. Each value is an array with these keys:
 *		bundle = The bundle name (eg. ca_objects.idno)
 *		display = Display label for each available bundle
 *		description = Description of bundle
 * 
 * Will return null if table name or number is invalid.
 */
function caGetBundlesAvailableForSearch($pm_table_name_or_num, $pa_options = null)
{
    $pb_for_select = caGetOption('forSelect', $pa_options, false);
    $pa_filter = caGetOption('filter', $pa_options, null);
    $o_dm = Datamodel::load();
    $o_config = Configuration::load();
    $o_indexing_config = caGetSearchIndexingConfig();
    $pm_table_name_or_num = $o_dm->getTableNum($pm_table_name_or_num);
    if (!$pm_table_name_or_num) {
        return null;
    }
    $t_instance = $o_dm->getInstanceByTableNum($pm_table_name_or_num, true);
    $va_search_settings = $o_indexing_config->getAssoc($o_dm->getTableName($pm_table_name_or_num));
    $vs_primary_table = $t_instance->tableName();
    $vs_table_display_name = $t_instance->getProperty('NAME_PLURAL');
    $va_available_bundles = array();
    // Full-text
    $vs_bundle = "_fulltext";
    if (!(is_array($pa_filter) && sizeof($pa_filter) && !in_array($vs_bundle, $pa_filter))) {
        $vs_label = _t('Full text');
        $va_available_bundles[$vs_label][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'description' => $vs_description = _t('Searches on all content that has been indexed'));
    }
    // rewrite label filters to use label tables actually used in indexing config
    if (is_array($pa_filter)) {
        foreach ($pa_filter as $vn_i => $vs_filter) {
            $va_tmp = explode('.', $vs_filter);
            if (in_array($va_tmp[1], array('preferred_labels', 'nonpreferred_labels'))) {
                if ($t_filter_instance = $o_dm->getInstanceByTableName($va_tmp[0], true)) {
                    $pa_filter[] = $t_filter_instance->getLabelTableName() . ($va_tmp[2] ? '.' . $va_tmp[2] : '');
                }
            }
        }
    }
    // get fields
    foreach ($va_search_settings as $vs_table => $va_fields) {
        if (!is_array($va_fields['fields'])) {
            continue;
        }
        if ($vs_table == $vs_primary_table) {
            $va_element_codes = method_exists($t_instance, 'getApplicableElementCodes') ? $t_instance->getApplicableElementCodes(null, false, false) : array();
            $va_field_list = array();
            foreach ($va_fields['fields'] as $vs_field => $va_field_indexing_info) {
                if ($vs_field === '_metadata') {
                    foreach ($va_element_codes as $vs_code) {
                        $va_field_list[$vs_code] = array();
                    }
                } else {
                    $va_field_list[$vs_field] = $va_field_indexing_info;
                }
            }
            foreach ($va_field_list as $vs_field => $va_field_indexing_info) {
                if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_field_indexing_info)) {
                    continue;
                }
                if (is_array($pa_filter) && sizeof($pa_filter) && !in_array($vs_table . '.' . $vs_field, $pa_filter)) {
                    continue;
                }
                if (!($va_field_info = $t_instance->getFieldInfo($vs_field))) {
                    // is it an attribute?
                    if (in_array($vs_field, $va_element_codes)) {
                        $t_element = $t_instance->_getElementInstance($vs_field);
                        if (!$t_element) {
                            continue;
                        }
                        if (in_array($t_element->get('datatype'), array(15, 16))) {
                            continue;
                        }
                        // skip file and media attributes - never searchable
                        if (!$t_element->getSetting('canBeUsedInSearchForm')) {
                            continue;
                        }
                        if (caGetBundleAccessLevel($vs_primary_table, $vs_field) == __CA_BUNDLE_ACCESS_NONE__) {
                            continue;
                        }
                        $vs_bundle = $vs_table . '.' . $vs_field;
                        $vs_label = $t_instance->getDisplayLabel($vs_bundle);
                        $va_available_bundles[$vs_label][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle));
                    }
                } else {
                    if (isset($va_field_info['DONT_USE_AS_BUNDLE']) && $va_field_info['DONT_USE_AS_BUNDLE']) {
                        continue;
                    }
                    if (in_array($va_field_info['FIELD_TYPE'], array(FT_MEDIA, FT_FILE))) {
                        continue;
                    }
                    $vs_bundle = $vs_table . '.' . $vs_field;
                    $vs_label = $t_instance->getDisplayLabel($vs_bundle);
                    $va_available_bundles[$vs_label][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle));
                }
            }
        } else {
            // related table
            if ($o_config->get($vs_table . '_disable')) {
                continue;
            }
            $t_table = $o_dm->getInstanceByTableName($vs_table, true);
            if (method_exists($t_table, "getSubjectTableName") && ($vs_subject_table = $t_table->getSubjectTableName())) {
                if ($o_config->get($vs_subject_table . '_disable')) {
                    continue;
                }
            }
            if (caGetBundleAccessLevel($vs_primary_table, $vs_subject_table) == __CA_BUNDLE_ACCESS_NONE__) {
                continue;
            }
            foreach ($va_fields['fields'] as $vs_field => $va_field_indexing_info) {
                if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_field_indexing_info)) {
                    continue;
                }
                if (is_array($pa_filter) && sizeof($pa_filter) && !in_array($vs_table . '.' . $vs_field, $pa_filter)) {
                    continue;
                }
                if ($va_field_info = $t_table->getFieldInfo($vs_field)) {
                    if (isset($va_field_info['DONT_USE_AS_BUNDLE']) && $va_field_info['DONT_USE_AS_BUNDLE']) {
                        continue;
                    }
                    $vs_bundle = $vs_table . '.' . $vs_field;
                    $vs_related_table = caUcFirstUTF8Safe($t_table->getProperty('NAME_SINGULAR'));
                    if (method_exists($t_table, 'getSubjectTableInstance')) {
                        $t_subject = $t_table->getSubjectTableInstance();
                        $vs_related_table = caUcFirstUTF8Safe($t_subject->getProperty('NAME_SINGULAR'));
                    }
                    $vs_label = $t_instance->getDisplayLabel($vs_bundle);
                    $va_available_bundles[$vs_label][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle));
                }
            }
        }
    }
    //
    // access points
    //
    $va_access_points = isset($va_search_settings['_access_points']) && is_array($va_search_settings['_access_points']) ? $va_search_settings['_access_points'] : array();
    foreach ($va_access_points as $vs_access_point => $va_access_point_info) {
        if (isset($va_access_point_info['options']) && is_array($va_access_point_info['options'])) {
            if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_access_point_info['options'])) {
                continue;
            }
        }
        if (is_array($pa_filter) && sizeof($pa_filter) && !in_array($vs_access_point, $pa_filter)) {
            continue;
        }
        $vs_label = isset($va_access_point_info['name']) && $va_access_point_info['name'] ? $va_access_point_info['name'] : $vs_access_point;
        $va_available_bundles[$vs_label][$vs_access_point] = array('bundle' => $vs_access_point, 'label' => $vs_label, 'description' => $vs_description = isset($va_access_point_info['description']) && $va_access_point_info['description'] ? $va_access_point_info['description'] : '');
    }
    //
    // created and modified
    //
    foreach (array('created', 'modified') as $vs_bundle) {
        if (is_array($pa_filter) && sizeof($pa_filter) && !in_array($vs_bundle, $pa_filter)) {
            continue;
        }
        $vs_label = $t_instance->getDisplayLabel($vs_bundle);
        $va_available_bundles[$vs_label][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle));
    }
    ksort($va_available_bundles);
    $va_sorted_bundles = array();
    foreach ($va_available_bundles as $vs_k => $va_val) {
        foreach ($va_val as $vs_real_key => $va_info) {
            if ($pb_for_select) {
                $va_sorted_bundles[$va_info['label']] = $vs_real_key;
            } else {
                $va_sorted_bundles[$vs_real_key] = $va_info;
            }
        }
    }
    // rewrite bundles to used preferred_labels notation
    if ($pb_for_select) {
        foreach ($va_sorted_bundles as $vs_label => $vs_key) {
            $va_tmp = explode('.', $vs_key);
            if (preg_match('!_labels$!', $va_tmp[0])) {
                if (($t_label_instance = $o_dm->getInstanceByTableName($va_tmp[0], true)) && is_a($t_label_instance, 'BaseLabel')) {
                    $va_sorted_bundles[$vs_label] = $t_label_instance->getSubjectTableName() . '.preferred_labels' . ($va_tmp[1] ? '.' . $va_tmp[1] : '');
                }
            }
        }
    }
    return $va_sorted_bundles;
}
 /**
  * Insert activity menu
  */
 public function hookRenderMenuBar($pa_menu_bar)
 {
     if ($o_req = $this->getRequest()) {
         $o_dm = Datamodel::load();
         $va_activity_lists = array();
         foreach (array('ca_objects', 'ca_object_lots', 'ca_entities', 'ca_places', 'ca_occurrences', 'ca_collections', 'ca_storage_locations', 'ca_loans', 'ca_movements', 'ca_list_items', 'ca_sets', 'ca_tours', 'ca_tour_stops') as $vs_table_name) {
             $va_activity_menu_list = array();
             if (!is_array($va_activity_list = $o_req->session->getVar($vs_table_name . '_duplicate_id_list'))) {
                 $va_activity_list = array();
             }
             if (sizeof($va_activity_list) == 0) {
                 continue;
             }
             $t_instance = $o_dm->getInstanceByTableName($vs_table_name, true);
             $va_labels = $t_instance->getPreferredDisplayLabelsForIDs(array_keys($va_activity_list));
             if ($vs_table_name === 'ca_occurrences') {
                 $vs_priv_name = 'can_duplicate_ca_occurrences';
                 // Output occurrences grouped by type with types as top-level menu items
                 $va_types = $t_instance->getTypeList();
                 $va_editor_url_info = caEditorUrl($o_req, $vs_table_name, null, true);
                 // sort occurrences by type
                 $va_sorted_by_type_id = array();
                 $va_keys = array_reverse(array_keys($va_activity_list));
                 foreach ($va_keys as $vn_id) {
                     $va_info = $va_activity_list[$vn_id];
                     $va_sorted_by_type_id[$va_info['type_id']][$vn_id] = $va_info;
                 }
                 foreach ($va_types as $vn_type_id => $va_type_info) {
                     $va_activity_menu_list = array();
                     if (isset($va_sorted_by_type_id[$vn_type_id]) && is_array($va_sorted_by_type_id[$vn_type_id])) {
                         foreach ($va_sorted_by_type_id[$vn_type_id] as $vn_id => $va_info) {
                             $va_activity_menu_list[$vs_table_name . '_' . $vn_type_id . '_' . $vn_id] = array('default' => $va_editor_url_info, 'displayName' => htmlspecialchars($va_labels[$vn_id], ENT_QUOTES, 'UTF-8') . (trim($va_info['idno']) ? ' [' . $va_info['idno'] . ']' : ''), 'is_enabled' => 1, 'requires' => array('action:' . $vs_priv_name => 'OR'), 'parameters' => array($va_editor_url_info['_pk'] => $vn_id, 'mode' => 'dupe'));
                         }
                     }
                     if (sizeof($va_activity_menu_list) > 0) {
                         $va_activity_lists[$vs_table_name . '_' . $vn_type_id] = array('displayName' => mb_strtolower(caUcFirstUTF8Safe($va_type_info['name_singular']), 'UTF-8'), 'submenu' => array("type" => 'static', 'navigation' => $va_activity_menu_list));
                     }
                 }
             } else {
                 // Non-occurrences get grouped by their table
                 switch ($vs_table_name) {
                     case 'ca_list_items':
                         $vs_priv_name = 'can_duplicate_ca_lists';
                         break;
                     case 'ca_object_representations':
                         $vs_priv_name = 'can_duplicate_ca_objects';
                         break;
                     default:
                         $vs_priv_name = 'can_duplicate_' . $vs_table_name;
                         break;
                 }
                 $va_keys = array_reverse(array_keys($va_activity_list));
                 foreach ($va_keys as $vn_id) {
                     $va_info = $va_activity_list[$vn_id];
                     $va_editor_url_info = caEditorUrl($o_req, $vs_table_name, null, true);
                     $va_activity_menu_list[$vs_table_name . '_' . $vn_id] = array('default' => $va_editor_url_info, 'displayName' => htmlspecialchars($va_labels[$vn_id], ENT_QUOTES, 'UTF-8') . (trim($va_info['idno']) ? ' [' . $va_info['idno'] . ']' : ''), 'is_enabled' => 1, 'requires' => array('action:' . $vs_priv_name => 'OR'), 'parameters' => array($va_editor_url_info['_pk'] => $vn_id, 'mode' => 'dupe'));
                 }
                 $va_activity_lists[$vs_table_name] = array('displayName' => mb_strtolower(caUcFirstUTF8Safe($t_instance->getProperty('NAME_SINGULAR')), 'UTF-8'), 'navigation' => $va_activity_menu_list);
             }
         }
         if (sizeof($va_activity_lists)) {
             // only show duplicate menu if there are records used to create duplicates
             $pa_menu_bar['New']['navigation']['spacer'] = array('is_enabled' => 0, 'displayName' => "<div class='sf-spacer'/><!-- empty --></div>", 'default' => null);
             // Add duplicate menu to bottom of "New" menu
             $pa_menu_bar['New']['navigation']['duplicate'] = array('default' => $va_editor_url_info, 'is_enabled' => 1, 'displayName' => _t('Duplicate from...'), 'submenu' => array("type" => 'static', 'navigation' => $va_activity_lists));
         }
     }
     return $pa_menu_bar;
 }
 /**
  * Returns list of placements in the currently loaded display
  *
  * @param array $pa_options Optional array of options. Supported options are:
  *		noCache = if set to true, no caching of placement values is performed. 
  *		no_tooltips = if set no tooltips for available bundles will be emitted. Default is false - tooltips will be emitted.
  *		format = specifies label format for bundles. Valid values are "simple" (just the name of the element) or "full" (name of element, name of type of item element pertains to and alternate label, if defined). Default is "full"
  *		user_id = if specified then placements are only returned if the user has at least read access to the display
  * @return array List of placements. Each element in the list is an array with the following keys:
  *		display = A display label for the bundle
  *		bundle = The bundle name
  */
 public function getPlacementsInDisplay($pa_options = null)
 {
     if (!is_array($pa_options)) {
         $pa_options = array();
     }
     $pb_no_cache = caGetOption('noCache', $pa_options, false);
     $pn_user_id = caGetOption('user_id', $pa_options, null);
     if ($pn_user_id && !$this->haveAccessToDisplay($pn_user_id, __CA_BUNDLE_DISPLAY_READ_ACCESS__)) {
         return array();
     }
     $vb_show_tooltips = !caGetOption('no_tooltips', $pa_options, false);
     $vs_format = caGetOption('format', $pa_options, 'full', array('validValues' => array('simple', 'full')));
     if (!($pn_table_num = $this->getAppDatamodel()->getTableNum($this->get('table_num')))) {
         return null;
     }
     if (!($t_instance = $this->getAppDatamodel()->getInstanceByTableNum($pn_table_num, true))) {
         return null;
     }
     if (!is_array($va_placements = $this->getPlacements($pa_options))) {
         $va_placements = array();
     }
     $va_placements_in_display = array();
     foreach ($va_placements as $vn_placement_id => $va_placement) {
         $vs_label = ($vs_label = $t_instance->getDisplayLabel($va_placement['bundle_name'])) ? $vs_label : $va_placement['bundle_name'];
         if (is_array($va_placement['settings']) && is_array($va_placement['settings']['label'])) {
             $va_tmp = caExtractValuesByUserLocale(array($va_placement['settings']['label']));
             if ($vs_user_set_label = array_shift($va_tmp)) {
                 $vs_label = "{$vs_label} (<em>{$vs_user_set_label}</em>)";
             }
         }
         $vs_display = "<div id='bundleDisplayEditor_{$vn_placement_id}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_instance->getProperty('NAME_SINGULAR')) . "</span> {$vs_label}</div>";
         $va_placement['display'] = $vs_format == 'simple' ? $vs_label : $vs_display;
         $va_placement['bundle'] = $va_placement['bundle_name'];
         // we used 'bundle' in the arrays, but the database field is called 'bundle_name' and getPlacements() returns data directly from the database
         unset($va_placement['bundle_name']);
         $va_placements_in_display[$vn_placement_id] = $va_placement;
         $vs_description = $t_instance->getDisplayDescription($va_placement['bundle']);
         if ($vb_show_tooltips) {
             TooltipManager::add("#bundleDisplayEditor_{$vn_placement_id}", $this->_formatBundleTooltip($vs_label, $va_placement['bundle'], $vs_description));
         }
     }
     return $va_placements_in_display;
 }
Esempio n. 16
0
 * CollectiveAccess is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTIES whatsoever, including any implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 *
 * This source code is free and modifiable under the terms of 
 * GNU General Public License. (http://www.gnu.org/copyleft/gpl.html). See
 * the "license.txt" file for details, or visit the CollectiveAccess web site at
 * http://www.CollectiveAccess.org
 *
 * ----------------------------------------------------------------------
 */
$va_browse_types = caGetBrowseTypes();
if (sizeof($va_browse_types)) {
    ?>
 
<li class="dropdown" style="position:relative;"><a href="#" class="dropdown-toggle mainhead top" data-toggle="dropdown"><?php 
    print _t("Browse");
    ?>
<b class="caret"></b></a>
	<ul class="dropdown-menu">
<?php 
    if (sizeof($va_browse_types) > 1) {
        foreach ($va_browse_types as $vs_browse_name => $va_browse_type) {
            print "<li>" . caNavLink($this->request, caUcFirstUTF8Safe($vs_browse_name), '', '', 'Browse', $vs_browse_name, '') . "</li>";
        }
    }
    ?>
	</ul>	
</li>
<?php 
}
	
<?php 
}
?>
	<a name='Site'></a>

	<div class='blockTitle siteSearchDisplay'>Site</div>
	<div class='blockResults siteSearchDisplay' style='height:auto;'>
		<div id="siteSearchResults">
	
		</div>
	</div>
<?php 
if ($vn_result_count == 0) {
    print "<div id='noResultsMsg'><H2>" . _t("Your search for %1 returned no results", caUcFirstUTF8Safe($this->getVar('search'))) . "</H2></div>";
}
?>
</div>

<script type="text/javascript">
	jQuery("#noResultsMsg").css( "display", "none");
	jQuery(".siteSearchDisplay").css( "display", "none");
	jQuery(document).ready(function() {
		// grab search results
		jQuery.getJSON("http://<?php 
print $_SERVER['HTTP_HOST'];
?>
/services/search/search_node/retrieve.json", <?php 
print json_encode(array('keys' => $this->getVar('search')));
?>
        ?>
AuthorityReferenceTabs" class="authorityReferenceListContainer">
				<ul>
<?php 
        foreach ($va_references as $vn_table_num => $va_rows) {
            if ($t_ref_instance = $t_instance->getAppDatamodel()->getInstance($vn_table_num, true)) {
                $vs_ref_table_name = $t_ref_instance->tableName();
                ?>
						<li><a href="#<?php 
                print $vs_id_prefix;
                ?>
AuthorityReferenceTabs-<?php 
                print $vs_ref_table_name;
                ?>
"><span><?php 
                print _t('%1 (%2)', caUcFirstUTF8Safe($t_ref_instance->getProperty('NAME_PLURAL')), sizeof($va_rows));
                ?>
</span></a></li>
<?php 
            }
        }
        ?>
				</ul>
<?php 
        foreach ($va_references as $vn_table_num => $va_rows) {
            if ($t_ref_instance = $t_instance->getAppDatamodel()->getInstance($vn_table_num, true)) {
                $vs_ref_table_name = $t_ref_instance->tableName();
                ?>
				<div id="<?php 
                print $vs_id_prefix;
                ?>
Esempio n. 19
0
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 *
 * This source code is free and modifiable under the terms of 
 * GNU General Public License. (http://www.gnu.org/copyleft/gpl.html). See
 * the "license.txt" file for details, or visit the CollectiveAccess web site at
 * http://www.CollectiveAccess.org
 *
 * ----------------------------------------------------------------------
 */
global $g_ui_locale_id;
$t_subject = $this->getVar('t_subject');
$vn_subject_id = $this->getVar('subject_id');
$va_restrict_to_types = $this->getVar('restrict_to_types');
$vs_field_name_prefix = $this->getVar('field_name_prefix');
$vs_n = $this->getVar('n');
$vs_q = caUcFirstUTF8Safe($this->getVar('q'), true);
$vb_can_edit = $t_subject->isSaveable($this->request);
$vs_form_name = "StorageLocationQuickAddForm";
?>
		
<form action="#" name="<?php 
print $vs_form_name;
?>
" method="POST" enctype="multipart/form-data" id="<?php 
print $vs_form_name . $vs_field_name_prefix . $vs_n;
?>
">
	<div class='dialogHeader quickAddDialogHeader'><?php 
print "<div class='quickAddTypeList'>" . _t('Quick Add %1', $t_subject->getTypeListAsHTMLFormElement('change_type_id', array('id' => "{$vs_form_name}TypeID{$vs_field_name_prefix}{$vs_n}", 'onchange' => "caSwitchTypeQuickAddForm{$vs_field_name_prefix}{$vs_n}();"), array('value' => $t_subject->get('type_id'), 'restrictToTypes' => $va_restrict_to_types))) . "</div>";
if ($vb_can_edit) {
    print "<div style='float: right;'>" . caJSButton($this->request, __CA_NAV_BUTTON_ADD__, _t("Add %1", $t_subject->getProperty('NAME_SINGULAR')), "{$vs_form_name}{$vs_field_name_prefix}{$vs_n}", array("onclick" => "caSave{$vs_form_name}{$vs_field_name_prefix}{$vs_n}(event);")) . ' ' . caJSButton($this->request, __CA_NAV_BUTTON_CANCEL__, _t("Cancel"), "{$vs_form_name}{$vs_field_name_prefix}{$vs_n}", array("onclick" => "jQuery(\"#{$vs_form_name}{$vs_field_name_prefix}{$vs_n}\").parent().data(\"panel\").hidePanel();")) . "</div><br style='clear: both;'/>\n";
Esempio n. 20
0
 /**
  * Returns all available search form placements - those data bundles that can be searches for the given content type, in other words.
  * The returned value is a list of arrays; each array contains a 'bundle' specifier than can be passed got Model::get() or SearchResult::get() and a display name
  *
  * @param mixed $pm_table_name_or_num The table name or number specifying the content type to fetch bundles for. If omitted the content table of the currently loaded search form will be used.
  * @return array And array of bundles keyed on display label. Each value is an array with these keys:
  *		bundle = The bundle name (eg. ca_objects.idno)
  *		display = Display label for each available bundle
  *		description = Description of bundle
  * 
  * Will return null if table name or number is invalid.
  */
 public function getAvailableBundles($pm_table_name_or_num = null, $pa_options = null)
 {
     if (!$pm_table_name_or_num) {
         $pm_table_name_or_num = $this->get('table_num');
     }
     $pm_table_name_or_num = $this->_DATAMODEL->getTableNum($pm_table_name_or_num);
     if (!$pm_table_name_or_num) {
         return null;
     }
     $t_instance = $this->_DATAMODEL->getInstanceByTableNum($pm_table_name_or_num, true);
     $va_search_settings = $this->opo_search_indexing_config->getAssoc($this->_DATAMODEL->getTableName($pm_table_name_or_num));
     $vs_primary_table = $t_instance->tableName();
     $vs_table_display_name = $t_instance->getProperty('NAME_PLURAL');
     $t_placement = new ca_search_form_placements(null, array());
     $va_available_bundles = array();
     $va_additional_settings = array('width' => array('formatType' => FT_TEXT, 'displayType' => DT_FIELD, 'width' => 4, 'height' => 1, 'takesLocale' => false, 'default' => "100px", 'label' => _t('Width'), 'description' => _t('Width, in characters, of search form elements.')));
     $t_placement->setSettingDefinitionsForPlacement($va_additional_settings);
     // Full-text
     $vs_bundle = "_fulltext";
     $vs_display = "<div id='searchFormEditor__fulltext'><span class='bundleDisplayEditorPlacementListItemTitle'>" . _t("General") . '</span> ' . ($vs_label = _t('Full text')) . "</div>";
     $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = _t('Searches on all content that has been indexed'), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings);
     TooltipManager::add("#searchFormEditor__fulltext", "<h2>{$vs_label}</h2>{$vs_description}");
     // get fields
     foreach ($va_search_settings as $vs_table => $va_fields) {
         if (!is_array($va_fields['fields'])) {
             continue;
         }
         if ($vs_table == $vs_primary_table) {
             $va_element_codes = method_exists($t_instance, 'getApplicableElementCodes') ? $t_instance->getApplicableElementCodes(null, false, false) : array();
             $va_field_list = array();
             foreach ($va_fields['fields'] as $vs_field => $va_field_indexing_info) {
                 if ($vs_field === '_metadata') {
                     foreach ($va_element_codes as $vs_code) {
                         $va_field_list[$vs_code] = array();
                     }
                 } else {
                     $va_field_list[$vs_field] = $va_field_indexing_info;
                 }
             }
             foreach ($va_field_list as $vs_field => $va_field_indexing_info) {
                 if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_field_indexing_info)) {
                     continue;
                 }
                 if (!($va_field_info = $t_instance->getFieldInfo($vs_field))) {
                     // is it an attribute?
                     if (in_array($vs_field, $va_element_codes)) {
                         $t_element = $this->_getElementInstance($vs_field);
                         if (!$t_element) {
                             continue;
                         }
                         if (in_array($t_element->get('datatype'), array(15, 16))) {
                             continue;
                         }
                         // skip file and media attributes - never searchable
                         if (!$t_element->getSetting('canBeUsedInSearchForm')) {
                             continue;
                         }
                         if (caGetBundleAccessLevel($vs_primary_table, $vs_field) == __CA_BUNDLE_ACCESS_NONE__) {
                             continue;
                         }
                         $vs_bundle = $vs_table . '.' . $vs_field;
                         $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_instance->getProperty('NAME_SINGULAR')) . "</span> " . ($vs_label = $t_instance->getDisplayLabel($vs_bundle)) . "</div>";
                         $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings);
                         TooltipManager::add("#searchFormEditor_{$vs_table}_{$vs_field}", "<h2>{$vs_label}</h2>{$vs_description}");
                     }
                 } else {
                     if (isset($va_field_info['DONT_USE_AS_BUNDLE']) && $va_field_info['DONT_USE_AS_BUNDLE']) {
                         continue;
                     }
                     if (in_array($va_field_info['FIELD_TYPE'], array(FT_MEDIA, FT_FILE))) {
                         continue;
                     }
                     $vs_bundle = $vs_table . '.' . $vs_field;
                     $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_instance->getProperty('NAME_SINGULAR')) . "</span> " . ($vs_label = $t_instance->getDisplayLabel($vs_bundle)) . "</div>";
                     $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings);
                     TooltipManager::add("#searchFormEditor_{$vs_table}_{$vs_field}", "<h2>{$vs_label}</h2>{$vs_description}");
                 }
             }
         } else {
             // related table
             if ($this->getAppConfig()->get($vs_table . '_disable')) {
                 continue;
             }
             $t_table = $this->_DATAMODEL->getInstanceByTableName($vs_table, true);
             if (method_exists($t_table, "getSubjectTableName") && ($vs_subject_table = $t_table->getSubjectTableName())) {
                 if ($this->getAppConfig()->get($vs_subject_table . '_disable')) {
                     continue;
                 }
             }
             if (caGetBundleAccessLevel($vs_primary_table, $vs_subject_table) == __CA_BUNDLE_ACCESS_NONE__) {
                 continue;
             }
             foreach ($va_fields['fields'] as $vs_field => $va_field_indexing_info) {
                 if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_field_indexing_info)) {
                     continue;
                 }
                 if ($va_field_info = $t_table->getFieldInfo($vs_field)) {
                     if (isset($va_field_info['DONT_USE_AS_BUNDLE']) && $va_field_info['DONT_USE_AS_BUNDLE']) {
                         continue;
                     }
                     $vs_bundle = $vs_table . '.' . $vs_field;
                     $vs_related_table = caUcFirstUTF8Safe($t_table->getProperty('NAME_SINGULAR'));
                     if (method_exists($t_table, 'getSubjectTableInstance')) {
                         $t_subject = $t_table->getSubjectTableInstance();
                         $vs_related_table = caUcFirstUTF8Safe($t_subject->getProperty('NAME_SINGULAR'));
                     }
                     $vs_label = $t_instance->getDisplayLabel($vs_bundle);
                     if (method_exists($t_table, "getSubjectTableName") && $vs_primary_table == $vs_subject_table) {
                         $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_subject->getProperty('NAME_SINGULAR')) . "</span> {$vs_label}</div>";
                     } else {
                         $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>{$vs_related_table}</span> {$vs_label}</div>";
                     }
                     $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings);
                     TooltipManager::add("#searchFormEditor_{$vs_table}_{$vs_field}", "<h2>{$vs_label}</h2>{$vs_description}");
                 }
             }
         }
     }
     //
     // access points
     //
     $va_access_points = isset($va_search_settings['_access_points']) && is_array($va_search_settings['_access_points']) ? $va_search_settings['_access_points'] : array();
     //unset($va_search_settings['_access_points']);
     foreach ($va_access_points as $vs_access_point => $va_access_point_info) {
         if (isset($va_access_point_info['options']) && is_array($va_access_point_info['options'])) {
             if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_access_point_info['options'])) {
                 continue;
             }
         }
         $vs_display = "<div id='searchFormEditor_{$vs_access_point}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . _t('Access point') . '</span> ' . ($vs_label = isset($va_access_point_info['name']) && $va_access_point_info['name'] ? $va_access_point_info['name'] : $vs_access_point) . "</div>";
         $va_available_bundles[strip_tags($vs_display)][$vs_access_point] = array('bundle' => $vs_access_point, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = isset($va_access_point_info['description']) && $va_access_point_info['description'] ? $va_access_point_info['description'] : '', 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_access_point . '_0')), 'settings' => $va_additional_settings);
         TooltipManager::add("#searchFormEditor_{$vs_access_point}", "<h2>{$vs_label}</h2>{$vs_description}");
     }
     //
     // created and modified
     //
     $t_placement->setSettingDefinitionsForPlacement($va_additional_settings);
     foreach (array('created', 'modified') as $vs_bundle) {
         $vs_display = "<div id='searchFormEditor_{$vs_bundle}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . _t('General') . "</span> " . ($vs_label = $t_instance->getDisplayLabel($vs_bundle)) . "</div>";
         $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings);
         TooltipManager::add("#searchFormEditor_{$vs_bundle}", "<h2>{$vs_label}</h2>{$vs_description}");
     }
     ksort($va_available_bundles);
     $va_sorted_bundles = array();
     foreach ($va_available_bundles as $vs_k => $va_val) {
         foreach ($va_val as $vs_real_key => $va_info) {
             $va_sorted_bundles[$vs_real_key] = $va_info;
         }
     }
     return $va_sorted_bundles;
 }
Esempio n. 21
0
 public function Edit()
 {
     $t_role = $this->getRoleObject();
     $t_screen = new ca_editor_ui_screens();
     $o_dm = Datamodel::load();
     $t_list = new ca_lists();
     $va_role_vars = $t_role->get('vars');
     $va_bundle_access_settings = $va_role_vars['bundle_access_settings'];
     $vn_default_bundle_access_level = (int) $this->request->config->get('default_bundle_access_level');
     $va_bundle_list = $va_table_names = array();
     foreach (ca_users::$s_bundlable_tables as $vs_table) {
         $t_instance = $o_dm->getInstanceByTableName($vs_table, true);
         $va_table_names[$vs_table] = caUcFirstUTF8Safe($t_instance->getProperty('NAME_PLURAL'));
         $va_available_bundles = $t_screen->getAvailableBundles($vs_table);
         foreach ($va_available_bundles as $vs_bundle_name => $va_bundle_info) {
             $vn_access = isset($va_bundle_access_settings[$vs_table . '.' . $vs_bundle_name]) ? $va_bundle_access_settings[$vs_table . '.' . $vs_bundle_name] : $vn_default_bundle_access_level;
             $va_bundle_list[$vs_table][$vs_bundle_name] = array('bundle_info' => $va_bundle_info, 'access' => $vn_access);
         }
     }
     $this->view->setVar('bundle_list', $va_bundle_list);
     $vn_default_type_access_level = (int) $this->request->config->get('default_type_access_level');
     $va_type_list = array();
     $va_type_access_settings = $va_role_vars['type_access_settings'];
     foreach (ca_users::$s_bundlable_tables as $vs_table) {
         $t_instance = $o_dm->getInstanceByTableName($vs_table, true);
         if (!($vs_list_code = $t_instance->getTypeListCode())) {
             continue;
         }
         $va_table_names[$vs_table] = caUcFirstUTF8Safe($t_instance->getProperty('NAME_PLURAL'));
         $va_types = $t_list->getListItemsAsHierarchy($vs_list_code, array('additionalTableToJoin' => 'ca_list_item_labels'));
         if (is_array($va_types)) {
             foreach ($va_types as $vn_i => $va_type_info) {
                 $vn_item_id = $va_type_info['NODE']['item_id'];
                 $vn_access = isset($va_type_access_settings[$vs_table . '.' . $vn_item_id]) ? $va_type_access_settings[$vs_table . '.' . $vn_item_id] : $vn_default_type_access_level;
                 $va_type_info['NODE']['level'] = $va_type_info['LEVEL'];
                 $va_type_list[$vs_table][$vn_item_id] = array('type_info' => $va_type_info['NODE'], 'access' => $vn_access);
             }
         }
     }
     $vn_default_source_access_level = (int) $this->request->config->get('default_source_access_level');
     $va_source_list = array();
     $va_source_access_settings = $va_role_vars['source_access_settings'];
     foreach (ca_users::$s_bundlable_tables as $vs_table) {
         $t_instance = $o_dm->getInstanceByTableName($vs_table, true);
         if (!($vs_list_code = $t_instance->getSourceListCode())) {
             continue;
         }
         $va_table_names[$vs_table] = caUcFirstUTF8Safe($t_instance->getProperty('NAME_PLURAL'));
         $va_sources = $t_list->getListItemsAsHierarchy($vs_list_code, array('additionalTableToJoin' => 'ca_list_item_labels'));
         if (is_array($va_sources)) {
             foreach ($va_sources as $vn_i => $va_source_info) {
                 $vn_item_id = $va_source_info['NODE']['item_id'];
                 $vn_access = isset($va_source_access_settings[$vs_table . '.' . $vn_item_id]) ? $va_source_access_settings[$vs_table . '.' . $vn_item_id] : $vn_default_source_access_level;
                 $va_source_info['NODE']['level'] = $va_source_info['LEVEL'];
                 $va_source_list[$vs_table][$vn_item_id] = array('source_info' => $va_source_info['NODE'], 'access' => $vn_access, 'default' => $vn_item_id == $va_source_access_settings[$vs_table . '_default_id']);
             }
         }
     }
     $va_access_status_list = array();
     if (is_array($va_access_statuses = $t_list->getListItemsAsHierarchy('access_statuses', array('additionalTableToJoin' => 'ca_list_item_labels')))) {
         $va_access_status_settings = $va_role_vars['access_status_settings'];
         foreach ($va_access_statuses as $vn_i => $va_access_status_info) {
             if (!$va_access_status_info['NODE']['parent_id']) {
                 continue;
             }
             $vn_item_id = $va_access_status_info['NODE']['item_id'];
             $va_access_status_info['NODE']['level'] = $va_access_status_info['LEVEL'];
             $vn_access = isset($va_access_status_settings[$vn_item_id]) ? $va_access_status_settings[$vn_item_id] : null;
             $va_access_status_list[$vn_item_id] = array('access_status_info' => $va_access_status_info['NODE'], 'access' => $vn_access);
         }
     }
     $this->view->setVar('type_list', $va_type_list);
     $this->view->setVar('source_list', $va_source_list);
     $this->view->setVar('access_status_list', $va_access_status_list);
     $this->view->setVar('table_display_names', $va_table_names);
     $this->render('role_edit_html.php');
 }
 /**
  * Insert activity menu
  */
 public function hookRenderMenuBar($pa_menu_bar)
 {
     if ($o_req = $this->getRequest()) {
         $o_dm = Datamodel::load();
         $va_activity_lists = array();
         if ($this->opo_config instanceof Configuration) {
             $va_menu_item_names = $this->opo_config->getAssoc('menuItemNames');
         }
         foreach (array('ca_objects', 'ca_object_lots', 'ca_entities', 'ca_places', 'ca_occurrences', 'ca_collections', 'ca_storage_locations', 'ca_loans', 'ca_movements', 'ca_list_items', 'ca_sets', 'ca_tours', 'ca_tour_stops') as $vs_table_name) {
             $va_activity_menu_list = array();
             if (!is_array($va_activity_list = $o_req->session->getVar($vs_table_name . '_history_id_list'))) {
                 $va_activity_list = array();
             }
             if (sizeof($va_activity_list) == 0) {
                 continue;
             }
             $t_instance = $o_dm->getInstanceByTableName($vs_table_name, true);
             $va_labels = $t_instance->getPreferredDisplayLabelsForIDs(array_keys($va_activity_list));
             if ($vs_table_name === 'ca_occurrences') {
                 $vs_priv_name = 'can_edit_ca_occurrences';
                 // Output occurrences grouped by type with types as top-level menu items
                 $va_types = $t_instance->getTypeList();
                 $va_editor_url_info = caEditorUrl($o_req, $vs_table_name, null, true);
                 // sort occurrences by type
                 $va_sorted_by_type_id = array();
                 $va_keys = array_reverse(array_keys($va_activity_list));
                 foreach ($va_keys as $vn_id) {
                     $va_info = $va_activity_list[$vn_id];
                     $va_sorted_by_type_id[$va_info['type_id']][$vn_id] = $va_info;
                 }
                 foreach ($va_types as $vn_type_id => $va_type_info) {
                     $va_activity_menu_list = array();
                     if (isset($va_sorted_by_type_id[$vn_type_id]) && is_array($va_sorted_by_type_id[$vn_type_id])) {
                         foreach ($va_sorted_by_type_id[$vn_type_id] as $vn_id => $va_info) {
                             $va_activity_menu_list[$vs_table_name . '_' . $vn_type_id . '_' . $vn_id] = array('default' => $va_editor_url_info, 'displayName' => $va_labels[$vn_id] . (trim($va_info['idno']) ? ' [' . $va_info['idno'] . ']' : ''), 'is_enabled' => 1, 'requires' => array('action:' . $vs_priv_name => 'OR'), 'parameters' => array($va_editor_url_info['_pk'] => $vn_id));
                         }
                     }
                     if (sizeof($va_activity_menu_list) > 0) {
                         $va_activity_lists[$vs_table_name . '_' . $vn_type_id] = array('displayName' => caUcFirstUTF8Safe($va_type_info['name_plural']), 'submenu' => array("type" => 'static', 'navigation' => $va_activity_menu_list));
                     }
                 }
             } else {
                 // Non-occurrences get grouped by their table
                 switch ($vs_table_name) {
                     case 'ca_list_items':
                         $vs_priv_name = 'can_edit_ca_lists';
                         break;
                     case 'ca_object_representations':
                         $vs_priv_name = 'can_edit_ca_objects';
                         break;
                     case 'ca_tour_stops':
                         $vs_priv_name = 'can_edit_ca_tours';
                         break;
                     case 'ca_sets':
                         $vs_priv_name = 'can_edit_sets';
                         break;
                     default:
                         $vs_priv_name = 'can_edit_' . $vs_table_name;
                         break;
                 }
                 $va_keys = array_reverse(array_keys($va_activity_list));
                 foreach ($va_keys as $vn_id) {
                     $va_info = $va_activity_list[$vn_id];
                     $va_editor_url_info = caEditorUrl($o_req, $vs_table_name, null, true);
                     $va_activity_menu_list[$vs_table_name . '_' . $vn_id] = array('default' => $va_editor_url_info, 'displayName' => $va_labels[$vn_id] . (trim($va_info['idno']) ? ' [' . $va_info['idno'] . ']' : ''), 'is_enabled' => 1, 'requires' => array('action:' . $vs_priv_name => 'OR'), 'parameters' => array($va_editor_url_info['_pk'] => $vn_id));
                 }
                 if (is_array($va_menu_item_names) && isset($va_menu_item_names[$vs_table_name])) {
                     $vs_display_name = $va_menu_item_names[$vs_table_name];
                 } else {
                     $vs_display_name = caUcFirstUTF8Safe(_t($t_instance->getProperty('NAME_PLURAL')));
                 }
                 $va_activity_lists[$vs_table_name] = array('displayName' => $vs_display_name, 'submenu' => array("type" => 'static', 'navigation' => $va_activity_menu_list));
             }
         }
         if (sizeof($va_activity_lists)) {
             // only show history menu if there's some history...
             $va_activity_menu = array('displayName' => _t('History'), 'navigation' => $va_activity_lists);
             $pa_menu_bar['activity_menu'] = $va_activity_menu;
         }
     }
     return $pa_menu_bar;
 }