function message_content(&$a) { $o = ''; nav_set_selected('messages'); if (!local_channel()) { notice(t('Permission denied.') . EOL); return login(); } $channel = $a->get_channel(); head_set_icon($channel['xchan_photo_s']); $cipher = get_pconfig(local_channel(), 'system', 'default_cipher'); if (!$cipher) { $cipher = 'aes256'; } $tpl = get_markup_template('mail_head.tpl'); $header = replace_macros($tpl, array('$messages' => t('Messages'), '$tab_content' => $tab_content)); if (argc() == 3 && argv(1) === 'dropconv') { if (!intval(argv(2))) { return; } $cmd = argv(1); $r = private_messages_drop(local_channel(), argv(2), true); if ($r) { info(t('Conversation removed.') . EOL); } goaway($a->get_baseurl(true) . '/message'); } if (argc() == 1) { // list messages $o .= $header; // private_messages_list() can do other more complicated stuff, for now keep it simple $r = private_messages_list(local_channel(), '', $a->pager['start'], $a->pager['itemspage']); if (!$r) { info(t('No messages.') . EOL); return $o; } $tpl = get_markup_template('mail_list.tpl'); foreach ($r as $rr) { $o .= replace_macros($tpl, array('$id' => $rr['id'], '$from_name' => $rr['from']['xchan_name'], '$from_url' => chanlink_hash($rr['from_xchan']), '$from_photo' => $rr['from']['xchan_photo_s'], '$to_name' => $rr['to']['xchan_name'], '$to_url' => chanlink_hash($rr['to_xchan']), '$to_photo' => $rr['to']['xchan_photo_s'], '$subject' => $rr['seen'] ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>', '$delete' => t('Delete conversation'), '$body' => smilies(bbcode($rr['body'])), '$date' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], t('D, d M Y - g:i A')), '$seen' => $rr['seen'])); } $o .= alt_pager($a, count($r)); return $o; } }
function item_photo_menu($item) { $a = get_app(); $contact = null; $ssl_state = false; $sub_link = ""; $poke_link = ""; $contact_url = ""; $pm_url = ""; $vsrc_link = ""; $follow_url = ""; $local_channel = local_channel(); if ($local_channel) { $ssl_state = true; if (!count($a->contacts)) { load_contact_links($local_channel); } $channel = $a->get_channel(); $channel_hash = $channel ? $channel['channel_hash'] : ''; } if ($local_channel && $local_channel == $item['uid']) { $vsrc_link = 'javascript:viewsrc(' . $item['id'] . '); return false;'; if ($item['parent'] == $item['id'] && $channel && $channel_hash != $item['author_xchan']) { $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;'; } } $profile_link = chanlink_hash($item['author_xchan']); if ($item['uid'] > 0) { $pm_url = $a->get_baseurl($ssl_state) . '/mail/new/?f=&hash=' . $item['author_xchan']; } if ($a->contacts && array_key_exists($item['author_xchan'], $a->contacts)) { $contact = $a->contacts[$item['author_xchan']]; } else { if ($local_channel && $item['author']['xchan_addr']) { $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr']; } } if ($contact) { $poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $contact['abook_id']; if (!($contact['abook_flags'] & ABOOK_FLAG_SELF)) { $contact_url = $a->get_baseurl($ssl_state) . '/connedit/' . $contact['abook_id']; } $posts_link = $a->get_baseurl($ssl_state) . '/network/?cid=' . $contact['abook_id']; $clean_url = normalise_link($item['author-link']); } $menu = array(t("View Source") => $vsrc_link, t("Follow Thread") => $sub_link, t("View Status") => $status_link, t("View Profile") => $profile_link, t("View Photos") => $photos_link, t("Matrix Activity") => $posts_link, t("Connect") => $follow_url, t("Edit Contact") => $contact_url, t("Send PM") => $pm_url, t("Poke") => $poke_link); $args = array('item' => $item, 'menu' => $menu); call_hooks('item_photo_menu', $args); $menu = $args['menu']; $o = ""; foreach ($menu as $k => $v) { if (strpos($v, 'javascript:') === 0) { $v = substr($v, 11); $o .= "<li><a href=\"#\" onclick=\"{$v}\">{$k}</a></li>\n"; } elseif ($v != "") { $o .= "<li><a href=\"{$v}\">{$k}</a></li>\n"; } } return $o; }
function micropro($contact, $redirect = false, $class = '', $textmode = false) { if ($contact['click']) { $url = '#'; } else { $url = chanlink_hash($contact['xchan_hash']); } return replace_macros(get_markup_template($textmode ? 'micropro_txt.tpl' : 'micropro_img.tpl'), array('$click' => $contact['click'] ? $contact['click'] : '', '$class' => $class . ($contact['archived'] ? ' archived' : ''), '$url' => $url, '$photo' => $contact['xchan_photo_s'], '$name' => $contact['xchan_name'], '$title' => $contact['xchan_name'] . ' [' . $contact['xchan_addr'] . ']')); }
function mail_content(&$a) { $o = ''; nav_set_selected('messages'); if (!local_user()) { notice(t('Permission denied.') . EOL); return login(); } $channel = $a->get_channel(); head_set_icon($channel['xchan_photo_s']); $cipher = get_pconfig(local_user(), 'system', 'default_cipher'); if (!$cipher) { $cipher = 'aes256'; } $tpl = get_markup_template('mail_head.tpl'); $header = replace_macros($tpl, array('$messages' => t('Messages'), '$tab_content' => $tab_content)); if (argc() == 3 && argv(1) === 'drop') { if (!intval(argv(2))) { return; } $cmd = argv(1); $r = private_messages_drop(local_user(), argv(2)); if ($r) { info(t('Message deleted.') . EOL); } goaway($a->get_baseurl(true) . '/message'); } if (argc() == 3 && argv(1) === 'recall') { if (!intval(argv(2))) { return; } $cmd = argv(1); $r = q("update mail set mail_flags = mail_flags | %d where id = %d and channel_id = %d limit 1", intval(MAIL_RECALLED), intval(argv(2)), intval(local_user())); proc_run('php', 'include/notifier.php', 'mail', intval(argv(2))); if ($r) { info(t('Message recalled.') . EOL); } goaway($a->get_baseurl(true) . '/message'); } if (argc() > 1 && argv(1) === 'new') { $o .= $header; $plaintext = true; $tpl = get_markup_template('msg-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array('$baseurl' => $a->get_baseurl(true), '$editselect' => $plaintext ? 'none' : '/(profile-jot-text|prvmail-text)/', '$nickname' => $channel['channel_address'], '$linkurl' => t('Please enter a link URL:'), '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'))); $preselect = isset($a->argv[2]) ? array($a->argv[2]) : false; $prename = $preurl = $preid = ''; if (x($_REQUEST, 'hash')) { $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash\n\t\t\t\twhere abook_channel = %d and abook_xchan = '%s' limit 1", intval(local_user()), dbesc($_REQUEST['hash'])); if ($r) { $prename = $r[0]['xchan_name']; $preurl = $r[0]['xchan_url']; $preid = $r[0]['abook_id']; $preselect = array($preid); } } if ($preselect) { $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash\n\t\t\t\twhere abook_channel = %d and abook_id = %d limit 1", intval(local_user()), intval(argv(2))); if ($r) { $prename = $r[0]['xchan_name']; $preurl = $r[0]['xchan_url']; $preid = $r[0]['abook_id']; } } $prefill = $preselect ? $prename : ''; if (!$prefill) { if (array_key_exists('to', $_REQUEST)) { $prefill = $_REQUEST['to']; } } // the ugly select box $select = contact_select('messageto', 'message-to-select', $preselect, 4, true, false, false, 10); $tpl = get_markup_template('prv_message.tpl'); $o .= replace_macros($tpl, array('$header' => t('Send Private Message'), '$to' => t('To:'), '$showinputs' => 'true', '$prefill' => $prefill, '$autocomp' => $autocomp, '$preid' => $preid, '$subject' => t('Subject:'), '$subjtxt' => x($_REQUEST, 'subject') ? strip_tags($_REQUEST['subject']) : '', '$text' => x($_REQUEST, 'body') ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : '', '$readonly' => '', '$yourmessage' => t('Your message:'), '$select' => $select, '$parent' => '', '$upload' => t('Upload photo'), '$attach' => t('Attach file'), '$insert' => t('Insert web link'), '$wait' => t('Please wait'), '$submit' => t('Send'), '$defexpire' => '', '$feature_expire' => feature_enabled(local_user(), 'content_expire') ? true : false, '$expires' => t('Set expiration date'), '$feature_encrypt' => feature_enabled(local_user(), 'content_encrypt') ? true : false, '$encrypt' => t('Encrypt text'), '$cipher' => $cipher)); return $o; } if (argc() > 1 && intval(argv(1))) { $o .= $header; $plaintext = true; // if( local_user() && feature_enabled(local_user(),'richtext') ) // $plaintext = false; $messages = private_messages_fetch_conversation(local_user(), argv(1), true); if (!$messages) { info(t('Message not found.') . EOL); return $o; } if ($messages[0]['to_xchan'] === $channel['channel_hash']) { $a->poi = $messages[0]['from']; } else { $a->poi = $messages[0]['to']; } // require_once('include/Contact.php'); // $a->set_widget('mail_conversant',vcard_from_xchan($a->poi,$get_observer_hash,'mail')); $tpl = get_markup_template('msg-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array('$nickname' => $channel['channel_addr'], '$baseurl' => $a->get_baseurl(true), '$editselect' => $plaintext ? 'none' : '/(profile-jot-text|prvmail-text)/', '$linkurl' => t('Please enter a link URL:'), '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'))); $mails = array(); $seen = 0; $unknown = false; foreach ($messages as $message) { $s = theme_attachments($message); $mails[] = array('id' => $message['id'], 'from_name' => $message['from']['xchan_name'], 'from_url' => chanlink_hash($message['from_xchan']), 'from_photo' => $message['from']['xchan_photo_m'], 'to_name' => $message['to']['xchan_name'], 'to_url' => chanlink_hash($message['to_xchan']), 'to_photo' => $message['to']['xchan_photo_m'], 'subject' => $message['title'], 'body' => smilies(bbcode($message['body']) . $s), 'delete' => t('Delete message'), 'recall' => t('Recall message'), 'can_recall' => $channel['channel_hash'] == $message['from_xchan'] ? true : false, 'is_recalled' => $message['mail_flags'] & MAIL_RECALLED ? t('Message has been recalled.') : '', 'date' => datetime_convert('UTC', date_default_timezone_get(), $message['created'], 'D, d M Y - g:i A')); $seen = $message['seen']; } $recp = $message['from_xchan'] === $channel['channel_hash'] ? 'to' : 'from'; // FIXME - move this HTML to template $select = $message[$recp]['xchan_name'] . '<input type="hidden" name="messageto" value="' . $message[$recp]['xchan_hash'] . '" />'; $parent = '<input type="hidden" name="replyto" value="' . $message['parent_mid'] . '" />'; $tpl = get_markup_template('mail_display.tpl'); $o = replace_macros($tpl, array('$prvmsg_header' => t('Private Conversation'), '$thread_id' => $a->argv[1], '$thread_subject' => $message['title'], '$thread_seen' => $seen, '$delete' => t('Delete conversation'), '$canreply' => $unknown ? false : '1', '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."), '$mails' => $mails, '$header' => t('Send Reply'), '$to' => t('To:'), '$showinputs' => '', '$subject' => t('Subject:'), '$subjtxt' => $message['title'], '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ', '$yourmessage' => t('Your message:'), '$text' => '', '$select' => $select, '$parent' => $parent, '$upload' => t('Upload photo'), '$attach' => t('Attach file'), '$insert' => t('Insert web link'), '$submit' => t('Submit'), '$wait' => t('Please wait'), '$defexpire' => '', '$feature_expire' => feature_enabled(local_user(), 'content_expire') ? true : false, '$expires' => t('Set expiration date'), '$feature_encrypt' => feature_enabled(local_user(), 'content_encrypt') ? true : false, '$encrypt' => t('Encrypt text'), '$cipher' => $cipher)); return $o; } }
function mail_content(&$a) { $o = ''; nav_set_selected('messages'); if (!local_channel()) { notice(t('Permission denied.') . EOL); return login(); } $channel = $a->get_channel(); head_set_icon($channel['xchan_photo_s']); $cipher = get_pconfig(local_channel(), 'system', 'default_cipher'); if (!$cipher) { $cipher = 'aes256'; } $tpl = get_markup_template('mail_head.tpl'); $header = replace_macros($tpl, array('$header' => t('Messages'))); if (argc() == 4 && argv(2) === 'drop') { if (!intval(argv(3))) { return; } $cmd = argv(2); $mailbox = argv(1); $r = private_messages_drop(local_channel(), argv(3)); if ($r) { //info( t('Message deleted.') . EOL ); } goaway($a->get_baseurl(true) . '/mail/' . $mailbox); } if (argc() == 4 && argv(2) === 'recall') { if (!intval(argv(3))) { return; } $cmd = argv(2); $mailbox = argv(1); $r = q("update mail set mail_recalled = 1 where id = %d and channel_id = %d", intval(argv(3)), intval(local_channel())); $x = q("select * from mail where id = %d and channel_id = %d", intval(argv(3)), intval(local_channel())); if ($x) { build_sync_packet(local_channel(), array('mail' => encode_mail($x[0], true))); } proc_run('php', 'include/notifier.php', 'mail', intval(argv(3))); if ($r) { info(t('Message recalled.') . EOL); } goaway($a->get_baseurl(true) . '/mail/' . $mailbox . '/' . argv(3)); } if (argc() == 4 && argv(2) === 'dropconv') { if (!intval(argv(3))) { return; } $cmd = argv(2); $mailbox = argv(1); $r = private_messages_drop(local_channel(), argv(3), true); if ($r) { info(t('Conversation removed.') . EOL); } goaway($a->get_baseurl(true) . '/mail/' . $mailbox); } if (argc() > 1 && argv(1) === 'new') { $plaintext = true; $tpl = get_markup_template('msg-header.tpl'); $header = replace_macros($tpl, array('$baseurl' => $a->get_baseurl(true), '$editselect' => $plaintext ? 'none' : '/(profile-jot-text|prvmail-text)/', '$nickname' => $channel['channel_address'], '$linkurl' => t('Please enter a link URL:'), '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'))); $a->page['htmlhead'] .= $header; $prename = ''; $preid = ''; if (x($_REQUEST, 'hash')) { $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash\n\t\t\t\twhere abook_channel = %d and abook_xchan = '%s' limit 1", intval(local_channel()), dbesc($_REQUEST['hash'])); if (!$r) { $r = q("select * from xchan where xchan_hash = '%s' and xchan_network = 'zot' limit 1", dbesc($_REQUEST['hash'])); } if ($r) { $prename = $r[0]['abook_id'] ? $r[0]['xchan_name'] : $r[0]['xchan_addr']; $preurl = $r[0]['xchan_url']; $preid = $r[0]['abook_id'] ? $r[0]['xchan_hash'] : ''; } else { notice(t('Requested channel is not in this network') . EOL); } } $tpl = get_markup_template('prv_message.tpl'); $o .= replace_macros($tpl, array('$new' => true, '$header' => t('Send Private Message'), '$to' => t('To:'), '$prefill' => $prename, '$preid' => $preid, '$subject' => t('Subject:'), '$subjtxt' => x($_REQUEST, 'subject') ? strip_tags($_REQUEST['subject']) : '', '$text' => x($_REQUEST, 'body') ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : '', '$yourmessage' => t('Your message:'), '$parent' => '', '$attach' => t('Attach file'), '$insert' => t('Insert web link'), '$submit' => t('Send'), '$defexpire' => '', '$feature_expire' => feature_enabled(local_channel(), 'content_expire') ? true : false, '$expires' => t('Set expiration date'), '$feature_encrypt' => feature_enabled(local_channel(), 'content_encrypt') ? true : false, '$encrypt' => t('Encrypt text'), '$cipher' => $cipher)); return $o; } switch (argv(1)) { case 'combined': $mailbox = 'combined'; break; case 'inbox': $mailbox = 'inbox'; break; case 'outbox': $mailbox = 'outbox'; break; default: $mailbox = 'combined'; break; } $last_message = private_messages_list(local_channel(), $mailbox, 0, 1); $mid = argc() > 2 && intval(argv(2)) ? argv(2) : $last_message[0]['id']; $plaintext = true; // if( local_channel() && feature_enabled(local_channel(),'richtext') ) // $plaintext = false; if ($mailbox == 'combined') { $messages = private_messages_fetch_conversation(local_channel(), $mid, true); } else { $messages = private_messages_fetch_message(local_channel(), $mid, true); } if (!$messages) { //info( t('Message not found.') . EOL); return; } if ($messages[0]['to_xchan'] === $channel['channel_hash']) { $a->poi = $messages[0]['from']; } else { $a->poi = $messages[0]['to']; } // require_once('include/Contact.php'); // $a->set_widget('mail_conversant',vcard_from_xchan($a->poi,$get_observer_hash,'mail')); $tpl = get_markup_template('msg-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array('$nickname' => $channel['channel_address'], '$baseurl' => $a->get_baseurl(true), '$editselect' => $plaintext ? 'none' : '/(profile-jot-text|prvmail-text)/', '$linkurl' => t('Please enter a link URL:'), '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'))); $mails = array(); $seen = 0; $unknown = false; foreach ($messages as $message) { $s = theme_attachments($message); $mails[] = array('mailbox' => $mailbox, 'id' => $message['id'], 'mid' => $message['mid'], 'from_name' => $message['from']['xchan_name'], 'from_url' => chanlink_hash($message['from_xchan']), 'from_photo' => $message['from']['xchan_photo_s'], 'to_name' => $message['to']['xchan_name'], 'to_url' => chanlink_hash($message['to_xchan']), 'to_photo' => $message['to']['xchan_photo_s'], 'subject' => $message['title'], 'body' => smilies(bbcode($message['body']) . $s), 'delete' => t('Delete message'), 'dreport' => t('Delivery report'), 'recall' => t('Recall message'), 'can_recall' => $channel['channel_hash'] == $message['from_xchan'] ? true : false, 'is_recalled' => intval($message['mail_recalled']) ? t('Message has been recalled.') : '', 'date' => datetime_convert('UTC', date_default_timezone_get(), $message['created'], 'c')); $seen = $message['seen']; } $recp = $message['from_xchan'] === $channel['channel_hash'] ? 'to' : 'from'; $tpl = get_markup_template('mail_display.tpl'); $o = replace_macros($tpl, array('$mailbox' => $mailbox, '$prvmsg_header' => $message['title'], '$thread_id' => $mid, '$thread_subject' => $message['title'], '$thread_seen' => $seen, '$delete' => t('Delete Conversation'), '$canreply' => $unknown ? false : '1', '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."), '$mails' => $mails, '$header' => t('Send Reply'), '$to' => t('To:'), '$reply' => true, '$subject' => t('Subject:'), '$subjtxt' => $message['title'], '$yourmessage' => sprintf(t('Your message for %s (%s):'), $message[$recp]['xchan_name'], $message[$recp]['xchan_addr']), '$text' => '', '$parent' => $message['parent_mid'], '$recphash' => $message[$recp]['xchan_hash'], '$attach' => t('Attach file'), '$insert' => t('Insert web link'), '$submit' => t('Submit'), '$defexpire' => '', '$feature_expire' => feature_enabled(local_channel(), 'content_expire') ? true : false, '$expires' => t('Set expiration date'), '$feature_encrypt' => feature_enabled(local_channel(), 'content_encrypt') ? true : false, '$encrypt' => t('Encrypt text'), '$cipher' => $cipher)); return $o; }
function widget_conversations($arr) { if (!local_channel()) { return; } $a = get_app(); if (argc() > 1) { switch (argv(1)) { case 'combined': $mailbox = 'combined'; $header = t('Conversations'); break; case 'inbox': $mailbox = 'inbox'; $header = t('Received Messages'); break; case 'outbox': $mailbox = 'outbox'; $header = t('Sent Messages'); break; default: $mailbox = 'combined'; $header = t('Conversations'); break; } require_once 'include/message.php'; // private_messages_list() can do other more complicated stuff, for now keep it simple $r = private_messages_list(local_channel(), $mailbox, $a->pager['start'], $a->pager['itemspage']); if (!$r) { info(t('No messages.') . EOL); return $o; } $messages = array(); foreach ($r as $rr) { $messages[] = array('mailbox' => $mailbox, 'id' => $rr['id'], 'from_name' => $rr['from']['xchan_name'], 'from_url' => chanlink_hash($rr['from_xchan']), 'from_photo' => $rr['from']['xchan_photo_s'], 'to_name' => $rr['to']['xchan_name'], 'to_url' => chanlink_hash($rr['to_xchan']), 'to_photo' => $rr['to']['xchan_photo_s'], 'subject' => $rr['seen'] ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>', 'delete' => t('Delete conversation'), 'body' => $rr['body'], 'date' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'c'), 'seen' => $rr['seen'], 'selected' => argv(2) ? argv(2) == $rr['id'] : $r[0]['id'] == $rr['id']); } $tpl = get_markup_template('mail_head.tpl'); $o .= replace_macros($tpl, array('$header' => $header, '$messages' => $messages)); $o .= alt_pager($a, count($r)); } return $o; }
function item_photo_menu($item) { $contact = null; $ssl_state = false; $sub_link = ""; $poke_link = ""; $contact_url = ""; $pm_url = ""; $vsrc_link = ""; $follow_url = ""; $local_channel = local_channel(); if ($local_channel) { $ssl_state = true; if (!count(App::$contacts)) { load_contact_links($local_channel); } $channel = App::get_channel(); $channel_hash = $channel ? $channel['channel_hash'] : ''; } if ($local_channel && $local_channel == $item['uid']) { $vsrc_link = 'javascript:viewsrc(' . $item['id'] . '); return false;'; if ($item['parent'] == $item['id'] && $channel && $channel_hash != $item['author_xchan']) { $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;'; } if ($channel) { $unsub_link = 'javascript:dounsubthread(' . $item['id'] . '); return false;'; } } $profile_link = chanlink_hash($item['author_xchan']); if ($item['uid'] > 0) { $pm_url = z_root() . '/mail/new/?f=&hash=' . $item['author_xchan']; } if (App::$contacts && array_key_exists($item['author_xchan'], App::$contacts)) { $contact = App::$contacts[$item['author_xchan']]; } else { if ($local_channel && $item['author']['xchan_addr']) { $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr']; } } if ($contact) { $poke_link = z_root() . '/poke/?f=&c=' . $contact['abook_id']; if (!intval($contact['abook_self'])) { $contact_url = z_root() . '/connedit/' . $contact['abook_id']; } $posts_link = z_root() . '/network/?cid=' . $contact['abook_id']; $clean_url = normalise_link($item['author-link']); } $poco_rating = get_config('system', 'poco_rating_enable'); // if unset default to enabled if ($poco_rating === false) { $poco_rating = true; } $ratings_url = $poco_rating ? z_root() . '/ratings/' . urlencode($item['author_xchan']) : ''; $post_menu = array(t("View Source") => $vsrc_link, t("Follow Thread") => $sub_link, t("Unfollow Thread") => $unsub_link); $author_menu = array(t("View Profile") => $profile_link, t("Activity/Posts") => $posts_link, t("Connect") => $follow_url, t("Edit Connection") => $contact_url, t("Message") => $pm_url, t('Ratings') => $ratings_url, t("Poke") => $poke_link); $args = array('item' => $item, 'post_menu' => $post_menu, 'author_menu' => $author_menu); call_hooks('item_photo_menu', $args); $menu = array_merge($args['post_menu'], $args['author_menu']); $o = ""; foreach ($menu as $k => $v) { if (strpos($v, 'javascript:') === 0) { $v = substr($v, 11); $o .= "<li><a href=\"#\" onclick=\"{$v}\">{$k}</a></li>\n"; } elseif ($v != "") { $o .= "<li><a href=\"{$v}\">{$k}</a></li>\n"; } } return $o; }