From 4df31ab18fc4cf43202781f167ec807bb38d8f74 Mon Sep 17 00:00:00 2001 From: Tom Date: Tue, 20 May 2014 15:57:52 +0000 Subject: [PATCH] simpleportal installed --- Packages/SimplePortal_2.3.5.zip | Bin 0 -> 300923 bytes .../2014-05-19_backup_SimplePortal_2.tar.gz | Bin 0 -> 3390 bytes .../2014-05-19_before_SimplePortal_2.tar.gz | Bin 0 -> 3058 bytes .../2014-05-19_before_SimplePortal_2_2.tar.gz | Bin 0 -> 3058 bytes Packages/installed.list | 2 +- PortalStandalone.php | 76 + SSI.php | 4 + Sources/Admin.php | 80 +- Sources/BoardIndex.php | 2 +- Sources/Display.php | 12 + Sources/Help.php | 2 + Sources/Load.php | 19 + Sources/ManagePermissions.php | 11 + Sources/ManageServer.php | 1 + Sources/PortalAdminArticles.php | 812 ++++ Sources/PortalAdminBlocks.php | 1060 +++++ Sources/PortalAdminMain.php | 348 ++ Sources/PortalAdminPages.php | 635 +++ Sources/PortalAdminShoutbox.php | 589 +++ Sources/PortalArticles.php | 325 ++ Sources/PortalBlocks.php | 3564 +++++++++++++++++ Sources/PortalMain.php | 81 + Sources/PortalPages.php | 74 + Sources/PortalShoutbox.php | 131 + Sources/QueryString.php | 8 +- Sources/Recent.php | 8 +- Sources/Subs-BoardIndex.php | 2 +- Sources/Subs-Boards.php | 2 +- Sources/Subs-Portal.php | 1441 +++++++ Sources/Subs-PortalAdmin.php | 548 +++ Sources/Subs.php | 80 +- Sources/Who.php | 71 + Themes/default/Display.template.php | 9 + Themes/default/Portal.template.php | 246 ++ Themes/default/PortalAdmin.template.php | 313 ++ .../default/PortalAdminArticles.template.php | 405 ++ Themes/default/PortalAdminBlocks.template.php | 569 +++ Themes/default/PortalAdminPages.template.php | 338 ++ .../default/PortalAdminShoutbox.template.php | 339 ++ Themes/default/PortalArticles.template.php | 189 + Themes/default/PortalPages.template.php | 96 + Themes/default/PortalShoutbox.template.php | 277 ++ Themes/default/css/portal.css | 600 +++ Themes/default/css/portal_rtl.css | 135 + Themes/default/images/admin/articles.png | Bin 0 -> 627 bytes Themes/default/images/admin/blocks.png | Bin 0 -> 484 bytes Themes/default/images/admin/configuration.png | Bin 0 -> 666 bytes Themes/default/images/admin/pages.png | Bin 0 -> 547 bytes Themes/default/images/admin/shoutbox.png | Bin 0 -> 756 bytes Themes/default/images/sp/active.png | Bin 0 -> 734 bytes Themes/default/images/sp/add.png | Bin 0 -> 671 bytes Themes/default/images/sp/admin.png | Bin 0 -> 744 bytes Themes/default/images/sp/arrow.png | Bin 0 -> 413 bytes Themes/default/images/sp/attach.png | Bin 0 -> 554 bytes Themes/default/images/sp/averages.png | Bin 0 -> 563 bytes Themes/default/images/sp/bin.png | Bin 0 -> 399 bytes Themes/default/images/sp/birthday.png | Bin 0 -> 695 bytes Themes/default/images/sp/blog.png | Bin 0 -> 500 bytes Themes/default/images/sp/board.png | Bin 0 -> 594 bytes Themes/default/images/sp/bronze.png | Bin 0 -> 818 bytes Themes/default/images/sp/collapse.png | Bin 0 -> 277 bytes Themes/default/images/sp/deactive.png | Bin 0 -> 701 bytes Themes/default/images/sp/delete.png | Bin 0 -> 688 bytes Themes/default/images/sp/delete_small.png | Bin 0 -> 340 bytes Themes/default/images/sp/diamond.png | Bin 0 -> 628 bytes Themes/default/images/sp/dot.png | Bin 0 -> 335 bytes Themes/default/images/sp/dot1.png | Bin 0 -> 335 bytes Themes/default/images/sp/dot2.png | Bin 0 -> 292 bytes Themes/default/images/sp/dot3.png | Bin 0 -> 327 bytes Themes/default/images/sp/dot4.png | Bin 0 -> 327 bytes Themes/default/images/sp/dot5.png | Bin 0 -> 327 bytes Themes/default/images/sp/dot6.png | Bin 0 -> 339 bytes Themes/default/images/sp/dot7.png | Bin 0 -> 339 bytes Themes/default/images/sp/dot8.png | Bin 0 -> 343 bytes Themes/default/images/sp/dot_feed.png | Bin 0 -> 332 bytes Themes/default/images/sp/down.png | Bin 0 -> 403 bytes Themes/default/images/sp/event.png | Bin 0 -> 598 bytes Themes/default/images/sp/expand.png | Bin 0 -> 277 bytes Themes/default/images/sp/game.png | Bin 0 -> 618 bytes Themes/default/images/sp/gmod.png | Bin 0 -> 757 bytes Themes/default/images/sp/gold.png | Bin 0 -> 810 bytes Themes/default/images/sp/history.png | Bin 0 -> 825 bytes Themes/default/images/sp/holiday.png | Bin 0 -> 513 bytes Themes/default/images/sp/index.php | 9 + Themes/default/images/sp/left.png | Bin 0 -> 417 bytes Themes/default/images/sp/lmod.png | Bin 0 -> 698 bytes Themes/default/images/sp/loading.gif | Bin 0 -> 1737 bytes Themes/default/images/sp/modify.png | Bin 0 -> 530 bytes Themes/default/images/sp/money.png | Bin 0 -> 635 bytes Themes/default/images/sp/move.png | Bin 0 -> 506 bytes Themes/default/images/sp/post.png | Bin 0 -> 556 bytes Themes/default/images/sp/refresh.png | Bin 0 -> 688 bytes Themes/default/images/sp/right.png | Bin 0 -> 412 bytes Themes/default/images/sp/silver.png | Bin 0 -> 728 bytes Themes/default/images/sp/smiley.png | Bin 0 -> 756 bytes Themes/default/images/sp/star.png | Bin 0 -> 631 bytes Themes/default/images/sp/star1.png | Bin 0 -> 631 bytes Themes/default/images/sp/star2.png | Bin 0 -> 596 bytes Themes/default/images/sp/star3.png | Bin 0 -> 615 bytes Themes/default/images/sp/star4.png | Bin 0 -> 600 bytes Themes/default/images/sp/star5.png | Bin 0 -> 599 bytes Themes/default/images/sp/star6.png | Bin 0 -> 618 bytes Themes/default/images/sp/star7.png | Bin 0 -> 628 bytes Themes/default/images/sp/star8.png | Bin 0 -> 661 bytes Themes/default/images/sp/stats.png | Bin 0 -> 714 bytes Themes/default/images/sp/stats_member.png | Bin 0 -> 789 bytes .../default/images/sp/stats_thank_o_matic.png | Bin 0 -> 808 bytes Themes/default/images/sp/style.png | Bin 0 -> 832 bytes Themes/default/images/sp/topic.png | Bin 0 -> 571 bytes Themes/default/images/sp/tux.png | Bin 0 -> 761 bytes Themes/default/images/sp/up.png | Bin 0 -> 398 bytes Themes/default/images/sp/user.png | Bin 0 -> 748 bytes .../languages/SPortal.english-utf8.php | 127 + Themes/default/languages/SPortal.english.php | 127 + .../languages/SPortalAdmin.english-utf8.php | 500 +++ .../languages/SPortalAdmin.english.php | 500 +++ .../languages/SPortalHelp.english-utf8.php | 174 + .../default/languages/SPortalHelp.english.php | 174 + Themes/default/scripts/portal.js | 239 ++ Themes/default/scripts/script.js | 2 +- index.php | 24 +- 121 files changed, 15355 insertions(+), 25 deletions(-) create mode 100644 Packages/SimplePortal_2.3.5.zip create mode 100644 Packages/backups/2014-05-19_backup_SimplePortal_2.tar.gz create mode 100644 Packages/backups/2014-05-19_before_SimplePortal_2.tar.gz create mode 100644 Packages/backups/2014-05-19_before_SimplePortal_2_2.tar.gz create mode 100644 PortalStandalone.php create mode 100644 Sources/PortalAdminArticles.php create mode 100644 Sources/PortalAdminBlocks.php create mode 100644 Sources/PortalAdminMain.php create mode 100644 Sources/PortalAdminPages.php create mode 100644 Sources/PortalAdminShoutbox.php create mode 100644 Sources/PortalArticles.php create mode 100644 Sources/PortalBlocks.php create mode 100644 Sources/PortalMain.php create mode 100644 Sources/PortalPages.php create mode 100644 Sources/PortalShoutbox.php create mode 100644 Sources/Subs-Portal.php create mode 100644 Sources/Subs-PortalAdmin.php create mode 100644 Themes/default/Portal.template.php create mode 100644 Themes/default/PortalAdmin.template.php create mode 100644 Themes/default/PortalAdminArticles.template.php create mode 100644 Themes/default/PortalAdminBlocks.template.php create mode 100644 Themes/default/PortalAdminPages.template.php create mode 100644 Themes/default/PortalAdminShoutbox.template.php create mode 100644 Themes/default/PortalArticles.template.php create mode 100644 Themes/default/PortalPages.template.php create mode 100644 Themes/default/PortalShoutbox.template.php create mode 100644 Themes/default/css/portal.css create mode 100644 Themes/default/css/portal_rtl.css create mode 100644 Themes/default/images/admin/articles.png create mode 100644 Themes/default/images/admin/blocks.png create mode 100644 Themes/default/images/admin/configuration.png create mode 100644 Themes/default/images/admin/pages.png create mode 100644 Themes/default/images/admin/shoutbox.png create mode 100644 Themes/default/images/sp/active.png create mode 100644 Themes/default/images/sp/add.png create mode 100644 Themes/default/images/sp/admin.png create mode 100644 Themes/default/images/sp/arrow.png create mode 100644 Themes/default/images/sp/attach.png create mode 100644 Themes/default/images/sp/averages.png create mode 100644 Themes/default/images/sp/bin.png create mode 100644 Themes/default/images/sp/birthday.png create mode 100644 Themes/default/images/sp/blog.png create mode 100644 Themes/default/images/sp/board.png create mode 100644 Themes/default/images/sp/bronze.png create mode 100644 Themes/default/images/sp/collapse.png create mode 100644 Themes/default/images/sp/deactive.png create mode 100644 Themes/default/images/sp/delete.png create mode 100644 Themes/default/images/sp/delete_small.png create mode 100644 Themes/default/images/sp/diamond.png create mode 100644 Themes/default/images/sp/dot.png create mode 100644 Themes/default/images/sp/dot1.png create mode 100644 Themes/default/images/sp/dot2.png create mode 100644 Themes/default/images/sp/dot3.png create mode 100644 Themes/default/images/sp/dot4.png create mode 100644 Themes/default/images/sp/dot5.png create mode 100644 Themes/default/images/sp/dot6.png create mode 100644 Themes/default/images/sp/dot7.png create mode 100644 Themes/default/images/sp/dot8.png create mode 100644 Themes/default/images/sp/dot_feed.png create mode 100644 Themes/default/images/sp/down.png create mode 100644 Themes/default/images/sp/event.png create mode 100644 Themes/default/images/sp/expand.png create mode 100644 Themes/default/images/sp/game.png create mode 100644 Themes/default/images/sp/gmod.png create mode 100644 Themes/default/images/sp/gold.png create mode 100644 Themes/default/images/sp/history.png create mode 100644 Themes/default/images/sp/holiday.png create mode 100644 Themes/default/images/sp/index.php create mode 100644 Themes/default/images/sp/left.png create mode 100644 Themes/default/images/sp/lmod.png create mode 100644 Themes/default/images/sp/loading.gif create mode 100644 Themes/default/images/sp/modify.png create mode 100644 Themes/default/images/sp/money.png create mode 100644 Themes/default/images/sp/move.png create mode 100644 Themes/default/images/sp/post.png create mode 100644 Themes/default/images/sp/refresh.png create mode 100644 Themes/default/images/sp/right.png create mode 100644 Themes/default/images/sp/silver.png create mode 100644 Themes/default/images/sp/smiley.png create mode 100644 Themes/default/images/sp/star.png create mode 100644 Themes/default/images/sp/star1.png create mode 100644 Themes/default/images/sp/star2.png create mode 100644 Themes/default/images/sp/star3.png create mode 100644 Themes/default/images/sp/star4.png create mode 100644 Themes/default/images/sp/star5.png create mode 100644 Themes/default/images/sp/star6.png create mode 100644 Themes/default/images/sp/star7.png create mode 100644 Themes/default/images/sp/star8.png create mode 100644 Themes/default/images/sp/stats.png create mode 100644 Themes/default/images/sp/stats_member.png create mode 100644 Themes/default/images/sp/stats_thank_o_matic.png create mode 100644 Themes/default/images/sp/style.png create mode 100644 Themes/default/images/sp/topic.png create mode 100644 Themes/default/images/sp/tux.png create mode 100644 Themes/default/images/sp/up.png create mode 100644 Themes/default/images/sp/user.png create mode 100644 Themes/default/languages/SPortal.english-utf8.php create mode 100644 Themes/default/languages/SPortal.english.php create mode 100644 Themes/default/languages/SPortalAdmin.english-utf8.php create mode 100644 Themes/default/languages/SPortalAdmin.english.php create mode 100644 Themes/default/languages/SPortalHelp.english-utf8.php create mode 100644 Themes/default/languages/SPortalHelp.english.php create mode 100644 Themes/default/scripts/portal.js diff --git a/Packages/SimplePortal_2.3.5.zip b/Packages/SimplePortal_2.3.5.zip new file mode 100644 index 0000000000000000000000000000000000000000..166d9459e6d36e988210289dd42c1d577aa127a7 GIT binary patch literal 300923 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%0DwHv#$6;Lx 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%0AhFAAY^8XMG2Cxxt~L zgW8U^{)k6U&a;){`^XHHqWYN-fZEHaDU-63L&t|QTRV>iH*(qo`UIRS1M#>_*_~0G zo4H!ss6tB%g$AWlY}`1P3+ipoC9w7H8Vick4x+ox?CR+cBhJk+kJ*Kr&p9V>j?9N(et)At<-EIy*lAn)({mOi-N!K&w zxX)$Gm2fvOSLf=FWBIW+^v$*|Tf8}U#N|NI8!ST5eWc{QsjN8=@@Tz%Q3xavwvOuc z9ddFWgirD|AC7^a8@lt-JK*1sOq(b=U=w zk;p&BgU>J#4bi$1Vcf0p4uE*eC-Cl>Zoct>fdRdw=l$!i2r9qWiE|qCAjMS$8q(}8=#j^$w8;DX-@_N4E`*>*vc8R8f zi5OhtV@#E0K4@P6gK8k4={rcx@U5Tr%74Q$B@ODK~ zq_7>+(@=)z*N-T+KuWf^DRt}+h}B7{$vVDxVzqeifO*%7xpM9|slZeiBAS!L=bR^yq!?*B zuHhu28QFzqMcr6oDyr}#n;tZ5x3AE(?mms@_}rsNv*(IkmPXGMshg&?rNMfbLH;v? ze#5+hDR&-?3B7nvTAo{d#@gW5T`$�i61j&)+9XX0M!7*{J7Yd`6U~U$4~GvUt|7 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%0DF0Hii8qb-rvXALQ{gv9$HdC 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
+ + + + + + + + + + + +
 
 
+ +
+ + ', sprintf($txt['welcome_guest'], $txt['guest_title']); + } + else + { + loadMemberData($user_info['id']); + loadMemberContext($user_info['id'], true); + + $member_info = $memberContext[$user_info['id']]; + + if (sp_loadColors($member_info['id']) !== false) + $member_info['colored_name'] = $color_profile[$member_info['id']]['colored_name']; + + $member_info['karma']['total'] = $member_info['karma']['good'] - $member_info['karma']['bad']; + + echo ' + ', strtolower($member_info['name']) === 'okarin' ? 'Okae-Rin, ' : $txt['hello_member'], ' ', !empty($member_info['colored_name']) ? $member_info['colored_name'] : $member_info['name'], ' +

'; + + if (!empty($member_info['avatar']['image'])) + echo ' + ', $member_info['avatar']['image'], '

'; + + if (!empty($member_info['group'])) + echo ' + ', $member_info['group'], '
'; + else + echo ' + ', $member_info['post_group'], '
'; + + echo ' + ', $member_info['group_stars'], '
'; + + echo ' +
+
    '; + + echo ' +
  • ', sp_embed_image('dot'), ' ', $txt['posts'], ': ', $member_info['posts'], '
  • '; + + if (!empty($modSettings['karmaMode'])) + { + echo ' +
  • ', sp_embed_image('dot'), ' ', $modSettings['karmaLabel'], ' '; + + if ($modSettings['karmaMode'] == 1) + echo $member_info['karma']['total']; + elseif ($modSettings['karmaMode'] == 2) + echo '+', $member_info['karma']['good'], '/-', $member_info['karma']['bad']; + + echo '
  • '; + } + + if (allowedTo('pm_read')) + { + echo ' +
  • ', sp_embed_image('dot'), ' ', $txt['sp-usertmessage'], ': ', $context['user']['messages'], '
  • +
  • ', sp_embed_image('dot'), ' ', $txt['sp-usernmessage'], ': ', $context['user']['unread_messages'], '
  • '; + } + + echo ' +
  • ', sp_embed_image('dot'), ' ', $txt['unread_topics_visit'], '
  • +
  • ', sp_embed_image('dot'), ' ', $txt['unread_replies'], '
  • '; + + echo ' +
+
'; + + echo ' + ', sp_embed_image('arrow'), ' ', $txt['profile'], ' ', sp_embed_image('arrow'), ' ', $txt['logout'], ''; + } + + echo ' + '; +} + +function sp_latestMember($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $context, $scripturl, $txt, $color_profile; + + $block_parameters = array( + 'limit' => 'int', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 5; + + $request = $smcFunc['db_query']('',' + SELECT id_member, real_name, date_registered + FROM {db_prefix}members + WHERE is_activated = {int:is_activated} + ORDER BY id_member DESC + LIMIT {int:limit}', + array( + 'is_activated' => 1, + 'limit' => $limit, + ) + ); + $members = array(); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($row['id_member'])) + $colorids[$row['id_member']] = $row['id_member']; + + $members[] = array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => '' . $row['real_name'] . '', + 'date' => timeformat($row['date_registered'], '%d %b'), + ); + } + $smcFunc['db_free_result']($request); + + if (empty($members)) + { + echo ' + ', $txt['error_sp_no_members_found']; + return; + } + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($members as $k => $p) + { + if (!empty($color_profile[$p['id']]['link'])) + $members[$k]['link'] = $color_profile[$p['id']]['link']; + } + } + + echo ' +
    '; + + foreach ($members as $member) + echo ' +
  • ', sp_embed_image('dot'), ' ', $member['link'], ' - ', $member['date'], '
  • '; + + echo ' +
'; +} + +function sp_whosOnline($parameters, $id, $return_parameters = false) +{ + global $scripturl, $sourcedir, $modSettings, $txt; + + $block_parameters = array( + 'online_today' => 'check' + ); + + if ($return_parameters) + return $block_parameters; + + $online_today = !empty($parameters['online_today']); + + $stats = ssi_whosOnline('array'); + + echo ' +
    +
  • ', sp_embed_image('dot'), ' ', $txt['guests'], ': ', $stats['num_guests'], '
  • '; + + if (!empty($modSettings['show_spider_online']) && ($modSettings['show_spider_online'] < 3 || allowedTo('admin_forum'))) + echo ' +
  • ', sp_embed_image('dot'), ' ', $txt['spiders'], ': ', $stats['num_spiders'], '
  • '; + + echo ' +
  • ', sp_embed_image('dot'), ' ', $txt['hidden'], ': ', $stats['num_users_hidden'], '
  • +
  • ', sp_embed_image('dot'), ' ', $txt['users'], ': ', $stats['num_users_online'], '
  • '; + + if (!empty($stats['users_online'])) + { + echo ' +
  • ', sp_embed_image('dot'), ' ', allowedTo('who_view') && !empty($modSettings['who_enabled']) ? '' : '', $txt['online_users'], allowedTo('who_view') && !empty($modSettings['who_enabled']) ? '' : '', ':
  • +
+
+
    '; + + foreach ($stats['users_online'] as $user) + echo ' +
  • ', sp_embed_image($user['name'] == 'H' ? 'tux' : 'user'), ($user['name'] == 'Blue' && ($user['link'] = str_replace('>Blue<', '>Purple<', $user['link'])) ? '' : ''), ' ', $user['hidden'] ? '' . $user['link'] . '' : $user['link'], '
  • '; + + echo ' +
+
'; + } + else + { + echo ' + +
+
', $txt['error_sp_no_online'], '
'; + } + + if ($online_today && file_exists($sourcedir . '/Subs-MembersOnlineToday.php')) + { + require_once($sourcedir . '/Subs-MembersOnlineToday.php'); + + $membersOnlineTodayOptions = array( + 'sort' => 'login_time', + 'reverse_sort' => true, + 'period' => 'current_day', + 'canview' => 'registered', + ); + + $stats += getMembersOnlineTodayStats($membersOnlineTodayOptions); + + if (empty($stats['num_users_online_today'])) + return; + + echo ' +
    +
  • ', sp_embed_image('dot'), ' ', $txt['sp-online_today'], ': ', $stats['num_users_online_today'], '
  • +
+
+
    '; + + foreach ($stats['users_online_today'] as $user) + echo ' +
  • ', sp_embed_image($user['name'] == 'H' ? 'tux' : 'user'), ' ', $user['hidden'] ? '' . $user['link'] . '' : $user['link'], '
  • '; + + echo ' +
+
'; + } +} + +function sp_boardStats($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $scripturl, $modSettings, $txt; + + $block_parameters = array( + 'averages' => 'check', + ); + + if ($return_parameters) + return $block_parameters; + + $averages = !empty($parameters['averages']) ? 1 : 0; + + loadLanguage('Stats'); + + $totals = ssi_boardStats('array'); + + if ($averages) + { + $result = $smcFunc['db_query']('', ' + SELECT + SUM(posts) AS posts, SUM(topics) AS topics, SUM(registers) AS registers, + SUM(most_on) AS most_on, MIN(date) AS date, SUM(hits) AS hits + FROM {db_prefix}log_activity', + array( + ) + ); + $row = $smcFunc['db_fetch_assoc']($result); + $smcFunc['db_free_result']($result); + + $total_days_up = ceil((time() - strtotime($row['date'])) / (60 * 60 * 24)); + + $totals['average_posts'] = comma_format(round($row['posts'] / $total_days_up, 2)); + $totals['average_topics'] = comma_format(round($row['topics'] / $total_days_up, 2)); + $totals['average_members'] = comma_format(round($row['registers'] / $total_days_up, 2)); + $totals['average_online'] = comma_format(round($row['most_on'] / $total_days_up, 2)); + } + + echo ' +
    +
  • ', sp_embed_image('stats'), ' ', $txt['total_members'], ': ', comma_format($totals['members']), '
  • +
  • ', sp_embed_image('stats'), ' ', $txt['total_posts'], ': ', comma_format($totals['posts']), '
  • +
  • ', sp_embed_image('stats'), ' ', $txt['total_topics'], ': ', comma_format($totals['topics']), '
  • +
  • ', sp_embed_image('stats'), ' ', $txt['total_cats'], ': ', comma_format($totals['categories']), '
  • +
  • ', sp_embed_image('stats'), ' ', $txt['total_boards'], ': ', comma_format($totals['boards']), '
  • +
  • ', sp_embed_image('stats'), ' ', $txt['most_online'], ': ', comma_format($modSettings['mostOnline']), '
  • +
'; + + if ($averages) + { + echo ' +
+
    +
  • ', sp_embed_image('averages'), ' ', $txt['sp-average_posts'], ': ', comma_format($totals['average_posts']), '
  • +
  • ', sp_embed_image('averages'), ' ', $txt['sp-average_topics'], ': ', comma_format($totals['average_topics']), '
  • +
  • ', sp_embed_image('averages'), ' ', $txt['sp-average_members'], ': ', comma_format($totals['average_members']), '
  • +
  • ', sp_embed_image('averages'), ' ', $txt['sp-average_online'], ': ', comma_format($totals['average_online']), '
  • +
'; + } +} + +function sp_topPoster($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $context, $scripturl, $modSettings, $txt, $color_profile; + + $block_parameters = array( + 'limit' => 'int', + 'type' => 'select', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 5; + $type = !empty($parameters['type']) ? (int) $parameters['type'] : 0; + + if (!empty($type)) + { + if ($type == 1) + { + list($year, $month, $day) = explode('-', date('Y-m-d')); + $start_time = mktime(0, 0, 0, $month, $day, $year); + } + elseif ($type == 2) + $start_time = mktime(0, 0, 0, date("n"), date("j"), date("Y")) - (date("N") * 3600 * 24); + elseif ($type == 3) + { + $months = array( 1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + $start_time = mktime(0, 0, 0, date("n"), date("j"), date("Y")) - (3600 * 24 * $months[(int) date("m", time())]); + } + + $start_time = forum_time(false, $start_time); + + $request = $smcFunc['db_query']('', ' + SELECT + mem.id_member, mem.real_name, COUNT(*) as posts, + mem.avatar, a.id_attach, a.attachment_type, a.filename + FROM {db_prefix}messages AS m + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) + LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = mem.id_member) + WHERE m.poster_time > {int:start_time} + AND m.id_member != 0 + GROUP BY mem.id_member + ORDER BY posts DESC + LIMIT {int:limit}', + array( + 'start_time' => $start_time, + 'limit' => $limit, + ) + ); + } + else + { + $request = $smcFunc['db_query']('',' + SELECT + m.id_member, m.real_name, m.posts, m.avatar, + a.id_attach, a.attachment_type, a.filename + FROM {db_prefix}members AS m + LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = m.id_member) + ORDER BY posts DESC + LIMIT {int:limit}', + array( + 'limit' => $limit, + ) + ); + } + $members = array(); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($row['id_member'])) + $colorids[$row['id_member']] = $row['id_member']; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + $members[] = array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => '' . $row['real_name'] . '', + 'posts' => comma_format($row['posts']), + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + ); + } + $smcFunc['db_free_result']($request); + + if (empty($members)) + { + echo ' + ', $txt['error_sp_no_members_found']; + return; + } + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($members as $k => $p) + { + if (!empty($color_profile[$p['id']]['link'])) + $members[$k]['link'] = $color_profile[$p['id']]['link']; + } + } + + echo ' + '; + + foreach ($members as $member) + echo ' + + + + '; + + echo ' +
', !empty($member['avatar']['href']) ? ' + ' . $member['name'] . '' : '', ' + + ', $member['link'], '
+ ', $member['posts'], ' ', $txt['posts'], ' +
'; +} + +function sp_topStatsMember($parameters, $id, $return_parameters = false) +{ + global $context, $settings, $txt, $scripturl, $user_info, $user_info, $modSettings, $boards, $color_profile; + global $smcFunc, $sourcedir, $boarddir, $themedir; + static $sp_topStatsSystem; + + $block_parameters = array( + 'type' => array( + '0' => $txt['sp_topStatsMember_total_time_logged_in'], + '1' => $txt['sp_topStatsMember_Posts'], + '2' => $txt['sp_topStatsMember_Karma_Good'], + '3' => $txt['sp_topStatsMember_Karma_Bad'], + '4' => $txt['sp_topStatsMember_Karma_Total'], + '5' => $txt['sp_topStatsMember_Thank-O-Matic_Top_Given'], + '6' => $txt['sp_topStatsMember_Thank-O-Matic_Top_Recived'], + '10' => $txt['sp_topStatsMember_Advanced_Reputation_System_Best'], + '11' => $txt['sp_topStatsMember_Advanced_Reputation_System_Worst'], + 'sa_shop_money' => $txt['sp_topStatsMember_SA_Shop_Cash'], + 'sa_shop_trades' => $txt['sp_topStatsMember_SA_Shop_Trades'], + 'sa_shop_purchase' => $txt['sp_topStatsMember_SA_Shop_Purchase'], + 'casino' => $txt['sp_topStatsMember_Casino'], + ), + 'limit' => 'int', + 'sort_asc' => 'check', + 'last_active_limit' => 'int', + 'enable_label' => 'check', + 'list_label' => 'text', + ); + + if ($return_parameters) + return $block_parameters; + + if (empty($sp_topStatsSystem)) + { + /* + The system setup array, order depend on the $txt array of the select + name + It's for better knowing what this option can do. + mod_id + Only as information + field + The members field that should be loaded + Please don't forget to add mem. before the field names + (That what is after the SELECT Statment) + order + What is the field name i need to be sort after + where + Here you can add additional where statments :) + output_text + What should be outputed after the avatar and nickname + For example if you field is karmaGood + 'output' => $txt['karma'] . '%karmaGood%'; + output_function + With this you can add to the $row of the query some infomartions. + reverse + On true it change the reverse cause, if not set it will be false :) + enabled + true = mod exists or is possible to use :D + + 'error_msg' => $txt['my_error_msg'];; You can insert here what kind of error message should appear if the modification not exists =D + */ + $sp_topStatsSystem = array( + '0' => array( + 'name' => 'Total time logged in', + 'field' => 'mem.total_time_logged_in', + 'order' => 'mem.total_time_logged_in', + 'output_function' => create_function('&$row', ' + global $txt; + // Figure out the days, hours and minutes. + $timeDays = floor($row["total_time_logged_in"] / 86400); + $timeHours = floor(($row["total_time_logged_in"] % 86400) / 3600); + + // Figure out which things to show... (days, hours, minutes, etc.) + $timelogged = ""; + if ($timeDays > 0) + $timelogged .= $timeDays . $txt["totalTimeLogged5"]; + if ($timeHours > 0) + $timelogged .= $timeHours . $txt["totalTimeLogged6"]; + $timelogged .= floor(($row["total_time_logged_in"] % 3600) / 60) . $txt["totalTimeLogged7"]; + $row["timelogged"] = $timelogged; + '), + 'output_text' => ' %timelogged%', + 'reverse_sort_asc' => false, + 'enabled' => true, + ), + '1' => array( + 'name' => 'Posts', + 'field' => 'mem.posts', + 'order' => 'mem.posts', + 'output_text' => ' %posts% '. $txt['posts'], + 'enabled' => true, + ), + '2' => array( + 'name' => 'Karma Good', + 'field' => 'mem.karma_good, mem.karma_bad', + 'order' => 'mem.karma_good', + 'output_function' => create_function('&$row', ' + $row["karma_total"] = $row["karma_good"] - $row["karma_bad"]; + '), + 'output_text' => $modSettings['karmaLabel'] . ($modSettings['karmaMode'] == 1 ? ' %karma_total%' : ' +%karma_good%\-%karma_bad%'), + 'enabled' => !empty($modSettings['karmaMode']), + 'error_msg' => $txt['sp_karma_is_disabled'], + ), + '3' => array( + 'name' => 'Karma Bad', + 'field' => 'mem.karma_good, mem.karma_bad', + 'order' => 'mem.karma_bad', + 'output_function' => create_function('&$row', ' + $row["karma_total"] = $row["karma_good"] - $row["karma_bad"]; + '), + 'output_text' => $modSettings['karmaLabel'] . ($modSettings['karmaMode'] == 1 ? ' %karma_total%' : ' +%karma_good%\-%karma_bad%'), + 'enabled' => !empty($modSettings['karmaMode']), + 'error_msg' => $txt['sp_karma_is_disabled'], + ), + '4' => array( + 'name' => 'Karma Total', + 'field' => 'mem.karma_good, mem.karma_bad', + 'order' => 'FLOOR(1000000+karma_good-karma_bad)', + 'output_function' => create_function('&$row', ' + $row["karma_total"] = $row["karma_good"] - $row["karma_bad"]; + '), + 'output_text' => $modSettings['karmaLabel'] . ($modSettings['karmaMode'] == 1 ? ' %karma_total%' : ' +%karma_good%\-%karma_bad%'), + 'enabled' => !empty($modSettings['karmaMode']), + 'error_msg' => $txt['sp_karma_is_disabled'], + ), + '5' => array( + 'name' => 'Thank-O-Matic Top Given', + 'mod_id' => 710, + 'field' => 'mem.thank_you_post_made, mem.thank_you_post_became', + 'order' => 'mem.thank_you_post_made', + 'output_text' => '%thank_you_post_made% ' . (!empty($txt['thank_you_post_made_display']) ? $txt['thank_you_post_thx_display'] . ' ' . $txt['thank_you_post_made_display'] : ''), + 'enabled' => file_exists($sourcedir . '/ThankYouPost.php'), + 'error_msg' => $txt['sp_thankomatic_no_exist'], + ), + '6' => array( + 'name' => 'Thank-O-Matic Top Recived', + 'mod_id' => 710, + 'field' => 'mem.thank_you_post_made, mem.thank_you_post_became', + 'order' => 'mem.thank_you_post_became', + 'output_text' => '%thank_you_post_became% ' . (!empty($txt['thank_you_post_became_display']) ? $txt['thank_you_post_thx_display'] . ' ' . $txt['thank_you_post_became_display'] : ''), + 'enabled' => file_exists($sourcedir . '/ThankYouPost.php'), + 'error_msg' => $txt['sp_thankomatic_no_exist'], + ), + '10' => array( + 'name' => 'Advanced Reputation System Best', + 'mod_id' => 1129, + 'field' => '(mem.karmaGood - mem.karmaBad) AS karma, karmaGood, karmaBad', + 'order' => 'karma', + 'where' => 'mem.karmaGood > mem.karmaBad', + 'output_function' => create_function('&$row', ' + global $modSettings; + $descriptions = preg_split("/(\r)?\n/", $modSettings["karmaDescriptions"]); + $rep_bars = ""; + + $points = $row["karma"]; + $bars = ($points - ($points % $modSettings["karmaBarPoints"])) / $modSettings["karmaBarPoints"]; + $bars = $bars < 1 ? 1 : (($bars > $modSettings["karmaMaxBars"]) ? $modSettings["karmaMaxBars"] : $bars); + $description = $descriptions[$bars - 1]; + + for($i = 0; $i < $bars; $i++) + $rep_bars .= \'\' . $row[\'; + + $row += array( + "reputation_bars" => $rep_bars, + "amount" => "+" . $row["karma"], + ); + '), + 'output_text' => (!empty($txt['karma_power']) ? $txt['karma_power'] : '') . ': %amount%
%reputation_bars%', + 'enabled' => !empty($modSettings['karma_enabled']) && file_exists($settings['images_url'] . '/karmaBad_basic.gif'), + 'error_msg' => $txt['sp_reputation_no_exist'], + ), + '11' => array( + 'name' => 'Advanced Reputation System Worst', + 'mod_id' => 1129, + 'field' => '(karmaBad - karmaGood) AS karma, karmaGood, karmaBad', + 'order' => 'karma', + 'where' => 'mem.karmaBad > mem.karmaGood', + 'output_function' => create_function('&$row', ' + global $modSettings; + $rep_bars = ""; + + $points = $row["karma"]; + $bars = ($points - ($points % $modSettings["karmaBarPoints"])) / $modSettings["karmaBarPoints"]; + $bars = $bars < 1 ? 1 : (($bars > $modSettings["karmaMaxBars"]) ? $modSettings["karmaMaxBars"] : $bars); + $description = $descriptions[$bars - 1]; + + for($i = 0; $i < $bars; $i++) + $rep_bars .= \'\' . $row[\'; + + $row += array( + "reputation_bars" => $rep_bars, + "amount" => "-" . $row["karma"], + ); + '), + 'output_text' => (!empty($txt['karma_power']) ? $txt['karma_power'] : '') . ': %amount%
%reputation_bars%', + 'enabled' => !empty($modSettings['karma_enabled']) && file_exists($settings['images_url'] . '/karmaBad_basic.gif'), + 'error_msg' => $txt['sp_reputation_no_exist'], + ), + 'sa_shop_money' => array( + 'name' => 'SA Shop Money', + 'mod_id' => 1794, + 'field' => 'mem.cash, mem.purchHis, mem.tradeHis', + 'order' => 'mem.cash', + 'output_text' => (!empty($modSettings['shopprefix']) ? $modSettings['shopprefix'] : '') . '%cash%' . (!empty($modSettings['shopsurfix']) ? $modSettings['shopsurfix'] : ''), + 'enabled' => file_exists($sourcedir . 'shop2/Shop.php'), + 'error_msg' => $txt['sp_sashop_no_exist'], + ), + 'sa_shop_trades' => array( + 'name' => 'SA Shop Trades', + 'mod_id' => 1794, + 'field' => 'mem.cash, mem.purchHis, mem.tradeHis', + 'order' => 'mem.tradeHis', + 'output_text' => '%tradeHis%', + 'enabled' => file_exists($sourcedir . 'shop2/Shop.php') && !empty($modSettings['shop_Enable_Stats']), + 'error_msg' => $txt['sp_sashop_no_exist'], + ), + 'sa_shop_purchase' => array( + 'name' => 'SA Shop Purchase', + 'mod_id' => 1794, + 'field' => 'mem.cash, mem.purchHis, mem.tradeHis', + 'order' => 'mem.purchHis', + 'output_text' => '%purchHis%', + 'enabled' => file_exists($sourcedir . 'shop2/Shop.php') && !empty($modSettings['shop_Enable_Stats']), + 'error_msg' => $txt['sp_sashop_no_exist'], + ), + 'casino' => array( + 'name' => 'Casino Cash', + 'mod_id' => 1641, + 'field' => 'mem.cash', + 'order' => 'mem.cash', + 'output_text' => '%cash%', + 'enabled' => file_exists($sourcedir . 'casino/Casino.php'), + 'error_msg' => $txt['sp_sashop_no_exist'], + ), + ); + } + + // Standard Variables + $type = !empty($parameters['type']) ? $parameters['type'] : 0; + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 5; + $limit = empty($limit) ? 5 : $limit; + $sort_asc = !empty($parameters['sort_asc']); + // Time is in days :D, but i need seconds :P + $last_active_limit = !empty($parameters['last_active_limit']) ? $parameters['last_active_limit'] * 86400 : 0; + $enable_label = !empty($parameters['enable_label']); + $list_label = !empty($parameters['list_label']) ? $parameters['list_label'] : ''; + + // Setup current Block Type + $current_system = !empty($sp_topStatsSystem[$type]) ? $sp_topStatsSystem[$type] : array(); + + // What how could this happen? + if (empty($current_system)) + { + echo $txt['sp_topstats_unknown_type']; + return; + } + + // Possible to ouput? + if (empty($current_system['enabled'])) + { + echo (!empty($current_system['error_msg']) ? $current_system['error_msg'] : ''); + return; + } + + // This are the important fields, without the array have an mistake and it will not work :X + if (empty($current_system['field']) || empty($current_system['order'])) + { + echo $context['user']['is_admin'] ? $txt['sp_topstats_type_error'] : $txt['sp_topstats_unknown_type']; + return; + } + + // Switch the reverse? (It's a reverse to reverse the allready reverse, fun byside :P) + $sort_asc = !empty($current_system['reverse']) ? !$sort_asc : $sort_asc; + + // Create the where statment :) + $where = array(); + + // Some cached data availible? + $chache_id = 'sp_chache_' . $id . '_topStatsMember'; + if (empty($modSettings['sp_disableChache']) && !empty($modSettings[$chache_id])) + { + $data = explode(';', $modSettings[$chache_id]); + if($data[0] == $type && $data[1] == $limit && !empty($data[2]) == $sort_asc && $data[3] > time() - 300) // 5 Minute cache + $where[] = 'mem.id_member IN (' . $data[4] . ')'; + else + unset($modSettings[$chache_id]); + } + + // Last active remove + if (!empty($last_active_limit)) + { + $timeLimit = time() - $last_active_limit; + $where[] = "lastLogin > $timeLimit"; + } + if (!empty($current_system['where'])) + $where[] = $current_system['where']; + + if (!empty($where)) + $where = 'WHERE (' . implode(') + AND (', $where) . ')'; + else + $where = ""; + + // Okay load the data :D + $request = $smcFunc['db_query']('', ' + SELECT + mem.id_member, mem.real_name, mem.avatar, + a.id_attach, a.attachment_type, a.filename, + {raw:field} + FROM {db_prefix}members as mem + LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = mem.id_member) + {raw:where} + ORDER BY {raw:order} {raw:sort} + LIMIT {int:limit}', array( + 'limit' => $context['common_stats']['total_members'] > 100 ? ($limit + 5) : $limit, // Prevent delete of user if the cache is avaible :D + 'field' => $current_system['field'], + 'where' => $where, + 'order' => $current_system['order'], + 'sort' => ($sort_asc ? 'ASC' : 'DESC'), + ) + ); + + $members = array(); + $colorids = array(); + $count = 1; + $chache_member_ids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + // Collect some to cache data =) + $chache_member_ids[$row['id_member']] = $row['id_member']; + if($count++ > $limit) + continue; + + $colorids[$row['id_member']] = $row['id_member']; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + // Setup the row :P + $output = ''; + + // Prepare some data of the row? + if (!empty($current_system['output_function'])) + $current_system['output_function']($row); + + if (!empty($current_system['output_text'])) + { + $output = $current_system['output_text']; + foreach ($row as $item => $replacewith) + $output = str_replace('%' . $item . '%', $replacewith, $output); + } + + $members[] = array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => '' . $row['real_name'] . '', + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + 'output' => $output, + 'complete_row' => $row, + ); + } + $smcFunc['db_free_result']($request); + + if (empty($members)) + { + echo ' + ', $txt['error_sp_no_members_found']; + return; + } + + // Update the cache, at least around 100 members are needed for a good working version + if (empty($modSettings['sp_disableChache']) && $context['common_stats']['total_members'] > 0 && !empty($chache_member_ids) && count($chache_member_ids) > $limit && empty($modSettings[$chache_id])) + { + $toCache = array($type, $limit, ($sort_asc ? 1 : 0), time(), implode(',', $chache_member_ids)); + updateSettings(array($chache_id => implode(';', $toCache))); + } + // One time error, if this happen the chache need an update (Next reload is mystical fixed) + elseif(!empty($modSettings[$chache_id])) + updateSettings(array($chache_id => '0;0;0;1000;0')); + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($members as $k => $p) + { + if (!empty($color_profile[$p['id']]['link'])) + $members[$k]['link'] = $color_profile[$p['id']]['link']; + } + } + + echo ' + '; + + if($enable_label) + echo ' + + + '; + + foreach ($members as $member) + { + echo ' + + + + '; + } + echo ' +
', $list_label,'
', !empty($member['avatar']['href']) ? ' + ' . $member['name'] . '' : '', ' + + ', $member['link'], '
', $member['output'], ' +
'; + +} + +function sp_recent($parameters, $id, $return_parameters = false) +{ + global $txt, $scripturl, $settings, $context, $color_profile; + + $block_parameters = array( + 'boards' => 'boards', + 'limit' => 'int', + 'type' => 'select', + 'display' => 'select', + ); + + if ($return_parameters) + return $block_parameters; + + $boards = !empty($parameters['boards']) ? explode('|', $parameters['boards']) : null; + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 5; + $type = 'ssi_recent' . (empty($parameters['type']) ? 'Posts' : 'Topics'); + $display = empty($parameters['display']) ? 'compact' : 'full'; + + $items = $type($limit, null, $boards, 'array'); + + if (empty($items)) + { + echo ' + ', $txt['error_sp_no_posts_found']; + return; + } + else + $items[count($items) - 1]['is_last'] = true; + + $colorids = array(); + foreach ($items as $item) + $colorids[] = $item['poster']['id']; + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($items as $k => $p) + { + if (!empty($color_profile[$p['poster']['id']]['link'])) + $items[$k]['poster']['link'] = $color_profile[$p['poster']['id']]['link']; + } + } + + if ($display == 'compact') + { + foreach ($items as $key => $item) + echo ' + ', $item['subject'], ' ', $txt['by'], ' ', $item['poster']['link'], $item['new'] ? '' : ' ' . $txt['new'] . '', '
[', $item['time'], ']

', empty($item['is_last']) ? '
' : ''; + } + elseif ($display == 'full') + { + echo ' + '; + + foreach ($items as $item) + echo ' + + + + + '; + + echo ' +
+ ', sp_embed_image(empty($parameters['type']) ? 'post' : 'topic'), ' + + ', $item['subject'], ' + ', $item['new'] ? '' : '' . $txt['new'] . '', '
[', $item['board']['link'], '] +
+ ', $item['poster']['link'], '
', $item['time'], ' +
'; + } +} + +function sp_topTopics($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $txt, $scripturl, $user_info, $user_info, $modSettings, $topics; + + $block_parameters = array( + 'type' => 'select', + 'limit' => 'int', + ); + + if ($return_parameters) + return $block_parameters; + + $type = !empty($parameters['type']) ? $parameters['type'] : 0; + $limit = !empty($parameters['limit']) ? $parameters['limit'] : 5; + + $topics = ssi_topTopics($type ? 'views' : 'replies', $limit, 'array'); + + if (empty($topics)) + { + echo ' + ', $txt['error_sp_no_topics_found']; + return; + } + else + $topics[count($topics) - 1]['is_last'] = true; + + echo ' +
    '; + + foreach ($topics as $topic) + echo ' +
  • ', sp_embed_image('topic'), ' ', $topic['link'], '
  • +
  • ', $txt['replies'], ': ', $topic['num_replies'], ' | ', $txt['views'], ': ', $topic['num_views'], '
  • '; + + echo ' +
'; +} + +function sp_topBoards($parameters, $id, $return_parameters = false) +{ + global $context, $settings, $smcFunc, $txt, $scripturl, $user_info, $user_info, $modSettings, $boards; + + $block_parameters = array( + 'limit' => 'int', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = !empty($parameters['limit']) ? $parameters['limit'] : 5; + + $boards = ssi_topBoards($limit, 'array'); + + if (empty($boards)) + { + echo ' + ', $txt['error_sp_no_boards_found']; + return; + } + else + $boards[count($boards) - 1]['is_last'] = true; + + echo ' +
    '; + + foreach ($boards as $board) + echo ' +
  • ', sp_embed_image('board'), ' ', $board['link'], '
  • +
  • ', $txt['topics'], ': ', comma_format($board['num_topics']), ' | ', $txt['posts'], ': ', comma_format($board['num_posts']), '
  • '; + + echo ' +
'; +} + +function sp_showPoll($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $context, $scripturl, $modSettings, $boardurl, $txt; + + $block_parameters = array( + 'topic' => 'int', + 'type' => 'select', + ); + + if ($return_parameters) + return $block_parameters; + + $topic = !empty($parameters['topic']) ? $parameters['topic'] : null; + $type = !empty($parameters['type']) ? (int) $parameters['type'] : 0; + $boardsAllowed = boardsAllowedTo('poll_view'); + + if (empty($boardsAllowed)) + { + loadLanguage('Errors'); + + echo ' + ', $txt['cannot_poll_view']; + return; + } + + if (!empty($type)) + { + $request = $smcFunc['db_query']('', ' + SELECT t.id_topic + FROM {db_prefix}polls AS p + INNER JOIN {db_prefix}topics AS t ON (t.id_poll = p.id_poll' . ($modSettings['postmod_active'] ? ' AND t.approved = {int:is_approved}' : '') . ') + INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board) + WHERE {query_wanna_see_board} + AND p.voting_locked = {int:not_locked}' . (!in_array(0, $boardsAllowed) ? ' + AND b.id_board IN ({array_int:boards_allowed_list})' : '') . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? ' + AND b.id_board != {int:recycle_enable}' : '') . ' + ORDER BY {raw:type} + LIMIT 1', + array( + 'boards_allowed_list' => $boardsAllowed, + 'not_locked' => 0, + 'is_approved' => 1, + 'recycle_enable' => $modSettings['recycle_board'], + 'type' => $type == 1 ? 'p.id_poll DESC' : 'RAND()', + ) + ); + list ($topic) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + } + + if (empty($topic) || $topic < 0) + { + loadLanguage('Errors'); + + echo ' + ', $txt['topic_doesnt_exist']; + return; + } + + $poll = ssi_showPoll($topic, 'array'); + + if ($poll['allow_vote']) + { + echo ' +
+
    +
  • ', $poll['question'], '
  • +
  • ', $poll['allowed_warning'], '
  • '; + + foreach ($poll['options'] as $option) + echo ' +
  • '; + + echo ' +
  • +
  • ', $txt['sp-pollViewTopic'], '
  • +
+ + +
'; + } + elseif ($poll['allow_view_results']) + { + echo ' +
    +
  • ', $poll['question'], '
  • '; + + foreach ($poll['options'] as $option) + echo ' +
  • ', sp_embed_image('dot'), ' ', $option['option'], '
  • +
  • ', $option['votes'], ' (', $option['percent'], '%)
  • '; + + echo ' +
  • ', $txt['poll_total_voters'], ': ', $poll['total_votes'], '
  • +
  • ', $txt['sp-pollViewTopic'], '
  • +
'; + } + else + echo ' + ', $txt['poll_cannot_see']; +} + +function sp_boardNews($parameters, $id, $return_parameters = false) +{ + global $scripturl, $txt, $settings, $modSettings, $context, $smcFunc, $color_profile; + + $block_parameters = array( + 'board' => 'boards', + 'limit' => 'int', + 'start' => 'int', + 'length' => 'int', + 'avatar' => 'check', + 'per_page' => 'int', + ); + + if ($return_parameters) + return $block_parameters; + + $board = !empty($parameters['board']) ? explode('|', $parameters['board']) : null; + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 5; + $start = !empty($parameters['start']) ? (int) $parameters['start'] : 0; + $length = isset($parameters['length']) ? (int) $parameters['length'] : 250; + $avatars = !empty($parameters['avatar']); + $per_page = !empty($parameters['per_page']) ? (int) $parameters['per_page'] : 0; + + $limit = max(0, $limit); + $start = max(0, $start); + + loadLanguage('Stats'); + + $stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless'); + $icon_sources = array(); + foreach ($stable_icons as $icon) + $icon_sources[$icon] = 'images_url'; + + $request = $smcFunc['db_query']('', ' + SELECT t.id_first_msg + FROM {db_prefix}topics AS t + INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board) + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) + WHERE ' . (empty($board) ? '{query_see_board} + AND t.id_first_msg >= {int:min_msg_id}' : 't.id_board IN ({array_int:current_board})') . ($modSettings['postmod_active'] ? ' + AND t.approved = {int:is_approved}' : '') . ' + AND (t.locked != {int:locked} OR m.icon != {string:icon}) + ORDER BY t.id_first_msg DESC + LIMIT {int:limit}', + array( + 'current_board' => $board, + 'min_msg_id' => $modSettings['maxMsgID'] - 45 * min($limit, 5), + 'is_approved' => 1, + 'locked' => 1, + 'icon' => 'moved', + 'limit' => $limit, + ) + ); + $posts = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $posts[] = $row['id_first_msg']; + $smcFunc['db_free_result']($request); + + if (empty($posts)) + { + echo ' + ', $txt['error_sp_no_posts_found']; + return; + } + elseif (!empty($per_page)) + { + $limit = count($posts); + $start = !empty($_REQUEST['news' . $id]) ? (int) $_REQUEST['news' . $id] : 0; + + $clean_url = preg_replace('~news' . $id . '=\d+;?~', '', $_SERVER['REQUEST_URL']); + $current_url = $clean_url . (strpos($clean_url, '?') !== false ? (in_array(substr($clean_url, -1), array(';', '?')) ? '' : ';') : '?'); + + $page_index = constructPageIndex($current_url . 'news' . $id . '=%1$d', $start, $limit, $per_page, true); + } + + $request = $smcFunc['db_query']('', ' + SELECT + m.icon, m.subject, m.body, IFNULL(mem.real_name, m.poster_name) AS poster_name, m.poster_time, + t.num_replies, t.id_topic, m.id_member, m.smileys_enabled, m.id_msg, t.locked, mem.avatar, + a.id_attach, a.attachment_type, a.filename, t.num_views + FROM {db_prefix}topics AS t + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) + LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = mem.id_member) + WHERE t.id_first_msg IN ({array_int:post_list}) + ORDER BY t.id_first_msg DESC + LIMIT ' . (!empty($per_page) ? '{int:start}, ' : '') . '{int:limit}', + array( + 'post_list' => $posts, + 'start' => $start, + 'limit' => !empty($per_page) ? $per_page : $limit, + ) + ); + $return = array(); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $limited = false; + if (($cutoff = $smcFunc['strpos']($row['body'], '[cutoff]')) !== false) + { + $row['body'] = $smcFunc['substr']($row['body'], 0, $cutoff); + $limited = true; + } + elseif (!empty($length) && $smcFunc['strlen']($row['body']) > $length) + { + $row['body'] = $smcFunc['substr']($row['body'], 0, $length); + $limited = true; + } + + $row['body'] = parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']); + + // Only place an ellipsis if the body has been shortened. + if ($limited) + $row['body'] .= '...'; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']])) + $icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url'; + + censorText($row['subject']); + censorText($row['body']); + + if ($modSettings['sp_resize_images']) + $row['body'] = preg_replace('~class="bbc_img~i', 'class="bbc_img sp_article', $row['body']); + + if (!empty($row['id_member'])) + $colorids[$row['id_member']] = $row['id_member']; + + $return[] = array( + 'id' => $row['id_topic'], + 'message_id' => $row['id_msg'], + 'icon' => '' . $row['icon'] . '', + 'subject' => $row['subject'], + 'time' => timeformat($row['poster_time']), + 'views' => $row['num_views'], + 'body' => $row['body'], + 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0', + 'link' => '' . $txt['sp-read_more'] . '', + 'replies' => $row['num_replies'], + 'comment_href' => !empty($row['locked']) ? '' : $scripturl . '?action=post;topic=' . $row['id_topic'] . '.' . $row['num_replies'] . ';num_replies=' . $row['num_replies'], + 'comment_link' => !empty($row['locked']) ? '' : '| ' . $txt['ssi_write_comment'] . '', + 'new_comment' => !empty($row['locked']) ? '' : '| ' . $txt['ssi_write_comment'] . '', + 'poster' => array( + 'id' => $row['id_member'], + 'name' => $row['poster_name'], + 'href' => !empty($row['id_member']) ? $scripturl . '?action=profile;u=' . $row['id_member'] : '', + 'link' => !empty($row['id_member']) ? '' . $row['poster_name'] . '' : $row['poster_name'] + ), + 'locked' => !empty($row['locked']), + 'is_last' => false, + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + ); + } + $smcFunc['db_free_result']($request); + + if (empty($return)) + { + echo ' + ', $txt['error_sp_no_posts_found']; + return; + } + + $return[count($return) - 1]['is_last'] = true; + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($return as $k => $p) + { + if (!empty($color_profile[$p['poster']['id']]['link'])) + $return[$k]['poster']['link'] = $color_profile[$p['poster']['id']]['link']; + } + } + + if ($context['SPortal']['core_compat']) + { + foreach ($return as $news) + { + echo ' +
+ + + + + + + + + + + +
', $news['icon'], '', $news['subject'], '
'; + + if ($avatars && $news['avatar']['name'] !== null && !empty($news['avatar']['href'])) + echo ' + ', $news['poster']['name'], ' +
', $news['time'], ' ', $txt['by'], ' ', $news['poster']['link'], '
', $txt['sp-articlesViews'], ': ', $news['views'], ' | ', $txt['sp-articlesComments'], ': ', $news['replies'], '
'; + else + echo ' +
', $news['time'], ' ', $txt['by'], ' ', $news['poster']['link'], ' | ', $txt['sp-articlesViews'], ': ', $news['views'], ' | ', $txt['sp-articlesComments'], ': ', $news['replies'], '
'; + + echo ' +

', $news['body'], '

+
+
', $news['link'], ' ', $news['new_comment'], '
+
+
'; + } + } + else + { + foreach ($return as $news) + { + echo ' +
+

+ ', $news['icon'], '', $news['subject'], ' +

+
+
+ +
'; + + if ($avatars && $news['avatar']['name'] !== null && !empty($news['avatar']['href'])) + echo ' + ', $news['poster']['name'], ' +
', $news['time'], ' ', $txt['by'], ' ', $news['poster']['link'], '
', $txt['sp-articlesViews'], ': ', $news['views'], ' | ', $txt['sp-articlesComments'], ': ', $news['replies'], '
'; + else + echo ' +
', $news['time'], ' ', $txt['by'], ' ', $news['poster']['link'], ' | ', $txt['sp-articlesViews'], ': ', $news['views'], ' | ', $txt['sp-articlesComments'], ': ', $news['replies'], '
'; + + echo ' +

', $news['body'], '
+
', $news['link'], ' ', $news['new_comment'], '
+
+ +
'; + } + } + + if (!empty($per_page)) + echo ' +
', $txt['sp-articlesPages'], ': ', $page_index, '
'; +} + +function sp_quickSearch($parameters, $id, $return_parameters = false) +{ + global $scripturl, $txt, $context; + + $block_parameters = array(); + + if ($return_parameters) + return $block_parameters; + + echo ' +
+
+
+ + +
+
'; +} + +function sp_news($parameters, $id, $return_parameters = false) +{ + global $context; + + $block_parameters = array(); + + if ($return_parameters) + return $block_parameters; + + echo ' +
', $context['random_news_line'], '
'; +} + +function sp_attachmentImage($parameters, $id, $return_parameters = false) +{ + global $boarddir, $txt, $color_profile; + + $block_parameters = array( + 'limit' => 'int', + 'direction' => 'select', + 'disablePoster' => 'check', + 'disableDownloads' => 'check', + 'disableLink' => 'check', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = empty($parameters['limit']) ? 5 : (int) $parameters['limit']; + $direction = empty($parameters['direction']) ? 0 : 1; + $type = array('jpg', 'png', 'gif', 'bmp'); + $showPoster = empty($parameters['disablePoster']); + $showDownloads = empty($parameters['disableDownloads']); + $showLink = empty($parameters['disableLink']); + + $items = ssi_recentAttachments($limit, $type, 'array'); + + if (empty($items)) + { + echo ' + ', $txt['error_sp_no_attachments_found']; + return; + } + + $colorids = array(); + foreach ($items as $item) + $colorids[] = $item['member']['id']; + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($items as $k => $p) + { + if (!empty($color_profile[$p['member']['id']]['link'])) + $items[$k]['member']['link'] = $color_profile[$p['member']['id']]['link']; + } + } + + echo ' + ', $direction ? ' + ' : ''; + + foreach ($items as $item) + { + echo !$direction ? ' + ' : '', ' + ', !$direction ? ' + ' : ''; + } + + echo $direction ? ' + ' : '', ' +
+
', ($showLink ? ' + ' . $item['file']['filename'] . '
' : ''), ' + ', $item['file']['image']['link'], '
', ($showDownloads ? ' + ' . $txt['downloads'] . ': ' . $item['file']['downloads'] . '
' : ''), ($showPoster ? ' + ' . $txt['posted_by'] . ': ' . $item['member']['link'] : ''), ' +
+
'; +} + +function sp_attachmentRecent($parameters, $id, $return_parameters = false) +{ + global $txt; + + $block_parameters = array( + 'limit' => 'int', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = empty($parameters['limit']) ? 5 : (int) $parameters['limit']; + + $items = ssi_recentAttachments($limit, array(), 'array'); + + if (empty($items)) + { + echo ' + ', $txt['error_sp_no_attachments_found']; + return; + } + + echo ' +
    '; + + foreach ($items as $item) + echo ' +
  • ', sp_embed_image('attach'), ' ', $item['file']['filename'], '
  • +
  • ', $txt['downloads'], ': ', $item['file']['downloads'], '
  • +
  • ', $txt['filesize'], ': ', $item['file']['filesize'], '
  • '; + + echo ' +
'; +} + +function sp_calendar($parameters, $id, $return_parameters = false) +{ + global $context, $sourcedir, $modSettings, $options, $scripturl, $txt; + + $block_parameters = array( + 'events' => 'check', + 'birthdays' => 'check', + 'holidays' => 'check', + ); + + if ($return_parameters) + return $block_parameters; + + require_once($sourcedir . '/Subs-Calendar.php'); + $today = getTodayInfo(); + + $curPage = array( + 'day' => $today['day'], + 'month' => $today['month'], + 'year' => $today['year'] + ); + + $calendarOptions = array( + 'start_day' => !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0, + 'show_week_num' => false, + 'show_events' => !empty($parameters['events']), + 'show_birthdays' => !empty($parameters['birthdays']), + 'show_holidays' => !empty($parameters['holidays']), + ); + $calendar_data = getCalendarGrid($curPage['month'], $curPage['year'], $calendarOptions); + + echo ' + + + + '; + + foreach ($calendar_data['week_days'] as $day) + echo ' + '; + + echo ' + '; + + foreach ($calendar_data['weeks'] as $week_key => $week) + { + echo ''; + + foreach ($week['days'] as $day_key => $day) + { + echo ' + '; + } + + echo ' + '; + } + + echo ' +
+ ', !empty($modSettings['cal_enabled']) ? '' . $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'] . '' : $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'], ' +
', $txt['days_short'][$day], '
'; + + if (empty($day['day'])) + unset($calendar_data['weeks'][$week_key]['days'][$day_key]); + else + { + if (!empty($day['holidays']) || !empty($day['birthdays']) || !empty($day['events'])) + echo '', $day['is_today'] ? '[' : '', $day['day'], $day['is_today'] ? ']' : '', ''; + else + echo '', $day['is_today'] ? '[' : '', $day['day'], $day['is_today'] ? ']' : '', ''; + } + + echo '
+
'; + + foreach ($calendar_data['weeks'] as $week) + { + foreach ($week['days'] as $day) + { + if (empty($day['holidays']) && empty($day['birthdays']) && empty($day['events']) && !$day['is_today']) + continue; + elseif (empty($day['holidays']) && empty($day['birthdays']) && empty($day['events'])) + { + echo ' +
', $txt['error_sp_no_items_day'], '
'; + + continue; + } + + echo ' + '; + } + } + + echo ' + + '; +} + +function sp_calendarInformation($parameters, $id, $return_parameters = false) +{ + global $scripturl, $modSettings, $txt; + + $block_parameters = array( + 'events' => 'check', + 'future' => 'int', + 'birthdays' => 'check', + 'holidays' => 'check', + ); + + if ($return_parameters) + return $block_parameters; + + $show_event = !empty($parameters['events']); + $event_future = !empty($parameters['future']) ? (int) $parameters['future'] : 0; + $event_future = abs($event_future); + $show_birthday = !empty($parameters['birthdays']); + $show_holiday = !empty($parameters['holidays']); + $show_titles = false; + + if (!$show_event && !$show_birthday && !$show_holiday) + { + echo ' + ', $txt['sp_calendar_noEventsFound']; + return; + } + + $now = forum_time(); + $today_date = date("Y-m-d", $now); + $calendar_array = array( + 'todayEvents' => array(), + 'futureEvents' => array(), + 'todayBirthdays' => array(), + 'todayHolidays' => array() + ); + + if ($show_event) + { + if (!empty($event_future)) + $event_future_date = date("Y-m-d", ($now + $event_future * 86400)); + else + $event_future_date = $today_date; + + $events = sp_loadCalendarData('getEvents', $today_date, $event_future_date); + + ksort($events); + + $displayed = array(); + foreach ($events as $day => $day_events) + foreach ($day_events as $event_key => $event) + if (in_array($event['id'], $displayed)) + unset($events[$day][$event_key]); + else + $displayed[] = $event['id']; + + if (!empty($events[$today_date])) + { + $calendar_array['todayEvents'] = $events[$today_date]; + unset($events[$today_date]); + } + + if (!empty($events)) + { + ksort($events); + $calendar_array['futureEvents'] = $events; + } + } + + if ($show_birthday) + { + $calendar_array['todayBirthdays'] = current(sp_loadCalendarData('getBirthdays', $today_date)); + $show_titles = !empty($show_event) || !empty($show_holiday); + } + + if ($show_holiday) + { + $calendar_array['todayHolidays'] = current(sp_loadCalendarData('getHolidays', $today_date)); + $show_titles = !empty($show_event) || !empty($show_birthday); + } + + if (empty($calendar_array['todayEvents']) && empty($calendar_array['futureEvents']) && empty($calendar_array['todayBirthdays']) && empty($calendar_array['todayHolidays'])) + { + echo ' + ', $txt['sp_calendar_noEventsFound']; + return; + } + else + { + echo ' +
    '; + + if (!empty($calendar_array['todayHolidays'])) + { + if ($show_titles) + echo ' +
  • ', $txt['sp_calendar_holidays'] ,'
  • '; + + foreach ($calendar_array['todayHolidays'] as $key => $holiday) + echo ' +
  • ', sp_embed_image('holiday'), ' ', $holiday ,'
  • '; + } + + if (!empty($calendar_array['todayBirthdays'])) + { + if ($show_titles) + echo ' +
  • ', $txt['sp_calendar_birthdays'] ,'
  • '; + + foreach ($calendar_array['todayBirthdays'] as $member) + echo ' +
  • ', sp_embed_image('birthday'), ' ', $member['name'], isset($member['age']) ? ' (' . $member['age'] . ')' : '', '
  • '; + } + + if (!empty($calendar_array['todayEvents'])) + { + if ($show_titles) + echo ' +
  • ', $txt['sp_calendar_events'] ,'
  • '; + + foreach ($calendar_array['todayEvents'] as $event) + echo ' +
  • ', sp_embed_image('event'), ' ', $event['link'], !$show_titles ? ' - ' . timeformat(forum_time(), '%d %b') : '', '
  • '; + } + + if (!empty($calendar_array['futureEvents'])) + { + if ($show_titles) + echo ' +
  • ', $txt['sp_calendar_upcomingEvents'] ,'
  • '; + + foreach($calendar_array['futureEvents'] as $startdate => $events) + { + list($year, $month, $day) = explode('-', $startdate); + $currentDay = $day . ' ' . $txt['months_short'][(int) $month]; + + foreach($events as $event) + echo ' +
  • ', sp_embed_image('event'), ' ', $event['link'], ' - ', $currentDay, '
  • '; + } + } + + echo ' +
'; + } +} + +function sp_rssFeed($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $sourcedir, $context, $txt; + + $block_parameters = array( + 'url' => 'text', + 'show_title' => 'check', + 'show_content' => 'check', + 'show_date' => 'check', + 'strip_preserve' => 'text', + 'count' => 'int', + 'limit' => 'int', + ); + + if ($return_parameters) + return $block_parameters; + + $feed = !empty($parameters['url']) ? un_htmlspecialchars($parameters['url']) : ''; + $show_title = !empty($parameters['show_title']); + $show_content = !empty($parameters['show_content']); + $show_date = !empty($parameters['show_date']); + $strip_preserve = !empty($parameters['strip_preserve']) ? $parameters['strip_preserve'] : 'br'; + $strip_preserve = preg_match_all('~[A-Za-z0-9]+~', $strip_preserve, $match) ? $match[0] : array(); + $count = !empty($parameters['count']) ? (int) $parameters['count'] : 5; + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 150; + + if (empty($feed)) + { + echo ' + ', $txt['error_sp_invalid_feed']; + return; + } + + $rss = array(); + + require_once($sourcedir . '/Subs-Package.php'); + $data = fetch_web_data($feed); + + if (function_exists('mb_convert_encoding')) + { + preg_match('~encoding="([^"]*)"~', $data, $charset); + + if (!empty($charset[1]) && $charset != $context['character_set']) + $data = mb_convert_encoding($data, $context['character_set'], $charset[1]); + } + elseif (function_exists('iconv')) + { + preg_match('~encoding="([^"]*)"~', $data, $charset); + + if (!empty($charset[1]) && $charset != $context['character_set']) + $data = iconv($charset[1], $context['character_set'], $data); + } + + $data = str_replace(array("\n", "\r", "\t"), '', $data); + $data = preg_replace('~<\!\[CDATA\[(.+?)\]\]>~e' . ($context['utf8'] ? 'u' : ''), '\'#cdata_escape_encode#\' . $smcFunc[\'htmlspecialchars\'](\'$1\')', $data); + + preg_match_all('~(.+?)~', $data, $items); + + foreach ($items[1] as $item_id => $item) + { + if ($item_id === $count) + break; + + preg_match_all('~<([A-Za-z]+)>(.+?)~', $item, $match); + + foreach ($match[0] as $tag_id => $dummy) + { + if ($smcFunc['strpos']($match[2][$tag_id], '#cdata_escape_encode#') === 0) + $match[2][$tag_id] = stripslashes(un_htmlspecialchars($smcFunc['substr']($match[2][$tag_id], 21))); + + $rss[$item_id][strtolower($match[1][$tag_id])] = un_htmlspecialchars($match[2][$tag_id]); + } + } + + if (empty($rss)) + { + echo ' + ', $txt['error_sp_invalid_feed']; + return; + } + + $items = array(); + foreach ($rss as $item) + { + $item['title'] = isset($item['title']) ? strip_tags($item['title']) : ''; + $item['description'] = isset($item['description']) ? strip_tags($item['description'], empty($strip_preserve) ? '' : '<' . implode('><', $strip_preserve) . '>') : ''; + + $items[] = array( + 'title' => $item['title'], + 'href' => $item['link'], + 'link' => $item['title'] == '' ? '' : ($item['link'] == '' ? $item['title'] : '' . $item['title'] . ''), + 'content' => $limit > 0 && $smcFunc['strlen']($item['description']) > $limit ? $smcFunc['substr']($item['description'], 0, $limit) . '...' : $item['description'], + 'date' => !empty($item['pubdate']) ? timeformat(strtotime($item['pubdate']), '%d %B') : '', + ); + } + + if (empty($items)) + { + echo ' + ', $txt['error_sp_invalid_feed']; + return; + } + else + $items[count($items) - 1]['is_last'] = true; + + if ($show_content) + { + echo ' +
+
    '; + + foreach ($items as $item) + { + if ($show_title && !empty($item['link'])) + echo ' +
  • ', sp_embed_image('post'), ' ', $item['link'], '', ($show_date && !empty($item['date']) ? ' - ' . $item['date'] : ''), '
  • '; + echo ' + ', $item['content'], ''; + } + + echo ' +
+
'; + } + else + { + echo ' +
    '; + + foreach ($items as $item) + echo ' +
  • ', sp_embed_image('dot_feed'), ' ', $item['link'], ($show_date && !empty($item['date']) ? ' - ' . $item['date'] : ''), '
  • '; + + echo ' +
'; + } +} + +function sp_theme_select($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $context, $modSettings, $user_info, $settings, $language, $txt; + + $block_parameters = array(); + + if ($return_parameters) + return $block_parameters; + + loadLanguage('Profile'); + loadLanguage('Themes'); + + if (!empty($_SESSION['id_theme']) && (!empty($modSettings['theme_allow']) || allowedTo('admin_forum'))) + $current_theme = (int) $_SESSION['id_theme']; + else + $current_theme = $user_info['theme']; + + $current_theme = empty($current_theme) ? -1 : $current_theme; + $available_themes = array(); + if (!empty($modSettings['knownThemes'])) + { + $request = $smcFunc['db_query']('', ' + SELECT id_theme, variable, value + FROM {db_prefix}themes + WHERE variable IN ({string:name}, {string:theme_url}, {string:theme_dir}, {string:images_url}) + AND id_theme IN ({array_string:known_themes}) + AND id_theme != {int:default_theme}', + array( + 'default_theme' => 0, + 'name' => 'name', + 'theme_url' => 'theme_url', + 'theme_dir' => 'theme_dir', + 'images_url' => 'images_url', + 'known_themes' => explode(',', $modSettings['knownThemes']), + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!isset($available_themes[$row['id_theme']])) + $available_themes[$row['id_theme']] = array( + 'id' => $row['id_theme'], + 'selected' => $current_theme == $row['id_theme'], + ); + $available_themes[$row['id_theme']][$row['variable']] = $row['value']; + } + $smcFunc['db_free_result']($request); + } + + if (!isset($available_themes[$modSettings['theme_guests']])) + { + $available_themes[0] = array( + 'num_users' => 0 + ); + $guest_theme = 0; + } + else + $guest_theme = $modSettings['theme_guests']; + + $current_images_url = $settings['images_url']; + + foreach ($available_themes as $id_theme => $theme_data) + { + if ($id_theme == 0) + continue; + + $settings['images_url'] = &$theme_data['images_url']; + + if (file_exists($theme_data['theme_dir'] . '/languages/Settings.' . $user_info['language'] . '.php')) + include($theme_data['theme_dir'] . '/languages/Settings.' . $user_info['language'] . '.php'); + elseif (file_exists($theme_data['theme_dir'] . '/languages/Settings.' . $language . '.php')) + include($theme_data['theme_dir'] . '/languages/Settings.' . $language . '.php'); + else + { + $txt['theme_thumbnail_href'] = $theme_data['images_url'] . '/thumbnail.gif'; + $txt['theme_description'] = ''; + } + + $available_themes[$id_theme]['thumbnail_href'] = $txt['theme_thumbnail_href']; + $available_themes[$id_theme]['description'] = $txt['theme_description']; + + $available_themes[$id_theme]['name'] = preg_replace('~\stheme$~i', '', $theme_data['name']); + if ($smcFunc['strlen']($available_themes[$id_theme]['name']) > 18) + $available_themes[$id_theme]['name'] = $smcFunc['substr']($available_themes[$id_theme]['name'], 0, 18) . '...'; + } + + $settings['images_url'] = $current_images_url; + + if ($guest_theme != 0) + $available_themes[-1] = $available_themes[$guest_theme]; + + $available_themes[-1]['id'] = -1; + $available_themes[-1]['name'] = $txt['theme_forum_default']; + $available_themes[-1]['selected'] = $current_theme == 0; + $available_themes[-1]['description'] = $txt['theme_global_description']; + + ksort($available_themes); + + // Validate the selected theme id. + if (!array_key_exists($current_theme, $available_themes)) + { + $current_theme = -1; + $available_themes[-1]['selected'] = true; + } + + if (!empty($_POST['sp_ts_submit']) && !empty($_POST['sp_ts_permanent']) && !empty($_POST['theme']) && isset($available_themes[$_POST['theme']]) && (!empty($modSettings['theme_allow']) || allowedTo('admin_forum'))) + updateMemberData($user_info['id'], array('id_theme' => $_POST['theme'] == -1 ? 0 : (int) $_POST['theme'])); + + echo ' +
+
+ +

+ ', $available_themes[$current_theme]['name'], ' +

+ ', $txt['sp-theme_permanent'], ' +
+ +
+
+ '; +} + +function sp_staff($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $sourcedir, $scripturl, $modSettings, $color_profile; + + $block_parameters = array( + 'lmod' => 'check', + ); + + if ($return_parameters) + return $block_parameters; + + require_once($sourcedir . '/Subs-Members.php'); + + if (empty($parameters['lmod'])) + { + $request = $smcFunc['db_query']('', ' + SELECT id_member + FROM {db_prefix}moderators AS mods', + array( + ) + ); + $local_mods = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $local_mods[$row['id_member']] = $row['id_member']; + $smcFunc['db_free_result']($request); + + if (count($local_mods) > 10) + $local_mods = array(); + } + else + $local_mods = array(); + + $global_mods = membersAllowedTo('moderate_board', 0); + $admins = membersAllowedTo('admin_forum'); + + $all_staff = array_merge($local_mods, $global_mods, $admins); + $all_staff = array_unique($all_staff); + + $request = $smcFunc['db_query']('', ' + SELECT + m.id_member, m.real_name, m.avatar, mg.group_name, + a.id_attach, a.attachment_type, a.filename + FROM {db_prefix}members AS m + LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = m.id_member) + LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN m.id_group = {int:reg_group_id} THEN m.id_post_group ELSE m.id_group END) + WHERE m.id_member IN ({array_int:staff_list})', + array( + 'staff_list' => $all_staff, + 'reg_group_id' => 0, + ) + ); + $staff_list = array(); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $colorids[$row['id_member']] = $row['id_member']; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + if (in_array($row['id_member'], $admins)) + $row['type'] = 1; + elseif (in_array($row['id_member'], $global_mods)) + $row['type'] = 2; + else + $row['type'] = 3; + + $staff_list[$row['type'] . '-' . $row['id_member']] = array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'link' => '' . $row['real_name'] . '', + 'group' => $row['group_name'], + 'type' => $row['type'], + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + ); + } + $smcFunc['db_free_result']($request); + + ksort($staff_list); + $staff_count = count($staff_list); + $count = 0; + $icons = array(1 => 'admin', 'gmod', 'lmod'); + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($staff_list as $k => $p) + { + if (!empty($color_profile[$p['id']]['link'])) + $staff_list[$k]['link'] = $color_profile[$p['id']]['link']; + } + } + + echo ' + '; + + foreach ($staff_list as $staff) + echo ' + + + + '; + + echo ' +
', !empty($staff['avatar']['href']) ? ' + ' . $staff['name'] . '' : '', ' + + ', sp_embed_image($icons[$staff['type']]), ' ', $staff['link'], '
+ ', $staff['group'], ' +
'; +} + +function sp_articles($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $sourcedir, $modSettings, $scripturl, $txt, $color_profile; + + $block_parameters = array( + 'category' => array(0 => $txt['sp_all']), + 'limit' => 'int', + 'type' => 'select', + 'image' => 'select', + ); + + if ($return_parameters) + { + require_once($sourcedir . '/Subs-PortalAdmin.php'); + + $categories = getCategoryInfo(); + foreach ($categories as $category) + $block_parameters['category'][$category['id']] = $category['name']; + + return $block_parameters; + } + + $category = empty($parameters['category']) ? 0 : (int) $parameters['category']; + $limit = empty($parameters['limit']) ? 5 : (int) $parameters['limit']; + $type = empty($parameters['type']) ? 0 : 1; + $image = empty($parameters['image']) ? 0 : (int) $parameters['image']; + + $request = $smcFunc['db_query']('',' + SELECT + m.id_topic, m.subject, m.poster_name, c.picture, c.name, + mem.id_member, mem.real_name, mem.avatar, + at.id_attach, at.attachment_type, at.filename + FROM {db_prefix}sp_articles AS a + INNER JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category) + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) + INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) + LEFT JOIN {db_prefix}attachments AS at ON (at.id_member = mem.id_member) + WHERE {query_see_board} + AND a.approved = {int:approved}' . (!empty($category) ? ' + AND a.id_category = {int:category}' : '') . ' + ORDER BY {raw:type} + LIMIT {int:limit}', + array( + 'approved' => 1, + 'category' => $category, + 'type' => $type ? 'RAND()' : 'm.poster_time DESC', + 'limit' => $limit, + ) + ); + $articles = array(); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($row['id_member'])) + $colorids[$row['id_member']] = $row['id_member']; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + $articles[] = array( + 'id' => $row['id_topic'], + 'name' => $row['subject'], + 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0', + 'link' => '' . $row['subject'] . '', + 'poster' => array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => empty($row['id_member']) ? $row['poster_name'] : '' . $row['real_name'] . '', + ), + 'image' => array( + 'href' => $row['picture'], + 'image' => '' . $row['name'] . '', + ), + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + ); + } + $smcFunc['db_free_result']($request); + + if (empty($articles)) + { + echo ' + ', $txt['error_sp_no_articles_found']; + return; + } + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($articles as $k => $p) + { + if (!empty($color_profile[$p['poster']['id']]['link'])) + $articles[$k]['poster']['link'] = $color_profile[$p['poster']['id']]['link']; + } + } + + if (empty($image)) + { + echo ' +
    '; + + foreach ($articles as $article) + echo ' +
  • ', sp_embed_image('topic'), ' ', $article['link'], '
  • '; + + echo ' +
'; + } + else + { + echo ' + '; + + foreach ($articles as $article) + { + echo ' + + + + '; + } + + echo ' +
'; + + if (!empty($article['avatar']['href']) && $image == 1) + echo '', $article['poster']['name'], ''; + elseif (!empty($article['image']['href']) && $image == 2) + echo '', $article['name'], ''; + + echo ' + ', $article['poster']['link'], '
+ ', $article['link'], ' +
'; + } +} + +function sp_shoutbox($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $context, $sourcedir, $modSettings, $user_info, $settings, $txt, $scripturl; + + $block_parameters = array( + 'shoutbox' => array(), + ); + + if ($return_parameters) + { + $shoutboxes = sportal_get_shoutbox(); + $in_use = array(); + + $request = $smcFunc['db_query']('',' + SELECT id_block, value + FROM {db_prefix}sp_parameters + WHERE variable = {string:name}', + array( + 'name' => 'shoutbox', + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + if (empty($_REQUEST['block_id']) || $_REQUEST['block_id'] != $row['id_block']) + $in_use[] = $row['value']; + $smcFunc['db_free_result']($request); + + foreach ($shoutboxes as $shoutbox) + if (!in_array($shoutbox['id'], $in_use)) + $block_parameters['shoutbox'][$shoutbox['id']] = $shoutbox['name']; + + if (empty($block_parameters['shoutbox'])) + fatal_error(allowedTo(array('sp_admin', 'sp_manage_shoutbox')) ? $txt['error_sp_no_shoutbox'] . '
' . sprintf($txt['error_sp_no_shoutbox_sp_moderator'], $scripturl . '?action=admin;area=portalshoutbox;sa=add') : $txt['error_sp_no_shoutbox_normaluser'], false); + + return $block_parameters; + } + + loadTemplate('PortalShoutbox'); + loadLanguage('Post'); + + $shoutbox = sportal_get_shoutbox($parameters['shoutbox'], true, true); + + if (empty($shoutbox)) + { + echo ' + ', $txt['error_sp_shoutbox_not_exist']; + return; + } + + if (!empty($_POST['new_shout']) && !empty($_POST['submit_shout']) && !empty($_POST['shoutbox_id']) && $_POST['shoutbox_id'] == $shoutbox['id']) + { + checkSession(); + + is_not_guest(); + + if (!($flood = sp_prevent_flood('spsbp', false))) + { + require_once($sourcedir . '/Subs-Post.php'); + + $_POST['new_shout'] = $smcFunc['htmlspecialchars'](trim($_POST['new_shout'])); + preparsecode($_POST['new_shout']); + + if (!empty($_POST['new_shout'])) + sportal_create_shout($shoutbox, $_POST['new_shout']); + } + else + $shoutbox['warning'] = $flood; + } + + $can_moderate = allowedTo('sp_admin') || allowedTo('sp_manage_shoutbox'); + if (!$can_moderate && !empty($shoutbox['moderator_groups'])) + $can_moderate = count(array_intersect($user_info['groups'], $shoutbox['moderator_groups'])) > 0; + + $shout_parameters = array( + 'limit' => $shoutbox['num_show'], + 'bbc' => $shoutbox['allowed_bbc'], + 'reverse' => $shoutbox['reverse'], + 'cache' => $shoutbox['caching'], + 'can_moderate' => $can_moderate, + ); + $shoutbox['shouts'] = sportal_get_shouts($shoutbox['id'], $shout_parameters); + + $shoutbox['warning'] = parse_bbc($shoutbox['warning']); + $context['can_shout'] = $context['user']['is_logged']; + + if ($context['can_shout']) + { + $settings['smileys_url'] = $modSettings['smileys_url'] . '/' . $user_info['smiley_set']; + $shoutbox['smileys'] = array('normal' => array(), 'popup' => array()); + if (empty($modSettings['smiley_enable'])) + $shoutbox['smileys']['normal'] = array( + array('code' => ':)', 'filename' => 'smiley.gif', 'description' => $txt['icon_smiley']), + array('code' => ';)', 'filename' => 'wink.gif', 'description' => $txt['icon_wink']), + array('code' => ':D', 'filename' => 'cheesy.gif', 'description' => $txt['icon_cheesy']), + array('code' => ';D', 'filename' => 'grin.gif', 'description' => $txt['icon_grin']), + array('code' => '>:(', 'filename' => 'angry.gif', 'description' => $txt['icon_angry']), + array('code' => ':(', 'filename' => 'sad.gif', 'description' => $txt['icon_sad']), + array('code' => ':o', 'filename' => 'shocked.gif', 'description' => $txt['icon_shocked']), + array('code' => '8)', 'filename' => 'cool.gif', 'description' => $txt['icon_cool']), + array('code' => '???', 'filename' => 'huh.gif', 'description' => $txt['icon_huh']), + array('code' => '::)', 'filename' => 'rolleyes.gif', 'description' => $txt['icon_rolleyes']), + array('code' => ':P', 'filename' => 'tongue.gif', 'description' => $txt['icon_tongue']), + array('code' => ':-[', 'filename' => 'embarrassed.gif', 'description' => $txt['icon_embarrassed']), + array('code' => ':-X', 'filename' => 'lipsrsealed.gif', 'description' => $txt['icon_lips']), + array('code' => ':-\\', 'filename' => 'undecided.gif', 'description' => $txt['icon_undecided']), + array('code' => ':-*', 'filename' => 'kiss.gif', 'description' => $txt['icon_kiss']), + array('code' => ':\'(', 'filename' => 'cry.gif', 'description' => $txt['icon_cry']) + ); + else + { + if (($temp = cache_get_data('shoutbox_smileys', 3600)) == null) + { + $request = $smcFunc['db_query']('', ' + SELECT code, filename, description, smiley_row, hidden + FROM {db_prefix}smileys + WHERE hidden IN ({array_int:hidden}) + ORDER BY smiley_row, smiley_order', + array( + 'hidden' => array(0, 2), + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $row['filename'] = htmlspecialchars($row['filename']); + $row['description'] = htmlspecialchars($row['description']); + $row['code'] = htmlspecialchars($row['code']); + $shoutbox['smileys'][empty($row['hidden']) ? 'normal' : 'popup'][] = $row; + } + $smcFunc['db_free_result']($request); + + cache_put_data('shoutbox_smileys', $shoutbox['smileys'], 3600); + } + else + $shoutbox['smileys'] = $temp; + } + + foreach (array_keys($shoutbox['smileys']) as $location) + { + $n = count($shoutbox['smileys'][$location]); + for ($i = 0; $i < $n; $i++) + { + $shoutbox['smileys'][$location][$i]['code'] = addslashes($shoutbox['smileys'][$location][$i]['code']); + $shoutbox['smileys'][$location][$i]['js_description'] = addslashes($shoutbox['smileys'][$location][$i]['description']); + } + + if (!empty($shoutbox['smileys'][$location])) + $shoutbox['smileys'][$location][$n - 1]['last'] = true; + } + + $shoutbox['bbc'] = array( + 'bold' => array('code' => 'b', 'before' => '[b]', 'after' => '[/b]', 'description' => $txt['bold']), + 'italicize' => array('code' => 'i', 'before' => '[i]', 'after' => '[/i]', 'description' => $txt['italic']), + 'underline' => array('code' => 'u', 'before' => '[u]', 'after' => '[/u]', 'description' => $txt['underline']), + 'strike' => array('code' => 's', 'before' => '[s]', 'after' => '[/s]', 'description' => $txt['strike']), + 'pre' => array('code' => 'pre', 'before' => '[pre]', 'after' => '[/pre]', 'description' => $txt['preformatted']), + 'flash' => array('code' => 'flash', 'before' => '[flash=200,200]', 'after' => '[/flash]', 'description' => $txt['flash']), + 'img' => array('code' => 'img', 'before' => '[img]', 'after' => '[/img]', 'description' => $txt['image']), + 'url' => array('code' => 'url', 'before' => '[url]', 'after' => '[/url]', 'description' => $txt['hyperlink']), + 'email' => array('code' => 'email', 'before' => '[email]', 'after' => '[/email]', 'description' => $txt['insert_email']), + 'ftp' => array('code' => 'ftp', 'before' => '[ftp]', 'after' => '[/ftp]', 'description' => $txt['ftp']), + 'glow' => array('code' => 'glow', 'before' => '[glow=red,2,300]', 'after' => '[/glow]', 'description' => $txt['glow']), + 'shadow' => array('code' => 'shadow', 'before' => '[shadow=red,left]', 'after' => '[/shadow]', 'description' => $txt['shadow']), + 'sup' => array('code' => 'sup', 'before' => '[sup]', 'after' => '[/sup]', 'description' => $txt['superscript']), + 'sub' => array('code' => 'sub', 'before' => '[sub]', 'after' => '[/sub]', 'description' => $txt['subscript']), + 'tele' => array('code' => 'tt', 'before' => '[tt]', 'after' => '[/tt]', 'description' => $txt['teletype']), + 'code' => array('code' => 'code', 'before' => '[code]', 'after' => '[/code]', 'description' => $txt['bbc_code']), + 'quote' => array('code' => 'quote', 'before' => '[quote]', 'after' => '[/quote]', 'description' => $txt['bbc_quote']), + ); + } + + template_shoutbox_embed($shoutbox); +} + +function sp_gallery($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $context, $modSettings, $scripturl; + global $sourcedir, $txt, $settings, $boardurl, $galurl; + static $mod, $GD_Installed; + + $block_parameters = array( + 'limit' => 'int', + 'type' => 'select', + 'direction' => 'select', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = empty($parameters['limit']) ? 1 : (int) $parameters['limit']; + $type = empty($parameters['type']) ? 0 : 1; + $direction = empty($parameters['direction']) ? 0 : 1; + + if (!isset($mod)) + { + if (file_exists($sourcedir . '/Aeva-Media.php')) + $mod = 'aeva_media'; + elseif (file_exists($sourcedir . '/MGallery.php')) + $mod = 'smf_media_gallery'; + elseif (file_exists($sourcedir . '/Gallery.php') || file_exists($sourcedir . '/Gallery2.php')) + $mod = 'smf_gallery'; + else + $mod = ''; + } + + if (empty($mod)) + { + echo ' + ', $txt['error_sp_no_gallery_found']; + return; + } + elseif ($mod == 'aeva_media') + { + require_once($sourcedir . '/Aeva-Subs.php'); + + $items = aeva_getMediaItems(0, $limit, $type ? 'RAND()' : 'm.id_media DESC'); + } + elseif ($mod == 'smf_media_gallery') + { + require_once($sourcedir . '/Subs-MGallery.php'); + + loadMGal_Settings(); + loadLanguage('MGallery', sp_languageSelect('MGallery')); + + $items = getMediaItems(0, $limit, $type ? 'RAND()' : 'm.id_media DESC'); + } + elseif ($mod == 'smf_gallery') + { + loadLanguage('Gallery', sp_languageSelect('Gallery')); + + if (!isset($GD_Installed)) + $GD_Installed = function_exists('imagecreate'); + + if (empty($modSettings['gallery_url'])) + $modSettings['gallery_url'] = $boardurl . '/gallery/'; + + $request = $smcFunc['db_query']('',' + SELECT + p.id_picture, p.commenttotal, p.filesize, p.views, p.thumbfilename, + p.filename, p.height, p.width, p.title, p.id_member, m.member_name, + m.real_name, p.date, p.description + FROM {db_prefix}gallery_pic AS p + LEFT JOIN {db_prefix}members AS m ON (m.id_member = p.id_member) + WHERE p.approved = {int:is_approved} + ORDER BY {raw:type} + LIMIT {int:limit}', + array( + 'is_approved' => 1, + 'type' => $type ? 'RAND()' : 'p.id_picture DESC', + 'limit' => $limit, + ) + ); + $items = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $items[] = array( + 'id' => $row['id_picture'], + 'title' => $row['title'], + 'views' => $row['views'], + 'poster_id' => $row['id_member'], + 'poster_name' => $row['real_name'], + 'poster_link' => empty($row['id_member']) ? $txt['gallery_guest'] : '' . $row['real_name'] . '', + 'thumbfilename' => $row['thumbfilename'], + 'filename' => $row['filename'], + 'src' => $modSettings['gallery_url'] . ($GD_Installed ? $row['thumbfilename'] : $row['filename'] . '" width="120'), + ); + } + $smcFunc['db_free_result']($request); + } + + if (empty($items)) + { + echo ' + ', $txt['error_sp_no_pictures_found']; + return; + } + + echo ' + ', $direction ? ' + ' : ''; + + foreach ($items as $item) + { + echo !$direction ? ' + ' : '', ' + ', !$direction ? ' + ' : ''; + } + + echo $direction ? ' + ' : '', ' +
+
'; + + if ($mod == 'aeva_media') + { + echo ' + ', $item['title'], '
+
+ ', $txt['aeva_views'], ': ', $item['views'], '
+ ', $txt['aeva_posted_by'], ': ', $item['poster_name'], '
+ ', $txt['aeva_in_album'], ': ', $item['album_name'], '', $item['is_new'] ? + '
' : ''; + } + elseif ($mod == 'smf_media_gallery') + { + echo ' + ', $item['title'], '
+
+ ', $txt['mgallery_views'], ': ', $item['views'], '
+ ', $txt['mgallery_posted_by'], ': ', $item['poster_name'], '
+ ', $txt['mgallery_in_album'], ': ', $item['album_name'], '', $item['is_new'] ? + '
' : ''; + } + elseif ($mod == 'smf_gallery') + { + echo ' + ', $item['title'], '
+
+ ', $txt['gallery_text_views'], $item['views'], '
+ ', $txt['gallery_text_by'], ' ', $item['poster_link'], '
'; + } + + echo ' +
+
'; +} + +function sp_arcade($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $sourcedir, $scripturl, $settings, $txt, $color_profile; + static $mod; + + $block_parameters = array( + 'limit' => 'int', + 'type' => 'select', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 5; + $type = !empty($parameters['type']) ? (int) $parameters['type'] : 0; + + if (!isset($mod)) + { + if (file_exists($sourcedir . '/Arcade.php')) + $mod = 'smf_arcade'; + else + $mod = ''; + } + + if (empty($mod)) + { + echo ' + ', $txt['error_sp_no_arcade_found']; + return; + } + elseif ($mod == 'smf_arcade') + { + require_once($sourcedir . '/ArcadeStats.php'); + require_once($sourcedir . '/Subs-Arcade.php'); + loadLanguage('Arcade'); + + if (empty($type)) + $stats = ArcadeStats_MostPlayed($limit); + elseif ($type == 1) + $stats = ArcadeStats_BestPlayers($limit); + elseif ($type == 2) + $stats = ArcadeStats_LongestChampions($limit); + + if (empty($stats)) + { + echo ' + ', $txt['error_sp_no_stats_found']; + return; + } + else + $stats[count($stats) - 1]['last'] = true; + + echo ' +
    '; + + if (empty($type)) + { + foreach ($stats as $stat) + { + echo ' +
  • ', sp_embed_image('game'), ' ', $stat['link'], '
  • +
  • ', $txt['sp-game_plays'], ': ', $stat['plays'], ' | ', $txt['sp-game_rating'], ': ', $stat['rating'], '
  • '; + } + } + elseif ($type == 1) + { + $types = array(1 => 'gold', 'silver', 'bronze'); + $current = 0; + foreach ($stats as $stat) + { + echo ' +
  • ', sp_embed_image(isset($types[++$current]) ? $types[$current] : 'user' ), ' ', $stat['link'], '
  • +
  • ', $stat['champions'], ' ', $txt['sp-games'], '
  • '; + } + } + elseif ($type == 2) + { + $types = array(1 => 'gold', 'silver', 'bronze'); + $current = 0; + foreach ($stats as $stat) + { + echo ' +
  • ', sp_embed_image(isset($types[++$current]) ? $types[$current] : 'user' ), ' ', $stat['member_link'], '
  • +
  • ', $stat['game_link'], '
    ', $stat['duration'], '
  • '; + } + } + + echo ' +
'; + } +} + +function sp_shop($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $sourcedir, $scripturl, $txt, $color_profile; + global $context, $boardurl, $modSettings; + static $mod; + + $block_parameters = array( + 'style' => 'select', + 'limit' => 'int', + 'type' => 'select', + 'sort' => 'select', + ); + + if ($return_parameters) + return $block_parameters; + + $style = !empty($parameters['style']); + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 5; + $type = !empty($parameters['type']) ? (int) $parameters['type'] : 0; + $sort = !empty($parameters['sort']); + + if (!isset($mod)) + { + if (file_exists($sourcedir . '/shop')) + $mod = 'smf_shop'; + else + $mod = ''; + } + + if (empty($mod)) + { + echo ' + ', $txt['error_sp_no_shop_found']; + return; + } + elseif ($mod == 'smf_shop') + { + require_once($sourcedir . '/shop/Shop-Subs.php'); + loadLanguage('Shop'); + + if (empty($style)) + { + $request = $smcFunc['db_query']('',' + SELECT id_member, real_name, {raw:type} AS money + FROM {db_prefix}members + ORDER BY money DESC + LIMIT {int:limit}', + array( + 'type' => $type == 0 ? '(money + moneyBank)' : ($type == 1 ? 'money' : 'moneyBank'), + 'limit' => $limit, + ) + ); + $members = array(); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($row['id_member'])) + $colorids[$row['id_member']] = $row['id_member']; + + $members[] = array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => '' . $row['real_name'] . '', + 'money' => formatMoney($row['money']), + ); + } + $smcFunc['db_free_result']($request); + + if (empty($members)) + { + echo ' + ', $txt['error_sp_no_members_found']; + return; + } + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($members as $k => $p) + { + if (!empty($color_profile[$p['id']]['link'])) + $members[$k]['link'] = $color_profile[$p['id']]['link']; + } + } + + echo ' +
    '; + + foreach ($members as $member) + echo ' +
  • ', sp_embed_image('money'), ' ', $member['link'], ' - ', $member['money'], '
  • '; + + echo ' +
'; + } + else + { + $request = $smcFunc['db_query']('',' + SELECT id, name, price, image + FROM {db_prefix}shop_items + WHERE stock > {int:none} + ORDER BY {raw:type} + LIMIT {int:limit}', + array( + 'none' => 0, + 'type' => $sort ? 'RAND()' : 'id DESC', + 'limit' => $limit, + ) + ); + $items = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $items[] = array( + 'id' => $row['id'], + 'name' => $row['name'], + 'href' => $scripturl . '?action=shop;do=buy2;id=' . $row['id'], + 'link' => '' . $txt['shop_buynow'] . '', + 'price' => $row['price'], + 'image' => empty($row['image']) ? '' : '' . $row['name'] . '', + ); + } + $smcFunc['db_free_result']($request); + + if (empty($items)) + { + echo ' + ', $txt['error_sp_no_items_found']; + return; + } + else + $item_count = count($items); + + echo ' + '; + + $count = 0; + foreach ($items as $item) + echo ' + + + + '; + + echo ' +
+ ', $item['image'], ' + + ', $item['name'], '
+ ', $txt['shop_price'], ': ', $item['price'], '
+ ', $context['user']['money'] < $item['price'] ? sprintf($txt['shop_need'], formatMoney($item['price'] - $context['user']['money'])) : $item['link'], ' +
'; + } + } +} + +function sp_blog($parameters, $id, $return_parameters = false) +{ + global $smcFunc, $scripturl, $user_info, $modSettings; + global $context, $boarddir, $sourcedir, $txt, $color_profile; + static $mod; + + $block_parameters = array( + 'limit' => 'int', + 'type' => 'select', + 'sort' => 'select', + ); + + if ($return_parameters) + return $block_parameters; + + $limit = empty($parameters['limit']) ? 5 : (int) $parameters['limit']; + $type = empty($parameters['type']) ? 0 : 1; + $sort = empty($parameters['sort']) ? 0 : 1; + + if (!isset($mod)) + { + if (file_exists($boarddir . '/zCommunity')) + $mod = 'zcommunity'; + elseif (file_exists($sourcedir . '/Blog.php')) + $mod = 'smfblog'; + else + $mod = ''; + } + + if (empty($mod)) + { + echo ' + ', $txt['error_sp_no_blog_found']; + return; + } + elseif ($mod == 'zcommunity') + { + $request = $smcFunc['db_query']('',' + SELECT b.blog_id, b.blog_owner, b.member_groups, bs.users_allowed_access, bs.hideBlog AS hidden + FROM {db_prefix}blog_blogs AS b + LEFT JOIN {db_prefix}blog_settings AS bs ON (bs.blog_id = b.blog_id)', + array( + ) + ); + $visible_blogs = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $can_see_this_blog = false; + + if (empty($row['hidden'])) + { + $allowedGroups = !empty($row['member_groups']) ? explode(',', $row['member_groups']) : array(); + $can_see_this_blog = count(array_intersect($user_info['groups'], $allowedGroups)) > 0; + + if (empty($can_see_this_blog) && !empty($row['users_allowed_access']) && !$user_info['is_guest']) + { + $users_allowed = !empty($row['users_allowed_access']) ? explode(',', $row['users_allowed_access']) : array(); + $can_see_this_blog = in_array($context['user']['id'], $users_allowed); + } + } + + if ($user_info['is_admin'] || ($context['user']['id'] == $row['blog_owner'])) + $can_see_this_blog = true; + + if ($can_see_this_blog) + $visible_blogs[] = $row['blog_id']; + } + $smcFunc['db_free_result']($request); + + if (empty($visible_blogs)) + { + echo ' + ', $txt['error_sp_no_blogs_found']; + return; + } + + if (empty($type)) + { + $request = $smcFunc['db_query']('',' + SELECT t.article_id, t.subject + FROM {db_prefix}blog_articles AS t + LEFT JOIN {db_prefix}blog_settings AS bs ON (bs.blog_id = t.blog_id) + WHERE t.blog_id IN ({array_int:visible_blogs}) + AND ((t.approved = 1) OR (bs.articles_require_approval = 0)) + ORDER BY {raw:type} + LIMIT {int:limit}', + array( + 'visible_blogs' => $visible_blogs, + 'type' => $sort ? 'RAND()' : 't.article_id DESC', + 'limit' => $limit, + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $articles[] = array( + 'id' => $row['article_id'], + 'subject' => strip_tags($row['subject']), + 'link' => '' . $row['subject'] . '', + ); + } + $smcFunc['db_free_result']($request); + + if (empty($articles)) + { + echo ' + ', $txt['error_sp_no_articles_found']; + return; + } + + echo ' +
    '; + + foreach ($articles as $article) + echo ' +
  • ', sp_embed_image('blog'), ' ', $article['link'], '
  • '; + + echo ' +
'; + } + else + { + $request = $smcFunc['db_query']('',' + SELECT + b.blog_id, b.name, t.article_id, t.subject, m.id_member, m.real_name, + m.avatar, a.id_attach, a.attachment_type, a.filename + FROM {db_prefix}blog_blogs AS b + LEFT JOIN {db_prefix}blog_articles AS t ON (t.article_id = b.last_article_id) + LEFT JOIN {db_prefix}members AS m ON (m.id_member = b.blog_owner) + LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = m.id_member) + WHERE b.blog_id IN ({array_int:visible_blogs}) + ORDER BY {raw:type} + LIMIT {int:limit}', + array( + 'visible_blogs' => $visible_blogs, + 'type' => $sort ? 'RAND()' : 'b.last_article_id DESC', + 'limit' => $limit, + ) + ); + $blogs = array(); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($row['id_member'])) + $colorids[$row['id_member']] = $row['id_member']; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + $blogs[] = array( + 'id' => $row['blog_id'], + 'name' => $row['name'], + 'href' => $scripturl . '?blog=' . $row['blog_id'] . '.0', + 'link' => '' . $row['name'] . '', + 'article' => array( + 'id' => $row['article_id'], + 'subject' => strip_tags($row['subject']), + 'link' => '' . $row['subject'] . '', + ), + 'owner' => array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => '' . $row['real_name'] . '', + ), + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + ); + } + $smcFunc['db_free_result']($request); + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($blogs as $k => $p) + { + if (!empty($color_profile[$p['owner']['id']]['link'])) + $blogs[$k]['owner']['link'] = $color_profile[$p['owner']['id']]['link']; + } + } + + echo ' + '; + + foreach ($blogs as $blog) + echo ' + + + + '; + + echo ' +
', !empty($blog['avatar']['href']) ? ' + ' . $blog['name'] . '' : '', ' + + ', $blog['owner']['link'], '
+ ', $blog['article']['link'], ' +
'; + } + } + elseif ($mod == 'smfblog') + { + $request = $smcFunc['db_query']('',' + SELECT b.id_board + FROM {db_prefix}boards AS b + WHERE {query_see_board} + AND b.is_blog = {int:is_blog}', + array( + 'is_blog' => 1, + ) + ); + $visible_blogs = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $visible_blogs[] = $row['id_board']; + $smcFunc['db_free_result']($request); + + if (empty($visible_blogs)) + { + echo ' + ', $txt['error_sp_no_blogs_found']; + return; + } + + if (empty($type)) + { + $request = $smcFunc['db_query']('',' + SELECT t.id_topic, m.subject + FROM {db_prefix}topics AS t + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) + WHERE t.id_board IN ({array_int:visible_blogs})' . ($modSettings['postmod_active'] ? ' + AND t.approved = {int:is_approved}' : '') . ' + ORDER BY {raw:type} + LIMIT {int:limit}', + array( + 'visible_blogs' => $visible_blogs, + 'is_approved' => 1, + 'type' => $sort ? 'RAND()' : 't.id_topic DESC', + 'limit' => $limit, + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + censorText($row['subject']); + + $articles[] = array( + 'id' => $row['id_topic'], + 'subject' => $row['subject'], + 'link' => '' . $row['subject'] . '', + ); + } + $smcFunc['db_free_result']($request); + + if (empty($articles)) + { + echo ' + ', $txt['error_sp_no_articles_found']; + return; + } + + echo ' +
    '; + + foreach ($articles as $article) + echo ' +
  • ', sp_embed_image('blog'), ' ', $article['link'], '
  • '; + + echo ' +
'; + } + else + { + $request = $smcFunc['db_query']('',' + SELECT b.id_board, b.blog_alias, b.name, MAX(t.id_topic) AS id_topic + FROM {db_prefix}boards AS b + INNER JOIN {db_prefix}topics AS t ON (t.id_board = b.id_board) + WHERE b.id_board IN ({array_int:visible_blogs})' . ($modSettings['postmod_active'] ? ' + AND t.approved = {int:is_approved}' : '') . ' + GROUP BY b.id_board + ORDER BY {raw:type} + LIMIT {int:limit}', + array( + 'visible_blogs' => $visible_blogs, + 'is_approved' => 1, + 'type' => $sort ? 'RAND()' : 'b.id_board DESC', + 'limit' => $limit, + ) + ); + $blogs = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $blogs[$row['id_board']] = array( + 'id' => $row['id_board'], + 'alias' => $row['blog_alias'], + 'name' => $row['name'], + 'href' => $scripturl . '?action=blog;sa=view_blog;name=' . $row['blog_alias'], + 'link' => '' . $row['name'] . '', + ); + $articles[] = $row['id_topic']; + } + $smcFunc['db_free_result']($request); + + if (empty($articles)) + { + echo ' + ', $txt['error_sp_no_articles_found']; + return; + } + + $request = $smcFunc['db_query']('',' + SELECT + t.id_board, t.id_topic, m.subject, mem.id_member, mem.real_name, + mem.avatar, a.id_attach, a.attachment_type, a.filename + FROM {db_prefix}topics AS t + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) + INNER JOIN {db_prefix}members AS mem ON (mem.id_member = t.id_member_started) + LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = t.id_member_started) + WHERE t.id_topic IN ({array_int:blog_articles}) + LIMIT {int:limit}', + array( + 'blog_articles' => $articles, + 'limit' => count($articles), + ) + ); + $colorids = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($row['id_member'])) + $colorids[$row['id_member']] = $row['id_member']; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + censorText($row['subject']); + + $blogs[$row['id_board']] += array( + 'article' => array( + 'id' => $row['id_topic'], + 'subject' => $row['subject'], + 'link' => '' . $row['subject'] . '', + ), + 'owner' => array( + 'id' => $row['id_member'], + 'name' => $row['real_name'], + 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => '' . $row['real_name'] . '', + ), + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + ); + } + $smcFunc['db_free_result']($request); + + if (!empty($colorids) && sp_loadColors($colorids) !== false) + { + foreach ($blogs as $k => $p) + { + if (!empty($color_profile[$p['owner']['id']]['link'])) + $blogs[$k]['owner']['link'] = $color_profile[$p['owner']['id']]['link']; + } + } + + echo ' + '; + + foreach ($blogs as $blog) + echo ' + + + + '; + + echo ' +
', !empty($blog['avatar']['href']) ? ' + ' . $blog['name'] . '' : '', ' + + ', $blog['owner']['link'], '
+ ', $blog['article']['link'], ' +
'; + } + } +} + +function sp_menu($parameters, $id, $return_parameters = false) +{ + global $context; + + $block_parameters = array(); + + if ($return_parameters) + return $block_parameters; + + if (empty($context['menu_buttons'])) + setupMenuContext(); + + echo ' + '; +} + +function sp_bbc($parameters, $id, $return_parameters = false) +{ + $block_parameters = array( + 'content' => 'bbc', + ); + + if ($return_parameters) + return $block_parameters; + + $content = !empty($parameters['content']) ? $parameters['content'] : ''; + + echo ' + ', parse_bbc($content); +} + +function sp_html($parameters, $id, $return_parameters = false) +{ + $block_parameters = array( + 'content' => 'textarea', + ); + + if ($return_parameters) + return $block_parameters; + + $content = !empty($parameters['content']) ? $parameters['content'] : ''; + + echo ' + ', un_htmlspecialchars($content); +} + +function sp_php($parameters, $id, $return_parameters = false) +{ + $block_parameters = array( + 'content' => 'textarea', + ); + + if ($return_parameters) + return $block_parameters; + + $content = !empty($parameters['content']) ? $parameters['content'] : ''; + + $content = trim(un_htmlspecialchars($content)); + if (substr($content, 0, 5) == '') + $content = substr($content, 0, -2); + + eval($content); +} + +?> \ No newline at end of file diff --git a/Sources/PortalMain.php b/Sources/PortalMain.php new file mode 100644 index 0000000..a2a0593 --- /dev/null +++ b/Sources/PortalMain.php @@ -0,0 +1,81 @@ + array('PortalArticles.php', 'sportal_add_article'), + 'articles' => array('PortalArticles.php', 'sportal_articles'), + 'credits' => array('', 'sportal_credits'), + 'pages' => array('PortalPages.php', 'sportal_pages'), + 'removearticle' => array('PortalArticles.php', 'sportal_remove_article'), + 'shoutbox' => array('PortalShoutbox.php', 'sportal_shoutbox'), + ); + + if (!isset($_REQUEST['sa']) || !isset($actions[$_REQUEST['sa']])) + $_REQUEST['sa'] = 'articles'; + + if (!empty($actions[$_REQUEST['sa']][0])) + require_once($sourcedir . '/' . $actions[$_REQUEST['sa']][0]); + + $actions[$_REQUEST['sa']][1](); +} + +function sportal_credits() +{ + global $sourcedir, $context, $txt; + + require_once($sourcedir . '/PortalAdminMain.php'); + loadLanguage('SPortalAdmin', sp_languageSelect('SPortalAdmin')); + + sportal_information(false); + + $context['page_title'] = $txt['sp-info_title']; + $context['sub_template'] = 'information'; +} + +?> \ No newline at end of file diff --git a/Sources/PortalPages.php b/Sources/PortalPages.php new file mode 100644 index 0000000..195d312 --- /dev/null +++ b/Sources/PortalPages.php @@ -0,0 +1,74 @@ + $context['SPortal']['page']['id'], + ) + ); + + $_SESSION['last_viewed_page'] = $context['SPortal']['page']['id']; + } + + $context['linktree'][] = array( + 'url' => $scripturl . '?page=' . $page_id, + 'name' => $context['SPortal']['page']['title'], + ); + + $context['page_title'] = $context['SPortal']['page']['title']; + $context['sub_template'] = 'view_page'; +} + +?> \ No newline at end of file diff --git a/Sources/PortalShoutbox.php b/Sources/PortalShoutbox.php new file mode 100644 index 0000000..bf1c3b2 --- /dev/null +++ b/Sources/PortalShoutbox.php @@ -0,0 +1,131 @@ + 0; + + if (!empty($_REQUEST['shout'])) + { + checkSession('request'); + + is_not_guest(); + + if (!($flood = sp_prevent_flood('spsbp', false))) + { + require_once($sourcedir . '/Subs-Post.php'); + + $_REQUEST['shout'] = $smcFunc['htmlspecialchars'](trim($_REQUEST['shout'])); + preparsecode($_REQUEST['shout']); + + if (!empty($_REQUEST['shout'])) + sportal_create_shout($context['SPortal']['shoutbox'], $_REQUEST['shout']); + } + else + $context['SPortal']['shoutbox']['warning'] = $flood; + } + + if (!empty($_REQUEST['delete'])) + { + checkSession('request'); + + if (!$can_moderate) + fatal_lang_error('error_sp_cannot_shoutbox_moderate', false); + + $_REQUEST['delete'] = (int) $_REQUEST['delete']; + + if (!empty($_REQUEST['delete'])) + sportal_delete_shout($shoutbox_id, $_REQUEST['delete']); + } + + loadTemplate('PortalShoutbox'); + + if (isset($_REQUEST['xml'])) + { + $shout_parameters = array( + 'limit' => $context['SPortal']['shoutbox']['num_show'], + 'bbc' => $context['SPortal']['shoutbox']['allowed_bbc'], + 'reverse' => $context['SPortal']['shoutbox']['reverse'], + 'cache' => $context['SPortal']['shoutbox']['caching'], + 'can_moderate' => $can_moderate, + ); + $context['SPortal']['shouts'] = sportal_get_shouts($shoutbox_id, $shout_parameters); + + $context['sub_template'] = 'shoutbox_xml'; + $context['SPortal']['updated'] = empty($context['SPortal']['shoutbox']['last_update']) || $context['SPortal']['shoutbox']['last_update'] > $request_time; + + return; + } + + $request = $smcFunc['db_query']('', ' + SELECT COUNT(*) + FROM {db_prefix}sp_shouts + WHERE id_shoutbox = {int:current}', + array( + 'current' => $shoutbox_id, + ) + ); + list ($total_shouts) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $context['per_page'] = $context['SPortal']['shoutbox']['num_show']; + $context['start'] = !empty($_REQUEST['start']) ? (int) $_REQUEST['start'] : 0; + $context['page_index'] = constructPageIndex($scripturl . '?action=portal;sa=shoutbox;shoutbox_id=' . $shoutbox_id, $context['start'], $total_shouts, $context['per_page']); + + $shout_parameters = array( + 'start' => $context['start'], + 'limit' => $context['per_page'], + 'bbc' => $context['SPortal']['shoutbox']['allowed_bbc'], + 'cache' => $context['SPortal']['shoutbox']['caching'], + 'can_moderate' => $can_moderate, + ); + $context['SPortal']['shouts_history'] = sportal_get_shouts($shoutbox_id, $shout_parameters); + + $context['SPortal']['shoutbox_id'] = $shoutbox_id; + $context['sub_template'] = 'shoutbox_all'; + $context['page_title'] = $context['SPortal']['shoutbox']['name']; +} + +?> \ No newline at end of file diff --git a/Sources/QueryString.php b/Sources/QueryString.php index 5376d13..413dd68 100644 --- a/Sources/QueryString.php +++ b/Sources/QueryString.php @@ -454,6 +454,10 @@ function ob_sessrewrite($buffer) { global $scripturl, $modSettings, $user_info, $context; + // It's just a blue dream... + if (function_exists('sp_query_string')) + $buffer = sp_query_string($buffer); + // If $scripturl is set to nothing, or the SID is not defined (SSI?) just quit. if ($scripturl == '' || !defined('SID')) return $buffer; @@ -471,9 +475,9 @@ function ob_sessrewrite($buffer) { // Let's do something special for session ids! if (defined('SID') && SID != '') - $buffer = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?(?:' . SID . '(?:;|&|&))((?:board|topic)=[^#"]+?)(#[^"]*?)?"~', create_function('$m', 'global $scripturl; return \'"\' . $scripturl . "/" . strtr("$m[1]", \'&;=\', \'//,\') . ".html?" . SID . (isset($m[2]) ? $m[2] : "") . \'"\';'), $buffer); + $buffer = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?(?:' . SID . '(?:;|&|&))((?:board|topic|page)=[^#"]+?)(#[^"]*?)?"~', create_function('$m', 'global $scripturl; return \'"\' . $scripturl . "/" . strtr("$m[1]", \'&;=\', \'//,\') . ".html?" . SID . (isset($m[2]) ? $m[2] : "") . \'"\';'), $buffer); else - $buffer = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?((?:board|topic)=[^#"]+?)(#[^"]*?)?"~', create_function('$m', 'global $scripturl; return \'"\' . $scripturl . "/" . strtr("$m[1]", \'&;=\', \'//,\') . ".html" . (isset($m[2]) ? $m[2] : "") . \'"\';'), $buffer); + $buffer = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?((?:board|topic|page)=[^#"]+?)(#[^"]*?)?"~', create_function('$m', 'global $scripturl; return \'"\' . $scripturl . "/" . strtr("$m[1]", \'&;=\', \'//,\') . ".html" . (isset($m[2]) ? $m[2] : "") . \'"\';'), $buffer); } // Return the changed buffer. diff --git a/Sources/Recent.php b/Sources/Recent.php index 78ef826..1aeb3c2 100644 --- a/Sources/Recent.php +++ b/Sources/Recent.php @@ -113,7 +113,7 @@ function RecentPosts() fatal_lang_error('no_access', false); $context['linktree'][] = array( - 'url' => $scripturl . '#c' . (int) $_REQUEST['c'], + 'url' => $scripturl . '?action=forum#c' . (int) $_REQUEST['c'], 'name' => $name ); } @@ -327,8 +327,8 @@ function RecentPosts() 'category' => array( 'id' => $row['id_cat'], 'name' => $row['cname'], - 'href' => $scripturl . '#c' . $row['id_cat'], - 'link' => '' . $row['cname'] . '' + 'href' => $scripturl . '?action=forum#c' . $row['id_cat'], + 'link' => '' . $row['cname'] . '' ), 'board' => array( 'id' => $row['id_board'], @@ -629,7 +629,7 @@ function UnreadTopics() $smcFunc['db_free_result']($request); $context['linktree'][] = array( - 'url' => $scripturl . '#c' . (int) $_REQUEST['c'][0], + 'url' => $scripturl . '?action=forum#c' . (int) $_REQUEST['c'][0], 'name' => $name ); } diff --git a/Sources/Subs-BoardIndex.php b/Sources/Subs-BoardIndex.php index fcae2c6..848c4a6 100644 --- a/Sources/Subs-BoardIndex.php +++ b/Sources/Subs-BoardIndex.php @@ -107,7 +107,7 @@ function getBoardIndex($boardIndexOptions) 'can_collapse' => isset($row_board['can_collapse']) && $row_board['can_collapse'] == 1, 'collapse_href' => isset($row_board['can_collapse']) ? $scripturl . '?action=collapse;c=' . $row_board['id_cat'] . ';sa=' . ($row_board['is_collapsed'] > 0 ? 'expand;' : 'collapse;') . $context['session_var'] . '=' . $context['session_id'] . '#c' . $row_board['id_cat'] : '', 'collapse_image' => isset($row_board['can_collapse']) ? '+' : '', - 'href' => $scripturl . '#c' . $row_board['id_cat'], + 'href' => $scripturl . '?action=forum#c' . $row_board['id_cat'], 'boards' => array(), 'new' => false ); diff --git a/Sources/Subs-Boards.php b/Sources/Subs-Boards.php index 5500dc1..c069d05 100644 --- a/Sources/Subs-Boards.php +++ b/Sources/Subs-Boards.php @@ -220,7 +220,7 @@ function MarkRead() if (isset($_SESSION['topicseen_cache'])) $_SESSION['topicseen_cache'] = array(); - redirectexit(); + redirectexit('action=forum'); } elseif (isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'unreadreplies') { diff --git a/Sources/Subs-Portal.php b/Sources/Subs-Portal.php new file mode 100644 index 0000000..db4b189 --- /dev/null +++ b/Sources/Subs-Portal.php @@ -0,0 +1,1441 @@ + $get_value) + $get_string .= $get_var . (!empty($get_value) ? '=' . $get_value : '') . ';'; + redirectexit(substr($get_string, 0, -1)); + } + return; + } + + if (!$standalone) + { + require_once($sourcedir . '/PortalBlocks.php'); + + if (SMF != 'SSI') + require_once($boarddir . '/SSI.php'); + + loadTemplate('Portal'); + loadLanguage('SPortal', sp_languageSelect('SPortal')); + + if (!empty($modSettings['sp_maintenance']) && !allowedTo('sp_admin')) + $modSettings['sp_portal_mode'] = 0; + + if (empty($modSettings['sp_standalone_url'])) + $modSettings['sp_standalone_url'] = ''; + + if ($modSettings['sp_portal_mode'] == 3) + $context += array( + 'portal_url' => $modSettings['sp_standalone_url'], + 'page_title' => $context['forum_name'], + ); + else + $context += array( + 'portal_url' => $scripturl, + ); + + if ($modSettings['sp_portal_mode'] == 1) + $context['linktree'][0] = array( + 'url' => $scripturl . '?action=forum', + 'name' => $context['forum_name'], + ); + + // If you want to remove Forum link when it is + // alone, take out the following two comment lines. + //if (empty($context['linktree'][1])) + // $context['linktree'] = array(); + + if (!empty($context['linktree']) && $modSettings['sp_portal_mode'] == 1) + foreach ($context['linktree'] as $key => $tree) + if (strpos($tree['url'], '#c') !== false && strpos($tree['url'], 'action=forum#c') === false) + $context['linktree'][$key]['url'] = str_replace('#c', '?action=forum#c', $tree['url']); + } + + $context['standalone'] = $standalone; + + // Load the headers if necessary. + sportal_init_headers(); + + $context['SPortal']['sides'] = array( + 5 => array( + 'id' => '5', + 'name' => 'header', + 'active' => true, + ), + 1 => array( + 'id' => '1', + 'name' => 'left', + 'active' => !empty($modSettings['showleft']), + ), + 2 => array( + 'id' => '2', + 'name' => 'top', + 'active' => true, + ), + 3 => array( + 'id' => '3', + 'name' => 'bottom', + 'active' => true, + ), + 4 => array( + 'id' => '4', + 'name' => 'right', + 'active' => !empty($modSettings['showright']), + ), + 6 => array( + 'id' => '6', + 'name' => 'footer', + 'active' => true, + ), + ); + + $blocks = getBlockInfo(null, null, true, true, true); + $context['SPortal']['blocks'] = array(); + foreach ($blocks as $block) + { + if (!$context['SPortal']['sides'][$block['column']]['active']) + continue; + + $block['style'] = sportal_parse_style('explode', $block['style'], true); + + $context['SPortal']['sides'][$block['column']]['last'] = $block['id']; + $context['SPortal']['blocks'][$block['column']][] = $block; + } + + foreach($context['SPortal']['sides'] as $side) + { + if (empty($context['SPortal']['blocks'][$side['id']])) + $context['SPortal']['sides'][$side['id']]['active'] = false; + + $context['SPortal']['sides'][$side['id']]['collapsed'] = $context['user']['is_guest'] ? !empty($_COOKIE['sp_' . $side['name']]) : !empty($options['sp_' . $side['name']]); + } + + if (!empty($context['template_layers']) && !in_array('portal', $context['template_layers'])) + $context['template_layers'][] = 'portal'; +} + +// Deals with the initialization of SimplePortal headers. +function sportal_init_headers() +{ + global $context, $settings, $modSettings; + static $initialized; + + if (!empty($initialized)) + return; + + $context['html_headers'] .= ' + + '; + + $initialized = true; +} + +function sportal_catch_action() +{ + global $sourcedir, $modSettings, $board, $topic, $context; + + if (isset($_GET['about:sinan'])) + return 'BookOfSinan'; + + if (empty($context['disable_sp'])) + { + if (empty($board) && empty($topic) && empty($_GET['page']) && $modSettings['sp_portal_mode'] == 1) + { + require_once($sourcedir . '/PortalMain.php'); + return 'sportal_main'; + } + elseif (empty($board) && empty($topic) && !empty($_GET['page'])) + { + require_once($sourcedir . '/PortalPages.php'); + return 'sportal_pages'; + } + } + + return false; +} + +// This function, returns all of the information about particular blocks. +function getBlockInfo($column_id = null, $block_id = null, $state = null, $show = null, $permission = null) +{ + global $smcFunc, $context, $settings, $options, $txt; + + $query = array(); + $parameters = array(); + if (!empty($column_id)) + { + $query[] = 'spb.col = {int:col}'; + $parameters['col'] = !empty($column_id) ? $column_id : 0; + } + if (!empty($block_id)) + { + $query[] = 'spb.id_block = {int:id_block}'; + $parameters['id_block'] = !empty($block_id) ? $block_id : 0; + } + if (!empty($state)) + { + $query[] = 'spb.state = {int:state}'; + $parameters['state'] = 1; + } + + $request = $smcFunc['db_query']('',' + SELECT + spb.id_block, spb.label, spb.type, spb.col, spb.row, spb.permission_set, + spb.groups_allowed, spb.groups_denied, spb.state, spb.force_view, spb.display, + spb.display_custom, spb.style, spp.variable, spp.value + FROM {db_prefix}sp_blocks AS spb + LEFT JOIN {db_prefix}sp_parameters AS spp ON (spp.id_block = spb.id_block)' . (!empty($query) ? ' + WHERE ' . implode(' AND ', $query) : '') . ' + ORDER BY spb.col, spb.row', + $parameters + ); + + $return = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($show) && !getShowInfo($row['id_block'], $row['display'], $row['display_custom'])) + continue; + + if (!empty($permission) && !sp_allowed_to('block', $row['id_block'], $row['permission_set'], $row['groups_allowed'], $row['groups_denied'])) + continue; + + if (!isset($return[$row['id_block']])) + { + $return[$row['id_block']] = array( + 'id' => $row['id_block'], + 'label' => $row['label'], + 'type' => $row['type'], + 'type_text' => !empty($txt['sp_function_' . $row['type'] . '_label']) ? $txt['sp_function_' . $row['type'] . '_label'] : $txt['sp_function_unknown_label'], + 'column' => $row['col'], + 'row' => $row['row'], + 'permission_set' => $row['permission_set'], + 'groups_allowed' => $row['groups_allowed'] !== '' ? explode(',', $row['groups_allowed']) : array(), + 'groups_denied' => $row['groups_denied'] !== '' ? explode(',', $row['groups_denied']) : array(), + 'state' => empty($row['state']) ? 0 : 1, + 'force_view' => $row['force_view'], + 'display' => $row['display'], + 'display_custom' => $row['display_custom'], + 'style' => $row['style'], + 'collapsed' => $context['user']['is_guest'] ? !empty($_COOKIE['sp_block_' . $row['id_block']]) : !empty($options['sp_block_' . $row['id_block']]), + 'parameters' => array(), + ); + } + + if (!empty($row['variable'])) + $return[$row['id_block']]['parameters'][$row['variable']] = $row['value']; + } + $smcFunc['db_free_result']($request); + + return $return; +} + +// Function to get a block's display/show information. +function getShowInfo($block_id = null, $display = null, $custom = null) +{ + global $smcFunc, $context, $modSettings; + static $variables; + + // Do we have the display info? + if ($display === null || $custom === null) + { + // Make sure that its an integer. + $block_id = (int) $block_id; + + // We need an ID. + if (empty($block_id)) + return false; + + // Get the info. + $result = $smcFunc['db_query']('',' + SELECT display, display_custom + FROM {db_prefix}sp_blocks + WHERE id_block = {int:id_block} + LIMIT 1', + array( + 'id_block' => $block_id, + ) + ); + list ($display, $custom) = $smcFunc['db_fetch_row']($result); + $smcFunc['db_free_result']($result); + } + + if (!empty($_GET['page']) && (empty($context['current_action']) || $context['current_action'] == 'portal')) + $page_info = sportal_get_pages($_GET['page'], true, true); + + // Some variables for ease. + $action = !empty($context['current_action']) ? $context['current_action'] : ''; + $sub_action = !empty($context['current_subaction']) ? $context['current_subaction'] : ''; + $board = !empty($context['current_board']) ? 'b' . $context['current_board'] : ''; + $topic = !empty($context['current_topic']) ? 't' . $context['current_topic'] : ''; + $page = !empty($page_info['id']) ? 'p' . $page_info['id'] : ''; + $portal = (empty($action) && empty($sub_action) && empty($board) && empty($topic) && SMF != 'SSI' && $modSettings['sp_portal_mode'] == 1) || !empty($context['standalone']) ? true : false; + + // Will hopefully get larger in the future. + $portal_actions = array( + 'articles' => true, + 'start' => true, + 'theme' => true, + 'PHPSESSID' => true, + 'wwwRedirect' => true, + 'www' => true, + 'variant' => true, + 'language' => true, + ); + + // Set some action exceptions. + $exceptions = array( + 'post' => array('announce', 'editpoll', 'emailuser', 'post2', 'sendtopic'), + 'register' => array('activate', 'coppa'), + 'forum' => array('collapse'), + 'admin' => array('credits', 'theme', 'viewquery', 'viewsmfile'), + 'moderate' => array('groups'), + 'login' => array('reminder'), + 'profile' => array('trackip', 'viewprofile'), + ); + + // Still, we might not be in portal! + if (!empty($_GET) && empty($context['standalone'])) + foreach ($_GET as $key => $value) + { + if (preg_match('~^news\d+$~', $key)) + continue; + + if (!isset($portal_actions[$key])) + $portal = false; + elseif (is_array($portal_actions[$key]) && !in_array($value, $portal_actions[$key])) + $portal = false; + } + + // Set the action to more known one. + foreach ($exceptions as $key => $exception) + if (in_array($action, $exception)) + $action = $key; + + // Take care of custom actions. + $special = array(); + $exclude = array(); + if (!empty($custom)) + { + // Complex display options first... + if (substr($custom, 0, 4) === '$php') + { + if (!isset($variables)) + { + $variables = array( + '{$action}' => "'$action'", + '{$sa}' => "'$sub_action'", + '{$board}' => "'$board'", + '{$topic}' => "'$topic'", + '{$page}' => "'$page'", + '{$portal}' => $portal, + ); + } + + return @eval(str_replace(array_keys($variables), array_values($variables), un_htmlspecialchars(substr($custom, 4))) . ';'); + } + + $custom = explode(',', $custom); + + // This is special... + foreach ($custom as $key => $value) + { + $name = ''; + $item = ''; + + // Is this a weird action? + if ($value[0] == '~') + { + @list($name, $item) = explode('|', substr($value, 1)); + + if (empty($item)) + $special[$name] = true; + else + $special[$name][] = $item; + } + + // Might be excluding something! + elseif ($value[0] == '-') + { + // We still may have weird things... + if ($value[1] == '~') + { + @list($name, $item) = explode('|', substr($value, 2)); + + if (empty($item)) + $exclude['special'][$name] = true; + else + $exclude['special'][$name][] = $item; + } + else + $exclude['regular'][] = substr($value, 1); + } + } + + // Add what we have to main variable. + if (!empty($display)) + $display = $display . ',' . implode(',', $custom); + else + $display = $custom; + } + + // We don't want to show it on this action/page/board? + if (!empty($exclude['regular']) && count(array_intersect(array($action, $page, $board), $exclude['regular'])) > 0) + return false; + + // Maybe we don't want to show it in somewhere special. + if (!empty($exclude['special'])) + foreach ($exclude['special'] as $key => $value) + if (isset($_GET[$key])) + if (is_array($value) && !in_array($_GET[$key], $value)) + continue; + else + return false; + + // If no display info and/or integration disabled and we are on portal; show it! + if ((empty($display) || empty($modSettings['sp_enableIntegration'])) && $portal) + return true; + // No display info and/or integration disabled and no portal; no need... + elseif (empty($display) || empty($modSettings['sp_enableIntegration'])) + return false; + // Get ready for real action if you haven't yet. + elseif (!is_array($display)) + $display = explode(',', $display); + + // Did we disable all blocks for this action? + if (!empty($modSettings['sp_' . $action . 'IntegrationHide'])) + return false; + // If we will display show the block. + elseif (in_array('all', $display)) + return true; + // If we are on portal, show portal blocks; if we are on forum, show forum blocks. + elseif (($portal && (in_array('portal', $display) || in_array('sportal', $display))) || (!$portal && in_array('sforum', $display))) + return true; + elseif (!empty($board) && (in_array('allboard', $display) || in_array($board, $display))) + return true; + elseif (!empty($action) && $action != 'portal' && (in_array('allaction', $display) || in_array($action, $display))) + return true; + elseif (!empty($page) && (in_array('allpages', $display) || in_array($page, $display))) + return true; + elseif (empty($action) && empty($board) && empty($_GET['page']) && !$portal && ($modSettings['sp_portal_mode'] == 2 || $modSettings['sp_portal_mode'] == 3) && in_array('forum', $display)) + return true; + + // For mods using weird urls... + foreach ($special as $key => $value) + if (isset($_GET[$key])) + if (is_array($value) && !in_array($_GET[$key], $value)) + continue; + else + return true; + + // Ummm, no block! + return false; +} + +function sp_allowed_to($type, $id, $set = null, $allowed = null, $denied = null) +{ + global $smcFunc, $user_info; + static $cache, $types; + + if (!isset($types)) + { + $types = array( + 'block' => array( + 'table' => 'blocks', + 'id' => 'id_block', + ), + 'page' => array( + 'table' => 'pages', + 'id' => 'id_page', + ), + 'shoutbox' => array( + 'table' => 'shoutboxes', + 'id' => 'id_shoutbox', + ), + ); + } + + if (empty($id) || empty($type) || !isset($types[$type])) + return false; + + if (!isset($set, $allowed, $denied)) + { + $request = $smcFunc['db_query']('',' + SELECT permission_set, groups_allowed, groups_denied + FROM {db_prefix}sp_{raw:table} + WHERE {raw:id} = {int:id_item} + LIMIT {int:limit}', + array( + 'table' => $types[$type]['table'], + 'id' => $types[$type]['id'], + 'id_item' => $id, + 'limit' => 1, + ) + ); + list ($set, $allowed, $denied) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + } + + $result = false; + $cache_name = md5(implode(':', array($set, $allowed, $denied))); + + if (isset($cache[$cache_name])) + $result = $cache[$cache_name]; + else + { + switch ($set) + { + case 3: + $result = true; + break; + case 2: + $result = empty($user_info['is_guest']); + break; + case 1: + $result = !empty($user_info['is_guest']); + break; + case 0: + if (!empty($denied) && count(array_intersect($user_info['groups'], explode(',', $denied))) > 0) + $result = false; + elseif (!empty($allowed) && count(array_intersect($user_info['groups'], explode(',', $allowed))) > 0) + $result = true; + break; + default: + break; + } + + $cache[$cache_name] = $result; + } + + return $result; +} + +function BookOfSinan() +{ + global $context, $scripturl; + + echo ' + + + The Book of Sinan, ', @$_GET['verse'] == '3:17' ? '3:17' : '1:15', ' + + + + +
'; + if (@$_GET['verse'] == '3:17') + echo ' + ...And suddenly the dream was over. Whether this was an end or a new start, however, was a mystery to all... +
'; + else + echo ' + ...It all started with a noob. He united simplicity with power, and achieved the ultimate power of simplicity.
This power lead him to the domination of World of Blocks... + '; + echo ' +
'; + if (@$_GET['verse'] == '3:17') + echo ' + from The Book of Sinan, 3:17'; + else + echo ' + from The Book of Sinan, 1:15'; + echo ' +
+ +'; + + obExit(false); +} + +function sp_query_string($tourniquet) +{ + global $sportal_version, $context, $modSettings; + + $fix = str_replace('{version}', $sportal_version, 'SimplePortal {version} © 2008-2012, SimplePortal'); + + if ((SMF == 'SSI' && empty($context['standalone'])) || empty($context['template_layers']) || WIRELESS || empty($modSettings['sp_portal_mode']) || strpos($tourniquet, $fix) !== false) + return $tourniquet; + + $finds = array( + ', Simple Machines LLC', + ', Simple Machines', + 'class="copywrite"', + 'class="copyright"', + ); + $replaces = array( + ', Simple Machines LLC
' . $fix, + ', Simple Machines
' . $fix, + 'class="copywrite" style="line-height: 1em;"', + 'class="copyright" style="line-height: 1.5em;"', + ); + + $tourniquet = str_replace($finds, $replaces, $tourniquet); + + if (strpos($tourniquet, $fix) === false) + { + $fix = '
' . $fix . '
'; + $tourniquet = preg_replace('~\s*~', $fix, $tourniquet); + } + + return $tourniquet; +} + +/* +This is a simple function that return nothing if the language file exist and english if it not exists +This will help to make it possible to load each time the english language! +*/ +function sp_languageSelect($template_name) +{ + global $user_info, $language, $settings, $context; + global $sourcedir; + static $already_loaded = array(); + + if(isset($already_loaded[$template_name])) + return $already_loaded[$template_name]; + + $lang = isset($user_info['language']) ? $user_info['language'] : $language; + + // Make sure we have $settings - if not we're in trouble and need to find it! + if (empty($settings['default_theme_dir'])) + { + require_once($sourcedir . '/ScheduledTasks.php'); + loadEssentialThemeData(); + } + + // For each file open it up and write it out! + $allTemplatesExists = array(); + foreach (explode('+', $template_name) as $template) + { + // Obviously, the current theme is most important to check. + $attempts = array( + array($settings['theme_dir'], $template, $lang, $settings['theme_url']), + array($settings['theme_dir'], $template, $language, $settings['theme_url']), + ); + + // Do we have a base theme to worry about? + if (isset($settings['base_theme_dir'])) + { + $attempts[] = array($settings['base_theme_dir'], $template, $lang, $settings['base_theme_url']); + $attempts[] = array($settings['base_theme_dir'], $template, $language, $settings['base_theme_url']); + } + + // Fallback on the default theme if necessary. + $attempts[] = array($settings['default_theme_dir'], $template, $lang, $settings['default_theme_url']); + $attempts[] = array($settings['default_theme_dir'], $template, $language, $settings['default_theme_url']); + + // Try to find the language file. + $allTemplatesExists[$template] = false; + $already_loaded[$template] = 'english'; + foreach ($attempts as $k => $file) { + if (file_exists($file[0] . '/languages/' . $file[1] . '.' . $file[2] . '.php')) + { + $already_loaded[$template] = ''; + $allTemplatesExists[$template] = true; + break; + } + } + } + //So all need to be true that it work ;) + foreach($allTemplatesExists as $exist) + if(!$exist) + { + $already_loaded[$template_name] = 'english'; + return 'english'; + } + + //Everthing is fine, let's go back :D + $already_loaded[$template_name] = ''; + return ''; +} + +function sp_loadCalendarData($type, $low_date, $high_date = false) +{ + global $sourcedir; + static $loaded; + + if(!isset($loaded)) + { + require_once($sourcedir . '/Subs-Calendar.php'); + + $loaded = array( + 'getEvents' => 'getEventRange', + 'getBirthdays' => 'getBirthdayRange', + 'getHolidays' => 'getHolidayRange', + ); + } + + if (!empty($loaded[$type])) + return $loaded[$type]($low_date, ($high_date === false ? $low_date : $high_date)); + else + return array(); +} + +// This is a small script to load colors for SPortal. +function sp_loadColors($users = array()) +{ + global $color_profile, $smcFunc, $scripturl, $modSettings; + + // This is for later, if you like to disable colors ;) + if (!empty($modSettings['sp_disableColor'])) + return false; + + // Can't just look for no users. :P + if (empty($users)) + return false; + + // MemberColorLink compatible, cache more data, handle also some special member color link colors + if (!empty($modSettings['MemberColorLinkInstalled'])) + { + $colorData = load_onlineColors($users); + + // This happen only on not existing Members... but given ids... + if(empty($colorData)) + return false; + + $loaded_ids = array_keys($colorData); + + foreach($loaded_ids as $id) + { + if (!empty($id) && !isset($color_profile[$id]['link'])) + { + $color_profile[$id]['link'] = $colorData[$id]['colored_link']; + $color_profile[$id]['colored_name'] = $colorData[$id]['colored_name']; + } + } + return empty($loaded_ids) ? false : $loaded_ids; + } + + // Make sure it's an array. + $users = !is_array($users) ? array($users) : array_unique($users); + + //Check up the array :) + foreach($users as $k => $u) + { + $u = (int) $u; + + if (empty($u)) + unset($users[$k]); + else + $users[$k] = $u; + } + + $loaded_ids = array(); + // Is this a totally new variable? + if (empty($color_profile)) + $color_profile = array(); + // Otherwise, we will need to do some reformating of the old data. + else + { + foreach ($users as $k => $u) + if (isset($color_profile[$u])) + { + $loaded_ids[] = $u; + unset($users[$k]); + } + } + + // Make sure that we have some users. + if (empty($users)) + return empty($loaded_ids) ? false : $loaded_ids; + + // Correct array pointer for the user + reset($users); + // Load the data. + $request = $smcFunc['db_query']('',' + SELECT + mem.id_member, mem.member_name, mem.real_name, mem.id_group, + mg.online_color AS member_group_color, pg.online_color AS post_group_color + FROM {db_prefix}members AS mem + LEFT JOIN {db_prefix}membergroups AS pg ON (pg.id_group = mem.id_post_group) + LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = mem.id_group) + WHERE mem.id_member '.((count($users) == 1) ? '= {int:current}' : 'IN ({array_int:users})'), + array( + 'users' => $users, + 'current' => (int) current($users), + ) + ); + + // Go through each of the users. + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $loaded_ids[] = $row['id_member']; + $color_profile[$row['id_member']] = $row; + $onlineColor = !empty($row['member_group_color']) ? $row['member_group_color'] : $row['post_group_color']; + $color_profile[$row['id_member']]['color'] = $onlineColor; + $color_profile[$row['id_member']]['link'] = '' . $row['real_name'] . ''; + $color_profile[$row['id_member']]['colored_name'] = (!empty($onlineColor) ? '' : '' ) . $row['real_name'] . (!empty($onlineColor) ? '' : ''); + } + $smcFunc['db_free_result']($request); + + // Return the necessary data. + return empty($loaded_ids) ? false : $loaded_ids; +} + +function sp_embed_image($name, $alt = '', $width = null, $height = null, $title = true, $id = null) +{ + global $modSettings, $settings, $txt; + static $default_alt, $randomizer, $randomizer2; + + if (!isset($default_alt)) + { + $default_alt = array( + 'dot' => $txt['sp-dot'], + 'stars' => $txt['sp-star'], + 'arrow' => $txt['sp-arrow'], + 'modify' => $txt['modify'], + 'delete' => $txt['delete'], + 'delete_small' => $txt['delete'], + 'history' => $txt['sp_shoutbox_history'], + 'refresh' => $txt['sp_shoutbox_refresh'], + 'smiley' => $txt['sp_shoutbox_smiley'], + 'style' => $txt['sp_shoutbox_style'], + 'bin' => $txt['sp_shoutbox_prune'], + 'move' => $txt['sp_move'], + ); + } + + if (!isset($randomizer) || $randomizer > 7) + $randomizer = 0; + $randomizer++; + + if (empty($alt) && isset($default_alt[$name])) + $alt = $default_alt[$name]; + + if ($title === true) + $title = !empty($alt) ? $alt : ''; + + if (empty($alt)) + $alt = $name; + + if (in_array($name, array('dot', 'star')) && empty($modSettings['sp_disable_random_bullets'])) + $name .= $randomizer; + + $image = '' . $alt . ''; + + return $image; +} + +function sportal_parse_style($action, $setting = '', $process = false) +{ + global $smcFunc; + static $process_cache; + + if ($action == 'implode') + { + $style = ''; + $style_parameters = array( + 'title_default_class', + 'title_custom_class', + 'title_custom_style', + 'body_default_class', + 'body_custom_class', + 'body_custom_style', + 'no_title', + 'no_body', + ); + + foreach ($style_parameters as $parameter) + if (isset($_POST[$parameter])) + $style .= $parameter . '~' . $smcFunc['htmlspecialchars']($smcFunc['htmltrim']($_POST[$parameter]), ENT_QUOTES) . '|'; + else + $style .= $parameter . '~|'; + + if (!empty($style)) + $style = substr($style, 0, -1); + } + elseif ($action == 'explode') + { + if (!empty($setting)) + { + $temp = explode('|', $setting); + $style = array(); + + foreach ($temp as $item) + { + list ($key, $value) = explode('~', $item); + $style[$key] = $value; + } + } + else + { + $style = array( + 'title_default_class' => 'catbg', + 'title_custom_class' => '', + 'title_custom_style' => '', + 'body_default_class' => 'windowbg', + 'body_custom_class' => '', + 'body_custom_style' => '', + 'no_title' => false, + 'no_body' => false, + ); + } + + if ($process && !isset($process_cache[$setting])) + { + if (empty($style['no_title'])) + { + $style['title']['class'] = $style['title_default_class']; + + if (!empty($style['title_custom_class'])) + $style['title']['class'] .= ' ' . $style['title_custom_class']; + + $style['title']['style'] = $style['title_custom_style']; + } + + if (empty($style['no_body'])) + $style['body']['class'] = $style['body_default_class']; + else + $style['body']['class'] = ''; + + if (!empty($style['body_custom_class'])) + $style['body']['class'] .= ' ' . $style['body_custom_class']; + + $style['body']['style'] = $style['body_custom_style']; + + $process_cache[$setting] = $style; + } + elseif ($process) + $style = $process_cache[$setting]; + } + + return $style; +} + +function sportal_get_pages($page_id = null, $active = false, $allowed = false) +{ + global $smcFunc; + + $query = array(); + $parameters = array(); + + if (!empty($page_id) && is_numeric($page_id)) + { + $query[] = 'id_page = {int:page_id}'; + $parameters['page_id'] = (int) $page_id; + } + elseif (!empty($page_id)) + { + $query[] = 'namespace = {string:namespace}'; + $parameters['namespace'] = $page_id; + } + if (!empty($active)) + { + $query[] = 'status = {int:status}'; + $parameters['status'] = 1; + } + + $request = $smcFunc['db_query']('',' + SELECT + id_page, namespace, title, body, type, permission_set, + groups_allowed, groups_denied, views, style, status + FROM {db_prefix}sp_pages' . (!empty($query) ? ' + WHERE ' . implode(' AND ', $query) : '') . ' + ORDER BY title', + $parameters + ); + $return = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($allowed) && !sp_allowed_to('page', $row['id_page'], $row['permission_set'], $row['groups_allowed'], $row['groups_denied'])) + continue; + + $return[$row['id_page']] = array( + 'id' => $row['id_page'], + 'page_id' => $row['namespace'], + 'title' => $row['title'], + 'body' => $row['body'], + 'type' => $row['type'], + 'permission_set' => $row['permission_set'], + 'groups_allowed' => $row['groups_allowed'] !== '' ? explode(',', $row['groups_allowed']) : array(), + 'groups_denied' => $row['groups_denied'] !== '' ? explode(',', $row['groups_denied']) : array(), + 'views' => $row['views'], + 'style' => $row['style'], + 'status' => $row['status'], + ); + } + $smcFunc['db_free_result']($request); + + return !empty($page_id) ? current($return) : $return; +} + +function sportal_parse_page($body, $type) +{ + if (strtolower($body) === 'el psy congroo') + echo 'Steins;Gate'; + elseif ($type == 'bbc') + echo parse_bbc($body); + elseif ($type == 'html') + echo un_htmlspecialchars($body); + elseif ($type == 'php') + { + $body = trim(un_htmlspecialchars($body)); + $body = trim($body, ''); + eval($body); + } +} + +function sportal_get_shoutbox($shoutbox_id = null, $active = false, $allowed = false) +{ + global $smcFunc; + + $query = array(); + $parameters = array(); + + if ($shoutbox_id !== null) + { + $query[] = 'id_shoutbox = {int:shoutbox_id}'; + $parameters['shoutbox_id'] = $shoutbox_id; + } + if (!empty($active)) + { + $query[] = 'status = {int:status}'; + $parameters['status'] = 1; + } + + $request = $smcFunc['db_query']('',' + SELECT + id_shoutbox, name, permission_set, groups_allowed, groups_denied, + moderator_groups, warning, allowed_bbc, height, num_show, num_max, + refresh, reverse, caching, status, num_shouts, last_update + FROM {db_prefix}sp_shoutboxes' . (!empty($query) ? ' + WHERE ' . implode(' AND ', $query) : '') . ' + ORDER BY name', + $parameters + ); + $return = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (!empty($allowed) && !sp_allowed_to('shoutbox', $row['id_shoutbox'], $row['permission_set'], $row['groups_allowed'], $row['groups_denied'])) + continue; + + $return[$row['id_shoutbox']] = array( + 'id' => $row['id_shoutbox'], + 'name' => $row['name'], + 'permission_set' => $row['permission_set'], + 'groups_allowed' => $row['groups_allowed'] !== '' ? explode(',', $row['groups_allowed']) : array(), + 'groups_denied' => $row['groups_denied'] !== '' ? explode(',', $row['groups_denied']) : array(), + 'moderator_groups' => $row['moderator_groups'] !== '' ? explode(',', $row['moderator_groups']) : array(), + 'warning' => $row['warning'], + 'allowed_bbc' => explode(',', $row['allowed_bbc']), + 'height' => $row['height'], + 'num_show' => $row['num_show'], + 'num_max' => $row['num_max'], + 'refresh' => $row['refresh'], + 'reverse' => $row['reverse'], + 'caching' => $row['caching'], + 'status' => $row['status'], + 'num_shouts' => $row['num_shouts'], + 'last_update' => $row['last_update'], + ); + } + $smcFunc['db_free_result']($request); + + return !empty($shoutbox_id) ? current($return) : $return; +} + +function sportal_get_shouts($shoutbox, $parameters) +{ + global $smcFunc, $scripturl, $context, $user_info, $modSettings, $options, $txt; + + $shoutbox = !empty($shoutbox) ? (int) $shoutbox : 0; + $start = !empty($parameters['start']) ? (int) $parameters['start'] : 0; + $limit = !empty($parameters['limit']) ? (int) $parameters['limit'] : 20; + $bbc = !empty($parameters['bbc']) ? $parameters['bbc'] : array(); + $reverse = !empty($parameters['reverse']); + $cache = !empty($parameters['cache']); + $can_delete = !empty($parameters['can_moderate']); + + if (!empty($start) || !$cache || ($shouts = cache_get_data('shoutbox_shouts-' . $shoutbox, 240)) === null) + { + $request = $smcFunc['db_query']('', ' + SELECT + sh.id_shout, sh.body, IFNULL(mem.id_member, 0) AS id_member, + IFNULL(mem.real_name, sh.member_name) AS member_name, sh.log_time, + mg.online_color AS member_group_color, pg.online_color AS post_group_color + FROM {db_prefix}sp_shouts AS sh + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = sh.id_member) + LEFT JOIN {db_prefix}membergroups AS pg ON (pg.id_group = mem.id_post_group) + LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = mem.id_group) + WHERE sh.id_shoutbox = {int:id_shoutbox} + ORDER BY sh.id_shout DESC + LIMIT {int:start}, {int:limit}', + array( + 'id_shoutbox' => $shoutbox, + 'start' => $start, + 'limit' => $limit, + ) + ); + $shouts = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + // Disable the aeva mod for the shoutbox. + $context['aeva_disable'] = true; + $online_color = !empty($row['member_group_color']) ? $row['member_group_color'] : $row['post_group_color']; + $shouts[$row['id_shout']] = array( + 'id' => $row['id_shout'], + 'author' => array( + 'id' => $row['id_member'], + 'name' => $row['member_name'], + 'link' => $row['id_member'] ? ('' . $row['member_name'] . '') : $row['member_name'], + 'color' => $online_color, + ), + 'time' => $row['log_time'], + 'text' => parse_bbc($row['body'], true, '', $bbc), + ); + } + $smcFunc['db_free_result']($request); + + if (empty($start) && $cache) + cache_put_data('shoutbox_shouts-' . $shoutbox, $shouts, 240); + } + + foreach ($shouts as $shout) + { + if (preg_match('~^@(.+?): ~' . ($context['utf8'] ? 'u' : ''), $shout['text'], $target) && $smcFunc['strtolower']($target[1]) !== $smcFunc['strtolower']($user_info['name']) && $shout['author']['id'] != $user_info['id'] && !$user_info['is_admin']) + { + unset($shouts[$shout['id']]); + continue; + } + + $shouts[$shout['id']] += array( + 'is_me' => preg_match('~^\* ' . preg_quote($shout['author']['name'], '~') . '.+$~', $shout['text']) != 0, + 'delete_link' => $can_delete ? '' . sp_embed_image('delete_small') . ' ' : '', + 'delete_link_js' => $can_delete ? '' . sp_embed_image('delete_small') . ' ' : '', + ); + + $shouts[$shout['id']]['text'] = str_replace(':jade:', 'Jade!', $shouts[$shout['id']]['text']); + $shouts[$shout['id']]['time'] = timeformat($shouts[$shout['id']]['time']); + $shouts[$shout['id']]['text'] = preg_replace('~()~', '$1span$2', $shouts[$shout['id']]['text']); + $shouts[$shout['id']]['text'] = preg_replace('~]+>)([^<]+)~', '', $shouts[$shout['id']]['text']); + $shouts[$shout['id']]['text'] = censorText($shouts[$shout['id']]['text']); + + if (!empty($modSettings['enable_buddylist']) && !empty($options['posts_apply_ignore_list']) && in_array($shout['author']['id'], $context['user']['ignoreusers'])) + $shouts[$shout['id']]['text'] = '[' . $txt['sp_shoutbox_show_ignored'] . ']'; + } + + if ($reverse) + $shouts = array_reverse($shouts); + + return $shouts; +} + +function sportal_create_shout($shoutbox, $shout) +{ + global $smcFunc, $user_info; + + if ($user_info['is_guest']) + return false; + + if (empty($shoutbox)) + return false; + + if (trim(strip_tags(parse_bbc($shout, false), '')) === '') + return false; + + $smcFunc['db_insert']('', + '{db_prefix}sp_shouts', + array( + 'id_shoutbox' => 'int', + 'id_member' => 'int', + 'member_name' => 'string', + 'log_time' => 'int', + 'body' => 'string', + ), + array( + $shoutbox['id'], + $user_info['id'], + $user_info['name'], + time(), + $shout, + ), + array('id_shout') + ); + + $shoutbox['num_shouts']++; + if ($shoutbox['num_shouts'] > $shoutbox['num_max']) + { + $request = $smcFunc['db_query']('',' + SELECT id_shout + FROM {db_prefix}sp_shouts + WHERE id_shoutbox = {int:shoutbox} + ORDER BY log_time + LIMIT {int:limit}', + array( + 'shoutbox' => $shoutbox['id'], + 'limit' => $shoutbox['num_shouts'] - $shoutbox['num_max'], + ) + ); + $old_shouts = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $old_shouts[] = $row['id_shout']; + $smcFunc['db_free_result']($request); + + sportal_delete_shout($shoutbox['id'], $old_shouts, true); + } + else + sportal_update_shoutbox($shoutbox['id'], true); +} + +function sportal_delete_shout($shoutbox_id, $shouts, $prune = false) +{ + global $smcFunc; + + if (!is_array($shouts)) + $shouts = array($shouts); + + $smcFunc['db_query']('', ' + DELETE FROM {db_prefix}sp_shouts + WHERE id_shout IN ({array_int:shouts})', + array( + 'shouts' => $shouts, + ) + ); + + sportal_update_shoutbox($shoutbox_id, $prune ? count($shouts) - 1 : count($shouts)); +} + +function sportal_update_shoutbox($shoutbox_id, $num_shouts = 0) +{ + global $smcFunc; + + $smcFunc['db_query']('', ' + UPDATE {db_prefix}sp_shoutboxes + SET last_update = {int:time}' . ($num_shouts === 0 ? '' : ', + num_shouts = {raw:shouts}') . ' + WHERE id_shoutbox = {int:shoutbox}', + array( + 'shoutbox' => $shoutbox_id, + 'time' => time(), + 'shouts' => $num_shouts === true ? 'num_shouts + 1' : 'num_shouts - ' . $num_shouts, + ) + ); + + cache_put_data('shoutbox_shouts-' . $shoutbox_id, null, 240); +} + +function sp_prevent_flood($type, $fatal = true) +{ + global $smcFunc, $modSettings, $user_info, $txt; + + $limits = array( + 'spsbp' => 2, + ); + + if (!allowedTo('admin_forum')) + $time_limit = isset($limits[$type]) ? $limits[$type] : $modSettings['spamWaitTime']; + else + $time_limit = 2; + + $smcFunc['db_query']('', ' + DELETE FROM {db_prefix}log_floodcontrol + WHERE log_time < {int:log_time} + AND log_type = {string:log_type}', + array( + 'log_time' => time() - $time_limit, + 'log_type' => $type, + ) + ); + + $smcFunc['db_insert']('replace', + '{db_prefix}log_floodcontrol', + array('ip' => 'string-16', 'log_time' => 'int', 'log_type' => 'string'), + array($user_info['ip'], time(), $type), + array('ip', 'log_type') + ); + + if ($smcFunc['db_affected_rows']() != 1) + { + if ($fatal) + fatal_lang_error('error_sp_flood_' . $type, false, array($time_limit)); + else + return isset($txt['error_sp_flood_' . $type]) ? sprintf($txt['error_sp_flood_' . $type], $time_limit) : true; + } + + return false; +} + +?> \ No newline at end of file diff --git a/Sources/Subs-PortalAdmin.php b/Sources/Subs-PortalAdmin.php new file mode 100644 index 0000000..3c6695c --- /dev/null +++ b/Sources/Subs-PortalAdmin.php @@ -0,0 +1,548 @@ + 'left', 2 => 'top', 3 => 'bottom', 4 => 'right'); + $list = !empty($_GET['redirect']) && isset($sides[$_GET['redirect']]) ? $sides[$_GET['redirect']] : 'list'; + + redirectexit('action=admin;area=portalblocks;sa=' . $list); + } + elseif($_REQUEST['type'] == 'category') + redirectexit('action=admin;area=portalarticles;sa=categories'); + elseif($_REQUEST['type'] == 'article') + redirectexit('action=admin;area=portalarticles;sa=articles'); + else + redirectexit('action=admin;area=portalconfig'); +} + +function getFunctionInfo($function = null) +{ + global $smcFunc; + + $request = $smcFunc['db_query']('',' + SELECT id_function, name + FROM {db_prefix}sp_functions' . (!empty($function) ? ' + WHERE name = {string:function}' : '') . ' + ORDER BY function_order', + array( + 'function' => $function, + ) + ); + $return = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if ($row['name'] == 'sp_php' && !allowedTo('admin_forum')) + continue; + + $return[] = array( + 'id' => $row['id_function'], + 'function' => $row['name'], + ); + } + $smcFunc['db_free_result']($request); + + return $return; +} + +function getArticleInfo($article_id = null, $category_id = null, $message_id = null, $approved = null) +{ + global $smcFunc; + + $query = array(); + if (!empty($article_id)) + $query[] = "id_article = {int:article_id}"; + if (!empty($category_id)) + $query[] = "id_category = {int:category_id}"; + if (!empty($message_id)) + $query[] = "id_message = {int:message_id}"; + if (!empty($approved)) + $query[] = "approved = '{int:approved}'"; + + $request = $smcFunc['db_query']('',' + SELECT a.id_article, a.id_category, a.id_message, a.approved, c.name + FROM {db_prefix}sp_articles as a + LEFT JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category)' . (!empty($query) ? ' + WHERE ' . implode(' AND ', $query) : '') .' + ORDER BY id_article', + array( + 'article_id' => $article_id, + 'category_id' => $category_id, + 'message_id' => $message_id, + 'approved' => 1, + ) + ); + $return = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $return[] = array( + 'article' => array( + 'id' => $row['id_article'], + 'approved' => $row['approved'], + ), + 'category' => array( + 'id' => $row['id_category'], + 'name' => $row['name'], + ), + 'message' => array( + 'id' => $row['id_message'], + ), + ); + } + $smcFunc['db_free_result']($request); + + return $return; +} + +function createArticle($articleOptions) +{ + global $smcFunc; + + $articleOptions['id_category'] = !empty($articleOptions['id_category']) ? (int) $articleOptions['id_category'] : 0; + $articleOptions['id_message'] = !empty($articleOptions['id_message']) ? (int) $articleOptions['id_message'] : 0; + $articleOptions['approved'] = !empty($articleOptions['approved']) ? (int) $articleOptions['approved'] : 0; + + $request = $smcFunc['db_query']('',' + SELECT id_message + FROM {db_prefix}sp_articles + WHERE id_message = {int:id_message}', + array( + 'id_message' => $articleOptions['id_message'], + ) + ); + list ($exists) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + if (empty($articleOptions['id_category']) || empty($articleOptions['id_message']) || $exists) + return false; + + $smcFunc['db_insert']('normal', '{db_prefix}sp_articles', + array('id_category' => 'int', 'id_message' => 'int', 'approved' => 'int'), + array($articleOptions['id_category'], $articleOptions['id_message'], $articleOptions['approved']), + array('id_article') + ); + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_categories + SET articles = articles + 1 + WHERE id_category = {int:id_category}', + array( + 'id_category' => $articleOptions['id_category'], + ) + ); +} + +function getCategoryInfo($category_id = null, $publish = false) +{ + global $scripturl, $context, $smcFunc, $settings, $txt; + + $query = array(); + $parameters = array(); + if (!empty($category_id)) + { + $query[] = 'id_category = {int:category_id}'; + $parameters['category_id'] = $category_id; + } + if (!empty($publish)) + { + $query[] = 'publish = {int:publish}'; + $parameters['publish'] = 1; + } + + $request = $smcFunc['db_query']('',' + SELECT id_category, name, picture, articles, publish + FROM {db_prefix}sp_categories' . (!empty($query) ? ' + WHERE ' . implode(' AND ', $query) : '') . ' + ORDER BY id_category', + $parameters + ); + $return = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $return[] = array( + 'id' => $row['id_category'], + 'name' => $row['name'], + 'picture' => array ( + 'href' => $row['picture'], + 'image' => '' . $row['name'] . '', + ), + 'articles' => $row['articles'], + 'publish' => $row['publish'], + ); + } + $smcFunc['db_free_result']($request); + + return $return; +} + +function fixCategoryArticles() +{ + global $smcFunc; + + $categoryList = getCategoryInfo(); + $categoryIds = array(); + + foreach ($categoryList as $category) + $categoryIds[] = $category['id']; + + foreach ($categoryIds as $category) + { + $article_count = 0; + + $request = $smcFunc['db_query']('',' + SELECT COUNT(*) + FROM {db_prefix}sp_articles + WHERE id_category = {int:id_category}', + array( + 'id_category' => $category, + ) + ); + list ($article_count) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_categories + SET articles = {int:article_count} + WHERE id_category = {int:id_category}', + array( + 'article_count' => $article_count, + 'id_category' => $category, + ) + ); + } +} + +function fixColumnRows($column_id = null) +{ + global $smcFunc; + + $blockList = getBlockInfo($column_id); + $blockIds = array(); + + foreach($blockList as $block) + $blockIds[] = $block['id']; + + $counter = 0; + + foreach ($blockIds as $block) + { + $counter = $counter + 1; + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_blocks + SET row = {int:counter} + WHERE id_block = {int:block}', + array( + 'counter' => $counter, + 'block' => $block, + ) + ); + } +} + +function changeState($type = null, $id = null) +{ + global $smcFunc; + + if ($type == 'block') + $query = array( + 'column' => 'state', + 'table' => 'blocks', + 'query_id' => 'id_block', + 'id' => $id + ); + elseif ($type == 'category') + $query = array( + 'column' => 'publish', + 'table' => 'categories', + 'query_id' => 'id_category', + 'id' => $id + ); + elseif ($type == 'article') + $query = array( + 'column' => 'approved', + 'table' => 'articles', + 'query_id' => 'id_article', + 'id' => $id + ); + else + return false; + + $request = $smcFunc['db_query']('',' + SELECT {raw:column} + FROM {db_prefix}sp_{raw:table} + WHERE {raw:query_id} = {int:id}', + $query + ); + + list ($state) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $state = (int) $state; + $state = $state == 1 ? 0 : 1 ; + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_{raw:table} + SET {raw:column} = {int:state} + WHERE {raw:query_id} = {int:id}', + array( + 'table' => $query['table'], + 'column' => $query['column'], + 'state' => $state, + 'query_id' => $query['query_id'], + 'id' => $id, + ) + ); +} + +function sp_validate_php($code) +{ + global $boardurl, $boarddir, $sourcedir, $modSettings; + + $id = time(); + $token = md5(mt_rand() . session_id() . (string) microtime() . $modSettings['rand_seed']); + $error = false; + $filename = 'sp_tmp_' . $id . '.php'; + + $code = trim($code); + if (substr($code, 0, 5) == '') + $code = substr($code, 0, -2); + + require_once($sourcedir . '/Subs-Package.php'); + + $content = ''; + + $fp = fopen($boarddir . '/' . $filename, 'w'); + fwrite($fp, $content); + fclose($fp); + + if (!file_exists($boarddir . '/' . $filename)) + return false; + + $result = fetch_web_data($boardurl . '/' . $filename . '?token=' . $token); + + if ($result === false) + $error = 'database'; + elseif (preg_match('~ (\d+)$~i', $result) != 0) + $error = 'syntax'; + + unlink($boarddir . '/' . $filename); + + return $error; +} + +/* + void sp_loadMemberGroups(Array $selectedGroups = array, Array $removeGroups = array(), string $show = 'normal', string $contextName = 'member_groups') + This will file the $context['member_groups'] to the given options + $selectedGroups means all groups who should be shown as selcted, if you like to check all than insert an 'all' + You can also Give the function a string with '2,3,4' + $removeGroups this group id should not shown in the list + $show have follow options + 'normal' => will show all groups, and add a guest and regular member (Standard) + 'post' => will load only post groups + 'master' => will load only not postbased groups + $contextName where the datas should stored in the $context. +*/ +function sp_loadMemberGroups($selectedGroups = array(), $show = 'normal', $contextName = 'member_groups', $subContext = 'SPortal') +{ + global $context, $smcFunc, $txt; + + // Some additional Language stings are needed + loadLanguage('ManageBoards'); + + // Make sure its empty + if (!empty($subContext)) + $context[$subContext][$contextName] = array(); + else + $context[$contextName] = array(); + + // Preseting some things :) + if (!is_array($selectedGroups)) + $checked = strtolower($selectedGroups) == 'all'; + else + $checked = false; + + if (!$checked && isset($selectedGroups) && $selectedGroups === '0') + $selectedGroups = array(0); + elseif (!$checked && !empty($selectedGroups)) + { + if (!is_array($selectedGroups)) + $selectedGroups = explode(',', $selectedGroups); + + // Remove all strings, i will only allowe ids :P + foreach ($selectedGroups as $k => $i) + $selectedGroups[$k] = (int) $i; + + $selectedGroups = array_unique($selectedGroups); + } + else + $selectedGroups = array(); + + // Okay let's checkup the show function + $show_option = array( + 'normal' => 'id_group != 3', + 'moderator' => 'id_group != 1 AND id_group != 3', + 'post' => 'min_posts != -1', + 'master' => 'min_posts = -1 AND id_group != 3', + ); + + $show = strtolower($show); + + if (!isset($show_option[$show])) + $show = 'normal'; + + // Guest and Members are added manually. Only on normal ond master View =) + if ($show == 'normal' || $show == 'master' || $show == 'moderator') + { + if ($show != 'moderator') + { + $context[$contextName][-1] = array( + 'id' => -1, + 'name' => $txt['membergroups_guests'], + 'checked' => $checked || in_array(-1, $selectedGroups), + 'is_post_group' => false, + ); + } + $context[$contextName][0] = array( + 'id' => 0, + 'name' => $txt['membergroups_members'], + 'checked' => $checked || in_array(0, $selectedGroups), + 'is_post_group' => false, + ); + } + + // Load membergroups. + $request = $smcFunc['db_query']('', ' + SELECT group_name, id_group, min_posts + FROM {db_prefix}membergroups + WHERE {raw:show} + ORDER BY min_posts, id_group != {int:global_moderator}, group_name', + array( + 'show' => $show_option[$show], + 'global_moderator' => 2, + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $context[$contextName][(int) $row['id_group']] = array( + 'id' => $row['id_group'], + 'name' => trim($row['group_name']), + 'checked' => $checked || in_array($row['id_group'], $selectedGroups), + 'is_post_group' => $row['min_posts'] != -1, + ); + } + $smcFunc['db_free_result']($request); +} + +function sp_load_membergroups() +{ + global $smcFunc, $txt; + + loadLanguage('ManageBoards'); + + $groups = array( + -1 => $txt['parent_guests_only'], + 0 => $txt['parent_members_only'], + ); + + $request = $smcFunc['db_query']('', ' + SELECT group_name, id_group, min_posts + FROM {db_prefix}membergroups + WHERE id_group != {int:moderator_group} + ORDER BY min_posts, group_name', + array( + 'moderator_group' => 3, + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $groups[(int) $row['id_group']] = trim($row['group_name']); + $smcFunc['db_free_result']($request); + + return $groups; +} + +?> \ No newline at end of file diff --git a/Sources/Subs.php b/Sources/Subs.php index bc68c7d..9506aff 100644 --- a/Sources/Subs.php +++ b/Sources/Subs.php @@ -969,7 +969,7 @@ function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = arra { global $txt, $scripturl, $context, $modSettings, $user_info, $smcFunc; static $bbc_codes = array(), $itemcodes = array(), $no_autolink_tags = array(); - static $disabled; + static $disabled, $default_disabled, $parse_tag_cache; // Don't waste cycles if ($message === '') @@ -993,15 +993,19 @@ function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = arra if (!isset($context['utf8'])) $context['utf8'] = (empty($modSettings['global_character_set']) ? $txt['lang_character_set'] : $modSettings['global_character_set']) === 'UTF-8'; +/* // If we are not doing every tag then we don't cache this run. if (!empty($parse_tags) && !empty($bbc_codes)) { $temp_bbc = $bbc_codes; $bbc_codes = array(); } +*/ // Sift out the bbc for a performance improvement. - if (empty($bbc_codes) || $message === false || !empty($parse_tags)) +// if (empty($bbc_codes) || $message === false || !empty($parse_tags)) + // I wish I didn't had to do this... puff... + if (empty($bbc_codes) || $message === false) { if (!empty($modSettings['disabledBBC'])) { @@ -1782,12 +1786,41 @@ function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = arra foreach ($codes as $code) { // If we are not doing every tag only do ones we are interested in. - if (empty($parse_tags) || in_array($code['tag'], $parse_tags)) + // if (empty($parse_tags) || in_array($code['tag'], $parse_tags)) $bbc_codes[substr($code['tag'], 0, 1)][] = $code; } $codes = null; } + if ($parse_tags !== array() && is_array($parse_tags)) + { + $temp_bbc = $bbc_codes; + $tags_cache_id = implode(',', $parse_tags); + + if (!isset($default_disabled)) + $default_disabled = isset($disabled) ? $disabled : array(); + + if (isset($parse_tag_cache[$tags_cache_id])) + list ($bbc_codes, $disabled) = $parse_tag_cache[$tags_cache_id]; + else + { + foreach ($bbc_codes as $key_bbc => $bbc) + foreach ($bbc as $key_code => $code) + if (!in_array($code['tag'], $parse_tags)) + { + $disabled[$code['tag']] = true; + unset($bbc_codes[$key_bbc][$key_code]); + } + + $parse_tag_cache = array($tags_cache_id => array($bbc_codes, $disabled)); + } + } + elseif (isset($default_disabled)) + $disabled = $default_disabled; + + if (strpos($message, '[cutoff]') !== false) + $message = str_replace('[cutoff]', '', $message); + // Shall we take the time to cache this? if ($cache_id != '' && !empty($modSettings['cache_enable']) && (($modSettings['cache_enable'] >= 2 && strlen($message) > 1000) || strlen($message) > 2400) && empty($parse_tags)) { @@ -2522,7 +2555,11 @@ function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = arra // For parsed content, we must recurse to avoid security problems. if ($tag['type'] != 'unparsed_equals') + { $data = parse_bbc($data, !empty($tag['parsed_tags_allowed']) ? false : true, '', !empty($tag['parsed_tags_allowed']) ? $tag['parsed_tags_allowed'] : array()); + // Unfortunately, this is the only way to deal with such a failure of a function... + parse_bbc('sp'); + } $tag['after'] = strtr($tag['after'], array('$1' => $data)); @@ -2855,6 +2892,20 @@ function redirectexit($setLocation = '', $refresh = false) $add = preg_match('~^(ftp|http)[s]?://~', $setLocation) == 0 && substr($setLocation, 0, 6) != 'about:'; + // Set the default redirect location as the forum or the portal. + if ((empty($setLocation) || $scripturl == $setLocation) && ($modSettings['sp_portal_mode'] == 1 || $modSettings['sp_portal_mode'] == 3)) + { + // Redirect the user to the forum. + if (!empty($modSettings['sp_disableForumRedirect'])) + $setLocation = 'action=forum'; + // Redirect the user to the SSI.php standalone portal. + elseif ($modSettings['sp_portal_mode'] == 3) + { + $setLocation = $context['portal_url']; + $add = false; + } + } + if (WIRELESS) { // Add the scripturl on if needed. @@ -2881,9 +2932,9 @@ function redirectexit($setLocation = '', $refresh = false) if (!empty($modSettings['queryless_urls']) && (empty($context['server']['is_cgi']) || @ini_get('cgi.fix_pathinfo') == 1 || @get_cfg_var('cgi.fix_pathinfo') == 1) && (!empty($context['server']['is_apache']) || !empty($context['server']['is_lighttpd']))) { if (defined('SID') && SID != '') - $setLocation = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?(?:' . SID . '(?:;|&|&))((?:board|topic)=[^#]+?)(#[^"]*?)?$~', create_function('$m', 'global $scripturl; return $scripturl . \'/\' . strtr("$m[1]", \'&;=\', \'//,\') . \'.html?\' . SID . (isset($m[2]) ? "$m[2]" : "");'), $setLocation); + $setLocation = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?(?:' . SID . '(?:;|&|&))((?:board|topic|page)=[^#]+?)(#[^"]*?)?$~', create_function('$m', 'global $scripturl; return $scripturl . \'/\' . strtr("$m[1]", \'&;=\', \'//,\') . \'.html?\' . SID . (isset($m[2]) ? "$m[2]" : "");'), $setLocation); else - $setLocation = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?((?:board|topic)=[^#"]+?)(#[^"]*?)?$~', create_function('$m', 'global $scripturl; return $scripturl . \'/\' . strtr("$m[1]", \'&;=\', \'//,\') . \'.html\' . (isset($m[2]) ? "$m[2]" : "");'), $setLocation); + $setLocation = preg_replace_callback('~"' . preg_quote($scripturl, '/') . '\?((?:board|topic|page)=[^#"]+?)(#[^"]*?)?$~', create_function('$m', 'global $scripturl; return $scripturl . \'/\' . strtr("$m[1]", \'&;=\', \'//,\') . \'.html\' . (isset($m[2]) ? "$m[2]" : "");'), $setLocation); } // Maybe integrations want to change where we are heading? @@ -4047,7 +4098,7 @@ function setupMenuContext() // Set up the menu privileges. $context['allow_search'] = allowedTo('search_posts'); - $context['allow_admin'] = allowedTo(array('admin_forum', 'manage_boards', 'manage_permissions', 'moderate_forum', 'manage_membergroups', 'manage_bans', 'send_mail', 'edit_news', 'manage_attachments', 'manage_smileys')); + $context['allow_admin'] = allowedTo(array('admin_forum', 'manage_boards', 'sp_admin', 'sp_manage_settings', 'sp_manage_blocks', 'sp_manage_articles', 'sp_manage_pages', 'sp_manage_shoutbox', 'manage_permissions', 'moderate_forum', 'manage_membergroups', 'manage_bans', 'send_mail', 'edit_news', 'manage_attachments', 'manage_smileys')); $context['allow_edit_profile'] = !$user_info['is_guest'] && allowedTo(array('profile_view_own', 'profile_view_any', 'profile_identity_own', 'profile_identity_any', 'profile_extra_own', 'profile_extra_any', 'profile_remove_own', 'profile_remove_any', 'moderate_forum', 'manage_membergroups', 'profile_title_own', 'profile_title_any')); $context['allow_memberlist'] = allowedTo('view_mlist'); $context['allow_calendar'] = allowedTo('calendar_view') && !empty($modSettings['cal_enabled']); @@ -4057,17 +4108,24 @@ function setupMenuContext() $cacheTime = $modSettings['lastActive'] * 60; // All the buttons we can possible want and then some, try pulling the final list of buttons from cache first. - if (($menu_buttons = cache_get_data('menu_buttons-' . implode('_', $user_info['groups']) . '-' . $user_info['language'], $cacheTime)) === null || time() - $cacheTime <= $modSettings['settings_updated']) + if (($menu_buttons = cache_get_data('menu_buttons-' . implode('_', $user_info['groups']) . '-' . $user_info['language'] . '-' . empty($context['disable_sp']), $cacheTime)) === null || time() - $cacheTime <= $modSettings['settings_updated']) { $buttons = array( 'home' => array( 'title' => $txt['home'], - 'href' => $scripturl, + 'href' => $modSettings['sp_portal_mode'] == 3 && empty($context['disable_sp']) ? $modSettings['sp_standalone_url'] : $scripturl, 'show' => true, 'sub_buttons' => array( ), 'is_last' => $context['right_to_left'], ), + 'forum' => array( + 'title' => empty($txt['sp-forum']) ? 'Forum' : $txt['sp-forum'], + 'href' => $scripturl . ($modSettings['sp_portal_mode'] == 1 && empty($context['disable_sp']) ? '?action=forum' : ''), + 'show' => in_array($modSettings['sp_portal_mode'], array(1, 3)) && empty($context['disable_sp']), + 'sub_buttons' => array( + ), + ), //xxx show archived boards, commented out for Tom :) /* 'show_archived' => array( @@ -4301,7 +4359,7 @@ function setupMenuContext() } if (!empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 2) - cache_put_data('menu_buttons-' . implode('_', $user_info['groups']) . '-' . $user_info['language'], $menu_buttons, $cacheTime); + cache_put_data('menu_buttons-' . implode('_', $user_info['groups']) . '-' . $user_info['language'] . '-' . empty($context['disable_sp']), $menu_buttons, $cacheTime); } $context['menu_buttons'] = $menu_buttons; @@ -4312,7 +4370,7 @@ function setupMenuContext() // Figure out which action we are doing so we can set the active tab. // Default to home. - $current_action = 'home'; + $current_action = $modSettings['sp_portal_mode'] == 3 && empty($context['standalone']) && empty($context['disable_sp']) ? 'forum' : 'home'; if (isset($context['menu_buttons'][$context['current_action']])) $current_action = $context['current_action']; @@ -4320,6 +4378,8 @@ function setupMenuContext() $current_action = 'search'; elseif ($context['current_action'] == 'theme') $current_action = isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'pick' ? 'profile' : 'admin'; + elseif(empty($context['disable_sp']) && ((isset($_GET['board']) || isset($_GET['topic']) || in_array($context['current_action'], array('unread', 'unreadreplies', 'recent', 'stats', 'who'))) && in_array($modSettings['sp_portal_mode'], array(1, 3)))) + $current_action = 'forum'; elseif ($context['current_action'] == 'register2') $current_action = 'register'; elseif ($context['current_action'] == 'login2' || ($user_info['is_guest'] && $context['current_action'] == 'reminder')) diff --git a/Sources/Who.php b/Sources/Who.php index ec48f1c..016cd0b 100644 --- a/Sources/Who.php +++ b/Sources/Who.php @@ -276,6 +276,13 @@ function determineActions($urls, $preferred_prefix = false) return array(); loadLanguage('Who'); + global $scripturl; + if ($modSettings['sp_portal_mode'] == 1) + { + $txt['who_index'] = sprintf($txt['sp_who_index'], $scripturl); + $txt['whoall_forum'] = sprintf($txt['sp_who_forum'], $scripturl); + } + // Actions that require a specific permission level. $allowedActions = array( 'admin' => array('moderate_forum', 'manage_membergroups', 'manage_bans', 'admin_forum', 'manage_permissions', 'send_mail', 'manage_attachments', 'manage_smileys', 'manage_boards', 'edit_news'), @@ -309,6 +316,7 @@ function determineActions($urls, $preferred_prefix = false) $topic_ids = array(); $profile_ids = array(); $board_ids = array(); + $page_ids = array(); $data = array(); foreach ($url_list as $k => $url) @@ -339,6 +347,11 @@ function determineActions($urls, $preferred_prefix = false) $data[$k] = $txt['who_hidden']; $board_ids[$actions['board']][$k] = $txt['who_board']; } + elseif (isset($actions['page'])) + { + $data[$k] = $txt['who_hidden']; + $page_ids[$actions['page']][$k] = $txt['sp_who_page']; + } // It's the board index!! It must be! else $data[$k] = $txt['who_index']; @@ -484,6 +497,64 @@ function determineActions($urls, $preferred_prefix = false) $smcFunc['db_free_result']($result); } + if (!empty($page_ids)) + { + $numeric_ids = array(); + $string_ids = array(); + $page_where = array(); + + foreach ($page_ids as $page_id => $dummy) + if (is_numeric($page_id)) + $numeric_ids[] = (int) $page_id; + else + $string_ids[] = $page_id; + + if (!empty($numeric_ids)) + $page_where[] = 'id_page IN ({array_int:numeric_ids})'; + + if (!empty($string_ids)) + $page_where[] = 'namespace IN ({array_string:string_ids})'; + + $result = $smcFunc['db_query']('', ' + SELECT id_page, namespace, title, permission_set, groups_allowed, groups_denied + FROM {db_prefix}sp_pages + WHERE ' . implode(' OR ', $page_where) . ' + LIMIT {int:limit}', + array( + 'numeric_ids' => $numeric_ids, + 'string_ids' => $string_ids, + 'limit' => count($page_ids), + ) + ); + $page_data = array(); + while ($row = $smcFunc['db_fetch_assoc']($result)) + { + if (!sp_allowed_to('page', $row['id_page'], $row['permission_set'], $row['groups_allowed'], $row['groups_denied'])) + continue; + + $page_data[] = array( + 'id' => $row['id_page'], + 'namespace' => $row['namespace'], + 'title' => $row['title'], + ); + } + $smcFunc['db_free_result']($result); + + if (!empty($page_data)) + { + foreach ($page_data as $page) + { + if (isset($page_ids[$page['id']])) + foreach ($page_ids[$page['id']] as $k => $session_text) + $data[$k] = sprintf($session_text, $page['id'], censorText($page['title']), $scripturl); + + if (isset($page_ids[$page['namespace']])) + foreach ($page_ids[$page['namespace']] as $k => $session_text) + $data[$k] = sprintf($session_text, $page['namespace'], censorText($page['title']), $scripturl); + } + } + } + // Load member names for the profile. if (!empty($profile_ids) && (allowedTo('profile_view_any') || allowedTo('profile_view_own'))) { diff --git a/Themes/default/Display.template.php b/Themes/default/Display.template.php index b1492c1..7b0b5be 100644 --- a/Themes/default/Display.template.php +++ b/Themes/default/Display.template.php @@ -170,6 +170,15 @@ function template_main() // Allow adding new buttons easily. call_integration_hook('integrate_display_buttons', array(&$normal_buttons)); + // Article related buttons... + if (!empty($modSettings['articleactive'])) + { + if ($context['can_add_article'] && !$context['topic_is_article']) + $normal_buttons['add_article'] = array('text' => 'sp-add_article', 'image' => 'addarticle.gif', 'lang' => true, 'url' => $scripturl . '?action=portal;sa=addarticle;message=' . $context['topic_first_message'] . ';return=' . $context['current_topic'] . '.' . $context['start'] . ';sesc=' . $context['session_id']); + if ($context['can_remove_article'] && $context['topic_is_article']) + $normal_buttons['remove_article'] = array('text' => 'sp-remove_article', 'image' => 'removearticle.gif', 'lang' => true, 'url' => $scripturl . '?action=portal;sa=removearticle;message=' . $context['topic_first_message'] . ';return=' . $context['current_topic'] . '.' . $context['start'] . ';sesc=' . $context['session_id']); + } + // Show the page index... "Pages: [1]". echo '
diff --git a/Themes/default/Portal.template.php b/Themes/default/Portal.template.php new file mode 100644 index 0000000..89dd16f --- /dev/null +++ b/Themes/default/Portal.template.php @@ -0,0 +1,246 @@ +'; + + if ($context['SPortal']['sides'][1]['active']) + echo ' + ', sp_embed_image($context['SPortal']['sides'][1]['collapsed'] ? 'expand' : 'collapse', '', null, null, true, 'sp_collapse_side1'), ''; + + if ($context['SPortal']['sides'][4]['active']) + echo ' + ', sp_embed_image($context['SPortal']['sides'][4]['collapsed'] ? 'expand' : 'collapse', '', null, null, true, 'sp_collapse_side4'), ''; + + echo ' +
'; + } + + if (!empty($context['SPortal']['blocks'][5])) + { + echo ' +
'; + + foreach ($context['SPortal']['blocks'][5] as $block) + template_block($block); + + echo ' +
'; + } + + echo ' + + '; + + if (!empty($modSettings['showleft']) && !empty($context['SPortal']['blocks'][1])) + { + echo ' + '; + } + + echo ' + '; + + if (!empty($modSettings['showright']) && !empty($context['SPortal']['blocks'][4])) + { + echo ' + '; + } + echo ' + +
'; + + if (!empty($context['SPortal']['blocks'][2])) + { + foreach ($context['SPortal']['blocks'][2] as $block) + template_block($block); + + if (empty($context['SPortal']['on_portal'])) + echo ' +
'; + } +} + +function template_portal_below() +{ + global $context, $modSettings; + + if (!empty($context['SPortal']['blocks'][3])) + { + if (empty($context['SPortal']['on_portal']) || !empty($context['SPortal']['blocks'][2]) || !empty($modSettings['articleactive'])) + echo ' +
'; + + foreach ($context['SPortal']['blocks'][3] as $block) + template_block($block); + } + + echo ' +
'; + + if (!empty($context['SPortal']['blocks'][6])) + { + echo ' + +
'; + } +} + +function template_block($block) +{ + global $context, $modSettings, $txt; + + if (empty($block) || empty($block['type'])) + return; + + if ($block['type'] == 'sp_boardNews') + { + echo ' +
'; + + $block['type']($block['parameters'], $block['id']); + + echo ' +
'; + + return; + } + + if (isset($txt['sp_custom_block_title_' . $block['id']])) + $block['label'] = $txt['sp_custom_block_title_' . $block['id']]; + + if ($context['SPortal']['core_compat']) + template_block_core($block); + else + template_block_curve($block); +} + +function template_block_core($block) +{ + global $context, $modSettings, $settings; + + echo ' +
+
+ '; + + if (empty($block['style']['no_title'])) + { + echo ' + + + '; + } + + echo ' + + +
'; + + if (empty($block['force_view'])) + echo ' + *'; + + echo ' + ', parse_bbc($block['label']), ' +
'; + + $block['type']($block['parameters'], $block['id']); + + echo ' +
+
+
'; +} + +function template_block_curve($block) +{ + global $context, $modSettings, $settings; + + if (empty($block['style']['no_title'])) + { + echo ' +
+

'; + + if (empty($block['force_view'])) + echo ' + *'; + + echo ' + ', parse_bbc($block['label']), ' +

+
'; + } + + echo ' + '; + + if (strpos($block['style']['body']['class'], 'roundframe') !== false) + { + echo ' + '; + } + + echo ' + '; +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalAdmin.template.php b/Themes/default/PortalAdmin.template.php new file mode 100644 index 0000000..3d4bb59 --- /dev/null +++ b/Themes/default/PortalAdmin.template.php @@ -0,0 +1,313 @@ + +
'; + + if (isset($context['settings_title'])) + echo ' +
+

+ ', $context['settings_title'], ' +

+
'; + + if (!empty($context['settings_message'])) + echo ' +
', $context['settings_message'], '
'; + + $is_open = false; + foreach ($context['config_vars'] as $config_var) + { + if (is_array($config_var) && ($config_var['type'] == 'title' || $config_var['type'] == 'desc')) + { + if ($is_open) + { + $is_open = false; + echo ' + + + + '; + } + + if ($config_var['type'] == 'title') + { + echo ' +
+

+ ', ($config_var['help'] ? '' . $txt['help'] . '' : ''), ' + ', $config_var['label'], ' +

+
'; + } + else + { + echo ' +

+ ', $config_var['label'], ' +

'; + } + + continue; + } + + if (!$is_open) + { + $is_open = true; + echo ' +
+ +
+
'; + } + + if (is_array($config_var)) + { + if (in_array($config_var['type'], array('message', 'warning'))) + { + echo ' + + ', $config_var['label'], ' + '; + } + else + { + echo ' + '; + + $javascript = $config_var['javascript']; + $disabled = !empty($config_var['disabled']) ? ' disabled="disabled"' : ''; + $subtext = !empty($config_var['subtext']) ? '
' . $config_var['subtext'] . '' : ''; + + if ($config_var['help']) + echo ' + ', $txt['help'], '', $subtext, ($config_var['type'] == 'password' ? '
' . $txt['admin_confirm_password'] . '' : ''), ' + '; + else + echo ' + ', $subtext, ($config_var['type'] == 'password' ? '
' . $txt['admin_confirm_password'] . '' : ''), ' + '; + + echo ' + ', + $config_var['preinput']; + + if ($config_var['type'] == 'check') + echo ' + '; + elseif ($config_var['type'] == 'select') + { + echo ' + '; + } + elseif ($config_var['type'] == 'large_text') + { + echo ' + '; + } + elseif ($config_var['type'] == 'var_message') + echo $config_var['var_message']; + elseif ($config_var['type'] == 'multicheck') + { + foreach($config_var['subsettings'] as $name => $title) + { + echo ' + + ', $title, '
'; + } + } + else + echo ' + '; + + echo ' + ', $config_var['postinput'], ' + '; + } + } + + else + { + if ($config_var == '') + echo ' +
+
+
'; + else + echo ' + ' . $config_var . ''; + } + } + + if ($is_open) + echo ' +
'; + + if (empty($context['settings_save_dont_show'])) + echo ' +

+ +

'; + + if ($is_open) + echo ' +
+ +
'; + + echo ' + +
+ +
'; +} + +function template_information() +{ + global $context, $txt; + + if ($context['in_admin']) + { + echo ' +
+
+
+

+ ', $txt['sp-info_live'], ' +

+
+
+ +
+
', $txt['sp-info_no_live'], '
+
+ +
+
+
+
+

+ ', $txt['sp-info_general'], ' +

+
+
+ +
+ ', $txt['sp-info_versions'], ':
+ ', $txt['sp-info_your_version'], ': + ', $context['sp_version'], '
+ ', $txt['sp-info_current_version'], ': + ??
+ ', $txt['sp-info_managers'], ': + ', implode(', ', $context['sp_managers']), ' +
+ +
+
+
+ + + '; + } + + echo ' +
+

+ ', $txt['sp-info_title'], ' +

+
+
+ +
'; + + foreach ($context['sp_credits'] as $section) + { + if (isset($section['pretext'])) + echo ' +

', $section['pretext'], '

'; + + foreach ($section['groups'] as $group) + { + if (empty($group['members'])) + continue; + + echo ' +

'; + + if (isset($group['title'])) + echo ' + ', $group['title'], ': '; + + echo implode(', ', $group['members']), ' +

'; + } + + + if (isset($section['posttext'])) + echo ' +

', $section['posttext'], '

'; + } + + echo ' +
+

', sprintf($txt['sp-info_contribute'], 'http://www.simpleportal.net/index.php?page=contribute'), '

+
+ +
'; +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalAdminArticles.template.php b/Themes/default/PortalAdminArticles.template.php new file mode 100644 index 0000000..689f155 --- /dev/null +++ b/Themes/default/PortalAdminArticles.template.php @@ -0,0 +1,405 @@ + +
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+ + + '; + + foreach ($context['columns'] as $column) + { + if ($column['selected']) + echo ' + '; + elseif ($column['sortable']) + echo ' + '; + else + echo ' + '; + } + + echo ' + + + + '; + + if (empty($context['total_articles'])) + { + echo ' + + + '; + } + + while ($article = $context['get_article']()) + { + echo ' + + + + + + + + + + '; + } + + echo ' + +
+ ', $column['label'], '  + + ', $column['link'], ' + + ', $column['label'], ' + + +
 
', $article['topic']['link'], '', $article['board']['link'], '', $article['poster']['link'], '', $article['message']['time'], '', $article['category']['name'], '', empty($article['article']['approved']) ? sp_embed_image('deactive', $txt['sp-stateNo']) : sp_embed_image('active', $txt['sp-stateYes']), '', $article['edit'], ' ', $article['delete'], '
+
+
+ +
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+ +
+ '; +} + +function template_article_add() +{ + global $context, $settings, $options, $txt, $scripturl; + + echo ' +
+
+
+

+ ', $txt['help'], '  + ', $txt['sp-articlesAdd'], ' +

+
+
+ +
+
+
+ ', $txt['help'], ' + +
+
+ +
+
+
+ +
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+
+ +
'; + + if (!empty($context['boards']) && count($context['boards']) > 1) + { + echo ' +
+
+ ', $txt['help'], ' + +
+
+ +
+
'; + } + + echo ' +
+ ', $txt['help'], ' + ', $txt['topics'], ':'; + + if (!empty($context['topics'])) + { + echo ' +
+
    '; + + foreach ($context['topics'] as $topic) + echo ' +
  • + + ' . $topic['subject'] . ' ' . $txt['started_by'] . ' ' . $topic['poster']['link'] . ' +
  • '; + echo ' +
+
+ +
'; + } + else + echo ' + ', $txt['sp-adminArticleAddNoTopics'], ' +
'; + + echo ' +
+ +
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+ + + '; +} + +function template_article_edit() +{ + global $context, $settings, $options, $scripturl, $txt, $modSettings; + + echo ' +
+
+
+

+ ', $txt['help'], ' + ', $txt['sp-articlesEdit'], ' +

+
+
+ +
+
+
+ ', $txt['help'], ' + +
+
+ +
+
+ ', $txt['help'], ' + +
+
+ +
+
+
+ +
+
+ +
+ + +
+
'; +} + +function template_category_list() +{ + global $context, $settings, $options, $scripturl, $txt; + + echo ' + + + '; + + foreach ($context['columns'] as $column) + { + echo ' + '; + } + + echo ' + + + '; + + if (empty($context['categories'])) + { + echo ' + + + '; + } + + foreach($context['categories'] as $category) + { + echo ' + + + + + + + '; + } + echo ' + +
+ ', $column['label'], ' +
 
', !empty($category['picture']['href']) ? $category['picture']['image'] : '', '', $category['name'], '', $category['articles'], '', empty($category['publish']) ? sp_embed_image('deactive', $txt['sp-stateNo']) : sp_embed_image('active', $txt['sp-stateYes']), '', sp_embed_image('modify'), ' ', sp_embed_image('delete'), '
'; +} + +function template_category_edit() +{ + global $context, $settings, $scripturl, $txt, $modSettings; + + echo ' +
+
+
+

+ ', $txt['help'], ' + ', $context['page_title'], ' +

+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+ + '; + + if ($context['category_action'] == 'edit') + echo ' + '; + + echo ' +
+
'; +} + +function template_category_delete() +{ + global $context, $settings, $options, $scripturl, $txt, $modSettings; + + echo ' +
+
+
+

+ ', $txt['help'], ' + ', $txt['sp-categoriesDelete'], ' +

+
+
+ +
+
+ ', sprintf($txt['sp-categoriesDeleteCount'], $context['category_info']['articles']), '
'; + + if (!empty($context['list_categories'])) + { + echo ' + ', $txt['sp-categoriesDeleteOption1'], ' +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
'; + } + else + { + echo ' + ', $txt['sp-categoriesDeleteOption2'], ' +
'; + } + + echo ' +
+ +
+
+ +
+ + + + '; +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalAdminBlocks.template.php b/Themes/default/PortalAdminBlocks.template.php new file mode 100644 index 0000000..22ef983 --- /dev/null +++ b/Themes/default/PortalAdminBlocks.template.php @@ -0,0 +1,569 @@ +'; + + if ($context['block_move']) + echo ' +
+

', $context['move_title'], ' [', $txt['sp-blocks_cancel_moving'], ']', '

+
'; + + foreach($context['sides'] as $id => $side) + { + echo ' + + + + '; + + if ($context['block_move']) + echo ' + '; + + foreach ($context['columns'] as $column) + echo ' + '; + + echo ' + + + '; + + if (empty($context['blocks'][$side['name']])) + { + echo ' + + + '; + } + + foreach($context['blocks'][$side['name']] as $block) + { + echo ' + '; + + if ($context['block_move']) + echo ' + '; + + echo ' + + + + '; + } + + if ($context['block_move'] && (empty($side['last']) || $context['block_move'] != $side['last'])) + { + echo ' + + + + + + '; + } + + echo ' + +
', $txt['sp-adminColumnMove'], '', $column['label'], '
', $txt['error_sp_no_block'], '
', $block['id'] != $context['block_move'] ? $block['move_insert'] : '', '', $block['id'] == $context['block_move'] ? '' . $block['label'] . '' : $block['label'], '', $block['type_text'], '', implode(' ', $block['actions']), '
', sp_embed_image('arrow', $txt['sp-blocks_move_here']), '
'; + } + + echo ' + '; +} + +function template_block_edit() +{ + global $context, $settings, $options, $scripturl, $txt, $helptxt, $modSettings; + + if (!empty($context['SPortal']['preview'])) + { + echo ' +
'; + + template_block($context['SPortal']['block']); + + echo ' +
'; + } + + echo ' +
+
+
+

+ ', $txt['help'], ' + ', $context['SPortal']['is_new'] ? $txt['sp-blocksAdd'] : $txt['sp-blocksEdit'], ' +

+
+
+ +
+
+
+ ', $txt['sp-adminColumnType'], ': +
+
+ ', $context['SPortal']['block']['type_text'], ' +
+
+ +
+
+ +
+
+ ', $txt['help'], ' + ', $txt['sp_admin_blocks_col_permissions'], ': +
+
+ +
+
+ ', $txt['sp_admin_blocks_col_custom_permissions'], ': +
+
+ + + + + + '; + + foreach ($context['SPortal']['block']['groups'] as $id => $label) + { + $current = 0; + if (in_array($id, $context['SPortal']['block']['groups_allowed'])) + $current = 1; + elseif (in_array($id, $context['SPortal']['block']['groups_denied'])) + $current = -1; + + echo ' + + + + + + '; + } + + echo ' +
', $txt['sp_admin_blocks_custom_permissions_membergroup'], ' + ', $txt['sp_admin_blocks_custom_permissions_allowed_short'], '', $txt['sp_admin_blocks_custom_permissions_disallowed_short'], '', $txt['sp_admin_blocks_custom_permissions_denied_short'], '
', $label, '
+
'; + + foreach ($context['SPortal']['block']['options'] as $name => $type) + { + if (empty($context['SPortal']['block']['parameters'][$name])) + $context['SPortal']['block']['parameters'][$name] = ''; + + echo ' +
'; + + if (!empty($helptxt['sp_param_' . $context['SPortal']['block']['type'] . '_' . $name])) + echo ' + ', $txt['help'], ''; + + echo ' + +
+
'; + + if ($type == 'bbc') + { + echo ' +
+
+
+
+
+ ', template_control_richedit($context['SPortal']['bbc'], 'sp_rich_smileys', 'sp_rich_bbc'), ' + + +
+
'; + } + elseif ($type == 'boards' || $type == 'board_select') + { + echo ' + '; + + if ($type == 'boards') + echo ' + '; + + foreach ($context['SPortal']['block']['board_options'][$name] as $option) + echo ' + '; + echo ' + '; + } + elseif ($type == 'int') + echo ' + '; + elseif ($type == 'text') + echo ' + '; + elseif ($type == 'check') + echo ' + '; + elseif ($type == 'select') + { + $options = explode('|', $txt['sp_param_' . $context['SPortal']['block']['type'] . '_' . $name . '_options']); + + echo ' + '; + } + elseif (is_array($type)) + { + echo ' + '; + } + elseif ($type == 'textarea') + { + echo ' + +
+
+ + + +
+
'; + } + + if ($type != 'bbc') + echo ' + '; + } + + if (empty($context['SPortal']['block']['column'])) + { + echo ' +
+ +
+
+ +
'; + } + + if (count($context['SPortal']['block']['list_blocks']) > 1) + { + echo ' +
+ ', $txt['sp-blocksRow'], ': +
+
+ + +
'; + } + + if ($context['SPortal']['block']['type'] != 'sp_boardNews') + { + echo ' +
+ +
+
+ +
'; + } + + echo ' +
+ +
+
+ +
+
+
+ +
+
+ +
'; + + if (!empty($context['SPortal']['block']['column'])) + echo ' + '; + + echo ' + + + '; + + if (!empty($modSettings['sp_enableIntegration'])) + { + echo ' +
+
+

+ ', $txt['help'], ' + ', $txt['sp-blocksDisplayOptions'], ' +

+
+
+ +
+ ', $txt['sp-blocksAdvancedOptions'], ' + ', $txt['sp-blocksShowBlock'], ' + + +
+ +
+
+ +
'; + } + + $style_sections = array('title' => 'left', 'body' => 'right'); + $style_types = array('default' => 'DefaultClass', 'class' => 'CustomClass', 'style' => 'CustomStyle'); + $style_parameters = array( + 'title' => array('catbg', 'catbg2', 'catbg3', 'titlebg', 'titlebg2'), + 'body' => array('windowbg', 'windowbg2', 'windowbg3', 'information', 'roundframe'), + ); + + if ($context['SPortal']['block']['type'] != 'sp_boardNews') + { + echo ' +
+
+

+ ', $txt['help'], ' + ', $txt['sp-blocksStyleOptions'], ' +

+
+
+ +
'; + + foreach ($style_sections as $section => $float) + { + echo ' +
'; + + foreach ($style_types as $type => $label) + { + echo ' +
+ ', $txt['sp-blocks' . ucfirst($section) . $label], ': +
+
'; + + if ($type == 'default') + { + echo ' + '; + } + else + echo ' + '; + + echo ' +
'; + } + + echo ' +
+ ', $txt['sp-blocksNo' . ucfirst($section)], ': +
+
+ +
+
'; + } + + echo ' + +
+ +
+
+ +
'; + } + + echo ' +
+
+ '; +} + +function template_block_select_type() +{ + global $context, $scripturl, $settings, $txt; + + echo ' +
+
+

+ ', $txt['help'], ' + ', $txt['sp-blocksSelectType'], ' +

+
+
+ + '; + + foreach($context['SPortal']['block_types'] as $index => $type) + { + if ($index != 0 && $index % 3 == 0) + { + echo ' + + '; + } + + echo ' + '; + } + + echo ' + +
+
+ +
+ +

', $txt['sp_function_' . $type['function'] . '_desc'], '

+
+ +
+
+
+ +
+ +
+ +
'; + + if (!empty($context['SPortal']['block']['column'])) + echo ' + '; + + echo ' + +
+
'; +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalAdminPages.template.php b/Themes/default/PortalAdminPages.template.php new file mode 100644 index 0000000..752666d --- /dev/null +++ b/Themes/default/PortalAdminPages.template.php @@ -0,0 +1,338 @@ + +
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+ + + '; + + foreach ($context['columns'] as $column) + { + if ($column['selected']) + echo ' + '; + elseif ($column['sortable']) + echo ' + '; + else + echo ' + '; + } + + echo ' + + + + '; + + if (empty($context['pages'])) + { + echo ' + + + '; + } + + foreach ($context['pages'] as $page) + { + echo ' + + + + + + + + + '; + } + + echo ' + +
+ ', $column['label'], '  + + ', $column['link'], ' + + ', $column['label'], ' + + +
', $txt['sp_error_no_pages'], '
', $page['link'], '', $page['page_id'], '', $page['type_text'], '', $page['views'], '', $page['status_image'], '', implode(' ', $page['actions']), '
+
+
+ +
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+ +
+ '; +} + +function template_pages_edit() +{ + global $context, $settings, $options, $scripturl, $txt, $helptxt, $modSettings; + + if (!empty($context['SPortal']['preview'])) + { + echo ' +
'; + + template_view_page(); + + echo ' +
'; + } + + echo ' +
+
+
+

+ ', $txt['sp_admin_pages_general'], ' +

+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ ', $txt['help'], ' + +
+
+ +
+
+ ', $txt['sp_admin_pages_col_custom_permissions'], ': +
+
+ + + + + + '; + + foreach ($context['SPortal']['page']['groups'] as $id => $label) + { + $current = 0; + if (in_array($id, $context['SPortal']['page']['groups_allowed'])) + $current = 1; + elseif (in_array($id, $context['SPortal']['page']['groups_denied'])) + $current = -1; + + echo ' + + + + + + '; + } + + echo ' +
', $txt['sp_admin_pages_custom_permissions_membergroup'], ' + ', $txt['sp_admin_pages_custom_permissions_allowed_short'], '', $txt['sp_admin_pages_custom_permissions_disallowed_short'], '', $txt['sp_admin_pages_custom_permissions_denied_short'], '
', $label, '
+
+
+ +
+
+ +
+
+ +
+
+
+
+ ', $txt['sp_admin_pages_col_body'], ': +
+
+
+
+
+ + +
', template_control_richedit($context['post_box_name'], 'sp_rich_smileys', 'sp_rich_bbc'), '
+
+
+ +
+
+ +
'; + + $style_sections = array('title' => 'left', 'body' => 'right'); + $style_types = array('default' => 'DefaultClass', 'class' => 'CustomClass', 'style' => 'CustomStyle'); + $style_parameters = array( + 'title' => array('catbg', 'catbg2', 'catbg3', 'titlebg', 'titlebg2'), + 'body' => array('windowbg', 'windowbg2', 'windowbg3', 'information', 'roundframe'), + ); + + echo ' +
+
+

+ ', $txt['sp_admin_pages_style'], ' +

+
+
+ +
'; + + foreach ($style_sections as $section => $float) + { + echo ' +
'; + + foreach ($style_types as $type => $label) + { + echo ' +
+ ', $txt['sp-blocks' . ucfirst($section) . $label], ': +
+
'; + + if ($type == 'default') + { + echo ' + '; + } + else + echo ' + '; + + echo ' +
'; + } + + echo ' +
+ ', $txt['sp-blocksNo' . ucfirst($section)], ': +
+
+ +
+
'; + } + + echo ' +
+ +
+
+ +
+ + +
+
+ '; +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalAdminShoutbox.template.php b/Themes/default/PortalAdminShoutbox.template.php new file mode 100644 index 0000000..92eb58c --- /dev/null +++ b/Themes/default/PortalAdminShoutbox.template.php @@ -0,0 +1,339 @@ + +
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+ + + '; + + foreach ($context['columns'] as $column) + { + if ($column['selected']) + echo ' + '; + elseif ($column['sortable']) + echo ' + '; + else + echo ' + '; + } + + echo ' + + + + '; + + if (empty($context['shoutboxes'])) + { + echo ' + + + '; + } + + foreach ($context['shoutboxes'] as $shoutbox) + { + echo ' + + + + + + + + '; + } + + echo ' + +
+ ', $column['label'], '  + + ', $column['link'], ' + + ', $column['label'], ' + + +
', $txt['sp_error_no_shoutbox'], '
', $shoutbox['name'], '', $shoutbox['shouts'], '', $shoutbox['caching'] ? $txt['sp_yes'] : $txt['sp_no'], '', $shoutbox['status_image'], '', implode(' ', $shoutbox['actions']), '
+
+
+ +
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+ +
+ '; +} + +function template_shoutbox_edit() +{ + global $context, $settings, $options, $scripturl, $txt, $helptxt, $modSettings; + + echo ' +
+
+
+

+ ', $context['page_title'], ' +

+
+
+ +
+
+
+ +
+
+ +
+
+ ', $txt['help'], ' + +
+
+ +
+
+ ', $txt['sp_admin_shoutbox_col_custom_permissions'], ': +
+
+ + + + + + '; + + foreach ($context['SPortal']['shoutbox']['groups'] as $id => $label) + { + $current = 0; + if (in_array($id, $context['SPortal']['shoutbox']['groups_allowed'])) + $current = 1; + elseif (in_array($id, $context['SPortal']['shoutbox']['groups_denied'])) + $current = -1; + + echo ' + + + + + + '; + } + + echo ' +
', $txt['sp_admin_shoutbox_custom_permissions_membergroup'], ' + ', $txt['sp_admin_shoutbox_custom_permissions_allowed_short'], '', $txt['sp_admin_shoutbox_custom_permissions_disallowed_short'], '', $txt['sp_admin_shoutbox_custom_permissions_denied_short'], '
', $label, '
+
+
+ ', $txt['sp_admin_shoutbox_col_moderators'], ': +
+
+
+ ', $txt['avatar_select_permission'], ' +
    '; + + foreach ($context['moderator_groups'] as $group) + { + echo ' +
  • '; + } + echo ' +
  • +
+
+ + +
+
+ ', $txt['help'], ' + +
+
+ +
+
+ ', $txt['help'], ' + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+ + +
+
+ '; +} + +function template_shoutbox_prune() +{ + global $context, $scripturl, $settings, $txt; + + echo ' +
+
+
+

+ ', $context['page_title'], ' +

+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+ + +
+
+ + '; +} + +function template_shoutbox_block_redirect() +{ + global $context; + + echo ' +
+
+

+ ', $context['page_title'], ' +

+
+
+ +
+ ', $context['redirect_message'], ' +
+ +
+
'; +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalArticles.template.php b/Themes/default/PortalArticles.template.php new file mode 100644 index 0000000..323866f --- /dev/null +++ b/Themes/default/PortalArticles.template.php @@ -0,0 +1,189 @@ + + + + + + + + + + + + +
', $article['message']['icon'], '', $article['topic']['link'], '
'; + + if (!empty($modSettings['articleavatar']) && $article['poster']['avatar']['name'] !== null && !empty($article['poster']['avatar']['href'])) + echo ' + ', $article['poster']['name'], ' +
', $article['message']['time'], ' ', $txt['by'], ' ', $article['poster']['link'], '
', $txt['sp-articlesViews'], ': ', $article['topic']['views'], ' | ', $txt['sp-articlesComments'], ': ', $article['topic']['replies'], '
'; + else + echo ' +
', $article['message']['time'], ' ', $txt['by'], ' ', $article['poster']['link'], ' | ', $txt['sp-articlesViews'], ': ', $article['topic']['views'], ' | ', $txt['sp-articlesComments'], ': ', $article['topic']['replies'], '
'; + + echo ' +

', !empty($article['category']['picture']['href']) ? '
' . $article['category']['name'] . '
' : '', $article['message']['body'], '

+
+
+
', $article['article']['link'], ' ', $article['article']['new_comment'], '
+
+ '; + } + + if (!empty($modSettings['articleperpage']) && !empty($context['page_index'])) + echo ' +
', $txt['sp-articlesPages'], ': ', $context['page_index'], '
'; +} + +function template_articles_curve() +{ + global $context, $txt, $modSettings, $scripturl; + + if (empty($modSettings['articleactive'])) + return; + + while ($article = $context['get_articles']()) + { + echo ' +
+

+ ', $article['message']['icon'], '', $article['topic']['link'], ' +

+
+
+ +
'; + + if (!empty($modSettings['articleavatar']) && $article['poster']['avatar']['name'] !== null && !empty($article['poster']['avatar']['href'])) + echo ' + ', $article['poster']['name'], ' +
', $article['message']['time'], ' ', $txt['by'], ' ', $article['poster']['link'], '
', $txt['sp-articlesViews'], ': ', $article['topic']['views'], ' | ', $txt['sp-articlesComments'], ': ', $article['topic']['replies'], '
'; + else + echo ' +
', $article['message']['time'], ' ', $txt['by'], ' ', $article['poster']['link'], ' | ', $txt['sp-articlesViews'], ': ', $article['topic']['views'], ' | ', $txt['sp-articlesComments'], ': ', $article['topic']['replies'], '
'; + + echo ' +

', !empty($article['category']['picture']['href']) ? '
' . $article['category']['name'] . '
' : '', $article['message']['body'], '
+
', $article['article']['link'], ' ', $article['article']['new_comment'], '
+
+ +
'; + } + + if (!empty($modSettings['articleperpage']) && !empty($context['page_index'])) + echo ' +
', $txt['sp-articlesPages'], ': ', $context['page_index'], '
'; +} + +function template_add_article() +{ + global $context; + + if ($context['SPortal']['core_compat']) + template_add_article_core(); + else + template_add_article_curve(); +} + +function template_add_article_core() +{ + global $context, $scripturl, $txt; + + echo '
+ + + + + + + +
', $txt['sp-articlesAdd'], '
+
+ + + + + + + +
', $txt['sp-articlesCategory'], ': + +
+ + + +
+
'; +} + +function template_add_article_curve() +{ + global $context, $scripturl, $txt; + + echo ' +
+
+

+ ', $txt['sp-articlesAdd'], ' +

+
+
+ +
+
+
+ ', $txt['sp-articlesCategory'], ': +
+
+ +
+
+

+ +

+ + + +
+ +
+
'; +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalPages.template.php b/Themes/default/PortalPages.template.php new file mode 100644 index 0000000..af48321 --- /dev/null +++ b/Themes/default/PortalPages.template.php @@ -0,0 +1,96 @@ + + '; + + if (empty($context['SPortal']['page']['style']['no_title'])) + echo ' + + + '; + + echo ' + + + +
+ ', $context['SPortal']['page']['title'], ' +
'; + + sportal_parse_page($context['SPortal']['page']['body'], $context['SPortal']['page']['type']); + + echo ' +
+ '; +} + +function template_view_page_curve() +{ + global $context; + + if (empty($context['SPortal']['page']['style']['no_title'])) + { + echo ' +
+

+ ', $context['SPortal']['page']['title'], ' +

+
'; + } + + if (strpos($context['SPortal']['page']['style']['body']['class'], 'roundframe') !== false) + { + echo ' + '; + } + + echo ' +
'; + + if (empty($context['SPortal']['page']['style']['no_body'])) + { + echo ' + '; + } + + echo ' +
'; + + sportal_parse_page($context['SPortal']['page']['body'], $context['SPortal']['page']['type']); + + echo ' +
'; + + if (empty($context['SPortal']['page']['style']['no_body'])) + { + echo ' + '; + } + + echo ' +
'; + + if (strpos($context['SPortal']['page']['style']['body']['class'], 'roundframe') !== false) + { + echo ' + '; + } +} + +?> \ No newline at end of file diff --git a/Themes/default/PortalShoutbox.template.php b/Themes/default/PortalShoutbox.template.php new file mode 100644 index 0000000..8e51280 --- /dev/null +++ b/Themes/default/PortalShoutbox.template.php @@ -0,0 +1,277 @@ + +
+
+ ', $context['SPortal']['shoutbox']['name'], ' +
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+
+
    '; + + if (!empty($context['SPortal']['shouts_history'])) + foreach ($context['SPortal']['shouts_history'] as $shout) + echo ' + ', !$shout['is_me'] ? '
  • ' . $shout['author']['link'] . ':
  • ' : '', ' +
  • ', str_replace('ignored_shout', 'history_ignored_shout', $shout['text']), '
  • +
  • ', $shout['delete_link'], $shout['time'], '
  • '; + else + echo ' +
  • ', $txt['sp_shoutbox_no_shout'], '
  • '; + + echo ' +
+
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+
+ '; +} + +function template_shoutbox_all_curve() +{ + global $context, $scripturl, $settings, $txt; + + echo ' +
+

+ ', $context['SPortal']['shoutbox']['name'], ' +

+
+
+ +
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+
+
    '; + + if (!empty($context['SPortal']['shouts_history'])) + foreach ($context['SPortal']['shouts_history'] as $shout) + echo ' + ', !$shout['is_me'] ? '
  • ' . $shout['author']['link'] . ':
  • ' : '', ' +
  • ', str_replace('ignored_shout', 'history_ignored_shout', $shout['text']), '
  • +
  • ', $shout['delete_link'], $shout['time'], '
  • '; + else + echo ' +
  • ', $txt['sp_shoutbox_no_shout'], '
  • '; + + echo ' +
+
+
+ ', $txt['pages'], ': ', $context['page_index'], ' +
+
+ +
'; +} + +function template_shoutbox_embed($shoutbox) +{ + global $context, $scripturl, $settings, $txt; + + echo ' +
+
+ '; + + if ($context['can_shout']) + { + echo ' + + '; + } + + echo ' +
+
    '; + + if (!empty($shoutbox['warning'])) + echo ' +
  • ', $shoutbox['warning'], '
  • '; + + if (!empty($shoutbox['shouts'])) + foreach ($shoutbox['shouts'] as $shout) + echo ' +
  • ', !$shout['is_me'] ? '' . $shout['author']['link'] . ': ' : '', $shout['text'], '
    ', !empty($shout['delete_link_js']) ? '' . $shout['delete_link_js'] . '' : '' , '', $shout['time'], '
  • '; + else + echo ' +
  • ', $txt['sp_shoutbox_no_shout'], '
  • '; + + echo ' +
+
'; + + if ($context['can_shout']) + echo ' +
+ + +
'; + + echo ' +
+ + +
+ '; +} + +function template_shoutbox_xml() +{ + global $context, $txt; + + echo '<', '?xml version="1.0" encoding="', $context['character_set'], '"?', '> + + ', $context['SPortal']['shoutbox']['id'], ''; + + if ($context['SPortal']['updated']) + { + echo ' + 1 + ', empty($context['SPortal']['shouts']) ? $txt['sp_shoutbox_no_shout'] : 0, ' + ', !empty($context['SPortal']['shoutbox']['warning']) ? htmlspecialchars($context['SPortal']['shoutbox']['warning']) : 0, ' + ', !empty($context['SPortal']['shoutbox']['reverse']) ? 1 : 0, ''; + + foreach ($context['SPortal']['shouts'] as $shout) + echo ' + + ', $shout['id'], ' + ', htmlspecialchars($shout['author']['link']), ' + + ', htmlspecialchars(strip_tags($shout['time'])), ' + ', !empty($shout['delete_link_js']) ? htmlspecialchars($shout['delete_link_js']) : 0, ' + ', htmlspecialchars($shout['text']), ' + ', $shout['is_me'] ? 1 : 0, ' + '; + } + else + echo ' + 0'; + + echo ' +'; +} + +?> \ No newline at end of file diff --git a/Themes/default/css/portal.css b/Themes/default/css/portal.css new file mode 100644 index 0000000..7106831 --- /dev/null +++ b/Themes/default/css/portal.css @@ -0,0 +1,600 @@ +/* Version 2.3.5; portal */ + +/* ************************************* */ +/* Common styles */ +/* ************************************* */ +.sp_table +{ + border-collapse: collapse; + border-spacing: 0; + width: 100%; +} +.sp_center +{ + text-align: center; +} +.sp_right +{ + text-align: right; +} +.sp_left +{ + text-align: left; +} +.sp_middle +{ + vertical-align: middle; +} +.sp_top +{ + vertical-align: top; +} +.sp_auto_align +{ + margin: 0 auto; +} +.sp_float_left +{ + float: left; +} +.sp_float_right +{ + float: right; +} +.sp_regular_padding +{ + padding: 5px; +} +.sp_content_padding +{ + padding: 0 0.8em; +} +.sp_fullwidth +{ + width: 100%; +} +.sp_page_index +{ + width: 100%; + text-align: center; +} +.sp_clear +{ + clear: both; +} +.sp_side_clear +{ + clear: both; + line-height: 0.7em; +} + +/* ************************************* */ +/* List styles */ +/* ************************************* */ +.sp_list +{ + list-style-type: none; + text-align: left; + padding: 0 0 0 5px; + line-height: 1.5em; + margin: 0; +} +.sp_list_indent +{ + padding: 0 0 0 10px; +} +li.sp_list_top +{ + padding-top: 5px; +} +li.sp_list_bottom +{ + padding-bottom: 5px; + border-bottom: 1px dashed #AAA; +} +li.sp_list_divider +{ + border-bottom: 1px solid #DDD; +} + +/* ************************************* */ +/* Block specific styles */ +/* ************************************* */ +.sp_online_flow +{ + max-height: 150px; + height: auto !important; + height: 150px; + overflow: auto; +} +.sp_rss_flow +{ + max-height: 300px; + height: auto !important; + height: 300px; + overflow: auto; +} +td.sp_top_poster, td.sp_staff, td.sp_blog, td.sp_articles +{ + width: 45px; +} +td.sp_staff_info +{ + padding: 7px 0; + vertical-align: bottom; +} +td.sp_staff_divider +{ + border-bottom: 1px dashed #AAA; +} +td.sp_recent_icon +{ + vertical-align: middle; + width: 5%; +} +td.sp_recent_subject +{ + width: 60%; +} +td.sp_recent_info +{ + width: 35%; +} +div.sp_image +{ + text-align: center; + line-height: 1.4em; + padding: 5px; +} +input.sp_search +{ + width: 95%; +} +.sp_acalendar +{ + border-collapse: collapse; + border-spacing: 0; + width: 100%; + text-align: center; +} +td.sp_acalendar_day +{ + height: 20px; + padding: 2px; + text-align: center; + vertical-align: top; +} +.sp_acalendar_divider +{ + width: 80%; +} +table.sp_blog, table.sp_articles, td.sp_shop_info +{ + line-height: 1.7em; +} +td.sp_shop_info +{ + font-size: smaller; +} +td.sp_shop_divider +{ + border-bottom: 1px dashed #AAA; +} +td.sp_shop +{ + width: 40px; +} +.sp_blog_title, .sp_articles_title +{ + border-bottom: 1px dashed #AAA; +} +#sp_menu +{ + width: 100%; +} +#sp_menu a +{ + margin: 0; + line-height: 1.7em; +} +#sp_menu li +{ + position: relative; +} +#sp_menu li ul +{ + position: absolute; + top: 0; + left: 75%; + width: 200px; + background: #FFFFFF; + border: 1px solid #AAA; +} +#sp_menu ul +{ + display: none; +} +#sp_menu li:hover ul +{ + display: block; +} +.sp_article_icon +{ + margin: 5px 10px 0 0; +} +.sp_article_content +{ + margin-bottom: 0.5em; +} + +/* ************************************* */ +/* Main layout styles */ +/* ************************************* */ +#sp_main +{ + width: 100%; + border-spacing: 5px; + table-layout: fixed; +} +#sp_header, #sp_footer +{ + vertical-align: top; + margin: 0 0.4em; +} +#sp_left +{ + vertical-align: top; +} +#sp_right +{ + vertical-align: top; +} +#sp_center +{ + vertical-align: top; +} +div.sp_block +{ + overflow: auto; + padding: 0 0.5em; +} +div.sp_block_container +{ + overflow: auto; +} +table.sp_block +{ + border-collapse: collapse; + border-spacing: 0; + width: 100%; +} +td.sp_block_padding +{ + padding: 5px; +} +.sp_block_section +{ + padding-bottom: 0.7em; +} +body +{ + min-width: 750px; +} + +/* ************************************* */ +/* Shoutbox styles */ +/* ************************************* */ +table.shoutbox_container +{ + width: 100%; + font-size: x-small; +} +.shoutbox_padding +{ + padding: 5px; +} +.shoutbox_body +{ + text-align: left; + padding: 0; +} +.shoutbox_list_compact +{ + margin: 0; + padding: 0; + list-style: none; + overflow: auto; + height: 200px; +} +.shoutbox_list_compact li +{ + padding: 4px 0 4px 4px; + border-bottom: 1px dashed #CCCCCC; + border-left: 3px solid #DADADA; +} +.shoutbox_list_all +{ + margin: 0; + padding: 0; + list-style: none; +} +.shoutbox_list_all li +{ + padding: 4px 0 0 4px; + border-left: 3px solid #DADADA; +} +li.shoutbox_time +{ + border-bottom: 1px dashed #CCCCCC; + color: #777; +} +span.shoutbox_time +{ + color: #777; + padding-left: 5px; +} +span.shoutbox_delete +{ + float: right; + padding-right: 3px; +} +.shoutbox_page_index +{ + padding: 2px 0 3px 2px; + line-height: 1.8em; + text-align: center; +} +div.shoutbox_input +{ + padding-top: 5px; +} +input.shoutbox_input +{ + width: 65%; +} +li.shoutbox_warning +{ + border-left: 3px solid #F66; + border-bottom: none; + background: #FDD; + color: #FF0000; +} +.shoutbox_me +{ + font-weight: bold; + color: #FF0000; +} + +/* ************************************* */ +/* Admin styles */ +/* ************************************* */ +#sp_admin_main +{ + overflow: hidden; + margin: 1em 0; +} +#sp_live_info +{ + width: 65%; +} +#sp_general_info +{ + width: 34%; +} +#spAnnouncements +{ + height: 18ex; + overflow: auto; + padding-right: 1ex; +} +#sp_live_info div.sp_content_padding, #sp_general_info div.sp_content_padding +{ + height: 18ex; +} +#sp_credits p +{ + margin: 0; + padding: 0.5em 0; +} + +#sp_manage_blocks h3.titlebg a.sp_float_right +{ + padding-top: 0.5em; +} +#sp_manage_blocks table.table_grid +{ + margin-bottom: 0.8em; +} +#sp_select_block_type +{ + width: 80%; + margin: 0 auto; +} +#sp_select_block_type div.sp_content_padding +{ + height: 100px; + padding: 0 1em; +} +#sp_select_block_type li +{ + float: left; + width: 150px; + height: 200px; +} +#sp_select_block_type table +{ + width: 100%; +} +#sp_select_block_type td +{ + width: 33%; + vertical-align: top; +} +#sp_edit_block +{ + width: 70%; + margin: 0 auto; +} +#sp_edit_block #sp_display_advanced +{ + padding-top: 0.6em; + line-height: 2em; +} +#sp_edit_block ul.sp_display_list +{ + overflow: hidden; + margin: 0; +} +#sp_edit_block ul.sp_display_list li +{ + float: left; + width: 50%; +} + +#sp_manage_articles table.table_grid +{ + margin: 0.4em 0; +} +#sp_article_add +{ + width: 65%; + margin: 0 auto; +} +#sp_add_articles_category +{ + margin-bottom: 0.5em; +} +#sp_add_articles_list +{ + list-style: none; +} +#sp_add_articles_list_header +{ + list-style: none; +} +#sp_add_articles_list li +{ + margin-top: 0.2em; +} +#sp_edit_category +{ + width: 60%; + margin: 0 auto; +} +#sp_add_articles_button +{ + padding-top: 0em; +} + +#sp_manage_pages table.table_grid +{ + margin: 0.4em 0; +} +#sp_edit_page +{ + width: 70%; + margin: 0 auto; +} + +#sp_manage_shoutboxes table.table_grid +{ + margin: 0.4em 0; +} +#sp_edit_shoutbox +{ + width: 70%; + margin: 0 auto; +} +#sp_prune_shoutbox +{ + width: 70%; + margin: 0 auto; +} +#sp_prune_shoutbox dl.sp_form dt +{ + width: 65%; +} +#sp_prune_shoutbox dl.sp_form dd +{ + width: 34%; +} +#sp_shoutbox_redirect +{ + width: 50%; + margin: 0 auto; +} + +dl#sp_edit_style_title, dl#sp_edit_style_body +{ + width: 50%; +} +dl#sp_edit_style_title dt, dl#sp_edit_style_body dt +{ + width: 45%; +} +dl#sp_edit_style_title dd, dl#sp_edit_style_body dd +{ + width: 54%; +} + +dl.sp_form +{ + margin: 0; + clear: right; + overflow: auto; +} +dl.sp_form dt +{ + font-weight: normal; + float: left; + clear: both; + width: 31%; + margin: 0.5em 0 0 0; +} +dl.sp_form dt strong +{ + font-weight: bold; +} +dl.sp_form dt span +{ + display: block; +} +dl.sp_form dd +{ + float: left; + width: 68%; + margin: 0.5em 0 0 0; +} +dl.sp_form img, #sp_add_articles_list_header img +{ + margin: 0 0.2em 0 0; +} +dl.sp_form dt a img, #sp_add_articles_list_header a img +{ + position: relative; + top: 2px; +} + +.sp_button_container +{ + text-align: center; + padding-top: 1.5em; +} +#sp_rich_editor +{ + padding-left: 2em; + padding-top: 1em; +} +#sp_text_editor +{ + padding: 1em; +} +#sp_text_editor textarea +{ + width: 100%; +} +#sp_text_editor input +{ + float: right; + margin-right: 2px; +} \ No newline at end of file diff --git a/Themes/default/css/portal_rtl.css b/Themes/default/css/portal_rtl.css new file mode 100644 index 0000000..9ec6347 --- /dev/null +++ b/Themes/default/css/portal_rtl.css @@ -0,0 +1,135 @@ +/* Version 2.3.5; portal_rtl */ + +/* ************************************* */ +/* Common styles */ +/* ************************************* */ +.sp_right +{ + text-align: left; +} +.sp_left +{ + text-align: right; +} +.sp_float_left +{ + float: right; +} +.sp_float_right +{ + float: left; +} + +/* ************************************* */ +/* List styles */ +/* ************************************* */ +.sp_list +{ + text-align: right; + padding: 0 5px 0 0; +} +.sp_list_indent +{ + padding: 0 10px 0 0; +} + +/* ************************************* */ +/* Block specific styles */ +/* ************************************* */ +#sp_menu li ul +{ + left: 0; + right: 75%; +} +.sp_article_icon +{ + margin: 5px 0 0 10px; +} + +/* ************************************* */ +/* Shoutbox styles */ +/* ************************************* */ +.shoutbox_body +{ + text-align: right; + padding: 0; +} +.shoutbox_list_compact li +{ + padding: 4px 4px 4px 0; + border-bottom: 1px dashed #CCCCCC; + border-left: none; + border-right: 3px solid #DADADA; +} +.shoutbox_list_all li +{ + padding: 4px 4px 0 0; + border-left: none; + border-right: 3px solid #DADADA; +} +span.shoutbox_time +{ + padding-left: 0; + padding-right: 5px; +} +span.shoutbox_delete +{ + float: left; + padding-right: 0; + padding-left: 3px; +} +.shoutbox_page_index +{ + padding: 2px 2px 3px 0; +} +li.shoutbox_warning +{ + border-left: none; + border-right: 3px solid #F66; +} + +/* ************************************* */ +/* Admin styles */ +/* ************************************* */ +#spAnnouncements +{ + padding-right: 0; + padding-left: 1ex; +} +#sp_select_block_type li +{ + float: right; +} +#sp_edit_block ul.sp_display_list li +{ + float: right; +} + +dl.sp_form +{ + clear: left; +} +dl.sp_form dt +{ + float: right; +} +dl.sp_form dd +{ + float: right; +} +dl.sp_form img, #sp_add_articles_list_header img +{ + margin: 0 0 0 0.2em; +} + +#sp_rich_editor +{ + padding-left: 0; + padding-right: 2em; +} +#sp_text_editor input +{ + float: left; + margin-right: 0; + margin-left: 2px; +} \ No newline at end of file diff --git a/Themes/default/images/admin/articles.png b/Themes/default/images/admin/articles.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb50e35a7d986f33ab092ab0e5ecc3caadee65f GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZQ7aJ|V9E z|NnO`KH^w$7>GP8j)%0I2a<3GP%6CbOi(BpReERp)gI|a5{XBB-&#vp=Hedca>A;)zU9aM%o=KT<7HAaE ze4uGSqjKh6Al2A&_x>ZByzb)XIfq^W&7ZpW>4cq6fVLo;FB9Ob1N5UuNswPKgJ4>D z$IO|lcJJPO1_y!y5#lZ|9=gq?;mYq1D;>^d@H2!Xt%S4OGe<+qKLzs6Vq)g<1`oe8_euW z%>T;X)A{F1v%}?Ssd}uQhmP3KxRUbb?t_L&Onfh{etqZuK9o5tUc^=NLhSLqb6*;= zy;5L4Uby#mbE|`7YQpW6GZbGqvm1S;OLWeY?XPzuO^C!V!t&$+WU>_3HeuUzc>z$}d`}n05Q(X|{U?Q*9C%zF?_0R2gPX}X^2CGx z{}*t&K0IpYyZ_x1HHLL-d{&-GxTJG+*_IZ~&^6gtHa^V^ap}FsWKn%8)=Rcpo846@ zw$lI zc1hE|7Dn7S|Lk~|v%;%;%db|PwtBy|_U4~;&AElQ57yT*sxJ~-H{HrV0q9f)Pgg&e IbxsLQ0A%v!hX4Qo literal 0 HcmV?d00001 diff --git a/Themes/default/images/admin/configuration.png b/Themes/default/images/admin/configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..73f7c13973d64e06cd714ce484a325012db8dcb4 GIT binary patch literal 666 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZQhmJ|V9E z|NlR8=FHKfN4IX>x@OIq($dnLoSdkrsB71*0l7f7hlj_^nKP$MnbOkIQdwCEQ~*@J zckf=HR8UY5kPTF}bm`LW?rxw+T3Q-V5NH}u5GVrV0?h%+0`&sT0g3}nhA03E0*wW# z0ZKtcAZ(xlhSD6%bod!6_sR=p86Qzyl-F>`bV;A0qVg%FJ)gv5@9yPzvTHVPNbT2x z`!Baa=dM%91BCO-(!Bl3Th_hWTvtlaFXAbF1edT^7 i@{j(Wy1I=Q^Xz%c)y(6!Hg*6##^CAd=d#Wzp$Pz>#zr^* literal 0 HcmV?d00001 diff --git a/Themes/default/images/admin/pages.png b/Themes/default/images/admin/pages.png new file mode 100644 index 0000000000000000000000000000000000000000..75784b759b378ccf3498be773436555caea51a63 GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZWvqJ|V9E z|NnQa*k_cnTRU-^Rq0_M+pFWKN6TUTl$}5kAR8hDRQBf6_ms)Efg)C=2MkhoK@|M> z{r~%~zn{PV`S9fjP{Feg-|xTqe(%+{YtR2(fA;C@vp*-F{yO*QyMPCWR1o_qcOlxzQU5B^Qw`=@#9qneG6YSupt-tygV<9DDfE{#X+s}BS1 z0y+R<-7{&my+CJMmIV0)Go+=Z&0Mt`2+rKS`wj|#jwA@u%A~&n4dE>Ch%9Dc;1&X5 z#!GkW{s0AKN?apKg7ec#$`gxH85~pclTsDjGK*5n^NX^J6`X@j*fw2W093cg)5S4F zVruC5OyMR4fri9g`HQ(-mNH%0^5(;;fB*HfBW2U8_P;gWVC?OY?~|E0o1fFHFs4yf zKAYuK?=`iaM~9zwI>jy(@i^o6{5Qvf4GT&nSevRXi;blzR#<5Y z?*sjh{867zHC;b%;LN- hKW~5T?wbvN7}U?oBuJh5YXNjEgQu&X%Q~loCIECb9Gd_D literal 0 HcmV?d00001 diff --git a/Themes/default/images/admin/shoutbox.png b/Themes/default/images/admin/shoutbox.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc7877917ec56d59167093d5d905de40bfc5d6b GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J9J0(?ST z|NsC0b2r1+tqkwhGCW(%@Mtc>xfTYX2!sn~Ll{715GkOt2eTP2cS98e#UUa$CV~Xv zYT&vcrUA9wo(56?wDixfA3r`m`2Ate@Auokzq$JR{j%S$*8O@t% zr!#*%oBH#4>(@uizu%wx{c-7!dy~K2@BDCg<^Oxd|L;|Qe^B`CZuR$jSs$-W`+6(+ z+qK&7S4+NJkN$Km>*>W!U#^6{x!C>bQp~6GRZq??`*c42)47meXYJmfF8OrU{q^zM z52u_zoN)he!vFmdtM^CjUmPfTcfjb~0gHEgU9N4dzPz~y=&4KVD(|gy2f7*PuPwd7 zo!csWfWeqj666=mAP5F7KoA-lT3+4(24}$FE)cwf0H9CF2lon%_X6$XEbxddW?4;NiJwOvJv#DpWjO6rAGhIj2CgHSkw=a+Io2%M z$ra!bc>CO40iGJAv!RVlkE+D3NxgDd@K7>Uk5xpV#H{c#3+D@$Uu>NWtTU$eyxDuk zr1Xrkv+UIy4tx(gw{7{v-OW>8?DL@2VrsD7fjf8Z7&^`4ekK`~c=Cu!W}w*`J9Y*| Xd6j_Y@xR%CUSjZc^>bP0l+XkKORSp@ literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/active.png b/Themes/default/images/sp/active.png new file mode 100644 index 0000000000000000000000000000000000000000..3d80349e3766a8171836728dcc64fb189fab7058 GIT binary patch literal 734 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J9(0(?ST z|NsA=c+x)VpoQ;db;CI_I#Z?PnxtflB;~TD;*Z^NLndpxh@NJ-nl!rB8Fxkr+U4<$G4 z&B;HIRI@v^ZhJ=A?)aje(b;>0YPO{oZ;Q&?5|O<%GrMq>1fPyk5 zt`Q}{`DrEPiAAXljw$&`sS0kHMXBZaMcKs)&cP;Zn=UT^sypfF;us<^H96q`n*{5T zsZ*A=%t);9JDR|qoZKxCn#VEU`{cC~cMcxBb0V^r{Yd(x4W>nf#igaC#zoUpS-Cjc zBzErj#n8C0J#Y#~fWxIjGDp6fU%9w_(==wT6%y7vr6d`CT7}(9o8`b5nyjvFD{Ct& zJNp5{hK4OWm#*KeH$h%7CwV=Ch(Mpor?1~lHgs|D8}|w_b8R?LF_VS0y`A}IBi9>+ z_7AIm&%D9Ha$`nY)@SEAr=cfb ziZpM{1quRHhE8_}3OaXNTDKX(r7G8@0L_e>>kl*pXtHCEDMS`%-Gfhe?tHv){oSS0 z&kh}Vv478#t-J25+j@8Py8BDF++M!<=8`41XU(}Wan+UC)2?s=}M@l<6h%_W->c72pd69_XC6Cok6Ei;k|L~7^AL)qdSK_X?vU1(2jdK#dUk>CBu3M?|?3se}zV%+luD2OCh`n`_VcM83 zy1@9%L4zaVoKC(mZ@y?B{?W(n=gT3||1HBN+f{kOw&U_WiW8(0V&)mxh8y1&=;FV) z%Tn=#BP&zfcGcrw1Afm{u~ISK<2@@ibCdnadjGS%_tHa6n^zd>1m<0Q?5Fzk`*Zo& XVmZxew*SL{zF_cl^>bP0l+XkKV3kQo literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/admin.png b/Themes/default/images/sp/admin.png new file mode 100644 index 0000000000000000000000000000000000000000..3683c23ac110ad0f743751844890c6f6e04aaf6a GIT binary patch literal 744 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#JA!1AIbU z|NsAgd0|dQQrub>zojlQs~saIILGe^3*HtO1Qdrz?RN7|ij7E*2|eWG2~@Vx(dR~f z(E%5qq)=a=$Z|W+nTfhHBea3q7pExAh?WBy^8ePg@3(HgzrN@Dm36N#Z~JzB$-k3_ z{~tg2<6oXBQOz?QZ(tS^vMa>d>UL|8*r>CYArM$o*fM^}jIne{RzMjF@xP>Srrd zPL*l?OANh~=eecK>v*xo-dRXYjP*zy+H@|9Zi#M?+^SO~>gh(uUOCz$d_nFxj$3f!t? zeFzN6)RG{-UQSxI~ftq(4Iyz3wu!!5?kWrE28E8#bGNzgWn~ zRbW;9E3&~cphH;vgn(Pw$pa4_Jec4h$>*jc$IdXhM*hmv{@=PlFEDtz`njxgN@xNA Deok~o literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/arrow.png b/Themes/default/images/sp/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8b22aa815b5bd9517237bd61fc0838f79c2858 GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$3?vg*uel1On2Vh}LpV4%Za?&Y0OVE&_=LFr z|NlRFwr1dTMeA;U?Pf;FN(Km0tYyevY@R&d5GV*_uRS|u#pwx4PxQ_^+A;l5)3k#P z6ZVw!?aJ@mk=?p2t94siP=egmcGy!XhO^a8;BL26Qy1I z#eo)?wzC7x{OfwM5a%?hjVgsK>1rfc7wWy85}S Ib4q9e069>H>FEI~21)^S zK}etipe$Sjr~s%Qs1j(@lqpjnT%Z<+2!snU4X6dE0H_#fFGLn-DO?M(d*I?gOM!}k z8i9rbjp~leya@D*LrIWdFoPfjD1m@65V*LwgodW2m6vyP0QJvY1qQo8;0y@dg@Shw z@INMFSpm>2&H|6fVg?3oArNM~bhqvgP*A4CHKHUqKdq!Zu_%?nF(p4KRlzN@D78Gl zD7#p}IoO14)8z#~b-kW0jv*3LlM@bbTIg(HtqlCp=Jx8F5XZj8ralhl`Mf>nGZrjU zIdtGaKKJA3RVTX)vOThII{uh5t!q=#nO&EP(sBg$E$mq%(XBb*Jl|t)&W$s?R^9mM z@FUEN=aib+rJ^!{N;b!2H8!@)z{(X>Y;1AaX>4qHp%(KSJ)I|eJKUec{xBmf(bl-I djBODkgO?u9Wz#8MvOtG1c)I$ztaD0e0s!)1+uHyD literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/averages.png b/Themes/default/images/sp/averages.png new file mode 100644 index 0000000000000000000000000000000000000000..670d38cd13ab8538900cd18d64598dda732efac3 GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZX!|J|V9E z|NnQYK5JWg_@j}B%o<)T~fXWMFGtL8WNec259E@ zz+lI+qd=8kT-?7nx&jR`PTv4j`NG^mKXC=z(lb7ZKq-hg(7=CNHqPE~;osEBlU85s zUa&uZ-X5ThKnH{Lf*lXEF@zyf1?V-`k|4ie20|vb^(_Vh-aUKv?B2b5moHyFbLPy^qep>? zw{G1ERJnBN(s}dd0oC{P^t86NR#jC2b!BH~1GNM7E@N*01hhr2B*-tAK~QPts=IgZ zzIz9>4+AW2u-^<+$ywkLS+~qN7sAoNz|+EYF^cKLtq8}X7cC|UubohFZH}qzf*;4YpZ{%o zVCegq@mKSa(~>4@{`VQ%#69h0`WU%zf3*@*_Wt$K+fpO9e=pcQ>mOsY6vs}5x97cp PE@AL=^>bP0l+XkK(|NUh literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/birthday.png b/Themes/default/images/sp/birthday.png new file mode 100644 index 0000000000000000000000000000000000000000..9699390d191eca8889224fa5916ea2b2bc9b4e8e GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZU$}J|V9E z|NlR9=+OJ4yg+n(Hv@!(h#Wn%7089KFCS-sFs3Z8xOEw%?C8Fj%&E75+P{7K_U_%g zZ(q}&KY#xDqrvOPhaNw=|Kah9Z;yIEKAipF{+$>1wtlq#T``pLJ=ZbEhtXY5J{q;-iANQ5MKCXHFA{)@^!-w{5I`kH3(XxZ@*6(}u zVN2oRBjIy*zumJxbnTw$Gk3mzyG3N$wii>kyq>ZC#fq)X3pY=hzj4Zfjcu=IrM9km z_Ig@!_2Q?m`r|9+JuaL3xMeh6GiR<^b>{BfyFd@U1A2`DVCgTz4>X>$z$3Dlfq`2Hgc&d0t@{HMlqqqIC<)F_ zD=AMbN@Z|N$xljEaLX)8Ezd8?E>>_3HeuUzc>z$}IZqeI5Q(Xw=dX($bP!;Bpt|ct zSWAZRBKKaoMXfI1|M4fUIc)i_d+yx)biHW;PBDsyKCM-m_VG{XqGh4qRxPWRkMJ>1 zG@Z=x?%Boi*B{Q^S}o$o$!`17;e+?D6ANztoELTMXurV%<;9NtyIik7FO*+6f04xL z4If0JInH*qT>qNs(dxCbdx2x5fND>GPD5LPvEppzh8jKoXS|7-_xmSXIn);Ix$V8} zlHvOP=bsBrt#ecZTH{wSvMl#st!dP-=8DPu$$wjmKToW%Ikej{C+_)oS)X&PXL^A? OWAJqKb6Mw<&;$S?-h|x% literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/blog.png b/Themes/default/images/sp/blog.png new file mode 100644 index 0000000000000000000000000000000000000000..41c536de1ab45a5fa5d06b8eb2bce9cddb7dca58 GIT binary patch literal 500 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZS;TJ|V9E z|Nq~*b?eflOJ~lUIc3U}o}Qi-Fn}=Du3Zb10*V9G0ND^V5J6=1U%q^K|Ni~6XU`rz zd3N{i-E+5}UcGtu+O=zE&YW3)`r(lyNA~XByW-&Wjk^y4&6%>}`jQR1`?g$#m{Yal ze9@wF5Yv)porKsMzv`JD(1k`NL4Lsuf*_z|?BdeV(Xkr{-hlzo;kdx-LsvlIz**oC zSo$3e~G zlF78N%!%P2=g<6Hr4~E!qz>% literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/board.png b/Themes/default/images/sp/board.png new file mode 100644 index 0000000000000000000000000000000000000000..67ca8a3c7dcf43e6933397199675260d25a1a21f GIT binary patch literal 594 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3-p0EYEHRQq09po*^6@9Je3(KLB#C2Ka=y z{{R2~#%7(HTTE`W=|B*WeQTY`(^Dn4x7qyqa0ke~wc6}vpD|DtsQCZiAOHS*`1kAm z?{6>ue7o`c)0sb?PW*nq^Vi$WKVBXB^=8e_mrH)WnDgV=lpjy}zCB#?{c-Ep2lKx_ zYW;d|%C`qKU+ymdcCYB$ot&??Q$OG6`+lwE%Z-@#SEjtb-1_Bu$fwJdpRahnzfkq@ zLeA&QF7M8DygOg?>4N36vz4z-=X^Y8@Z@;*htp~=4;DW-XBPl63N`|GnlJhf{Uh#-m0Yiwv%?w0QZ} e)C#Y@BYo9e$ZvWq@Fs~*aYEH2xNIlTBN=1x&A+=d0(F&mACQo>uJedtM+ECxp;I=%C9b)2@B?yEIIq9+bnhI+0WgE z2PS5HZ?XQ}Vv?}nRQ$Y?F|&>*PdOSs^>FEg#j(8yfSwI**yh%BAf$e?W6f^+iXBE7 ztMpTr>m)4Ej9pl@NwNzV+Jz-Se!&caV4$RAY;5e};u0E~mR4Tg(a|vz2v)6HwR`tn z2zdAI9VjL!2QIg^7XmHkEbxddW?=g}9 z>hWt$$d!_n6`VHZ(G-5s6B|E!@s#-We$i{->QJ+8{ULFzD!s#*RpQ7c8=lhSO$%z= z{QUef>uqbJBlYz3$`&*%;uVm1F?+`CUAuPu`e1Cpks+1!`o-)BD~pJTV<$H2}D0jU=(~K={Dg*0^h6!3XOvF4*6*w7+mZ{!c^>^PlpywDoUHx3vIVCg! E06?&;YXATM literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/collapse.png b/Themes/default/images/sp/collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..182975e9e46bbe7f65741a249ecea1dff5c39c53 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF+ z|Ns8}{=B@r!-o$qTC@nr1v2*R*|T}`<~3{907YiboC#FW+}vDOS65tI+#nl#5U5w6 zB*-tAVb!YLyMa1jV8V9h9Y8tG0*}aI1_o{+5N5n|x9$&6P^QE+q9iy!t)x7$D3!r6 zB|j-u!7Z~WwLHHlyI8?F*o1A<7M?DSAsjQ46BM{+gr6y4Fg|tZl39afuJLkN z2IFO|ZLti-)6UNM#&G7wv}xZM&rI0)J-*T6^Fs!PqCfnOcXqU_1De6$>FVdQ&MBb@ E0IVW$PXGV_ literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/deactive.png b/Themes/default/images/sp/deactive.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab1833ae8861eb11056b153cd56bec02837b0f6 GIT binary patch literal 701 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J7@1AIbU z|NsC0dj6~zQztzr$a#>RaxXFRhMVm*2a7Al+RwULZ-@9?)Kq*_TLC2BESdjm<`j_1 z?39~cPFHPB-mO{sd_osc+0*8l$K?f2O0u71C*6q(0-69+3^exbyy-yoa5WI~feL`e z-tuz;8Uj@L|Js2+R}TNbxaa@b?SD>e`+s=D|GlgJ?^^nQ*X%zV7ye&6;s3g>-)rXn zU)lP9S<9~_Q~xh$`9G)n|Ex}+;s2*Jf1lFxe^T+6$*uqUivIN1{qM>7-c$3btLA@G z%KzH<{}qw{i$newNB+FYUjs z>c1RSRzww^1%_30NswPKg9{XdhK81xp8>_3HeuUzc>z$}7Ec$) z5Q(YD2?y9Dex^Kq@`TkQu|`c$Ha9lbw$@tC;{J&l=-#|TefX1+-fG0 z%*gfOwPf>-zIE&7^*w8HU}UwGHn@KH^6BedtQre49&kLY`ptG@6%*?eo`o^?{}rN5 z7c^{|s6ItnCT}&L$OMDJZ>+`6N`Ky@HZZMu^i0mtAul4OVX_JP3B{O6VRnfR1p^!X zF5MAWzRA<_#_kL^TgB#ibmT#x`x!i4{an^LB{Ts5 DE9`Y; literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/delete.png b/Themes/default/images/sp/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..56ba9e11756a11f968d86699fb65de4dc8e26dcd GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J8?1AIbU z|NsC0FgyEkcFwh=sPhRyM?)O9cxeE+=VJWNM0p<%a{+RJ3V^cL;)C}GSpvEDGSeW6 zfwDl6-Cp_-!8^%GKofwvfQIb$H-v}-&HsDn#-A%^e_lTG^Yr0A$9MiXwD;$Zbw9Q) z|GI9;uT^tCty%eb*`lwD=KWeU;miEFzvgs(oHO;;%(m~7YTr)k{V<{KOK-!+-pU`{ zrSG~MK6ICTYtDYxT=StN|5a1Xi^`JE6-h6v@*h=|d@4(NQeN=6DCTi)(!0#qcd3Cd zlcFA^M8Am(ejXD6bo{f(!0Ryq&%(W*g#wZP?NF~Xfz}uNY!CYz|FP>}1%^*}NswPK zgAy2ofS?=U@}IO_vt{)ou55aSV}|ntT2zQ3?#4ne^UZd%*9TgAsieWw;%dH0CJ-Od_r9R z|Np5ePV7P*ojzhH*6 z^74+mcY)?&1J9@LUJX>qS>O>_%)r1c1j3A$?$-SQ3d)qYMwA5Srb$&&HvY~{l9eSo25(t&z=2#=Byvx-H#_s_}AI?x~uDNL;a18j=ODb*IQeE zR@XkRs|Q;2v#8` z{lV4stgkQ7clVr}fKCnZbJqrjKu}4LUoe9p5GWY~K`03927)tZ?gGI(WB_tCv0${XrlL<=U0!z-_O08tY}vBD#>U2poxMi< z%^Mc3o40J*ytSKGcel@Poh-pTd&A0oZL|88_xFc4Ox?|;&&;g6f9JYg(`HYfK7HwK z3-%KsYK+mjzU=Y&#v1b*8zV1-UA}hzM&MN8G~@0GTla0ORggcVyJk^Y*@+r9wlYCZ c5j&s{E(r=7zk6k00(2UKr>mdKI;Vst08BbTiU0rr literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/dot.png b/Themes/default/images/sp/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..3b8e55f8ae36100264d566139af98ce0b7e9d59c GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfn2Vh}LpV4%Za?&Y0OUpm_=LFr z|Noz1>3@dlPZ=iNWXNa*vFE&na(m7(lr3Z^p2M){C&PlTAaS5b`(cLWJq!)oc0ByO z@!qeA7r!=K`rCH)bKUVDH7DK`9Qs;u@JZgGujvQAq1Ee?@vsIc|leafTl2by85}Sb4q9e0L3@dlPZ=iNWXNa*vFE&na(m7(lr3Z^p2M){C&PlTAaS5b`(cLWJq!)oc0ByO z@!qeA7r!=K`rCH)bKUVDH7DK`9Qs;u@JZgGujvQAq1Ee?@vsIc|leafTl2by85}Sb4q9e0L~e?%ur%G!z6r{_gh%%5xTYL>4nJa0`JjpK@)=+zYd&o|)8rrmOW-^Mpe^b9#(60?n5x3GxeOPy&Ju2)GLZKnr2u z$b);Efa*94JR*x37`TN%nDNrxx<6pet`Q}{`DrEPiAAXljw$&`sS0kHMXBZaMcKs) z&cP;Zn=UT^s=q^`XQrmm92yef(Zqb>fuP7_k%!Di6|JgEkNj-p qDdQ9@%+yn8o;f+bVK(bRNe1`JOd?l;-oFBx!ry;nEJ`iUFUl@f za1J(M+jMyWP@R>hi(?4K%;bayX1B1sJToC0g~8L+&t;ucLK6VzW`&Ue literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/dot5.png b/Themes/default/images/sp/dot5.png new file mode 100644 index 0000000000000000000000000000000000000000..f4646958aa428817f641775a686ef3f4681734eb GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfn2Vh}LpV4%Za?&Y0OW=Q_=LFr z2LkthFWg=~aC`2{m50YL`@ z+yw)WjSwIu@L~y29cO_@WHAE+w-5+3UbR-P`7AsjQ46B?M^!sO!2)D)USV>}|7m`^+qoHRx3DZ9}R xmnBP&vNZCPaRwS{>M1nO40f0>n{}ZigV$Xq4MnfdUxB7Dc)I$ztaD0e0sz#ek=g(N literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/dot6.png b/Themes/default/images/sp/dot6.png new file mode 100644 index 0000000000000000000000000000000000000000..60fc3a60506fabc16adf633931d05597e4b5571c GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfn2Vh}LpV4%Za?&Y0OZC7_=LFr z|Np;-;eR#5(?W*p77VRGb|b?F2sfMIoHxTl4~97%3_n{Lz5>P57|tXy9FAky6UDIY z{*K@Gw*J4i^2f=EUk|r_KGN{_c-@cPwI4QCJlR|Dbx+>c?df0MNU~i5S|nc*qXXr3AD&@r2Jp(KOvdM4XY%gCQVQy4s5{an^LB{Ts5 DkRpk+ literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/dot7.png b/Themes/default/images/sp/dot7.png new file mode 100644 index 0000000000000000000000000000000000000000..13248ec10f09c3cf2a456d817f657d98861977d4 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfn2Vh}LpV4%Za?&Y0OZC7_=LFr z2Le`xr%Vjj85mm`_<`&XOi=C_28M+U+;bSXfr4L|LE=D>!wjr@7}&Nku>Ib%y;nEJ`iU zFUl@fa1J(M+jMyWP@R>hi(?4K%;bayX16f8I5Rbc=Fp%BmoDZL4@9R;5Pi&U^uuN8 u(<7{nJY|}Og_3#-%`<}?I%cyjlw|O|$z-Q&@X`rr3WKMspUXO@geCw~#($y! literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/dot8.png b/Themes/default/images/sp/dot8.png new file mode 100644 index 0000000000000000000000000000000000000000..3159f8002083932a40cb8afc42f834b03039162c GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfn2Vh}LpV4%Za?&Y0OTeF_=LFr z2ZF;4PuDQqT*%NG!T@A{*b3rapU-e+Cd0x!hB=uGKlg$JPfcbx+{>`1jbU3O!|!*y ze!t!M>-E;JPd9yivi{SIQ+eo=O@f^)D5+osD4fazFuR4x$(gAsG=~O7xJ+X{ z@j!6W1hL1=Mis3~Q;x7U@RV5w7FOyhG|!wIKVdfOLP-XnPfQlVzKiz*O=0kK^>bP0 Hl+XkKg>jO` literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/dot_feed.png b/Themes/default/images/sp/dot_feed.png new file mode 100644 index 0000000000000000000000000000000000000000..06d2459611b648351c347973d00d7fe51206defb GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfn2Vh}LpV4%Za?&Y0OUpm_=LFr z2ZCdrT3Xu7nY(xIJ_7-F@4kBnvi|?eyyk46O3nh0$YKTt zZXpn6ymYtj4^U91#5JNMI6tkVJh3R1!7(L2DOJHOvnaJZzbLy{!8zE3ZPVoiKy~Jx zE{-7_Gm{ez_BQdI(eiG^Aqb{o+OUfkx%df0#J!K~V24ulB1zGo7lh z*;Sr5DZ6N0d`>C%4A4OFh{Hhh*DDJw06IgnB*-tAp`)W?=FC+0;ipqp@l@*CB+ zftolAJR*x37`TN%nDNrxx<5ccnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5 z6Shs4K{f_?x;TbNOifN$z;z)YJUBFL!sMwF1)eiBg*~!7p_2HwJfsuo&%F?Ar zT7J0BOqgX6s-k+7W$6sTV+9(WohLRaNS|4!alS1}RNTCDPLC`D!|M+$E#DqIO9z_H N;OXk;vd$@?2>_)uxH|v< literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/event.png b/Themes/default/images/sp/event.png new file mode 100644 index 0000000000000000000000000000000000000000..187cc9c8fd1743f46a195c244bffa1f4b2b5303d GIT binary patch literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCn2Vh}LpV4%Za?&Y0OXzz@CkAK z|NsBuL+_o+cULXBSv2q3qJ!^&D1Y`9p!m-}Kfiqc{qftcx1WAId;9Itt1tJSf4cti z>WxPq4&Obn=fdml=U%P9wEF+v%Ky7dS08)&e@E`pvkR9Ue!1k}bD$yrHzdwJK5h2i z*K_wi{J%PC*6wH1cD9ga1>4{!j3&U3#Z@V-C<^|GV8w7hca>myxqJ^?!>K$a%HaS<^43Og$%3 zbbQaTn66_%Er*l6dcwD@7@8uLOyspeZm`{ft&>%k;M!Q+(IDC zcIQ+eo=O@f^)D5+osD4fa;cdx;Tb# z%=A6;TBtEVqV?hV%G1LB+mhKf(%aCZ<+yytTxFd2h_=n|3=K8;T7+@YGH|A*W0dR)9fscBJ0cJlKdaXXK-@U-c~ khdb<^{FVdQ&MBb@06m#dOaK4? literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/expand.png b/Themes/default/images/sp/expand.png new file mode 100644 index 0000000000000000000000000000000000000000..87246fe2c76a65fce9f2baa410d42e7cf855341c GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF+ z|Ns8}{=B@r!-o$qTC@nr1v2*R*|T}`<~3{907YiboC#FW+}vDOS65tI+#nl#5U5w6 zB*-tAVb!YLyMa1jV8V9h9Y8tG0*}aI1_o{+5N5n|x9$&6P^QE+q9iy!t)x7$D3!r6 zB|j-u!7Z~WwLHHlyI8?F*o1A<7M?DSAsjQ46BM{+gr6y4Fg|tZl39afZt!wh z2IFO|ZLti-(|qTCV>okT+O%(sXD00Y9^Yv3`5^;C!4!VWt1;VN0L@_VboFyt=akR{ E0F~TuhX4Qo literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/game.png b/Themes/default/images/sp/game.png new file mode 100644 index 0000000000000000000000000000000000000000..124325b289d0f2bca8c200c775b2b527f5878a25 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZQ7aJ|V9E z|Nn1kX{o8HDK0LaIdkTeDN}lSde*I52V?^U_w3oTbm>x{$eA-|fFeLfT3Q-J8Bje? zaLbl0Km|Zua6^t9IRa!u%mJDJ{Od zd-m+X^N$Z6Jh*xDCeY;f`}YC$zS_0(?v4XM6Yg(V53~#Du;){!0Bx+@T5(|JhWO?G zqL=)KI1Jh3dq(;PH7$yOe)K2_@(X4V6ckiaGIj|KO)D?&0D_q_SM7#?GiUDJz55OZ zfPsMz{7%}%2Q-tjz$3Dlfq`2Hgc&d0t@{HMlqqqIC<)F_D=AMbN@Z|N$xljEaLX)8 zEzd8?E>>_3HeuUzc>z$}T2B|p5Q(X==flMhIta8qyy*Q!Zg1O6fsIZ%5vtvP{@15i zo(p{Tu5$gp#u%YG{jmQ3Q+=%egqPSdMIJ9*-C6D-eK$+!qpMQI9Pu=wQA#>smNeiEkX)ZvA OGkCiCxvXe zI=1O5)|twF8)qi!OpMZ$v!A~#T`4EIa#pNdzn4IbqoAVmDg}pSayIjTTE4%ydF{!! zclXa;dGzJ`m351s{6BjA+qd&e-kn|cnEBb9t4|@nVg&#m38WjKfps zB_y=Y3m2LaCEyvm*d%`6q#(g*Ui?7EI|p~RdGR~?x664S&T>&~v*jstmMC!$Quf#& z?Y=wLUPRh;Z-Ffz(1WQ~g4<4gaRvr#R!NXwFoPfvgr)&OIS_Pobj)0}YWJBlci+JP zFsP{mPVn!v2inS6;1OBOz`!j8!i<;h*8Kqr%9OZ9lmzFem6RtIr7}3C@2S` z?+6I?S*V)U8f#k@f3@%vm~R^8fBnp*Yv*pBy`?yfSK~qIqonlg*H7NOd-*o;3BQm5 z$EJd!vf}dM?fk|cSh)&*vb5iBa@@2;T>gZBo0?FVdQ&MBb@0J9`=WB>pF literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/gold.png b/Themes/default/images/sp/gold.png new file mode 100644 index 0000000000000000000000000000000000000000..80668dc8d6d35a57f7c334f2da014d75bd43e4c9 GIT binary patch literal 810 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J9R1AIbU z|NsC0^N_-uwZiX~GF&TTxR}FmIGf?ga^ZLL7=Ys6_RGKCApdfm+>K_2m#g?83cjvk zxHpyI?KSd^j5P;jr)GGmpL=(gm74=kVRPJI!D3FqyIc&Z{lPQ+D6n zzoYW$Ca0GhEH7?xxwXmk{z{tz8v+`(TDhz@r{d?GjG1-3X!_jbDM!Pn9**rjaJ`ZtxM7=H(}9rs z&5kv@?JIT|WvtRqS+0|?L^F1w&Vhj2z;Mnl3GxeO5Cj7yC1Vh9ad8O^O-m~;@95~5 z2?VQFt=hf&E(E-L_YN2f6oQ;-9~6OBa~60+7Bet#3xP1>rMq>1fPyk5t`Q}{`DrEP ziAAXljw$&`sS0kHMXBZaMcKs)&cP;Zn=UT^s=Mgv;us<^H8~+6!DBmLZ%jZG!yJ6=3;;mWlu z7PG`prC+-AIcPf9<}V_xTpxD2oZMjaA^V4xBdbdYtAohwHEI)B7>qJhu3TEpu@UGw N22WQ%mvv4FO#m75nwbCq literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/history.png b/Themes/default/images/sp/history.png new file mode 100644 index 0000000000000000000000000000000000000000..560071cc5db9653ad0107f64f0f6272de4d100dc GIT binary patch literal 825 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J8M1AIbU z|NsBLen#b-wyY^N2~(q=|NX+^8U`5X*bR++)D_i|L#1EMB`|>YA%S?@V8PXxHMRu4NZnmR;Yo zAiHwWO`z|#&Ps2ccVf!ic@6WQK$!8;-MT+OL75WQh?3y^w370~qErUQl>DSr1-Hzi)bjkI>|zDyU=y}Ymlpul zUGQ{q43U_coN$0Gg7v7A(~+MNi8b>CvXy;(gXKNTH15Zqw=uA?I&;jdmH9||w?P4~ z$+ZgxeB33|l9;$ScFtfwl{xFg>C^63M?W&Ns`wl}^Ca}rmZ?r}AJw`vFm+meTy^Rb zYhdfXUy)*$92!%aOLRl;{&DhmJshJwp_lKc}?To=;(Szp}pW)W%bgurzyYK#S5M1oKl@EnDSm=j_zsR&pewO jR;*dGf`L11J~P9iRMmIpH)8UEeq-=-^>bP0l+XkK86Mx5 literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/holiday.png b/Themes/default/images/sp/holiday.png new file mode 100644 index 0000000000000000000000000000000000000000..7a03a9e5a390d030f91ea0f9f214c4e088342a95 GIT binary patch literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZS;TJ|V9E z|Nl2OHrCYCoH=vm)TvWjT3Wigy57Hk4;26Y{X3BH?Af!sckkY~apTOHGuMuSz@9yO z&TiYbW5Vimf`tp$&6@|*`_kI_g|YEt4ULD&%6m05?n+C47ZBJZFaMgK|Bj&G zIT4ZTLPEE=xo618yk%m##=&uhlk*uP<5phYI}8lh85qtmFl=FCJI=r`iGyRi_j8cz zjY@+2f*D*~fL7mq2XqmUVB;O#g+Se$1s;*b3=G^tAk28_ZrvZCpiGHtL`iUdT1k0g zQ7VIDN`6wRf?H-$YI%N9cCmtUunF6y%L{<&=6Jd|hDc2HJ^NCuNkM@1!O3lsiY%wM z=;%h}7;gSvzmu(R>38<;ALb@9FmR|b&NqgKXfc|N1t1fj^d}-8<;CD1MgYUG?M{Y0YOIa93;bU;7iAxC7`;22WQ% Jmvv4FO#lJj@09=m literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/index.php b/Themes/default/images/sp/index.php new file mode 100644 index 0000000..69278ce --- /dev/null +++ b/Themes/default/images/sp/index.php @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/Themes/default/images/sp/left.png b/Themes/default/images/sp/left.png new file mode 100644 index 0000000000000000000000000000000000000000..224ccdd255071c090532d80eb99f3c5bc3085e82 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZVzOpAgso z|Nm#rd5|{qPW+U+5&d_CEw%~juMg_Esg`?IBKoMP=N^apYd|hg!OT6cX6$-7W&4Y+ zO;20bJ*`{{L=VdrKPXxJxNyOJxFK;y;nEJ`iUFUl@fa1J(M+jMyW zP+g3ti(`ny)Z_#OIfGA&KFwT`67b{9p_)x6YQzld7%f%oc3bS9uz;!Qyt1N#ir$hQ zfd|vXM5c-aI$k=YsI8>At}91l`JR>~Qe9hPx`JM<;7bm@H)C@*kh}W9Iv|-nr#X3IY0RXGi0-1`w(=Q?I=uQtKH1he{e01sGr6xe zm4DqT)ps=G%WCP*tED>+Bz;*feQs4^`@Y0?i)C7N$9|qG^>&_g!}h4!E#WU`N>^_R zsoW6sWRi60nt36PLy|2ULY=z3HGR^sQUeOb+ju&ezs5A-h zGYIK&oKb8X)TtBDuJ7Nb zoAT+~=g-r+A2oJt`0eeLEh!QG%Deqz(~mjtw6xfcrCs}`cPwpQj02;-v$eN(wza#s zIe++Fh6xRQ?TvHyPVS!EJ#+sy{eXtE$CXd;@HidbW8u(du&INky|umF-D87M(nkx1 YB1IX?9X0}vK*uw9y85}Sb4q9e066(t;{X5v literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/loading.gif b/Themes/default/images/sp/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..1560b646cff2cc4fd292d7fdb6f7adc7eb484b4a GIT binary patch literal 1737 zcmaLXeN0p99l-I&!tEQiv~W&~lv_&SmI|fRw)eE0zR=T_(^9a!crF*Q_O?JP*50BW za+x#6J*VfyIVLB@`G?mSW{fe8%LJS?j`_k2*Er)fUT2(h#u;OrF~)0*amLK)uKSPd z_ve%6mwfVklPAzh+MD7sAOkM}c>DG(0N}=r8~gU{i^XCdkH_!#XEK??hY#PmbLYsB zBQ-TOdcEFcGGQ3zcDqxl)R{A9Dk>_n+3b@iPo6$~y0EaYd-v|n&dz8wdiLzuYuB#f zIId7A#>dBxA3q+6M7D3=e*gY`mSv?<>Cn*7!Gi~r$>gb1r$~|%i^V5SoY=pAe_2@> zpU;2v=+TQ8FUH2ka=F~gmoFiN$BrF){rdHrH*e0LKY#i1-Mo2odV2cVvuD?@ zUw`o6!QH!euU@^nxVSh!KY#Duy<4|#J%9fE_U+r-wrx9k^5pF7Y2!hz{_K}ehqtPf73O8@wtkGyFib|)`J9qAU_vSxN)!U+Q3$?~abhem{rh;Yf zPOJW1?#m|PBZ)!HR~tu$H1Sk?EIk|_G;Yi!he6f93Ps{~w+!$1-$w+3U+n~t&M}Ot zdSwI42rFvpj1a?ZjJW9IPwE??&E&#p9=}A*VhFMy6cm+?16Q*P7E0tZ7Ed$$XgM+i z94(M9MQ3b;8w!dQGl;PjLVE4Y?<_P{QXeB^>`CbQFBvD_OT*#R6y9XGLopA~j#=m{7->pd6t>(Yi=3 zP}uo3V`jwsY7W}yU|ZK5z%f|Z?m9z~uy*yuIRu5uFfoVs{~5H(gmaYV0%%rtm$QvL z{~uwK+1e_?@y3>z>U)~d^%(jpL%ul0QBAF>DcN4YPSb$5Y$@O`J^)4H(vAG6fyV-$ zpp9QFT`ozb8GCfYP#22&x;IILw01D;WQQ6$Rd7I-5KT1ikgn+a(|F~;N5`@Dq1(|Cs^MXKy8P08>2 ze(zaIH}OH&tXIpzRp|f=nv{at6&u#2!XbvJ4yIM4%e%g~!%0&*vz<+T(e8jvJ$eoV zB?T~K5as2YK8NWfo<~YPgTv`>IqKsqR5<(dp)cEDK=00n>#89cvunA{%L%$M)}%E- z+Y7LTL0WhsE#TMm`-=Xj>PZ!`)~ z(K&8wwg6)N&3|FkYgh7U3x!zd`r4lqi5ZME;n0{F5#}>?i)rEJH#GeJiA|m+eZ8DO zSU?f>fl#Gzi`dPes#t)+aBX={4?$xdcO&byCid?1(awZqf1}Z}+v{|OO zt|T#wanNsY&NCKu;zG`1RYSh)xbINpDJ|DFE; D?d&fs literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/modify.png b/Themes/default/images/sp/modify.png new file mode 100644 index 0000000000000000000000000000000000000000..f131aad515ae35843cb15f103ddc53c3b1d756ff GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZP=UJ|V9E z|Nn1kX_+!*%FLNFfsC#-kDHdgJ~tH#}LrdNt5GpqW4$E9Tt;npr&iUe&BiK)VWN+{v4E8)zfYNkEqX z-Eh!4-U;Yti;^I}U6AKCL}GC@cr`tzfZb>#Jk%&H(PJ+p3o~EB3kt5?FYx5 zt__CoMMV3id1T)ed&RM@Uh&wj^&BZS%^MyTELC7?$g$7RdD2^u>yzR8@@rmIS*?mj zvggK3UCqglLj3CFPXBnlWzMZeqqOvi*EWA!kgk*xcmBWn`fi(gojdB=)^C5!A6>{- U5L)Zc4Rj!br>mdKI;Vst0MgJ9ApigX literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/money.png b/Themes/default/images/sp/money.png new file mode 100644 index 0000000000000000000000000000000000000000..e376ffd6a7602096db843089b0f12b37ea25c94e GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZQhmJ|V9E z|Nn2>-`KRLwq{2~@us}&)oF1HqdX?MOg!2R`JaZ1zeD5MlZH|G&FLX-{?a^trJN`y|~C#JgGbcFIi_ zefZIS{lY@ej(c++-1FRLtGK$kb7R+yFUc13Gfg(g8~JkDoGIfLHayQAvy?5wH@DE` z&h!dq1~G}`ETwl|-ajWY`L1%7&KI!vJau#ZbcZR0O-#GHE@nSJeCgUXvk9f!*{0s9 vc4<4=_w~)Sy3N+xUvHivS||D|)lom}iPWbsA1yJU%Naaf{an^LB{Ts5)*3TF literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/move.png b/Themes/default/images/sp/move.png new file mode 100644 index 0000000000000000000000000000000000000000..d59360bac650f041c702ed64b6ee0f87becc4512 GIT binary patch literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZRC&J|V9E z|Nqa~mz2CYDrBLr=M)zpJ7Y&&;)aN*rNMr)Jb@w*ZuF{PhzMLk*b;w;f+g4H%(^(S z`%KfM)TG%_8;kNK3>(izqxgPZOM_W!Xv3QdrB&|6%}pG23l0KHaCAwHqeT+ z<%vLJlb6N+ygm;`1i}^>Y?@L>4nJa0`Jj-g z?o(;{uj+H>jvUi3ai=3^PrRz+;qmBXO;ee+Doma^HZb{FzxwLwS)NmF%|GSyd&7d? gi531iYqrLBz2cpD{JzjjpyL=kUHx3vIVCg!06Y`tFaQ7m literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/post.png b/Themes/default/images/sp/post.png new file mode 100644 index 0000000000000000000000000000000000000000..4a68f7c6ba87fd7cf686f73e918a34ce30062b12 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZUA%J|V9E z|NnQY+;5z@M=xo+b=eUh+rRs`XX_EewB0&M+r2xF0;PZqpt3igzNb#P4U`26S`_XF zDgbKv@%#VxUw=P;|MTI?51@i)AHLsz^ZnkdZ`YpxyZ-Fc*=K)FKK*s>(VtTff1P;n z`{@0jdvAT)eeLU(8{f8G`8@mD|Ebsh=N{_~v%n*= zn1O*?2!t6g-L3lr6qG4(jVKAuPb(=;EJ|f?Ovz75RdCBJN-fVX$}U!L4mM%iba??# z-C|D{#}J9Bw&!mPH7N)*BwEe)KJ5^q<#5)^diBfS_7SIF{kZ?ue1oyKM}AIZ{^c5v z4JU6sz436PsaHxjizD9Ez$ooSa5CPaZ|mMTy^P$kd`plLwuKyj}rUO@AK z;y{%^yCAj$1%X_+z00o8opWuxo#r1r#TR0rcaNKAmkY#45O)Hd!DhC@78pL^B|(0{ z3`#&?Y@7xIO>_%)r1c1j3A$ z?$-SQ3d)qYMwA5Srn@YL)c)2-3m|kDluzj2P1V*DT3N>uX_QJs%G9U50k(m=?!xM97Pt6}5CIv;! z;&0)6e8{3eXj!cuzDU{!| z+WBkMM#r8BMWx(aoTk@>k{c`C1I6#IRw@uzopr0I3`u Ao&W#< literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/right.png b/Themes/default/images/sp/right.png new file mode 100644 index 0000000000000000000000000000000000000000..a7084dea8b611eb3c70bcfc135f81c765289f1a0 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZXZ;pAgso z|NqyodQr0Yal*8_PR-YZ9kyu~o)r(;FY38RBI2lI;!&XNniKDrAAh&#;M)ZU-pttb za^kiZ{ac=QZg|qR?n%R{M?eJ?%bry%eE>A1WYPV?1^093KLVN-)O*{j{Tk3rr@G5_ zl^0CPE?F0!SIRvLG!tkt(EM`i_3c1sXqE)|1v7MXbj+N&YSpUUci#b>gd4OTEq(;l z#981GS&&W=vwgK)ZlmN+=mKLBIAR8zJ zWGq{@45$*K%cgXzdEN%~$az3D@y#26f@x`KKm}Qi^MP!jAwVwB%q?5CKnwv|1QY?9 z4>9)r`}fbEKfinT?zL;zfXbGhe*&~(@tH?J1#=GHow5JU${mN7>^L=L_s#iRkE~t0 zb@{sOKsPsRx!Se<^0YPkn%18O+LgEQa@LxQB}>kxE!Q6;l%A z7tA0C0!m88VBi7-p`mGM<>eh69Y8B)u3EKf_imuGf#BV{cfi0T1^m;}ng+Cov%n*= zn1O*?2!t6g-L3lr6qG4(jVKAuPb(=;EJ|f?Ovz75RdCBJN-fVX$}U!L4mM%iba??# z-Dyu3#}J9Bre|-49dh7dd$6ISLzIyIIfY?*GvzQ}#!Z1ZDZ{%l+%!=)kg(n?9O{O-L6JPKcrgtWP|thu<4zk8}j zXMoO2m(OS3d3`v?zDE69{JEX{Q)}Cpl!{U&3(s^mojN_gIwe*0i0*eQo|CJ-Dk#R< g{gr3m>3(s0t&IF#E1j?xfTYX2!sn~Ll{715GkOt2eTP2cS98e#UUa$CV~Xv zYT&vcrUA9wo(56?wDixfA3r`m`2Ate@Auokzq$JR{j%S$*8O@t% zr!#*%oBH#4>(@uizu%wx{c-7!dy~K2@BDCg<^Oxd|L;|Qe^B`CZuR$jSs$-W`+6(+ z+qK&7S4+NJkN$Km>*>W!U#^6{x!C>bQp~6GRZq??`*c42)47meXYJmfF8OrU{q^zM z52u_zoN)he!vFmdtM^CjUmPfTcfjb~0gHEgU9N4dzPz~y=&4KVD(|gy2f7*PuPwd7 zo!csWfWeqj666=mAP5F7KoA-lT3+4(24}$FE)cwf0H9CF2lon%_X6$XEbxddW?4;NiJwOvJv#DpWjO6rAGhIj2CgHSkw=a+Io2%M z$ra!bc>CO40iGJAv!RVlkE+D3NxgDd@K7>Uk5xpV#H{c#3+D@$Uu>NWtTU$eyxDuk zr1Xrkv+UIy4tx(gw{7{v-OW>8?DL@2VrsD7fjf8Z7&^`4ekK`~c=Cu!W}w*`J9Y*| Xd6j_Y@xR%CUSjZc^>bP0l+XkKORSp@ literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/star.png b/Themes/default/images/sp/star.png new file mode 100644 index 0000000000000000000000000000000000000000..1393fabf75a555e92c4e3d1560384f8c1e02986e GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZTflJ|V9E z|Nnn=+V;sF;~Vqj?<`XRl0YsH0okXjIDm}%Yqc(R3qRg&@ZzW?Tmg^^6o+#kY}C0r zO$w+Os0L^hkPDPWW&>4TpDA;xPxO47z_*7vwN?A&W`&oVrC)4NeYD=_=~@e*b$1tOo@?RgXZ)WB^r=@#kY6x^prD|V zl5uEgXj)oYc}GXbDiAnx=FD9Xcn1Z*@E{2C7PayNP30``h%9Dc;1&X5#!GkW{s0AK zN?apKg7ec#$`gxH85~pclTsDjGK*5n^NX^J6`X@j*fw2W093ch)5S4FVrpoAw@_n% zKwE$II>qk-N}8)Cmv~KD9J1#>x2CM|t(kN0{-0f6p3Zn;kym4l&(1x|6qXb>SfBV_ z@9XSoHgk=>NtF(}>enT);h*a^^SGUg6LA$)ylr6}cY^tV*6zjYl&^oSRe$1r@&Zqn zmD4);m__T^jxJrJ)^?!$k=M5Exu;e#K323m<&Y75?Qy3%OAqha4;zXPM>C1B^|9YQ rt1ZM4@p@trri0u4nLc^>bP0l+XkK=2Siq literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/star1.png b/Themes/default/images/sp/star1.png new file mode 100644 index 0000000000000000000000000000000000000000..1393fabf75a555e92c4e3d1560384f8c1e02986e GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZTflJ|V9E z|Nnn=+V;sF;~Vqj?<`XRl0YsH0okXjIDm}%Yqc(R3qRg&@ZzW?Tmg^^6o+#kY}C0r zO$w+Os0L^hkPDPWW&>4TpDA;xPxO47z_*7vwN?A&W`&oVrC)4NeYD=_=~@e*b$1tOo@?RgXZ)WB^r=@#kY6x^prD|V zl5uEgXj)oYc}GXbDiAnx=FD9Xcn1Z*@E{2C7PayNP30``h%9Dc;1&X5#!GkW{s0AK zN?apKg7ec#$`gxH85~pclTsDjGK*5n^NX^J6`X@j*fw2W093ch)5S4FVrpoAw@_n% zKwE$II>qk-N}8)Cmv~KD9J1#>x2CM|t(kN0{-0f6p3Zn;kym4l&(1x|6qXb>SfBV_ z@9XSoHgk=>NtF(}>enT);h*a^^SGUg6LA$)ylr6}cY^tV*6zjYl&^oSRe$1r@&Zqn zmD4);m__T^jxJrJ)^?!$k=M5Exu;e#K323m<&Y75?Qy3%OAqha4;zXPM>C1B^|9YQ rt1ZM4@p@trri0u4nLc^>bP0l+XkK=2Siq literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/star2.png b/Themes/default/images/sp/star2.png new file mode 100644 index 0000000000000000000000000000000000000000..8058d603164a214ce1c337172283b158479a2ef8 GIT binary patch literal 596 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZUS-J|V9E z|Npnn{O_3ZUjd9v9>VD3MU{QuTPAjg>Gfn2DO4|M>QK$!8; z-MT+OL75WQh?3y^w370~qErUQl>DSr1-Hzi)bjkI>|zDyU=y}Ymlpult@d1sVe?Ehn`N}!7n`f>$#OWlIb*e^Vf#{rm3Ff5>Gk0G1NdIZ~EqT_SO^Y@#?L9he zTSM}!)Xb-W&dLWICf?c^@T~8B%g^!$x<3OsA3Tg(bmeBj2DT)t#$0Q5J`v*+;*b8l pl$3c>^6|RcvG(S;ua5JtifcKGYHr_|?FMu3*I z&`iz(kH}&M25un`X1sK_?hjBrvHzbD^g_mzHGy*RQ`l zWrD^grq1I5UD=Eaq?m=4{#dWQVc8nVubocLQykiDQ#Tjxo}p$N9B#@hFf;LHpT4lt ztW_rk&QDj^z*nRtBh`59!LI2*)%@Z82Qo1G$^Yz!|C65oPrUy>^6kIi5C4K6{0sc@FYv`b z?+^dHfBg4&{@>{b$N^5TK`ylY@!$Fn$PJbc{u_P=xd&*4?u-8#e?ZOv8~%aef4T3^ z-9WFomIV0)GYAR_Dk&LQK$!8;-MT+OL75WQh?3y^w370~qErUQl>DSr1-Hzi)bjkI>|zDyU=y}Ymlpul zE%$VB43U@`+Rw?~WWdw&$E=KtXj2T z&$HQk!ZkvR9he_Pt`Fj=v!Bb|d(UaH!@39g;fK>CeNUV`GJ|bm{>^pbuQ+r&J@Xj* zAE^}1h;wR6kV~=A%5qo~(NL~>HaFfu$G~iwJNuNP>wNO}e3~>_PbZ(dY3;RP+l}li swl?qESa#RCZ<+RS;(~Ag7yMhTe@H~Em7OO=4d`SBPgg&ebxsLQ0NcqyLjV8( literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/star5.png b/Themes/default/images/sp/star5.png new file mode 100644 index 0000000000000000000000000000000000000000..b2cf366dd2b544ec3d30bfda1fbbd2e9475aa816 GIT binary patch literal 599 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZX!|J|V9E zfxyM(zopZE1&9Ai=KrOw|2uhuM1Z7{`5y*H5JSV_KZp5$11p3|pfaEu1N;BF4j_#X zT|fm8aZ6i}VxSbnWS}yj2|&ZaD*y3XflOmF{hyuvKP~NlWWvAT;D5p4{{j>Lc}M^A zPWkWQ``^tUq}MSTWV>U~f7^)v)?xoGz5fGE20GQm18Tm8JIG`e6R6<~X3KUjJ_q!g zYe|q_FoU3=ppuetC=jHjrImL8!730qbLPxlAb1A{pfJD%?)kFy01f0U@Q5sCVBi)4 zVa7{$>;3=*WlCHlN`mv#O3D+9QW+dm@{>{(+%k(&%kzt}ixr%MP1rVFUI0|L%+tj& zL}F@ae>>kH10I*d_jaFQN}V$CNM-|HM#jRP|NqsPc!R1ZrQV-hGfl87RA=#)66Lqv z3~xmYGz2~GGx_*M*`#OL-eoux^GYxMZOg zaNFA@?l)Nz?GMDaT5PXea>;(r=K$HO4Y8K|dFNaj4HsYe{PW;VEraF%iZ9%~qi@X` n_WIm*({K5#TL1Z1ZL(XiPt12u$Ye&Kiy1s!{an^LB{Ts51j7*Y literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/star6.png b/Themes/default/images/sp/star6.png new file mode 100644 index 0000000000000000000000000000000000000000..745cf7770c474c4140368c09f5d5aab72eabb932 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZW>wJ|V9E zfnbu;|2DJ#DGL9ymHsD4gSbEhWE(Sp82K9iojCrt82#^a`rl&-QU*~2)KY2izepD$ zQfcrnLL8(8s0<iRP)c97i8w9{QqmS|F2H`zar!R(xiV2L;uf@ z|35qO-|XOj(*i-}O!RhP2T^TT>dxe{;zTRUu_Mts6^v`ku}IA zg(@H`QZ+zMGG<`uQ``vjre{fzUoeB9prDeHacF30T3T9p2N0|RgEME&+y#PnZ~zJq ze4s_V{|nGi&H|6fVg?3oArNM~bhqvgP*A4CHKHUqKdq!Zu_%?nF(p4KRlzN@D78Gl zD7#p}IoO14)8z#~bt^qx9780ghW5AfH97FKo$sv94~enhd#GU~E3@PN|4y5yJ(reb z{?~tdUu2=iCZ?`-jiXx`0(u!cSKQmb?m(F7?7;aNCPz3m5(Kl&vcxa1Sgt9NyusGH zT-JWV%>COM=e~XGpZFrk^60d-2FV|pQ|7GtAXy+c^ThTXp=Il*l>NLoE%8R5bj%+{ z_F9Es6Rp_mj~`Rd2J2!FDU%O~$5|{DBC_R$3|nV(hh2UZZSq+|}@c2V8;S2{*$NHb5z$ zE{GN&TVuU8P`%kjACStuR&X}ZaEM}{cA$EoGN6Gw$Wpmxz=%$y}O?T@nPC(Q2uDV)WbOxHQb=67#l9kbUD~-L1;Fyx1l&avCS(I9yUzA;};2dniw(0T$pt{wbE{-7*Q>5dN1BR8w4s3}>9ys}kaH$RqsxsdG2(c*$xhtWJNfsI}nPyA_P00bvi>18t<@0vP#b@LM!W aFgWiQ-(tFB_EDg-89ZJ6T-G@yGywom9SxxX literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/star8.png b/Themes/default/images/sp/star8.png new file mode 100644 index 0000000000000000000000000000000000000000..06227ae05ca2267df1ffda04f9b86c7a918f1ecf GIT binary patch literal 661 zcmV;G0&4w5lD%)!P!z?F-MI04#!UdVLM#;!2_gmt{s(pj z)Ph*dL0c>_UosY{r_R=%}lJ7<2^fJ#4v$Kh=13>g)$vYZOHRlAnVh_%X}X7FR;@Zmm|sWHQ0Z z$_jknhi%(Pk_6-N7+Px>V{R>G&H+TEW!p9!$3e5%M4sm;%M!ltgCwTYDXOZvaT(yI zWmz~oJ42RbrHFhGk-=~{e5RDrN+}p)8cP8rulM`?k%+wA-`{_^@bseF?LHq22Ct1V v*YH*UUS)=-;XpGmp)kz31J( zC5xsVnKfnm+ldFJ{GU0qXY=dc&99pGcKw?=xq0o2+8xa~dlIUbKQG=?S+e9s`nH(D z4dwq@8~-)d6fAg=wYuP6U1j2i@a(zI{#BNy&wlo=tSEWz&cC>5*OvP~qND#shPiaxTGibC78q<< zebc7F^sBp_UewvKYy*Nn^bq>?V`>_3HeuUzc>z$} zNlzEY5Q(YD2?w}RQm0-qDVfMJ<%WfYMbAVQ6AKpCA8RJCl>Bs2VR@^NQ(EdPYnyDx znHiYAg2C8Wd-v1@Th_E_yEse^b)0zG(Z$#ImaNi(F_D%+m?y^HbE`EKW;YDt$^x^YGgf z502z#D!*Hvnwlzopr04Zy8#Q*>R literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/stats_member.png b/Themes/default/images/sp/stats_member.png new file mode 100644 index 0000000000000000000000000000000000000000..1c14638b19c157946aa9791baa0f3de4a6b0cc05 GIT binary patch literal 789 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#JAs0(?ST z|NsC0g2U6=g02&-@Nw4hUNY9S8mDKlTftsclGk;QEUE` zEP3&-wK08LOxW`O&GRn(Ypf|)@M7t#f`4_Di5tSR=RW&aS-Ph;J#FTr)R|BIl@*=u z@JycmFlI&2p03z`g}FVw3wCrw#7uhdCnqa(p>JgW{ePLMZCz>q(vpIE?qzoD`jwLG z+j;k2Vyy2pSFg4^|Kg%uTkijej{X-J=F)AOT{hdQ=JvP1V9V;89fj`hWhWDhnrs?O zzq)&AmE4$`s&AEdv@gm0v#q0C_BE-bi`tnE6a07^T-qhV&)3;EON5?p@DQxEs8{gW zCFXOs#<<4Nd6ty(VFl}z!dAzG437xv9q_%Cv>h0*StUV!!3@Blqz`a9Az%))m9xMj zvY3H^>jMZgI;}C80Th%eag8Vm&QB{TPb^Aha7@WhN>y;nEJ`iUFUl@fa1J(M+jMyW zP~8Pj7sn8ZsmTckxSl)>H7z|mfhFYT&K)~)CbE?5WNE30oyc;gqE&@uk3x>Fu5EI0 zbR1{oM1>U$+S=0Xs~gtraj|f5==XJOz3uK19Bjs3zHS(mDjFF%s7~E zer@_0dA;nkl`|z|MDyPsd2lQ_=cv45{_6#klTxH!y*~KhZ2n^nndL9vWKB~$ab}U& z0f7_mAL-3XdGIQArk1K^n)pcpH60zTSy^eBuUDSYT&ME*ynyWN33KMmn>TS~zLNU# ll-0cjcFObPJvwBC8QS(L$}J2jI1lt2gQu&X%Q~loCIJ5Bq>umr literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/stats_thank_o_matic.png b/Themes/default/images/sp/stats_thank_o_matic.png new file mode 100644 index 0000000000000000000000000000000000000000..082afecdeb4e674d929504a632c3a9a09a4d7d75 GIT binary patch literal 808 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J9R1AIbU z|NsC0>eHvUA3wf&_3G4(}CnLYQ}!{)Ysm8I#kpZzN<%AIjMdHTbc z6+t}{7XK^EjhXb|Pfk|oLf^>#`)%Fb)jc!1I=la6rv6Jy3huf0Dmen^43R~tUCVzGJ(ki)8mY!^reeJWY zqg?j2kEW(lNf-ZWYBadCON5`Vvu|#6ag_)?ZyHqjLs2o#&Ary5Ud-ogjd6{r^GOw( zW5QO)j){s386FYTJMf5+(MDBuI|IWsR#qGA@gy7Qhcjv*3LlM@bbJ$VvhvZZ$dOURCj%F4A9S+-QV9%Y?7 zk)?;_=u(%viaENvvd+obj+&92@hceE+10miUa@9Qh=Pkld$8lo`@u2J&Snxy31`-> zQ+=Slbh)~?+S(P%@((2(UZ1QXqLH1l>f!lA=MJwr@<1seLsLX2J$JeG8MVi{hmJo` zOi9%jTlw%sPTuNF;kk2;K2U!0L``z}^EZ0$r9>u8dwX0!K}}6_W@p@|Bn6N-oG`ofY-m59Eq?>=AH1#OJtQGW!}(5U5Nl?xc9s zdC{=55+O%`vOv8+aiEBB@M#DGA_X@Ms2<1$ng%okq7kSPD56z+MKfsOYLFqT zTqOK~QBYA5)8%h(`gnR}#RN5vAc=PQgnM63_wPC9j7S4UH? zAffRS>)s^ZtD?GGGCLMBrM2EV!^2bbvCk%9-Gr!^IXcYD%l(`d7)2;-Te9TJ?AC+3 g*Q{A1bNDqwZkejpq=?D(K<_Yky85}Sb4q9e04yhqdH?_b literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/topic.png b/Themes/default/images/sp/topic.png new file mode 100644 index 0000000000000000000000000000000000000000..55255663f9b5ac16255b430c2f3bc72726ce5be0 GIT binary patch literal 571 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$3?vg*uel1On2Vh}LpV4%Za?&Y0OVc@@CkAK z|NsBLzu*7;`SADq-9Mi%{`q|Q_lG0@-|zkTZr9JZTYkP=^Yg{xpU<}acs}RH)2aXN zZ~OkZ|NFy^?+@F)-mm+5x9rR9oL`p~eYu(R^WvP(*P=dNociPJ^v_oUKVS0vbjjoE ziOHWXI(<9V^Wjv*hvP*bj^%wl)cWCY^SeW}U-s91*;V#-U&4o-m2dY%f83V$dY9k3 zZG|5;rG8i&`+B|m>$RcpRs_FXZT(`o_uIu@uje^Dn{V`Nj@R>9cCTibKbva$a*EEA zUd2Z}3QxPFp0o-+Zsd5_$aTMxL9@Cn59m9$k|4ie2B7yS2c5H~<^xUSEbxddW?t;jixoHZ1(> znvlJ;NvzqsV(q<*ZC0^Wtn)?QUsTWOtctF6xL;tPe)*=`-BoG|VpEOSUh$oFXi-1M z{8jLo!k61K-|MEodC0C*TfsTKM{!ZhkAD?QGbcTb*Q{Uth~ML}&);aEix@mz{an^L HB{Ts5=psqr literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/tux.png b/Themes/default/images/sp/tux.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecb13b7c8211f960897ebd769570491292ab5b6 GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J8W0(?ST z|NsAgbhh5|N-Y%?4IofaQ8Cq11(Ms!45sF4f<-hwZ_rUu(+4Wp(xYc+XsxNG2V|%C zX#v?l1-)6CK<@lZ&D;cCphh73#%d!Vd3TN8>29F0AdyS+bwF0A>AzjAlb4qd)}r!t zi>9%$G0+5{8-D%$|L4!I@87?D{`~Rd#}Ch5ynpue`JcP`SFYZ;arOB3>jtkbRQ)|4 z{Qr#ciBsqQ9oPDCRQK@VLx&C>{I<{R{~pbUhurq>KlFL8?(Ur%fyTbts{4Ag{>II_ zHg4Q_ev|&bb@`8$s9#vFv2^LulM7Xr%qTcHQDaZ9@vb_JIZej(wUsqR@r6ZY%>^bM zscKPC(P3fX38A`yfq}t+-cC-=R#r|H7M4J#0zD21BA}0+NnI-k25Ck~kY6x^prD|V zlCiN15QK(?rU5~Dd3i_2OdwdbYBvy^IdkSN5WIW$4(M01!Bg$XML;__3p^r=85p>Q zK$!8;-MT+OL75WQh?3y^w370~qErUQl>DSr1-Hzi)bjkI>|zDyU=y}Ymlpul?eTPR z43U_coWQ_*(-ox@ zNxxXs#^JKuv-wBQpSni3DhI~XH%dGwH1wc}9_hMB$KRVtf-BiWpCcE3A;n<^y_zfx*+& K&t;ucLK6TP>t2BX literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/up.png b/Themes/default/images/sp/up.png new file mode 100644 index 0000000000000000000000000000000000000000..c54f4e7eb0c5b6bd44167a120b57a83dc8f61e15 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfZXZ;pAgso z|NmDne^$8QUfh)1PR&<^9JXo|oDmD!FY2*dBK)XC;*q*l&(|D(xBS@KMF-z3IPiML zt``%xJ@4Q0taHQTw)M{&Ry_nN0Gd#-^nS^rdq8t?=RZuG_5f&FQ130T_NzcMovN?d zRh~B~yJ%f}PAT^c&`hAoKr7s}8MgzSp;;2-7tGMn(J^!8s#U9Y-+c#k5^m6XwD=KF z6K8=(WHAE+w-5+3Ub-L1;Fyx1l&avCS(I9yUzA;};2dni zw(0T$pgLbq7sn8ZsmTco6dyctdAj+e_9o@ektwaNQzy90P-S&dRSmI7s8JKNa}4y< z)Q&eR{luM?{E_)*)RrJzeGH3)ZY!w$4#jotfc^C`)SAlRzz?!3>_RelF{r G5}E*85wTYQ literal 0 HcmV?d00001 diff --git a/Themes/default/images/sp/user.png b/Themes/default/images/sp/user.png new file mode 100644 index 0000000000000000000000000000000000000000..c166ac4da57340ff9f09c75a7e55603e026072f1 GIT binary patch literal 748 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCn2Vh}LpV4%Za?&Yz`($05#STz z`v3p`%ZqaBs#*&28ibtYY6s8L_URVzS}W|agxhW&PzorRZY%_3L>r5G>j^6aY}U2Q zP_@YdGG-;|PKwr&cUZ7ILpe94YIdA_mluDnlc18zYDLH8^0xD1jQPL6xOwf#w|Do? zUU~H8`<3-ep8P*{{oA+mOW&Pc{^QJ?S7%m#JUV^G#s8~M{CU5px#-IOr@Q;!?x=gR zz3cwg&R3f&a*zLOIQYM1_t%X5|B?^!BuZT~CQ{b*SEFK*+%6LSiq*ZiL{ zZ}X1nHIYmIg)aUdJm+6i{~o{T|IXFvovYDs?)`tZQuS21*2-$X71h4SOElM&m@LmV ziAbBDnAkQuLdYv_iD||iifxc+>;xBTM%yw0h_dMEe$5ZMkq~f_z z#$!*OgDB8-L1;Fyx1l&avCS(I9yUzA;} z;2dniw(0T$pt|**E{-7_Gm{e-nB-Q@kjS)S(|FLy!`s{8`>4H0**Q5WdGX{Y3-7q3 zE4N?S@uNf|Jjn6(fm;!tGN(kZUI+@meo3IQsI|!?G~^01Yvci&K9N-W`g;4VB6$My zZ5;zc?_are%tyCza$}>ZSNQQOhmPGldi9iESMR~oM@}9)cJJcRvxjfrHE1~Kt$*Xr z#iLixUOj8(bAEc`X?2x5Y&?@xZ7L-tBxbT4Nx5_>Portal.'; +$txt['sp_who_forum'] = 'Viewing the Forum.'; +$txt['sp_who_page'] = 'Viewing the page "%2$s".'; + +// Error messages +$txt['error_sp_no_message_id'] = 'Invalid message ID.'; +$txt['error_sp_article_exists'] = 'This article already exists.'; +$txt['error_sp_cannot_add_article'] = 'You don\'t have permission to add an article.'; +$txt['error_sp_cannot_remove_article'] = 'Sorry, you don\'t have permission to remove an article.'; +$txt['error_sp_name_empty'] = 'The name field was left empty.'; +$txt['error_sp_no_category'] = 'Sorry, articles require categories to be published! Please create a category for articles.'; +$txt['error_sp_no_category_normaluser'] = 'Sorry, articles require categories to be published! Please ask an administrator to create a category for articles.'; +$txt['error_sp_no_category_sp_moderator'] = 'A new category can be created here.'; +$txt['error_sp_side_wrong'] = 'Wrong side selected.'; +$txt['error_sp_block_wrong'] = 'Wrong block selected.'; +$txt['error_sp_php_syntax'] = 'Syntax error in block code. Please check the code.'; +$txt['error_sp_php_database'] = 'Database error in block code. Please check the code.'; +$txt['error_sp_no_posts_found'] = 'No posts were found.'; +$txt['error_sp_no_members_found'] = 'No members were found.'; +$txt['error_sp_no_gallery_found'] = 'There are no gallery mods installed.'; +$txt['error_sp_no_pictures_found'] = 'There are no pictures in the gallery.'; +$txt['error_sp_no_boards_found'] = 'This forum does not have any boards.'; +$txt['error_sp_no_topics_found'] = 'This forum does not have any topics.'; +$txt['error_sp_no_attachments_found'] = 'No attachments were found.'; +$txt['error_sp_no_polls_found'] = 'No polls were found.'; +$txt['error_sp_invalid_feed'] = 'Invalid feed.'; +$txt['error_sp_no_online'] = 'There aren\'t any users online.'; +$txt['error_sp_no_items_day'] = 'No calendar events were found.'; +$txt['error_sp_no_blog_found'] = 'There are no blog mods installed.'; +$txt['error_sp_no_blogs_found'] = 'No blogs were found.'; +$txt['error_sp_no_articles_found'] = 'There are no articles to display.'; +$txt['error_sp_no_shop_found'] = 'There are no shop mods installed.'; +$txt['error_sp_no_arcade_found'] = 'There are no arcade mods installed.'; +$txt['error_sp_no_stats_found'] = 'No statistics found.'; +$txt['error_sp_page_not_found'] = 'The page you requested cannot be found.'; +$txt['error_sp_shoutbox_not_exist'] = 'Sorry, this shoutbox does not exist.'; +$txt['error_sp_no_shoutbox'] = 'There either aren\'t any shoutboxes created yet or there aren\'t any shoutboxes that haven\'t already been published in a shoutbox block.'; +$txt['error_sp_no_shoutbox_sp_moderator'] = 'A new shoutbox can be created here.'; +$txt['error_sp_no_shoutbox_normaluser'] = 'Sorry, shoutbox blocks require a shoutbox to be created before you can display a shoutbox using a shoutbox block ! Please ask an administrator to create a new shoutbox.'; +$txt['error_sp_cannot_shoutbox_moderate'] = 'You don\'t have permission to moderate this shoutbox.'; +$txt['error_sp_no_block'] = 'There aren\'t any blocks created yet.'; +$txt['error_sp_flood_spsbp'] = 'Your last shout was less than %1$d seconds ago. Please try again later.'; + +?> \ No newline at end of file diff --git a/Themes/default/languages/SPortal.english.php b/Themes/default/languages/SPortal.english.php new file mode 100644 index 0000000..712df5b --- /dev/null +++ b/Themes/default/languages/SPortal.english.php @@ -0,0 +1,127 @@ +Portal.'; +$txt['sp_who_forum'] = 'Viewing the Forum.'; +$txt['sp_who_page'] = 'Viewing the page "%2$s".'; + +// Error messages +$txt['error_sp_no_message_id'] = 'Invalid message ID.'; +$txt['error_sp_article_exists'] = 'This article already exists.'; +$txt['error_sp_cannot_add_article'] = 'You don\'t have permission to add an article.'; +$txt['error_sp_cannot_remove_article'] = 'Sorry, you don\'t have permission to remove an article.'; +$txt['error_sp_name_empty'] = 'The name field was left empty.'; +$txt['error_sp_no_category'] = 'Sorry, articles require categories to be published! Please create a category for articles.'; +$txt['error_sp_no_category_normaluser'] = 'Sorry, articles require categories to be published! Please ask an administrator to create a category for articles.'; +$txt['error_sp_no_category_sp_moderator'] = 'A new category can be created here.'; +$txt['error_sp_side_wrong'] = 'Wrong side selected.'; +$txt['error_sp_block_wrong'] = 'Wrong block selected.'; +$txt['error_sp_php_syntax'] = 'Syntax error in block code. Please check the code.'; +$txt['error_sp_php_database'] = 'Database error in block code. Please check the code.'; +$txt['error_sp_no_posts_found'] = 'No posts were found.'; +$txt['error_sp_no_members_found'] = 'No members were found.'; +$txt['error_sp_no_gallery_found'] = 'There are no gallery mods installed.'; +$txt['error_sp_no_pictures_found'] = 'There are no pictures in the gallery.'; +$txt['error_sp_no_boards_found'] = 'This forum does not have any boards.'; +$txt['error_sp_no_topics_found'] = 'This forum does not have any topics.'; +$txt['error_sp_no_attachments_found'] = 'No attachments were found.'; +$txt['error_sp_no_polls_found'] = 'No polls were found.'; +$txt['error_sp_invalid_feed'] = 'Invalid feed.'; +$txt['error_sp_no_online'] = 'There aren\'t any users online.'; +$txt['error_sp_no_items_day'] = 'No calendar events were found.'; +$txt['error_sp_no_blog_found'] = 'There are no blog mods installed.'; +$txt['error_sp_no_blogs_found'] = 'No blogs were found.'; +$txt['error_sp_no_articles_found'] = 'There are no articles to display.'; +$txt['error_sp_no_shop_found'] = 'There are no shop mods installed.'; +$txt['error_sp_no_arcade_found'] = 'There are no arcade mods installed.'; +$txt['error_sp_no_stats_found'] = 'No statistics found.'; +$txt['error_sp_page_not_found'] = 'The page you requested cannot be found.'; +$txt['error_sp_shoutbox_not_exist'] = 'Sorry, this shoutbox does not exist.'; +$txt['error_sp_no_shoutbox'] = 'There either aren\'t any shoutboxes created yet or there aren\'t any shoutboxes that haven\'t already been published in a shoutbox block.'; +$txt['error_sp_no_shoutbox_sp_moderator'] = 'A new shoutbox can be created here.'; +$txt['error_sp_no_shoutbox_normaluser'] = 'Sorry, shoutbox blocks require a shoutbox to be created before you can display a shoutbox using a shoutbox block ! Please ask an administrator to create a new shoutbox.'; +$txt['error_sp_cannot_shoutbox_moderate'] = 'You don\'t have permission to moderate this shoutbox.'; +$txt['error_sp_no_block'] = 'There aren\'t any blocks created yet.'; +$txt['error_sp_flood_spsbp'] = 'Your last shout was less than %1$d seconds ago. Please try again later.'; + +?> \ No newline at end of file diff --git a/Themes/default/languages/SPortalAdmin.english-utf8.php b/Themes/default/languages/SPortalAdmin.english-utf8.php new file mode 100644 index 0000000..7afb2b8 --- /dev/null +++ b/Themes/default/languages/SPortalAdmin.english-utf8.php @@ -0,0 +1,500 @@ +Recommended value: Off'; +$txt['sp_disable_side_collapse'] = 'Disable Side Collapsing'; +$txt['portaltheme'] = 'Portal Theme'; +$txt['portalthemedefault'] = 'Forum Default'; +$txt['sp_resize_images'] = 'Resizes images on portal'; + +// Block settings +$txt['showleft'] = 'Enable Left Side Blocks'; +$txt['showright'] = 'Enable Right Side Blocks'; +$txt['leftwidth'] = 'Width of Left Side Blocks'; +$txt['rightwidth'] = 'Width of Right Side Blocks'; +$txt['sp_enableIntegration'] = 'Display Blocks in Forum'; +$txt['sp_IntegrationHide'] = 'Hide Blocks in Forum Areas
The Display blocks in Forum setting
must be enabled for this to work
'; + +// Article settings +$txt['articleactive'] = 'Enable Articles'; +$txt['articleperpage'] = 'Maximum Articles Per Page'; +$txt['articlelength'] = 'Maximum Characters Before Article Cut-off'; +$txt['articleavatar'] = 'Display Authors Avatar'; + +// Blocks area +$txt['sp-adminBlockListName'] = 'Block List'; +$txt['sp-adminBlockListDesc'] = 'This page displays a list of all blocks which have been created for the portal or the forum.'; +$txt['sp-adminBlockAddName'] = 'Add Block'; +$txt['sp-adminBlockAddDesc'] = 'This page enables new blocks to be created and added to the portal page or the forum.'; +$txt['sp-adminBlockLeftListDesc'] = 'This page displays a list of all left side blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockRightListDesc'] = 'This page displays a list of all right side blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockTopListDesc'] = 'This page displays a list of all top area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockBottomListDesc'] = 'This page displays a list of all bottom area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockHeaderListDesc'] = 'This page displays a list of all header area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockFooterListDesc'] = 'This page displays a list of all footer area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; + +// Block list +$txt['sp-blocksBlocks'] = 'Blocks'; +$txt['sp-blocksActive'] = 'Active'; +$txt['sp-blocksActivate'] = 'Activate'; +$txt['sp-blocksDeactivate'] = 'Deactivate'; +$txt['sp-blocksCreate'] = 'Create %s Block'; +$txt['sp-deleteblock'] = 'Are you sure you want to delete this block?'; +$txt['sp-blocks_select_destination'] = 'Select destination for block \'%1$s\''; +$txt['sp-blocks_move_here'] = 'Move block here'; +$txt['sp-blocks_cancel_moving'] = 'Cancel moving'; + +// Add/Edit blocks +$txt['sp-blocksSelectType'] = 'Select Block Type'; +$txt['sp-blocksAdd'] = 'Add Block'; +$txt['sp-blocksEdit'] = 'Edit Block'; +$txt['sp-blocksPreview'] = 'Preview'; +$txt['sp-blocksDefaultLabel'] = 'Untitled'; +$txt['sp-blocksDisabledBoth'] = 'Left and right side blocks are currently disabled'; +$txt['sp-blocksDisabledLeft'] = 'Left side blocks are currently disabled'; +$txt['sp-blocksDisabledRight'] = 'Right side blocks are currently disabled'; +$txt['sp-blocksContent'] = 'Content'; +$txt['sp-blocksColumn'] = 'Column'; +$txt['sp_admin_blocks_col_permissions'] = 'Permissions'; +$txt['sp_admin_blocks_permissions_set_custom'] = 'Custom'; +$txt['sp_admin_blocks_permissions_set_guests'] = 'Guests'; +$txt['sp_admin_blocks_permissions_set_members'] = 'Members'; +$txt['sp_admin_blocks_permissions_set_everyone'] = 'Everyone'; +$txt['sp_admin_blocks_col_custom_permissions'] = 'Custom Permissions'; +$txt['sp_admin_blocks_custom_permissions_membergroup'] = 'Membergroup'; +$txt['sp_admin_blocks_custom_permissions_allowed_short'] = 'A'; +$txt['sp_admin_blocks_custom_permissions_disallowed_short'] = 'X'; +$txt['sp_admin_blocks_custom_permissions_denied_short'] = 'D'; +$txt['sp_admin_blocks_custom_permissions_allowed'] = 'Allowed'; +$txt['sp_admin_blocks_custom_permissions_disallowed'] = 'Disallowed'; +$txt['sp_admin_blocks_custom_permissions_denied'] = 'Denied'; +$txt['sp-blocksRow'] = 'Order'; +$txt['sp-blocksForce'] = 'Not Collapsible'; +$txt['sp-blocksDisplayOptions'] = 'Display Options'; +$txt['sp-blocksAdvancedOptions'] = 'Advanced Options'; +$txt['sp-blocksShowBlock'] = 'Show Block On'; +$txt['sp-blocksOptionAllPages'] = 'All Pages'; +$txt['sp-blocksOptionAllActions'] = 'All Actions'; +$txt['sp-blocksOptionAllBoards'] = 'All Boards'; +$txt['sp-blocksOptionEverywhere'] = 'Everywhere'; +$txt['sp-blocksSelectActions'] = 'Select Actions'; +$txt['sp-blocksSelectBoards'] = 'Select Boards'; +$txt['sp-blocksSelectPages'] = 'Select Pages'; +$txt['sp_display_custom'] = 'Custom Display Options'; +$txt['sp-blocksStyleOptions'] = 'Style Options'; +$txt['sp-blocksTitleDefaultClass'] = 'Default Title Class'; +$txt['sp-blocksTitleCustomClass'] = 'Custom Title Class'; +$txt['sp-blocksTitleCustomStyle'] = 'Custom Title Style'; +$txt['sp-blocksBodyDefaultClass'] = 'Default Body Class'; +$txt['sp-blocksBodyCustomClass'] = 'Custom Body Class'; +$txt['sp-blocksBodyCustomStyle'] = 'Custom Body Style'; +$txt['sp-blocksNoTitle'] = 'No Title'; +$txt['sp-blocksNoBody'] = 'No Body'; + +// Block labels +$txt['sp_function_sp_userInfo_label'] = 'Member Information'; +$txt['sp_function_sp_latestMember_label'] = 'Latest Members'; +$txt['sp_function_sp_whosOnline_label'] = 'Who\'s Online'; +$txt['sp_function_sp_showPoll_label'] = 'Poll'; +$txt['sp_function_sp_boardStats_label'] = 'Board Statistics'; +$txt['sp_function_sp_quickSearch_label'] = 'Quick Search'; +$txt['sp_function_sp_topPoster_label'] = 'Top Poster'; +$txt['sp_function_sp_topStatsMember_label'] = 'Top Member Stats'; +$txt['sp_function_sp_topBoards_label'] = 'Top Boards'; +$txt['sp_function_sp_topTopics_label'] = 'Top Topics'; +$txt['sp_function_sp_recent_label'] = 'Recent Posts/Topics'; +$txt['sp_function_sp_boardNews_label'] = 'Board News'; +$txt['sp_function_sp_news_label'] = 'Forum News'; +$txt['sp_function_sp_attachmentImage_label'] = 'Recent Image Attachments'; +$txt['sp_function_sp_attachmentRecent_label'] = 'Recent Attachments'; +$txt['sp_function_sp_calendar_label'] = 'Calendar'; +$txt['sp_function_sp_calendarInformation_label'] = 'Calendar Information'; +$txt['sp_function_sp_rssFeed_label'] = 'RSS Feed'; +$txt['sp_function_sp_theme_select_label'] = 'Theme Selection'; +$txt['sp_function_sp_staff_label'] = 'Staff List'; +$txt['sp_function_sp_articles_label'] = 'Articles'; +$txt['sp_function_sp_shoutbox_label'] = 'Shoutbox'; +$txt['sp_function_sp_gallery_label'] = 'Gallery'; +$txt['sp_function_sp_arcade_label'] = 'Arcade'; +$txt['sp_function_sp_shop_label'] = 'Shop'; +$txt['sp_function_sp_blog_label'] = 'Blog'; +$txt['sp_function_sp_menu_label'] = 'Forum Menu'; +$txt['sp_function_sp_bbc_label'] = 'Custom BBC'; +$txt['sp_function_sp_html_label'] = 'Custom HTML'; +$txt['sp_function_sp_php_label'] = 'Custom PHP'; + +// Block descriptions +$txt['sp_function_sp_latestMember_desc'] = 'Displays the latest members and their registration dates.'; +$txt['sp_function_sp_userInfo_desc'] = 'Displays member information if the viewer is logged in, and a login box if the viewer is a guest.'; +$txt['sp_function_sp_whosOnline_desc'] = 'Displays the who\'s online list.'; +$txt['sp_function_sp_showPoll_desc'] = 'Displays a poll with voting options if the viewer can vote, or the results if the viewer is unable to vote.'; +$txt['sp_function_sp_boardStats_desc'] = 'Displays some statistical information about the forum.'; +$txt['sp_function_sp_quickSearch_desc'] = 'Displays a simple quick search form.'; +$txt['sp_function_sp_topPoster_desc'] = 'Displays the top posters with their post count and avatars.'; +$txt['sp_function_sp_topStatsMember_desc'] = 'Displays various types of member stats.'; +$txt['sp_function_sp_topBoards_desc'] = 'Displays a list of boards according to their activity.'; +$txt['sp_function_sp_topTopics_desc'] = 'Displays a list topics according to their activity.'; +$txt['sp_function_sp_recent_desc'] = 'Displays a list of the forums recent posts or topics.'; +$txt['sp_function_sp_boardNews_desc'] = 'Displays a list of posts from a selected board.'; +$txt['sp_function_sp_news_desc'] = 'Displays a random news line.'; +$txt['sp_function_sp_attachmentImage_desc'] = 'Displays a list of recently attached images.'; +$txt['sp_function_sp_attachmentRecent_desc'] = 'Displays a list of recent attachments.'; +$txt['sp_function_sp_calendar_desc'] = 'Displays a full month calendar with all events.'; +$txt['sp_function_sp_calendarInformation_desc'] = 'Displays calendar information such as birthdays, events and holidays.'; +$txt['sp_function_sp_rssFeed_desc'] = 'Displays an RSS Feed.'; +$txt['sp_function_sp_theme_select_desc'] = 'Displays a list of available themes and allows members to select one.'; +$txt['sp_function_sp_staff_desc'] = 'Displays list of forum staff with their position and avatar.'; +$txt['sp_function_sp_articles_desc'] = 'Displays recent or random articles.'; +$txt['sp_function_sp_shoutbox_desc'] = 'Displays a shoutbox.'; +$txt['sp_function_sp_gallery_desc'] = 'Displays a list of recent gallery items.'; +$txt['sp_function_sp_arcade_desc'] = 'Displays various statistics from the arcade if an arcade mod is installed.'; +$txt['sp_function_sp_shop_desc'] = 'Displays the richest members or various items from the shop if a shop mod is installed.'; +$txt['sp_function_sp_blog_desc'] = 'Displays various information from the forum blog.'; +$txt['sp_function_sp_menu_desc'] = 'Displays a vertical forum menu.'; +$txt['sp_function_sp_bbc_desc'] = 'A custom block where BBC content can be added.'; +$txt['sp_function_sp_html_desc'] = 'A custom block where HTML content can be added.'; +$txt['sp_function_sp_php_desc'] = 'A custom block where PHP content can be added.'; + +// Block parameters +$txt['sp_param_sp_latestMember_limit'] = 'Members to Show'; +$txt['sp_param_sp_whosOnline_online_today'] = 'Users Online Today'; +$txt['sp_param_sp_boardStats_averages'] = 'Show Averages'; +$txt['sp_param_sp_topPoster_limit'] = 'Top Posters to Display'; +$txt['sp_param_sp_topPoster_type'] = 'Display'; +$txt['sp_param_sp_topStatsMember_type'] = 'Type of the Top Member List'; +$txt['sp_param_sp_topStatsMember_limit'] = 'Members to display'; +$txt['sp_param_sp_topStatsMember_enable_label'] = 'Enable label for list'; +$txt['sp_param_sp_topStatsMember_list_label'] = 'List label'; +$txt['sp_param_sp_topStatsMember_sort_asc'] = 'Sort in reverse order'; +$txt['sp_param_sp_topStatsMember_last_active_limit'] = 'Remove inactive Members from the List
(Time in days)'; +$txt['sp_param_sp_recent_limit'] = 'Recent Posts or Topics to Display'; +$txt['sp_param_sp_recent_type'] = 'Display'; +$txt['sp_param_sp_recent_display'] = 'Display type'; +$txt['sp_param_sp_recent_boards'] = 'Include boards'; +$txt['sp_param_sp_topTopics_type'] = 'Sorting Type'; +$txt['sp_param_sp_topTopics_limit'] = 'Topics to Display'; +$txt['sp_param_sp_topBoards_limit'] = 'Boards to Display'; +$txt['sp_param_sp_showPoll_topic'] = 'Topic ID'; +$txt['sp_param_sp_showPoll_type'] = 'Type'; +$txt['sp_param_sp_boardNews_board'] = 'Boards'; +$txt['sp_param_sp_boardNews_limit'] = 'Topics to Display'; +$txt['sp_param_sp_boardNews_start'] = 'Starting Post ID'; +$txt['sp_param_sp_boardNews_length'] = 'Maximum Characters'; +$txt['sp_param_sp_boardNews_avatar'] = 'Display Avatars'; +$txt['sp_param_sp_boardNews_per_page'] = 'Posts Per Page'; +$txt['sp_param_sp_attachmentImage_limit'] = 'Images to Display'; +$txt['sp_param_sp_attachmentImage_direction'] = 'List Direction'; +$txt['sp_param_sp_attachmentImage_disablePoster'] = 'Remove Image Poster\'s Name'; +$txt['sp_param_sp_attachmentImage_disableDownloads'] = 'Remove image Download'; +$txt['sp_param_sp_attachmentImage_disableLink'] = 'Remove Image Download Link'; +$txt['sp_param_sp_attachmentRecent_limit'] = 'Attachments to Display'; +$txt['sp_param_sp_calendar_events'] = 'Show Events'; +$txt['sp_param_sp_calendar_birthdays'] = 'Show Birthdays'; +$txt['sp_param_sp_calendar_holidays'] = 'Show Holidays'; +$txt['sp_param_sp_calendarInformation_events'] = 'Show Events'; +$txt['sp_param_sp_calendarInformation_future'] = 'Number of days in future to show events'; +$txt['sp_param_sp_calendarInformation_birthdays'] = 'Show Birthdays'; +$txt['sp_param_sp_calendarInformation_holidays'] = 'Show Holidays'; +$txt['sp_param_sp_rssFeed_url'] = 'Feed URL'; +$txt['sp_param_sp_rssFeed_show_title'] = 'Show Title'; +$txt['sp_param_sp_rssFeed_show_content'] = 'Show Content'; +$txt['sp_param_sp_rssFeed_show_date'] = 'Show Date'; +$txt['sp_param_sp_rssFeed_strip_preserve'] = 'Tags to Preserve'; +$txt['sp_param_sp_rssFeed_count'] = 'Items to Show'; +$txt['sp_param_sp_rssFeed_limit'] = 'Character Limit'; +$txt['sp_param_sp_staff_lmod'] = 'Disable Local Moderators'; +$txt['sp_param_sp_articles_category'] = 'Category'; +$txt['sp_param_sp_articles_limit'] = 'Articles to Display'; +$txt['sp_param_sp_articles_type'] = 'Display Type'; +$txt['sp_param_sp_articles_image'] = 'Image'; +$txt['sp_param_sp_shoutbox_shoutbox'] = 'Shoutbox to Display'; +$txt['sp_param_sp_gallery_limit'] = 'Items to Display'; +$txt['sp_param_sp_gallery_type'] = 'Display'; +$txt['sp_param_sp_gallery_direction'] = 'List Direction'; +$txt['sp_param_sp_arcade_limit'] = 'Items to display'; +$txt['sp_param_sp_arcade_type'] = 'Display'; +$txt['sp_param_sp_shop_style'] = 'Display'; +$txt['sp_param_sp_shop_limit'] = 'Items to display'; +$txt['sp_param_sp_shop_type'] = 'Money type'; +$txt['sp_param_sp_shop_sort'] = 'Item type'; +$txt['sp_param_sp_blog_limit'] = 'Items to Display'; +$txt['sp_param_sp_blog_type'] = 'Item Type'; +$txt['sp_param_sp_blog_sort'] = 'Display'; +$txt['sp_param_sp_html_content'] = 'Custom HTML'; +$txt['sp_param_sp_bbc_content'] = 'Custom BBC'; +$txt['sp_param_sp_php_content'] = 'Custom PHP'; + +// Parameter options +$txt['sp_param_sp_topPoster_type_options'] = 'All Time|Today|This Week|This Month'; +$txt['sp_param_sp_topStatsMember_type_options'] = 'Total Time Logged In|Posts|Good Karma|Bad Karma|Total Karma|Thank-O-Matic Top Given|Thank-O-Matic Top Received|Automatic Karma Good|Automatic Karma Bad|Automatic Karma Total|Advanced Reputation System Best|Advanced Reputation System Worst'; +$txt['sp_param_sp_recent_type_options'] = 'Posts|Topics'; +$txt['sp_param_sp_recent_display_options'] = 'Compact|Full'; +$txt['sp_param_sp_topTopics_type_options'] = 'Replies|Views'; +$txt['sp_param_sp_showPoll_type_options'] = 'Normal|Recent|Random'; +$txt['sp_param_sp_attachmentImage_direction_options'] = 'Vertical|Horizontal'; +$txt['sp_param_sp_articles_type_options'] = 'Latest|Random'; +$txt['sp_param_sp_articles_image_options'] = 'None|Poster Avatar|Category Image'; +$txt['sp_param_sp_gallery_type_options'] = 'Latest|Random'; +$txt['sp_param_sp_gallery_direction_options'] = 'Vertical|Horizontal'; +$txt['sp_param_sp_arcade_type_options'] = 'Most Played|Best Players|Longest Champ'; +$txt['sp_param_sp_shop_style_options'] = 'Members|Items'; +$txt['sp_param_sp_shop_type_options'] = 'Total|Pocket|Bank'; +$txt['sp_param_sp_shop_sort_options'] = 'Recent|Random'; +$txt['sp_param_sp_blog_type_options'] = 'Articles|Blogs'; +$txt['sp_param_sp_blog_sort_options'] = 'Latest|Random'; + +// Articles area +$txt['sp-adminArticleListName'] = 'Article List'; +$txt['sp-adminArticleListDesc'] = 'This page displays a list of all topics that have been added as articles. These can be modified by selecting the appropriate options.'; +$txt['sp-adminArticleAddName'] = 'Add Article'; +$txt['sp-adminArticleAddDesc'] = 'This page enables articles to be added to the portal page.'; +$txt['sp-adminArticleAddNoTopics'] = 'This board has no remaining topics that can be added as articles.'; + +// Article list +$txt['sp-articlesRemove'] = 'Remove Selected'; +$txt['sp-articlesConfirm'] = 'Are you sure you want to delete these articles?'; +$txt['sp-articlesDeleteConfirm'] = 'Are you sure you want to delete this article?'; + +// Add/Edit articles +$txt['sp-articlesAdd'] = 'Add Article'; +$txt['sp-articlesEdit'] = 'Edit Article'; +$txt['sp-articlesCategory'] = 'Article Category'; +$txt['sp-articlesApproved'] = 'Approved'; + +// Categories area +$txt['sp-adminCategoryListName'] = 'Category List'; +$txt['sp-adminCategoryListDesc'] = 'This page displays a list of article categories that have been created. These can be modified by selecting the appropriate options.'; +$txt['sp-adminCategoryAddName'] = 'Add Category'; +$txt['sp-adminCategoryAddDesc'] = 'This page enables new categories to be added for articles to be placed in.'; + +// Category list +$txt['sp-categoriesCategories'] = 'Categories'; + +// Add/Edit category +$txt['sp-categoriesAdd'] = 'Add Category'; +$txt['sp-categoriesEdit'] = 'Edit Category'; +$txt['sp-categoriesName'] = 'Name'; +$txt['sp-categoriesPicture'] = 'Image URL'; +$txt['sp-categoriesPublish'] = 'Publish on Portal'; + +// Delete category +$txt['sp-categoriesDelete'] = 'Delete Category'; +$txt['sp-categoriesDeleteCount'] = 'There are %s article(s) in this category.'; +$txt['sp-categoriesDeleteOption1'] = 'Do you want to move these articles to another category?'; +$txt['sp-categoriesDeleteOption2'] = 'By deleting this category your articles will also be deleted.'; +$txt['sp-categoriesDeleteConfirm'] = 'Are you sure you wish to delete this category?'; +$txt['sp-categoriesMove'] = 'Move'; +$txt['sp-categoriesMoveTo'] = 'Move To'; + +// Block list titles +$txt['sp-adminColumnType'] = 'Type'; +$txt['sp-adminColumnMove'] = 'Move'; + +// Article list titles +$txt['sp-adminColumnTopic'] = 'Topic'; +$txt['sp-adminColumnBoard'] = 'Board'; +$txt['sp-adminColumnPoster'] = 'Poster'; +$txt['sp-adminColumnTime'] = 'Time'; +$txt['sp-adminColumnCategory'] = 'Category'; +$txt['sp-adminColumnApproved'] = 'Approved'; + +// Category list titles +$txt['sp-adminColumnPicture'] = 'Picture'; +$txt['sp-adminColumnArticles'] = 'Articles'; +$txt['sp-adminColumnPublish'] = 'Publish'; + +// Pages Area +$txt['sp_admin_pages_title'] = 'Pages'; +$txt['sp_admin_pages_list'] = 'Page List'; +$txt['sp_admin_pages_add'] = 'Add Page'; +$txt['sp_admin_pages_edit'] = 'Edit Page'; +$txt['sp_admin_pages_remove'] = 'Remove Pages'; +$txt['sp_admin_pages_preview'] = 'Preview'; +$txt['sp_admin_pages_general'] = 'General Settings'; +$txt['sp_admin_pages_style'] = 'Style Options'; + +$txt['sp_admin_pages_desc'] = 'You can create and manage SimplePortal pages in this area.'; +$txt['sp_pages_remove_confirm'] = 'Are you sure that you want to remove the selected pages?'; +$txt['sp_admin_pages_delete_confirm'] = 'Are you sure you want to delete this page?'; +$txt['sp_error_no_pages'] = 'There are no pages available.'; +$txt['sp_error_page_name_empty'] = 'Sorry, you left the page name empty.'; +$txt['sp_error_page_namespace_empty'] = 'Sorry, you left the page ID empty.'; +$txt['sp_error_page_namespace_duplicate'] = 'Sorry, that page ID is already in use.'; +$txt['sp_error_page_namespace_invalid_chars'] = 'Sorry, there are invalid characters in the page ID. Page ID\'s can only contain letters, numbers and underscores.'; +$txt['sp_error_page_namespace_numeric'] = 'Sorry, page ID\'s cannot be only numbers. Page ID\'s need letters, and or an underscore'; + +$txt['sp_admin_pages_col_title'] = 'Title'; +$txt['sp_admin_pages_col_namespace'] = 'Page ID'; +$txt['sp_admin_pages_col_body'] = 'Body'; +$txt['sp_admin_pages_col_type'] = 'Type'; +$txt['sp_admin_pages_col_views'] = 'Views'; +$txt['sp_admin_pages_col_status'] = 'Active'; +$txt['sp_admin_pages_col_actions'] = 'Actions'; +$txt['sp_admin_pages_col_permissions'] = 'Permissions'; +$txt['sp_admin_pages_permissions_set_custom'] = 'Custom'; +$txt['sp_admin_pages_permissions_set_guests'] = 'Guests'; +$txt['sp_admin_pages_permissions_set_members'] = 'Members'; +$txt['sp_admin_pages_permissions_set_everyone'] = 'Everyone'; +$txt['sp_admin_pages_col_custom_permissions'] = 'Custom Permissions'; +$txt['sp_admin_pages_custom_permissions_membergroup'] = 'Membergroup'; +$txt['sp_admin_pages_custom_permissions_allowed_short'] = 'A'; +$txt['sp_admin_pages_custom_permissions_disallowed_short'] = 'X'; +$txt['sp_admin_pages_custom_permissions_denied_short'] = 'D'; +$txt['sp_admin_pages_custom_permissions_allowed'] = 'Allowed'; +$txt['sp_admin_pages_custom_permissions_disallowed'] = 'Disallowed'; +$txt['sp_admin_pages_custom_permissions_denied'] = 'Denied'; +$txt['sp_admin_pages_col_blocks'] = 'Blocks'; +$txt['sp_admin_pages_activate'] = 'Activate'; +$txt['sp_admin_pages_deactivate'] = 'Deactivate'; + +$txt['sp_pages_default_title'] = 'Untitled Page'; + +$txt['sp_pages_type_bbc'] = 'BBC'; +$txt['sp_pages_type_html'] = 'HTML'; +$txt['sp_pages_type_php'] = 'PHP'; + +// Shoutboxes Area +$txt['sp_admin_shoutbox_title'] = 'Shoutbox'; +$txt['sp_admin_shoutbox_list'] = 'Shoutbox List'; +$txt['sp_admin_shoutbox_add'] = 'Add Shoutbox'; +$txt['sp_admin_shoutbox_edit'] = 'Edit Shoutbox'; +$txt['sp_admin_shoutbox_prune'] = 'Prune Shoutbox'; +$txt['sp_admin_shoutbox_remove'] = 'Remove Shoutboxes'; + +$txt['sp_admin_shoutbox_desc'] = 'You can create and manage SimplePortal shoutboxes in this area.'; +$txt['sp_shoutbox_remove_confirm'] = 'Are you sure that you want to remove the selected shoutboxes?'; +$txt['sp_admin_shoutbox_delete_confirm'] = 'Are you sure you want to delete this shoutbox?'; +$txt['sp_error_no_shoutbox'] = 'There are no shoutboxes available.'; +$txt['sp_error_shoutbox_name_duplicate'] = 'Sorry, there is already a shoutbox with that name.'; + +$txt['sp_admin_shoutbox_col_name'] = 'Name'; +$txt['sp_admin_shoutbox_col_shouts'] = 'Shouts'; +$txt['sp_admin_shoutbox_col_caching'] = 'Caching'; +$txt['sp_admin_shoutbox_col_status'] = 'Status'; +$txt['sp_admin_shoutbox_col_actions'] = 'Actions'; +$txt['sp_admin_shoutbox_col_permissions'] = 'Permissions'; +$txt['sp_admin_shoutbox_permissions_set_custom'] = 'Custom'; +$txt['sp_admin_shoutbox_permissions_set_guests'] = 'Guests'; +$txt['sp_admin_shoutbox_permissions_set_members'] = 'Members'; +$txt['sp_admin_shoutbox_permissions_set_everyone'] = 'Everyone'; +$txt['sp_admin_shoutbox_col_custom_permissions'] = 'Custom Permissions'; +$txt['sp_admin_shoutbox_custom_permissions_membergroup'] = 'Membergroup'; +$txt['sp_admin_shoutbox_custom_permissions_allowed_short'] = 'A'; +$txt['sp_admin_shoutbox_custom_permissions_disallowed_short'] = 'X'; +$txt['sp_admin_shoutbox_custom_permissions_denied_short'] = 'D'; +$txt['sp_admin_shoutbox_custom_permissions_allowed'] = 'Allowed'; +$txt['sp_admin_shoutbox_custom_permissions_disallowed'] = 'Disallowed'; +$txt['sp_admin_shoutbox_custom_permissions_denied'] = 'Denied'; +$txt['sp_admin_shoutbox_col_moderators'] = 'Moderators'; +$txt['sp_admin_shoutbox_col_reverse'] = 'Reverse Order'; +$txt['sp_admin_shoutbox_activate'] = 'Activate'; +$txt['sp_admin_shoutbox_deactivate'] = 'Deactivate'; + +$txt['sp_shoutbox_default_name'] = 'Untitled Shoutbox'; + +$txt['sp_admin_shoutbox_col_warning'] = 'Warning'; +$txt['sp_admin_shoutbox_col_bbc'] = 'Allowed BBC'; +$txt['sp_admin_shoutbox_col_height'] = 'Height(pixels)'; +$txt['sp_admin_shoutbox_col_num_show'] = 'Shouts to display'; +$txt['sp_admin_shoutbox_col_num_max'] = 'Maximum shouts'; +$txt['sp_admin_shoutbox_col_refresh'] = 'Auto refresh(seconds)'; + +$txt['sp_admin_shoutbox_opt_all'] = 'Delete all shouts'; +$txt['sp_admin_shoutbox_opt_days'] = 'Delete shouts older than a number of days'; +$txt['sp_admin_shoutbox_opt_member'] = 'Delete shouts posted by a member'; + +$txt['sp_admin_shoutbox_block_redirect_message'] = '

Congratulations, you have created a new shoutbox!

+

Although it won\'t be displayed anywhere within your forum yet. You will need to create a shoutbox block before your users can use the shoutbox.

+

Click here to create a new shoutbox block for this shoutbox.

+

Click here to continue to your list of shoutboxes.

'; + +// General titles +$txt['sp-adminColumnAction'] = 'Action'; +$txt['sp-adminColumnName'] = 'Name'; + +// Miscellaneous strings +$txt['sp-positionLeft'] = 'Left'; +$txt['sp-positionTop'] = 'Top'; +$txt['sp-positionBottom'] = 'Bottom'; +$txt['sp-positionRight'] = 'Right'; +$txt['sp-positionHeader'] = 'Header'; +$txt['sp-positionFooter'] = 'Footer'; +$txt['sp-placementBefore'] = 'Before'; +$txt['sp-placementAfter'] = 'After'; +$txt['sp-placementUnchanged'] = 'Unchanged'; +$txt['sp-stateYes'] = 'Yes'; +$txt['sp-stateNo'] = 'No'; + +// Information area +$txt['sp-info_title'] = 'Information'; +$txt['sp-info_desc'] = 'Some useful system, and SimplePortal information.'; +$txt['sp-info_live'] = 'Live from SimplePortal...'; +$txt['sp-info_no_live'] = 'Sorry! At this time you are unable to connect to simpleportal.net\'s latest news file.'; +$txt['sp-info_general'] = 'General Information'; +$txt['sp-info_versions'] = 'Version Information'; +$txt['sp-info_your_version'] = 'Your Version'; +$txt['sp-info_current_version'] = 'Current Version'; +$txt['sp-info_managers'] = 'Managers'; +$txt['sp-info_intro'] = 'The SimplePortal Team wants to thank everyone who helped make SimplePortal what it is today, and the Simple Machines Team for the great forum software, SMF. It wouldn\'t have been possible without you, our users, and SMF.'; +$txt['sp-info_team'] = 'The Team'; +$txt['sp-info_special'] = 'Special Thanks'; +$txt['sp-info_and'] = 'and'; +$txt['sp-info_anyone'] = 'For anyone we may have missed, thank you!'; +$txt['sp-info_groups_pm'] = 'Project Managers'; +$txt['sp-info_groups_dev'] = 'Developers'; +$txt['sp-info_groups_support'] = 'Support Specialists'; +$txt['sp-info_groups_customize'] = 'Customizers'; +$txt['sp-info_groups_language'] = 'Language Managers'; +$txt['sp-info_groups_marketing'] = 'Marketing'; +$txt['sp-info_groups_beta'] = 'Beta Testers'; +$txt['sp-info_groups_translators'] = 'Language Translators'; +$txt['sp-info_translators_message'] = 'Thank you for your efforts in the internationalization of SimplePortal.'; +$txt['sp-info_groups_founder'] = 'Founding Father of SimplePortal'; +$txt['sp-info_groups_orignal_pm'] = 'Original Project Managers'; +$txt['sp-info_fam_fam'] = 'Pretty Icons'; +$txt['sp-info_fam_fam_message'] = 'Mark James for his Fam Fam Fam Silk Icons.'; +$txt['sp-info_contribute'] = 'Did you find SimplePortal useful? Contribute to the project!'; + +// Permissions +$txt['permissiongroup_sp'] = 'SimplePortal'; +$txt['permissiongroup_simple_sp'] = 'SimplePortal'; +$txt['permissionname_sp_admin'] = 'Administrate portal'; +$txt['permissionhelp_sp_admin'] = 'This permission allows users to administrate SimplePortal.'; +$txt['permissionname_sp_manage_settings'] = 'Manage portal settings'; +$txt['permissionhelp_sp_manage_settings'] = 'This permission allows users to manage SimplePortal settings.'; +$txt['permissionname_sp_manage_blocks'] = 'Manage portal blocks'; +$txt['permissionhelp_sp_manage_blocks'] = 'This permission allows users to manage SimplePortal blocks.'; +$txt['permissionname_sp_manage_articles'] = 'Manage portal articles'; +$txt['permissionhelp_sp_manage_articles'] = 'This permission allows users to manage SimplePortal articles.'; +$txt['permissionname_sp_manage_pages'] = 'Manage portal pages'; +$txt['permissionhelp_sp_manage_pages'] = 'This permission allows users to manage SimplePortal pages.'; +$txt['permissionname_sp_manage_shoutbox'] = 'Manage portal shoutboxes'; +$txt['permissionhelp_sp_manage_shoutbox'] = 'This permission allows users to manage SimplePortal shoutboxes.'; +$txt['permissionname_sp_add_article'] = 'Can add article'; +$txt['permissionhelp_sp_add_article'] = 'This permission allows users to add articles.'; +$txt['permissionname_sp_auto_article_approval'] = 'Automatic article approval'; +$txt['permissionhelp_sp_auto_article_approval'] = 'This permission allows users to add articles without requiring approval.'; +$txt['permissionname_sp_remove_article'] = 'Can remove article'; +$txt['permissionhelp_sp_remove_article'] = 'This permission allows users to remove articles.'; + +// Compatibility strings +$txt['sp-adminCatHelp'] = 'Here you can manage and configure SimplePortal.'; +$txt['sp-adminCatDesc'] = 'Here you can manage and configure SimplePortal.'; + +?> \ No newline at end of file diff --git a/Themes/default/languages/SPortalAdmin.english.php b/Themes/default/languages/SPortalAdmin.english.php new file mode 100644 index 0000000..7afb2b8 --- /dev/null +++ b/Themes/default/languages/SPortalAdmin.english.php @@ -0,0 +1,500 @@ +Recommended value: Off'; +$txt['sp_disable_side_collapse'] = 'Disable Side Collapsing'; +$txt['portaltheme'] = 'Portal Theme'; +$txt['portalthemedefault'] = 'Forum Default'; +$txt['sp_resize_images'] = 'Resizes images on portal'; + +// Block settings +$txt['showleft'] = 'Enable Left Side Blocks'; +$txt['showright'] = 'Enable Right Side Blocks'; +$txt['leftwidth'] = 'Width of Left Side Blocks'; +$txt['rightwidth'] = 'Width of Right Side Blocks'; +$txt['sp_enableIntegration'] = 'Display Blocks in Forum'; +$txt['sp_IntegrationHide'] = 'Hide Blocks in Forum Areas
The Display blocks in Forum setting
must be enabled for this to work
'; + +// Article settings +$txt['articleactive'] = 'Enable Articles'; +$txt['articleperpage'] = 'Maximum Articles Per Page'; +$txt['articlelength'] = 'Maximum Characters Before Article Cut-off'; +$txt['articleavatar'] = 'Display Authors Avatar'; + +// Blocks area +$txt['sp-adminBlockListName'] = 'Block List'; +$txt['sp-adminBlockListDesc'] = 'This page displays a list of all blocks which have been created for the portal or the forum.'; +$txt['sp-adminBlockAddName'] = 'Add Block'; +$txt['sp-adminBlockAddDesc'] = 'This page enables new blocks to be created and added to the portal page or the forum.'; +$txt['sp-adminBlockLeftListDesc'] = 'This page displays a list of all left side blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockRightListDesc'] = 'This page displays a list of all right side blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockTopListDesc'] = 'This page displays a list of all top area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockBottomListDesc'] = 'This page displays a list of all bottom area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockHeaderListDesc'] = 'This page displays a list of all header area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; +$txt['sp-adminBlockFooterListDesc'] = 'This page displays a list of all footer area blocks which have been created. These blocks can be modified by selecting the appropriate options.'; + +// Block list +$txt['sp-blocksBlocks'] = 'Blocks'; +$txt['sp-blocksActive'] = 'Active'; +$txt['sp-blocksActivate'] = 'Activate'; +$txt['sp-blocksDeactivate'] = 'Deactivate'; +$txt['sp-blocksCreate'] = 'Create %s Block'; +$txt['sp-deleteblock'] = 'Are you sure you want to delete this block?'; +$txt['sp-blocks_select_destination'] = 'Select destination for block \'%1$s\''; +$txt['sp-blocks_move_here'] = 'Move block here'; +$txt['sp-blocks_cancel_moving'] = 'Cancel moving'; + +// Add/Edit blocks +$txt['sp-blocksSelectType'] = 'Select Block Type'; +$txt['sp-blocksAdd'] = 'Add Block'; +$txt['sp-blocksEdit'] = 'Edit Block'; +$txt['sp-blocksPreview'] = 'Preview'; +$txt['sp-blocksDefaultLabel'] = 'Untitled'; +$txt['sp-blocksDisabledBoth'] = 'Left and right side blocks are currently disabled'; +$txt['sp-blocksDisabledLeft'] = 'Left side blocks are currently disabled'; +$txt['sp-blocksDisabledRight'] = 'Right side blocks are currently disabled'; +$txt['sp-blocksContent'] = 'Content'; +$txt['sp-blocksColumn'] = 'Column'; +$txt['sp_admin_blocks_col_permissions'] = 'Permissions'; +$txt['sp_admin_blocks_permissions_set_custom'] = 'Custom'; +$txt['sp_admin_blocks_permissions_set_guests'] = 'Guests'; +$txt['sp_admin_blocks_permissions_set_members'] = 'Members'; +$txt['sp_admin_blocks_permissions_set_everyone'] = 'Everyone'; +$txt['sp_admin_blocks_col_custom_permissions'] = 'Custom Permissions'; +$txt['sp_admin_blocks_custom_permissions_membergroup'] = 'Membergroup'; +$txt['sp_admin_blocks_custom_permissions_allowed_short'] = 'A'; +$txt['sp_admin_blocks_custom_permissions_disallowed_short'] = 'X'; +$txt['sp_admin_blocks_custom_permissions_denied_short'] = 'D'; +$txt['sp_admin_blocks_custom_permissions_allowed'] = 'Allowed'; +$txt['sp_admin_blocks_custom_permissions_disallowed'] = 'Disallowed'; +$txt['sp_admin_blocks_custom_permissions_denied'] = 'Denied'; +$txt['sp-blocksRow'] = 'Order'; +$txt['sp-blocksForce'] = 'Not Collapsible'; +$txt['sp-blocksDisplayOptions'] = 'Display Options'; +$txt['sp-blocksAdvancedOptions'] = 'Advanced Options'; +$txt['sp-blocksShowBlock'] = 'Show Block On'; +$txt['sp-blocksOptionAllPages'] = 'All Pages'; +$txt['sp-blocksOptionAllActions'] = 'All Actions'; +$txt['sp-blocksOptionAllBoards'] = 'All Boards'; +$txt['sp-blocksOptionEverywhere'] = 'Everywhere'; +$txt['sp-blocksSelectActions'] = 'Select Actions'; +$txt['sp-blocksSelectBoards'] = 'Select Boards'; +$txt['sp-blocksSelectPages'] = 'Select Pages'; +$txt['sp_display_custom'] = 'Custom Display Options'; +$txt['sp-blocksStyleOptions'] = 'Style Options'; +$txt['sp-blocksTitleDefaultClass'] = 'Default Title Class'; +$txt['sp-blocksTitleCustomClass'] = 'Custom Title Class'; +$txt['sp-blocksTitleCustomStyle'] = 'Custom Title Style'; +$txt['sp-blocksBodyDefaultClass'] = 'Default Body Class'; +$txt['sp-blocksBodyCustomClass'] = 'Custom Body Class'; +$txt['sp-blocksBodyCustomStyle'] = 'Custom Body Style'; +$txt['sp-blocksNoTitle'] = 'No Title'; +$txt['sp-blocksNoBody'] = 'No Body'; + +// Block labels +$txt['sp_function_sp_userInfo_label'] = 'Member Information'; +$txt['sp_function_sp_latestMember_label'] = 'Latest Members'; +$txt['sp_function_sp_whosOnline_label'] = 'Who\'s Online'; +$txt['sp_function_sp_showPoll_label'] = 'Poll'; +$txt['sp_function_sp_boardStats_label'] = 'Board Statistics'; +$txt['sp_function_sp_quickSearch_label'] = 'Quick Search'; +$txt['sp_function_sp_topPoster_label'] = 'Top Poster'; +$txt['sp_function_sp_topStatsMember_label'] = 'Top Member Stats'; +$txt['sp_function_sp_topBoards_label'] = 'Top Boards'; +$txt['sp_function_sp_topTopics_label'] = 'Top Topics'; +$txt['sp_function_sp_recent_label'] = 'Recent Posts/Topics'; +$txt['sp_function_sp_boardNews_label'] = 'Board News'; +$txt['sp_function_sp_news_label'] = 'Forum News'; +$txt['sp_function_sp_attachmentImage_label'] = 'Recent Image Attachments'; +$txt['sp_function_sp_attachmentRecent_label'] = 'Recent Attachments'; +$txt['sp_function_sp_calendar_label'] = 'Calendar'; +$txt['sp_function_sp_calendarInformation_label'] = 'Calendar Information'; +$txt['sp_function_sp_rssFeed_label'] = 'RSS Feed'; +$txt['sp_function_sp_theme_select_label'] = 'Theme Selection'; +$txt['sp_function_sp_staff_label'] = 'Staff List'; +$txt['sp_function_sp_articles_label'] = 'Articles'; +$txt['sp_function_sp_shoutbox_label'] = 'Shoutbox'; +$txt['sp_function_sp_gallery_label'] = 'Gallery'; +$txt['sp_function_sp_arcade_label'] = 'Arcade'; +$txt['sp_function_sp_shop_label'] = 'Shop'; +$txt['sp_function_sp_blog_label'] = 'Blog'; +$txt['sp_function_sp_menu_label'] = 'Forum Menu'; +$txt['sp_function_sp_bbc_label'] = 'Custom BBC'; +$txt['sp_function_sp_html_label'] = 'Custom HTML'; +$txt['sp_function_sp_php_label'] = 'Custom PHP'; + +// Block descriptions +$txt['sp_function_sp_latestMember_desc'] = 'Displays the latest members and their registration dates.'; +$txt['sp_function_sp_userInfo_desc'] = 'Displays member information if the viewer is logged in, and a login box if the viewer is a guest.'; +$txt['sp_function_sp_whosOnline_desc'] = 'Displays the who\'s online list.'; +$txt['sp_function_sp_showPoll_desc'] = 'Displays a poll with voting options if the viewer can vote, or the results if the viewer is unable to vote.'; +$txt['sp_function_sp_boardStats_desc'] = 'Displays some statistical information about the forum.'; +$txt['sp_function_sp_quickSearch_desc'] = 'Displays a simple quick search form.'; +$txt['sp_function_sp_topPoster_desc'] = 'Displays the top posters with their post count and avatars.'; +$txt['sp_function_sp_topStatsMember_desc'] = 'Displays various types of member stats.'; +$txt['sp_function_sp_topBoards_desc'] = 'Displays a list of boards according to their activity.'; +$txt['sp_function_sp_topTopics_desc'] = 'Displays a list topics according to their activity.'; +$txt['sp_function_sp_recent_desc'] = 'Displays a list of the forums recent posts or topics.'; +$txt['sp_function_sp_boardNews_desc'] = 'Displays a list of posts from a selected board.'; +$txt['sp_function_sp_news_desc'] = 'Displays a random news line.'; +$txt['sp_function_sp_attachmentImage_desc'] = 'Displays a list of recently attached images.'; +$txt['sp_function_sp_attachmentRecent_desc'] = 'Displays a list of recent attachments.'; +$txt['sp_function_sp_calendar_desc'] = 'Displays a full month calendar with all events.'; +$txt['sp_function_sp_calendarInformation_desc'] = 'Displays calendar information such as birthdays, events and holidays.'; +$txt['sp_function_sp_rssFeed_desc'] = 'Displays an RSS Feed.'; +$txt['sp_function_sp_theme_select_desc'] = 'Displays a list of available themes and allows members to select one.'; +$txt['sp_function_sp_staff_desc'] = 'Displays list of forum staff with their position and avatar.'; +$txt['sp_function_sp_articles_desc'] = 'Displays recent or random articles.'; +$txt['sp_function_sp_shoutbox_desc'] = 'Displays a shoutbox.'; +$txt['sp_function_sp_gallery_desc'] = 'Displays a list of recent gallery items.'; +$txt['sp_function_sp_arcade_desc'] = 'Displays various statistics from the arcade if an arcade mod is installed.'; +$txt['sp_function_sp_shop_desc'] = 'Displays the richest members or various items from the shop if a shop mod is installed.'; +$txt['sp_function_sp_blog_desc'] = 'Displays various information from the forum blog.'; +$txt['sp_function_sp_menu_desc'] = 'Displays a vertical forum menu.'; +$txt['sp_function_sp_bbc_desc'] = 'A custom block where BBC content can be added.'; +$txt['sp_function_sp_html_desc'] = 'A custom block where HTML content can be added.'; +$txt['sp_function_sp_php_desc'] = 'A custom block where PHP content can be added.'; + +// Block parameters +$txt['sp_param_sp_latestMember_limit'] = 'Members to Show'; +$txt['sp_param_sp_whosOnline_online_today'] = 'Users Online Today'; +$txt['sp_param_sp_boardStats_averages'] = 'Show Averages'; +$txt['sp_param_sp_topPoster_limit'] = 'Top Posters to Display'; +$txt['sp_param_sp_topPoster_type'] = 'Display'; +$txt['sp_param_sp_topStatsMember_type'] = 'Type of the Top Member List'; +$txt['sp_param_sp_topStatsMember_limit'] = 'Members to display'; +$txt['sp_param_sp_topStatsMember_enable_label'] = 'Enable label for list'; +$txt['sp_param_sp_topStatsMember_list_label'] = 'List label'; +$txt['sp_param_sp_topStatsMember_sort_asc'] = 'Sort in reverse order'; +$txt['sp_param_sp_topStatsMember_last_active_limit'] = 'Remove inactive Members from the List
(Time in days)'; +$txt['sp_param_sp_recent_limit'] = 'Recent Posts or Topics to Display'; +$txt['sp_param_sp_recent_type'] = 'Display'; +$txt['sp_param_sp_recent_display'] = 'Display type'; +$txt['sp_param_sp_recent_boards'] = 'Include boards'; +$txt['sp_param_sp_topTopics_type'] = 'Sorting Type'; +$txt['sp_param_sp_topTopics_limit'] = 'Topics to Display'; +$txt['sp_param_sp_topBoards_limit'] = 'Boards to Display'; +$txt['sp_param_sp_showPoll_topic'] = 'Topic ID'; +$txt['sp_param_sp_showPoll_type'] = 'Type'; +$txt['sp_param_sp_boardNews_board'] = 'Boards'; +$txt['sp_param_sp_boardNews_limit'] = 'Topics to Display'; +$txt['sp_param_sp_boardNews_start'] = 'Starting Post ID'; +$txt['sp_param_sp_boardNews_length'] = 'Maximum Characters'; +$txt['sp_param_sp_boardNews_avatar'] = 'Display Avatars'; +$txt['sp_param_sp_boardNews_per_page'] = 'Posts Per Page'; +$txt['sp_param_sp_attachmentImage_limit'] = 'Images to Display'; +$txt['sp_param_sp_attachmentImage_direction'] = 'List Direction'; +$txt['sp_param_sp_attachmentImage_disablePoster'] = 'Remove Image Poster\'s Name'; +$txt['sp_param_sp_attachmentImage_disableDownloads'] = 'Remove image Download'; +$txt['sp_param_sp_attachmentImage_disableLink'] = 'Remove Image Download Link'; +$txt['sp_param_sp_attachmentRecent_limit'] = 'Attachments to Display'; +$txt['sp_param_sp_calendar_events'] = 'Show Events'; +$txt['sp_param_sp_calendar_birthdays'] = 'Show Birthdays'; +$txt['sp_param_sp_calendar_holidays'] = 'Show Holidays'; +$txt['sp_param_sp_calendarInformation_events'] = 'Show Events'; +$txt['sp_param_sp_calendarInformation_future'] = 'Number of days in future to show events'; +$txt['sp_param_sp_calendarInformation_birthdays'] = 'Show Birthdays'; +$txt['sp_param_sp_calendarInformation_holidays'] = 'Show Holidays'; +$txt['sp_param_sp_rssFeed_url'] = 'Feed URL'; +$txt['sp_param_sp_rssFeed_show_title'] = 'Show Title'; +$txt['sp_param_sp_rssFeed_show_content'] = 'Show Content'; +$txt['sp_param_sp_rssFeed_show_date'] = 'Show Date'; +$txt['sp_param_sp_rssFeed_strip_preserve'] = 'Tags to Preserve'; +$txt['sp_param_sp_rssFeed_count'] = 'Items to Show'; +$txt['sp_param_sp_rssFeed_limit'] = 'Character Limit'; +$txt['sp_param_sp_staff_lmod'] = 'Disable Local Moderators'; +$txt['sp_param_sp_articles_category'] = 'Category'; +$txt['sp_param_sp_articles_limit'] = 'Articles to Display'; +$txt['sp_param_sp_articles_type'] = 'Display Type'; +$txt['sp_param_sp_articles_image'] = 'Image'; +$txt['sp_param_sp_shoutbox_shoutbox'] = 'Shoutbox to Display'; +$txt['sp_param_sp_gallery_limit'] = 'Items to Display'; +$txt['sp_param_sp_gallery_type'] = 'Display'; +$txt['sp_param_sp_gallery_direction'] = 'List Direction'; +$txt['sp_param_sp_arcade_limit'] = 'Items to display'; +$txt['sp_param_sp_arcade_type'] = 'Display'; +$txt['sp_param_sp_shop_style'] = 'Display'; +$txt['sp_param_sp_shop_limit'] = 'Items to display'; +$txt['sp_param_sp_shop_type'] = 'Money type'; +$txt['sp_param_sp_shop_sort'] = 'Item type'; +$txt['sp_param_sp_blog_limit'] = 'Items to Display'; +$txt['sp_param_sp_blog_type'] = 'Item Type'; +$txt['sp_param_sp_blog_sort'] = 'Display'; +$txt['sp_param_sp_html_content'] = 'Custom HTML'; +$txt['sp_param_sp_bbc_content'] = 'Custom BBC'; +$txt['sp_param_sp_php_content'] = 'Custom PHP'; + +// Parameter options +$txt['sp_param_sp_topPoster_type_options'] = 'All Time|Today|This Week|This Month'; +$txt['sp_param_sp_topStatsMember_type_options'] = 'Total Time Logged In|Posts|Good Karma|Bad Karma|Total Karma|Thank-O-Matic Top Given|Thank-O-Matic Top Received|Automatic Karma Good|Automatic Karma Bad|Automatic Karma Total|Advanced Reputation System Best|Advanced Reputation System Worst'; +$txt['sp_param_sp_recent_type_options'] = 'Posts|Topics'; +$txt['sp_param_sp_recent_display_options'] = 'Compact|Full'; +$txt['sp_param_sp_topTopics_type_options'] = 'Replies|Views'; +$txt['sp_param_sp_showPoll_type_options'] = 'Normal|Recent|Random'; +$txt['sp_param_sp_attachmentImage_direction_options'] = 'Vertical|Horizontal'; +$txt['sp_param_sp_articles_type_options'] = 'Latest|Random'; +$txt['sp_param_sp_articles_image_options'] = 'None|Poster Avatar|Category Image'; +$txt['sp_param_sp_gallery_type_options'] = 'Latest|Random'; +$txt['sp_param_sp_gallery_direction_options'] = 'Vertical|Horizontal'; +$txt['sp_param_sp_arcade_type_options'] = 'Most Played|Best Players|Longest Champ'; +$txt['sp_param_sp_shop_style_options'] = 'Members|Items'; +$txt['sp_param_sp_shop_type_options'] = 'Total|Pocket|Bank'; +$txt['sp_param_sp_shop_sort_options'] = 'Recent|Random'; +$txt['sp_param_sp_blog_type_options'] = 'Articles|Blogs'; +$txt['sp_param_sp_blog_sort_options'] = 'Latest|Random'; + +// Articles area +$txt['sp-adminArticleListName'] = 'Article List'; +$txt['sp-adminArticleListDesc'] = 'This page displays a list of all topics that have been added as articles. These can be modified by selecting the appropriate options.'; +$txt['sp-adminArticleAddName'] = 'Add Article'; +$txt['sp-adminArticleAddDesc'] = 'This page enables articles to be added to the portal page.'; +$txt['sp-adminArticleAddNoTopics'] = 'This board has no remaining topics that can be added as articles.'; + +// Article list +$txt['sp-articlesRemove'] = 'Remove Selected'; +$txt['sp-articlesConfirm'] = 'Are you sure you want to delete these articles?'; +$txt['sp-articlesDeleteConfirm'] = 'Are you sure you want to delete this article?'; + +// Add/Edit articles +$txt['sp-articlesAdd'] = 'Add Article'; +$txt['sp-articlesEdit'] = 'Edit Article'; +$txt['sp-articlesCategory'] = 'Article Category'; +$txt['sp-articlesApproved'] = 'Approved'; + +// Categories area +$txt['sp-adminCategoryListName'] = 'Category List'; +$txt['sp-adminCategoryListDesc'] = 'This page displays a list of article categories that have been created. These can be modified by selecting the appropriate options.'; +$txt['sp-adminCategoryAddName'] = 'Add Category'; +$txt['sp-adminCategoryAddDesc'] = 'This page enables new categories to be added for articles to be placed in.'; + +// Category list +$txt['sp-categoriesCategories'] = 'Categories'; + +// Add/Edit category +$txt['sp-categoriesAdd'] = 'Add Category'; +$txt['sp-categoriesEdit'] = 'Edit Category'; +$txt['sp-categoriesName'] = 'Name'; +$txt['sp-categoriesPicture'] = 'Image URL'; +$txt['sp-categoriesPublish'] = 'Publish on Portal'; + +// Delete category +$txt['sp-categoriesDelete'] = 'Delete Category'; +$txt['sp-categoriesDeleteCount'] = 'There are %s article(s) in this category.'; +$txt['sp-categoriesDeleteOption1'] = 'Do you want to move these articles to another category?'; +$txt['sp-categoriesDeleteOption2'] = 'By deleting this category your articles will also be deleted.'; +$txt['sp-categoriesDeleteConfirm'] = 'Are you sure you wish to delete this category?'; +$txt['sp-categoriesMove'] = 'Move'; +$txt['sp-categoriesMoveTo'] = 'Move To'; + +// Block list titles +$txt['sp-adminColumnType'] = 'Type'; +$txt['sp-adminColumnMove'] = 'Move'; + +// Article list titles +$txt['sp-adminColumnTopic'] = 'Topic'; +$txt['sp-adminColumnBoard'] = 'Board'; +$txt['sp-adminColumnPoster'] = 'Poster'; +$txt['sp-adminColumnTime'] = 'Time'; +$txt['sp-adminColumnCategory'] = 'Category'; +$txt['sp-adminColumnApproved'] = 'Approved'; + +// Category list titles +$txt['sp-adminColumnPicture'] = 'Picture'; +$txt['sp-adminColumnArticles'] = 'Articles'; +$txt['sp-adminColumnPublish'] = 'Publish'; + +// Pages Area +$txt['sp_admin_pages_title'] = 'Pages'; +$txt['sp_admin_pages_list'] = 'Page List'; +$txt['sp_admin_pages_add'] = 'Add Page'; +$txt['sp_admin_pages_edit'] = 'Edit Page'; +$txt['sp_admin_pages_remove'] = 'Remove Pages'; +$txt['sp_admin_pages_preview'] = 'Preview'; +$txt['sp_admin_pages_general'] = 'General Settings'; +$txt['sp_admin_pages_style'] = 'Style Options'; + +$txt['sp_admin_pages_desc'] = 'You can create and manage SimplePortal pages in this area.'; +$txt['sp_pages_remove_confirm'] = 'Are you sure that you want to remove the selected pages?'; +$txt['sp_admin_pages_delete_confirm'] = 'Are you sure you want to delete this page?'; +$txt['sp_error_no_pages'] = 'There are no pages available.'; +$txt['sp_error_page_name_empty'] = 'Sorry, you left the page name empty.'; +$txt['sp_error_page_namespace_empty'] = 'Sorry, you left the page ID empty.'; +$txt['sp_error_page_namespace_duplicate'] = 'Sorry, that page ID is already in use.'; +$txt['sp_error_page_namespace_invalid_chars'] = 'Sorry, there are invalid characters in the page ID. Page ID\'s can only contain letters, numbers and underscores.'; +$txt['sp_error_page_namespace_numeric'] = 'Sorry, page ID\'s cannot be only numbers. Page ID\'s need letters, and or an underscore'; + +$txt['sp_admin_pages_col_title'] = 'Title'; +$txt['sp_admin_pages_col_namespace'] = 'Page ID'; +$txt['sp_admin_pages_col_body'] = 'Body'; +$txt['sp_admin_pages_col_type'] = 'Type'; +$txt['sp_admin_pages_col_views'] = 'Views'; +$txt['sp_admin_pages_col_status'] = 'Active'; +$txt['sp_admin_pages_col_actions'] = 'Actions'; +$txt['sp_admin_pages_col_permissions'] = 'Permissions'; +$txt['sp_admin_pages_permissions_set_custom'] = 'Custom'; +$txt['sp_admin_pages_permissions_set_guests'] = 'Guests'; +$txt['sp_admin_pages_permissions_set_members'] = 'Members'; +$txt['sp_admin_pages_permissions_set_everyone'] = 'Everyone'; +$txt['sp_admin_pages_col_custom_permissions'] = 'Custom Permissions'; +$txt['sp_admin_pages_custom_permissions_membergroup'] = 'Membergroup'; +$txt['sp_admin_pages_custom_permissions_allowed_short'] = 'A'; +$txt['sp_admin_pages_custom_permissions_disallowed_short'] = 'X'; +$txt['sp_admin_pages_custom_permissions_denied_short'] = 'D'; +$txt['sp_admin_pages_custom_permissions_allowed'] = 'Allowed'; +$txt['sp_admin_pages_custom_permissions_disallowed'] = 'Disallowed'; +$txt['sp_admin_pages_custom_permissions_denied'] = 'Denied'; +$txt['sp_admin_pages_col_blocks'] = 'Blocks'; +$txt['sp_admin_pages_activate'] = 'Activate'; +$txt['sp_admin_pages_deactivate'] = 'Deactivate'; + +$txt['sp_pages_default_title'] = 'Untitled Page'; + +$txt['sp_pages_type_bbc'] = 'BBC'; +$txt['sp_pages_type_html'] = 'HTML'; +$txt['sp_pages_type_php'] = 'PHP'; + +// Shoutboxes Area +$txt['sp_admin_shoutbox_title'] = 'Shoutbox'; +$txt['sp_admin_shoutbox_list'] = 'Shoutbox List'; +$txt['sp_admin_shoutbox_add'] = 'Add Shoutbox'; +$txt['sp_admin_shoutbox_edit'] = 'Edit Shoutbox'; +$txt['sp_admin_shoutbox_prune'] = 'Prune Shoutbox'; +$txt['sp_admin_shoutbox_remove'] = 'Remove Shoutboxes'; + +$txt['sp_admin_shoutbox_desc'] = 'You can create and manage SimplePortal shoutboxes in this area.'; +$txt['sp_shoutbox_remove_confirm'] = 'Are you sure that you want to remove the selected shoutboxes?'; +$txt['sp_admin_shoutbox_delete_confirm'] = 'Are you sure you want to delete this shoutbox?'; +$txt['sp_error_no_shoutbox'] = 'There are no shoutboxes available.'; +$txt['sp_error_shoutbox_name_duplicate'] = 'Sorry, there is already a shoutbox with that name.'; + +$txt['sp_admin_shoutbox_col_name'] = 'Name'; +$txt['sp_admin_shoutbox_col_shouts'] = 'Shouts'; +$txt['sp_admin_shoutbox_col_caching'] = 'Caching'; +$txt['sp_admin_shoutbox_col_status'] = 'Status'; +$txt['sp_admin_shoutbox_col_actions'] = 'Actions'; +$txt['sp_admin_shoutbox_col_permissions'] = 'Permissions'; +$txt['sp_admin_shoutbox_permissions_set_custom'] = 'Custom'; +$txt['sp_admin_shoutbox_permissions_set_guests'] = 'Guests'; +$txt['sp_admin_shoutbox_permissions_set_members'] = 'Members'; +$txt['sp_admin_shoutbox_permissions_set_everyone'] = 'Everyone'; +$txt['sp_admin_shoutbox_col_custom_permissions'] = 'Custom Permissions'; +$txt['sp_admin_shoutbox_custom_permissions_membergroup'] = 'Membergroup'; +$txt['sp_admin_shoutbox_custom_permissions_allowed_short'] = 'A'; +$txt['sp_admin_shoutbox_custom_permissions_disallowed_short'] = 'X'; +$txt['sp_admin_shoutbox_custom_permissions_denied_short'] = 'D'; +$txt['sp_admin_shoutbox_custom_permissions_allowed'] = 'Allowed'; +$txt['sp_admin_shoutbox_custom_permissions_disallowed'] = 'Disallowed'; +$txt['sp_admin_shoutbox_custom_permissions_denied'] = 'Denied'; +$txt['sp_admin_shoutbox_col_moderators'] = 'Moderators'; +$txt['sp_admin_shoutbox_col_reverse'] = 'Reverse Order'; +$txt['sp_admin_shoutbox_activate'] = 'Activate'; +$txt['sp_admin_shoutbox_deactivate'] = 'Deactivate'; + +$txt['sp_shoutbox_default_name'] = 'Untitled Shoutbox'; + +$txt['sp_admin_shoutbox_col_warning'] = 'Warning'; +$txt['sp_admin_shoutbox_col_bbc'] = 'Allowed BBC'; +$txt['sp_admin_shoutbox_col_height'] = 'Height(pixels)'; +$txt['sp_admin_shoutbox_col_num_show'] = 'Shouts to display'; +$txt['sp_admin_shoutbox_col_num_max'] = 'Maximum shouts'; +$txt['sp_admin_shoutbox_col_refresh'] = 'Auto refresh(seconds)'; + +$txt['sp_admin_shoutbox_opt_all'] = 'Delete all shouts'; +$txt['sp_admin_shoutbox_opt_days'] = 'Delete shouts older than a number of days'; +$txt['sp_admin_shoutbox_opt_member'] = 'Delete shouts posted by a member'; + +$txt['sp_admin_shoutbox_block_redirect_message'] = '

Congratulations, you have created a new shoutbox!

+

Although it won\'t be displayed anywhere within your forum yet. You will need to create a shoutbox block before your users can use the shoutbox.

+

Click here to create a new shoutbox block for this shoutbox.

+

Click here to continue to your list of shoutboxes.

'; + +// General titles +$txt['sp-adminColumnAction'] = 'Action'; +$txt['sp-adminColumnName'] = 'Name'; + +// Miscellaneous strings +$txt['sp-positionLeft'] = 'Left'; +$txt['sp-positionTop'] = 'Top'; +$txt['sp-positionBottom'] = 'Bottom'; +$txt['sp-positionRight'] = 'Right'; +$txt['sp-positionHeader'] = 'Header'; +$txt['sp-positionFooter'] = 'Footer'; +$txt['sp-placementBefore'] = 'Before'; +$txt['sp-placementAfter'] = 'After'; +$txt['sp-placementUnchanged'] = 'Unchanged'; +$txt['sp-stateYes'] = 'Yes'; +$txt['sp-stateNo'] = 'No'; + +// Information area +$txt['sp-info_title'] = 'Information'; +$txt['sp-info_desc'] = 'Some useful system, and SimplePortal information.'; +$txt['sp-info_live'] = 'Live from SimplePortal...'; +$txt['sp-info_no_live'] = 'Sorry! At this time you are unable to connect to simpleportal.net\'s latest news file.'; +$txt['sp-info_general'] = 'General Information'; +$txt['sp-info_versions'] = 'Version Information'; +$txt['sp-info_your_version'] = 'Your Version'; +$txt['sp-info_current_version'] = 'Current Version'; +$txt['sp-info_managers'] = 'Managers'; +$txt['sp-info_intro'] = 'The SimplePortal Team wants to thank everyone who helped make SimplePortal what it is today, and the Simple Machines Team for the great forum software, SMF. It wouldn\'t have been possible without you, our users, and SMF.'; +$txt['sp-info_team'] = 'The Team'; +$txt['sp-info_special'] = 'Special Thanks'; +$txt['sp-info_and'] = 'and'; +$txt['sp-info_anyone'] = 'For anyone we may have missed, thank you!'; +$txt['sp-info_groups_pm'] = 'Project Managers'; +$txt['sp-info_groups_dev'] = 'Developers'; +$txt['sp-info_groups_support'] = 'Support Specialists'; +$txt['sp-info_groups_customize'] = 'Customizers'; +$txt['sp-info_groups_language'] = 'Language Managers'; +$txt['sp-info_groups_marketing'] = 'Marketing'; +$txt['sp-info_groups_beta'] = 'Beta Testers'; +$txt['sp-info_groups_translators'] = 'Language Translators'; +$txt['sp-info_translators_message'] = 'Thank you for your efforts in the internationalization of SimplePortal.'; +$txt['sp-info_groups_founder'] = 'Founding Father of SimplePortal'; +$txt['sp-info_groups_orignal_pm'] = 'Original Project Managers'; +$txt['sp-info_fam_fam'] = 'Pretty Icons'; +$txt['sp-info_fam_fam_message'] = 'Mark James for his Fam Fam Fam Silk Icons.'; +$txt['sp-info_contribute'] = 'Did you find SimplePortal useful? Contribute to the project!'; + +// Permissions +$txt['permissiongroup_sp'] = 'SimplePortal'; +$txt['permissiongroup_simple_sp'] = 'SimplePortal'; +$txt['permissionname_sp_admin'] = 'Administrate portal'; +$txt['permissionhelp_sp_admin'] = 'This permission allows users to administrate SimplePortal.'; +$txt['permissionname_sp_manage_settings'] = 'Manage portal settings'; +$txt['permissionhelp_sp_manage_settings'] = 'This permission allows users to manage SimplePortal settings.'; +$txt['permissionname_sp_manage_blocks'] = 'Manage portal blocks'; +$txt['permissionhelp_sp_manage_blocks'] = 'This permission allows users to manage SimplePortal blocks.'; +$txt['permissionname_sp_manage_articles'] = 'Manage portal articles'; +$txt['permissionhelp_sp_manage_articles'] = 'This permission allows users to manage SimplePortal articles.'; +$txt['permissionname_sp_manage_pages'] = 'Manage portal pages'; +$txt['permissionhelp_sp_manage_pages'] = 'This permission allows users to manage SimplePortal pages.'; +$txt['permissionname_sp_manage_shoutbox'] = 'Manage portal shoutboxes'; +$txt['permissionhelp_sp_manage_shoutbox'] = 'This permission allows users to manage SimplePortal shoutboxes.'; +$txt['permissionname_sp_add_article'] = 'Can add article'; +$txt['permissionhelp_sp_add_article'] = 'This permission allows users to add articles.'; +$txt['permissionname_sp_auto_article_approval'] = 'Automatic article approval'; +$txt['permissionhelp_sp_auto_article_approval'] = 'This permission allows users to add articles without requiring approval.'; +$txt['permissionname_sp_remove_article'] = 'Can remove article'; +$txt['permissionhelp_sp_remove_article'] = 'This permission allows users to remove articles.'; + +// Compatibility strings +$txt['sp-adminCatHelp'] = 'Here you can manage and configure SimplePortal.'; +$txt['sp-adminCatDesc'] = 'Here you can manage and configure SimplePortal.'; + +?> \ No newline at end of file diff --git a/Themes/default/languages/SPortalHelp.english-utf8.php b/Themes/default/languages/SPortalHelp.english-utf8.php new file mode 100644 index 0000000..eb6a22c --- /dev/null +++ b/Themes/default/languages/SPortalHelp.english-utf8.php @@ -0,0 +1,174 @@ +
+Disabled: This will completely disable the portal.

+Frontpage: This is the default setting. The portal page will greet viewers instead of the board index. Members will be able to access the board index by using the "forum" action, which can be accessed through the "forum" button.

+Integration: This will disable the portal page. Blocks are only usable in forum.

+Standalone: This will enable the portal to be displayed at a different url, away from the forum. The portal page appears in the url defined for the "Standalone URL" option. For details, check the PortalStandalone.php file found inside the forum root.'; +$helptxt['sp_maintenance'] = 'When maintenance is enabled, portal is only visible by members with Moderate SimplePortal permission.'; +$helptxt['sp_standalone_url'] = 'Full URL to the standalone file.

Example: http://myforum.com/portal.php'; +$helptxt['portaltheme'] = 'Select the theme which will be used for the portal.'; +$helptxt['sp_disableForumRedirect'] = 'If this box is unchecked, users will be redirected to the portal after they login or logout. If this box is checked, then users will be redirected to the BoardIndex.'; +$helptxt['sp_disableColor'] = 'If the Member Color Link mod is installed, this will disable the mod on the portal (except in the who\'s online list).'; +$helptxt['sp_disable_random_bullets'] = 'Disables random coloring for bullet images used in portal lists.'; +$helptxt['sp_disable_php_validation'] = 'Disables validation of PHP block codes, which is to prevent syntax and database errors in code.'; +$helptxt['sp_disable_side_collapse'] = 'Disables ability to collapse the left and right sides of the portal.'; +$helptxt['sp_resize_images'] = 'Enables resizing images in articles and board news to 300x300px, to prevent possible overflows.'; + +// Block settings +$helptxt['showleft'] = 'This will enable left side blocks on the portal and inside the forum.'; +$helptxt['showright'] = 'This will enable right side blocks on the portal and inside the forum.'; +$helptxt['leftwidth'] = 'If left side blocks are enabled, their width can be specified here. The width can be specified in pixels (px) or in percentages (%).'; +$helptxt['rightwidth'] = 'If right side blocks are enabled, their width can be specified here. The width can be specified in pixels (px) or in percentages (%).'; +$helptxt['sp_enableIntegration'] = 'This setting enables blocks inside the forum. It allows the advanced Display Options for each block to be specified.'; +$helptxt['sp_IntegrationHide'] = 'Hide blocks in certain forum sections. The Display blocks in Forum setting must be enabled for this to work.'; + +// Article settings +$helptxt['articleactive'] = 'This setting enables articles to be displayed on the portal.'; +$helptxt['articleperpage'] = 'This sets the maximum amount of articles shown per page.'; +$helptxt['articlelength'] = 'This setting allows a limit to be set on the amount of characters an article can display on the portal page. If the article exceeds this limit it will be shortened and have an ellipsis (...) link on the end, which allows the user to view the entire article.'; +$helptxt['articleavatar'] = 'If this setting is enabled the authors avatar will be shown along with each article.'; + +// Blocks area +$helptxt['sp_BlocksArea'] = 'Blocks are boxes which can be displayed on the portal or inside the forum. This section enables existing blocks to be modified, and new ones to be created.'; + +// Block list +$helptxt['sp-blocksLeftList'] = 'These blocks are displayed on the left side of the portal and forum.'; +$helptxt['sp-blocksTopList'] = 'These blocks are centered at the top of the portal and forum.'; +$helptxt['sp-blocksBottomList'] = 'These blocks are centered at the bottom of the portal and forum.'; +$helptxt['sp-blocksRightList'] = 'These blocks are displayed on the right side of the portal and forum.'; +$helptxt['sp-blocksHeaderList'] = 'These blocks are displayed on the top of the portal and forum.'; +$helptxt['sp-blocksFooterList'] = 'These blocks are displayed on the bottom of the portal and forum.'; + +// Add/Edit blocks +$helptxt['sp-blocksAdd'] = 'This area enables the selected block to be customised and configured.'; +$helptxt['sp-blocksSelectType'] = 'This area enables blocks to be created for the portal page. Pre-built blocks or custom content blocks can be created easily by selecting the appropriate options.'; +$helptxt['sp-blocksEdit'] = 'This area enables the selected block to be customised and configured.'; +$helptxt['sp-blocksDisplayOptions'] = 'This area allows you to select on which pages block will appear.'; +$helptxt['sp-blocksCustomDisplayOptions'] = 'Custom display options allows a more advanced control over where to display the block with its special syntax.

+Special actions include:

+all: every page in forum.
+portal: portal page and it\'s sub-actions.
+forum: board index.
+sforum: all actions and boards, except portal.
+allaction: all actions.
+allboard: all boards.

+Wavy (~)
+This symbol acts as a wildcard, allowing you to include dynamic actions like ../index.php?issue=* or ../index.php?game=*. Used as ~action

+Idkin (|)
+Another wildcard sybmol which allows you to specify an exact value for a dynamic action like ../index.php?issue=1.0 or ../index.php?game=xyz. Should be used with wavy and after the action like; ~action|value

+Negator (-)
+This symbol is to exclude regular and dynamic actions. Should be used before the action name for regular actions and before the wavy for dynamic actions. Used as -action and -~action'; +$helptxt['sp-blocksStyleOptions'] = 'These options allow you to specify CSS styling for each blocks.'; + +// Articles area +$helptxt['sp_ArticlesArea'] = 'Articles are topics (first post only) which are displayed on the portal. This section enables existing articles to be modified, and new ones to be created for the portal.'; + +// Add/Edit articles +$helptxt['sp-articlesAdd'] = 'This area allows you to add articles to categories from your boards.'; +$helptxt['sp-articlesEdit'] = 'In this area you change the category or status of the articles.'; +$helptxt['sp-articlesCategory'] = 'Select a category for this article.'; +$helptxt['sp-articlesApproved'] = 'Approved articles will appear on the portal articles area.'; +$helptxt['sp-articlesTopics'] = 'Select the topics to be displayed as articles on the portal.'; +$helptxt['sp-articlesBoards'] = 'Select a board to search for topics.'; + +// Categories area +$helptxt['sp_CategoriesArea'] = 'Categories hold articles. This section enables existing categories to be modified, and new ones to be created for articles. To create an article there must be at least one category.'; + +// Add/Edit categories +$helptxt['sp-categoriesAdd'] = 'This section enables categories to be created for articles. To create articles there must be at least one category.'; +$helptxt['sp-categoriesEdit'] = 'This section enables categories to be modified.'; +$helptxt['sp-categoriesCategories'] = 'This page displays a list of the current article categories. To create articles there must be at least one category.'; +$helptxt['sp-categoriesDelete'] = 'Deleting a category will either delete the articles in it, or move them to another category.'; + +// Pages area +$helptxt['sp_PagesArea'] = 'Pages are BBC, PHP or HTML code blocks that are shown on their own page within your forum. This section allows you to create, edit and configure your pages.'; + +// Shoutbox area +$helptxt['sp_ShoutboxArea'] = 'Shoutboxes need to be created in this section. This section allows shoutboxes to be created and configured. A shoutbox block will then need to be used to show the shoutbox that is created.'; + +// Add/Edit shoutboxes +$helptxt['sp-shoutboxesWarning'] = 'The warning message that you set here will be shown in the shoutbox, anyone using the shoutbox will see this message.'; +$helptxt['sp-shoutboxesBBC'] = 'This setting allows you to choose the BBC that can be used in this shoutbox.

Hold down the CTRL key to select or deselect a particular BBC.

If you want to select a series of consecutive BBC, then click on the first BBC that you want to select, hold down the SHIFT key, then click on the last BBC that you want to select.'; + +$helptxt['sp_permissions'] = 'This option enables permissions to be used on blocks. The first three options are the simplest to use and understand. +
    +
  • Guests: Any user who is not registered or logged in will see this block. Logged-in users (including Administrators) will not see this block.
  • +
  • Members: Any user who is logged in (including Administrators) will see this block.
  • +
  • Everyone: All users, whether they are logged in or not, will see this block.
  • +
  • Custom: Select this to show the Custom Permissions area. In the Custom Permissions Settings, there are three options to choose for each group. +
      +
    • A: Allowed, any user of this group will see this block.
    • +
    • X: Disallowed, any user of this group will not see this block by default. The user may see this block if they are part of a group with Allowed permissions.
    • +
    • D: Denied, any user of this group will never see this block. This overrides the Allowed setting for any group a user is part of, so be careful with this permission.
    • +
    +
  • +
'; + +// Block parameters +$helptxt['sp_param_sp_latestMember_limit'] = 'How many members to display.'; +$helptxt['sp_param_sp_boardStats_averages'] = 'Display average statistics.'; +$helptxt['sp_param_sp_topPoster_limit'] = 'How many top posters to display.'; +$helptxt['sp_param_sp_topPoster_type'] = 'Time period to show top posters from.'; +$helptxt['sp_param_sp_recent_limit'] = 'How many recent posts or topics to display.'; +$helptxt['sp_param_sp_recent_type'] = 'Display recent posts or topics.'; +$helptxt['sp_param_sp_recentPosts_limit'] = 'How many recent posts to display.'; +$helptxt['sp_param_sp_recentTopics_limit'] = 'How many recent topics to display.'; +$helptxt['sp_param_sp_topTopics_type'] = 'Sort topics by replies or views.'; +$helptxt['sp_param_sp_topTopics_limit'] = 'How many topics to display.'; +$helptxt['sp_param_sp_topBoards_limit'] = 'How many boards to display.'; +$helptxt['sp_param_sp_showPoll_topic'] = 'The ID of the topic containing the poll to be displayed.'; +$helptxt['sp_param_sp_showPoll_type'] = 'Select the way polls should be displayed. Normal enables a specific poll to be called by the topic ID, Recent displays the most recently posted poll, and random displays a random poll.'; +$helptxt['sp_param_sp_boardNews_board'] = 'The ID of the board where the topics come from. Leave empty to fetch topics from all visible boards.'; +$helptxt['sp_param_sp_boardNews_limit'] = 'The maximum number of news items to be displayed.'; +$helptxt['sp_param_sp_boardNews_start'] = 'The ID of a particular post to start with (otherwise the first result will be used).'; +$helptxt['sp_param_sp_boardNews_length'] = 'If specified, posts exceeding this limit will be shortened and have an ellipsis (...), or a "Read More" link placed on the end.'; +$helptxt['sp_param_sp_boardNews_avatar'] = 'Enables avatars to be displayed for the member who posted the board news.'; +$helptxt['sp_param_sp_boardNews_per_page'] = 'How many posts to display per page. Leave empty to disable pagination.'; +$helptxt['sp_param_sp_attachmentImage_limit'] = 'How many recently attached images to display.'; +$helptxt['sp_param_sp_attachmentImage_direction'] = 'Attachment images can be aligned horizontally or vertically.'; +$helptxt['sp_param_sp_attachmentRecent_limit'] = 'How many recent attachments to display.'; +$helptxt['sp_param_sp_calendar_events'] = 'Enables events from the calendar to be displayed.'; +$helptxt['sp_param_sp_calendar_birthdays'] = 'Displays birthdays from the calendar.'; +$helptxt['sp_param_sp_calendar_holidays'] = 'Displays holidays from the calendar.'; +$helptxt['sp_param_sp_calendarInformation_events'] = 'Enables events from the calendar to be displayed.'; +$helptxt['sp_param_sp_calendarInformation_future'] = 'Allows you to choose the number of days into the future from which upcoming calendar events will be shown. This requires the ability to display events from the calendar. To display only events for today, use "0".'; +$helptxt['sp_param_sp_calendarInformation_birthdays'] = 'Displays birthdays from the calendar.'; +$helptxt['sp_param_sp_calendarInformation_holidays'] = 'Displays holidays from the calendar.'; +$helptxt['sp_param_sp_rssFeed_url'] = 'Enter the full URL of the RSS feed.'; +$helptxt['sp_param_sp_rssFeed_show_title'] = 'Show feed titles.'; +$helptxt['sp_param_sp_rssFeed_show_content'] = 'Show feed contents.'; +$helptxt['sp_param_sp_rssFeed_show_date'] = 'Show feed dates.'; +$helptxt['sp_param_sp_rssFeed_strip_preserve'] = 'HTML tags to preserve in feed content separated by commas.'; +$helptxt['sp_param_sp_rssFeed_count'] = 'How many items to display.'; +$helptxt['sp_param_sp_rssFeed_limit'] = 'How many characters to display from the RSS feeds content.'; +$helptxt['sp_param_sp_staff_lmod'] = 'Disables Local Moderators from being listed.'; +$helptxt['sp_param_sp_articles_category'] = 'The category to display articles from.'; +$helptxt['sp_param_sp_articles_limit'] = 'How many articles to display.'; +$helptxt['sp_param_sp_articles_type'] = 'Displays random articles, or the latest articles.'; +$helptxt['sp_param_sp_articles_image'] = 'Enables a category image, avatar, or nothing to be displayed on the article.'; +$helptxt['sp_param_sp_gallery_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_gallery_type'] = 'Displays random or the latest gallery items.'; +$helptxt['sp_param_sp_gallery_direction'] = 'Gallery images can be aligned horizontally or vertically.'; +$helptxt['sp_param_sp_arcade_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_arcade_type'] = 'Displays the arcades most played games, best players, or longest champions.'; +$helptxt['sp_param_sp_shop_style'] = 'Displays the richest members or shop items.'; +$helptxt['sp_param_sp_shop_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_shop_type'] = 'Displays the members total money, pocketed money, or money in the bank.'; +$helptxt['sp_param_sp_shop_sort'] = 'Displays random or recently added items.'; +$helptxt['sp_param_sp_blog_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_blog_type'] = 'Displays articles or blogs.'; +$helptxt['sp_param_sp_blog_sort'] = 'Displays blogs randomly or by the latest blogs updated.'; +$helptxt['sp_param_sp_html_content'] = 'Enter the custom HTML content in this box.'; +$helptxt['sp_param_sp_bbc_content'] = 'Enter the custom BBC content in this box.'; +$helptxt['sp_param_sp_php_content'] = 'Enter the custom PHP content in this box.'; + +?> \ No newline at end of file diff --git a/Themes/default/languages/SPortalHelp.english.php b/Themes/default/languages/SPortalHelp.english.php new file mode 100644 index 0000000..eb6a22c --- /dev/null +++ b/Themes/default/languages/SPortalHelp.english.php @@ -0,0 +1,174 @@ +
+Disabled: This will completely disable the portal.

+Frontpage: This is the default setting. The portal page will greet viewers instead of the board index. Members will be able to access the board index by using the "forum" action, which can be accessed through the "forum" button.

+Integration: This will disable the portal page. Blocks are only usable in forum.

+Standalone: This will enable the portal to be displayed at a different url, away from the forum. The portal page appears in the url defined for the "Standalone URL" option. For details, check the PortalStandalone.php file found inside the forum root.'; +$helptxt['sp_maintenance'] = 'When maintenance is enabled, portal is only visible by members with Moderate SimplePortal permission.'; +$helptxt['sp_standalone_url'] = 'Full URL to the standalone file.

Example: http://myforum.com/portal.php'; +$helptxt['portaltheme'] = 'Select the theme which will be used for the portal.'; +$helptxt['sp_disableForumRedirect'] = 'If this box is unchecked, users will be redirected to the portal after they login or logout. If this box is checked, then users will be redirected to the BoardIndex.'; +$helptxt['sp_disableColor'] = 'If the Member Color Link mod is installed, this will disable the mod on the portal (except in the who\'s online list).'; +$helptxt['sp_disable_random_bullets'] = 'Disables random coloring for bullet images used in portal lists.'; +$helptxt['sp_disable_php_validation'] = 'Disables validation of PHP block codes, which is to prevent syntax and database errors in code.'; +$helptxt['sp_disable_side_collapse'] = 'Disables ability to collapse the left and right sides of the portal.'; +$helptxt['sp_resize_images'] = 'Enables resizing images in articles and board news to 300x300px, to prevent possible overflows.'; + +// Block settings +$helptxt['showleft'] = 'This will enable left side blocks on the portal and inside the forum.'; +$helptxt['showright'] = 'This will enable right side blocks on the portal and inside the forum.'; +$helptxt['leftwidth'] = 'If left side blocks are enabled, their width can be specified here. The width can be specified in pixels (px) or in percentages (%).'; +$helptxt['rightwidth'] = 'If right side blocks are enabled, their width can be specified here. The width can be specified in pixels (px) or in percentages (%).'; +$helptxt['sp_enableIntegration'] = 'This setting enables blocks inside the forum. It allows the advanced Display Options for each block to be specified.'; +$helptxt['sp_IntegrationHide'] = 'Hide blocks in certain forum sections. The Display blocks in Forum setting must be enabled for this to work.'; + +// Article settings +$helptxt['articleactive'] = 'This setting enables articles to be displayed on the portal.'; +$helptxt['articleperpage'] = 'This sets the maximum amount of articles shown per page.'; +$helptxt['articlelength'] = 'This setting allows a limit to be set on the amount of characters an article can display on the portal page. If the article exceeds this limit it will be shortened and have an ellipsis (...) link on the end, which allows the user to view the entire article.'; +$helptxt['articleavatar'] = 'If this setting is enabled the authors avatar will be shown along with each article.'; + +// Blocks area +$helptxt['sp_BlocksArea'] = 'Blocks are boxes which can be displayed on the portal or inside the forum. This section enables existing blocks to be modified, and new ones to be created.'; + +// Block list +$helptxt['sp-blocksLeftList'] = 'These blocks are displayed on the left side of the portal and forum.'; +$helptxt['sp-blocksTopList'] = 'These blocks are centered at the top of the portal and forum.'; +$helptxt['sp-blocksBottomList'] = 'These blocks are centered at the bottom of the portal and forum.'; +$helptxt['sp-blocksRightList'] = 'These blocks are displayed on the right side of the portal and forum.'; +$helptxt['sp-blocksHeaderList'] = 'These blocks are displayed on the top of the portal and forum.'; +$helptxt['sp-blocksFooterList'] = 'These blocks are displayed on the bottom of the portal and forum.'; + +// Add/Edit blocks +$helptxt['sp-blocksAdd'] = 'This area enables the selected block to be customised and configured.'; +$helptxt['sp-blocksSelectType'] = 'This area enables blocks to be created for the portal page. Pre-built blocks or custom content blocks can be created easily by selecting the appropriate options.'; +$helptxt['sp-blocksEdit'] = 'This area enables the selected block to be customised and configured.'; +$helptxt['sp-blocksDisplayOptions'] = 'This area allows you to select on which pages block will appear.'; +$helptxt['sp-blocksCustomDisplayOptions'] = 'Custom display options allows a more advanced control over where to display the block with its special syntax.

+Special actions include:

+all: every page in forum.
+portal: portal page and it\'s sub-actions.
+forum: board index.
+sforum: all actions and boards, except portal.
+allaction: all actions.
+allboard: all boards.

+Wavy (~)
+This symbol acts as a wildcard, allowing you to include dynamic actions like ../index.php?issue=* or ../index.php?game=*. Used as ~action

+Idkin (|)
+Another wildcard sybmol which allows you to specify an exact value for a dynamic action like ../index.php?issue=1.0 or ../index.php?game=xyz. Should be used with wavy and after the action like; ~action|value

+Negator (-)
+This symbol is to exclude regular and dynamic actions. Should be used before the action name for regular actions and before the wavy for dynamic actions. Used as -action and -~action'; +$helptxt['sp-blocksStyleOptions'] = 'These options allow you to specify CSS styling for each blocks.'; + +// Articles area +$helptxt['sp_ArticlesArea'] = 'Articles are topics (first post only) which are displayed on the portal. This section enables existing articles to be modified, and new ones to be created for the portal.'; + +// Add/Edit articles +$helptxt['sp-articlesAdd'] = 'This area allows you to add articles to categories from your boards.'; +$helptxt['sp-articlesEdit'] = 'In this area you change the category or status of the articles.'; +$helptxt['sp-articlesCategory'] = 'Select a category for this article.'; +$helptxt['sp-articlesApproved'] = 'Approved articles will appear on the portal articles area.'; +$helptxt['sp-articlesTopics'] = 'Select the topics to be displayed as articles on the portal.'; +$helptxt['sp-articlesBoards'] = 'Select a board to search for topics.'; + +// Categories area +$helptxt['sp_CategoriesArea'] = 'Categories hold articles. This section enables existing categories to be modified, and new ones to be created for articles. To create an article there must be at least one category.'; + +// Add/Edit categories +$helptxt['sp-categoriesAdd'] = 'This section enables categories to be created for articles. To create articles there must be at least one category.'; +$helptxt['sp-categoriesEdit'] = 'This section enables categories to be modified.'; +$helptxt['sp-categoriesCategories'] = 'This page displays a list of the current article categories. To create articles there must be at least one category.'; +$helptxt['sp-categoriesDelete'] = 'Deleting a category will either delete the articles in it, or move them to another category.'; + +// Pages area +$helptxt['sp_PagesArea'] = 'Pages are BBC, PHP or HTML code blocks that are shown on their own page within your forum. This section allows you to create, edit and configure your pages.'; + +// Shoutbox area +$helptxt['sp_ShoutboxArea'] = 'Shoutboxes need to be created in this section. This section allows shoutboxes to be created and configured. A shoutbox block will then need to be used to show the shoutbox that is created.'; + +// Add/Edit shoutboxes +$helptxt['sp-shoutboxesWarning'] = 'The warning message that you set here will be shown in the shoutbox, anyone using the shoutbox will see this message.'; +$helptxt['sp-shoutboxesBBC'] = 'This setting allows you to choose the BBC that can be used in this shoutbox.

Hold down the CTRL key to select or deselect a particular BBC.

If you want to select a series of consecutive BBC, then click on the first BBC that you want to select, hold down the SHIFT key, then click on the last BBC that you want to select.'; + +$helptxt['sp_permissions'] = 'This option enables permissions to be used on blocks. The first three options are the simplest to use and understand. +
    +
  • Guests: Any user who is not registered or logged in will see this block. Logged-in users (including Administrators) will not see this block.
  • +
  • Members: Any user who is logged in (including Administrators) will see this block.
  • +
  • Everyone: All users, whether they are logged in or not, will see this block.
  • +
  • Custom: Select this to show the Custom Permissions area. In the Custom Permissions Settings, there are three options to choose for each group. +
      +
    • A: Allowed, any user of this group will see this block.
    • +
    • X: Disallowed, any user of this group will not see this block by default. The user may see this block if they are part of a group with Allowed permissions.
    • +
    • D: Denied, any user of this group will never see this block. This overrides the Allowed setting for any group a user is part of, so be careful with this permission.
    • +
    +
  • +
'; + +// Block parameters +$helptxt['sp_param_sp_latestMember_limit'] = 'How many members to display.'; +$helptxt['sp_param_sp_boardStats_averages'] = 'Display average statistics.'; +$helptxt['sp_param_sp_topPoster_limit'] = 'How many top posters to display.'; +$helptxt['sp_param_sp_topPoster_type'] = 'Time period to show top posters from.'; +$helptxt['sp_param_sp_recent_limit'] = 'How many recent posts or topics to display.'; +$helptxt['sp_param_sp_recent_type'] = 'Display recent posts or topics.'; +$helptxt['sp_param_sp_recentPosts_limit'] = 'How many recent posts to display.'; +$helptxt['sp_param_sp_recentTopics_limit'] = 'How many recent topics to display.'; +$helptxt['sp_param_sp_topTopics_type'] = 'Sort topics by replies or views.'; +$helptxt['sp_param_sp_topTopics_limit'] = 'How many topics to display.'; +$helptxt['sp_param_sp_topBoards_limit'] = 'How many boards to display.'; +$helptxt['sp_param_sp_showPoll_topic'] = 'The ID of the topic containing the poll to be displayed.'; +$helptxt['sp_param_sp_showPoll_type'] = 'Select the way polls should be displayed. Normal enables a specific poll to be called by the topic ID, Recent displays the most recently posted poll, and random displays a random poll.'; +$helptxt['sp_param_sp_boardNews_board'] = 'The ID of the board where the topics come from. Leave empty to fetch topics from all visible boards.'; +$helptxt['sp_param_sp_boardNews_limit'] = 'The maximum number of news items to be displayed.'; +$helptxt['sp_param_sp_boardNews_start'] = 'The ID of a particular post to start with (otherwise the first result will be used).'; +$helptxt['sp_param_sp_boardNews_length'] = 'If specified, posts exceeding this limit will be shortened and have an ellipsis (...), or a "Read More" link placed on the end.'; +$helptxt['sp_param_sp_boardNews_avatar'] = 'Enables avatars to be displayed for the member who posted the board news.'; +$helptxt['sp_param_sp_boardNews_per_page'] = 'How many posts to display per page. Leave empty to disable pagination.'; +$helptxt['sp_param_sp_attachmentImage_limit'] = 'How many recently attached images to display.'; +$helptxt['sp_param_sp_attachmentImage_direction'] = 'Attachment images can be aligned horizontally or vertically.'; +$helptxt['sp_param_sp_attachmentRecent_limit'] = 'How many recent attachments to display.'; +$helptxt['sp_param_sp_calendar_events'] = 'Enables events from the calendar to be displayed.'; +$helptxt['sp_param_sp_calendar_birthdays'] = 'Displays birthdays from the calendar.'; +$helptxt['sp_param_sp_calendar_holidays'] = 'Displays holidays from the calendar.'; +$helptxt['sp_param_sp_calendarInformation_events'] = 'Enables events from the calendar to be displayed.'; +$helptxt['sp_param_sp_calendarInformation_future'] = 'Allows you to choose the number of days into the future from which upcoming calendar events will be shown. This requires the ability to display events from the calendar. To display only events for today, use "0".'; +$helptxt['sp_param_sp_calendarInformation_birthdays'] = 'Displays birthdays from the calendar.'; +$helptxt['sp_param_sp_calendarInformation_holidays'] = 'Displays holidays from the calendar.'; +$helptxt['sp_param_sp_rssFeed_url'] = 'Enter the full URL of the RSS feed.'; +$helptxt['sp_param_sp_rssFeed_show_title'] = 'Show feed titles.'; +$helptxt['sp_param_sp_rssFeed_show_content'] = 'Show feed contents.'; +$helptxt['sp_param_sp_rssFeed_show_date'] = 'Show feed dates.'; +$helptxt['sp_param_sp_rssFeed_strip_preserve'] = 'HTML tags to preserve in feed content separated by commas.'; +$helptxt['sp_param_sp_rssFeed_count'] = 'How many items to display.'; +$helptxt['sp_param_sp_rssFeed_limit'] = 'How many characters to display from the RSS feeds content.'; +$helptxt['sp_param_sp_staff_lmod'] = 'Disables Local Moderators from being listed.'; +$helptxt['sp_param_sp_articles_category'] = 'The category to display articles from.'; +$helptxt['sp_param_sp_articles_limit'] = 'How many articles to display.'; +$helptxt['sp_param_sp_articles_type'] = 'Displays random articles, or the latest articles.'; +$helptxt['sp_param_sp_articles_image'] = 'Enables a category image, avatar, or nothing to be displayed on the article.'; +$helptxt['sp_param_sp_gallery_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_gallery_type'] = 'Displays random or the latest gallery items.'; +$helptxt['sp_param_sp_gallery_direction'] = 'Gallery images can be aligned horizontally or vertically.'; +$helptxt['sp_param_sp_arcade_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_arcade_type'] = 'Displays the arcades most played games, best players, or longest champions.'; +$helptxt['sp_param_sp_shop_style'] = 'Displays the richest members or shop items.'; +$helptxt['sp_param_sp_shop_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_shop_type'] = 'Displays the members total money, pocketed money, or money in the bank.'; +$helptxt['sp_param_sp_shop_sort'] = 'Displays random or recently added items.'; +$helptxt['sp_param_sp_blog_limit'] = 'How many items to display.'; +$helptxt['sp_param_sp_blog_type'] = 'Displays articles or blogs.'; +$helptxt['sp_param_sp_blog_sort'] = 'Displays blogs randomly or by the latest blogs updated.'; +$helptxt['sp_param_sp_html_content'] = 'Enter the custom HTML content in this box.'; +$helptxt['sp_param_sp_bbc_content'] = 'Enter the custom BBC content in this box.'; +$helptxt['sp_param_sp_php_content'] = 'Enter the custom PHP content in this box.'; + +?> \ No newline at end of file diff --git a/Themes/default/scripts/portal.js b/Themes/default/scripts/portal.js new file mode 100644 index 0000000..abeb651 --- /dev/null +++ b/Themes/default/scripts/portal.js @@ -0,0 +1,239 @@ +// Version 2.3.5; portal.js + +// Define the version of SMF that we are using. +if (typeof(smf_editorArray) == "undefined") + portal_smf_version = 1.1; +else + portal_smf_version = 2; + +function sp_collapse_object(id, has_image) +{ + mode = document.getElementById("sp_object_" + id).style.display == '' ? 0 : 1; + document.getElementById("sp_object_" + id).style.display = mode ? '' : 'none'; + + if (typeof(has_image) == "undefined" || has_image == true) + document.getElementById("sp_collapse_" + id).src = smf_images_url + (mode ? '/collapse.gif' : '/expand.gif'); +} + +function sp_image_resize() +{ + var possible_images = document.getElementsByTagName("img"); + for (var i = 0; i < possible_images.length; i++) + { + if (possible_images[i].className != (portal_smf_version == 1.1 ? "sp_article" : "bbc_img sp_article")) + continue; + + var temp_image = new Image(); + temp_image.src = possible_images[i].src; + + if (temp_image.width > 300) + { + possible_images[i].height = (300 * temp_image.height) / temp_image.width; + possible_images[i].width = 300; + } + else + { + possible_images[i].width = temp_image.width; + possible_images[i].height = temp_image.height; + } + } + + if (typeof(window_oldSPImageOnload) != "undefined" && window_oldSPImageOnload) + { + window_oldSPImageOnload(); + window_oldSPImageOnload = null; + } +} + +function sp_submit_shout(shoutbox_id, sSessionVar, sSessionId) +{ + if (window.XMLHttpRequest) + { + shoutbox_indicator(shoutbox_id, true); + + var shout_body = ""; + + if (portal_smf_version == 1.1) + shout_body = escape(textToEntities(document.getElementById('new_shout_' + shoutbox_id).value.replace(/&#/g, "&#"))).replace(/\+/g, "%2B"); + else + shout_body = escape(document.getElementById('new_shout_' + shoutbox_id).value.replace(/&#/g, "&#").php_to8bit()).replace(/\+/g, "%2B"); + + sendXMLDocument(smf_prepareScriptUrl(smf_scripturl) + 'action=portal;sa=shoutbox;xml', 'shoutbox_id=' + shoutbox_id + '&shout=' + shout_body + '&' + sSessionVar + '=' + sSessionId, onShoutReceived); + + document.getElementById('new_shout_' + shoutbox_id).value = ''; + + return false; + } +} + +function sp_delete_shout(shoutbox_id, shout_id, sSessionVar, sSessionId) +{ + if (window.XMLHttpRequest) + { + shoutbox_indicator(shoutbox_id, true); + + sendXMLDocument(smf_prepareScriptUrl(smf_scripturl) + 'action=portal;sa=shoutbox;xml', 'shoutbox_id=' + shoutbox_id + '&delete=' + shout_id + '&' + sSessionVar + '=' + sSessionId, onShoutReceived); + + return false; + } +} + +function sp_refresh_shout(shoutbox_id, last_refresh) +{ + if (window.XMLHttpRequest) + { + shoutbox_indicator(shoutbox_id, true); + + getXMLDocument(smf_prepareScriptUrl(smf_scripturl) + 'action=portal;sa=shoutbox;shoutbox_id=' + shoutbox_id + ';time=' + last_refresh + ';xml', onShoutReceived); + + return false; + } +} + +// Function to handle the receiving of new shout data from the xml request. +function onShoutReceived(XMLDoc) +{ + var shouts = XMLDoc.getElementsByTagName("smf")[0].getElementsByTagName("shout"); + var shoutbox_id, updated, error, warning, reverse, shout, id, author, time, timeclean, delete_link, content, is_me, new_body = ''; + + shoutbox_id = XMLDoc.getElementsByTagName("smf")[0].getElementsByTagName("shoutbox")[0].childNodes[0].nodeValue; + updated = XMLDoc.getElementsByTagName("smf")[0].getElementsByTagName("updated")[0].childNodes[0].nodeValue; + + if (updated == 1) + { + error = XMLDoc.getElementsByTagName("smf")[0].getElementsByTagName("error")[0].childNodes[0].nodeValue; + warning = XMLDoc.getElementsByTagName("smf")[0].getElementsByTagName("warning")[0].childNodes[0].nodeValue; + reverse = XMLDoc.getElementsByTagName("smf")[0].getElementsByTagName("reverse")[0].childNodes[0].nodeValue; + + if (warning != 0) + new_body += '
  • ' + warning + '
  • '; + + if (error != 0) + setInnerHTML(document.getElementById('shouts_' + shoutbox_id), new_body + '
  • ' + error + '
  • '); + else + { + for (var i = 0; i < shouts.length; i++) + { + shout = XMLDoc.getElementsByTagName("smf")[0].getElementsByTagName("shout")[i]; + id = shout.getElementsByTagName("id")[0].childNodes[0].nodeValue; + author = shout.getElementsByTagName("author")[0].childNodes[0].nodeValue; + time = shout.getElementsByTagName("time")[0].childNodes[0].nodeValue; + timeclean = shout.getElementsByTagName("timeclean")[0].childNodes[0].nodeValue; + delete_link = shout.getElementsByTagName("delete")[0].childNodes[0].nodeValue; + content = shout.getElementsByTagName("content")[0].childNodes[0].nodeValue; + is_me = shout.getElementsByTagName("is_me")[0].childNodes[0].nodeValue; + + new_body += '
  • ' + (is_me == 0 ? '' + author + ': ' : '') + content + '
    ' + (delete_link != 0 ? ('' + delete_link + '') : '') + '' + time + '
  • '; + } + + setInnerHTML(document.getElementById('shouts_' + shoutbox_id), new_body); + + if (reverse != 0) + document.getElementById('shouts_' + shoutbox_id).scrollTop = document.getElementById('shouts_' + shoutbox_id).scrollHeight; + else + document.getElementById('shouts_' + shoutbox_id).scrollTop = 0; + + var sp_date = new Date; + eval("last_refresh_" + shoutbox_id + " = " + Math.round(sp_date.getTime() / 1000, 0) + ";"); + } + } + + shoutbox_indicator(shoutbox_id, false); + + return false; +} + +function shoutbox_indicator(shoutbox_id, turn_on) +{ + document.getElementById('shoutbox_load_' + shoutbox_id).style.display = turn_on ? '' : 'none'; +} + +function sp_catch_enter(key) +{ + var keycode; + + if (window.event) + keycode = window.event.keyCode; + else if (key) + keycode = key.which; + + if (keycode == 13) + return true; +} + +function sp_show_ignored_shout(shout_id) +{ + document.getElementById('ignored_shout_' + shout_id).style.display = ''; + document.getElementById('ignored_shout_link_' + shout_id).style.display = 'none'; +} + +function sp_show_history_ignored_shout(shout_id) +{ + document.getElementById('history_ignored_shout_' + shout_id).style.display = ''; + document.getElementById('history_ignored_shout_link_' + shout_id).style.display = 'none'; +} + +function style_highlight(something, mode) +{ + something.style.backgroundImage = 'url(' + smf_images_url + (mode ? '/bbc/bbc_hoverbg.gif)' : '/bbc/bbc_bg.gif)'); +} + +function smf_prepareScriptUrl(sUrl) +{ + return sUrl.indexOf('?') == -1 ? sUrl + '?' : sUrl + (sUrl.charAt(sUrl.length - 1) == '?' || sUrl.charAt(sUrl.length - 1) == '&' || sUrl.charAt(sUrl.length - 1) == ';' ? '' : ';'); +} + +// This function is for SMF 1.1.x as well as SMF 2RC1.2 and below. +function sp_compat_showMoreSmileys(postbox, sTitleText, sPickText, sCloseText, smf_theme_url, smf_smileys_url) +{ + if (this.oSmileyPopupWindow) + this.oSmileyPopupWindow.close(); + + this.oSmileyPopupWindow = window.open('', 'add_smileys', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,width=480,height=220,resizable=yes'); + this.oSmileyPopupWindow.document.write('\n'); + this.oSmileyPopupWindow.document.write('\n\t\n\t\t' + sTitleText + '\n\t\t\n\t'); + this.oSmileyPopupWindow.document.write('\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    ' + sPickText + '
    '); + + for (i = 0; i < sp_smileys.length; i++) + { + sp_smileys[i][2] = sp_smileys[i][2].replace(/"/g, '"'); + sp_smileys[i][0] = sp_smileys[i][0].replace(/"/g, '"'); + this.oSmileyPopupWindow.document.write('' + sp_smileys[i][2] + ' '); + } + + this.oSmileyPopupWindow.document.write('
    ' + sCloseText + '
    '); + this.oSmileyPopupWindow.document.write('\n\t\n'); + this.oSmileyPopupWindow.document.close(); +} + +// This function is for SMF 2 RC2 and above. +function sp_showMoreSmileys(postbox, sTitleText, sPickText, sCloseText, smf_theme_url, smf_smileys_url) +{ + if (this.oSmileyPopupWindow != null && 'closed' in this.oSmileyPopupWindow && !this.oSmileyPopupWindow.closed) + { + this.oSmileyPopupWindow.focus(); + return; + } + + if (sp_smileyRowsContent == undefined) + { + var sp_smileyRowsContent = ''; + for (i = 0; i < sp_smileys.length; i++) + { + sp_smileys[i][2] = sp_smileys[i][2].replace(/"/g, '"'); + sp_smileys[i][0] = sp_smileys[i][0].replace(/"/g, '"'); + sp_smileyRowsContent += '' + sp_smileys[i][2] + ' '; + } + + } + + this.oSmileyPopupWindow = window.open('', 'add_smileys', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,width=480,height=220,resizable=yes'); + + // Paste the template in the popup. + this.oSmileyPopupWindow.document.open('text/html', 'replace'); + this.oSmileyPopupWindow.document.write(sp_moreSmileysTemplate.easyReplace({ + smileyRows: sp_smileyRowsContent + })); + + this.oSmileyPopupWindow.document.close(); +} \ No newline at end of file diff --git a/Themes/default/scripts/script.js b/Themes/default/scripts/script.js index e301940..f6a08d2 100644 --- a/Themes/default/scripts/script.js +++ b/Themes/default/scripts/script.js @@ -1070,7 +1070,7 @@ JumpTo.prototype.fillSelect = function (aBoardsAndCategories) oOption = document.createElement('option'); oOption.appendChild(document.createTextNode((aBoardsAndCategories[i].isCategory ? this.opt.sCatPrefix : sChildLevelPrefix + this.opt.sBoardPrefix) + aBoardsAndCategories[i].name)); - oOption.value = aBoardsAndCategories[i].isCategory ? '#c' + aBoardsAndCategories[i].id : '?board=' + aBoardsAndCategories[i].id + '.0'; + oOption.value = aBoardsAndCategories[i].isCategory ? '?action=forum#c' + aBoardsAndCategories[i].id : '?board=' + aBoardsAndCategories[i].id + '.0'; oListFragment.appendChild(oOption); if (aBoardsAndCategories[i].isCategory) diff --git a/index.php b/index.php index 3d123ed..0fa28a9 100644 --- a/index.php +++ b/index.php @@ -54,6 +54,7 @@ require_once($sourcedir . '/Subs.php'); require_once($sourcedir . '/Errors.php'); require_once($sourcedir . '/Load.php'); require_once($sourcedir . '/Security.php'); +require_once($sourcedir . '/Subs-Portal.php'); // Using an pre-PHP 5.1 version? if (@version_compare(PHP_VERSION, '5.1') == -1) @@ -205,11 +206,18 @@ function smf_main() // Log this user as online. writeLog(); - // Track forum statistics and hits...? - if (!empty($modSettings['hitStats'])) - trackStats(array('hits' => '+')); + // Don't track stats of portal xml actions. + if (empty($_REQUEST['action']) || $_REQUEST['action'] != 'portal' || !isset($_GET['xml'])) + { + // Track forum statistics and hits...? + if (!empty($modSettings['hitStats'])) + trackStats(array('hits' => '+')); + } } + // Load SimplePortal. + sportal_init(); + // Is the forum in maintenance mode? (doesn't apply to administrators.) if (!empty($maintenance) && !allowedTo('admin_forum')) { @@ -234,6 +242,11 @@ function smf_main() } elseif (empty($_REQUEST['action'])) { + // Go catch it boy! Catch it! + $sp_action = sportal_catch_action(); + if ($sp_action) + return $sp_action; + // Action and board are both empty... BoardIndex! if (empty($board) && empty($topic)) { @@ -273,6 +286,8 @@ function smf_main() 'editpoll2' => array('Poll.php', 'EditPoll2'), 'emailuser' => array('SendTopic.php', 'EmailUser'), 'findmember' => array('Subs-Auth.php', 'JSMembers'), + 'forum' => array('BoardIndex.php', 'BoardIndex'), + 'portal' => array('PortalMain.php', 'sportal_main'), 'groups' => array('Groups.php', 'Groups'), 'help' => array('Help.php', 'ShowHelp'), 'helpadmin' => array('Help.php', 'ShowAdminHelp'), @@ -341,6 +356,9 @@ function smf_main() // Allow modifying $actionArray easily. call_integration_hook('integrate_actions', array(&$actionArray)); + if (!empty($context['disable_sp'])) + unset($actionArray['portal'], $actionArray['forum']); + // Get the function and file to include - if it's not there, do the board index. if (!isset($_REQUEST['action']) || !isset($actionArray[$_REQUEST['action']])) {

    Ph8|@Q=j*$00rmeq6AxU0n3l-me}^K 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≪Re> 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 aj9A4nJWlKZY|P;R@HnISEiz6lm-9bXS_PZ{ literal 0 HcmV?d00001 diff --git a/Packages/backups/2014-05-19_before_SimplePortal_2_2.tar.gz b/Packages/backups/2014-05-19_before_SimplePortal_2_2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7a729804dd79187957b722563098cce8b4169a97 GIT binary patch literal 3058 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 aj9A4nJWlKZY|P;R@HnISEiz6lm-9bXS_PZ{ literal 0 HcmV?d00001 diff --git a/Packages/installed.list b/Packages/installed.list index 5958f50..23837ff 100644 --- a/Packages/installed.list +++ b/Packages/installed.list @@ -1 +1 @@ -1392908711 \ No newline at end of file +1400527916 \ No newline at end of file diff --git a/PortalStandalone.php b/PortalStandalone.php new file mode 100644 index 0000000..f090e17 --- /dev/null +++ b/PortalStandalone.php @@ -0,0 +1,76 @@ +> "Configuration" >> "General Settings" + + Select "Standalone" mode as "Portal Mode" + + Set "Standalone URL" as the full url of this file. + + Edit path to the forum ($forum_dir) in this file. + + See? It's just magic! + +*/ + +global $sp_standalone; + +// Should be the full path! +$forum_dir = '/home/www-data/htdocs/moparscape.org/smf'; + +// Let them know the mode. +$sp_standalone = true; + +// Hmm, wrong forum dir? +if (!file_exists($forum_dir . '/index.php')) + die('Wrong $forum_dir value. Please make sure that the $forum_value variable points to your forum\'s directory.'); + +// Get out the forum's SMF version number. +$data = substr(file_get_contents($forum_dir . '/index.php'), 0, 4096); +if (preg_match('~\*\s*Software\s+Version:\s+(SMF\s+.+?)[\s]{2}~i', $data, $match)) + $forum_version = $match[1]; +elseif (preg_match('~\*\s@version\s+(.+)[\s]{2}~i', $data, $match)) + $forum_version = 'SMF ' . $match[1]; + +// Call the SSI magic. +require_once($forum_dir . '/SSI.php'); + +// Wireless? We don't support you, yet. +if (WIRELESS) + redirectexit(); + +// Get our main file. +require_once($sourcedir . '/PortalMain.php'); + +// Re-initialize SP. +sportal_init(true); + +// Get the page ready. +sportal_main(); + +// Here we go! +obExit(true); + +?> \ No newline at end of file diff --git a/SSI.php b/SSI.php index 8988fe3..b0e28c1 100644 --- a/SSI.php +++ b/SSI.php @@ -64,6 +64,7 @@ require_once($sourcedir . '/Subs.php'); require_once($sourcedir . '/Errors.php'); require_once($sourcedir . '/Load.php'); require_once($sourcedir . '/Security.php'); +require_once($sourcedir . '/Subs-Portal.php'); // Using an pre-PHP 5.1 version? if (@version_compare(PHP_VERSION, '5.1') == -1) @@ -144,6 +145,9 @@ loadPermissions(); // Load the current or SSI theme. (just use $ssi_theme = id_theme;) loadTheme(isset($ssi_theme) ? (int) $ssi_theme : 0); +// Load some SP stuff. +sportal_init(); + // Take care of any banning that needs to be done. if (isset($_REQUEST['ssi_ban']) || (isset($ssi_ban) && $ssi_ban === true)) is_not_banned(); diff --git a/Sources/Admin.php b/Sources/Admin.php index 610013c..a4eca87 100644 --- a/Sources/Admin.php +++ b/Sources/Admin.php @@ -286,6 +286,77 @@ function AdminMain() ), ), ), + 'portal' => array( + 'title' => $txt['sp-adminCatTitle'], + 'permission' => array('sp_admin', 'sp_manage_settings', 'sp_manage_blocks', 'sp_manage_articles', 'sp_manage_pages', 'sp_manage_shoutbox'), + 'areas' => array( + 'portalconfig' => array( + 'label' => $txt['sp-adminConfiguration'], + 'file' => 'PortalAdminMain.php', + 'function' => 'sportal_admin_config_main', + 'icon' => 'configuration.png', + 'permission' => array('sp_admin', 'sp_manage_settings'), + 'subsections' => array( + 'information' => array($txt['sp-info_title']), + 'generalsettings' => array($txt['sp-adminGeneralSettingsName']), + 'blocksettings' => array($txt['sp-adminBlockSettingsName']), + 'articlesettings' => array($txt['sp-adminArticleSettingsName']), + ), + ), + 'portalblocks' => array( + 'label' => $txt['sp-blocksBlocks'], + 'file' => 'PortalAdminBlocks.php', + 'function' => 'sportal_admin_blocks_main', + 'icon' => 'blocks.png', + 'permission' => array('sp_admin', 'sp_manage_blocks'), + 'subsections' => array( + 'list' => array($txt['sp-adminBlockListName']), + 'add' => array($txt['sp-adminBlockAddName']), + 'header' => array($txt['sp-positionHeader']), + 'left' => array($txt['sp-positionLeft']), + 'top' => array($txt['sp-positionTop']), + 'bottom' => array($txt['sp-positionBottom']), + 'right' => array($txt['sp-positionRight']), + 'footer' => array($txt['sp-positionFooter']), + ), + ), + 'portalarticles' => array( + 'label' => $txt['sp-adminColumnArticles'], + 'file' => 'PortalAdminArticles.php', + 'function' => 'sportal_admin_articles_main', + 'icon' => 'articles.png', + 'permission' => array('sp_admin', 'sp_manage_articles'), + 'subsections' => array( + 'articles' => array($txt['sp-adminArticleListName']), + 'addarticle' => array($txt['sp-adminArticleAddName']), + 'categories' => array($txt['sp-adminCategoryListName']), + 'addcategory' => array($txt['sp-adminCategoryAddName']), + ), + ), + 'portalpages' => array( + 'label' => $txt['sp_admin_pages_title'], + 'file' => 'PortalAdminPages.php', + 'function' => 'sportal_admin_pages_main', + 'icon' => 'pages.png', + 'permission' => array('sp_admin', 'sp_manage_pages'), + 'subsections' => array( + 'list' => array($txt['sp_admin_pages_list']), + 'add' => array($txt['sp_admin_pages_add']), + ), + ), + 'portalshoutbox' => array( + 'label' => $txt['sp_admin_shoutbox_title'], + 'file' => 'PortalAdminShoutbox.php', + 'function' => 'sportal_admin_shoutbox_main', + 'icon' => 'shoutbox.png', + 'permission' => array('sp_admin', 'sp_manage_shoutbox'), + 'subsections' => array( + 'list' => array($txt['sp_admin_shoutbox_list']), + 'add' => array($txt['sp_admin_shoutbox_add']), + ), + ), + ), + ), 'members' => array( 'title' => $txt['admin_manage_members'], 'permission' => array('moderate_forum', 'manage_membergroups', 'manage_bans', 'manage_permissions', 'admin_forum'), @@ -724,7 +795,7 @@ function AdminSearchInternal() // All the files we need to include. $include_files = array( 'ManageSettings', 'ManageBoards', 'ManageNews', 'ManageAttachments', 'ManageCalendar', 'ManageMail', 'ManagePaid', 'ManagePermissions', - 'ManagePosts', 'ManageRegistration', 'ManageSearch', 'ManageSearchEngines', 'ManageServer', 'ManageSmileys', + 'ManagePosts', 'ManageRegistration', 'ManageSearch', 'ManageSearchEngines', 'ManageServer', 'ManageSmileys', 'PortalAdminMain', ); foreach ($include_files as $file) require_once($sourcedir . '/' . $file . '.php'); @@ -795,6 +866,13 @@ function AdminSearchInternal() array('ModifyPruningSettings', 'area=logs;sa=pruning'), ); + // We are more than "real freaking good" Grudge. ;P + $settings_search = array_merge($settings_search, array( + array('sportal_admin_general_settings', 'area=portalconfig;sa=generalsettings'), + array('sportal_admin_block_settings', 'area=portalconfig;sa=blocksettings'), + array('sportal_admin_article_settings', 'area=portalconfig;sa=articlesettings'), + )); + foreach ($settings_search as $setting_area) { // Get a list of their variables. diff --git a/Sources/BoardIndex.php b/Sources/BoardIndex.php index d48422e..98920ea 100644 --- a/Sources/BoardIndex.php +++ b/Sources/BoardIndex.php @@ -43,7 +43,7 @@ function BoardIndex() $context['canonical_url'] = $scripturl; // Do not let search engines index anything if there is a random thing in $_GET. - if (!empty($_GET)) + if (!empty($_GET) && $_GET !== array('action' => 'forum')) $context['robot_no_index'] = true; // Retrieve the categories and boards. diff --git a/Sources/Display.php b/Sources/Display.php index c53df5d..cf7b531 100644 --- a/Sources/Display.php +++ b/Sources/Display.php @@ -372,6 +372,18 @@ function Display() censorText($topicinfo['subject']); $context['page_title'] = $topicinfo['subject']; + // Is this already an article? + $request = $smcFunc['db_query']('',' + SELECT id_message + FROM {db_prefix}sp_articles + WHERE id_message = {int:message}', + array( + 'message' => $context['topic_first_message'], + ) + ); + list ($context['topic_is_article']) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + // Is this topic sticky, or can it even be? $topicinfo['is_sticky'] = empty($modSettings['enableStickyTopics']) ? '0' : $topicinfo['is_sticky']; diff --git a/Sources/Help.php b/Sources/Help.php index 2896e60..ccf3f15 100644 --- a/Sources/Help.php +++ b/Sources/Help.php @@ -81,6 +81,8 @@ function ShowAdminHelp() // Load the admin help language file and template. loadLanguage('Help'); + // Load the Simple Portal Help file. + loadLanguage('SPortalHelp', sp_languageSelect('SPortalHelp')); // Permission specific help? if (isset($_GET['help']) && substr($_GET['help'], 0, 14) == 'permissionhelp') diff --git a/Sources/Load.php b/Sources/Load.php index 2bc4f41..f10b529 100644 --- a/Sources/Load.php +++ b/Sources/Load.php @@ -1401,6 +1401,19 @@ function loadTheme($id_theme = 0, $initialize = true) else $id_theme = $modSettings['theme_guests']; + global $sp_standalone; + + // Maybe we have a portal specific theme? + if (!isset($_GET['action']) && !isset($_GET['board']) && !isset($_GET['topic']) && ($modSettings['sp_portal_mode'] == 1 || !empty($sp_standalone)) && !empty($modSettings['portaltheme'])) + $id_theme = (int) $modSettings['portaltheme']; + + // SMF doesn't seem to be liking -1... + if ($id_theme == -1 && !empty($_SESSION['id_theme'])) + { + unset($_SESSION['id_theme']); + $id_theme = $modSettings['theme_guests']; + } + // Verify the id_theme... no foul play. // Always allow the board specific theme, if they are overriding. if (!empty($board_info['theme']) && $board_info['override_theme']) @@ -1655,6 +1668,12 @@ function loadTheme($id_theme = 0, $initialize = true) 'spellcheck', ); + // We'll be on the safe side, and load our language here! + loadLanguage('SPortal', '', false); + $cur_language = isset($user_info['language']) ? $user_info['language'] : $language; + if ($cur_language !== 'english') + loadLanguage('SPortal', 'english', false); + // Wireless mode? Load up the wireless stuff. if (WIRELESS) { diff --git a/Sources/ManagePermissions.php b/Sources/ManagePermissions.php index 99d258d..113175e 100644 --- a/Sources/ManagePermissions.php +++ b/Sources/ManagePermissions.php @@ -1413,6 +1413,7 @@ function loadAllPermissions($loadType = 'classic') 'simple' => array( 'view_basic_info', 'use_pm_system', + 'sp', 'post_calendar', 'edit_profile', 'delete_account', @@ -1423,6 +1424,7 @@ function loadAllPermissions($loadType = 'classic') 'classic' => array( 'general', 'pm', + 'sp', 'calendar', 'maintenance', 'member_admin', @@ -1467,6 +1469,15 @@ function loadAllPermissions($loadType = 'classic') 'search_posts' => array(false, 'general', 'view_basic_info'), 'karma_edit' => array(false, 'general', 'moderate_general'), 'pm_read' => array(false, 'pm', 'use_pm_system'), + 'sp_admin' => array(false, 'sp', 'sp'), + 'sp_manage_settings' => array(false, 'sp', 'sp'), + 'sp_manage_blocks' => array(false, 'sp', 'sp'), + 'sp_manage_articles' => array(false, 'sp', 'sp'), + 'sp_manage_pages' => array(false, 'sp', 'sp'), + 'sp_manage_shoutbox' => array(false, 'sp', 'sp'), + 'sp_add_article' => array(false, 'sp', 'sp'), + 'sp_auto_article_approval' => array(false, 'sp', 'sp'), + 'sp_remove_article' => array(false, 'sp', 'sp'), 'pm_send' => array(false, 'pm', 'use_pm_system'), 'calendar_view' => array(false, 'calendar', 'view_basic_info'), 'calendar_post' => array(false, 'calendar', 'post_calendar'), diff --git a/Sources/ManageServer.php b/Sources/ManageServer.php index 9bf0226..b20d387 100644 --- a/Sources/ManageServer.php +++ b/Sources/ManageServer.php @@ -1824,6 +1824,7 @@ function prepareDBSettingContext(&$config_vars) global $txt, $helptxt, $context, $modSettings, $sourcedir; loadLanguage('Help'); + loadLanguage('SPortalHelp', sp_languageSelect('SPortalHelp')); $context['config_vars'] = array(); $inlinePermissions = array(); diff --git a/Sources/PortalAdminArticles.php b/Sources/PortalAdminArticles.php new file mode 100644 index 0000000..8f19ad3 --- /dev/null +++ b/Sources/PortalAdminArticles.php @@ -0,0 +1,812 @@ + 'sportal_admin_article_list', + 'addarticle' => 'sportal_admin_article_add', + 'editarticle' => 'sportal_admin_article_edit', + 'deletearticle' => 'sportal_admin_article_delete', + 'categories' => 'sportal_admin_category_list', + 'addcategory' => 'sportal_admin_category_add', + 'editcategory' => 'sportal_admin_category_edit', + 'deletecategory' => 'sportal_admin_category_delete', + 'statechange' => 'sportal_admin_state_change', + ); + + $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'articles'; + + $context['sub_action'] = $_REQUEST['sa']; + + $context[$context['admin_menu_name']]['tab_data'] = array( + 'title' => $txt['sp-adminCatTitle'], + 'help' => 'sp_ArticlesArea', + 'description' => $txt['sp-adminCatDesc'], + 'tabs' => array( + 'articles' => array( + 'description' => $txt['sp-adminArticleListDesc'], + ), + 'addarticle' => array( + 'description' => $txt['sp-adminArticleAddDesc'], + ), + 'categories' => array( + 'description' => $txt['sp-adminCategoryListDesc'], + ), + 'addcategory' => array( + 'description' => $txt['sp-adminCategoryAddDesc'], + ), + ), + ); + + $subActions[$_REQUEST['sa']](); +} + +// Function to 'Show' a list of Articles, and allow 'quick' deletion of them. +function sportal_admin_article_list() +{ + global $txt, $smcFunc, $context, $article_request, $scripturl; + + // Call the template. + $context['sub_template'] = 'article_list'; + + // You clicked the remove button? Naughty boy. :P + if (!empty($_POST['removeArticles']) && !empty($_POST['remove']) && is_array($_POST['remove'])) + { + // Are you even allowed to be here? + checkSession(); + + // Sanitize the articles to remove non integers. + foreach ($_POST['remove'] as $index => $article_id) + $_POST['remove'][(int) $index] = (int) $article_id; + + // Delete the required articles. + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_articles + WHERE id_article IN ({array_int:remove})', + array( + 'remove' => $_POST['remove'], + ) + ); + + // Fix the category article count. + fixCategoryArticles(); + } + + // How can we sort the list of articles? + $sort_methods = array( + 'topic' => array( + 'down' => 'm.subject ASC', + 'up' => 'm.subject DESC' + ), + 'board' => array( + 'down' => 'b.name ASC', + 'up' => 'b.name DESC' + ), + 'poster' => array( + 'down' => 'm.poster_name ASC', + 'up' => 'm.poster_name DESC' + ), + 'time' => array( + 'down' => 'm.poster_time ASC', + 'up' => 'm.poster_time DESC' + ), + 'category' => array( + 'down' => 'c.name ASC', + 'up' => 'c.name DESC' + ), + 'approved' => array( + 'down' => 'a.approved ASC', + 'up' => 'a.approved DESC' + ), + ); + + // Columns to show. + $context['columns'] = array( + 'topic' => array( + 'width' => '20%', + 'label' => $txt['sp-adminColumnTopic'], + 'class' => 'first_th', + 'sortable' => true + ), + 'board' => array( + 'width' => '20%', + 'label' => $txt['sp-adminColumnBoard'], + 'sortable' => true + ), + 'poster' => array( + 'width' => '10%', + 'label' => $txt['sp-adminColumnPoster'], + 'sortable' => true + ), + 'time' => array( + 'width' => '17%', + 'label' => $txt['sp-adminColumnTime'], + 'sortable' => true + ), + 'category' => array( + 'width' => '20%', + 'label' => $txt['sp-adminColumnCategory'], + 'sortable' => true + ), + 'approved' => array( + 'width' => '8%', + 'label' => $txt['sp-adminColumnApproved'], + 'sortable' => true, + ), + 'actions' => array( + 'width' => '5%', + 'label' => $txt['sp-adminColumnAction'], + 'sortable' => false + ) + ); + + // Default sort is according to the topic. + if (!isset($_REQUEST['sort']) || !isset($sort_methods[$_REQUEST['sort']])) + $_REQUEST['sort'] = 'topic'; + + // Setup the sort links. + foreach ($context['columns'] as $col => $dummy) + { + $context['columns'][$col]['selected'] = $col == $_REQUEST['sort']; + $context['columns'][$col]['href'] = $scripturl . '?action=admin;area=portalarticles;sa=articles;sort=' . $col; + + if (!isset($_REQUEST['desc']) && $col == $_REQUEST['sort']) + $context['columns'][$col]['href'] .= ';desc'; + + $context['columns'][$col]['link'] = '' . $context['columns'][$col]['label'] . ''; + } + + $context['sort_by'] = $_REQUEST['sort']; + $context['sort_direction'] = !isset($_REQUEST['desc']) ? 'down' : 'up'; + + // Count all the articles. + $request = $smcFunc['db_query']('',' + SELECT COUNT(*) + FROM {db_prefix}sp_articles AS a + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) + INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) + WHERE {query_see_board}' + ); + list ($context['total_articles']) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + // Construct the page index. 20 articles per page. + $context['page_index'] = constructPageIndex($scripturl . '?action=admin;area=portalarticles;sa=articles;sort=' . $_REQUEST['sort'] . (isset($_REQUEST['desc']) ? ';desc' : ''), $_REQUEST['start'], $context['total_articles'], 20); + $context['start'] = $_REQUEST['start']; + + // A *small* query to get article info. + $article_request = $smcFunc['db_query']('',' + SELECT a.id_article, a.id_category, a.id_message, a.approved, c.name as cname, m.id_member, m.poster_name, + m.poster_time, m.subject, t.id_topic, t.num_replies, t.num_views, b.id_board, b.name as bname, mem.real_name + FROM {db_prefix}sp_articles AS a + INNER JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category) + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) + INNER JOIN {db_prefix}topics AS t ON (t.id_first_msg = a.id_message) + INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) + WHERE {query_see_board} + ORDER BY {raw:sort} + LIMIT {int:start}, {int:limit}', + array( + 'sort' => $sort_methods[$_REQUEST['sort']][$context['sort_direction']], + 'start' => $context['start'], + 'limit' => 20, + ) + ); + + // Call-back... + $context['get_article'] = 'sportal_admin_articles_callback'; + $context['page_title'] = $txt['sp-adminArticleListName']; +} + +// Call-back for getting a row of article data. +function sportal_admin_articles_callback($reset = false) +{ + global $scripturl, $article_request, $txt, $context, $settings, $smcFunc; + + if ($article_request == false) + return false; + + if (!($row = $smcFunc['db_fetch_assoc']($article_request))) + return false; + + // Build up the array. + $output = array( + 'article' => array( + 'id' => $row['id_article'], + 'approved' => $row['approved'], + ), + 'category' => array( + 'id' => $row['id_category'], + 'name' => ''.$row['cname'].'', + ), + 'message' => array( + 'id' => $row['id_message'], + 'subject' => $row['subject'], + 'time' => timeformat($row['poster_time'], '%H:%M:%S, %d/%m/%y'), + ), + 'poster' => array( + 'id' => $row['id_member'], + 'name' => $row['poster_name'], + 'link' => !empty($row['id_member']) ? '' . $row['real_name'] . '' : $row['poster_name'], + ), + 'topic' => array( + 'id' => $row['id_topic'], + 'replies' => $row['num_replies'], + 'views' => $row['num_views'], + 'link' => '' . $row['subject'] . '', + ), + 'board' => array( + 'id' => $row['id_board'], + 'name' => $row['bname'], + 'link' => '' . $row['bname'] . '', + ), + 'edit' => '' . sp_embed_image('modify') . '', + 'delete' => '' . sp_embed_image('delete') . '' + ); + + return $output; +} + +// Function for adding articles. +function sportal_admin_article_add() +{ + global $txt, $context, $scripturl, $smcFunc, $modSettings; + + // Are we ready? + if(empty($_POST['createArticle']) || empty($_POST['articles'])) + { + // List all the categories. + $context['list_categories'] = getCategoryInfo(); + + // Do we have any category to add? + if(empty($context['list_categories'])) + fatal_error($txt['error_sp_no_category'] . '
    ' . sprintf($txt['error_sp_no_category_sp_moderator'], $scripturl . '?action=admin;area=portalarticles;sa=addcategory'), false); + + // Which board to show? + if(isset($_REQUEST['targetboard'])) + $_REQUEST['targetboard'] = (int) $_REQUEST['targetboard']; + else + { + // Find one yourself. + $request = $smcFunc['db_query']('',' + SELECT b.id_board + FROM {db_prefix}boards AS b + WHERE b.redirect = \'\' + AND {query_see_board} + ORDER BY b.id_board DESC + LIMIT 1' + ); + list ($_REQUEST['targetboard']) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + } + + $context['target_board'] = $_REQUEST['targetboard']; + + // Get the total topic count. + $request = $smcFunc['db_query']('',' + SELECT COUNT(*) + FROM {db_prefix}topics as t + INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board) + LEFT JOIN {db_prefix}sp_articles as a ON (a.id_message = t.id_first_msg) + WHERE t.id_board = {int:targetboard} + AND IFNULL(a.id_article, 0) = 0 + AND {query_see_board}', + array( + 'targetboard' => $_REQUEST['targetboard'], + ) + ); + list ($topiccount) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + // Create the page index. + $context['page_index'] = constructPageIndex($scripturl . '?action=admin;area=portalarticles;sa=addarticle;targetboard=' . $_REQUEST['targetboard'] . ';board=' . $_REQUEST['targetboard'] . '.%d', $_REQUEST['start'], $topiccount, $modSettings['defaultMaxTopics'], true); + + // Get some info about the boards and categories. + $request = $smcFunc['db_query']('',' + SELECT b.id_board, b.name AS bName, c.name AS cName + FROM {db_prefix}boards AS b + LEFT JOIN {db_prefix}categories AS c ON (c.id_cat = b.id_cat) + WHERE b.redirect = \'\' + AND {query_see_board}' + ); + $context['boards'] = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $context['boards'][] = array( + 'id' => $row['id_board'], + 'name' => $row['bName'], + 'category' => $row['cName'] + ); + $smcFunc['db_free_result']($request); + + // Time to get the topic data. + $request = $smcFunc['db_query']('',' + SELECT t.id_topic, m.subject, m.id_member, IFNULL(mem.real_name, m.poster_name) AS poster_name, m.id_msg + FROM {db_prefix}topics AS t + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) + INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) + LEFT JOIN {db_prefix}sp_articles as a ON (a.id_message = t.id_first_msg) + WHERE IFNULL(a.id_article, 0) = {int:article} + AND t.id_board = {int:targetboard} + AND {query_see_board} + ORDER BY ' . (!empty($modSettings['enableStickyTopics']) ? 't.is_sticky DESC, ' : '') . 't.id_last_msg DESC + LIMIT {int:start}, {int:max}', + array( + 'article' => 0, + 'targetboard' => $_REQUEST['targetboard'], + 'start' => $_REQUEST['start'], + 'max' => $modSettings['defaultMaxTopics'], + ) + ); + $context['topics'] = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + censorText($row['subject']); + + $context['topics'][] = array( + 'id' => $row['id_topic'], + 'msg_id' => $row['id_msg'], + 'poster' => array( + 'id' => $row['id_member'], + 'name' => $row['poster_name'], + 'href' => empty($row['id_member']) ? '' : $scripturl . '?action=profile;u=' . $row['id_member'], + 'link' => empty($row['id_member']) ? $row['poster_name'] : '' . $row['poster_name'] . '' + ), + 'subject' => $row['subject'], + 'js_subject' => addcslashes(addslashes($row['subject']), '/') + ); + } + $smcFunc['db_free_result']($request); + + // Set the page title and sub-template. + $context['page_title'] = $txt['sp-articlesAdd']; + $context['sub_template'] = 'article_add'; + } + else + { + // But can you? + checkSession(); + + // Are they integer? + foreach ($_POST['articles'] as $index => $article_id) + $_POST['articles'][(int) $index] = (int) $article_id; + + // Add all of them. + foreach($_POST['articles'] as $article) { + + // Set them. They have their own IDs. + $articleOptions = array( + 'id_category' => !empty($_POST['category']) ? (int) $_POST['category'] : 0, + 'id_message' => $article, + 'approved' => 1, + ); + + // A tricky function. + createArticle($articleOptions); + } + + // Time to go back. + redirectexit('action=admin;area=portalarticles;sa=articles'); + } +} + +// Function for editing an article. +function sportal_admin_article_edit() +{ + global $txt, $smcFunc, $context; + global $func; + + // Seems that we aren't ready. + if(empty($_POST['add_article'])) + { + // Check it as we just accept integer. + $_REQUEST['article_id'] = (int) $_REQUEST['article_id']; + + // Do we know the one to be edited? + if(empty($_REQUEST['article_id'])) + fatal_lang_error('error_sp_id_empty', false); + + // Get the article info. + $context['article_info'] = getArticleInfo($_REQUEST['article_id']); + $context['article_info'] = $context['article_info'][0]; + + // List all the categories. + $context['list_categories'] = getCategoryInfo(); + + // Call the right template. + $context['page_title'] = $txt['sp-articlesEdit']; + $context['sub_template'] = 'article_edit'; + } + else + { + // A small array. + $articleInfo = array( + 'category' => $_POST['category'], + 'approved' => empty($_POST['approved']) ? '0' : '1', + ); + + // Do it please. + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_articles + SET id_category = {int:category}, approved = {int:approved} + WHERE id_article = {int:id}', + array( + 'id' => $_POST['article_id'], + 'category' => $articleInfo['category'], + 'approved' => $articleInfo['approved'], + ) + ); + + // Fix the article counts. + fixCategoryArticles(); + + // I wanna go back to the list. :) + redirectexit('action=admin;area=portalarticles;sa=articles'); + } +} + +// Deleting an article... +function sportal_admin_article_delete() +{ + global $smcFunc, $context; + + // Check if he can? + checkSession('get'); + + // We just accept integers. + $_REQUEST['article_id'] = (int) $_REQUEST['article_id']; + + // Can't delete without an ID. + if(empty($_REQUEST['article_id'])) + fatal_lang_error('error_sp_id_empty', false); + + // Life is short... Delete it. + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_articles + WHERE id_article = {int:id}', + array( + 'id' => $_REQUEST['article_id'], + ) + ); + + // Fix the article counts. + fixCategoryArticles(); + + // Again comes the list. + redirectexit('action=admin;area=portalarticles;sa=articles'); +} + +// Gets the category list. +function sportal_admin_category_list() +{ + global $txt, $context; + + // Category list columns. + $context['columns'] = array( + 'picture' => array( + 'width' => '35%', + 'label' => $txt['sp-adminColumnPicture'], + 'class' => 'first_th', + ), + 'name' => array( + 'width' => '45%', + 'label' => $txt['sp-adminColumnName'], + ), + 'articles' => array( + 'width' => '5%', + 'label' => $txt['sp-adminColumnArticles'], + ), + 'publish' => array( + 'width' => '5%', + 'label' => $txt['sp-adminColumnPublish'], + ), + 'action' => array( + 'width' => '10%', + 'label' => $txt['sp-adminColumnAction'], + 'class' => 'last_th', + ), + ); + + // Get all the categories. + $context['categories'] = getCategoryInfo(); + + // Call the sub template. + $context['sub_template'] = 'category_list'; + $context['page_title'] = $txt['sp-adminCategoryListName']; +} + +// Function for adding a category. +function sportal_admin_category_add() +{ + global $txt, $smcFunc, $context, $func; + + // Not actually adding a category? Show the add category page. + if(empty($_POST['edit_category'])) + { + // Just we need the template. + $context['sub_template'] = 'category_edit'; + $context['page_title'] = $txt['sp-categoriesAdd']; + $context['category_action'] = 'add'; + } + // Adding a category? Lets do this thang! ;D + else + { + // Session check. + checkSession(); + + // Category name can't be empty. + if (empty($_POST['category_name'])) + fatal_lang_error('error_sp_name_empty', false); + + // A small info array. + $categoryInfo = array( + 'name' => $smcFunc['htmlspecialchars']($_POST['category_name'], ENT_QUOTES), + 'picture' => $smcFunc['htmlspecialchars']($_POST['picture_url'], ENT_QUOTES), + 'publish' => empty($_POST['show_on_index']) ? '0' : '1', + ); + + // Insert the category data. + $smcFunc['db_insert']('normal', '{db_prefix}sp_categories', + // Columns to insert. + array( + 'name' => 'string', + 'picture' => 'string', + 'articles' => 'int', + 'publish' => 'int' + ), + // Data to put in. + array( + 'name' => $categoryInfo['name'], + 'picture' => $categoryInfo['picture'], + 'articles' => 0, + 'publish' => $categoryInfo['publish'] + ), + // We had better tell SMF about the key, even though I can't remember why? ;) + array('id_category') + ); + + // Return back to the category list. + redirectexit('action=admin;area=portalarticles;sa=categories'); + } +} + +// Handles the category edit issue. +function sportal_admin_category_edit() +{ + global $txt, $smcFunc, $context, $func; + + // Not Time to edit? Show the cagegory edit page. + if(empty($_POST['edit_category'])) + { + // Be sure you made it an integer. + $_REQUEST['category_id'] = (int) $_REQUEST['category_id']; + + // Show you ID. + if(empty($_REQUEST['category_id'])) + fatal_lang_error('error_sp_id_empty', false); + + // Get the category info. You need in template. + $context['category_info'] = getCategoryInfo($_REQUEST['category_id']); + $context['category_info'] = $context['category_info'][0]; + + // Call the right sub template. + $context['sub_template'] = 'category_edit'; + $context['page_title'] = $txt['sp-categoriesEdit']; + $context['category_action'] = 'edit'; + } + // Perform the actual edits. + else + { + // Again. + checkSession(); + + // Why empty? :S + if (empty($_POST['category_name'])) + fatal_lang_error('error_sp_name_empty', false); + + // Array for the db. + $categoryInfo = array( + 'name' => $smcFunc['htmlspecialchars']($_POST['category_name'], ENT_QUOTES), + 'picture' => $smcFunc['htmlspecialchars']($_POST['picture_url'], ENT_QUOTES), + 'publish' => empty($_POST['show_on_index']) ? '0' : '1', + ); + + // What to change? + $category_fields = array(); + $category_fields[] = "name = {string:name}"; + $category_fields[] = "picture = {string:picture}"; + $category_fields[] = "publish = {int:publish}"; + + // Go on. + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_categories + SET ' . implode(', ', $category_fields) . ' + WHERE id_category = {int:id}', + array( + 'id' => $_POST['category_id'], + 'name' => $categoryInfo['name'], + 'picture' => $categoryInfo['picture'], + 'publish' => $categoryInfo['publish'], + ) + ); + + // Take him back to the list. + redirectexit('action=admin;area=portalarticles;sa=categories'); + } +} + +// Does more than deleting... +function sportal_admin_category_delete() +{ + global $smcFunc, $context, $txt; + + // Is an id set? If yes, then we need to get some category information. + if(!empty($_REQUEST['category_id'])) + { + // Be sure you made it an integer. + $_REQUEST['category_id'] = (int) $_REQUEST['category_id']; + + // Do you know which one to delete? + if(empty($_REQUEST['category_id'])) + fatal_lang_error('error_sp_id_empty', false); + + // Get the category info. You need in template. + $context['category_info'] = getCategoryInfo($_REQUEST['category_id']); + $context['category_info'] = $context['category_info'][0]; + + // Also get the category list. + $context['list_categories'] = getCategoryInfo(); + + // If we have one, that is itself. Delete it. + if(count($context['list_categories']) < 2) + $context['list_categories'] = array(); + } + + if(empty($_REQUEST['category_id']) && empty($_POST['category_id'])) + fatal_lang_error('error_sp_id_empty', false); + + // No need to delete articles if category has no articles. But articles are executed if there isn't any other category. :P + if(empty($_POST['delete_category']) && !empty($context['category_info']['articles'])) + { + // Call the right sub template. + $context['sub_template'] = 'category_delete'; + $context['page_title'] = $txt['sp-categoriesDelete']; + } + elseif(!empty($_POST['delete_category'])) + { + // Again. + checkSession(); + + // Are we going to move something? + if(!empty($_POST['category_move']) && !empty($_POST['category_move_to'])) { + + // We just need an integer. + $_POST['category_move_to'] = (int) $_POST['category_move_to']; + + // These are the lucky ones, move them. + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_articles + SET id_category = {int:category_move_to} + WHERE id_category = {int:category_id}', + array( + 'category_move_to' => $_POST['category_move_to'], + 'category_id' => $_POST['category_id'], + ) + ); + + // Fix the article counts. + fixCategoryArticles(); + } + else + { + // Kill 'em all. (It's not the Metallica album. :P) + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_articles + WHERE id_category = {int:category_id}', + array( + 'category_id' => $_POST['category_id'], + ) + ); + } + + // Everybody will die one day... + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_categories + WHERE id_category = {int:category_id}', + array( + 'category_id' => $_POST['category_id'], + ) + ); + + // Return to the list. + redirectexit('action=admin;area=portalarticles;sa=categories'); + } + else + { + // Again. + checkSession('get'); + + // Just delete the category. + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_categories + WHERE id_category = {int:category_id}', + array( + 'category_id' => $_REQUEST['category_id'], + ) + ); + + // Fix the article counts. + fixCategoryArticles(); + + // Return to the list. + redirectexit('action=admin;area=portalarticles;sa=categories'); + } +} + +?> \ No newline at end of file diff --git a/Sources/PortalAdminBlocks.php b/Sources/PortalAdminBlocks.php new file mode 100644 index 0000000..469e061 --- /dev/null +++ b/Sources/PortalAdminBlocks.php @@ -0,0 +1,1060 @@ + 'sportal_admin_block_list', + 'header' => 'sportal_admin_block_list', + 'left' => 'sportal_admin_block_list', + 'top' => 'sportal_admin_block_list', + 'bottom' => 'sportal_admin_block_list', + 'right' => 'sportal_admin_block_list', + 'footer' => 'sportal_admin_block_list', + 'add' => 'sportal_admin_block_edit', + 'edit' => 'sportal_admin_block_edit', + 'delete' => 'sportal_admin_block_delete', + 'move' => 'sportal_admin_block_move', + 'statechange' => 'sportal_admin_state_change', + ); + + $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'list'; + + $context['sub_action'] = $_REQUEST['sa']; + + $context[$context['admin_menu_name']]['tab_data'] = array( + 'title' => $txt['sp-blocksBlocks'], + 'help' => 'sp_BlocksArea', + 'description' => $txt['sp-adminBlockListDesc'], + 'tabs' => array( + 'list' => array( + 'description' => $txt['sp-adminBlockListDesc'], + ), + 'add' => array( + 'description' => $txt['sp-adminBlockAddDesc'], + ), + 'header' => array( + 'description' => $txt['sp-adminBlockHeaderListDesc'], + ), + 'left' => array( + 'description' => $txt['sp-adminBlockLeftListDesc'], + ), + 'top' => array( + 'description' => $txt['sp-adminBlockTopListDesc'], + ), + 'bottom' => array( + 'description' => $txt['sp-adminBlockBottomListDesc'], + ), + 'right' => array( + 'description' => $txt['sp-adminBlockRightListDesc'], + ), + 'footer' => array( + 'description' => $txt['sp-adminBlockFooterListDesc'], + ), + ), + ); + + $subActions[$_REQUEST['sa']](); +} + +// Show the Block List. +function sportal_admin_block_list() +{ + global $txt, $context, $scripturl; + + // We have 4 sides... + $context['sides'] = array( + 'header' => array( + 'id' => '5', + 'name' => 'adminHeader', + 'label' => $txt['sp-positionHeader'], + 'help' => 'sp-blocksHeaderList', + ), + 'left' => array( + 'id' => '1', + 'name' => 'adminLeft', + 'label' => $txt['sp-positionLeft'], + 'help' => 'sp-blocksLeftList', + ), + 'top' => array( + 'id' => '2', + 'name' => 'adminTop', + 'label' => $txt['sp-positionTop'], + 'help' => 'sp-blocksTopList', + ), + 'bottom' => array( + 'id' => '3', + 'name' => 'adminBottom', + 'label' => $txt['sp-positionBottom'], + 'help' => 'sp-blocksBottomList', + ), + 'right' => array( + 'id' => '4', + 'name' => 'adminRight', + 'label' => $txt['sp-positionRight'], + 'help' => 'sp-blocksRightList', + ), + 'footer' => array( + 'id' => '6', + 'name' => 'adminFooter', + 'label' => $txt['sp-positionFooter'], + 'help' => 'sp-blocksFooterList', + ), + ); + + $context['block_move'] = isset($_GET['sa']) && $_GET['sa'] == 'select' && !empty($_GET['block_id']) ? (int) $_GET['block_id'] : 0; + + $sides = array('header', 'left', 'top', 'bottom', 'right', 'footer'); + // Are we viewing any of the sub lists for an individual side? + if(in_array($context['sub_action'], $sides)) + { + // Remove any sides that we don't need to show. ;) + foreach($sides as $side) + { + if($context['sub_action'] != $side) + unset($context['sides'][$side]); + } + $context['sp_blocks_single_side_list'] = true; + } + + // Columns to show. + $context['columns'] = array( + 'label' => array( + 'width' => '40%', + 'label' => $txt['sp-adminColumnName'], + 'class' => !$context['block_move'] ? 'first_th' : '', + ), + 'type' => array( + 'width' => '40%', + 'label' => $txt['sp-adminColumnType'], + ), + 'action' => array( + 'width' => '20%', + 'label' => $txt['sp-adminColumnAction'], + 'class' => 'last_th', + ), + ); + + // Get the block info for each side. + foreach($context['sides'] as $side_id => $side) + { + $context['blocks'][$side['name']] = getBlockInfo($side['id']); + foreach ($context['blocks'][$side['name']] as $block_id => $block) + { + $context['sides'][$side_id]['last'] = $block_id; + $context['blocks'][$side['name']][$block_id]['actions'] = array( + 'state_icon' => empty($block['state']) ? '' . sp_embed_image('deactive', $txt['sp-blocksActivate']) . '' : '' . sp_embed_image('active', $txt['sp-blocksDeactivate']) . '', + 'edit' => '' . sp_embed_image('modify') . '', + 'move' => '' . sp_embed_image('move', $txt['sp-adminColumnMove']) . '', + 'delete' => '' . sp_embed_image('delete') . '', + ); + + if ($context['block_move']) + { + $context['blocks'][$side['name']][$block_id]['move_insert'] = '' . sp_embed_image('arrow', $txt['sp-blocks_move_here']) . ''; + + if ($context['block_move'] == $block_id) + $context['move_title'] = sprintf($txt['sp-blocks_select_destination'], htmlspecialchars($block['label'])); + } + } + } + + // Call the sub template. + $context['sub_template'] = 'block_list'; + $context['page_title'] = $txt['sp-adminBlockListName']; +} + +// Adding or editing a block. +function sportal_admin_block_edit() +{ + global $txt, $context, $modSettings, $smcFunc, $sourcedir, $boarddir, $boards; + + // Just in case, the admin could be doing something silly like editing a SP block while SP it disabled. ;) + require_once($sourcedir . '/PortalBlocks.php'); + + $context['SPortal']['is_new'] = empty($_REQUEST['block_id']); + + // BBC Fix move the parameter to the correct position. + if (!empty($_POST['bbc_name'])) + { + $_POST['parameters'][$_POST['bbc_name']] = !empty($_POST[$_POST['bbc_parameter']]) ? $_POST[$_POST['bbc_parameter']] : ''; + // If we came from WYSIWYG then turn it back into BBC regardless. + if (!empty($_REQUEST['bbc_' . $_POST['bbc_name'] . '_mode']) && isset($_POST['parameters'][$_POST['bbc_name']])) + { + require_once($sourcedir . '/Subs-Editor.php'); + $_POST['parameters'][$_POST['bbc_name']] = html_to_bbc($_POST['parameters'][$_POST['bbc_name']]); + // We need to unhtml it now as it gets done shortly. + $_POST['parameters'][$_POST['bbc_name']] = un_htmlspecialchars($_POST['parameters'][$_POST['bbc_name']]); + // We need this for everything else. + $_POST['parameters'][$_POST['bbc_name']] = $_POST['parameters'][$_POST['bbc_name']]; + } + } + + // Passing the selected type via $_GET instead of $_POST? + $start_parameters = array(); + if (!empty($_GET['selected_type']) && empty($_POST['selected_type'])) + { + $_POST['selected_type'] = array($_GET['selected_type']); + if (!empty($_GET['parameters'])) + { + foreach ($_GET['parameters'] as $param) + { + if (isset($_GET[$param])) + $start_parameters[$param] = $_GET[$param]; + } + } + } + + if ($context['SPortal']['is_new'] && empty($_POST['selected_type']) && empty($_POST['add_block'])) + { + $context['SPortal']['block_types'] = getFunctionInfo(); + + if (!empty($_REQUEST['col'])) + $context['SPortal']['block']['column'] = $_REQUEST['col']; + + $context['sub_template'] = 'block_select_type'; + $context['page_title'] = $txt['sp-blocksAdd']; + } + elseif ($context['SPortal']['is_new'] && !empty($_POST['selected_type'])) + { + $context['SPortal']['block'] = array( + 'id' => 0, + 'label' => $txt['sp-blocksDefaultLabel'], + 'type' => $_POST['selected_type'][0], + 'type_text' => !empty($txt['sp_function_' . $_POST['selected_type'][0] . '_label']) ? $txt['sp_function_' . $_POST['selected_type'][0] . '_label'] : $txt['sp_function_unknown_label'], + 'column' => !empty($_POST['block_column']) ? $_POST['block_column'] : 0, + 'row' => 0, + 'permission_set' => 3, + 'groups_allowed' => array(), + 'groups_denied' => array(), + 'state' => 1, + 'force_view' => 0, + 'display' => '', + 'display_custom' => '', + 'style' => '', + 'parameters' => !empty($start_parameters) ? $start_parameters : array(), + 'options'=> $_POST['selected_type'][0](array(), false, true), + 'list_blocks' => !empty($_POST['block_column']) ? getBlockInfo($_POST['block_column']) : array(), + ); + } + elseif (!$context['SPortal']['is_new'] && empty($_POST['add_block'])) + { + $_REQUEST['block_id'] = (int) $_REQUEST['block_id']; + $context['SPortal']['block'] = current(getBlockInfo(null, $_REQUEST['block_id'])); + + $context['SPortal']['block'] += array( + 'options'=> $context['SPortal']['block']['type'](array(), false, true), + 'list_blocks' => getBlockInfo($context['SPortal']['block']['column']), + ); + } + + if (!empty($_POST['preview_block'])) + { + // Just in case, the admin could be doing something silly like editing a SP block while SP it disabled. ;) + require_once($boarddir . '/SSI.php'); + sportal_init_headers(); + loadTemplate('Portal'); + + $type_parameters = $_POST['block_type'](array(), 0, true); + + if (!empty($_POST['parameters']) && is_array($_POST['parameters']) && !empty($type_parameters)) + { + foreach ($type_parameters as $name => $type) + { + if (isset($_POST['parameters'][$name])) + { + if ($type == 'bbc') + { + $parameter['value'] = $_POST['parameters'][$name]; + require_once($sourcedir . '/Subs-Post.php'); + + $parameter['value'] = $smcFunc['htmlspecialchars']($parameter['value'], ENT_QUOTES); + preparsecode($parameter['value']); + + $_POST['parameters'][$name] = $parameter['value']; + } + elseif ($type == 'boards' || $type == 'board_select') + $_POST['parameters'][$name] = is_array($_POST['parameters'][$name]) ? implode('|', $_POST['parameters'][$name]) : $_POST['parameters'][$name]; + elseif ($type == 'int' || $type == 'select') + $_POST['parameters'][$name] = (int) $_POST['parameters'][$name]; + elseif ($type == 'text' || $type == 'textarea' || is_array($type)) + $_POST['parameters'][$name] = $smcFunc['htmlspecialchars']($_POST['parameters'][$name], ENT_QUOTES); + elseif ($type == 'check') + $_POST['parameters'][$name] = !empty($_POST['parameters'][$name]) ? 1 : 0; + } + } + } + else + $_POST['parameters'] = array(); + + if (empty($_POST['display_advanced'])) + { + if (!empty($_POST['display_simple']) && in_array($_POST['display_simple'], array('all', 'sportal', 'sforum', 'allaction', 'allboard', 'allpages'))) + $display = $_POST['display_simple']; + else + $display = ''; + + $custom = ''; + } + else + { + $display = array(); + $custom = array(); + + if (!empty($_POST['display_actions'])) + foreach ($_POST['display_actions'] as $action) + $display[] = $smcFunc['htmlspecialchars']($action, ENT_QUOTES); + + if (!empty($_POST['display_boards'])) + foreach ($_POST['display_boards'] as $board) + $display[] = 'b' . ((int) substr($board, 1)); + + if (!empty($_POST['display_pages'])) + foreach ($_POST['display_pages'] as $page) + $display[] = 'p' . ((int) substr($page, 1)); + + if (!empty($_POST['display_custom'])) + { + $temp = explode(',', $_POST['display_custom']); + foreach ($temp as $action) + $custom[] = $smcFunc['htmlspecialchars']($smcFunc['htmltrim']($action), ENT_QUOTES); + } + + $display = empty($display) ? '' : implode(',', $display); + $custom = empty($custom) ? '' : implode(',', $custom); + } + + $permission_set = 0; + $groups_allowed = $groups_denied = array(); + + if (!empty($_POST['permission_set'])) + $permission_set = (int) $_POST['permission_set']; + elseif (!empty($_POST['membergroups']) && is_array($_POST['membergroups'])) + { + foreach ($_POST['membergroups'] as $id => $value) + { + if ($value == 1) + $groups_allowed[] = (int) $id; + elseif ($value == -1) + $groups_denied[] = (int) $id; + } + } + + $context['SPortal']['block'] = array( + 'id' => $_POST['block_id'], + 'label' => $smcFunc['htmlspecialchars']($_POST['block_name'], ENT_QUOTES), + 'type' => $_POST['block_type'], + 'type_text' => !empty($txt['sp_function_' . $_POST['block_type'] . '_label']) ? $txt['sp_function_' . $_POST['block_type'] . '_label'] : $txt['sp_function_unknown_label'], + 'column' => $_POST['block_column'], + 'row' => !empty($_POST['block_row']) ? $_POST['block_row'] : 0, + 'permission_set' => $permission_set, + 'groups_allowed' => $groups_allowed, + 'groups_denied' => $groups_denied, + 'state' => !empty($_POST['block_active']), + 'force_view' => !empty($_POST['block_force']), + 'display' => $display, + 'display_custom' => $custom, + 'style' => sportal_parse_style('implode'), + 'parameters' => !empty($_POST['parameters']) ? $_POST['parameters'] : array(), + 'options'=> $_POST['block_type'](array(), false, true), + 'list_blocks' => getBlockInfo($_POST['block_column']), + 'collapsed' => false, + ); + + if (strpos($modSettings['leftwidth'], '%') !== false || strpos($modSettings['leftwidth'], 'px') !== false) + $context['widths'][1] = $modSettings['leftwidth']; + else + $context['widths'][1] = $modSettings['leftwidth'] . 'px'; + + if (strpos($modSettings['rightwidth'], '%') !== false || strpos($modSettings['rightwidth'], 'px') !== false) + $context['widths'][4] = $modSettings['rightwidth']; + else + $context['widths'][4] = $modSettings['rightwidth'] . 'px'; + + if (strpos($context['widths'][1], '%') !== false) + $context['widths'][2] = $context['widths'][3] = 100 - ($context['widths'][1] + $context['widths'][4]) . '%'; + elseif (strpos($context['widths'][1], 'px') !== false) + $context['widths'][2] = $context['widths'][3] = 960 - ($context['widths'][1] + $context['widths'][4]) . 'px'; + + if (strpos($context['widths'][1], '%') !== false) + { + $context['widths'][2] = $context['widths'][3] = 100 - ($context['widths'][1] + $context['widths'][4]) . '%'; + $context['widths'][5] = $context['widths'][6] = '100%'; + } + elseif (strpos($context['widths'][1], 'px') !== false) + { + $context['widths'][2] = $context['widths'][3] = 960 - ($context['widths'][1] + $context['widths'][4]) . 'px'; + $context['widths'][5] = $context['widths'][6] = '960px'; + } + + $context['SPortal']['preview'] = true; + } + + if (!empty($_POST['selected_type']) || !empty($_POST['preview_block']) || (!$context['SPortal']['is_new'] && empty($_POST['add_block']))) + { + if ($context['SPortal']['block']['type'] == 'sp_php' && !allowedTo('admin_forum')) + fatal_lang_error('cannot_admin_forum', false); + + $context['html_headers'] .= ' + '; + + loadLanguage('SPortalHelp', sp_languageSelect('SPortalHelp')); + + $context['SPortal']['block']['groups'] = sp_load_membergroups(); + + $context['simple_actions'] = array( + 'sportal' => $txt['sp-portal'], + 'sforum' => $txt['sp-forum'], + 'allaction' => $txt['sp-blocksOptionAllActions'], + 'allboard' => $txt['sp-blocksOptionAllBoards'], + 'allpages' => $txt['sp-blocksOptionAllPages'], + 'all' => $txt['sp-blocksOptionEverywhere'], + ); + + $context['display_actions'] = array( + 'portal' => $txt['sp-portal'], + 'forum' => $txt['sp-forum'], + 'recent' => $txt['recent_posts'], + 'unread' => $txt['unread_topics_visit'], + 'unreadreplies' => $txt['unread_replies'], + 'profile' => $txt['profile'], + 'pm' => $txt['pm_short'], + 'calendar' => $txt['calendar'], + 'admin' => $txt['admin'], + 'login' => $txt['login'], + 'register' => $txt['register'], + 'post' => $txt['post'], + 'stats' => $txt['forum_stats'], + 'search' => $txt['search'], + 'mlist' => $txt['members_list'], + 'moderate' => $txt['moderate'], + 'help' => $txt['help'], + 'who' => $txt['who_title'], + ); + + $request = $smcFunc['db_query']('',' + SELECT id_board, name + FROM {db_prefix}boards + ORDER BY name DESC' + ); + $context['display_boards'] = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $context['display_boards']['b' . $row['id_board']] = $row['name']; + $smcFunc['db_free_result']($request); + + $request = $smcFunc['db_query']('',' + SELECT id_page, title + FROM {db_prefix}sp_pages + ORDER BY title DESC' + ); + $context['display_pages'] = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $context['display_pages']['p' . $row['id_page']] = $row['title']; + $smcFunc['db_free_result']($request); + + if (empty($context['SPortal']['block']['display'])) + $context['SPortal']['block']['display'] = array('0'); + else + $context['SPortal']['block']['display'] = explode(',', $context['SPortal']['block']['display']); + + if (in_array($context['SPortal']['block']['display'][0], array('all', 'sportal', 'sforum', 'allaction', 'allboard', 'allpages')) || $context['SPortal']['is_new'] || empty($context['SPortal']['block']['display'][0]) && empty($context['SPortal']['block']['display_custom'])) + $context['SPortal']['block']['display_type'] = 0; + else + $context['SPortal']['block']['display_type'] = 1; + + $context['SPortal']['block']['style'] = sportal_parse_style('explode', $context['SPortal']['block']['style'], !empty($context['SPortal']['preview'])); + + // Prepare the Textcontent for BBC, only the first bbc will be correct detected! (SMF Support only 1 per page with the standard function) + $firstBBCFound = false; + foreach ($context['SPortal']['block']['options'] as $name => $type) + { + // Selectable Boards :D + if ($type == 'board_select' || $type == 'boards') + { + if (empty($boards)) + { + require_once($sourcedir.'/Subs-Boards.php'); + getBoardTree(); + } + + // Merge the array ;). (Only in 2.0 needed) + if(!isset($context['SPortal']['block']['parameters'][$name])) + $context['SPortal']['block']['parameters'][$name] = array(); + elseif(!empty($context['SPortal']['block']['parameters'][$name]) && is_array($context['SPortal']['block']['parameters'][$name])) + $context['SPortal']['block']['parameters'][$name] = implode('|', $context['SPortal']['block']['parameters'][$name]); + + $context['SPortal']['block']['board_options'][$name] = array(); + $config_variable = !empty($context['SPortal']['block']['parameters'][$name]) ? $context['SPortal']['block']['parameters'][$name] : array(); + $config_variable = !is_array($config_variable) ? explode('|', $config_variable) : $config_variable; + $context['SPortal']['block']['board_options'][$name] = array(); + + // Create the list for this Item + foreach ($boards as $board) + { + if (!empty($board['redirect'])) // Ignore the redirected boards :) + continue; + + $context['SPortal']['block']['board_options'][$name][$board['id']] = array( + 'value' => $board['id'], + 'text' => $board['name'], + 'selected' => in_array($board['id'], $config_variable), + ); + } + } + // Prepare the Textcontent for BBC, only the first bbc will be correct detected! (SMF Support only 1 per page with the standard function) + elseif ($type == 'bbc') + { + // SMF support only one bbc correct, multiple bbc do not work at the moment + if(!$firstBBCFound) + { + $firstBBCFound = true; + // Start SMF BBC Sytem :) + require_once($sourcedir . '/Subs-Editor.php'); + // Prepare the output :D + $form_message = !empty($context['SPortal']['block']['parameters'][$name]) ? $context['SPortal']['block']['parameters'][$name] : ''; + // But if it's in HTML world, turn them into htmlspecialchar's so they can be edited! + if (strpos($form_message, '[html]') !== false) + { + $parts = preg_split('~(\[/code\]|\[code(?:=[^\]]+)?\])~i', $form_message, -1, PREG_SPLIT_DELIM_CAPTURE); + for ($i = 0, $n = count($parts); $i < $n; $i++) + { + // It goes 0 = outside, 1 = begin tag, 2 = inside, 3 = close tag, repeat. + if ($i % 4 == 0) + $parts[$i] = preg_replace('~\[html\](.+?)\[/html\]~ise', '\'[html]\' . preg_replace(\'~~i\', \'<br />
    \', \'$1\') . \'[/html]\'', $parts[$i]); + } + $form_message = implode('', $parts); + } + $form_message = preg_replace('~~i', "\n", $form_message); + + // Prepare the data before i want them inside the textarea + $form_message = str_replace(array('"', '<', '>', ' '), array('"', '<', '>', ' '), $form_message); + $context['SPortal']['bbc'] = 'bbc_'.$name; + $message_data = array( + 'id' => $context['SPortal']['bbc'], + 'width' => '95%', + 'height' => '200px', + 'value' => $form_message, + 'form' => 'sp_block', + ); + + // Run the SMF bbc editor rutine + create_control_richedit($message_data); + + // Store the updated data on the parameters + $context['SPortal']['block']['parameters'][$name] = $form_message; + } + else + $context['SPortal']['block']['options'][$name] = 'textarea'; + } + } + + $context['sub_template'] = 'block_edit'; + $context['page_title'] = $context['SPortal']['is_new'] ? $txt['sp-blocksAdd'] : $txt['sp-blocksEdit']; + } + + if (!empty($_POST['add_block'])) + { + if ($_POST['block_type'] == 'sp_php' && !allowedTo('admin_forum')) + fatal_lang_error('cannot_admin_forum', false); + + if (!isset($_POST['block_name']) || $smcFunc['htmltrim']($smcFunc['htmlspecialchars']($_POST['block_name']), ENT_QUOTES) === '') + fatal_lang_error('error_sp_name_empty', false); + + if ($_POST['block_type'] == 'sp_php' && !empty($_POST['parameters']['content']) && empty($modSettings['sp_disable_php_validation'])) + { + $error = sp_validate_php($_POST['parameters']['content']); + + if ($error) + fatal_lang_error('error_sp_php_' . $error, false); + } + + if (!empty($_REQUEST['block_id'])) + $current_data = current(getBlockInfo(null, $_REQUEST['block_id'])); + + if (!empty($_POST['placement']) && (($_POST['placement'] == 'before') || ($_POST['placement'] == 'after'))) + { + if (!empty($current_data)) + $current_row = $current_data['row']; + else + $current_row = null; + + if ($_POST['placement'] == 'before') + $row = (int) $_POST['block_row']; + else + $row = (int) $_POST['block_row'] + 1; + + if (!empty($current_row) && ($row > $current_row)) + { + $row = $row - 1; + + $smcFunc['db_query']('', ' + UPDATE {db_prefix}sp_blocks + SET row = row - 1 + WHERE col = {int:col} + AND row > {int:start} + AND row <= {int:end}', + array( + 'col' => (int) $_POST['block_column'], + 'start' => $current_row, + 'end' => $row, + ) + ); + } + else + { + $smcFunc['db_query']('', ' + UPDATE {db_prefix}sp_blocks + SET row = row + 1 + WHERE col = {int:col} + AND row >= {int:start}' . (!empty($current_row) ? ' + AND row < {int:end}' : ''), + array( + 'col' => (int) $_POST['block_column'], + 'start' => $row, + 'end' => !empty($current_row) ? $current_row : 0, + ) + ); + } + } + elseif (!empty($_POST['placement']) && $_POST['placement'] == 'nochange') + $row = 0; + else + { + $request = $smcFunc['db_query']('',' + SELECT row + FROM {db_prefix}sp_blocks + WHERE col = {int:col}' . (!empty($_REQUEST['block_id']) ? ' + AND id_block != {int:current_id}' : '' ) . ' + ORDER BY row DESC + LIMIT 1', + array( + 'col' => $_POST['block_column'], + 'current_id' => $_REQUEST['block_id'], + ) + ); + list ($row) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $row = $row + 1; + } + + $type_parameters = $_POST['block_type'](array(), 0, true); + + if (!empty($_POST['parameters']) && is_array($_POST['parameters']) && !empty($type_parameters)) + { + foreach ($type_parameters as $name => $type) + { + if (isset($_POST['parameters'][$name])) + { + // Prepare BBC Content for SMF 2 special case =D + if ($type == 'bbc') + { + $parameter['value'] = $_POST['parameters'][$name]; + require_once($sourcedir . '/Subs-Post.php'); + // Prepare the message a bit for some additional testing. + $parameter['value'] = $smcFunc['htmlspecialchars']($parameter['value'], ENT_QUOTES); + preparsecode($parameter['value']); + //Store now the correct and fixed value ;) + $_POST['parameters'][$name] = $parameter['value']; + } + elseif ($type == 'boards' || $type == 'board_select') + $_POST['parameters'][$name] = is_array($_POST['parameters'][$name]) ? implode('|', $_POST['parameters'][$name]) : $_POST['parameters'][$name]; + elseif ($type == 'int' || $type == 'select') + $_POST['parameters'][$name] = (int) $_POST['parameters'][$name]; + elseif ($type == 'text' || $type == 'textarea' || is_array($type)) + $_POST['parameters'][$name] = $smcFunc['htmlspecialchars']($_POST['parameters'][$name], ENT_QUOTES); + elseif ($type == 'check') + $_POST['parameters'][$name] = !empty($_POST['parameters'][$name]) ? 1 : 0; + } + } + } + else + $_POST['parameters'] = array(); + + $permission_set = 0; + $groups_allowed = $groups_denied = ''; + + if (!empty($_POST['permission_set'])) + $permission_set = (int) $_POST['permission_set']; + elseif (!empty($_POST['membergroups']) && is_array($_POST['membergroups'])) + { + $groups_allowed = $groups_denied = array(); + + foreach ($_POST['membergroups'] as $id => $value) + { + if ($value == 1) + $groups_allowed[] = (int) $id; + elseif ($value == -1) + $groups_denied[] = (int) $id; + } + + $groups_allowed = implode(',', $groups_allowed); + $groups_denied = implode(',', $groups_denied); + } + + if (empty($_POST['display_advanced'])) + { + if (!empty($_POST['display_simple']) && in_array($_POST['display_simple'], array('all', 'sportal', 'sforum', 'allaction', 'allboard', 'allpages'))) + $display = $_POST['display_simple']; + else + $display = ''; + + $custom = ''; + } + else + { + $display = array(); + + if (!empty($_POST['display_actions'])) + foreach ($_POST['display_actions'] as $action) + $display[] = $smcFunc['htmlspecialchars']($action, ENT_QUOTES); + + if (!empty($_POST['display_boards'])) + foreach ($_POST['display_boards'] as $board) + $display[] = 'b' . ((int) substr($board, 1)); + + if (!empty($_POST['display_pages'])) + foreach ($_POST['display_pages'] as $page) + $display[] = 'p' . ((int) substr($page, 1)); + + if (!empty($_POST['display_custom'])) + { + $temp = explode(',', $_POST['display_custom']); + foreach ($temp as $action) + $custom[] = $smcFunc['htmlspecialchars']($smcFunc['htmltrim']($action), ENT_QUOTES); + } + + $display = empty($display) ? '' : implode(',', $display); + + if (!allowedTo('admin_forum') && isset($current_data['display_custom']) && substr($current_data['display_custom'], 0, 4) === '$php') + $custom = $current_data['display_custom']; + elseif (!empty($_POST['display_custom'])) + { + if (allowedTo('admin_forum') && substr($_POST['display_custom'], 0, 4) === '$php') + $custom = $smcFunc['htmlspecialchars']($_POST['display_custom'], ENT_QUOTES); + else + { + $custom = array(); + $temp = explode(',', $_POST['display_custom']); + + foreach ($temp as $action) + $custom[] = $smcFunc['htmlspecialchars']($action, ENT_QUOTES); + + $custom = empty($custom) ? '' : implode(',', $custom); + } + } + else + $custom = ''; + } + + $blockInfo = array( + 'id' => (int) $_POST['block_id'], + 'label' => $smcFunc['htmlspecialchars']($_POST['block_name'], ENT_QUOTES), + 'type' => $_POST['block_type'], + 'col' => $_POST['block_column'], + 'row' => $row, + 'permission_set' => $permission_set, + 'groups_allowed' => $groups_allowed, + 'groups_denied' => $groups_denied, + 'state' => !empty($_POST['block_active']) ? 1 : 0, + 'force_view' => !empty($_POST['block_force']) ? 1 : 0, + 'display' => $display, + 'display_custom' => $custom, + 'style' => sportal_parse_style('implode'), + ); + + if ($context['SPortal']['is_new']) + { + unset($blockInfo['id']); + + $smcFunc['db_insert']('', + '{db_prefix}sp_blocks', + array( + 'label' => 'string', + 'type' => 'string', + 'col' => 'int', + 'row' => 'int', + 'permission_set' => 'int', + 'groups_allowed' => 'string', + 'groups_denied' => 'string', + 'state' => 'int', + 'force_view' => 'int', + 'display' => 'string', + 'display_custom' => 'string', + 'style' => 'string', + ), + $blockInfo, + array('id_block') + ); + + $blockInfo['id'] = $smcFunc['db_insert_id']('{db_prefix}sp_blocks', 'id_block'); + } + else + { + $block_fields = array( + "label = {string:label}", + "permission_set = {int:permission_set}", + "groups_allowed = {string:groups_allowed}", + "groups_denied = {string:groups_denied}", + "state = {int:state}", + "force_view = {int:force_view}", + "display = {string:display}", + "display_custom = {string:display_custom}", + "style = {string:style}", + ); + + if (!empty($blockInfo['row'])) + $block_fields[] = "row = {int:row}"; + else + unset($blockInfo['row']); + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_blocks + SET ' . implode(', ', $block_fields) . ' + WHERE id_block = {int:id}', + $blockInfo + ); + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_parameters + WHERE id_block = {int:id}', + array( + 'id' => $blockInfo['id'], + ) + ); + } + + if (!empty($_POST['parameters'])) + { + $parameters = array(); + foreach ($_POST['parameters'] as $variable => $value) + $parameters[] = array( + 'id_block' => $blockInfo['id'], + 'variable' => $variable, + 'value' => $value, + ); + + $smcFunc['db_insert']('', + '{db_prefix}sp_parameters', + array( + 'id_block' => 'int', + 'variable' => 'string', + 'value' => 'string', + ), + $parameters, + array() + ); + } + + redirectexit('action=admin;area=portalblocks'); + } +} + +// Function for moving a block. +function sportal_admin_block_move() +{ + global $smcFunc; + + checkSession('get'); + + if (empty($_REQUEST['block_id'])) + fatal_lang_error('error_sp_id_empty', false); + else + $block_id = (int) $_REQUEST['block_id']; + + if (empty($_REQUEST['col']) || $_REQUEST['col'] < 1 || $_REQUEST['col'] > 6) + fatal_lang_error('error_sp_side_wrong', false); + else + $target_side = (int) $_REQUEST['col']; + + if (empty($_REQUEST['row'])) + { + $request = $smcFunc['db_query']('',' + SELECT MAX(row) + FROM {db_prefix}sp_blocks + WHERE col = {int:target_side} + LIMIT {int:limit}', + array( + 'target_side' => $target_side, + 'limit' => 1, + ) + ); + list ($target_row) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $target_row += 1; + } + else + $target_row = (int) $_REQUEST['row']; + + $request = $smcFunc['db_query']('',' + SELECT col, row + FROM {db_prefix}sp_blocks + WHERE id_block = {int:block_id} + LIMIT {int:limit}', + array( + 'block_id' => $block_id, + 'limit' => 1, + ) + ); + list ($current_side, $current_row) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + if ($current_side != $target_side || $current_row + 1 != $target_row) + { + if ($current_side != $target_side) + { + $current_row = 100; + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_blocks + SET col = {int:target_side}, row = {int:temp_row} + WHERE id_block = {int:block_id}', + array( + 'target_side' => $target_side, + 'temp_row' => $current_row, + 'block_id' => $block_id, + ) + ); + } + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_blocks + SET row = row + 1 + WHERE col = {int:target_side} + AND row >= {int:target_row}', + array( + 'target_side' => $target_side, + 'target_row' => $target_row, + ) + ); + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_blocks + SET row = {int:target_row} + WHERE id_block = {int:block_id}', + array( + 'target_row' => $target_row, + 'block_id' => $block_id, + ) + ); + + foreach (array_unique(array($current_side, $target_side)) as $side) + fixColumnRows($side); + } + + redirectexit('action=admin;area=portalblocks'); +} + +// Function for deleting a block. +function sportal_admin_block_delete() +{ + global $smcFunc; + + // Check if he can? + checkSession('get'); + + // Make sure ID is an integer. + $_REQUEST['block_id'] = (int) $_REQUEST['block_id']; + + // Do we have that? + if(empty($_REQUEST['block_id'])) + fatal_lang_error('error_sp_id_empty', false); + + // Make sure column ID is an integer too. + $_REQUEST['col'] = (int) $_REQUEST['col']; + + // Only Admins can Remove PHP Blocks + if(!allowedTo('admin_forum')) + { + $context['SPortal']['block'] = current(getBlockInfo(null, $_REQUEST['block_id'])); + if($context['SPortal']['block']['type'] == 'sp_php' && !allowedTo('admin_forum')) + fatal_lang_error('cannot_admin_forum', false); + } + + // We don't need it anymore. + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_blocks + WHERE id_block = {int:id}', + array( + 'id' => $_REQUEST['block_id'], + ) + ); + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_parameters + WHERE id_block = {int:id}', + array( + 'id' => $_REQUEST['block_id'], + ) + ); + + // Fix column rows. + fixColumnRows($_REQUEST['col']); + + // Return back to the block list. + redirectexit('action=admin;area=portalblocks'); +} + +?> \ No newline at end of file diff --git a/Sources/PortalAdminMain.php b/Sources/PortalAdminMain.php new file mode 100644 index 0000000..f1a0814 --- /dev/null +++ b/Sources/PortalAdminMain.php @@ -0,0 +1,348 @@ + 'sportal_information', + 'generalsettings' => 'sportal_admin_general_settings', + 'blocksettings' => 'sportal_admin_block_settings', + 'articlesettings' => 'sportal_admin_article_settings', + ); + + $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'information'; + + $context[$context['admin_menu_name']]['tab_data'] = array( + 'title' => $txt['sp-adminConfiguration'], + 'help' => 'sp_ConfigurationArea', + 'description' => $txt['sp-adminConfigurationDesc'], + ); + + $subActions[$_REQUEST['sa']](); +} + +function sportal_admin_general_settings($return_config = '') +{ + global $smcFunc, $context, $scripturl, $txt; + + $request = $smcFunc['db_query']('',' + SELECT id_theme, value AS name + FROM {db_prefix}themes + WHERE variable = {string:name} + AND id_member = {int:member} + ORDER BY id_theme', + array( + 'member' => 0, + 'name' => 'name', + ) + ); + $context['SPortal']['themes'] = array('0' => &$txt['portalthemedefault']); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $context['SPortal']['themes'][$row['id_theme']] = $row['name']; + $smcFunc['db_free_result']($request); + + $config_vars = array( + array('select', 'sp_portal_mode', explode('|', $txt['sp_portal_mode_options'])), + array('check', 'sp_maintenance'), + array('text', 'sp_standalone_url'), + '', + array('select', 'portaltheme', $context['SPortal']['themes']), + array('check', 'sp_disableColor'), + array('check', 'sp_disableForumRedirect'), + array('check', 'sp_disable_random_bullets'), + array('check', 'sp_disable_php_validation'), + array('check', 'sp_disable_side_collapse'), + array('check', 'sp_resize_images'), + ); + + if ($return_config) + return $config_vars; + + if (isset($_GET['save'])) + { + checkSession(); + + saveDBSettings($config_vars); + redirectexit('action=admin;area=portalconfig;sa=generalsettings'); + } + + $context['post_url'] = $scripturl . '?action=admin;area=portalconfig;sa=generalsettings;save'; + $context['settings_title'] = $txt['sp-adminGeneralSettingsName']; + $context['page_title'] = $txt['sp-adminGeneralSettingsName']; + $context['sub_template'] = 'general_settings'; + + prepareDBSettingContext($config_vars); +} + +function sportal_admin_block_settings($return_config = '') +{ + global $context, $scripturl, $txt; + + $config_vars = array( + array('check', 'showleft'), + array('check', 'showright'), + array('text', 'leftwidth'), + array('text', 'rightwidth'), + '', + array('check', 'sp_enableIntegration'), + array('multicheck', 'sp_IntegrationHide', 'subsettings' => array('sp_adminIntegrationHide' => $txt['admin'], 'sp_profileIntegrationHide' => $txt['profile'], 'sp_pmIntegrationHide' => $txt['personal_messages'], 'sp_mlistIntegrationHide' => $txt['members_title'], 'sp_searchIntegrationHide' => $txt['search'], 'sp_calendarIntegrationHide' => $txt['calendar'], 'sp_moderateIntegrationHide' => $txt['moderate'])), + ); + + if ($return_config) + return $config_vars; + + if (isset($_GET['save'])) + { + checkSession(); + + $width_checkup = array('left', 'right'); + foreach ($width_checkup as $pos) + { + if (!empty($_POST[$pos . 'width'])) + { + if (stripos($_POST[$pos . 'width'], 'px') !== false) + $suffix = 'px'; + elseif (strpos($_POST[$pos . 'width'], '%') !== false) + $suffix = '%'; + else + $suffix = ''; + + preg_match_all('/(?:([0-9]+)|.)/i', $_POST[$pos . 'width'], $matches); + + $number = (int) implode('', $matches[1]); + if (!empty($number) && $number > 0) + $_POST[$pos . 'width'] = $number . $suffix; + else + $_POST[$pos . 'width'] = ''; + } + else + $_POST[$pos . 'width'] = ''; + } + + unset($config_vars[7]); + $config_vars = array_merge( + $config_vars, + array( + array('check', 'sp_adminIntegrationHide'), + array('check', 'sp_profileIntegrationHide'), + array('check', 'sp_pmIntegrationHide'), + array('check', 'sp_mlistIntegrationHide'), + array('check', 'sp_searchIntegrationHide'), + array('check', 'sp_calendarIntegrationHide'), + array('check', 'sp_moderateIntegrationHide'), + ) + ); + + saveDBSettings($config_vars); + redirectexit('action=admin;area=portalconfig;sa=blocksettings'); + } + + $context['post_url'] = $scripturl . '?action=admin;area=portalconfig;sa=blocksettings;save'; + $context['settings_title'] = $txt['sp-adminBlockSettingsName']; + $context['page_title'] = $txt['sp-adminBlockSettingsName']; + $context['sub_template'] = 'general_settings'; + + prepareDBSettingContext($config_vars); +} + +function sportal_admin_article_settings($return_config = '') +{ + global $context, $scripturl, $txt; + + $config_vars = array( + array('check', 'articleactive'), + array('int', 'articleperpage'), + array('int', 'articlelength'), + array('check', 'articleavatar'), + ); + + if ($return_config) + return $config_vars; + + if (isset($_GET['save'])) + { + checkSession(); + + saveDBSettings($config_vars); + redirectexit('action=admin;area=portalconfig;sa=articlesettings'); + } + + $context['post_url'] = $scripturl . '?action=admin;area=portalconfig;sa=articlesettings;save'; + $context['settings_title'] = $txt['sp-adminArticleSettingsName']; + $context['page_title'] = $txt['sp-adminArticleSettingsName']; + $context['sub_template'] = 'general_settings'; + + prepareDBSettingContext($config_vars); +} + +function sportal_information($in_admin = true) +{ + global $context, $scripturl, $txt, $sourcedir, $sportal_version, $user_profile; + + $context['sp_credits'] = array( + array( + 'pretext' => $txt['sp-info_intro'], + 'title' => $txt['sp-info_team'], + 'groups' => array( + array( + 'title' => $txt['sp-info_groups_pm'], + 'members' => array( + 'Eliana Tamerin', + 'Huw', + ), + ), + array( + 'title' => $txt['sp-info_groups_dev'], + 'members' => array( + 'Selman "[SiNaN]" Eser', + 'ディン1031', + 'Nathaniel Baxter', + ), + ), + array( + 'title' => $txt['sp-info_groups_support'], + 'members' => array( + 'AngelinaBelle', + ), + ), + array( + 'title' => $txt['sp-info_groups_customize'], + 'members' => array( + 'Robbo', + 'Berat "grafitus" Doğan', + 'Blue', + ), + ), + array( + 'title' => $txt['sp-info_groups_language'], + 'members' => array( + 'Jade "Alundra" Elizabeth', + '130860', + ), + ), + array( + 'title' => $txt['sp-info_groups_marketing'], + 'members' => array( + 'Runic', + ), + ), + array( + 'title' => $txt['sp-info_groups_beta'], + 'members' => array( + 'Özgür', + 'Willerby', + 'David', + 'Dr. Deejay', + 'Brack1', + 'c23_Mike', + 'Underdog', + ), + ), + ), + ), + array( + 'title' => $txt['sp-info_special'], + 'posttext' => $txt['sp-info_anyone'], + 'groups' => array( + array( + 'title' => $txt['sp-info_groups_translators'], + 'members' => array( + $txt['sp-info_translators_message'], + ), + ), + array( + 'title' => $txt['sp-info_groups_founder'], + 'members' => array( + ), + ), + array( + 'title' => $txt['sp-info_groups_orignal_pm'], + 'members' => array( + ), + ), + array( + 'title' => $txt['sp-info_fam_fam'], + 'members' => array( + $txt['sp-info_fam_fam_message'], + ), + ), + ), + ), + ); + + if (!$in_admin) + { + loadTemplate('PortalAdmin'); + + $context['robot_no_index'] = true; + $context['in_admin'] = false; + } + else + { + $context['in_admin'] = true; + $context['sp_version'] = $sportal_version; + $context['sp_managers'] = array(); + + require_once($sourcedir . '/Subs-Members.php'); + $manager_ids = loadMemberData(membersAllowedTo('sp_admin'), false, 'minimal'); + + if ($manager_ids) + foreach ($manager_ids as $member) + $context['sp_managers'][] = '' . $user_profile[$member]['real_name'] . ''; + } + + $context['sub_template'] = 'information'; + $context['page_title'] = $txt['sp-info_title']; +} + +?> \ No newline at end of file diff --git a/Sources/PortalAdminPages.php b/Sources/PortalAdminPages.php new file mode 100644 index 0000000..d06f205 --- /dev/null +++ b/Sources/PortalAdminPages.php @@ -0,0 +1,635 @@ + 'sportal_admin_page_list', + 'add' => 'sportal_admin_page_edit', + 'edit' => 'sportal_admin_page_edit', + 'delete' => 'sportal_admin_page_delete', + 'status' => 'sportal_admin_page_status', + ); + + $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'list'; + + $context['sub_action'] = $_REQUEST['sa']; + + $context[$context['admin_menu_name']]['tab_data'] = array( + 'title' => $txt['sp_admin_pages_title'], + 'help' => 'sp_PagesArea', + 'description' => $txt['sp_admin_pages_desc'], + 'tabs' => array( + 'list' => array( + ), + 'add' => array( + ), + ), + ); + + $subActions[$_REQUEST['sa']](); +} + +function sportal_admin_page_list() +{ + global $txt, $smcFunc, $context, $scripturl; + + if (!empty($_POST['remove_pages']) && !empty($_POST['remove']) && is_array($_POST['remove'])) + { + checkSession(); + + foreach ($_POST['remove'] as $index => $page_id) + $_POST['remove'][(int) $index] = (int) $page_id; + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_pages + WHERE id_page IN ({array_int:pages})', + array( + 'pages' => $_POST['remove'], + ) + ); + } + + $sort_methods = array( + 'title' => array( + 'down' => 'title ASC', + 'up' => 'title DESC' + ), + 'namespace' => array( + 'down' => 'namespace ASC', + 'up' => 'namespace DESC' + ), + 'type' => array( + 'down' => 'type ASC', + 'up' => 'type DESC' + ), + 'views' => array( + 'down' => 'views ASC', + 'up' => 'views DESC' + ), + 'status' => array( + 'down' => 'status ASC', + 'up' => 'status DESC' + ), + ); + + $context['columns'] = array( + 'title' => array( + 'width' => '45%', + 'label' => $txt['sp_admin_pages_col_title'], + 'class' => 'first_th', + 'sortable' => true + ), + 'namespace' => array( + 'width' => '25%', + 'label' => $txt['sp_admin_pages_col_namespace'], + 'sortable' => true + ), + 'type' => array( + 'width' => '8%', + 'label' => $txt['sp_admin_pages_col_type'], + 'sortable' => true + ), + 'views' => array( + 'width' => '6%', + 'label' => $txt['sp_admin_pages_col_views'], + 'sortable' => true + ), + 'status' => array( + 'width' => '6%', + 'label' => $txt['sp_admin_pages_col_status'], + 'sortable' => true + ), + 'actions' => array( + 'width' => '10%', + 'label' => $txt['sp_admin_pages_col_actions'], + 'sortable' => false + ), + ); + + if (!isset($_REQUEST['sort']) || !isset($sort_methods[$_REQUEST['sort']])) + $_REQUEST['sort'] = 'title'; + + foreach ($context['columns'] as $col => $dummy) + { + $context['columns'][$col]['selected'] = $col == $_REQUEST['sort']; + $context['columns'][$col]['href'] = $scripturl . '?action=admin;area=portalpages;sa=list;sort=' . $col; + + if (!isset($_REQUEST['desc']) && $col == $_REQUEST['sort']) + $context['columns'][$col]['href'] .= ';desc'; + + $context['columns'][$col]['link'] = '' . $context['columns'][$col]['label'] . ''; + } + + $context['sort_by'] = $_REQUEST['sort']; + $context['sort_direction'] = !isset($_REQUEST['desc']) ? 'down' : 'up'; + + $request = $smcFunc['db_query']('',' + SELECT COUNT(*) + FROM {db_prefix}sp_pages' + ); + list ($total_pages) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $context['page_index'] = constructPageIndex($scripturl . '?action=admin;area=portalpages;sa=list;sort=' . $_REQUEST['sort'] . (isset($_REQUEST['desc']) ? ';desc' : ''), $_REQUEST['start'], $total_pages, 20); + $context['start'] = $_REQUEST['start']; + + $request = $smcFunc['db_query']('',' + SELECT id_page, namespace, title, type, views, status + FROM {db_prefix}sp_pages + ORDER BY {raw:sort} + LIMIT {int:start}, {int:limit}', + array( + 'sort' => $sort_methods[$_REQUEST['sort']][$context['sort_direction']], + 'start' => $context['start'], + 'limit' => 20, + ) + ); + $context['pages'] = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $context['pages'][$row['id_page']] = array( + 'id' => $row['id_page'], + 'page_id' => $row['namespace'], + 'title' => $row['title'], + 'href' => $scripturl . '?page=' . $row['namespace'], + 'link' => '' . $row['title'] . '', + 'type' => $row['type'], + 'type_text' => $txt['sp_pages_type_'. $row['type']], + 'views' => $row['views'], + 'status' => $row['status'], + 'status_image' => '' . sp_embed_image(empty($row['status']) ? 'deactive' : 'active', $txt['sp_admin_pages_' . (!empty($row['status']) ? 'de' : '') . 'activate']) . '', + 'actions' => array( + 'edit' => '' . sp_embed_image('modify') . '', + 'delete' => '' . sp_embed_image('delete') . '', + ) + ); + } + $smcFunc['db_free_result']($request); + + $context['sub_template'] = 'pages_list'; + $context['page_title'] = $txt['sp_admin_pages_list']; +} + +function sportal_admin_page_edit() +{ + global $txt, $context, $modSettings, $smcFunc, $sourcedir, $options; + + require_once($sourcedir . '/Subs-Editor.php'); + require_once($sourcedir . '/Subs-Post.php'); + + $context['SPortal']['is_new'] = empty($_REQUEST['page_id']); + + if (!empty($_REQUEST['content_mode']) && $_POST['type'] == 'bbc') + { + $_REQUEST['content'] = html_to_bbc($_REQUEST['content']); + $_REQUEST['content'] = un_htmlspecialchars($_REQUEST['content']); + $_POST['content'] = $_REQUEST['content']; + } + + $context['sides'] = array( + 5 => $txt['sp-positionHeader'], + 1 => $txt['sp-positionLeft'], + 2 => $txt['sp-positionTop'], + 3 => $txt['sp-positionBottom'], + 4 => $txt['sp-positionRight'], + 6 => $txt['sp-positionFooter'], + ); + + $blocks = getBlockInfo(); + $context['page_blocks'] = array(); + + foreach ($blocks as $block) + { + $shown = false; + $tests = array('all', 'allpages', 'sforum'); + if (!$context['SPortal']['is_new']) + $tests[] = 'p' . ((int) $_REQUEST['page_id']); + + foreach (array('display', 'display_custom') as $field) + { + if (substr($block[$field], 0, 4) === '$php') + continue 2; + + $block[$field] = explode(',', $block[$field]); + + if (!$context['SPortal']['is_new'] && in_array('-p' . ((int) $_REQUEST['page_id']), $block[$field])) + continue; + + foreach ($tests as $test) + { + if (in_array($test, $block[$field])) + { + $shown = true; + break; + } + } + } + + $context['page_blocks'][$block['column']][] = array( + 'id' => $block['id'], + 'label' => $block['label'], + 'shown' => $shown, + ); + } + + if (!empty($_POST['submit'])) + { + checkSession(); + + if (!isset($_POST['title']) || $smcFunc['htmltrim']($smcFunc['htmlspecialchars']($_POST['title'], ENT_QUOTES)) === '') + fatal_lang_error('sp_error_page_name_empty', false); + + if (!isset($_POST['namespace']) || $smcFunc['htmltrim']($smcFunc['htmlspecialchars']($_POST['namespace'], ENT_QUOTES)) === '') + fatal_lang_error('sp_error_page_namespace_empty', false); + + $result = $smcFunc['db_query']('',' + SELECT id_page + FROM {db_prefix}sp_pages + WHERE namespace = {string:namespace} + AND id_page != {int:current} + LIMIT 1', + array( + 'limit' => 1, + 'namespace' => $smcFunc['htmlspecialchars']($_POST['namespace'], ENT_QUOTES), + 'current' => (int) $_POST['page_id'], + ) + ); + list ($has_duplicate) = $smcFunc['db_fetch_row']($result); + $smcFunc['db_free_result']($result); + + if (!empty($has_duplicate)) + fatal_lang_error('sp_error_page_namespace_duplicate', false); + + if (preg_match('~[^A-Za-z0-9_]+~', $_POST['namespace']) != 0) + fatal_lang_error('sp_error_page_namespace_invalid_chars', false); + + if (preg_replace('~[0-9]+~', '', $_POST['namespace']) === '') + fatal_lang_error('sp_error_page_namespace_numeric', false); + + if ($_POST['type'] == 'php' && !empty($_POST['content']) && empty($modSettings['sp_disable_php_validation'])) + { + $error = sp_validate_php($_POST['content']); + + if ($error) + fatal_lang_error('error_sp_php_' . $error, false); + } + + $permission_set = 0; + $groups_allowed = $groups_denied = ''; + + if (!empty($_POST['permission_set'])) + $permission_set = (int) $_POST['permission_set']; + elseif (!empty($_POST['membergroups']) && is_array($_POST['membergroups'])) + { + $groups_allowed = $groups_denied = array(); + + foreach ($_POST['membergroups'] as $id => $value) + { + if ($value == 1) + $groups_allowed[] = (int) $id; + elseif ($value == -1) + $groups_denied[] = (int) $id; + } + + $groups_allowed = implode(',', $groups_allowed); + $groups_denied = implode(',', $groups_denied); + } + + if (!empty($_POST['blocks']) && is_array($_POST['blocks'])) + { + foreach ($_POST['blocks'] as $id => $block) + $_POST['blocks'][$id] = (int) $block; + } + else + $_POST['blocks'] = array(); + + $fields = array( + 'namespace' => 'string', + 'title' => 'string', + 'body' => 'string', + 'type' => 'string', + 'permission_set' => 'int', + 'groups_allowed' => 'string', + 'groups_denied' => 'string', + 'style' => 'string', + 'status' => 'int', + ); + + $page_info = array( + 'id' => (int) $_POST['page_id'], + 'namespace' => $smcFunc['htmlspecialchars']($_POST['namespace'], ENT_QUOTES), + 'title' => $smcFunc['htmlspecialchars']($_POST['title'], ENT_QUOTES), + 'body' => $smcFunc['htmlspecialchars']($_POST['content'], ENT_QUOTES), + 'type' => $_POST['type'], + 'permission_set' => $permission_set, + 'groups_allowed' => $groups_allowed, + 'groups_denied' => $groups_denied, + 'style' => sportal_parse_style('implode'), + 'status' => !empty($_POST['status']) ? 1 : 0, + ); + + if ($page_info['type'] == 'bbc') + preparsecode($page_info['body']); + + if ($context['SPortal']['is_new']) + { + unset($page_info['id']); + + $smcFunc['db_insert']('', + '{db_prefix}sp_pages', + $fields, + $page_info, + array('id_page') + ); + $page_info['id'] = $smcFunc['db_insert_id']('{db_prefix}sp_pages', 'id_page'); + } + else + { + $update_fields = array(); + foreach ($fields as $name => $type) + $update_fields[] = $name . ' = {' . $type . ':' . $name . '}'; + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_pages + SET ' . implode(', ', $update_fields) . ' + WHERE id_page = {int:id}', + $page_info + ); + } + + $to_show = array(); + $not_to_show = array(); + $changes = array(); + + foreach ($context['page_blocks'] as $page_blocks) + { + foreach ($page_blocks as $block) + { + if ($block['shown'] && !in_array($block['id'], $_POST['blocks'])) + $not_to_show[] = $block['id']; + elseif (!$block['shown'] && in_array($block['id'], $_POST['blocks'])) + $to_show[] = $block['id']; + } + } + + foreach ($to_show as $id) + { + if ((empty($blocks[$id]['display']) && empty($blocks[$id]['display_custom'])) || $blocks[$id]['display'] == 'sportal') + { + $changes[$id] = array( + 'display' => 'portal,p' . $page_info['id'], + 'display_custom' => '', + ); + } + elseif (in_array($blocks[$id]['display'], array('allaction', 'allboard'))) + { + $changes[$id] = array( + 'display' => '', + 'display_custom' => $blocks[$id]['display'] . ',p' . $page_info['id'], + ); + } + elseif (in_array('-p' . $page_info['id'], explode(',', $blocks[$id]['display_custom']))) + { + $changes[$id] = array( + 'display' => $blocks[$id]['display'], + 'display_custom' => implode(',', array_diff(explode(',', $blocks[$id]['display_custom']), array('-p' . $page_info['id']))), + ); + } + elseif (empty($blocks[$id]['display_custom'])) + { + $changes[$id] = array( + 'display' => implode(',', array_merge(explode(',', $blocks[$id]['display']), array('p' . $page_info['id']))), + 'display_custom' => '', + ); + } + else + { + $changes[$id] = array( + 'display' => $blocks[$id]['display'], + 'display_custom' => implode(',', array_merge(explode(',', $blocks[$id]['display_custom']), array('p' . $page_info['id']))), + ); + } + } + + foreach ($not_to_show as $id) + { + if (count(array_intersect(array($blocks[$id]['display'], $blocks[$id]['display_custom']), array('sforum', 'allpages', 'all'))) > 0) + { + $changes[$id] = array( + 'display' => '', + 'display_custom' => $blocks[$id]['display'] . $blocks[$id]['display_custom'] . ',-p' . $page_info['id'], + ); + } + elseif (empty($blocks[$id]['display_custom'])) + { + $changes[$id] = array( + 'display' => implode(',', array_diff(explode(',', $blocks[$id]['display']), array('p' . $page_info['id']))), + 'display_custom' => '', + ); + } + else + { + $changes[$id] = array( + 'display' => implode(',', array_diff(explode(',', $blocks[$id]['display']), array('p' . $page_info['id']))), + 'display_custom' => implode(',', array_diff(explode(',', $blocks[$id]['display_custom']), array('p' . $page_info['id']))), + ); + } + } + + foreach ($changes as $id => $data) + { + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_blocks + SET + display = {string:display}, + display_custom = {string:display_custom} + WHERE id_block = {int:id}', + array( + 'id' => $id, + 'display' => $data['display'], + 'display_custom' => $data['display_custom'], + ) + ); + } + + redirectexit('action=admin;area=portalpages'); + } + + if (!empty($_POST['preview'])) + { + $permission_set = 0; + $groups_allowed = $groups_denied = array(); + + if (!empty($_POST['permission_set'])) + $permission_set = (int) $_POST['permission_set']; + elseif (!empty($_POST['membergroups']) && is_array($_POST['membergroups'])) + { + foreach ($_POST['membergroups'] as $id => $value) + { + if ($value == 1) + $groups_allowed[] = (int) $id; + elseif ($value == -1) + $groups_denied[] = (int) $id; + } + } + + $context['SPortal']['page'] = array( + 'id' => $_POST['page_id'], + 'page_id' => $_POST['namespace'], + 'title' => $smcFunc['htmlspecialchars']($_POST['title'], ENT_QUOTES), + 'body' => $smcFunc['htmlspecialchars']($_POST['content'], ENT_QUOTES), + 'type' => $_POST['type'], + 'permission_set' => $permission_set, + 'groups_allowed' => $groups_allowed, + 'groups_denied' => $groups_denied, + 'style' => sportal_parse_style('implode'), + 'status' => !empty($_POST['status']), + ); + + if ($context['SPortal']['page']['type'] == 'bbc') + preparsecode($context['SPortal']['page']['body']); + + loadTemplate('PortalPages'); + $context['SPortal']['preview'] = true; + } + elseif ($context['SPortal']['is_new']) + { + $context['SPortal']['page'] = array( + 'id' => 0, + 'page_id' => 'page' . mt_rand(1, 5000), + 'title' => $txt['sp_pages_default_title'], + 'body' => '', + 'type' => 'bbc', + 'permission_set' => 3, + 'groups_allowed' => array(), + 'groups_denied' => array(), + 'style' => '', + 'status' => 1, + ); + } + else + { + $_REQUEST['page_id'] = (int) $_REQUEST['page_id']; + $context['SPortal']['page'] = sportal_get_pages($_REQUEST['page_id']); + } + + if ($context['SPortal']['page']['type'] == 'bbc') + $context['SPortal']['page']['body'] = str_replace(array('"', '<', '>', ' '), array('"', '<', '>', ' '), un_preparsecode($context['SPortal']['page']['body'])); + + if ($context['SPortal']['page']['type'] != 'bbc') + { + $temp_editor = !empty($options['wysiwyg_default']); + $options['wysiwyg_default'] = false; + } + + $editorOptions = array( + 'id' => 'content', + 'value' => $context['SPortal']['page']['body'], + 'width' => '95%', + 'height' => '200px', + 'preview_type' => 0, + ); + create_control_richedit($editorOptions); + $context['post_box_name'] = $editorOptions['id']; + + if (isset($temp_editor)) + $options['wysiwyg_default'] = $temp_editor; + + $context['SPortal']['page']['groups'] = sp_load_membergroups(); + $context['SPortal']['page']['style'] = sportal_parse_style('explode', $context['SPortal']['page']['style'], !empty($context['SPortal']['preview'])); + + $context['page_title'] = $context['SPortal']['is_new'] ? $txt['sp_admin_pages_add'] : $txt['sp_admin_pages_edit']; + $context['sub_template'] = 'pages_edit'; +} + +function sportal_admin_page_delete() +{ + global $smcFunc; + + checkSession('get'); + + $page_id = !empty($_REQUEST['page_id']) ? (int) $_REQUEST['page_id'] : 0; + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_pages + WHERE id_page = {int:id}', + array( + 'id' => $page_id, + ) + ); + + redirectexit('action=admin;area=portalpages'); +} + +function sportal_admin_page_status() +{ + global $smcFunc; + + checkSession('get'); + + $page_id = !empty($_REQUEST['page_id']) ? (int) $_REQUEST['page_id'] : 0; + + $smcFunc['db_query']('', ' + UPDATE {db_prefix}sp_pages + SET status = CASE WHEN status = {int:is_active} THEN 0 ELSE 1 END + WHERE id_page = {int:id}', + array( + 'is_active' => 1, + 'id' => $page_id, + ) + ); + + redirectexit('action=admin;area=portalpages'); +} + +?> \ No newline at end of file diff --git a/Sources/PortalAdminShoutbox.php b/Sources/PortalAdminShoutbox.php new file mode 100644 index 0000000..38bf239 --- /dev/null +++ b/Sources/PortalAdminShoutbox.php @@ -0,0 +1,589 @@ + 'sportal_admin_shoutbox_list', + 'add' => 'sportal_admin_shoutbox_edit', + 'edit' => 'sportal_admin_shoutbox_edit', + 'prune' => 'sportal_admin_shoutbox_prune', + 'delete' => 'sportal_admin_shoutbox_delete', + 'status' => 'sportal_admin_shoutbox_status', + 'blockredirect' => 'sportal_admin_shoutbox_block_redirect', + ); + + $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'list'; + + $context['sub_action'] = $_REQUEST['sa']; + + $context[$context['admin_menu_name']]['tab_data'] = array( + 'title' => $txt['sp_admin_shoutbox_title'], + 'help' => 'sp_ShoutboxArea', + 'description' => $txt['sp_admin_shoutbox_desc'], + 'tabs' => array( + 'list' => array( + ), + 'add' => array( + ), + ), + ); + + $subActions[$_REQUEST['sa']](); +} + +function sportal_admin_shoutbox_list() +{ + global $txt, $smcFunc, $context, $scripturl; + + if (!empty($_POST['remove_shoutbox']) && !empty($_POST['remove']) && is_array($_POST['remove'])) + { + checkSession(); + + foreach ($_POST['remove'] as $index => $page_id) + $_POST['remove'][(int) $index] = (int) $page_id; + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_shoutboxes + WHERE id_shoutbox IN ({array_int:shoutbox})', + array( + 'shoutbox' => $_POST['remove'], + ) + ); + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_shouts + WHERE id_shoutbox IN ({array_int:shoutbox})', + array( + 'shoutbox' => $_POST['remove'], + ) + ); + } + + $sort_methods = array( + 'name' => array( + 'down' => 'name ASC', + 'up' => 'name DESC' + ), + 'num_shouts' => array( + 'down' => 'num_shouts ASC', + 'up' => 'num_shouts DESC' + ), + 'caching' => array( + 'down' => 'caching ASC', + 'up' => 'caching DESC' + ), + 'status' => array( + 'down' => 'status ASC', + 'up' => 'status DESC' + ), + ); + + $context['columns'] = array( + 'name' => array( + 'width' => '40%', + 'label' => $txt['sp_admin_shoutbox_col_name'], + 'class' => 'first_th', + 'sortable' => true + ), + 'num_shouts' => array( + 'width' => '15%', + 'label' => $txt['sp_admin_shoutbox_col_shouts'], + 'sortable' => true + ), + 'caching' => array( + 'width' => '15%', + 'label' => $txt['sp_admin_shoutbox_col_caching'], + 'sortable' => true + ), + 'status' => array( + 'width' => '15%', + 'label' => $txt['sp_admin_shoutbox_col_status'], + 'sortable' => true + ), + 'actions' => array( + 'width' => '15%', + 'label' => $txt['sp_admin_shoutbox_col_actions'], + 'sortable' => false + ), + ); + + if (!isset($_REQUEST['sort']) || !isset($sort_methods[$_REQUEST['sort']])) + $_REQUEST['sort'] = 'name'; + + foreach ($context['columns'] as $col => $dummy) + { + $context['columns'][$col]['selected'] = $col == $_REQUEST['sort']; + $context['columns'][$col]['href'] = $scripturl . '?action=admin;area=portalshoutbox;sa=list;sort=' . $col; + + if (!isset($_REQUEST['desc']) && $col == $_REQUEST['sort']) + $context['columns'][$col]['href'] .= ';desc'; + + $context['columns'][$col]['link'] = '' . $context['columns'][$col]['label'] . ''; + } + + $context['sort_by'] = $_REQUEST['sort']; + $context['sort_direction'] = !isset($_REQUEST['desc']) ? 'down' : 'up'; + + $request = $smcFunc['db_query']('',' + SELECT COUNT(*) + FROM {db_prefix}sp_shoutboxes' + ); + list ($total_shoutbox) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $context['page_index'] = constructPageIndex($scripturl . '?action=admin;area=portalshoutbox;sa=list;sort=' . $_REQUEST['sort'] . (isset($_REQUEST['desc']) ? ';desc' : ''), $_REQUEST['start'], $total_shoutbox, 20); + $context['start'] = $_REQUEST['start']; + + $request = $smcFunc['db_query']('',' + SELECT id_shoutbox, name, caching, status, num_shouts + FROM {db_prefix}sp_shoutboxes + ORDER BY id_shoutbox, {raw:sort} + LIMIT {int:start}, {int:limit}', + array( + 'sort' => $sort_methods[$_REQUEST['sort']][$context['sort_direction']], + 'start' => $context['start'], + 'limit' => 20, + ) + ); + $context['shoutboxes'] = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + $context['shoutboxes'][$row['id_shoutbox']] = array( + 'id' => $row['id_shoutbox'], + 'name' => $row['name'], + 'shouts' => $row['num_shouts'], + 'caching' => $row['caching'], + 'status' => $row['status'], + 'status_image' => '' . sp_embed_image(empty($row['status']) ? 'deactive' : 'active', $txt['sp_admin_shoutbox_' . (!empty($row['status']) ? 'de' : '') . 'activate']) . '', + 'actions' => array( + 'edit' => '' . sp_embed_image('modify') . '', + 'prune' => '' . sp_embed_image('bin') . '', + 'delete' => '' . sp_embed_image('delete') . '', + ) + ); + } + $smcFunc['db_free_result']($request); + + $context['sub_template'] = 'shoutbox_list'; + $context['page_title'] = $txt['sp_admin_shoutbox_list']; +} + +function sportal_admin_shoutbox_edit() +{ + global $txt, $context, $modSettings, $smcFunc; + + $context['SPortal']['is_new'] = empty($_REQUEST['shoutbox_id']); + + if (!empty($_POST['submit'])) + { + checkSession(); + + if (!isset($_POST['name']) || $smcFunc['htmltrim']($smcFunc['htmlspecialchars']($_POST['name'], ENT_QUOTES)) === '') + fatal_lang_error('sp_error_shoutbox_name_empty', false); + + $result = $smcFunc['db_query']('',' + SELECT id_shoutbox + FROM {db_prefix}sp_shoutboxes + WHERE name = {string:name} + AND id_shoutbox != {int:current} + LIMIT 1', + array( + 'limit' => 1, + 'name' => $smcFunc['htmlspecialchars']($_POST['name'], ENT_QUOTES), + 'current' => (int) $_POST['shoutbox_id'], + ) + ); + list ($has_duplicate) = $smcFunc['db_fetch_row']($result); + $smcFunc['db_free_result']($result); + + if (!empty($has_duplicate)) + fatal_lang_error('sp_error_shoutbox_name_duplicate', false); + + $permission_set = 0; + $groups_allowed = $groups_denied = ''; + + if (!empty($_POST['permission_set'])) + $permission_set = (int) $_POST['permission_set']; + elseif (!empty($_POST['membergroups']) && is_array($_POST['membergroups'])) + { + $groups_allowed = $groups_denied = array(); + + foreach ($_POST['membergroups'] as $id => $value) + { + if ($value == 1) + $groups_allowed[] = (int) $id; + elseif ($value == -1) + $groups_denied[] = (int) $id; + } + + $groups_allowed = implode(',', $groups_allowed); + $groups_denied = implode(',', $groups_denied); + } + + if (isset($_POST['moderator_groups']) && is_array($_POST['moderator_groups']) && count($_POST['moderator_groups']) > 0) + { + foreach ($_POST['moderator_groups'] as $id => $group) + $_POST['moderator_groups'][$id] = (int) $group; + + $_POST['moderator_groups'] = implode(',', $_POST['moderator_groups']); + } + else + $_POST['moderator_groups'] = ''; + + if (!empty($_POST['allowed_bbc']) && is_array($_POST['allowed_bbc'])) + { + foreach ($_POST['allowed_bbc'] as $id => $tag) + $_POST['allowed_bbc'][$id] = $smcFunc['htmlspecialchars']($tag, ENT_QUOTES); + + $_POST['allowed_bbc'] = implode(',', $_POST['allowed_bbc']); + } + else + $_POST['allowed_bbc'] = ''; + + $fields = array( + 'name' => 'string', + 'permission_set' => 'int', + 'groups_allowed' => 'string', + 'groups_denied' => 'string', + 'moderator_groups' => 'string', + 'warning' => 'string', + 'allowed_bbc' => 'string', + 'height' => 'int', + 'num_show' => 'int', + 'num_max' => 'int', + 'reverse' => 'int', + 'caching' => 'int', + 'refresh' => 'int', + 'status' => 'int', + ); + + $shoutbox_info = array( + 'id' => (int) $_POST['shoutbox_id'], + 'name' => $smcFunc['htmlspecialchars']($_POST['name'], ENT_QUOTES), + 'permission_set' => $permission_set, + 'groups_allowed' => $groups_allowed, + 'groups_denied' => $groups_denied, + 'moderator_groups' => $_POST['moderator_groups'], + 'warning' => $smcFunc['htmlspecialchars']($_POST['warning'], ENT_QUOTES), + 'allowed_bbc' => $_POST['allowed_bbc'], + 'height' => (int) $_POST['height'], + 'num_show' => (int) $_POST['num_show'], + 'num_max' => (int) $_POST['num_max'], + 'reverse' => !empty($_POST['reverse']) ? 1 : 0, + 'caching' => !empty($_POST['caching']) ? 1 : 0, + 'refresh' => (int) $_POST['refresh'], + 'status' => !empty($_POST['status']) ? 1 : 0, + ); + + if ($context['SPortal']['is_new']) + { + unset($shoutbox_info['id']); + + $smcFunc['db_insert']('', + '{db_prefix}sp_shoutboxes', + $fields, + $shoutbox_info, + array('id_shoutbox') + ); + $shoutbox_info['id'] = $smcFunc['db_insert_id']('{db_prefix}sp_shoutboxes', 'id_shoutbox'); + } + else + { + $update_fields = array(); + foreach ($fields as $name => $type) + $update_fields[] = $name . ' = {' . $type . ':' . $name . '}'; + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_shoutboxes + SET ' . implode(', ', $update_fields) . ' + WHERE id_shoutbox = {int:id}', + $shoutbox_info + ); + } + + sportal_update_shoutbox($shoutbox_info['id']); + + if ($context['SPortal']['is_new'] && (allowedTo(array('sp_admin', 'sp_manage_blocks')))) + redirectexit('action=admin;area=portalshoutbox;sa=blockredirect;shoutbox=' . $shoutbox_info['id']); + else + redirectexit('action=admin;area=portalshoutbox'); + } + + if ($context['SPortal']['is_new']) + { + $context['SPortal']['shoutbox'] = array( + 'id' => 0, + 'name' => $txt['sp_shoutbox_default_name'], + 'permission_set' => 3, + 'groups_allowed' => array(), + 'groups_denied' => array(), + 'moderator_groups' => array(), + 'warning' => '', + 'allowed_bbc' => array('b', 'i', 'u', 's', 'url', 'code', 'quote', 'me'), + 'height' => 200, + 'num_show' => 20, + 'num_max' => 1000, + 'reverse' => 0, + 'caching' => 1, + 'refresh' => 0, + 'status' => 1, + ); + } + else + { + $_REQUEST['shoutbox_id'] = (int) $_REQUEST['shoutbox_id']; + $context['SPortal']['shoutbox'] = sportal_get_shoutbox($_REQUEST['shoutbox_id']); + } + + loadLanguage('Post'); + + $context['SPortal']['shoutbox']['groups'] = sp_load_membergroups(); + sp_loadMemberGroups($context['SPortal']['shoutbox']['moderator_groups'], 'moderator', 'moderator_groups'); + + $context['allowed_bbc'] = array( + 'b' => $txt['bold'], + 'i' => $txt['italic'], + 'u' => $txt['underline'], + 's' => $txt['strike'], + 'pre' => $txt['preformatted'], + 'flash' => $txt['flash'], + 'img' => $txt['image'], + 'url' => $txt['hyperlink'], + 'email' => $txt['insert_email'], + 'ftp' => $txt['ftp'], + 'glow' => $txt['glow'], + 'shadow' => $txt['shadow'], + 'sup' => $txt['superscript'], + 'sub' => $txt['subscript'], + 'tt' => $txt['teletype'], + 'code' => $txt['bbc_code'], + 'quote' => $txt['bbc_quote'], + 'size' => $txt['font_size'], + 'font' => $txt['font_face'], + 'color' => $txt['change_color'], + 'me' => 'me', + ); + + $disabled_tags = array(); + if (!empty($modSettings['disabledBBC'])) + $disabled_tags = explode(',', $modSettings['disabledBBC']); + if (empty($modSettings['enableEmbeddedFlash'])) + $disabled_tags[] = 'flash'; + + foreach ($disabled_tags as $tag) + { + if ($tag == 'list') + $context['disabled_tags']['orderlist'] = true; + + $context['disabled_tags'][trim($tag)] = true; + } + + $context['page_title'] = $context['SPortal']['is_new'] ? $txt['sp_admin_shoutbox_add'] : $txt['sp_admin_shoutbox_edit']; + $context['sub_template'] = 'shoutbox_edit'; +} + +function sportal_admin_shoutbox_prune() +{ + global $smcFunc, $context, $txt; + + $shoutbox_id = empty($_REQUEST['shoutbox_id']) ? 0 : (int) $_REQUEST['shoutbox_id']; + $context['shoutbox'] = sportal_get_shoutbox($shoutbox_id); + + if (empty($context['shoutbox'])) + fatal_lang_error('error_sp_shoutbox_not_exist', false); + + if (!empty($_POST['submit'])) + { + checkSession(); + + if (!empty($_POST['type'])) + { + $where = array('id_shoutbox = {int:shoutbox_id}'); + $parameters = array('shoutbox_id' => $shoutbox_id); + + if ($_POST['type'] == 'days' && !empty($_POST['days'])) + { + $where[] = 'log_time < {int:time_limit}'; + $parameters['time_limit'] = time() - $_POST['days'] * 86400; + } + elseif ($_POST['type'] == 'member' && !empty($_POST['member'])) + { + $request = $smcFunc['db_query']('', ' + SELECT id_member + FROM {db_prefix}members + WHERE member_name = {string:member} + OR real_name = {string:member} + LIMIT {int:limit}', + array( + 'member' => strtr(trim($smcFunc['htmlspecialchars']($_POST['member'], ENT_QUOTES)), array('\'' => ''')), + 'limit' => 1, + ) + ); + list ($member_id) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + if (!empty($member_id)) + { + $where[] = 'id_member = {int:member_id}'; + $parameters['member_id'] = $member_id; + } + } + + if ($_POST['type'] == 'all' || count($where) > 1) + { + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_shouts + WHERE ' . implode(' AND ', $where), + $parameters + ); + + if ($_POST['type'] != 'all') + { + $request = $smcFunc['db_query']('', ' + SELECT COUNT(*) + FROM {db_prefix}sp_shouts + WHERE id_shoutbox = {int:shoutbox_id} + LIMIT {int:limit}', + array( + 'shoutbox_id' => $shoutbox_id, + 'limit' => 1, + ) + ); + list ($total_shouts) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + } + else + $total_shouts = 0; + + $smcFunc['db_query']('',' + UPDATE {db_prefix}sp_shoutboxes + SET num_shouts = {int:total_shouts} + WHERE id_shoutbox = {int:shoutbox_id}', + array( + 'shoutbox_id' => $shoutbox_id, + 'total_shouts' => $total_shouts, + ) + ); + + sportal_update_shoutbox($shoutbox_id); + } + } + + redirectexit('action=admin;area=portalshoutbox'); + } + + $context['page_title'] = $txt['sp_admin_shoutbox_prune']; + $context['sub_template'] = 'shoutbox_prune'; +} + +function sportal_admin_shoutbox_delete() +{ + global $smcFunc; + + checkSession('get'); + + $shoutbox_id = !empty($_REQUEST['shoutbox_id']) ? (int) $_REQUEST['shoutbox_id'] : 0; + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_shoutboxes + WHERE id_shoutbox = {int:id}', + array( + 'id' => $shoutbox_id, + ) + ); + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_shouts + WHERE id_shoutbox = {int:id}', + array( + 'id' => $shoutbox_id, + ) + ); + + redirectexit('action=admin;area=portalshoutbox'); +} + +function sportal_admin_shoutbox_status() +{ + global $smcFunc; + + checkSession('get'); + + $shoutbox_id = !empty($_REQUEST['shoutbox_id']) ? (int) $_REQUEST['shoutbox_id'] : 0; + + $smcFunc['db_query']('', ' + UPDATE {db_prefix}sp_shoutboxes + SET status = CASE WHEN status = {int:is_active} THEN 0 ELSE 1 END + WHERE id_shoutbox = {int:id}', + array( + 'is_active' => 1, + 'id' => $shoutbox_id, + ) + ); + + redirectexit('action=admin;area=portalshoutbox'); +} + +function sportal_admin_shoutbox_block_redirect() +{ + global $context, $scripturl, $txt; + + if (!allowedTo('sp_admin')) + isAllowedTo('sp_manage_blocks'); + + $context['page_title'] = $txt['sp_admin_shoutbox_add']; + $context['redirect_message'] = sprintf($txt['sp_admin_shoutbox_block_redirect_message'], $scripturl . '?action=admin;area=portalblocks;sa=add;selected_type=sp_shoutbox;parameters[]=shoutbox;shoutbox=' . $_GET['shoutbox'], $scripturl . '?action=admin;area=portalshoutbox'); + $context['sub_template'] = 'shoutbox_block_redirect'; +} + +?> \ No newline at end of file diff --git a/Sources/PortalArticles.php b/Sources/PortalArticles.php new file mode 100644 index 0000000..3a9427d --- /dev/null +++ b/Sources/PortalArticles.php @@ -0,0 +1,325 @@ + 1, + 'publish' => 1, + ) + ); + list ($totalArticles) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + $modSettings['articleperpage'] = isset($modSettings['articleperpage']) ? (int) $modSettings['articleperpage'] : 5; + $context['start'] = !empty($_REQUEST['articles']) ? (int) $_REQUEST['articles'] : 0; + + if (!empty($modSettings['articleperpage']) && $totalArticles > 0) + $context['page_index'] = constructPageIndex($context['portal_url'] . '?articles=%1$d', $context['start'], $totalArticles, $modSettings['articleperpage'], true); + + if (empty($modSettings['sp_disableColor'])) + { + $members_request = $smcFunc['db_query']('',' + SELECT m.id_member + FROM {db_prefix}sp_articles AS a + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) + INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) + INNER JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category) + WHERE {query_see_board} + AND a.approved = {int:approved} + AND publish = {int:publish} + AND m.id_member != {int:guest} + ORDER BY a.id_message DESC' . (empty($modSettings['articleperpage']) ? '' : ' + LIMIT {int:start}, {int:end}'), + array( + 'approved' => 1, + 'publish' => 1, + 'start' => $context['start'], + 'end' => $modSettings['articleperpage'], + 'guest' => 0, + ) + ); + $colorids = array(); + while($row = $smcFunc['db_fetch_assoc']($members_request)) + $colorids[] = $row['id_member']; + $smcFunc['db_free_result']($members_request); + + if (!empty($colorids)) + sp_loadColors($colorids); + } + + $article_request = $smcFunc['db_query']('',' + SELECT + a.id_article, a.id_category, a.id_message, a.approved, c.name as cname, c.picture, m.id_member, + IFNULL(mem.real_name, m.poster_name) AS poster_name, m.icon, m.subject, m.body, m.poster_time, + m.smileys_enabled, t.id_topic, t.num_replies, t.num_views, t.locked, b.id_board, b.name as bname, + mem.avatar, at.id_attach, at.attachment_type, at.filename + FROM {db_prefix}sp_articles AS a + INNER JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category) + INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) + INNER JOIN {db_prefix}topics AS t ON (t.id_first_msg = a.id_message) + INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) + LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) + LEFT JOIN {db_prefix}attachments AS at ON (at.id_member = mem.id_member) + WHERE {query_see_board} + AND a.approved = {int:approved} + AND publish = {int:publish} + ORDER BY a.id_message DESC' . (empty($modSettings['articleperpage']) ? '' : ' + LIMIT {int:start}, {int:end}'), + array( + 'approved' => 1, + 'publish' => 1, + 'start' => $context['start'], + 'end' => $modSettings['articleperpage'], + ) + ); + + $context['get_articles'] = 'sportal_articles_callback'; +} + +function sportal_articles_callback($reset = false) +{ + global $smcFunc, $context, $scripturl, $modSettings, $settings, $txt, $color_profile, $article_request, $current; + + if ($article_request == false) + return false; + + if (!($row = $smcFunc['db_fetch_assoc']($article_request))) + return false; + + if (!empty($current) && $current == $row['id_message']) + return; + + $current = $row['id_message']; + + $stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless'); + $icon_sources = array(); + foreach ($stable_icons as $icon) + $icon_sources[$icon] = 'images_url'; + + $limited = false; + if (($cutoff = $smcFunc['strpos']($row['body'], '[cutoff]')) !== false) + { + $row['body'] = $smcFunc['substr']($row['body'], 0, $cutoff); + $limited = true; + } + elseif (!empty($modSettings['articlelength']) && $smcFunc['strlen']($row['body']) > $modSettings['articlelength']) + { + $row['body'] = $smcFunc['substr']($row['body'], 0, $modSettings['articlelength']); + $limited = true; + } + + $row['body'] = parse_bbc($row['body'], $row['smileys_enabled'], $row['id_message']); + + // Only place an ellipsis if the body has been shortened. + if ($limited) + $row['body'] .= '...'; + + if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') + { + $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; + $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; + } + else + { + $avatar_width = ''; + $avatar_height = ''; + } + + if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']])) + $icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url'; + + censorText($row['subject']); + censorText($row['body']); + + if ($modSettings['sp_resize_images']) + $row['body'] = preg_replace('~class="bbc_img~i', 'class="bbc_img sp_article', $row['body']); + + $output = array( + 'article' => array( + 'id' => $row['id_article'], + 'comment_href' => !empty($row['locked']) ? '' : $scripturl . '?action=post;topic=' . $row['id_topic'] . '.' . $row['num_replies'] . ';num_replies=' . $row['num_replies'], + 'comment_link' => !empty($row['locked']) ? '' : '| ' . $txt['ssi_write_comment'] . '', + 'new_comment' => !empty($row['locked']) ? '' : '| ' . $txt['ssi_write_comment'] . '', + 'link' => '' . $txt['sp-read_more'] . '', + 'approved' => $row['approved'], + ), + 'category' => array( + 'id' => $row['id_category'], + 'name' => $row['cname'], + 'picture' => array ( + 'href' => $row['picture'], + 'image' => '' . $row['cname'] . '', + ), + ), + 'message' => array( + 'id' => $row['id_message'], + 'icon' => '' . $row['icon'] . '', + 'subject' => $row['subject'], + 'body' => $row['body'], + 'time' => timeformat($row['poster_time']), + ), + 'poster' => array( + 'id' => $row['id_member'], + 'name' => $row['poster_name'], + 'href' => !empty($row['id_member']) ? $scripturl . '?action=profile;u=' . $row['id_member'] : '', + 'link' => !empty($row['id_member']) ? (!empty($color_profile[$row['id_member']]['link']) ? $color_profile[$row['id_member']]['link'] : '' . $row['poster_name'] . '') : $row['poster_name'], + 'avatar' => array( + 'name' => $row['avatar'], + 'image' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? '' : '') : (stristr($row['avatar'], 'http://') ? '' : ''), + 'href' => $row['avatar'] == '' ? ($row['id_attach'] > 0 ? (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), + 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']) + ), + ), + 'topic' => array( + 'id' => $row['id_topic'], + 'replies' => $row['num_replies'], + 'views' => $row['num_views'], + 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0', + 'link' => '' . $row['subject'] . '', + 'locked' => !empty($row['locked']), + ), + 'board' => array( + 'id' => $row['id_board'], + 'name' => $row['bname'], + 'link' => '' . $row['bname'] . '', + ), + ); + + return $output; +} + +function sportal_add_article() +{ + global $smcFunc, $context, $scripturl, $sourcedir, $txt; + + if (!allowedTo(array('sp_add_article', 'sp_manage_articles', 'sp_admin'))) + fatal_lang_error('error_sp_cannot_add_article'); + + require_once($sourcedir . '/Subs-PortalAdmin.php'); + loadLanguage('SPortalAdmin', sp_languageSelect('SPortalAdmin')); + loadTemplate('PortalArticles'); + + if (!empty($_POST['add_article'])) + { + $article_options = array( + 'id_category' => !empty($_POST['category']) ? (int) $_POST['category'] : 0, + 'id_message' => !empty($_POST['message']) ? (int) $_POST['message'] : 0, + 'approved' => allowedTo(array('sp_admin', 'sp_manage_articles', 'sp_auto_article_approval')) ? 1 : 0, + ); + createArticle($article_options); + + redirectexit('topic=' . $_POST['return']); + } + + $context['message'] = !empty($_REQUEST['message']) ? (int) $_REQUEST['message'] : 0; + $context['return'] = !empty($_REQUEST['return']) ? $_REQUEST['return'] : ''; + + if (empty($context['message'])) + fatal_lang_error('error_sp_no_message_id'); + + $request = $smcFunc['db_query']('',' + SELECT id_message + FROM {db_prefix}sp_articles + WHERE id_message = {int:message}', + array( + 'message' => $context['message'], + ) + ); + list ($exists) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + if ($exists) + fatal_lang_error('error_sp_article_exists'); + + $context['list_categories'] = getCategoryInfo(null, true); + + if (empty($context['list_categories'])) + fatal_error(allowedTo(array('sp_admin', 'sp_manage_articles')) ? $txt['error_sp_no_category'] . '
    ' . sprintf($txt['error_sp_no_category_sp_moderator'], $scripturl . '?action=admin;area=portalarticles;sa=addcategory') : $txt['error_sp_no_category_normaluser'], false); + + $context['sub_template'] = 'add_article'; +} + +function sportal_remove_article() +{ + global $smcFunc, $sourcedir; + + checkSession('get'); + + if (!allowedTo(array('sp_remove_article', 'sp_manage_articles', 'sp_admin'))) + fatal_lang_error('error_sp_cannot_remove_article'); + + require_once($sourcedir . '/Subs-PortalAdmin.php'); + + $message_id = !empty($_REQUEST['message']) ? (int) $_REQUEST['message'] : 0; + $topic_id = !empty($_REQUEST['return']) ? $_REQUEST['return'] : ''; + + $smcFunc['db_query']('',' + DELETE FROM {db_prefix}sp_articles + WHERE id_message = {int:message}', + array( + 'message' => $message_id, + ) + ); + + fixCategoryArticles(); + + redirectexit('topic=' . $topic_id); +} + +?> \ No newline at end of file diff --git a/Sources/PortalBlocks.php b/Sources/PortalBlocks.php new file mode 100644 index 0000000..8dfa76f --- /dev/null +++ b/Sources/PortalBlocks.php @@ -0,0 +1,3564 @@ +'; + + if ($context['user']['is_guest']) + { + echo ' + +