/**
  * Add the the current Connections directory location/query to the page title.
  *
  * NOTE: $id really isn't optional, some plugins fail to use the `the_title` filter correctly,
  * ie. "Display Posts Shortcode", causes Connections to crash an burn if not supplied.
  *
  * @access private
  * @since  0.7.8
  * @static
  *
  * @uses   cnQuery::getVar()
  *
  * @param  string $title The browser tab/window title.
  * @param  int    $id    The page/post ID.
  *
  * @return string
  */
 public static function filterPostTitle($title, $id = 0)
 {
     global $wp_query, $post;
     $original = $title;
     /**
      * Filter to allow the page title separator to be changed.
      *
      * @since 8.5.15
      *
      * @param string $separator The title separator.
      */
     $separator = apply_filters('cn_page_title_separator', '»');
     // Whether or not to filter the page title with the current directory location.
     if (!cnSettingsAPI::get('connections', 'seo', 'page_title')) {
         return $title;
     }
     if (!is_object($post) || (!isset($wp_query->post) || !isset($wp_query->post->ID) || $wp_query->post->ID != $id) || !self::$filterPermalink) {
         return $title;
     }
     $pieces = array($title);
     if (cnQuery::getVar('cn-cat-slug')) {
         // If the category slug is a descendant, use the last slug from the URL for the query.
         $categorySlug = explode('/', cnQuery::getVar('cn-cat-slug'));
         if (isset($categorySlug[count($categorySlug) - 1])) {
             $categorySlug = $categorySlug[count($categorySlug) - 1];
         }
         $term = cnTerm::getBy('slug', $categorySlug, 'category');
         $category = new cnCategory($term);
         $pieces = array_merge(array('term-category-name' => $category->getName()), $pieces);
     }
     if (cnQuery::getVar('cn-cat')) {
         if (is_array(cnQuery::getVar('cn-cat'))) {
             return implode('', $pieces);
         }
         $categoryID = cnQuery::getVar('cn-cat');
         $term = cnTerm::getBy('id', $categoryID, 'category');
         $category = new cnCategory($term);
         $pieces = array_merge(array('term-category-name' => $category->getName()), $pieces);
     }
     if (cnQuery::getVar('cn-country')) {
         $pieces = array_merge(array('country' => urldecode(cnQuery::getVar('cn-country'))), $pieces);
     }
     if (cnQuery::getVar('cn-postal-code')) {
         $pieces = array_merge(array('postal-code' => urldecode(cnQuery::getVar('cn-postal-code'))), $pieces);
     }
     if (cnQuery::getVar('cn-region')) {
         $pieces = array_merge(array('region' => urldecode(cnQuery::getVar('cn-region'))), $pieces);
     }
     if (cnQuery::getVar('cn-locality')) {
         $pieces = array_merge(array('locality' => urldecode(cnQuery::getVar('cn-locality'))), $pieces);
     }
     if (cnQuery::getVar('cn-organization')) {
         $pieces = array_merge(array('organization' => urldecode(cnQuery::getVar('cn-organization'))), $pieces);
     }
     if (cnQuery::getVar('cn-department')) {
         $pieces = array_merge(array('department' => urldecode(cnQuery::getVar('cn-department'))), $pieces);
     }
     if (cnQuery::getVar('cn-entry-slug')) {
         // Grab an instance of the Connections object.
         $instance = Connections_Directory();
         $result = $instance->retrieve->entries(array('slug' => urldecode(cnQuery::getVar('cn-entry-slug'))));
         // Make sure an entry is returned and if not, return $title unaltered.
         if (empty($result)) {
             return apply_filters('cn_page_title', implode(" {$separator} ", $pieces), $pieces, $separator, $original, $id);
         }
         $entry = new cnEntry($result[0]);
         $pieces = array_merge(array('name' => $entry->getName()), $pieces);
     }
     /**
      * Filter the parts of the page title.
      *
      * @since 8.5.15
      *
      * @param string $title     The page title.
      * @param array  $pieces    The pieces of the title.
      * @param string $separator The title separator.
      * @param string $original  The original title. May have been altered by other filters hooked into the `the_title` filter.
      * @param int    $id        The post ID.
      */
     $title = apply_filters('cn_page_title', implode(" {$separator} ", $pieces), $pieces, $separator, $original, $id);
     return $title;
 }
 // Info Div header
 $member_listing .= '<div><span class="member-details"><strong>';
 $mobile_member_listing .= '<div><span class="member-details"><strong>';
 // create family member
 $member_group = new cnEntry();
 // Create the popup container
 //$member_popup_info = '<div id="popup-group-name"><span>' . $entry->getFamilyName() . '</span></div>';
 // Set a counter
 $counter = 0;
 foreach ($entry->getFamilyMembers() as $relationData) {
     // Increment
     $counter++;
     // Set family member id
     $member_group->set($relationData['entry_id']);
     if ($counter > 1) {
         $member_list_first_names .= ", " . $member_group->getName(array('format' => '%first%'));
     } else {
         $member_list_first_names = $member_group->getName(array('format' => '%first%'));
     }
 }
 $member_popup_info = '<div id="popup-group-members"><span>' . $member_list_first_names . '</span></div>';
 $member_popup_info .= '<div id="popup-group-name"><span>' . $entry->getFamilyName() . '</span></div>';
 // Get Home phone number
 foreach ($entry->getPhoneNumbers() as $key_homephone => $value_homephone) {
     // List home number for family
     foreach ($value_homephone as $key_homenumber => $value_homenumber) {
         //echo "Home Key: " . $key_homenumber . " Home Value: " . $value_homenumber . "<br />";
         // Check for home number
         if ($key_homenumber == 'type' && $value_homenumber == 'homephone') {
             // Find home number in $value_homephone array
             if ($value_homephone->number != '') {
 /**
  * Prepare a single entry output for response.
  *
  * @param cnEntry         $entry   Post object.
  * @param WP_REST_Request $request Request object.
  *
  * @return WP_REST_Response $data
  */
 public function prepare_item_for_response($entry, $request)
 {
     $data = array();
     //$entry->directoryHome(
     //	array(
     //		'page_id'    => $homeID,
     //		'force_home' => $forceHome,
     //	)
     //);
     $data['id'] = $entry->getId();
     $data['type'] = $entry->getEntryType();
     $data['slug'] = $entry->getSlug();
     $data['name'] = array('raw' => $entry->getName(array(), 'raw'), 'rendered' => $entry->getName());
     $data['honorific_prefix'] = array('raw' => $entry->getHonorificPrefix('raw'), 'rendered' => $entry->getHonorificPrefix());
     $data['given_name'] = array('raw' => $entry->getFirstName('raw'), 'rendered' => $entry->getFirstName());
     $data['additional_name'] = array('raw' => $entry->getMiddleName('raw'), 'rendered' => $entry->getMiddleName());
     $data['family_name'] = array('raw' => $entry->getLastName('raw'), 'rendered' => $entry->getLastName());
     $data['honorific_suffix'] = array('raw' => $entry->getHonorificSuffix('raw'), 'rendered' => $entry->getHonorificSuffix());
     $data['job_title'] = array('raw' => $entry->getTitle('raw'), 'rendered' => $entry->getTitle());
     $data['org'] = array('organization_name' => array('raw' => $entry->getDepartment('raw'), 'rendered' => $entry->getDepartment()), 'organization_unit' => array('raw' => $entry->getOrganization('raw'), 'rendered' => $entry->getOrganization()));
     $data['contact'] = array('given_name' => array('raw' => $entry->getContactFirstName('raw'), 'rendered' => $entry->getContactFirstName()), 'family_name' => array('raw' => $entry->getContactLastName('raw'), 'rendered' => $entry->getContactLastName()));
     $data = $this->prepare_address_for_response($entry, $request, $data);
     // Wrap the data in a response object.
     $response = rest_ensure_response($data);
     return $response;
 }
 /**
  * Outputs entry data JSON encoded in HTML data attribute.
  * This is an action called by the `cn_action_entry_after` hook.
  *
  * @access public
  * @since  0.8
  *
  * @param array   $atts  Shortcode $atts passed by the `cn_action_entry_after` action hook.
  * @param cnEntry $entry An instance the the cnEntry object.
  *
  * @return string
  */
 public static function JSON($atts, $entry)
 {
     $defaults = array('tag' => 'div', 'before' => '', 'after' => '', 'return' => FALSE, 'show_addresses' => TRUE, 'show_phone_numbers' => TRUE, 'show_email' => TRUE, 'show_im' => TRUE, 'show_social_media' => TRUE, 'show_links' => TRUE, 'show_dates' => TRUE, 'show_bio' => TRUE, 'show_notes' => TRUE);
     $atts = wp_parse_args($atts, $defaults);
     $data = array('type' => $entry->getEntryType(), 'id' => $entry->getId(), 'ruid' => $entry->getRuid(), 'slug' => $entry->getSlug(), 'name' => array('full' => $entry->getName($atts), 'prefix' => $entry->getHonorificPrefix(), 'first' => $entry->getFirstName(), 'middle' => $entry->getMiddleName(), 'last' => $entry->getLastName(), 'suffix' => $entry->getHonorificSuffix()), 'title' => $entry->getTitle(), 'organization' => $entry->getOrganization(), 'department' => $entry->getDepartment(), 'contact_name' => array('full' => $entry->getContactName(), 'first' => $entry->getContactFirstName(), 'last' => $entry->getContactLastName()), 'family_name' => $entry->getFamilyName(), 'family_members' => $entry->getFamilyMembers(), 'categories' => $entry->getCategory(), 'meta' => $entry->getMeta($atts));
     if ($atts['show_addresses']) {
         $data['addresses'] = $entry->getAddresses($atts);
     }
     if ($atts['show_phone_numbers']) {
         $data['phone_numbers'] = $entry->getPhoneNumbers($atts);
     }
     if ($atts['show_email']) {
         $data['email_addresses'] = $entry->getEmailAddresses($atts);
     }
     if ($atts['show_im']) {
         $data['im'] = $entry->getIm($atts);
     }
     if ($atts['show_social_media']) {
         $data['social_media'] = $entry->getSocialMedia($atts);
     }
     if ($atts['show_links']) {
         $data['links'] = $entry->getLinks($atts);
     }
     if ($atts['show_dates']) {
         $data['dates'] = $entry->getDates($atts);
     }
     if ($atts['show_bio']) {
         $data['bio'] = $entry->getBio();
     }
     if ($atts['show_notes']) {
         $data['notes'] = $entry->getNotes();
     }
     $out = sprintf('<%1$s class="cn-entry-data-json" data-entry-data-json=\'%2$s\'></%1$s>', $atts['tag'], htmlspecialchars(json_encode($data), ENT_QUOTES, 'UTF-8'));
     $out = (empty($atts['before']) ? '' : $atts['before']) . $out . (empty($atts['after']) ? '' : $atts['after']) . PHP_EOL;
     return self::echoOrReturn($atts['return'], $out);
 }
 /**
  * Echos the family members of the family entry type.
  *
  * @access  public
  * @since   unknown
  *
  * @param array $atts {
  *     Optional.
  *
  *     @type string $container_tag The relationship container tag. Default `ul`. Accepts HTML tag.
  *     @type string $item_tag      The relationship row tag. Default `li`. Accepts HTML tag.
  *     @type string $item_format   The relationship row HTML markup.
  *     @type string $name_format   How the relationship name should be displayed @see cnEntry::getName().
  *     @type string $separator     The string used to separate the relation label from the relation name. Default ':'.
  *     @type string $before        HTML to be displayed before the relations container. Default, empty string.
  *     @type string $after         HTML to be displayed after the relations container. Default, empty string.
  *     @type string $before_item   HTML to be displayed before a relation row. Default, empty string.
  *     @type string $after_item    HTML to be displayed after a relation row. Default, empty string.
  * }
  *
  * @return string
  */
 public function getFamilyMemberBlock($atts = array())
 {
     $defaults = array('container_tag' => 'ul', 'item_tag' => 'li', 'item_format' => '<%1$s class="cn-relation"><span class="cn-relation-label">%relation%</span>%separator% <span class="cn-relation-name notranslate">%name%</span></%1$s>', 'name_format' => '', 'separator' => ':', 'before' => '', 'after' => '', 'before_item' => '', 'after_item' => '', 'return' => FALSE);
     /**
      * Filter the arguments.
      *
      * @since unknown
      *
      * @param array $atts An array of arguments.
      */
     $atts = cnSanitize::args(apply_filters('cn_output_family_atts', $atts), $defaults);
     $html = '';
     $search = array('%relation%', '%name%', '%separator%');
     if ($this->getFamilyMembers()) {
         // Grab an instance of the Connections object.
         $instance = Connections_Directory();
         foreach ($this->getFamilyMembers() as $key => $value) {
             $relation = new cnEntry();
             $replace = array();
             if ($relation->set($key)) {
                 $replace[] = $instance->options->getFamilyRelation($value);
                 $replace[] = cnURL::permalink(array('type' => 'name', 'slug' => $relation->getSlug(), 'title' => $relation->getName(array('format' => $atts['name_format'])), 'text' => $relation->getName(array('format' => $atts['name_format'])), 'home_id' => $this->directoryHome['page_id'], 'force_home' => $this->directoryHome['force_home'], 'return' => TRUE));
                 $replace[] = empty($atts['separator']) ? '' : '<span class="cn-separator">' . $atts['separator'] . '</span>';
                 $row = str_ireplace($search, $replace, empty($atts['item_format']) ? $defaults['item_format'] : $atts['item_format']);
                 $html .= "\t" . sprintf($row, $atts['item_tag']) . PHP_EOL;
             }
         }
         $html = sprintf('<%1$s class="cn-relations">' . PHP_EOL . '%2$s</%1$s>', $atts['container_tag'], $html);
         $html = $atts['before'] . $html . $atts['after'] . PHP_EOL;
     }
     return $this->echoOrReturn($atts['return'], $html);
 }
 /**
  * Add / Edit / Copy an entry.
  *
  * @access private
  * @since  0.7.8
  *
  * @uses   absint()
  *
  * @param  string $action Valid options are: add | update
  * @param  array  $data [optional] The data to be used when adding / editing / duplicating an entry.
  * @param  int    $id [optional] If editing/duplicating an entry, the entry ID.
  *
  * @return bool
  */
 private static function process($action, $data = array(), $id = 0)
 {
     global $connections;
     /** @var cnEntry $entry */
     $entry = new cnEntry();
     // If copying/editing an entry, the entry data is loaded into the class
     // properties and then properties are overwritten by the data as needed.
     if (!empty($id)) {
         $entry->set(absint($id));
     }
     if (isset($data['entry_type'])) {
         $entry->setEntryType($data['entry_type']);
     }
     if (isset($data['family_name'])) {
         $entry->setFamilyName($data['family_name']);
     }
     isset($data['family_member']) ? $entry->setFamilyMembers($data['family_member']) : $entry->setFamilyMembers(array());
     if (isset($data['honorific_prefix'])) {
         $entry->setHonorificPrefix($data['honorific_prefix']);
     }
     if (isset($data['first_name'])) {
         $entry->setFirstName($data['first_name']);
     }
     if (isset($data['middle_name'])) {
         $entry->setMiddleName($data['middle_name']);
     }
     if (isset($data['last_name'])) {
         $entry->setLastName($data['last_name']);
     }
     if (isset($data['honorific_suffix'])) {
         $entry->setHonorificSuffix($data['honorific_suffix']);
     }
     if (isset($data['title'])) {
         $entry->setTitle($data['title']);
     }
     if (isset($data['organization'])) {
         $entry->setOrganization($data['organization']);
     }
     if (isset($data['department'])) {
         $entry->setDepartment($data['department']);
     }
     if (isset($data['contact_first_name'])) {
         $entry->setContactFirstName($data['contact_first_name']);
     }
     if (isset($data['contact_last_name'])) {
         $entry->setContactLastName($data['contact_last_name']);
     }
     isset($data['address']) ? $entry->setAddresses($data['address']) : $entry->setAddresses(array());
     isset($data['phone']) ? $entry->setPhoneNumbers($data['phone']) : $entry->setPhoneNumbers(array());
     isset($data['email']) ? $entry->setEmailAddresses($data['email']) : $entry->setEmailAddresses(array());
     isset($data['im']) ? $entry->setIm($data['im']) : $entry->setIm(array());
     isset($data['social']) ? $entry->setSocialMedia($data['social']) : $entry->setSocialMedia(array());
     //( isset($data['website']) ) ? $entry->setWebsites($data['website']) : $entry->setWebsites( array() );
     isset($data['link']) ? $entry->setLinks($data['link']) : $entry->setLinks(array());
     isset($data['date']) ? $entry->setDates($data['date']) : $entry->setDates(array());
     if (isset($data['birthday_day']) && isset($data['birthday_month'])) {
         $entry->setBirthday($data['birthday_day'], $data['birthday_month']);
     }
     if (isset($data['anniversary_day']) && isset($data['anniversary_month'])) {
         $entry->setAnniversary($data['anniversary_day'], $data['anniversary_month']);
     }
     if (isset($data['bio'])) {
         $entry->setBio($data['bio']);
     }
     if (isset($data['notes'])) {
         $entry->setNotes($data['notes']);
     }
     if (isset($data['visibility'])) {
         $entry->setVisibility($data['visibility']);
     }
     isset($data['user']) ? $entry->setUser($data['user']) : $entry->setUser(0);
     switch ($action) {
         case 'add':
             // If the entry is being copied, the source slug needs copied because it is required
             // in order to copy the source entry images to the new entry.
             if (!empty($id)) {
                 $sourceEntrySlug = rawurldecode($entry->getSlug());
                 $entry->setSlug($entry->getName(array('format' => '%first%-%last%')));
                 // If a new entry is being added, set the unique slug.
             } else {
                 $entry->setSlug($entry->getName(array('format' => '%first%-%last%')));
             }
             break;
         case 'update':
             // If an entry is being edited, set the new slug, if a new slug was provided.
             if (isset($data['slug']) && $data['slug'] != $entry->getSlug()) {
                 $entry->setSlug($data['slug']);
             }
             break;
     }
     $slug = rawurldecode($entry->getSlug());
     // Run any registered filters before processing, passing the $entry object.
     // ? Should the logo, photo and category data be passed too?
     $entry = apply_filters('cn_pre_process_' . $action . '-entry', $entry, isset($data['entry_category']) ? $data['entry_category'] : array());
     /*
      * Process the logo upload --> START <--
      */
     if (isset($_FILES['original_logo']) && $_FILES['original_logo']['error'] != 4) {
         // If an entry is being updated and a new logo is uploaded, the old logo needs to be deleted.
         // Delete the entry logo.
         self::deleteImages($entry->getLogoName(), $slug);
         // Delete logo the legacy logo, pre 8.1.
         self::deleteLegacyLogo($entry);
         // Process the newly uploaded image.
         $result = self::processLogo($slug);
         // If there were no errors processing the logo, set the values.
         if ($result) {
             $entry->setLogoLinked(TRUE);
             $entry->setLogoDisplay(TRUE);
             $entry->setLogoName($result['name']);
             $entry->setOriginalLogoMeta($result);
         } else {
             $entry->setLogoLinked(FALSE);
             $entry->setLogoDisplay(FALSE);
         }
     }
     // Don't do this if an entry is being updated.
     if ($action !== 'update') {
         // If an entry is being copied and there is a logo, the logo will be duplicated for the new entry.
         // That way if an entry is deleted, only the entry specific logo will be deleted.
         if ($entry->getLogoName() != NULL && (isset($sourceEntrySlug) && !empty($sourceEntrySlug))) {
             self::copyImages($entry->getLogoName(), $sourceEntrySlug, $slug);
         }
     }
     /*
      * If copying an entry, the logo visibility property is set based on the user's choice.
      * NOTE: This must come after the logo processing.
      */
     if (isset($data['logoOptions'])) {
         switch ($data['logoOptions']) {
             case 'remove':
                 $entry->setLogoDisplay(FALSE);
                 $entry->setLogoLinked(FALSE);
                 // Delete the entry image and its variations.
                 self::deleteImages($entry->getLogoName(), $slug);
                 // Delete logo the legacy logo, pre 8.1.
                 self::deleteLegacyLogo($entry);
                 $entry->setLogoName(NULL);
                 break;
             case 'hidden':
                 $entry->setLogoDisplay(FALSE);
                 break;
             case 'show':
                 $entry->setLogoDisplay(TRUE);
                 break;
             default:
                 $entry->setLogoDisplay(FALSE);
                 break;
         }
     }
     /*
      * Process the logo upload --> END <--
      */
     /*
      * Process the image upload. --> START <--
      */
     if (isset($_FILES['original_image']) && $_FILES['original_image']['error'] != 4) {
         // Delete the entry image and its variations.
         self::deleteImages($entry->getImageNameOriginal(), $slug);
         // Delete any legacy images, pre 8.1, that may exist.
         self::deleteLegacyImages($entry);
         // Process the newly uploaded image.
         $result = self::processImage($slug);
         // If there were no errors processing the image, set the values.
         if ($result) {
             $entry->setImageLinked(TRUE);
             $entry->setImageDisplay(TRUE);
             $entry->setImageNameOriginal($result['image_names']['original']);
             $entry->setOriginalImageMeta($result['image']['original']['meta']);
         } else {
             $entry->setImageLinked(FALSE);
             $entry->setImageDisplay(FALSE);
         }
     }
     // Don't do this if an entry is being updated.
     if ($action !== 'update') {
         // If an entry is being copied and there is an image, the image will be duplicated for the new entry.
         // That way if an entry is deleted, only the entry specific images will be deleted.
         if ($entry->getImageNameOriginal() != NULL && (isset($sourceEntrySlug) && !empty($sourceEntrySlug))) {
             self::copyImages($entry->getImageNameOriginal(), $sourceEntrySlug, $slug);
         }
     }
     // If copying an entry, the image visibility property is set based on the user's choice.
     // NOTE: This must come after the image processing.
     if (isset($data['imgOptions'])) {
         switch ($data['imgOptions']) {
             case 'remove':
                 $entry->setImageDisplay(FALSE);
                 $entry->setImageLinked(FALSE);
                 // Delete the entry image and its variations.
                 self::deleteImages($entry->getImageNameOriginal(), $slug);
                 // Delete any legacy images, pre 8.1, that may exist.
                 self::deleteLegacyImages($entry);
                 $entry->setImageNameOriginal(NULL);
                 break;
             case 'hidden':
                 $entry->setImageDisplay(FALSE);
                 break;
             case 'show':
                 $entry->setImageDisplay(TRUE);
                 break;
             default:
                 $entry->setImageDisplay(FALSE);
                 break;
         }
     }
     /*
      * Process the image upload. --> END <--
      */
     switch ($action) {
         case 'add':
             // Set moderation status per role capability assigned to the current user.
             if (current_user_can('connections_add_entry')) {
                 $entry->setStatus('approved');
                 $messageID = 'entry_added';
             } elseif (current_user_can('connections_add_entry_moderated')) {
                 $entry->setStatus('pending');
                 $messageID = 'entry_added_moderated';
             } else {
                 $entry->setStatus('pending');
                 $messageID = 'entry_added_moderated';
             }
             // Save the entry to the database. On fail store error message.
             if ($entry->save() == FALSE) {
                 cnMessage::set('error', 'entry_added_failed');
                 return FALSE;
             } else {
                 cnMessage::set('success', $messageID);
                 $entryID = (int) $connections->lastInsertID;
                 $entry->setID($entryID);
             }
             break;
         case 'update':
             // Set moderation status per role capability assigned to the current user.
             if (current_user_can('connections_edit_entry')) {
                 if ($entry->getStatus() == 'pending' && current_user_can('connections_add_entry_moderated')) {
                     $entry->setStatus('pending');
                     $messageID = 'entry_updated_moderated';
                 } elseif ($entry->getStatus() == 'approved' && current_user_can('connections_add_entry_moderated')) {
                     $entry->setStatus('approved');
                     $messageID = 'entry_updated';
                 } elseif ($entry->getStatus() == 'pending' && current_user_can('connections_add_entry')) {
                     $entry->setStatus('approved');
                     $messageID = 'entry_updated';
                 } elseif ($entry->getStatus() == 'approved' && current_user_can('connections_add_entry')) {
                     $entry->setStatus('approved');
                     $messageID = 'entry_updated';
                 } else {
                     // $entry->setStatus( 'pending' );
                     // $messageID = 'entry_updated_moderated';
                     $messageID = 'entry_updated';
                 }
             } elseif (current_user_can('connections_edit_entry_moderated')) {
                 $entry->setStatus('pending');
                 $messageID = 'entry_updated_moderated';
             } else {
                 $entry->setStatus('pending');
                 $messageID = 'entry_updated_moderated';
             }
             // Update the entry to the database. On fail store error message.
             if ($entry->update() == FALSE) {
                 cnMessage::set('error', 'entry_updated_failed');
                 return FALSE;
             } else {
                 cnMessage::set('success', $messageID);
                 $entryID = (int) $entry->getId();
             }
             break;
     }
     do_action('cn_process_taxonomy-category', $action, $entryID);
     do_action('cn_process_meta-entry', $action, $entryID);
     // Refresh the cnEntry object with any updated taxonomy or meta data
     // that may have been added/updated via actions.
     $entry->set($entryID);
     // Run any registered post process actions.
     do_action("cn_post_process_{$action}-entry", $entry);
     return $entryID;
 }
 /**
  * Prepare a single post output for response.
  *
  * @param cnEntry         $entry   Post object.
  * @param WP_REST_Request $request Request object.
  *
  * @return WP_REST_Response $data
  */
 public function prepare_item_for_response($entry, $request)
 {
     //$entry->directoryHome(
     //	array(
     //		'page_id'    => $homeID,
     //		'force_home' => $forceHome,
     //	)
     //);
     $addresses = $entry->getAddresses();
     /**
      * NOTES:
      *
      *  - The `coordinates` index array value must not have indexes otherwise it'll be converted to an object
      * which is invalid geoJSON.
      *  - The `coordinates` must but cast as floats otherwise they'll be converted to strings.
      *  - The `coordinates` must be longitude, latitude order per the geoJSON spec.
      *
      * @todo Loop thu each address within an entry so a geoJSON `feature` is added for each address the entry may have.
      * @todo The entry only needs to be added to $entries if it has at least one address and those address has both a latitude and longitude.
      *
      * @link http://connections-pro.com/support/topic/map-view/#post-319981
      */
     if ((!isset($addresses[0]->latitude) || empty($addresses[0]->latitude)) && (!isset($addresses[0]->longitude) || empty($addresses[0]->longitude))) {
         //return;
     }
     switch ($entry->getEntryType()) {
         case 'individual':
             $type = 'Person';
             break;
         case 'organization':
             $type = 'Organization';
             break;
         case 'family':
             $type = 'Family';
             break;
         default:
             $type = NULL;
     }
     $data = array('type' => 'Feature', 'geometry' => array('type' => 'Point', 'coordinates' => array((double) $addresses[0]->longitude, (double) $addresses[0]->latitude)), 'properties' => array('id' => $entry->getId(), 'type' => $type, 'slug' => $entry->getSlug(), 'permalink' => $entry->getPermalink(), 'name' => $entry->getName(), 'title' => $entry->getTitle(), 'department' => $entry->getDepartment() ? array('@type' => 'Organization', 'name' => $entry->getDepartment()) : NULL, 'organization' => $entry->getOrganization() ? array('@type' => 'Organization', 'name' => $entry->getOrganization()) : NULL, 'bio' => $entry->getBio(), 'notes' => $entry->getNotes()));
     // Wrap the data in a response object.
     $response = rest_ensure_response($data);
     return $response;
 }
示例#8
0
 /**
  * Add the the current Connections directory location/query to the page title.
  *
  * NOTE: $id really isn't optional, some plugins fail to use the `the_title` filter correctly,
  * ie. "Display Posts Shortcode", causes Connections to crash an burn if not supplied.
  *
  * @access private
  * @since  0.7.8
  * @static
  *
  * @uses   get_query_var()
  *
  * @param  string $title The browser tab/window title.
  * @param  int    $id    The page/post ID.
  *
  * @return string
  */
 public static function filterPostTitle($title, $id = 0)
 {
     global $wp_query, $post;
     // Whether or not to filter the page title with the current directory location.
     if (!cnSettingsAPI::get('connections', 'seo', 'page_title')) {
         return $title;
     }
     if (!is_object($post) || (!isset($wp_query->post) || !isset($wp_query->post->ID) || $wp_query->post->ID != $id) || !self::$filterPermalink) {
         return $title;
     }
     // Coerce $title to be an array.
     $title = (array) $title;
     if (get_query_var('cn-cat-slug')) {
         // If the category slug is a descendant, use the last slug from the URL for the query.
         $categorySlug = explode('/', get_query_var('cn-cat-slug'));
         if (isset($categorySlug[count($categorySlug) - 1])) {
             $categorySlug = $categorySlug[count($categorySlug) - 1];
         }
         $term = cnTerm::getBy('slug', $categorySlug, 'category');
         $category = new cnCategory($term);
         array_unshift($title, $category->getName());
     }
     if (get_query_var('cn-cat')) {
         if (is_array(get_query_var('cn-cat'))) {
             return implode('', $title);
         }
         $categoryID = get_query_var('cn-cat');
         $term = cnTerm::getBy('id', $categoryID, 'category');
         $category = new cnCategory($term);
         array_unshift($title, $category->getName());
     }
     if (get_query_var('cn-country')) {
         array_unshift($title, urldecode(get_query_var('cn-country')));
     }
     if (get_query_var('cn-postal-code')) {
         array_unshift($title, urldecode(get_query_var('cn-postal-code')));
     }
     if (get_query_var('cn-region')) {
         array_unshift($title, urldecode(get_query_var('cn-region')));
     }
     if (get_query_var('cn-locality')) {
         array_unshift($title, urldecode(get_query_var('cn-locality')));
     }
     if (get_query_var('cn-organization')) {
         array_unshift($title, urldecode(get_query_var('cn-organization')));
     }
     if (get_query_var('cn-department')) {
         array_unshift($title, urldecode(get_query_var('cn-department')));
     }
     if (get_query_var('cn-entry-slug')) {
         // Grab an instance of the Connections object.
         $instance = Connections_Directory();
         $result = $instance->retrieve->entries(array('slug' => urldecode(get_query_var('cn-entry-slug'))));
         // Make sure an entry is returned and if not, return $title unaltered.
         if (empty($result)) {
             return implode(' &raquo; ', $title);
         }
         $entry = new cnEntry($result[0]);
         array_unshift($title, $entry->getName());
     }
     return implode(' &raquo; ', $title);
 }
 /**
  * Prepare a single post output for response.
  *
  * @param cnEntry         $entry   Post object.
  * @param WP_REST_Request $request Request object.
  *
  * @return WP_REST_Response $data
  */
 public function prepare_item_for_response($entry, $request)
 {
     $data = array();
     //$entry->directoryHome(
     //	array(
     //		'page_id'    => $homeID,
     //		'force_home' => $forceHome,
     //	)
     //);
     switch ($entry->getEntryType()) {
         case 'individual':
             $data['@type'] = 'Person';
             $data['honorificPrefix'] = $entry->getHonorificPrefix();
             $data['givenName'] = $entry->getFirstName();
             $data['additionalName'] = $entry->getMiddleName();
             $data['familyName'] = $entry->getLastName();
             $data['honorificSuffix'] = $entry->getHonorificSuffix();
             break;
         case 'organization':
             $data['@type'] = 'Organization';
             $data['name'] = $entry->getName();
             break;
         case 'family':
             /**
              * Unfortunately there is no "Family" type available.
              * Use "Person" as the type with the "additionalType" set as "Family". Valid? Unsure.
              *
              * NOTES: Perhaps if "Family" is merged in from @link http://historical-data.org/ it can be used.
              */
             $data['@type'] = 'Person';
             $data['additionalType'] = 'Family';
             $data['name'] = $entry->getName();
             break;
         default:
             /** @todo add filter for custom entry types */
     }
     /**
      * NOTES:
      *
      *  - Social network links should use the sameAs property as an array.
      */
     // Wrap the data in a response object.
     $response = rest_ensure_response($data);
     return $response;
 }
 /**
  * The core method that processes the content according to the
  * entry part that the shortcode should add to the content.
  *
  * @access private
  * @since 0.8
  * @param  array  $atts    The shortcode attributes array.
  * @param  string $content The content captured between an open/close shortcode.
  * @param  string $tag     The shortcode tag.
  *
  * @return string          The processed content.
  */
 public function shortcode($atts, $content = '', $tag = 'cn_entry')
 {
     // Bail if self::$entry is not set because an instance of the cnEntry object is required.
     if (is_null($this->entry)) {
         return '';
     }
     $defaults = array('part' => '');
     // Normally we'd use shortcode_atts, but that strips keys from $atts that do not exist in $defaults.
     // Since $atts can contain various option for the different callback methods, we'll use wp_parse_args()
     // which leaves keys that do not exist in $atts.
     $atts = wp_parse_args($atts, $defaults);
     // All the core methods in the cnEntry_HTML class echo by default, make sure to return instead.
     $atts['return'] = TRUE;
     switch ($atts['part']) {
         case 'name':
             $out = $this->entry->getName($atts);
             break;
         case 'title':
             $out = $this->entry->getTitle();
             break;
         case 'organization':
             $out = $this->entry->getOrganization();
             break;
         case 'department':
             $out = $this->entry->getDepartment();
             break;
         case 'contact':
             $out = $this->entry->getContactName($atts);
             break;
         case 'family_relationships':
             $out = $this->entry->getFamilyMembers();
             break;
         case 'addresses':
             add_shortcode('cn_address', array($this, 'address'));
             $out = has_shortcode($content, 'cn_address') ? do_shortcode($content) : '';
             remove_shortcode('cn_address');
             break;
         case 'phone_numbers':
             add_shortcode('cn_phone', array($this, 'phone'));
             $out = has_shortcode($content, 'cn_phone') ? do_shortcode($content) : '';
             remove_shortcode('cn_phone');
             break;
         case 'email':
             add_shortcode('cn_email', array($this, 'email'));
             $out = has_shortcode($content, 'cn_email') ? do_shortcode($content) : '';
             remove_shortcode('cn_email');
             break;
         case 'im':
             add_shortcode('cn_im', array($this, 'im'));
             $out = has_shortcode($content, 'cn_im') ? do_shortcode($content) : '';
             remove_shortcode('cn_im');
             break;
         case 'social_networks':
             add_shortcode('cn_social_network', array($this, 'socialNetwork'));
             $out = has_shortcode($content, 'cn_social_network') ? do_shortcode($content) : '';
             remove_shortcode('cn_social_network');
             break;
         case 'links':
             add_shortcode('cn_link', array($this, 'link'));
             $out = has_shortcode($content, 'cn_link') ? do_shortcode($content) : '';
             remove_shortcode('cn_link');
             break;
         case 'dates':
             add_shortcode('cn_date', array($this, 'date'));
             $out = has_shortcode($content, 'cn_date') ? do_shortcode($content) : '';
             remove_shortcode('cn_date');
             break;
         case 'bio':
             $out = $this->entry->getBio();
             break;
         case 'notes':
             $out = $this->entry->getNotes();
             break;
         default:
             // Custom shortcodes can be applied to the content using this filter.
             $out = apply_filters('cn_entry_part-' . $atts['part'], $content, $atts, $this->entry);
             break;
     }
     return $out;
 }
示例#11
0
function connectionsShowViewPage($action = NULL)
{
    // Grab an instance of the Connections object.
    $instance = Connections_Directory();
    $queryVars = array();
    echo '<div class="wrap">';
    switch ($action) {
        case 'add_entry':
            echo '<h1>Connections : ', __('Add Entry', 'connections'), '</h1>';
            /*
             * Check whether current user can add an entry.
             */
            if (current_user_can('connections_add_entry') || current_user_can('connections_add_entry_moderated')) {
                $form = new cnFormObjects();
                $entry = new cnOutput();
                $attr = array('id' => 'cn-form', 'method' => 'post', 'enctype' => 'multipart/form-data');
                $form->open($attr);
                $field = array('id' => 'metabox-name', 'title' => __('Name', 'connections'), 'context' => 'normal', 'priority' => 'high', 'callback' => array('cnEntryMetabox', 'name'));
                cnMetabox_Render::add($instance->pageHook->add, $field);
                echo '<div id="poststuff">';
                echo '<div id="post-body" class="metabox-holder columns-' . (1 == get_current_screen()->get_columns() ? '1' : '2') . '">';
                wp_nonce_field('cn-manage-metaboxes');
                wp_nonce_field('closedpostboxes', 'closedpostboxesnonce', FALSE);
                wp_nonce_field('meta-box-order', 'meta-box-order-nonce', FALSE);
                $form->tokenField('add_entry', FALSE, '_cn_wpnonce', FALSE);
                do_action('cn_admin_form_add_entry_before', $entry, $form);
                echo '<div id="postbox-container-1" class="postbox-container">';
                echo '<div id="side-sortables" class="meta-box-sortables ui-sortable">';
                do_meta_boxes($instance->pageHook->add, 'side', $entry);
                echo '</div> <!-- #side-sortables -->';
                echo '</div> <!-- #postbox-container-1 -->';
                echo '<div id="postbox-container-2" class="postbox-container">';
                echo '<div id="normal-sortables" class="meta-box-sortables ui-sortable">';
                do_meta_boxes($instance->pageHook->add, 'normal', $entry);
                echo '</div> <!-- #normal-sortables -->';
                echo '</div> <!-- #postbox-container-2 -->';
                do_action('cn_admin_form_add_entry_after', $entry, $form);
                echo '</div> <!-- #post-body -->';
                echo '<br class="clear">';
                echo '</div> <!-- #poststuff -->';
                $form->close();
                unset($entry);
            } else {
                cnMessage::render('error', __('You are not authorized to add entries. Please contact the admin if you received this message in error.', 'connections'));
            }
            break;
        case 'copy_entry':
            echo '<div class="wrap">';
            echo '<h1>Connections : ', __('Copy Entry', 'connections'), '</h1>';
            /*
             * Check whether current user can add an entry.
             */
            if (current_user_can('connections_add_entry') || current_user_can('connections_add_entry_moderated')) {
                $id = esc_attr($_GET['id']);
                check_admin_referer('entry_copy_' . $id);
                $form = new cnFormObjects();
                $entry = new cnOutput($instance->retrieve->entry($id));
                $attr = array('id' => 'cn-form', 'method' => 'post', 'enctype' => 'multipart/form-data');
                $form->open($attr);
                $field = array('id' => 'metabox-name', 'title' => __('Name', 'connections'), 'context' => 'normal', 'priority' => 'high', 'callback' => array('cnEntryMetabox', 'name'));
                cnMetabox_Render::add($instance->pageHook->manage, $field);
                echo '<div id="poststuff">';
                echo '<div id="post-body" class="metabox-holder columns-' . (1 == get_current_screen()->get_columns() ? '1' : '2') . '">';
                wp_nonce_field('cn-manage-metaboxes');
                wp_nonce_field('closedpostboxes', 'closedpostboxesnonce', FALSE);
                wp_nonce_field('meta-box-order', 'meta-box-order-nonce', FALSE);
                $form->tokenField('add_entry', FALSE, '_cn_wpnonce', FALSE);
                do_action('cn_admin_form_copy_entry_before', $entry, $form);
                echo '<div id="postbox-container-1" class="postbox-container">';
                echo '<div id="side-sortables" class="meta-box-sortables ui-sortable">';
                do_meta_boxes($instance->pageHook->manage, 'side', $entry);
                echo '</div> <!-- #side-sortables -->';
                echo '</div> <!-- #postbox-container-1 -->';
                echo '<div id="postbox-container-2" class="postbox-container">';
                echo '<div id="normal-sortables" class="meta-box-sortables ui-sortable">';
                do_meta_boxes($instance->pageHook->manage, 'normal', $entry);
                echo '</div> <!-- #normal-sortables -->';
                echo '</div> <!-- #postbox-container-2 -->';
                do_action('cn_admin_form_copy_entry_after', $entry, $form);
                echo '</div> <!-- #post-body -->';
                echo '<br class="clear">';
                echo '</div> <!-- #poststuff -->';
                $form->close();
                unset($entry);
            } else {
                cnMessage::render('error', __('You are not authorized to add entries. Please contact the admin if you received this message in error.', 'connections'));
            }
            break;
        case 'edit_entry':
            echo '<h1>Connections : ', __('Edit Entry', 'connections'), '</h1>';
            /*
             * Check whether the current user can edit entries.
             */
            if (current_user_can('connections_edit_entry') || current_user_can('connections_edit_entry_moderated')) {
                $id = esc_attr($_GET['id']);
                check_admin_referer('entry_edit_' . $id);
                $form = new cnFormObjects();
                $entry = new cnOutput($instance->retrieve->entry($id));
                $attr = array('id' => 'cn-form', 'action' => 'admin.php?connections_process=true&process=manage&action=update&id=' . $id, 'method' => 'post', 'enctype' => 'multipart/form-data');
                $form->open($attr);
                $field = array('id' => 'metabox-name', 'title' => __('Name', 'connections'), 'context' => 'normal', 'priority' => 'high', 'callback' => array('cnEntryMetabox', 'name'));
                cnMetabox_Render::add($instance->pageHook->manage, $field);
                echo '<div id="poststuff">';
                echo '<div id="post-body" class="metabox-holder columns-' . (1 == get_current_screen()->get_columns() ? '1' : '2') . '">';
                wp_nonce_field('cn-manage-metaboxes');
                wp_nonce_field('closedpostboxes', 'closedpostboxesnonce', FALSE);
                wp_nonce_field('meta-box-order', 'meta-box-order-nonce', FALSE);
                $form->tokenField('update_entry', FALSE, '_cn_wpnonce', FALSE);
                do_action('cn_admin_form_edit_entry_before', $entry, $form);
                echo '<div id="postbox-container-1" class="postbox-container">';
                echo '<div id="side-sortables" class="meta-box-sortables ui-sortable">';
                do_meta_boxes($instance->pageHook->manage, 'side', $entry);
                echo '</div> <!-- #side-sortables -->';
                echo '</div> <!-- #postbox-container-1 -->';
                echo '<div id="postbox-container-2" class="postbox-container">';
                echo '<div id="normal-sortables" class="meta-box-sortables ui-sortable">';
                do_meta_boxes($instance->pageHook->manage, 'normal', $entry);
                echo '</div> <!-- #normal-sortables -->';
                echo '</div> <!-- #postbox-container-2 -->';
                do_action('cn_admin_form_edit_entry_after', $entry, $form);
                echo '</div> <!-- #post-body -->';
                echo '<br class="clear">';
                echo '</div> <!-- #poststuff -->';
                $form->close();
                unset($entry);
            } else {
                cnMessage::render('error', __('You are not authorized to edit entries. Please contact the admin if you received this message in error.', 'connections'));
            }
            break;
        default:
            $form = new cnFormObjects();
            $page = $instance->currentUser->getFilterPage('manage');
            $offset = ($page->current - 1) * $page->limit;
            echo '<div class="wrap">';
            echo '<h1>Connections : ', __('Manage', 'connections'), ' <a class="button add-new-h2" href="admin.php?page=connections_add">', __('Add New', 'connections'), '</a></h1>';
            /*
             * Check whether user can view the entry list
             */
            if (current_user_can('connections_manage')) {
                $retrieveAttr['list_type'] = $instance->currentUser->getFilterEntryType();
                $retrieveAttr['category'] = $instance->currentUser->getFilterCategory();
                $retrieveAttr['char'] = isset($_GET['cn-char']) && 0 < strlen($_GET['cn-char']) ? esc_attr($_GET['cn-char']) : '';
                $retrieveAttr['visibility'] = $instance->currentUser->getFilterVisibility();
                $retrieveAttr['status'] = $instance->currentUser->getFilterStatus();
                $retrieveAttr['limit'] = $page->limit;
                $retrieveAttr['offset'] = $offset;
                if (isset($_GET['s']) && !empty($_GET['s'])) {
                    $retrieveAttr['search_terms'] = $_GET['s'];
                }
                $results = $instance->retrieve->entries($retrieveAttr);
                // print_r($instance->lastQuery);
                ?>

				<?php 
                if (current_user_can('connections_edit_entry')) {
                    ?>

				<ul class="subsubsub">

					<?php 
                    $statuses = array('all' => __('All', 'connections'), 'approved' => __('Approved', 'connections'), 'pending' => __('Moderate', 'connections'));
                    foreach ($statuses as $key => $status) {
                        $subsubsub[] = sprintf('<li><a%1$shref="%2$s">%3$s</a> <span class="count">(%4$d)</span></li>', $instance->currentUser->getFilterStatus() == $key ? ' class="current" ' : ' ', esc_url($form->tokenURL(add_query_arg(array('page' => 'connections_manage', 'cn-action' => 'filter', 'status' => $key)), 'filter')), $status, cnRetrieve::recordCount(array('status' => $key)));
                    }
                    echo implode(' | ', $subsubsub);
                    ?>

				</ul>

				<?php 
                }
                ?>

				<form method="post">

					<?php 
                $searchTerm = isset($_GET['s']) && !empty($_GET['s']) ? $_GET['s'] : '';
                ?>

					<p class="search-box">
						<label class="screen-reader-text" for="entry-search-input"><?php 
                _e('Search Entries', 'connections');
                ?>
:</label>
						<input type="search" id="entry-search-input" name="s" value="<?php 
                esc_attr_e($searchTerm);
                ?>
" />
						<input type="submit" name="" id="search-submit" class="button" value="<?php 
                _e('Search Entries', 'connections');
                ?>
"  />
					</p>

					<?php 
                $form->tokenField('cn_manage_actions');
                ?>

					<input type="hidden" name="cn-action" value="manage_actions"/>

					<div class="tablenav">

						<div class="alignleft actions">
							<?php 
                cnTemplatePart::walker('term-select', array('name' => 'category', 'show_option_all' => __('Show All Categories', 'connections'), 'hide_empty' => FALSE, 'hierarchical' => TRUE, 'show_count' => FALSE, 'orderby' => 'name', 'selected' => $instance->currentUser->getFilterCategory()));
                echo $form->buildSelect('entry_type', array('all' => __('Show All Entries', 'connections'), 'individual' => __('Show Individuals', 'connections'), 'organization' => __('Show Organizations', 'connections'), 'family' => __('Show Families', 'connections')), $instance->currentUser->getFilterEntryType());
                /*
                 * Builds the visibility select list base on current user capabilities.
                 */
                if (current_user_can('connections_view_public') || $instance->options->getAllowPublic()) {
                    $visibilitySelect['public'] = __('Show Public', 'connections');
                }
                if (current_user_can('connections_view_private')) {
                    $visibilitySelect['private'] = __('Show Private', 'connections');
                }
                if (current_user_can('connections_view_unlisted')) {
                    $visibilitySelect['unlisted'] = __('Show Unlisted', 'connections');
                }
                if (isset($visibilitySelect)) {
                    /*
                     * Add the 'Show All' option and echo the list.
                     */
                    $showAll['all'] = __('Show All', 'connections');
                    $visibilitySelect = $showAll + $visibilitySelect;
                    echo $form->buildSelect('visibility_type', $visibilitySelect, $instance->currentUser->getFilterVisibility());
                }
                ?>

							<input class="button-secondary action" type="submit" name="filter" value="Filter"/>

						</div>

						<div class="tablenav-pages">
							<?php 
                echo '<span class="displaying-num">' . sprintf(__('Displaying %1$d of %2$d entries.', 'connections'), $instance->resultCount, $instance->resultCountNoLimit) . '</span>';
                /*
                 * // START --> Pagination
                 *
                 * Grab the pagination data again in case a filter reset the values
                 * or the user input an invalid number which the retrieve query would have reset.
                 */
                $page = $instance->currentUser->getFilterPage('manage');
                $pageCount = ceil($instance->resultCountNoLimit / $page->limit);
                if ($pageCount > 1) {
                    $pageDisabled = array();
                    $pageFilterURL = array();
                    $pageValue = array();
                    $currentPageURL = add_query_arg(array('page' => FALSE, 'cn-action' => 'filter'));
                    $pageValue['first_page'] = 1;
                    $pageValue['previous_page'] = $page->current - 1 >= 1 ? $page->current - 1 : 1;
                    $pageValue['next_page'] = $page->current + 1 <= $pageCount ? $page->current + 1 : $pageCount;
                    $pageValue['last_page'] = $pageCount;
                    $page->current > 1 ? $pageDisabled['first_page'] = '' : ($pageDisabled['first_page'] = ' disabled');
                    $page->current - 1 >= 1 ? $pageDisabled['previous_page'] = '' : ($pageDisabled['previous_page'] = ' disabled');
                    $page->current + 1 <= $pageCount ? $pageDisabled['next_page'] = '' : ($pageDisabled['next_page'] = ' disabled');
                    $page->current < $pageCount ? $pageDisabled['last_page'] = '' : ($pageDisabled['last_page'] = ' disabled');
                    /*
                     * Generate the page link token URL.
                     */
                    $pageFilterURL['first_page'] = esc_url($form->tokenURL(add_query_arg(array('pg' => $pageValue['first_page']), $currentPageURL), 'filter'));
                    $pageFilterURL['previous_page'] = esc_url($form->tokenURL(add_query_arg(array('pg' => $pageValue['previous_page']), $currentPageURL), 'filter'));
                    $pageFilterURL['next_page'] = esc_url($form->tokenURL(add_query_arg(array('pg' => $pageValue['next_page']), $currentPageURL), 'filter'));
                    $pageFilterURL['last_page'] = esc_url($form->tokenURL(add_query_arg(array('pg' => $pageValue['last_page']), $currentPageURL), 'filter'));
                    echo '<span class="page-navigation" id="page-input">';
                    echo '<a href="' . $pageFilterURL['first_page'] . '" title="' . __('Go to the first page.', 'connections') . '" class="first-page', $pageDisabled['first_page'], '">&laquo;</a> ';
                    echo '<a href="' . $pageFilterURL['previous_page'] . '" title="' . __('Go to the previous page.', 'connections') . '" class="prev-page', $pageDisabled['previous_page'], '">&lsaquo;</a> ';
                    echo '<span class="paging-input"><input type="text" size="2" value="' . $page->current . '" name="pg" title="' . __('Current page', 'connections') . '" class="current-page"> ' . __('of', 'connections') . ' <span class="total-pages">' . $pageCount . '</span></span> ';
                    echo '<a href="' . $pageFilterURL['next_page'] . '" title="' . __('Go to the next page.', 'connections') . '" class="next-page', $pageDisabled['next_page'], '">&rsaquo;</a> ';
                    echo '<a href="' . $pageFilterURL['last_page'] . '" title="' . __('Go to the last page.', 'connections') . '" class="last-page', $pageDisabled['last_page'], '">&raquo;</a>';
                    echo '</span>';
                }
                /*
                 * // END --> Pagination
                 */
                ?>
						</div>

					</div>
					<div class="clear"></div>
					<div class="tablenav" style="height: auto;">

						<?php 
                if (current_user_can('connections_edit_entry') || current_user_can('connections_delete_entry')) {
                    echo '<div class="alignleft actions">';
                    echo '<select name="action">';
                    echo '<option value="" SELECTED>', __('Bulk Actions', 'connections'), '</option>';
                    $bulkActions = array();
                    if (current_user_can('connections_edit_entry') || current_user_can('connections_edit_entry_moderated')) {
                        $bulkActions['unapprove'] = __('Unapprove', 'connections');
                        $bulkActions['approve'] = __('Approve', 'connections');
                        $bulkActions['public'] = __('Set Public', 'connections');
                        $bulkActions['private'] = __('Set Private', 'connections');
                        $bulkActions['unlisted'] = __('Set Unlisted', 'connections');
                    }
                    if (current_user_can('connections_delete_entry')) {
                        $bulkActions['delete'] = __('Delete', 'connections');
                    }
                    $bulkActions = apply_filters('cn_manage_bulk_actions', $bulkActions);
                    foreach ($bulkActions as $action => $string) {
                        echo '<option value="', $action, '">', $string, '</option>';
                    }
                    echo '</select>';
                    echo '<input class="button-secondary action" type="submit" name="bulk_action" value="', __('Apply', 'connections'), '" />';
                    echo '</div>';
                }
                ?>

						<div class="tablenav-pages" style="height: auto; max-width: 75%; text-align: right;">
							<?php 
                /*
                 * Display the character filter control.
                 */
                echo '<span class="displaying-num">', __('Filter by character:', 'connections'), '</span>';
                cnTemplatePart::index(array('status' => $instance->currentUser->getFilterStatus(), 'visibility' => $instance->currentUser->getFilterVisibility(), 'tag' => 'span'));
                cnTemplatePart::currentCharacter();
                ?>
						</div>
					</div>
					<div class="clear"></div>

			       	<table cellspacing="0" class="widefat connections">
						<thead>
				            <tr>
				                <td class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"/></td>
								<th class="col" style="width:10%;"></th>
								<th scope="col" colspan="2" style="width:40%;"><?php 
                _e('Name', 'connections');
                ?>
</th>
								<th scope="col" style="width:30%;"><?php 
                _e('Categories', 'connections');
                ?>
</th>
								<th scope="col" style="width:20%;"><?php 
                _e('Last Modified', 'connections');
                ?>
</th>
				            </tr>
						</thead>
						<tfoot>
				            <tr>
				                <td class="manage-column column-cb check-column" scope="col"><input type="checkbox"/></td>
								<th class="col" style="width:10%;"></th>
								<th scope="col" colspan="2" style="width:40%;"><?php 
                _e('Name', 'connections');
                ?>
</th>
								<th scope="col" style="width:30%;"><?php 
                _e('Categories', 'connections');
                ?>
</th>
								<th scope="col" style="width:20%;"><?php 
                _e('Last Modified', 'connections');
                ?>
</th>
				            </tr>
						</tfoot>
						<tbody>

				<?php 
                $previousLetter = '';
                foreach ($results as $row) {
                    /**
                     *
                     *
                     * @TODO: Use the Output class to show entry details.
                     */
                    $entry = new cnOutput($row);
                    $currentLetter = strtoupper(mb_substr($entry->getSortColumn(), 0, 1));
                    if ($currentLetter != $previousLetter) {
                        $setAnchor = "<a name='{$currentLetter}'></a>";
                        $previousLetter = $currentLetter;
                    } else {
                        $setAnchor = null;
                    }
                    /*
                     * Generate the edit, copy and delete URLs with nonce tokens.
                     */
                    $editTokenURL = esc_url($form->tokenURL('admin.php?page=connections_manage&cn-action=edit_entry&id=' . $entry->getId(), 'entry_edit_' . $entry->getId()));
                    $copyTokenURL = esc_url($form->tokenURL('admin.php?page=connections_manage&cn-action=copy_entry&id=' . $entry->getId(), 'entry_copy_' . $entry->getId()));
                    $deleteTokenURL = esc_url($form->tokenURL('admin.php?cn-action=delete_entry&id=' . $entry->getId(), 'entry_delete_' . $entry->getId()));
                    $approvedTokenURL = esc_url($form->tokenURL('admin.php?cn-action=set_status&status=approved&id=' . $entry->getId(), 'entry_status_' . $entry->getId()));
                    $unapproveTokenURL = esc_url($form->tokenURL('admin.php?cn-action=set_status&status=pending&id=' . $entry->getId(), 'entry_status_' . $entry->getId()));
                    switch ($entry->getStatus()) {
                        case 'pending':
                            $statusClass = ' unapproved';
                            break;
                        case 'approved':
                            $statusClass = ' approved';
                            break;
                        default:
                            $statusClass = '';
                            break;
                    }
                    echo '<tr id="row-', $entry->getId(), '" class="parent-row' . $statusClass . '">';
                    echo "<th class='check-column' scope='row'><input type='checkbox' value='" . $entry->getId() . "' name='id[]'/></th> \n";
                    echo '<td>';
                    $entry->getImage(array('image' => 'photo', 'height' => 54, 'width' => 80, 'zc' => 2, 'fallback' => array('type' => 'block', 'string' => __('No Photo Available', 'connections'))));
                    echo '</td>';
                    echo '<td  colspan="2">';
                    if ($setAnchor) {
                        echo $setAnchor;
                    }
                    echo '<div style="float:right"><a href="#wphead" title="Return to top."><img src="' . CN_URL . 'assets/images/uparrow.gif" /></a></div>';
                    if (current_user_can('connections_edit_entry') || current_user_can('connections_edit_entry_moderated')) {
                        echo '<a class="row-title" title="Edit ' . $entry->getName(array('format' => '%last%, %first%')) . '" href="' . $editTokenURL . '"> ' . $entry->getName(array('format' => '%last%, %first%')) . '</a><br />';
                    } else {
                        echo '<strong>' . $entry->getName(array('format' => '%last%, %first%')) . '</strong>';
                    }
                    echo '<div class="row-actions">';
                    $rowActions = array();
                    $rowEditActions = array();
                    $rowActions[] = '<a class="detailsbutton" id="row-' . $entry->getId() . '" title="' . __('Click to show details.', 'connections') . '" >' . __('Show Details', 'connections') . '</a>';
                    $rowActions[] = $entry->vcard(array('text' => __('vCard', 'connections'), 'return' => TRUE));
                    $rowActions[] = cnURL::permalink(array('slug' => $entry->getSlug(), 'title' => sprintf(__('View %s', 'connections'), $entry->getName(array('format' => '%first% %last%'))), 'text' => __('View', 'connections'), 'return' => TRUE));
                    if ($entry->getStatus() == 'approved' && current_user_can('connections_edit_entry')) {
                        $rowEditActions[] = '<a class="action unapprove" href="' . $unapproveTokenURL . '" title="' . __('Unapprove', 'connections') . ' ' . $entry->getFullFirstLastName() . '">' . __('Unapprove', 'connections') . '</a>';
                    }
                    if ($entry->getStatus() == 'pending' && current_user_can('connections_edit_entry')) {
                        $rowEditActions[] = '<a class="action approve" href="' . $approvedTokenURL . '" title="' . __('Approve', 'connections') . ' ' . $entry->getFullFirstLastName() . '">' . __('Approve', 'connections') . '</a>';
                    }
                    if (current_user_can('connections_edit_entry') || current_user_can('connections_edit_entry_moderated')) {
                        $rowEditActions[] = '<a class="editbutton" href="' . $editTokenURL . '" title="' . __('Edit', 'connections') . ' ' . $entry->getFullFirstLastName() . '">' . __('Edit', 'connections') . '</a>';
                    }
                    if (current_user_can('connections_add_entry') || current_user_can('connections_add_entry_moderated')) {
                        $rowEditActions[] = '<a class="copybutton" href="' . $copyTokenURL . '" title="' . __('Copy', 'connections') . ' ' . $entry->getFullFirstLastName() . '">' . __('Copy', 'connections') . '</a>';
                    }
                    if (current_user_can('connections_delete_entry')) {
                        $rowEditActions[] = '<a class="submitdelete" onclick="return confirm(\'You are about to delete this entry. \\\'Cancel\\\' to stop, \\\'OK\\\' to delete\');" href="' . $deleteTokenURL . '" title="' . __('Delete', 'connections') . ' ' . $entry->getFullFirstLastName() . '">' . __('Delete', 'connections') . '</a>';
                    }
                    if (!empty($rowEditActions)) {
                        echo implode(' | ', $rowEditActions), '<br/>';
                    }
                    if (!empty($rowActions)) {
                        echo implode(' | ', $rowActions);
                    }
                    echo '</div>';
                    echo "</td> \n";
                    echo "<td > \n";
                    $categories = $entry->getCategory();
                    if (!empty($categories)) {
                        $i = 0;
                        foreach ($categories as $category) {
                            /*
                             * Generate the category link token URL.
                             */
                            $categoryFilterURL = $form->tokenURL('admin.php?cn-action=filter&category=' . $category->term_id, 'filter');
                            echo '<a href="' . esc_url($categoryFilterURL) . '">' . $category->name . '</a>';
                            $i++;
                            if (count($categories) > $i) {
                                echo ', ';
                            }
                        }
                        unset($i);
                    }
                    echo "</td> \n";
                    echo '<td >';
                    echo '<strong>' . __('On', 'connections') . ':</strong> ' . $entry->getFormattedTimeStamp('m/d/Y g:ia') . '<br />';
                    echo '<strong>' . __('By', 'connections') . ':</strong> ' . $entry->getEditedBy() . '<br />';
                    echo '<strong>' . __('Visibility', 'connections') . ':</strong> ' . $entry->displayVisibilityType() . '<br />';
                    $user = $entry->getUser() ? get_userdata($entry->getUser()) : FALSE;
                    /**
                     * NOTE: WP 3.5 introduced get_edit_user_link()
                     * REF:  http://codex.wordpress.org/Function_Reference/get_edit_user_link
                     *
                     * @TODO Use get_edit_user_link() to simplify this code when WP hits >= 3.9.
                     */
                    if ($user) {
                        if (get_current_user_id() == $user->ID) {
                            $editUserLink = get_edit_profile_url($user->ID);
                        } else {
                            $editUserLink = add_query_arg('user_id', $user->ID, self_admin_url('user-edit.php'));
                        }
                        echo '<strong>' . __('Linked to:', 'connections') . '</strong> ' . '<a href="' . esc_url($editUserLink) . '">' . esc_attr($user->display_name) . '</a>';
                    }
                    echo "</td> \n";
                    echo "</tr> \n";
                    echo "<tr class='child-row-" . $entry->getId() . " cn-entry-details' id='contact-" . $entry->getId() . "-detail' style='display:none;'>";
                    echo '<td colspan="2">&nbsp;</td>', "\n";
                    //echo "<td >&nbsp;</td> \n";
                    echo '<td colspan="2">';
                    if ($relations = $entry->getFamilyMembers()) {
                        $relationsHTML = array();
                        foreach ($relations as $relationData) {
                            $relation = new cnEntry();
                            $relation->set($relationData['entry_id']);
                            if ($relation->getId()) {
                                if (current_user_can('connections_edit_entry')) {
                                    $editRelationTokenURL = esc_url($form->tokenURL('admin.php?page=connections_manage&cn-action=edit_entry&id=' . $relation->getId(), 'entry_edit_' . $relation->getId()));
                                    $relationsHTML[] = '<strong>' . $instance->options->getFamilyRelation($relationData['relation']) . ':</strong> ' . '<a href="' . $editRelationTokenURL . '" title="' . __('Edit', 'connections') . ' ' . $relation->getName() . '">' . $relation->getName() . '</a>';
                                } else {
                                    $relationsHTML[] = '<strong>' . $instance->options->getFamilyRelation($relationData['relation']) . ':</strong> ' . $relation->getName();
                                }
                            }
                        }
                        if (!empty($relationsHTML)) {
                            echo implode('<br />' . PHP_EOL, $relationsHTML);
                        }
                    }
                    if ($entry->getContactFirstName() || $entry->getContactLastName()) {
                        echo '<strong>' . __('Contact', 'connections') . ':</strong> ' . $entry->getContactFirstName() . ' ' . $entry->getContactLastName() . '<br />';
                    }
                    if ($entry->getTitle()) {
                        echo '<strong>' . __('Title', 'connections') . ':</strong> ' . $entry->getTitle() . '<br />';
                    }
                    if ($entry->getOrganization() && $entry->getEntryType() !== 'organization') {
                        echo '<strong>' . __('Organization', 'connections') . ':</strong> ' . $entry->getOrganization() . '<br />';
                    }
                    if ($entry->getDepartment()) {
                        echo '<strong>' . __('Department', 'connections') . ':</strong> ' . $entry->getDepartment() . '<br />';
                    }
                    $addresses = $entry->getAddresses();
                    //print_r($addresses);
                    if (!empty($addresses)) {
                        foreach ($addresses as $address) {
                            $outCache = array();
                            echo '<div style="margin: 10px 0;">';
                            $address->preferred ? $preferred = '*' : ($preferred = '');
                            if (!empty($address->name)) {
                                echo '<span style="display: block"><strong>', $address->name, $preferred, '</strong></span>';
                            }
                            if (!empty($address->line_1)) {
                                echo '<span style="display: block">', $address->line_1, '</span>';
                            }
                            if (!empty($address->line_2)) {
                                echo '<span style="display: block">', $address->line_2, '</span>';
                            }
                            if (!empty($address->line_3)) {
                                echo '<span style="display: block">', $address->line_3, '</span>';
                            }
                            if (0 < strlen($address->line_4)) {
                                echo '<span style="display: block">', $address->line_4, '</span>';
                            }
                            if (0 < strlen($address->district)) {
                                echo '<span style="display: block">', $address->district, '</span>';
                            }
                            if (0 < strlen($address->county)) {
                                echo '<span style="display: block">', $address->county, '</span>';
                            }
                            if (!empty($address->city)) {
                                $outCache[] = '<span>' . $address->city . '</span>';
                            }
                            if (!empty($address->state)) {
                                $outCache[] = '<span>' . $address->state . '</span>';
                            }
                            if (!empty($address->zipcode)) {
                                $outCache[] = '<span>' . $address->zipcode . '</span>';
                            }
                            if (!empty($outCache)) {
                                echo '<span style="display: block">', implode('&nbsp;', $outCache), '</span>';
                            }
                            if (!empty($address->country)) {
                                echo '<span style="display: block">', $address->country, '</span>';
                            }
                            if (!empty($address->latitude) && !empty($address->longitude)) {
                                echo '<span style="display: block">', '<strong>', __('Latitude', 'connections'), ':</strong>', ' ', $address->latitude, ' ', '<strong>', __('Longitude', 'connections'), ':</strong>', ' ', $address->longitude, '</span>';
                            }
                            echo '</div>';
                        }
                        unset($outCache);
                    }
                    echo '</td>', "\n";
                    echo '<td>';
                    $phoneNumbers = $entry->getPhoneNumbers();
                    if (!empty($phoneNumbers)) {
                        echo '<div class="phone-numbers">';
                        foreach ($phoneNumbers as $phone) {
                            $phone->preferred ? $preferred = '*' : ($preferred = '');
                            echo '<span class="phone"><strong>', $phone->name, '</strong>: ', $phone->number, $preferred, '</span>';
                        }
                        echo '</div>';
                    }
                    $emailAddresses = $entry->getEmailAddresses();
                    if (!empty($emailAddresses)) {
                        echo '<div class="email-addresses">';
                        foreach ($emailAddresses as $email) {
                            $email->preferred ? $preferred = '*' : ($preferred = '');
                            echo '<span class="email"><strong>', $email->name, ':</strong> <a href="mailto:', $email->address, '">', $email->address, '</a>', $preferred, '</span>';
                        }
                        echo '</div>';
                    }
                    $imIDs = $entry->getIm();
                    if (!empty($imIDs)) {
                        echo '<div class="im-ids">';
                        foreach ($imIDs as $im) {
                            $im->preferred ? $preferred = '*' : ($preferred = '');
                            echo '<span class="im"><strong>', $im->name, ':</strong> ', $im->id, $preferred, '</span>';
                        }
                        echo '</div>';
                    }
                    $socialNetworks = $entry->getSocialMedia();
                    if (!empty($socialNetworks)) {
                        echo '<div class="social-networks">';
                        foreach ($entry->getSocialMedia() as $network) {
                            $network->preferred ? $preferred = '*' : ($preferred = '');
                            echo '<span class="social-network"><strong>', $network->name, ':</strong> <a target="_blank" href="', $network->url, '">', $network->url . '</a>', $preferred, '</span>';
                        }
                        echo '</div>';
                    }
                    $links = $entry->getLinks();
                    if (!empty($links)) {
                        echo '<div class="links">';
                        foreach ($links as $link) {
                            $link->preferred ? $preferred = '*' : ($preferred = '');
                            echo '<span class="link"><strong>', $link->name, ':</strong> <a target="_blank" href="', $link->url, '">', $link->url, '</a>', $preferred, '</span>';
                        }
                        echo '</div>';
                    }
                    echo "</td> \n";
                    echo "<td>";
                    $entry->getDateBlock();
                    echo "</td> \n";
                    echo "</tr> \n";
                    echo "<tr class='child-row-" . $entry->getId() . " entrynotes' id='contact-" . $entry->getId() . "-detail-notes' style='display:none;'>";
                    echo "<td colspan='2'>&nbsp;</td> \n";
                    //echo "<td >&nbsp;</td> \n";
                    echo "<td colspan='3'>";
                    echo $entry->getBio() ? '<strong>' . __('Bio', 'connections') . ':</strong> ' . $entry->getBio() . '<br />' : '&nbsp;';
                    echo $entry->getNotes() ? '<strong>' . __('Notes', 'connections') . ':</strong> ' . $entry->getNotes() : '&nbsp;';
                    echo "</td> \n";
                    echo '<td>
												<span style="display: block;"><strong>' . __('Entry ID', 'connections') . ':</strong> ' . $entry->getId() . '</span>' . '
												<span style="display: block;"><strong>' . __('Entry Slug', 'connections') . ':</strong> ' . $entry->getSlug() . '</span>' . '
												<span style="display: block;"><strong>' . __('Date Added', 'connections') . ':</strong> ' . $entry->getDateAdded('m/d/Y g:ia') . '</span>
												<span style="display: block;"><strong>' . __('Added By', 'connections') . ':</strong> ' . $entry->getAddedBy() . '</span>';
                    echo '<span style="display: block;"><strong>' . __('Image Linked', 'connections') . ':</strong> ' . (!$entry->getImageLinked() ? __('No', 'connections') : __('Yes', 'connections')) . '</span>';
                    echo '<span style="display: block;"><strong>' . __('Display', 'connections') . ':</strong> ' . ($entry->getImageLinked() && $entry->getImageDisplay() ? __('Yes', 'connections') : __('No', 'connections')) . '</span>';
                    echo "</td> \n";
                    echo "</tr> \n";
                }
                ?>
								</tbody>
							</table>
							</form>


					<script type="text/javascript">
						/* <![CDATA[ */
						(function($){
							$(document).ready(function(){
								$('#doaction, #doaction2').click(function(){
									if ( $('select[name^="action"]').val() == 'delete' ) {
										var m = 'You are about to delete the selected entry(ies).\n  \'Cancel\' to stop, \'OK\' to delete.';
										return showNotice.warn(m);
									}
								});
							});
						})(jQuery);
						/* ]]> */
					</script>
				<?php 
            } else {
                cnMessage::set('error', 'capability_view_entry_list');
            }
            break;
    }
    echo '</div> <!-- .wrap -->';
}