PageRenderTime 76ms CodeModel.GetById 35ms RepoModel.GetById 0ms app.codeStats 0ms

/campsite/src/admin-files/article_types/merge3.php

https://github.com/joechrysler/Campsite
PHP | 500 lines | 432 code | 42 blank | 26 comment | 65 complexity | 7e82870953edbaa9b708f03ad94b44a8 MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, LGPL-2.1, Apache-2.0
  1. <?php
  2. camp_load_translation_strings("article_types");
  3. require_once($GLOBALS['g_campsiteDir'].'/classes/ArticleType.php');
  4. require_once($GLOBALS['g_campsiteDir'].'/classes/Input.php');
  5. require_once($GLOBALS['g_campsiteDir'].'/classes/Article.php');
  6. require_once($GLOBALS['g_campsiteDir'].'/classes/ArticleImage.php');
  7. // Check permissions
  8. if (!$g_user->hasPermission('ManageArticleTypes')) {
  9. camp_html_display_error(getGS("You do not have the right to merge article types."));
  10. exit;
  11. }
  12. $f_src = trim(Input::get('f_src'));
  13. $f_dest = trim(Input::get('f_dest'));
  14. $f_prev_action = trim(Input::get('f_action', 'string', 'NULL')); // Preview actions: either NEXT, PREV, ORIG
  15. $f_action = trim(Input::get('f_action')); // either Step1, Step2, Preview or Merge
  16. if ($f_action == 'Step1') {
  17. camp_html_goto_page("/$ADMIN/article_types/merge.php?f_src=$f_src&f_dest=$f_dest");
  18. }
  19. $src = new ArticleType($f_src);
  20. $dest = new ArticleType($f_dest);
  21. $getString = '';
  22. foreach ($dest->getUserDefinedColumns(null, true, true) as $destColumn) {
  23. $getString .= "&f_src_". $destColumn->getPrintName() ."=". trim(Input::get('f_src_'. $destColumn->getPrintName()));
  24. }
  25. if ($f_action == 'Step2') {
  26. camp_html_goto_page("/$ADMIN/article_types/merge2.php?f_src=$f_src&f_dest=$f_dest". $getString);
  27. }
  28. foreach ($dest->getUserDefinedColumns(null, true, true) as $destColumn) {
  29. $tmp = trim(Input::get('f_src_'. $destColumn->getPrintName()));
  30. $f_src_c[$destColumn->getPrintName()] = $tmp;
  31. }
  32. // Verify the merge rules
  33. $ok = true;
  34. $errMsgs = array();
  35. foreach ($f_src_c as $destColumn => $srcColumn) {
  36. if ($srcColumn == 'NULL') {
  37. continue;
  38. }
  39. $destATF = new ArticleTypeField($f_dest, $destColumn);
  40. $srcATF = new ArticleTypeField($f_src, $srcColumn);
  41. if (!$destATF->isConvertibleFrom($srcATF)) {
  42. $errMsgs[] = getGS('Cannot merge a $1 field ($2) into a $3 field ($4).',
  43. getGS($srcATF->getType()), $srcATF->getDisplayName(),
  44. getGS($destATF->getType()), $destATF->getDisplayName());
  45. $ok = false;
  46. }
  47. }
  48. //
  49. // if f_action is Merge, do the merge and return them to article_types/ screen (or an error)
  50. //
  51. if ($ok && $f_action == 'Merge') {
  52. $res = ArticleType::merge($f_src, $f_dest, $f_src_c);
  53. if (!$res) {
  54. $errMsgs[] = getGS("Merge failed.");
  55. $ok = false;
  56. }
  57. if ($ok) {
  58. $f_delete = Input::get('f_delete', 'int', 0);
  59. if ($f_delete) {
  60. // delete the source article type
  61. $at = new ArticleType($f_src);
  62. $at->delete();
  63. }
  64. camp_html_goto_page("/$ADMIN/article_types/");
  65. exit(0);
  66. }
  67. }
  68. //
  69. // Otherwise, we are in preview mode, so render up a preview
  70. //
  71. if ($ok) {
  72. //
  73. // calculate where this article is in relation to all the articles of the src type
  74. //
  75. $articlesArray = $src->getArticlesArray();
  76. if (!count($articlesArray)) {
  77. $errMsgs[] = getGS("No articles.");
  78. $ok = false;
  79. }
  80. if ($ok) {
  81. $f_cur_preview = trim(Input::get('f_cur_preview', 'int', $articlesArray[0])); // The currently previewed article
  82. $tmp = array_keys($articlesArray, $f_cur_preview);
  83. $curPos = $tmp[0]; // used for calculating the next / prev arrows
  84. // calculate the first language of an article number
  85. // and also the number of translations associated with an article number
  86. global $g_ado_db;
  87. $sql = "SELECT * FROM X$f_src WHERE NrArticle=$f_cur_preview";
  88. $rows = $g_ado_db->GetAll($sql);
  89. if (!count($rows)) {
  90. $errMsgs[] = getGS('There is no article associated with the preview.');
  91. $ok = false;
  92. }
  93. }
  94. if ($ok) {
  95. $numberOfTranslations = count($rows);
  96. $firstLanguage = $rows[0]['IdLanguage'];
  97. $curPreview = new Article($firstLanguage, $f_cur_preview);
  98. $articleCreator = new User($curPreview->getCreatorId());
  99. $articleData = $dest->getPreviewArticleData();
  100. $dbColumns = $articleData->getUserDefinedColumns(1, true);
  101. $srcArticleData = $curPreview->getArticleData();
  102. $srcDbColumns = $srcArticleData->getUserDefinedColumns(1, true);
  103. $getString = '';
  104. foreach ($_GET as $k => $v) {
  105. if ( ($k != 'f_action') && ($k != 'f_preview_action') ) {
  106. $getString .= "&$k=$v";
  107. }
  108. }
  109. foreach ($_POST as $k => $v) {
  110. if ( ($k != 'f_action') && ($k != 'f_prev_action') ) {
  111. $getString .= "&$k=$v";
  112. }
  113. }
  114. $getString = substr($getString, 1);
  115. $crumbs = array();
  116. $crumbs[] = array(getGS("Configure"), "");
  117. $crumbs[] = array(getGS("Article Types"), "/$ADMIN/article_types/");
  118. $crumbs[] = array(getGS("Merge article type"), "");
  119. echo camp_html_breadcrumbs($crumbs);
  120. ?>
  121. <P>
  122. <FORM NAME="dialog" METHOD="POST" ACTION="merge3.php?f_src=<?php print $f_src; ?>&f_dest=<?php print $f_dest; ?>">
  123. <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="6" CLASS="table_input">
  124. <TR>
  125. <TD COLSPAN="2">
  126. <b><?php putGS("Merge Article Types: Step $1 of $2", "3", "3"); ?></b>
  127. <HR NOSHADE SIZE="1" COLOR="BLACK">
  128. </TD>
  129. </TR>
  130. <TR>
  131. <TD COLSPAN="2">
  132. <b><?php putGS("Merge configuration for merging $1 into $2.", $src->getDisplayName(), $dest->getDisplayName()); ?></b>
  133. <BR>
  134. <UL>
  135. <?php
  136. foreach ($f_src_c as $destColumn => $srcColumn) {
  137. $tmp = array_keys($f_src_c, $srcColumn);
  138. if ($srcColumn == 'NULL') {
  139. ?>
  140. <LI><FONT COLOR="TAN"><?php putGS("Merge $1 into $2", "<b>".getGS("NOTHING")."</b>", "<b>". $destColumn ."</b>"); ?> <?php putGS("(Null merge warning.)"); ?></FONT></LI>
  141. <?php
  142. } else if (count($tmp) > 1) {
  143. ?>
  144. <LI><FONT COLOR="TAN"><?php putGS("Merge $1 into $2", "<b>".$srcColumn."</b>", "<b>". $destColumn ."</b>"); ?> <?php putGS("(Duplicate warning.)"); ?></FONT></LI>
  145. <?php
  146. } else {
  147. ?>
  148. <LI><FONT COLOR="GREEN"><?php putGS("Merge $1 into $2", "<b>".$srcColumn."</b>", "<b>". $destColumn ."</b>"); ?></FONT></LI>
  149. <?php
  150. }
  151. }
  152. // display the warning in red if the user select NONE
  153. foreach ($src->getUserDefinedColumns(null, true, true) as $srcColumn) {
  154. if (array_search($srcColumn->getPrintName(), $f_src_c) === false) {
  155. ?><LI><FONT COLOR="RED"><?php putGS("(!) Do NOT merge $1", "<B>". $srcColumn->getPrintName() ."</B>"); ?> <?php putGS("(No merge warning.)"); ?></FONT></LI><?php
  156. }
  157. } ?>
  158. </UL>
  159. </TD>
  160. </TR>
  161. <TR>
  162. <TD COLSPAN="2">
  163. <B><?php putGS("Preview a sample of the merge configuration."); ?></B> <SMALL><?php putGS("Cycle through your articles to verify that the merge configuration is correct."); ?></SMALL>
  164. </TD>
  165. </TR>
  166. <TR>
  167. <TD COLSPAN="2">
  168. <?php if ($f_prev_action == 'Orig') { ?>
  169. <B><?php putGS("View of original ($1) $2", htmlspecialchars($curPreview->getType()), $curPreview->getTitle()); ?>
  170. (<A HREF="/<?php print $ADMIN; ?>/article_types/merge3.php?<?php print $getString; ?>">
  171. <?php putGS("To return to the preview click here"); ?></a>)</B>
  172. <?php } else { ?>
  173. <B><?php putGS("Preview of $1", wordwrap(htmlspecialchars($curPreview->getTitle()), 60, '<BR>')); ?>
  174. (<A HREF="/<?php print $ADMIN; ?>/article_types/merge3.php?f_action=Orig&<?php print $getString; ?>"><?php putGS("View the source ($1) version of $2", $src->getDisplayName(), wordwrap(htmlspecialchars($curPreview->getTitle()), 60, '<BR>')); ?></A>)
  175. <?php putGS("$1 of $2", $curPos + 1, count($articlesArray)); ?>.
  176. <?php
  177. if (isset($articlesArray[$curPos - 1])) {
  178. $prevArticle = $articlesArray[$curPos - 1];
  179. ?>
  180. <A HREF="/<?php print $ADMIN; ?>/article_types/merge3.php?<?php print $getString; ?>&f_cur_preview=<?php print $prevArticle; ?>"><IMG BORDER="0" SRC="<?php echo $Campsite["ADMIN_IMAGE_BASE_URL"]; ?>/previous.png" BORDER="0"></a>&nbsp;
  181. <?php
  182. }
  183. if (isset($articlesArray[$curPos + 1])) {
  184. $nextArticle = $articlesArray[$curPos + 1];
  185. ?>
  186. <A HREF="/<?php print $ADMIN; ?>/article_types/merge3.php?<?php print $getString; ?>&f_cur_preview=<?php print $nextArticle; ?>"><IMG BORDER="0" SRC="<?php echo $Campsite["ADMIN_IMAGE_BASE_URL"]; ?>/next.png" BORDER="0"></a>
  187. <?php
  188. }
  189. } // else
  190. ?>
  191. <BR><?php putGS("This is the first translation of $1", $numberOfTranslations); ?>
  192. </TD>
  193. </TR>
  194. <TR>
  195. <TD COLSPAN="2">
  196. <TABLE BORDER="1">
  197. <tr>
  198. <td valign="top">
  199. <!-- BEGIN article content -->
  200. <table>
  201. <TR>
  202. <TD style="padding-top: 3px;">
  203. <TABLE>
  204. <TR>
  205. <TD ALIGN="RIGHT" valign="top" ><b><?php putGS("Name"); ?>:</b></TD>
  206. <TD align="left" valign="top">
  207. <?php print wordwrap(htmlspecialchars($curPreview->getTitle()), 60, "<br>"); ?>
  208. </TD>
  209. <TD ALIGN="RIGHT" valign="top"><b><?php putGS("Created by"); ?>:</b></TD>
  210. <TD align="left" valign="top"><?php p(htmlspecialchars($articleCreator->getRealName())); ?></TD>
  211. <TD ALIGN="RIGHT" valign="top"></TD>
  212. <TD align="left" valign="top" style="padding-top: 0.25em;">
  213. <?php putGS('Show article on front page'); ?>
  214. </TD>
  215. </TR>
  216. <TR>
  217. <TD ALIGN="RIGHT" valign="top" style="padding-left: 1em;"><b><?php putGS("Type"); ?>:</b></TD>
  218. <TD align="left" valign="top">
  219. <?php print htmlspecialchars($dest->getDisplayName()); ?>
  220. </TD>
  221. <TD ALIGN="RIGHT" valign="top" style="padding-left: 1em;"><b><nobr><?php putGS("Creation date"); ?>:</nobr></b></TD>
  222. <TD align="left" valign="top" nowrap>
  223. <?php print $curPreview->getCreationDate(); ?>
  224. </TD>
  225. <TD ALIGN="RIGHT" valign="top" style="padding-left: 1em;"></TD>
  226. <TD align="left" valign="top" style="padding-top: 0.25em;">
  227. <?php putGS('Show article on section page'); ?>
  228. </TD>
  229. </TR>
  230. <TR>
  231. <td align="right" valign="top" nowrap><b><?php putGS("Number"); ?>:</b></td>
  232. <td align="left" valign="top" style="padding-top: 2px; padding-left: 4px;"><?php p($curPreview->getArticleNumber()); ?> <?php if (isset($publicationObj) && $publicationObj->getUrlTypeId() == 2) { ?>
  233. &nbsp;(<a href="/<?php echo $languageObj->getCode()."/".$issueObj->getUrlName()."/".$sectionObj->getUrlName()."/".$curPreview->getUrlName(); ?>"><?php putGS("Link to public page"); ?></a>)<?php } ?></td>
  234. <TD ALIGN="RIGHT" valign="top" style="padding-left: 1em;"><b><?php putGS("Publish date"); ?>:</b></TD>
  235. <TD align="left" valign="top">
  236. <?php print htmlspecialchars($curPreview->getPublishDate()); ?>
  237. </TD>
  238. <TD ALIGN="RIGHT" valign="top" style="padding-left: 1em;"></TD>
  239. <TD align="left" valign="top" style="padding-top: 0.25em;">
  240. <?php putGS('Allow users without subscriptions to view the article'); ?>
  241. </TD>
  242. </TR>
  243. </TABLE>
  244. </TD>
  245. </TR>
  246. <TR>
  247. <TD style="border-top: 1px solid #8baed1; padding-top: 3px;">
  248. <TABLE>
  249. <TR>
  250. <td align="left" style="padding-right: 5px;">
  251. </td>
  252. <TD ALIGN="RIGHT" ><?php putGS("Keywords"); ?>:</TD>
  253. <TD>
  254. <?php print htmlspecialchars($curPreview->getKeywords()); ?>
  255. </TD>
  256. </TR>
  257. <?php
  258. // Display the article type fields.
  259. $i = 0;
  260. if ($f_prev_action == 'Orig') $dbColumns = $srcDbColumns;
  261. foreach ($dbColumns as $dbColumn) {
  262. if ($dbColumn->getType() == ArticleTypeField::TYPE_TEXT) {
  263. // Single line text fields
  264. ?>
  265. <TR>
  266. <td align="left" style="padding-right: 5px;">
  267. </td>
  268. <td align="right">
  269. <?php echo htmlspecialchars($dbColumn->getDisplayName()); ?>:
  270. </td>
  271. <TD>
  272. <?php
  273. if ($f_prev_action == 'Orig')
  274. print htmlspecialchars($srcArticleData->getProperty($dbColumn->getName()));
  275. else if ($f_src_c[$dbColumn->getPrintName()] != 'NULL')
  276. print htmlspecialchars($srcArticleData->getProperty('F'. $f_src_c[$dbColumn->getPrintName()]));
  277. else
  278. print '';
  279. ?>
  280. </TD>
  281. </TR>
  282. <?php
  283. } elseif ($dbColumn->getType() == ArticleTypeField::TYPE_DATE) {
  284. // Date fields
  285. ?>
  286. <TR>
  287. <td align="left" style="padding-right: 5px;">
  288. </td>
  289. <td align="right">
  290. <?php
  291. echo htmlspecialchars($dbColumn->getDisplayName()); ?>:
  292. </td>
  293. <TD>
  294. <span style="padding-left: 4px; padding-right: 4px; padding-top: 1px; padding-bottom: 1px; border: 1px solid #888; margin-right: 5px; background-color: #EEEEEE;">
  295. <?php
  296. if ($f_prev_action == 'Orig')
  297. echo htmlspecialchars($srcArticleData->getProperty($dbColumn->getName()));
  298. elseif ($srcArticleData->getProperty('F'.$f_src_c[$dbColumn->getPrintName()]) != 'NULL')
  299. echo htmlspecialchars($srcArticleData->getProperty('F'. $f_src_c[$dbColumn->getPrintName()]));
  300. else
  301. echo '';
  302. ?>
  303. </span>
  304. <?php putGS('YYYY-MM-DD'); ?>
  305. </TD>
  306. </TR>
  307. <?php
  308. } elseif ($dbColumn->getType() == ArticleTypeField::TYPE_BODY) {
  309. // Multiline text fields
  310. // Transform Campsite-specific tags into editor-friendly tags.
  311. if ($f_prev_action == 'Orig') {
  312. $text = $srcArticleData->getProperty($dbColumn->getName());
  313. } elseif ($f_src_c[$dbColumn->getPrintName()] != 'NULL') {
  314. $text = $srcArticleData->getProperty('F'. $f_src_c[$dbColumn->getPrintName()]);
  315. } else {
  316. $text = '';
  317. }
  318. // Subheads
  319. $text = preg_replace("/<!\*\*\s*Title\s*>/i", "<span class=\"campsite_subhead\">", $text);
  320. $text = preg_replace("/<!\*\*\s*EndTitle\s*>/i", "</span>", $text);
  321. // Internal Links with targets
  322. $text = preg_replace("/<!\*\*\s*Link\s*Internal\s*([\w=&]*)\s*target\s*([\w_]*)\s*>/i", '<a href="/campsite/campsite1_internal_link?$1" target="$2">', $text);
  323. // Internal Links without targets
  324. $text = preg_replace("/<!\*\*\s*Link\s*Internal\s*([\w=&]*)\s*>/i", '<a href="/campsite/campsite1_internal_link?$1">', $text);
  325. // End link
  326. $text = preg_replace("/<!\*\*\s*EndLink\s*>/i", "</a>", $text);
  327. // Images
  328. preg_match_all("/<!\*\*\s*Image\s*([\d]*)\s*/i",$text, $imageMatches);
  329. if (isset($imageMatches[1][0])) {
  330. foreach ($imageMatches[1] as $templateId) {
  331. // Get the image URL
  332. $articleImage = new ArticleImage($srcArticleData->getProperty('NrArticle'), null, $templateId);
  333. $image = new Image($articleImage->getImageId());
  334. $imageUrl = $image->getImageUrl();
  335. $text = preg_replace("/<!\*\*\s*Image\s*".$templateId."\s*/i", '<img src="'.$imageUrl.'" id="'.$templateId.'" ', $text);
  336. }
  337. }
  338. ?>
  339. <TR>
  340. <TD ALIGN="RIGHT" VALIGN="TOP" style="padding-top: 8px; padding-right: 5px;">
  341. </td>
  342. <td align="right" valign="top" style="padding-top: 8px;">
  343. <?php echo htmlspecialchars($dbColumn->getDisplayName()); ?>:
  344. </td>
  345. <TD align="left" valign="top">
  346. <table cellpadding="0" cellspacing="0" width="100%">
  347. <tr>
  348. <td align="left" style="padding: 5px; <?php if (!empty($text)) {?>border: 1px solid #888; margin-right: 5px;<?php } ?>" <?php if (!empty($text)) {?>bgcolor="#EEEEEE"<?php } ?>><?php p($text); ?></td>
  349. </tr>
  350. </table>
  351. </TD>
  352. </TR>
  353. <?php
  354. } elseif ($dbColumn->getType() == ArticleTypeField::TYPE_TOPIC) {
  355. ?>
  356. <tr>
  357. <TD ALIGN="RIGHT" VALIGN="TOP" style="padding-top: 8px; padding-right: 5px;">
  358. </td>
  359. <td align="right">
  360. <?php echo htmlspecialchars($dbColumn->getDisplayName()); ?>:
  361. </td>
  362. <td>
  363. <?php
  364. $topicId = $srcArticleData->getProperty('F'. $f_src_c[$dbColumn->getPrintName()]);
  365. $topic = new Topic($topicId);
  366. echo $topic->getName(camp_session_get('LoginLanguageId', 1));
  367. ?>
  368. </td>
  369. </tr>
  370. <?php
  371. } elseif ($dbColumn->getType() == ArticleTypeField::TYPE_SWITCH) {
  372. $checked = $srcArticleData->getFieldValue($dbColumn->getPrintName()) ? 'checked' : '';
  373. ?>
  374. <tr>
  375. <TD ALIGN="RIGHT" VALIGN="TOP" style="padding-top: 8px; padding-right: 5px;">
  376. </td>
  377. <td align="right"><?php echo htmlspecialchars($dbColumn->getDisplayName()); ?>:</td>
  378. <td>
  379. <input type="checkbox" <?php echo $checked; ?> class="input_checkbox" name="<?php echo $dbColumn->getName(); ?>" id="<?php echo $dbColumn->getName(); ?>" disabled>
  380. </td>
  381. </tr>
  382. <?php
  383. }
  384. } // foreach ($dbColumns as $dbColumn)
  385. ?>
  386. </TABLE>
  387. </TD>
  388. </TR>
  389. </TABLE>
  390. <!-- END Article Content -->
  391. </TD></TR></TABLE>
  392. </TD>
  393. </TR>
  394. <TR>
  395. <TD>
  396. <INPUT TYPE="CHECKBOX" NAME="f_delete"><?php putGS("Delete the source article type ($1) when finished.", $src->getDisplayName()); ?>
  397. </TD>
  398. <TD>
  399. <b><?php putGS('Clicking "Merge" will merge ($1) article(s).', $src->getNumArticles()); ?></b>
  400. </TD>
  401. <TR>
  402. <TD COLSPAN="2">
  403. <DIV ALIGN="CENTER">
  404. <?php foreach ($dest->getUserDefinedColumns(null, true, true) as $destColumn) { ?>
  405. <INPUT TYPE="HIDDEN" NAME="f_src_<?php print $destColumn->getPrintName(); ?>" VALUE="<?php print $f_src_c[$destColumn->getPrintName()]; ?>">
  406. <?php } ?>
  407. <INPUT TYPE="HIDDEN" NAME="f_cur_preview" VALUE="<?php $curPreview->getArticleNumber(); ?>">
  408. <INPUT TYPE="HIDDEN" NAME="f_action" VALUE="">
  409. <INPUT TYPE="submit" class="button" NAME="Ok" ONCLICK="dialog.f_action.value='Step2'" VALUE="<?php putGS('Back to Step 2'); ?>">
  410. <INPUT TYPE="submit" class="button" NAME="Ok" ONCLICK="dialog.f_action.value='Merge'" VALUE="<?php putGS('Merge!'); ?>">
  411. </DIV>
  412. </TD>
  413. </TR>
  414. </TABLE>
  415. </FORM>
  416. <P>
  417. <?php camp_html_copyright_notice(); ?>
  418. <?php
  419. } // end if ok
  420. } // end if ok
  421. if (!$ok) {
  422. $crumbs = array();
  423. $crumbs[] = array(getGS("Configure"), "");
  424. $crumbs[] = array(getGS("Article Types"), "/$ADMIN/article_types/");
  425. $crumbs[] = array(getGS("Merge article type"), "");
  426. echo camp_html_breadcrumbs($crumbs);
  427. ?>
  428. <P>
  429. <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="8" class="message_box">
  430. <TR>
  431. <TD COLSPAN="2">
  432. <B> <?php putGS("Merge article type"); ?> </B>
  433. <HR NOSHADE SIZE="1" COLOR="BLACK">
  434. </TD>
  435. </TR>
  436. <TR>
  437. <TD COLSPAN="2">
  438. <BLOCKQUOTE>
  439. <?php
  440. foreach ($errMsgs as $errorMsg) {
  441. echo "<li>".$errorMsg."</li>";
  442. }
  443. ?>
  444. </BLOCKQUOTE>
  445. </TD>
  446. </TR>
  447. <TR>
  448. <TD COLSPAN="2">
  449. <DIV ALIGN="CENTER">
  450. <INPUT TYPE="button" class="button" NAME="OK" VALUE="<?php putGS('OK'); ?>" ONCLICK="location.href='/<?php p($ADMIN); ?>/article_types/merge2.php?f_src=<?php echo $f_src; ?>&f_dest=<?php echo $f_dest . $getString ?>'">
  451. </DIV>
  452. </TD>
  453. </TR>
  454. </TABLE>
  455. <P>
  456. <?php echo camp_html_copyright_notice(); ?>
  457. <?php
  458. } ?>