ManageNews.template.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. <?php
  2. /**
  3. * Simple Machines Forum (SMF)
  4. *
  5. * @package SMF
  6. * @author Simple Machines
  7. * @copyright 2011 Simple Machines
  8. * @license http://www.simplemachines.org/about/smf/license.php BSD
  9. *
  10. * @version 2.1 Alpha 1
  11. */
  12. function template_email_members()
  13. {
  14. global $context, $settings, $options, $txt, $scripturl;
  15. echo '
  16. <div id="admincenter">
  17. <form action="', $scripturl, '?action=admin;area=news;sa=mailingcompose" method="post" class="flow_hidden" accept-charset="', $context['character_set'], '">
  18. <div class="cat_bar">
  19. <h3 class="catbg">', $txt['admin_newsletters'], '</h3>
  20. </div>
  21. <div class="information">
  22. ', $txt['admin_news_select_recipients'], '
  23. </div>
  24. <div class="windowbg">
  25. <div class="content">
  26. <dl class="settings">
  27. <dt>
  28. <strong>', $txt['admin_news_select_group'], ':</strong><br />
  29. <span class="smalltext">', $txt['admin_news_select_group_desc'], '</span>
  30. </dt>
  31. <dd>';
  32. foreach ($context['groups'] as $group)
  33. echo '
  34. <label for="groups_', $group['id'], '"><input type="checkbox" name="groups[', $group['id'], ']" id="groups_', $group['id'], '" value="', $group['id'], '" checked="checked" class="input_check" /> ', $group['name'], '</label> <em>(', $group['member_count'], ')</em><br />';
  35. echo '
  36. <br />
  37. <label for="checkAllGroups"><input type="checkbox" id="checkAllGroups" checked="checked" onclick="invertAll(this, this.form, \'groups\');" class="input_check" /> <em>', $txt['check_all'], '</em></label>';
  38. echo '
  39. </dd>
  40. </dl><br class="clear" />
  41. </div>
  42. </div>
  43. <br />
  44. <div class="cat_bar">
  45. <h3 class="catbg">
  46. <img id="advanced_panel_toggle" class="panel_toggle" style="display: none; src="', $settings['images_url'], '/', empty($context['show_advanced_options']) ? 'collapse' : 'expand', '.png" alt="*" />
  47. <a href="#" id="advanced_panel_link" >', $txt['advanced'], '</a>
  48. </h3>
  49. </div>
  50. <div id="advanced_panel_div" class="windowbg2">
  51. <div class="content">
  52. <dl class="settings">
  53. <dt>
  54. <strong>', $txt['admin_news_select_email'], ':</strong><br />
  55. <span class="smalltext">', $txt['admin_news_select_email_desc'], '</span>
  56. </dt>
  57. <dd>
  58. <textarea name="emails" rows="5" cols="30" style="' . (isBrowser('is_ie8') ? 'width: 635px; max-width: 98%; min-width: 98%' : 'width: 98%') . ';"></textarea>
  59. </dd>
  60. <dt>
  61. <strong>', $txt['admin_news_select_members'], ':</strong><br />
  62. <span class="smalltext">', $txt['admin_news_select_members_desc'], '</span>
  63. </dt>
  64. <dd>
  65. <input type="text" name="members" id="members" value="" size="30" class="input_text" />
  66. <span id="members_container"></span>
  67. </dd>
  68. </dl>
  69. <hr class="bordercolor" />
  70. <dl class="settings">
  71. <dt>
  72. <strong>', $txt['admin_news_select_excluded_groups'], ':</strong><br />
  73. <span class="smalltext">', $txt['admin_news_select_excluded_groups_desc'], '</span>
  74. </dt>
  75. <dd>';
  76. foreach ($context['groups'] as $group)
  77. echo '
  78. <label for="exclude_groups_', $group['id'], '"><input type="checkbox" name="exclude_groups[', $group['id'], ']" id="exclude_groups_', $group['id'], '" value="', $group['id'], '" class="input_check" /> ', $group['name'], '</label> <em>(', $group['member_count'], ')</em><br />';
  79. echo '
  80. <br />
  81. <label for="checkAllGroupsExclude"><input type="checkbox" id="checkAllGroupsExclude" onclick="invertAll(this, this.form, \'exclude_groups\');" class="input_check" /> <em>', $txt['check_all'], '</em></label><br />
  82. </dd>
  83. <dt>
  84. <strong>', $txt['admin_news_select_excluded_members'], ':</strong><br />
  85. <span class="smalltext">', $txt['admin_news_select_excluded_members_desc'], '</span>
  86. </dt>
  87. <dd>
  88. <input type="text" name="exclude_members" id="exclude_members" value="" size="30" class="input_text" />
  89. <span id="exclude_members_container"></span>
  90. </dd>
  91. </dl>
  92. <hr class="bordercolor" />
  93. <dl class="settings">
  94. <dt>
  95. <label for="email_force"><strong>', $txt['admin_news_select_override_notify'], ':</strong></label><br />
  96. <span class="smalltext">', $txt['email_force'], '</span>
  97. </dt>
  98. <dd>
  99. <input type="checkbox" name="email_force" id="email_force" value="1" class="input_check" />
  100. </dd>
  101. </dl><br class="clear" />
  102. </div>
  103. </div>
  104. <div class="righttext">
  105. <input type="submit" value="', $txt['admin_next'], '" class="button_submit" />
  106. <input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
  107. </div>
  108. </form>
  109. </div>
  110. <br class="clear" />';
  111. // This is some javascript for the simple/advanced toggling and member suggest
  112. echo '
  113. <script type="text/javascript"><!-- // --><![CDATA[
  114. var oAdvancedPanelToggle = new smc_Toggle({
  115. bToggleEnabled: true,
  116. bCurrentlyCollapsed: ', empty($context['show_advanced_options']) ? 'true' : 'false', ',
  117. aSwappableContainers: [
  118. \'advanced_panel_div\'
  119. ],
  120. aSwapImages: [
  121. {
  122. sId: \'advanced_panel_toggle\',
  123. srcExpanded: smf_images_url + \'/collapse.png\',
  124. altExpanded: ', JavaScriptEscape($txt['upshrink_description']), ',
  125. srcCollapsed: smf_images_url + \'/expand.png\',
  126. altCollapsed: ', JavaScriptEscape($txt['upshrink_description']), '
  127. }
  128. ],
  129. aSwapLinks: [
  130. {
  131. sId: \'advanced_panel_link\',
  132. msgExpanded: ', JavaScriptEscape($txt['advanced']), ',
  133. msgCollapsed: ', JavaScriptEscape($txt['advanced']), '
  134. }
  135. ],
  136. oThemeOptions: {
  137. bUseThemeSettings: ', $context['user']['is_guest'] ? 'false' : 'true', ',
  138. sOptionName: \'admin_preferences\',
  139. sSessionVar: smf_session_var,
  140. sSessionId: smf_session_id,
  141. sThemeId: \'1\'
  142. }
  143. });
  144. // ]]></script>
  145. <script type="text/javascript" src="', $settings['default_theme_url'], '/scripts/suggest.js?alp21"></script>
  146. <script type="text/javascript"><!-- // --><![CDATA[
  147. var oMemberSuggest = new smc_AutoSuggest({
  148. sSelf: \'oMemberSuggest\',
  149. sSessionId: smf_session_id,
  150. sSessionVar: smf_session_var,
  151. sSuggestId: \'members\',
  152. sControlId: \'members\',
  153. sSearchType: \'member\',
  154. bItemList: true,
  155. sPostName: \'member_list\',
  156. sURLMask: \'action=profile;u=%item_id%\',
  157. sTextDeleteItem: \'', $txt['autosuggest_delete_item'], '\',
  158. sItemListContainerId: \'members_container\',
  159. aListItems: []
  160. });
  161. var oExcludeMemberSuggest = new smc_AutoSuggest({
  162. sSelf: \'oExcludeMemberSuggest\',
  163. sSessionId: \'', $context['session_id'], '\',
  164. sSessionVar: \'', $context['session_var'], '\',
  165. sSuggestId: \'exclude_members\',
  166. sControlId: \'exclude_members\',
  167. sSearchType: \'member\',
  168. bItemList: true,
  169. sPostName: \'exclude_member_list\',
  170. sURLMask: \'action=profile;u=%item_id%\',
  171. sTextDeleteItem: \'', $txt['autosuggest_delete_item'], '\',
  172. sItemListContainerId: \'exclude_members_container\',
  173. aListItems: []
  174. });
  175. // ]]></script>';
  176. }
  177. function template_email_members_compose()
  178. {
  179. global $context, $settings, $options, $txt, $scripturl;
  180. echo '
  181. <div id="preview_section"', isset($context['preview_message']) ? '' : ' style="display: none;"', '>
  182. <div class="cat_bar">
  183. <h3 class="catbg">
  184. <span id="preview_subject">', empty($context['preview_subject']) ? '' : $context['preview_subject'], '</span>
  185. </h3>
  186. </div>
  187. <div class="windowbg">
  188. <div class="content">
  189. <div class="post" id="preview_body">
  190. ', empty($context['preview_message']) ? '<br />' : $context['preview_message'], '
  191. </div>
  192. </div>
  193. </div>
  194. </div><br />';
  195. echo '
  196. <div id="admincenter">
  197. <form name="newsmodify" action="', $scripturl, '?action=admin;area=news;sa=mailingsend" method="post" accept-charset="', $context['character_set'], '">
  198. <div class="cat_bar">
  199. <h3 class="catbg">
  200. <a href="', $scripturl, '?action=helpadmin;help=email_members" onclick="return reqOverlayDiv(this.href);" class="help"><img src="', $settings['images_url'], '/helptopics.png" alt="', $txt['help'], '" class="icon" /></a> ', $txt['admin_newsletters'], '
  201. </h3>
  202. </div>
  203. <div class="information">
  204. ', $txt['email_variables'], '
  205. </div>
  206. <div class="windowbg">
  207. <div class="content">
  208. <div class="', empty($context['error_type']) || $context['error_type'] != 'serious' ? 'noticebox' : 'errorbox', '"', empty($context['post_error']['messages']) ? ' style="display: none"' : '', ' id="errors">
  209. <dl>
  210. <dt>
  211. <strong id="error_serious">', $txt['error_while_submitting'] , '</strong>
  212. </dt>
  213. <dd class="error" id="error_list">
  214. ', empty($context['post_error']['messages']) ? '' : implode('<br />', $context['post_error']['messages']), '
  215. </dd>
  216. </dl>
  217. </div>
  218. <dl id="post_header">
  219. <dt class="clear_left">
  220. <span', (isset($context['post_error']['no_subject']) ? ' class="error"' : ''), ' id="caption_subject">', $txt['subject'], ':</span>
  221. </dt>
  222. <dd id="pm_subject">
  223. <input type="text" name="subject" value="', $context['subject'], '" tabindex="', $context['tabindex']++, '" size="60" maxlength="60"',isset($context['post_error']['no_subject']) ? ' class="error"' : ' class="input_text"', '/>
  224. </dd>
  225. </dl><hr class="clear" />
  226. <div id="bbcBox_message"></div>';
  227. // What about smileys?
  228. if (!empty($context['smileys']['postform']) || !empty($context['smileys']['popup']))
  229. echo '
  230. <div id="smileyBox_message"></div>';
  231. // Show BBC buttons, smileys and textbox.
  232. echo '
  233. ', template_control_richedit($context['post_box_name'], 'smileyBox_message', 'bbcBox_message');
  234. echo '
  235. <ul class="reset">
  236. <li><label for="send_pm"><input type="checkbox" name="send_pm" id="send_pm" ', !empty($context['send_pm']) ? 'checked="checked"' : '', 'class="input_check" onclick="checkboxes_status(this);" /> ', $txt['email_as_pms'], '</label></li>
  237. <li><label for="send_html"><input type="checkbox" name="send_html" id="send_html" ', !empty($context['send_html']) ? 'checked="checked"' : '', 'class="input_check" onclick="checkboxes_status(this);" /> ', $txt['email_as_html'], '</label></li>
  238. <li><label for="parse_html"><input type="checkbox" name="parse_html" id="parse_html" checked="checked" disabled="disabled" class="input_check" /> ', $txt['email_parsed_html'], '</label></li>
  239. </ul>
  240. <p id="shortcuts" class="smalltext">
  241. ', isBrowser('is_firefox') ? $txt['shortcuts_firefox'] : $txt['shortcuts'], '
  242. </p>
  243. <p id="post_confirm_strip" class="righttext">
  244. ', template_control_richedit_buttons($context['post_box_name']), '
  245. </p>
  246. </div>
  247. </div>
  248. <input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
  249. <input type="hidden" name="email_force" value="', $context['email_force'], '" />
  250. <input type="hidden" name="total_emails" value="', $context['total_emails'], '" />
  251. <input type="hidden" name="max_id_member" value="', $context['max_id_member'], '" />';
  252. foreach ($context['recipients'] as $key => $values)
  253. echo '
  254. <input type="hidden" name="', $key, '" value="', implode(($key == 'emails' ? ';' : ','), $values), '" />';
  255. echo '
  256. <script type="text/javascript"><!-- // --><![CDATA[';
  257. // The functions used to preview a posts without loading a new page.
  258. echo '
  259. var txt_preview_title = "', $txt['preview_title'], '";
  260. var txt_preview_fetch = "', $txt['preview_fetch'], '";
  261. function previewPost()
  262. {';
  263. if (isBrowser('is_firefox'))
  264. echo '
  265. // Firefox doesn\'t render <marquee> that have been put it using javascript
  266. if (document.forms.newsmodify.elements[', JavaScriptEscape($context['post_box_name']), '].value.indexOf(\'[move]\') != -1)
  267. {
  268. return submitThisOnce(document.forms.newsmodify);
  269. }';
  270. echo '
  271. if (window.XMLHttpRequest)
  272. {
  273. // Opera didn\'t support setRequestHeader() before 8.01.
  274. // @todo Remove support for old browsers
  275. if (\'opera\' in window)
  276. {
  277. var test = new XMLHttpRequest();
  278. if (!(\'setRequestHeader\' in test))
  279. return submitThisOnce(document.forms.newsmodify);
  280. }
  281. // @todo Currently not sending poll options and option checkboxes.
  282. var x = new Array();
  283. var textFields = [\'subject\', ', JavaScriptEscape($context['post_box_name']), '];
  284. var checkboxFields = [\'send_html\', \'send_pm\'];
  285. for (var i = 0, n = textFields.length; i < n; i++)
  286. if (textFields[i] in document.forms.newsmodify)
  287. {
  288. // Handle the WYSIWYG editor.
  289. if (textFields[i] == ', JavaScriptEscape($context['post_box_name']), ' && ', JavaScriptEscape('oEditorHandle_' . $context['post_box_name']), ' in window && oEditorHandle_', $context['post_box_name'], '.bRichTextEnabled)
  290. x[x.length] = \'message_mode=1&\' + textFields[i] + \'=\' + oEditorHandle_', $context['post_box_name'], '.getText(false).replace(/&#/g, \'&#38;#\').php_to8bit().php_urlencode();
  291. else
  292. x[x.length] = textFields[i] + \'=\' + document.forms.newsmodify[textFields[i]].value.replace(/&#/g, \'&#38;#\').php_to8bit().php_urlencode();
  293. }
  294. for (var i = 0, n = checkboxFields.length; i < n; i++)
  295. if (checkboxFields[i] in document.forms.newsmodify && document.forms.newsmodify.elements[checkboxFields[i]].checked)
  296. x[x.length] = checkboxFields[i] + \'=\' + document.forms.newsmodify.elements[checkboxFields[i]].value;
  297. x[x.length] = \'item=newsletterpreview\';
  298. sendXMLDocument(smf_prepareScriptUrl(smf_scripturl) + \'action=xmlhttp;sa=previews;xml\', x.join(\'&\'), onDocSent);
  299. document.getElementById(\'preview_section\').style.display = \'\';
  300. setInnerHTML(document.getElementById(\'preview_subject\'), txt_preview_title);
  301. setInnerHTML(document.getElementById(\'preview_body\'), txt_preview_fetch);
  302. return false;
  303. }
  304. else
  305. return submitThisOnce(document.forms.newsmodify);
  306. }
  307. function onDocSent(XMLDoc)
  308. {
  309. if (!XMLDoc)
  310. {
  311. document.forms.newsmodify.preview.onclick = new function ()
  312. {
  313. return true;
  314. }
  315. document.forms.newsmodify.preview.click();
  316. }
  317. // Show the preview section.
  318. var preview = XMLDoc.getElementsByTagName(\'smf\')[0].getElementsByTagName(\'preview\')[0];
  319. setInnerHTML(document.getElementById(\'preview_subject\'), preview.getElementsByTagName(\'subject\')[0].firstChild.nodeValue);
  320. var bodyText = \'\';
  321. for (var i = 0, n = preview.getElementsByTagName(\'body\')[0].childNodes.length; i < n; i++)
  322. bodyText += preview.getElementsByTagName(\'body\')[0].childNodes[i].nodeValue;
  323. setInnerHTML(document.getElementById(\'preview_body\'), bodyText);
  324. document.getElementById(\'preview_body\').className = \'post\';
  325. // Show a list of errors (if any).
  326. var errors = XMLDoc.getElementsByTagName(\'smf\')[0].getElementsByTagName(\'errors\')[0];
  327. var errorList = new Array();
  328. for (var i = 0, numErrors = errors.getElementsByTagName(\'error\').length; i < numErrors; i++)
  329. errorList[errorList.length] = errors.getElementsByTagName(\'error\')[i].firstChild.nodeValue;
  330. document.getElementById(\'errors\').style.display = numErrors == 0 ? \'none\' : \'\';
  331. setInnerHTML(document.getElementById(\'error_list\'), numErrors == 0 ? \'\' : errorList.join(\'<br />\'));
  332. // Adjust the color of captions if the given data is erroneous.
  333. var captions = errors.getElementsByTagName(\'caption\');
  334. for (var i = 0, numCaptions = errors.getElementsByTagName(\'caption\').length; i < numCaptions; i++)
  335. if (document.getElementById(\'caption_\' + captions[i].getAttribute(\'name\')))
  336. document.getElementById(\'caption_\' + captions[i].getAttribute(\'name\')).className = captions[i].getAttribute(\'class\');
  337. if (errors.getElementsByTagName(\'post_error\').length == 1)
  338. document.forms.newsmodify.', $context['post_box_name'], '.style.border = \'1px solid red\';
  339. else if (document.forms.newsmodify.', $context['post_box_name'], '.style.borderColor == \'red\' || document.forms.newsmodify.', $context['post_box_name'], '.style.borderColor == \'red red red red\')
  340. {
  341. if (\'runtimeStyle\' in document.forms.newsmodify.', $context['post_box_name'], ')
  342. document.forms.newsmodify.', $context['post_box_name'], '.style.borderColor = \'\';
  343. else
  344. document.forms.newsmodify.', $context['post_box_name'], '.style.border = null;
  345. }
  346. location.hash = \'#\' + \'preview_section\';
  347. }';
  348. echo '
  349. // ]]></script>';
  350. echo '
  351. <script type="text/javascript"><!-- // --><![CDATA[
  352. function checkboxes_status (item)
  353. {
  354. if (item.id == \'send_html\')
  355. document.getElementById(\'parse_html\').disabled = !document.getElementById(\'parse_html\').disabled;
  356. if (item.id == \'send_pm\')
  357. {
  358. if (!document.getElementById(\'send_html\').checked)
  359. document.getElementById(\'parse_html\').disabled = true;
  360. else
  361. document.getElementById(\'parse_html\').disabled = false;
  362. document.getElementById(\'send_html\').disabled = !document.getElementById(\'send_html\').disabled;
  363. }
  364. }
  365. // ]]></script>
  366. </form>
  367. </div>
  368. <br class="clear" />';
  369. }
  370. function template_email_members_send()
  371. {
  372. global $context, $settings, $options, $txt, $scripturl;
  373. echo '
  374. <div id="admincenter">
  375. <form action="', $scripturl, '?action=admin;area=news;sa=mailingsend" method="post" accept-charset="', $context['character_set'], '" name="autoSubmit" id="autoSubmit">
  376. <div class="cat_bar">
  377. <h3 class="catbg">
  378. <a href="', $scripturl, '?action=helpadmin;help=email_members" onclick="return reqOverlayDiv(this.href);" class="help"><img src="', $settings['images_url'], '/helptopics.png" alt="', $txt['help'], '" /></a> ', $txt['admin_newsletters'], '
  379. </h3>
  380. </div>
  381. <div class="windowbg">
  382. <div class="content">
  383. <div class="progress_bar">
  384. <div class="full_bar">', $context['percentage_done'], '% ', $txt['email_done'], '</div>
  385. <div class="green_percent" style="width: ', $context['percentage_done'], '%;">&nbsp;</div>
  386. </div>
  387. <hr class="hrcolor" />
  388. <input type="submit" name="b" value="', $txt['email_continue'], '" class="button_submit" />
  389. <input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
  390. <input type="hidden" name="subject" value="', $context['subject'], '" />
  391. <input type="hidden" name="message" value="', $context['message'], '" />
  392. <input type="hidden" name="start" value="', $context['start'], '" />
  393. <input type="hidden" name="total_emails" value="', $context['total_emails'], '" />
  394. <input type="hidden" name="max_id_member" value="', $context['max_id_member'], '" />
  395. <input type="hidden" name="send_pm" value="', $context['send_pm'], '" />
  396. <input type="hidden" name="send_html" value="', $context['send_html'], '" />
  397. <input type="hidden" name="parse_html" value="', $context['parse_html'], '" />';
  398. // All the things we must remember!
  399. foreach ($context['recipients'] as $key => $values)
  400. echo '
  401. <input type="hidden" name="', $key, '" value="', implode(($key == 'emails' ? ';' : ','), $values), '" />';
  402. echo '
  403. <br class="clear_right" />
  404. </div>
  405. </div>
  406. </form>
  407. </div>
  408. <br class="clear" />
  409. <script type="text/javascript"><!-- // --><![CDATA[
  410. var countdown = 2;
  411. doAutoSubmit();
  412. function doAutoSubmit()
  413. {
  414. if (countdown == 0)
  415. document.forms.autoSubmit.submit();
  416. else if (countdown == -1)
  417. return;
  418. document.forms.autoSubmit.b.value = "', $txt['email_continue'], ' (" + countdown + ")";
  419. countdown--;
  420. setTimeout("doAutoSubmit();", 1000);
  421. }
  422. // ]]></script>';
  423. }
  424. ?>