PageRenderTime 42ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/privatemsg.php

https://bitbucket.org/ryanhowdy/family-connections
PHP | 665 lines | 496 code | 100 blank | 69 comment | 28 complexity | 63b7679cf696c85d03174d0ad9f8482d MD5 | raw file
Possible License(s): Apache-2.0, GPL-2.0
  1. <?php
  2. /**
  3. * Private Message
  4. *
  5. * PHP versions 4 and 5
  6. *
  7. * @category FCMS
  8. * @package FamilyConnections
  9. * @author Ryan Haudenschilt <r.haudenschilt@gmail.com>
  10. * @copyright 2007 Haudenschilt LLC
  11. * @license http://www.gnu.org/licenses/gpl-2.0.html GPLv2
  12. * @link http://www.familycms.com/wiki/
  13. */
  14. session_start();
  15. define('URL_PREFIX', '');
  16. define('GALLERY_PREFIX', 'gallery/');
  17. require 'fcms.php';
  18. load('database', 'datetime');
  19. init();
  20. $TMPL = array(
  21. 'currentUserId' => $fcmsUser->id,
  22. 'sitename' => getSiteName(),
  23. 'nav-link' => getNavLinks(),
  24. 'pagetitle' => T_('Private Messages'),
  25. 'path' => URL_PREFIX,
  26. 'displayname' => $fcmsUser->displayName,
  27. 'version' => getCurrentVersion(),
  28. 'year' => date('Y')
  29. );
  30. control();
  31. exit();
  32. /**
  33. * control
  34. *
  35. * @return void
  36. */
  37. function control ()
  38. {
  39. if (isset($_GET['compose']))
  40. {
  41. displayComposeForm();
  42. }
  43. elseif (isset($_POST['submit']))
  44. {
  45. displayComposeFormSubmit();
  46. }
  47. elseif (isset($_POST['delete']) && !isset($_POST['confirmed']))
  48. {
  49. displayConfirmDelete();
  50. }
  51. elseif (isset($_POST['delconfirm']) || isset($_POST['confirmed']))
  52. {
  53. displayDeleteSubmit();
  54. }
  55. elseif (isset($_GET['pm']))
  56. {
  57. displayPrivateMessage();
  58. }
  59. elseif (isset($_GET['sent']))
  60. {
  61. displaySentPrivateMessage();
  62. }
  63. elseif (isset($_GET['folder']))
  64. {
  65. displaySentFolder();
  66. }
  67. else
  68. {
  69. displayIndbox();
  70. }
  71. }
  72. /**
  73. * displayHeader
  74. *
  75. * @return void
  76. */
  77. function displayHeader ()
  78. {
  79. global $TMPL, $fcmsUser;
  80. $TMPL['javascript'] = '
  81. <script type="text/javascript">
  82. //<![CDATA[
  83. Event.observe(window, \'load\', function() {
  84. initChatBar(\''.T_('Chat').'\', \''.$TMPL['path'].'\');
  85. if (!$$(\'.pm_footer input[type="submit"]\')) { return; }
  86. $$(\'.pm_footer input[type="submit"]\').each(function(item) {
  87. item.onclick = function() { return confirm(\''.T_('Are you sure you want to DELETE this?').'\'); };
  88. var hid = document.createElement(\'input\');
  89. hid.setAttribute(\'type\', \'hidden\');
  90. hid.setAttribute(\'name\', \'confirmed\');
  91. hid.setAttribute(\'value\', \'true\');
  92. item.insert({\'after\':hid});
  93. });
  94. return true;
  95. });
  96. //]]>
  97. </script>';
  98. require_once getTheme($fcmsUser->id).'header.php';
  99. $link = T_('Inbox');
  100. if (isset($_SESSION['private_messages']) && $_SESSION['private_messages'] > 0)
  101. {
  102. $link = sprintf(T_('Inbox (%d)'), $_SESSION['private_messages']);
  103. }
  104. echo '
  105. <div id="privatemsg" class="centercontent">
  106. <div id="actions_menu">
  107. <ul><li><a href="?compose=new">'.T_('New Message').'</a></li></ul>
  108. </div>
  109. <div id="leftcolumn">
  110. <ul class="menu">
  111. <li><a href="privatemsg.php">'.$link.'</a></li>
  112. <li><a href="privatemsg.php?folder=sent">'.T_('Sent').'</a></li>
  113. </ul>
  114. </div>
  115. <div id="maincolumn">';
  116. }
  117. /**
  118. * displayFooter
  119. *
  120. * @return void
  121. */
  122. function displayFooter ()
  123. {
  124. global $fcmsUser, $TMPL;
  125. echo '
  126. </div>
  127. </div><!-- #profile .centercontent -->';
  128. include_once getTheme($fcmsUser->id).'footer.php';
  129. }
  130. /**
  131. * displayComposeForm
  132. *
  133. * @return void
  134. */
  135. function displayComposeForm ()
  136. {
  137. global $fcmsUser;
  138. displayHeader();
  139. $id = '';
  140. $title = '';
  141. if (isset($_GET['id']))
  142. {
  143. $id = (int)$_GET['id'];
  144. }
  145. if (isset($_GET['title']))
  146. {
  147. $title = strip_tags($_GET['title']);
  148. $title = 'RE: '.cleanOutput($title);
  149. }
  150. $sql = "SELECT `id`
  151. FROM `fcms_users`
  152. WHERE `activated` > 0
  153. AND `password` != 'NONMEMBER'";
  154. $result = mysql_query($sql);
  155. if (!$result)
  156. {
  157. displaySqlError($sql, mysql_error());
  158. displayFooter();
  159. return;
  160. }
  161. while ($r = mysql_fetch_assoc($result))
  162. {
  163. $displayNameList[$r['id']] = getUserDisplayName($r['id'], 2);
  164. }
  165. asort($displayNameList);
  166. $user_options = buildHtmlSelectOptions($displayNameList, $id);
  167. echo '
  168. <script type="text/javascript" src="ui/js/livevalidation.js"></script>
  169. <form method="post" id="newpmform" action="privatemsg.php">
  170. <fieldset>
  171. <legend><span>'.T_('New PM').'</span></legend>
  172. <div>
  173. <label for="title">'.T_('Subject').'</label>:
  174. <input type="text" id="title" name="title" size="50" value="'.$title.'"/>
  175. </div><br/>
  176. <script type="text/javascript">
  177. var ftitle = new LiveValidation(\'title\', { onlyOnSubmit: true });
  178. ftitle.add(Validate.Presence, { failureMessage: "" });
  179. </script>
  180. <div>
  181. <label for="to">'.T_('To').'</label>:
  182. <select name="to">
  183. '.$user_options.'
  184. </select>
  185. </div><br/>
  186. <script type="text/javascript">var bb = new BBCode();</script>';
  187. displayBBCodeToolbar();
  188. echo '
  189. <div><textarea name="post" id="post" rows="10" cols="63"></textarea></div>
  190. <script type="text/javascript">bb.init(\'post\');</script>
  191. <script type="text/javascript">
  192. var fpost = new LiveValidation(\'post\', { onlyOnSubmit: true });
  193. fpost.add(Validate.Presence, { failureMessage: "" });
  194. </script>
  195. <p>
  196. <input class="sub1" type="submit" name="submit" value="'.T_('Send').'"/> &nbsp;
  197. <a href="privatemsg.php">'.T_('Cancel').'</a>
  198. </p>
  199. </fieldset>
  200. </form>
  201. <p>&nbsp;</p>';
  202. displayFooter();
  203. }
  204. /**
  205. * displayComposeFormSubmit
  206. *
  207. * @return void
  208. */
  209. function displayComposeFormSubmit ()
  210. {
  211. global $fcmsUser;
  212. $to = (int)$_POST['to'];
  213. $title = strip_tags($_POST['title']);
  214. $msg = strip_tags($_POST['post']);
  215. $cleanTitle = escape_string($_POST['title']);
  216. $cleanMsg = escape_string($_POST['post']);
  217. if (strlen($title) <= 0 || strlen($msg) <= 0)
  218. {
  219. header("Location: privatemsg.php");
  220. return;
  221. }
  222. // Insert the PM into the DB
  223. $sql = "INSERT INTO `fcms_privatemsg`
  224. (`to`, `from`, `date`, `title`, `msg`)
  225. VALUES (
  226. '$to',
  227. '$fcmsUser->id',
  228. NOW(),
  229. '$cleanTitle',
  230. '$cleanMsg'
  231. )";
  232. if (!mysql_query($sql))
  233. {
  234. displayHeader();
  235. displaySqlError($sql, mysql_error());
  236. displayFooter();
  237. return;
  238. }
  239. // Email the PM to the user
  240. $sql = "SELECT `email` FROM `fcms_users`
  241. WHERE `id` = '$to'";
  242. $result = mysql_query($sql);
  243. if (!$result)
  244. {
  245. displayHeader();
  246. displaySqlError($sql, mysql_error());
  247. displayFooter();
  248. return;
  249. }
  250. $r = mysql_fetch_array($result);
  251. $from = getUserDisplayName($fcmsUser->id);
  252. $reply = getUserEmail($fcmsUser->id);
  253. $toName = getUserDisplayName($to);
  254. $sitename = getSiteName();
  255. $sitename = html_entity_decode($sitename);
  256. $subject = sprintf(T_('A new Private Message at %s'), $sitename);
  257. $email = $r['email'];
  258. $url = getDomainAndDir();
  259. $email_headers = 'From: '.$sitename.' <'.getContactEmail().'>'."\r\n";
  260. $email_headers .= 'Reply-To: '.$reply."\r\n";
  261. $email_headers .= 'Content-Type: text/plain; charset=UTF-8;'."\r\n";
  262. $email_headers .= 'MIME-Version: 1.0'."\r\n";
  263. $email_headers .= 'X-Mailer: PHP/'.phpversion();
  264. $email_msg = T_('Dear').' '.$toName.',
  265. '.sprintf(T_('%s has sent you a new Private Message at %s'), $from, $sitename).'
  266. '.T_('The message has been attached below.').'
  267. '.sprintf(T_('To respond to this message either visit %s or respond to this email.'), $url.'privatemsg.php').'
  268. ----
  269. '.T_('From').': '.$from.'
  270. '.T_('Message Title').': '.$title.'
  271. '.$msg.'
  272. ';
  273. mail($email, $subject, $email_msg, $email_headers);
  274. $_SESSION['success'] = 1;
  275. header("Location: privatemsg.php");
  276. }
  277. /**
  278. * displayConfirmDelete
  279. *
  280. * @return void
  281. */
  282. function displayConfirmDelete ()
  283. {
  284. displayHeader();
  285. echo '
  286. <div class="info-alert>
  287. <form action="privatemsg.php" method="post">
  288. <h2>'.T_('Are you sure you want to DELETE this?').'</h2>
  289. <p><b><i>'.T_('This can NOT be undone.').'</i></b></p>
  290. <div>';
  291. foreach ($_POST['del'] as $id)
  292. {
  293. echo '
  294. <input type="hidden" name="del[]" value="'.(int)$id.'"/>';
  295. }
  296. echo '
  297. <input style="float:left;" type="submit" id="delconfirm" name="delconfirm" value="'.T_('Yes').'"/>
  298. <a style="float:right;" href="privatemsg.php">'.T_('Cancel').'</a>
  299. </div>
  300. </form>
  301. </div>';
  302. displayFooter();
  303. }
  304. /**
  305. * displayDeleteSubmit
  306. *
  307. * @return void
  308. */
  309. function displayDeleteSubmit ()
  310. {
  311. foreach ($_POST['del'] as $id)
  312. {
  313. $sql = "DELETE FROM `fcms_privatemsg`
  314. WHERE `id` = '".(int)$id."'";
  315. if (!mysql_query($sql))
  316. {
  317. displayHeader();
  318. displaySqlError($sql, mysql_error());
  319. displayFooter();
  320. return;
  321. }
  322. }
  323. $_SESSION['success'] = 1;
  324. header("Location: privatemsg.php");
  325. }
  326. /**
  327. * displayPrivateMessage
  328. *
  329. * @return void
  330. */
  331. function displayPrivateMessage ()
  332. {
  333. global $fcmsUser;
  334. $id = (int)$_GET['pm'];
  335. displayHeader();
  336. $sql = "SELECT p.`id`, `to`, `from`, `title`, `msg`, `date`, `read`, u.`avatar`, u.`gravatar`
  337. FROM `fcms_privatemsg` AS p
  338. LEFT JOIN `fcms_users` AS u ON p.`from` = u.`id`
  339. WHERE p.`id` = '$id'
  340. AND `to` = '$fcmsUser->id'";
  341. $result = mysql_query($sql);
  342. if (!$result)
  343. {
  344. displaySqlError($sql, mysql_error());
  345. displayFooter();
  346. return;
  347. }
  348. if (mysql_num_rows($result) <= 0)
  349. {
  350. echo '
  351. <p class="error-alert">
  352. '.T_('The PM you are trying to view either doesn\'t exist or you don\'t have permission to view it.').'
  353. </p>';
  354. return;
  355. }
  356. $r = mysql_fetch_assoc($result);
  357. $sql = "UPDATE `fcms_privatemsg`
  358. SET `read` = '1'
  359. WHERE `id` = '$id'";
  360. $result = mysql_query($sql);
  361. if (!$result)
  362. {
  363. displaySqlError($sql, mysql_error());
  364. displayFooter();
  365. return;
  366. }
  367. $tzOffset = getTimezone($fcmsUser->id);
  368. $date = fixDate(T_('n/j/Y g:i a'), $tzOffset, $r['date']);
  369. $avatarPath = getAvatarPath($r['avatar'], $r['gravatar']);
  370. $from = getUserDisplayName($r['from']);
  371. echo '
  372. <div id="pm_msg">
  373. <div class="user">
  374. <img src="'.$avatarPath.'" alt="'.$from.'" title="'.$from.'"/>
  375. <h3>'.cleanOutput($r['title']).'</h3>
  376. <b>'.sprintf(T_('by %s'), $from).'</b>
  377. <span>'.$date.'</span>
  378. </div>
  379. <p>
  380. '.parse($r['msg']).'
  381. </p>
  382. <a href="?compose=new&amp;id='.(int)$r['from'].'&amp;title='.cleanOutput($r['title']).'">'.T_('Reply').'
  383. </div>';
  384. displayFooter();
  385. }
  386. /**
  387. * displaySentPrivateMessage ()
  388. *
  389. * @return void
  390. */
  391. function displaySentPrivateMessage ()
  392. {
  393. global $fcmsUser;
  394. $id = (int)$_GET['sent'];
  395. displayHeader();
  396. $sql = "SELECT p.`id`, `to`, `from`, `title`, `msg`, `date`, `read`, u.`avatar`, u.`gravatar`
  397. FROM `fcms_privatemsg` AS p
  398. LEFT JOIN `fcms_users` AS u ON p.`to` = u.`id`
  399. WHERE p.`id` = '$id'
  400. AND `from` = '$fcmsUser->id'";
  401. $result = mysql_query($sql);
  402. if (!$result)
  403. {
  404. displaySqlError($sql, mysql_error());
  405. displayFooter();
  406. return;
  407. }
  408. if (mysql_num_rows($result) <= 0)
  409. {
  410. echo '
  411. <p class="error-alert">
  412. '.T_('The PM you are trying to view either doesn\'t exist or you don\'t have permission to view it.').'
  413. </p>';
  414. displayFooter();
  415. return;
  416. }
  417. $r = mysql_fetch_assoc($result);
  418. $tzOffset = getTimezone($fcmsUser->id);
  419. $date = fixDate(T_('n/j/Y g:i a'), $tzOffset, $r['date']);
  420. $avatarPath = getAvatarPath($r['avatar'], $r['gravatar']);
  421. $to = getUserDisplayName($r['to']);
  422. echo '
  423. <div id="pm_msg">
  424. <div class="user">
  425. <img src="'.$avatarPath.'" alt="'.$to.'" title="'.$to.'"/>
  426. <h3>'.cleanOutput($r['title']).'</h3>
  427. <b>'.sprintf(T_('to %s'), $to).'</b>
  428. <span>'.$date.'</span>
  429. </div>
  430. <p>
  431. '.parse($r['msg']).'
  432. </p>
  433. </div>';
  434. displayFooter();
  435. }
  436. /**
  437. * displaySentFolder
  438. *
  439. * @return void
  440. */
  441. function displaySentFolder ()
  442. {
  443. global $fcmsUser;
  444. displayHeader();
  445. echo '
  446. <table id="pm" cellpadding="0" cellspacing="0">
  447. <tr>
  448. <th colspan="5" class="pm_header">'.T_('Sent Messages').'</th>
  449. </tr>';
  450. $sql = "SELECT p.`id`, `to`, `from`, `title`, `date`, `read`, u.`avatar`, u.`gravatar`
  451. FROM `fcms_privatemsg` AS p
  452. LEFT JOIN `fcms_users` AS u ON p.`to` = u.`id`
  453. WHERE `from` = '$fcmsUser->id'
  454. ORDER BY `date` DESC";
  455. $result = mysql_query($sql);
  456. if (!$result)
  457. {
  458. displaySqlError($sql, mysql_error());
  459. displayFooter();
  460. return;
  461. }
  462. $tzOffset = getTimezone($fcmsUser->id);
  463. while ($r = mysql_fetch_assoc($result))
  464. {
  465. $date = fixDate(T_('M. j, Y, g:i a'), $tzOffset, $r['date']);
  466. $avatarPath = getAvatarPath($r['avatar'], $r['gravatar']);
  467. $to = getUserDisplayName($r['to']);
  468. echo '
  469. <tr>
  470. <td>
  471. <div class="user">
  472. <img src="'.$avatarPath.'" alt="'.$to.'" title="'.$to.'"/>
  473. </div>
  474. <a href="?sent='.(int)$r['id'].'">'.cleanOutput($r['title']).'</a>
  475. <span>'.$date.'</span>
  476. </td>
  477. </tr>';
  478. }
  479. echo '
  480. <tr><th colspan="5" class="pm_footer">&nbsp;</th></tr>
  481. </table>';
  482. displayFooter();
  483. }
  484. /**
  485. * displayIndbox
  486. *
  487. * @return void
  488. */
  489. function displayIndbox ()
  490. {
  491. global $fcmsUser;
  492. displayHeader();
  493. if (isset($_SESSION['success']))
  494. {
  495. displayOkMessage();
  496. unset($_SESSION['success']);
  497. }
  498. $header = T_('Inbox');
  499. if (isset($_SESSION['private_messages']) && $_SESSION['private_messages'] > 0)
  500. {
  501. $header = sprintf(T_('Inbox (%d)'), $_SESSION['private_messages']);
  502. }
  503. echo '
  504. <form method="post" action="privatemsg.php">
  505. <table id="pm" cellpadding="0" cellspacing="0">
  506. <tr>
  507. <th colspan="3" class="pm_header">'.$header.'</th>
  508. </tr>';
  509. $sql = "SELECT p.`id`, `to`, `from`, `title`, `date`, `read`, u.`avatar`, u.`gravatar`
  510. FROM `fcms_privatemsg` AS p
  511. LEFT JOIN `fcms_users` AS u ON p.`from` = u.`id`
  512. WHERE `to` = '$fcmsUser->id'
  513. ORDER BY `date` DESC";
  514. $result = mysql_query($sql);
  515. if (!$result)
  516. {
  517. displaySqlError($sql, mysql_error());
  518. displayFooter();
  519. return;
  520. }
  521. while ($r = mysql_fetch_assoc($result))
  522. {
  523. $date = fixDate(T_('M. j, Y, g:i a'), $fcmsUser->tzOffset, $r['date']);
  524. $avatarPath = getAvatarPath($r['avatar'], $r['gravatar']);
  525. $from = getUserDisplayName($r['from']);
  526. $rowClass = '';
  527. $linkClass = 'read';
  528. if ($r['read'] < 1)
  529. {
  530. $rowClass = 'new';
  531. $linkClass = '';
  532. }
  533. echo '
  534. <tr class="'.$rowClass.'">
  535. <td class="img"></td>
  536. <td>
  537. <div class="user">
  538. <img src="'.$avatarPath.'" alt="'.$from.'" title="'.$from.'"/>
  539. </div>
  540. <a class="'.$linkClass.'" href="?pm='.(int)$r['id'].'">'.cleanOutput($r['title']).'</a>
  541. <span>'.$date.'</span>
  542. </td>
  543. <td class="check"><input type="checkbox" name="del[]" value="'.(int)$r['id'].'"/></td>
  544. </tr>';
  545. }
  546. echo '
  547. <tr>
  548. <th colspan="3" class="pm_footer">
  549. <input class="sub1" type="submit" name="delete" value="'.T_('Delete Selected').'"/>
  550. </th>
  551. </tr>
  552. </table>
  553. </form>';
  554. displayFooter();
  555. }