From 6964ff8f513763ec0d905d9cc0c7c312b0ff6d99 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 3 Sep 2009 12:48:45 +0000 Subject: [PATCH] Start B3P v2 :-D --- root/adm/mods/board3_portal_check_version.php | 41 ++ root/adm/style/acp_portal_blocks.html | 285 ++++++++ root/adm/style/acp_portal_config.html | 75 ++ root/adm/style/acp_portal_links.html | 83 +++ root/images/portal/Thumbs.db | Bin 0 -> 32256 bytes root/images/portal/arrowbullet.gif | Bin 0 -> 102 bytes root/images/portal/board3clock.swf | Bin 0 -> 1640 bytes root/images/portal/icon_topic_attach.gif | Bin 0 -> 144 bytes root/images/portal/icons/Thumbs.db | Bin 0 -> 30720 bytes root/images/portal/icons/index.html | 8 + root/images/portal/icons/portal_attach.png | Bin 0 -> 1003 bytes root/images/portal/icons/portal_birthday.png | Bin 0 -> 1122 bytes root/images/portal/icons/portal_bots.png | Bin 0 -> 964 bytes root/images/portal/icons/portal_clock.png | Bin 0 -> 1160 bytes root/images/portal/icons/portal_custom.png | Bin 0 -> 1118 bytes root/images/portal/icons/portal_donation.png | Bin 0 -> 738 bytes root/images/portal/icons/portal_friends.png | Bin 0 -> 453 bytes root/images/portal/icons/portal_link_us.png | Bin 0 -> 895 bytes root/images/portal/icons/portal_links.png | Bin 0 -> 1154 bytes root/images/portal/icons/portal_login.png | Bin 0 -> 1002 bytes root/images/portal/icons/portal_members.png | Bin 0 -> 1173 bytes root/images/portal/icons/portal_menu.png | Bin 0 -> 855 bytes root/images/portal/icons/portal_minical.png | Bin 0 -> 1114 bytes root/images/portal/icons/portal_random.png | Bin 0 -> 1147 bytes root/images/portal/icons/portal_search.png | Bin 0 -> 813 bytes root/images/portal/icons/portal_stats.png | Bin 0 -> 1166 bytes root/images/portal/icons/portal_style.png | Bin 0 -> 1116 bytes root/images/portal/icons/portal_team.png | Bin 0 -> 1067 bytes .../images/portal/icons/portal_top_poster.png | Bin 0 -> 1097 bytes root/images/portal/icons/portal_user.png | Bin 0 -> 1130 bytes root/images/portal/index.html | 8 + .../portal/mini_cal_icon_left_arrow.png | Bin 0 -> 744 bytes .../portal/mini_cal_icon_right_arrow.png | Bin 0 -> 676 bytes root/images/portal/paypal.gif | Bin 0 -> 2923 bytes root/includes/acp/acp_portal_blocks.php | 497 +++++++++++++ root/includes/acp/acp_portal_config.php | 170 +++++ root/includes/acp/acp_portal_links.php | 257 +++++++ root/includes/acp/info/acp_portal_blocks.php | 42 ++ root/includes/acp/info/acp_portal_config.php | 42 ++ root/includes/acp/info/acp_portal_links.php | 42 ++ root/language/de/mods/info_acp_portal.php | 165 +++++ root/language/de/mods/portal.php | 185 +++++ root/language/en/mods/info_acp_portal.php | 165 +++++ root/language/en/mods/portal.php | 185 +++++ root/portal.php | 214 ++++++ root/portal/block/birthday_list.php | 86 +++ root/portal/block/donate.php | 33 + root/portal/block/friends.php | 66 ++ root/portal/block/index.html | 8 + root/portal/block/latest_bots.php | 55 ++ root/portal/block/latest_members.php | 35 + root/portal/block/statistics.php | 140 ++++ root/portal/block/top_posters.php | 39 ++ root/portal/block/user_menu.php | 100 +++ root/portal/includes/functions.php | 650 ++++++++++++++++++ .../includes/functions_version_check.php | 191 +++++ root/portal/includes/index.html | 7 + root/portal/index.html | 7 + .../template/portal/_block_config.html | 18 + .../template/portal/block/birthday.html | 12 + .../template/portal/block/change_style.html | 7 + .../template/portal/block/clock.html | 8 + .../template/portal/block/donation.html | 39 ++ .../template/portal/block/general_block.html | 12 + .../template/portal/block/index.html | 7 + .../template/portal/block/jumpbox.html | 21 + .../template/portal/block/latest_bots.html | 5 + .../template/portal/block/latest_members.html | 7 + .../template/portal/block/links.html | 14 + .../template/portal/block/mini_calendar.html | 31 + .../template/portal/block/online.html | 3 + .../template/portal/block/online_friends.html | 15 + .../template/portal/block/random_member.html | 20 + .../template/portal/block/search.html | 74 ++ .../template/portal/block/statistics.html | 19 + .../template/portal/block/top_poster.html | 11 + .../template/portal/block/user_menu.html | 36 + .../template/portal/blocks_bottom.html | 24 + .../template/portal/blocks_left.html | 24 + .../template/portal/blocks_middle_bottom.html | 24 + .../template/portal/blocks_middle_top.html | 24 + .../template/portal/blocks_right.html | 24 + .../prosilver/template/portal/blocks_top.html | 24 + .../prosilver/template/portal/index.html | 7 + .../template/portal/portal_body.html | 48 ++ root/styles/prosilver/theme/portal.css | 52 ++ 86 files changed, 4491 insertions(+) create mode 100644 root/adm/mods/board3_portal_check_version.php create mode 100644 root/adm/style/acp_portal_blocks.html create mode 100644 root/adm/style/acp_portal_config.html create mode 100644 root/adm/style/acp_portal_links.html create mode 100644 root/images/portal/Thumbs.db create mode 100644 root/images/portal/arrowbullet.gif create mode 100644 root/images/portal/board3clock.swf create mode 100644 root/images/portal/icon_topic_attach.gif create mode 100644 root/images/portal/icons/Thumbs.db create mode 100644 root/images/portal/icons/index.html create mode 100644 root/images/portal/icons/portal_attach.png create mode 100644 root/images/portal/icons/portal_birthday.png create mode 100644 root/images/portal/icons/portal_bots.png create mode 100644 root/images/portal/icons/portal_clock.png create mode 100644 root/images/portal/icons/portal_custom.png create mode 100644 root/images/portal/icons/portal_donation.png create mode 100644 root/images/portal/icons/portal_friends.png create mode 100644 root/images/portal/icons/portal_link_us.png create mode 100644 root/images/portal/icons/portal_links.png create mode 100644 root/images/portal/icons/portal_login.png create mode 100644 root/images/portal/icons/portal_members.png create mode 100644 root/images/portal/icons/portal_menu.png create mode 100644 root/images/portal/icons/portal_minical.png create mode 100644 root/images/portal/icons/portal_random.png create mode 100644 root/images/portal/icons/portal_search.png create mode 100644 root/images/portal/icons/portal_stats.png create mode 100644 root/images/portal/icons/portal_style.png create mode 100644 root/images/portal/icons/portal_team.png create mode 100644 root/images/portal/icons/portal_top_poster.png create mode 100644 root/images/portal/icons/portal_user.png create mode 100644 root/images/portal/index.html create mode 100644 root/images/portal/mini_cal_icon_left_arrow.png create mode 100644 root/images/portal/mini_cal_icon_right_arrow.png create mode 100644 root/images/portal/paypal.gif create mode 100644 root/includes/acp/acp_portal_blocks.php create mode 100644 root/includes/acp/acp_portal_config.php create mode 100644 root/includes/acp/acp_portal_links.php create mode 100644 root/includes/acp/info/acp_portal_blocks.php create mode 100644 root/includes/acp/info/acp_portal_config.php create mode 100644 root/includes/acp/info/acp_portal_links.php create mode 100644 root/language/de/mods/info_acp_portal.php create mode 100644 root/language/de/mods/portal.php create mode 100644 root/language/en/mods/info_acp_portal.php create mode 100644 root/language/en/mods/portal.php create mode 100644 root/portal.php create mode 100644 root/portal/block/birthday_list.php create mode 100644 root/portal/block/donate.php create mode 100644 root/portal/block/friends.php create mode 100644 root/portal/block/index.html create mode 100644 root/portal/block/latest_bots.php create mode 100644 root/portal/block/latest_members.php create mode 100644 root/portal/block/statistics.php create mode 100644 root/portal/block/top_posters.php create mode 100644 root/portal/block/user_menu.php create mode 100644 root/portal/includes/functions.php create mode 100644 root/portal/includes/functions_version_check.php create mode 100644 root/portal/includes/index.html create mode 100644 root/portal/index.html create mode 100644 root/styles/prosilver/template/portal/_block_config.html create mode 100644 root/styles/prosilver/template/portal/block/birthday.html create mode 100644 root/styles/prosilver/template/portal/block/change_style.html create mode 100644 root/styles/prosilver/template/portal/block/clock.html create mode 100644 root/styles/prosilver/template/portal/block/donation.html create mode 100644 root/styles/prosilver/template/portal/block/general_block.html create mode 100644 root/styles/prosilver/template/portal/block/index.html create mode 100644 root/styles/prosilver/template/portal/block/jumpbox.html create mode 100644 root/styles/prosilver/template/portal/block/latest_bots.html create mode 100644 root/styles/prosilver/template/portal/block/latest_members.html create mode 100644 root/styles/prosilver/template/portal/block/links.html create mode 100644 root/styles/prosilver/template/portal/block/mini_calendar.html create mode 100644 root/styles/prosilver/template/portal/block/online.html create mode 100644 root/styles/prosilver/template/portal/block/online_friends.html create mode 100644 root/styles/prosilver/template/portal/block/random_member.html create mode 100644 root/styles/prosilver/template/portal/block/search.html create mode 100644 root/styles/prosilver/template/portal/block/statistics.html create mode 100644 root/styles/prosilver/template/portal/block/top_poster.html create mode 100644 root/styles/prosilver/template/portal/block/user_menu.html create mode 100644 root/styles/prosilver/template/portal/blocks_bottom.html create mode 100644 root/styles/prosilver/template/portal/blocks_left.html create mode 100644 root/styles/prosilver/template/portal/blocks_middle_bottom.html create mode 100644 root/styles/prosilver/template/portal/blocks_middle_top.html create mode 100644 root/styles/prosilver/template/portal/blocks_right.html create mode 100644 root/styles/prosilver/template/portal/blocks_top.html create mode 100644 root/styles/prosilver/template/portal/index.html create mode 100644 root/styles/prosilver/template/portal/portal_body.html create mode 100644 root/styles/prosilver/theme/portal.css diff --git a/root/adm/mods/board3_portal_check_version.php b/root/adm/mods/board3_portal_check_version.php new file mode 100644 index 00000000..a1b4f39d --- /dev/null +++ b/root/adm/mods/board3_portal_check_version.php @@ -0,0 +1,41 @@ + 'Saint_hh', + 'title' => 'Board3 Portal', + 'tag' => 'board3_portal_v2', + 'version' => $portal_config['portal_version'], + 'file' => array('board3.de', 'updatecheck', 'board3_portal.xml'), + ); + } +} + +?> \ No newline at end of file diff --git a/root/adm/style/acp_portal_blocks.html b/root/adm/style/acp_portal_blocks.html new file mode 100644 index 00000000..8b3f7745 --- /dev/null +++ b/root/adm/style/acp_portal_blocks.html @@ -0,0 +1,285 @@ + + + + + + + « {L_BACK} + + + + + + +

{L_ACP_PORTAL_BLOCKS}

+

{L_ACP_PORTAL_BLOCKS_EXPLAIN}

+ +
+ +
+ {L_ACP_PORTAL_BLOCKS} +
+

+ {L_BLOCK_TITLE_EXPLAIN}
+
+
+
+

+ {L_BLOCK_ICON_EXPLAIN}
+
+
+
+
+
+
+
+
+

+ {L_BLOCK_POSITION_EXPLAIN}
+
+
+
+

+ {L_BLOCK_TYPE_EXPLAIN}
+
+
+
+
+ + + +

{L_ACP_PORTAL_BLOCKS}

+

{L_ACP_PORTAL_BLOCKS_EXPLAIN}

+ +
+
+ {L_ACP_PORTAL_BLOCKS} + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + +
{L_BLOCK_ICON}{L_BLOCK_TITLE}{L_BLOCK_TYPE}{L_BLOCK_POSITION}{L_ACTION}
{blocks.BLOCK_TITLE}  -  {blocks.BLOCK_TITLE}{blocks.BLOCK_TYPE}{blocks.BLOCK_POSITION} [ {L_DISABLE} ] + {ICON_MOVE_UP_DISABLED}{ICON_MOVE_UP}  + {ICON_MOVE_DOWN_DISABLED}{ICON_MOVE_DOWN}  + {ICON_EDIT} {ICON_DELETE} +
+ + {S_FORM_TOKEN} +
+
+ + + + \ No newline at end of file diff --git a/root/adm/style/acp_portal_config.html b/root/adm/style/acp_portal_config.html new file mode 100644 index 00000000..8f54e59f --- /dev/null +++ b/root/adm/style/acp_portal_config.html @@ -0,0 +1,75 @@ + + + + +

{L_TITLE}

+ +

{L_TITLE_EXPLAIN}

+ + +
+

{L_WARNING}

+

{ERROR_MSG}

+
+ + + + +
+ {L_VERSION_CHECK} +

{mods.UP_TO_DATE}

+
+
+
{mods.CURRENT_VERSION}
+
+
+
+
{mods.LATEST_VERSION}
+
+ +
+
+
{L_DOWNLOAD} {mods.TITLE} {mods.LATEST_VERSION}
+
+
+
+
{L_RELEASE_ANNOUNCEMENT}
+
+ +
+ + +
+ + + + + + +
+ {options.LEGEND} + + +
+

{options.TITLE_EXPLAIN}
+
{options.CONTENT}
+
+ + + + + + + {auth_tpl.TPL} + + + +

+   + +

+ {S_FORM_TOKEN} +
+
+ + \ No newline at end of file diff --git a/root/adm/style/acp_portal_links.html b/root/adm/style/acp_portal_links.html new file mode 100644 index 00000000..2affa1bd --- /dev/null +++ b/root/adm/style/acp_portal_links.html @@ -0,0 +1,83 @@ + + + + + + + « {L_BACK} +

{L_ACP_PORTAL_LINKS}

+

{L_ACP_PORTAL_LINKS_EXPLAIN}

+ + + + + +

{L_ACP_PORTAL_LINKS}

+

{L_ACP_PORTAL_LINKS_EXPLAIN}

+ + + + + + diff --git a/root/images/portal/Thumbs.db b/root/images/portal/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..400f9bd3f8806f802e70e8a77526fbc198ac6f2b GIT binary patch literal 32256 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 G!5RSLwJ6~L literal 0 HcmV?d00001 diff --git a/root/images/portal/board3clock.swf b/root/images/portal/board3clock.swf new file mode 100644 index 0000000000000000000000000000000000000000..d2385a042f07fe8c088555138889dba006a62a58 GIT binary patch literal 1640 zcmV-u2ABCmS5pYb3IG6joQ;+XP!mTOfd9M8i-bTD0z?S~rCL!zD9WhC64a@61Z_bJ zR;ffF5*`T&K{{2(=pY3hs5msj)CaAtqGGjnijS73V-!V-Sc|Cmq9UL;bXu!Y@w#`p zgQU<$2JUvh|GB&W?p_LbW&-ynfC7X0Qb50Xct=lvI58Cm$Ug<{Fkfv-hOFd7y)G#W z)+C!^m}Z7nmu*U>Q54fm(PtZJ@HX9`yYrLNO=^fzn^HiNuGbq`I~zCZvvo<3n66Ju zV`D5?oeHardXw6u)$43ND8!giP2Ey$MzRqWXJ@QNuPl?=Xqv}(FfG)Xl8tNC=};uI zmjDo{;DcF2zyszd0M*AB;GPy&5MV=;gA4FzZ;BE2jALV5d&Y~laDnfPI^o_H4hZ-H zLP?P@M8s6%71VIH@PUs};RH$x4g#lWT30B*9Cdl4=!$4v4kmD3Om)SJDN7f|k~Uak zFL!0+T;*_Zg!#$^4r&rcjTm-AVIid^27z>Vf@G>NhY53=<7sh18vJg8>M5yoaY`Vc z;|;a25;ZZ%1ZQ7>2EZiMxrBg-Q#Ak%?d|Pkettek+?#wA5fvc!QZ|QHX3e}l0K&uF z5d5RE_gq*O2nQ-)N_VHBd0*kV89We{D8OZUXX?x=g@9(BbdsP5IEs$2Dw?y<+`l|nj;HsVAkRqwhL14Ym zAv#?6uYyFggW%pp;bcwk#0qs0{3pK;ZuMAL!`8Cs0tY{KydrY-ozeI~dAw>geprx@ z;K1D@FISabs2;(6;@YE2w_g1lmpO8T=|y7ckw>G_$kFK6^3mvdg+eis9^F2g?oo~% z1zUL z%fJyRcJm0d_P9NgebGxHNTBy>lnTnPbs4@(EVH(?z_L{;tmwlB@6GBgh1jbqY}Ep< zqHLvZRz(mjEw2N^0k3zhyHa3M5VKi1>}Dm{&Dw^ZT(nt*l>mq8aNDe*9DLmyN#U=C zV~YyEk9`p{=%;;M5UAR&cyspL4OL`XfkB-SG10s6clU!zQQoBk+;PWC-&nRE@VhHR z17>Q)x%JofpTU%ia>-PWHt+HEH`YgrxQ6&=2ku*2(;kPq6ra!vJj~epVXU!eOZJkd z1%`yan(LikzV_!k1)B`Zdn+?ry*zeJ$!kamkY8+kc5Q;SH7U^lW$}sBXPy%R*X77x zoV*^j!CK!M+BXjGY;3K)w-T9Fo$T>&xp6On88VL@GS@a_Qs#=De02WuB8*yeF;Pd@ zMj1gv)kdd@^i`y-Da#t%B!?r@`LG?MP9B^+c44kwZA=Ogqsa?EJtxpVty>=18iVGv z3H4K(N$PAv6KIYrxpj88${W8U!pFKkg&TjUY$*xZl$_XA2trR0=pUoA0e`Iu z+u%1g_Cj#at8eYuF<)1^0*&Apx-=vxEGeXJHFcUXITLE73#nzp(6<1bebO*+m);iC zR_58($c)j;dJFvcL`X;o$z}p(q%#@G0>FBPgWf$PVEbyNfwVgUxyiM@Qqo_QDc-gl zFoI5AqamsKr~b=#aOgK+pVvx*X&WxuFvYhOO;^gw>U2krV|<*MMAFQdjR&6{7+nP) zP@(*2Gd{{r{@MOIjL93PYs|F~=(h&^w(@xB-Ug-Yo*x=+2*MLFAu5Zr$)hR&!4#@4v^o9({HSR<;c3C4)983ofuE@-t;w65+M>$g1| m`lkCwGgKB5R0*~UftIS}0tioUo0OwgP7XSbN literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/Thumbs.db b/root/images/portal/icons/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..75336e1a7643ae5cd2e7e2f73d427e67cc04e746 GIT binary patch literal 30720 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 )|*=CSs9VwIz!>!HFE0F_Z|7eGqh#k zBHY-vUSpZIOcP>GOxeDCi0MJ}0i8QpU`9Hln~4$1up-xDm^H%J^)48r) z6SKWmD3c6cW^xA&<^-PSt!G2afSKZx57oge*1#q4UEn%cw(;E)2wM0ECPZ+`E*JQMS~qk_{q6M4{(1f;_P;-V{r}AP^(_uW%iIRS zmu}}&kF!)2lfB3%JHx%jZ5g2j9lQ(0coA;fbC=xnl#!~S)G1!XV$ho6YW59*o1zH` z&*G(aWhOsrO5jUOXt$Je(0pbit+usC2nGz>L_Kp8Z>rxqMad$0-U#dc`LO%20n0j_x3u9!I z=4N$nyKh@d$0hn>mmMq|M>;pkHdB6VV`6{7^XIo`-|v0?d<9He=j-$5i9fIZ%Uo0{ zu+8t)-}xi`;(uQMAD;j89_T;)wfz!*fqqJ`J?cNu{?DN7k+1r{^`FZ7{pWuC@V^{C zq^eITHoqh7m@zvhgu1SrH=`XZ5VNH^v^N}o^Bj^((N3;Z$Y6cJB-!Owc7sK2Y4|-+ z-~0OKyKb$v7hE&Pzyi@P3WY2dZNuY|1z>TfxvpO(94QG@KkwANb8yM`6>+Gx;6Y^> z{|&n94f*Z1oH1pk;MV0e!vmVI^9-a+^IW%0-=|Tq-KoJx%Qo8&x%ndcVu$^so!tf{ z$7->aXzsdn`g)Vc&q!}3`MTVXqxew73bRekd8Q1t)9?9^{ld8$N4GI50) zK6HUs!E+7VD&N5yM=BE%WdwdWQ6Hi=MZV0RM-0UGt>tyk%^X z5AcOAod`Sm8VA38F=&qoMeKC}K1$Uvs9#}TRHH$CJJCJ2~AQWxl*9%jD`ypBp<0+ z+T944w-JjIYpRNoI#&IOL&4QlwmSSO3(?f=(d7>xOj7s;=4IH?1Q&t^HG5@-5D5f| z3njcv_a2D7U{ZGXQhdBq^$HgTkHiuS$l1|f^3*S`Ve~t>a|yloCale+JlaN5zCfOE zm~dhOtGLvy!(mGAk|1SfP?b_!hm?i2=iFj#MC^J8eXpifkEQl})rhLfiP7;?ZOqWO z>lfp`{p{aA{+I6`$5qiu$f{r|3)V>^*GNtm(;G0(XPmd!4HE}t^U=M{=7{m2HQhC0 zbcP?(XO4=f%h5*y%;wX0Dj)NP3Ei^qDduz5E-ESW121N;dgCt|x{g-8Y+Rv<<41Pj z^^D}8#ZtgT?cE&(#P+;NV=_T;tXfrnz5qv*eou9F#@#m;O?%W{%D=xVepBbsi}KRl z9p#eV4HLX&SM~0-Le(M#ci@6M2Y8l zXo}xT8<-7yHZa~Q7>E1EP};u|q#MRMrQ5>dz$%T-PWS2D<3kBV+1UR-tJ#N zf4lyQ{g1A{`}X&bX?Fj={r=HbbNggVkk8Rs2L%K?xcupH?+hmXBT@>^x1xtvlq8JH z7Yy+`l`gZHh-spa=ghPs*Ml2sE$REsS=qhiw3dnEK5Q!_!YFdUPitf^yK|ULXhaxI zR=LGAG)E|8zmtyXnGy26s$_=USmch{eRMWuG;qUvMcjJC=VE_4T57U3a5xd=R;DDR zV1M&wM!#4_QM@AmyQo8@VJxo{U8&0NeYB#r4k}rB8>*wf{LxyLiw$k+t79_FF`s1Z z{-Jl(Xo+t6k9b=C)%Kt@q|l#V96x3TMod|NkyAEce)&(wkU`_7pfQiXEO!$~*?^hi zMqlQ_|9D)NC=en4UAdp?f@GkvmA|G7`qel{-;eb`^@GNv{<4fUXp=Q~=O;9V?5Db* zJ7Fl6^XqappiMv51Vz4nO#-T!1sHb*{l49g<)HCuP{in$o={-JWT6WiY+pEd$?2MO|z#k@@|5E9LUwaG}JQ_t8;M~F1v{A#> zQ`|m!ZTT1@vik{15KdAnXRmz-tikQ7lJ=GBd7j|S-Cjgh1y;nPmb?6UPh+IA*n9iv z+%Hd`>WQe&Kf?%qsZ{t?B^v`#9K=x(> UEYAs8EVT4vd;Mqmzk2Ea0l2H1W&i*H literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/index.html b/root/images/portal/icons/index.html new file mode 100644 index 00000000..5832e4a2 --- /dev/null +++ b/root/images/portal/icons/index.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/root/images/portal/icons/portal_attach.png b/root/images/portal/icons/portal_attach.png new file mode 100644 index 0000000000000000000000000000000000000000..68307ecff3905ae6f0f2ed0967a177133835dd67 GIT binary patch literal 1003 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR^7d2E!l*%P0oRWCqJ@ zhM*RPpeYPNa~Oh_GDIz9XbEEIiDI}nh2cMgfFXl`6NA9LITBtBigW&JK3{4G1VF7z z|2sWj>$Ubj(2}4ahA0V!sIC8_-tSG``#)PkvACF__}KsA_s4+dwzM#`v`lF^_rHfB zsOSB;DGX6lrYxN^XYHJ8|CcV^y7l@0y?Yt<9=o>p`}1SRB(B|i{`~p(_fcElfB*kI z`PldW|Nm#7`(J(Sf6KN1Q||p=3RDdg+X@sO1*0KAb_l2}v=aqp0ltzTzhD$Y7+eqB zIRTXE@pN$vskoJU<~m=KfrP`u{aU$QQQtMXb`F`*y3CdYy33ZGKACaj zz1c)JZ^5Ng1ey%p*v{(IUz~M)gJEygt39)R)vXU*Z_r!T_tfNiDp0EO3$rS>#AL69 Rx2J=0t*5J>%Q~loCIBVv1Csy% literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/portal_birthday.png b/root/images/portal/icons/portal_birthday.png new file mode 100644 index 0000000000000000000000000000000000000000..5c1ca3c0f047e2f27f6a4ddf6e7c62686711ff89 GIT binary patch literal 1122 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 kRR$!0YyivkKmx=vV@a|w4d?1G z{A&|1yzGF~TZ8KHTl_r*T3@s<=A;pUk6t|eFbv0%74?%+OlCdki0e@06yy3x1%Foo zZA8IP3kLWJ+!ohD8&$%-Xu;s38IP9-L1$fP3CnTSerf$50rgDty6Lr^*!3d)Z5bO| z-!b-f1e)3AZ8+nCGAzU8!LrRAB^VQ3$5hYdKYA07xLVs{S`MaSy~ut|Ll;xQn;C~< zTE=EZ#ZWme+JuKV0b`<5t|FFt=DRug$%=#6R&beFSRGVu!=XktGv>d{p(*$PrItbs zC%{@V&UayoG-zyPh^uwrJq0zft&6HKksgOU)PPF&4Gy0B97SX;1Yuth&KvTM@H8_D zI|j&k17#5C^Q5`mXHM}n5yer~ z1v@0vf}XSMShQ`!KZ;`Qm@#H#oe^ U8%xtYa{vGU07*qoM6N<$f()ing#Z8m literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/portal_friends.png b/root/images/portal/icons/portal_friends.png new file mode 100644 index 0000000000000000000000000000000000000000..5024275cf3c891027ea9b714f350cc71e52f1dfc GIT binary patch literal 453 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 Y0Q@vmxS9<$k^lez07*qoM6N<$f-q&tssI20 literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/portal_members.png b/root/images/portal/icons/portal_members.png new file mode 100644 index 0000000000000000000000000000000000000000..8e649a80b13687b9bef567e7bc9cc45a78d78591 GIT binary patch literal 1173 zcmV;G1Zw+RCwBA zoaw{N!0`Vc!}ot&f&!Wj<=XaM{!ENtIF9bzzHjA@6WuQ#{o_i10{Q3X?63hUA0AjY|`^q3LDdeT;;Nr{p=PS^5pynTM zfVO>Pcz@>sgN3A-sb1$)KY^%F6LBv`dp$`Jzw@Wh-MIVX=WU>M3;+QDK>)u015O|R z0QLC&7$q?)PzDME1^@Q!0RR2>0QB_i0QTAS03BF&00bKs0RQy#00I2>01`Ga4j}mS zGOfhSvH1W1@&W)s0KWeN<0}FHxBL0y6bScAFBcXX_yGC<^!o4s>Cnpn3=1a!3@0)G z|Mc+y0QmL*|Mv3$0sZ~}4+;bmwz<2@<@Wm30*K|JG9#0=fkpB&d26Mk&z>@{-M+%` z`|D?hn?KSY#6G?UyNKc6KZd{m{xUHB{?G8|`xl0v42&G0FaQW37BL<%r$+Pq zZU=QY_B+4cF|cp1W#D|y!633Ahk@nRH-^72A2a+H0>;dLMuvZXe=#tAddIMR%br_T z-+Vp^ib#L}Vlh=RNm7&+V*l~`4TA<3(68lf3=F@1F(`0IGHieMp5fK=D-3!v4}h-t z2lUE&hDRT`8FsRI|7792{^!@Hn+yN}06_r0{{uWHzl-`~dR~ z^#H-j?*I)49{?38BLL&@1pvR@`vBqs9sunnI{-sSIv4>57$(fcwYLI@<@4|NT+jd9 zW?=gMnt_v*n}O>O3&Zm#jKHMe!(d{@%^)Gn$nZ-_n?b->n}G|M?08s#z5%8tuRwo~ zt?OLk00M~lmoTe?l*K>wKP(>^zWn*X@RjKq!;Q;8gIL`e_(fS5zW)Y?9|I>)GcXJp z-UGw)`PcsppBR`Ku3UKd4CtIV-ks%uJ9Z{QD0B!}q^H7XmZFe^xF&fB<3vI_KP-MNfS1u6*juD#WhH$o8F; zm6=yXu=+L?)F)%#7`QSG|05LQ0axpOc{Pl(5*WXKj ze=;BX`}^PiUoW2Tc=L=`he1?b{TDkY!)KtTPe7aB1C!nxpn;Db|6(|@aKn%Lhk9lL z1P~*GxDZh08!+mC9_8j>VC4ME@c$jqt^b6@*aZ~R_~rG@IR%8dnOIm@K!Ne|^XK0m npWJ-?^~HhR3=AJv00bBSe}JO598q-#00000NkvXXu0mjfh~O-F literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/portal_menu.png b/root/images/portal/icons/portal_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..a4da1c1561f03d65ef948a4c28b9fd1bfa8cc016 GIT binary patch literal 855 zcmV-d1E~CoP)Qe@#_!*M{%>iin+*^^EGjDUXQZSgg#P~h`wya#5oj(G10y37*nofk{{DUb{0+B` zp)QNKgeb$$pFbJc**O^Azx&9*!op$>5I`&zmPT^+cIJ#5u@nn{X*gPDy1Ab?mDSdTF} z{Xfp|^DjsrP&-H`$bO(RSpG9I{0HLC|D71#a>_9X^8I1>^P7QzjSVQqEXeSW;Ufb; z0I~dF{Qmy~+ZzU;{XlI%1DK$}3uLe`{s$WLkKr%NPlg|26Byo$voZYq^@o9zlbzwq zhp!C(m=YKO0*K`|UkJlz)mnxhKYl@+&j{5IbO{qP&@`Y+{=U7#!0_iY!;hbQ48MQ> z0ekh&?|;BRW?=&eAQl!@R>q${{xkge{tx1Os24zi$i(!Yft7`g;l+!m|2J)1|BaKA z6BN9RKuy2^{KNG4@%@_s0mSm<%a8wGzy1Q6{2S~ACMLKaz){M|!p!jc)yv;ox2}i; z3SI(YPNa173Lt=3L_~xbrKN=#zJLD#b^$D5LL9@$z{SPQz{A4@5_$o|4;i3g1#%(K ze+&Qt#Pa&}yZ?9ZK8Cu03F-rgH$bl8;^JZW`t>J>#|hE^(Z~pQ0zd$<$jM1F85!v^ zeEaqT;e8}8aC7r8?AcokqMFU{xLwj!oUC!K#Y=-@@+uc0*HS@5)r}x5Sy8qiS^5uPfy>ydszV#c#57I h0Ro7T((DWnU;v-V`~~Z;X`6pHRCwBA zEGaHx`1_S%Rx5)Ab?na*noqBy+Be%E=oaBnN?awfu;m_}13~~wz z4319D+855BHwOxygc$%3Kn#5oCw;zn{pSC-pFaJ6_4fV$PhYr)yJ<49NgRtJV0l&{Q1kk za^WHa!;KpZ|6jdiU_O3~f$`F1hJQfCGU6f(){aintjtUiEX+&{Y^*E{00G1dWEiO% zTI(ywOE55l0`&K925`V?YB2nhl44-GbC-busPK=xJOe9G{5K0HYyXB{jAOHR88v_F)P{BVAPKG}U@<1CI8JG_rW?+2!l!4*pONRf?o`apN zsjb6cU}0klWa@zU00G1-Cc^g!82{n2`gS6U;@k|3K)3z_IRR+;f1u5Ol~ov+uU}_i z272SKrX~XyFBik}Pd`|X@7?kJ*RNl@00M~V)2FY$p4`5?;p~~q|6l!PU|<0{<3Gp{ zV1WKnRAl(0tOPWOm4Wf&M~2_P@L>a*ZDDQ2sHCYK1Z4671Q4@`ARoiGFCQK;un8r} z8alBl3oY96aWhW0005=^8f|^{Qvt<1$snxaeAB9U zwwj*47{k?j3=DUk{AYOg>?6a^XEz!CJv++q`}wIqU!I?R`TotLbDzKd+5rrzjQ|0} zs3ao-j-G#ie=%@y^41Et^f$c`aAaV5c$9(Z#i9Q{U!MN1cdvEP)HQ1V$OOc!41XCJnZ7YH%d(1#^hEcjS!&qrV)*qpg5m!^xE6o_ zVgZwk3=F@2|Keo)&lDoTFBKxpBPz|#z|I6z_wVmdhJQ-@$_hSKmJH^$3hIj&8ZDo( zWuDPL2IfizW|qGI0mR6V0W{zTgMq53+U#hD2ooiB35LJiUx1GJ4L14T|NlUzurqvQ zeai5T;{k&qiyOnm^&c2o=TGhX_4|7XKmf4-)v4%98EmYIE|$9@aFF5Dzw->@4AKm& z|Ji^B{0ExB$N+R1!^5}t8SekO#ULo7!XPJV$iT+HF7xa67j}RE06_r0{{#^Q5`|$z zUmm6SnE(ak0{}$&RshP*(DL*1>h1#q1_Ju}`~M^kBN{nMP6Z$b-vINp5CDLsezo-X z@o)eK4fp~8K>)u01S}UTOb!(d0RHa^080W_0D+r@*5T^jU;qaJ-~jRe2>|v03?dyT zuPG{jCeFj@^r^v_hX4QjkpTY&_5l3_00IC(0KWeL9dRJ-JR&>@2m%TJ+2h^<#@WGm z00;e&00#>f0Qmsw0P+kK2?h2qBr<(q`14PZONg)GKLd;E_pd*l7(Vm8V)*+{k>T^VM+_WH0S0O&^K7)tn125H z#jxkxxgP)l!~zVY#|&(csATy5FWJ}3zd6b!TC#O+>)k7NFY+?5eEkPZ6K@#4Gsp_F z$>+DE74!Z!zQUl%V8!q-o8v$Gq=L}GBvVgi1{pRH1|Qu3IXNMv z?HsIJOn-m<|I5R{!|UW=C4NzA3&Xol_ZfcNmSZ?|;o>oX0AgeaXJBS!=A7CV-I~s9 z@RniQ%e4%$Ov(&$+$z9i{TG_f7#aRB{bG3f?=Ay3D+hz~&sc^j&D-DZKX=dvAb@}_ zVE*^-FXQLWpFT6NefrDr^5aJaK9(O0-~aq!`1S86*ns~)$jrdPpz+6+;rBg0hL$zU z@1MVZKAnM!{RBV&06_r0{{aA73jhH8`~m{^1BqcfVRRxs7XTd#9RR(h%=*#e+1UsM z3IPHB0|Nd00RZXl^Xus3;kfzx_nZI+2kZa^0{{Yuks*o;oZuLK0wdzXk0=XehsGfL z0F_zm=ia+>`=TuaGw%n6f50gF$NHCnmHR8h_aDHt%?Z)N!o&a&KoA2!nd=Wb1H%_! z`v3A*k(FJnmVuE|`}d!pz6{^KyaE~kRKp6?0Cerw@4!H3gBt)4U;u+DZiDn0zODcO N002ovPDHLkV1lp~7i0hc literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/portal_search.png b/root/images/portal/icons/portal_search.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd1931589b453f6cc9772fd1851d8705d6b6631 GIT binary patch literal 813 zcmV+|1JeA7P)lXvaa)1B=8vtU6i;3jw7+Lm8D5$Z@i10EnF)=bcefw4K z$^E-CUfjQG`svfBbfD6|R#sLFj6lo3FG$G6@;ee>>~6i|H^5OY8c00W#fi<*1vzh{0&qu3dB`V0{{XDY`}(1n>S9M(9!zw#!&`A z#;*+0{6GVMSeWGp!`o{o8NPge#o%jgs54WT$qnQYpsyGNpauX05F;oJfZ`Pdw6!$j zynTH0RMa&!n3$Pa9zVGEY{&L(3qnPBl_DG6<9Xk0`Fl3`LiD4@pH{vDsxJWQ1qdJp zEJ>M}osCtQlY?CgW>F{;gVK#SmgoOZnEn5J%EtIXaWQXAO>Rdf)WFR;gt~f zXaA3z{{L{q=l48y!32@gb6YS2oH?OvlpIUtN!?YKll0L^S$qVKA&T` zYgh5&lHve>m%Tb`eFXXcP7EH|VjogQfUQyFC;)043pt;9BV43iu|>O~aHqCJxmOK} zf~NTy>1yklsw#uQEw{;WTylqO zY$B=PqR`D#H1iX7fi z;ThWS2p#szBvPs6&}g;WF=HBDOQtuivP>stAJ-S;S|k(tFRZC6`!6QeFRmNCKPBbx z79o@VW9+3-ZXCWJKJrF&Q5+RuGMn{?STrx&E74t&NEYAX3Z8g0TkMRZ zi)werb(C^m$b*VdZFO-kVIX*eI{rF0%w_ zlUv}~YDA`PS$MLLqfNbwGGDVE-z+`3y1IaW>T7kr&R?#mICk3o)a#rAQJ{c�Crx z4v)tpsv`sZgE$Nea9Dr^;qlM_JRGG!z()|mq9B z&z$p|Te1)k`KDJ3iP>Owb2K;~T#h2^%CbOX=8GQO^?a zmASjpCDJg8?OVQq8%bl=R*P#%0l$&zGbUi?d)~)8eet4KlZ?{J*k2`Kx`|97o1I0T zr}4%bxuF=>issA`o;|A&IQT0gWl}2p^S|8mM3djsuc6I9cTgOm>jJ4mxE&b+Zm}%k zNc*h~gvyjAJIJ)y$!2Ri%&&0I&5g|jY4wuuknOsQJR04eVId#%VM%Q)?YwCxoK_o2 zJ!{!!Ecz~o$gWBhJ@z6sP5Gu_z8XZVD?ck*TY3E|E9O7{Flu0afByh0CpuBUV#Qz( zW&i>RVC;n-I_~rU?~a*KO|3=#5JG-#82vHmMGu2P7+>%b)u00c#5Y0RH#@0RR2~00RgD0Q>m<0Qmm^ECvV!UlJS(Llz+i9uyM%3kd=80Oa8O z@wL+c#ozS+a^L^};r{>t00M}G0Sf*Dc|X7ZQ{)lkYPPgf@inxQ=2Oz)Vc-`2%kby- zUxw?ir5J=i@N$^kJr^{8;W5ic559T*Wnj1f5I|r9{{97UiiwFqUq+rmM))v; zK40NruoskO za92_S`t1);@oz8|Vt&iub#pNTr-~Q@gOUuxKOkgaV&DJ>AQlZf3o9`NNrvwacQO2X zC&KXMD;H3a00RR*&~M+r0Tr<@yt?&);cn@12DOJD8D0oJV&Ls#VR-iDJHyxC4DSE} zh(%0Il8awflHu)91qLP_aRxDaEe1|@py^+MamxragoP0p3;!56KK@|%{_h{d-M8Nv zc#hv^ICk~(|IZ8z#{mL}>rC~5I9JbC|`Vdt3-Z-CY;1qdLfJC|<0XZX*}@cZXChQo8#Gb}8f z_W$)Wphj+>rvH%mW%~100a;N$N+I@o&=>G5awlIFjiz>*dWTl iupTHJ%76y|1Q-C424#L%0Fqk(0000qS!`tV<>vnQeC6Al+XuoJc=&HK z{Cdy8C}PO)|LsNwhMy0?1^@&QGXt|5#DIVQ8JJj@fSUg@uyC++ScDl&3o3CCmoYV$ zc>Csm{Ktnko-+LYc!`l$j)CF(4F-n4AHfCy1Q3b=|Ns2e5l|4>>6U97Vjif=^6K+n zhTlvK4D!ZC?0?uq{oX!#BMx z*Sk*)3>+K`%zRu7{2c!oUfg=daDD5>Ti>ou_GS3{>=wuXfB=FR@aLbEx}V-b)c}2# zH}8Ki$emlppwD%VK}YTm!{@J(3@_iwGi(=*V0bU7&G7rvKZaY&Iv@PF+OG-J{{tX^ zSb&-tIHdU7cnxG&?mhX;@aPp2Lx9jVhVrtt3=F(L_y51h@Mbe7!_vcn438MUGYD`o zFz^`rD*U*;GL7Navq=B}#KgeLWW}K_W%ca)KZb{|zA}9M{h#6d4<(@4{0s~?jTjg{ z3Nc)KugY-ey9mRF&tDmyz5K}VO;Cn`QPC{}=mIu?0AgVl73lmS#>@H%==6X8fPwLw zjp4_ip9~C4z(A6C%D}++iQ&&jCWb%Xe>41H|H<&@|1Y36pv%;})EFM_30*K}Ri-YGGJ}cNTumBDC&jyT+e+(!8Su>PR{>NY>@`T~THvxv@KXe(sf^7W_ zbm9NM5d8Yae}<2DZUF=kGs92Tmkb>05sXsGOyVNH7;N~iF_nFqH4VM{~uRs2o;py&a48J~900a;-1B)ck z-#0dVe|~5SLnhQmjW z{NBB5*Qp;req;glU4rFCfB=FU!1DhcC`~aiF);x%B%?DsJG(C{E2}IpYMFqVp8x*+ ldnZu+Rv`X^oSgvz3;>%0Rm29zIxYYJ002ovPDHLkV1gS7`m_K5 literal 0 HcmV?d00001 diff --git a/root/images/portal/icons/portal_top_poster.png b/root/images/portal/icons/portal_top_poster.png new file mode 100644 index 0000000000000000000000000000000000000000..4a52bb1c5acc7f375f92bfb9a36535c8a9d5c355 GIT binary patch literal 1097 zcmV-P1h)H$P)NdIU0|NB2H(|-n5#=rkrnHd=v|Nr~X$;!g`=Ec+R zOEygH`u&TqMU>+KgXfRy3@?D1F9I<@0I>**|CW`~<6^Y2QDjt*7H44RWME)pWnkdq z0%8sZ1`Z%!keh+mdA?RtZNnVnN6)W^vokPcaWgZ>|N6^N3=lvpKfe6@{F9kO;K}zV z49`!zVNjA)X5i%E0NT#Lz{vr@Lc$CTKFRuw{1R0G)3ZC&8=3;+QD zK>)u00|NjVQx_vZ8#6r>00{0Q~v@0Q&p^0NmL60R7CA z0AFDC4I*7w0S*Na0OH8WCISFK0KWeO`S|zG^6T(500Joh4Gs1H2O|0a=-t%-=;Z|f z0Q~#_2MrDY|MLF;2-%VVLs;?v8bb~M0O@N0w8JX^zUc|?0*K}Jzpp31y?&U=$mqhz z#m2$#?ag}zX)SIBR-oJ1xOo^}T)xS`aHE?cpjeSXL?0Mx50)^j?fc76HS@*o`+pc> z0RjjZ=D$yUeD&)4r#D|2#ARg}xPY2|eE!BDA|}Pa_VF!)#Orws5v7_8B1(@K{+w9J zFtLR3f67$G<3P>MK;upV1P}`Y1JkuHA0Iw{_2h#xD~Ak&keC<)3*$eAuW#NmeB9r` z5D+85!0~ZE!`r=A8Jec^{+oLK%c{Q&{}X|le}K{fKmY*^xc2Y+SI%qip1oK8`9p?* zhZ`7g|9>((y?%|s(aC~=<61Yvw;8^D{m*dbAuj_<>C{Ur*0!A4ne~BMTS<1Q0L`J_EVG|2=U*BN& zSzDOF4Wy3=iU9%$gc+Fmg&3H4`5CyxWgC@(>a4hAbQlBm>)@55SoH!SL$!7lsc4 z`V8m3$1yy8^W($TRkIV{J-WDo;rm?%fB*tVqj2O`uGAU7u3WnP>Hn2Gzy4o(^Z);< z{dfN#a5VgXT#ohs{F&?j&$#;k|AA}&|KE7@|9|hwTfdkEZ9+k=2M8dr0s490J2qYT z`TyL#&;LLE{P+L;kN^MQdM>c@ZWv-0FG>VNg;+WFJ3Xc2gdo4=dT&= zd}3sH{f&Xa)Y)5)qQ7AFf?z`0*ZS(LYs&@4tYq14j9aFO0w#`p*UsKwtx|96fSR(b!&1 zkPDbRfzD(44@`)x(hSdqR2ZIrVPd!~qtEdFEd#@UpamTKK+QlGo;iA(;pd0@_W%M2 z9F2^;?ryTqC2MrNoOp#LnHjh^fCg~`4FaaFKfnGmu<&y*{QC+_**}2c1k4_{j$CB8 zzM}Nj-w(Te0RjkO0FONb!`H_etil@gJaQHmT%y9fY+M}7jO;8-Ow3FS|9|{u_zjGe wZ|^?*`ttP3`ybEt?Pd7)ydCKH#{dBa05@2_T&bJ#J^%m!07*qoM6N<$f-%W4!vFvP literal 0 HcmV?d00001 diff --git a/root/images/portal/index.html b/root/images/portal/index.html new file mode 100644 index 00000000..5832e4a2 --- /dev/null +++ b/root/images/portal/index.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/root/images/portal/mini_cal_icon_left_arrow.png b/root/images/portal/mini_cal_icon_left_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..33b7979b535c72f5ca7831597cd3bb5b8b4a0b0f GIT binary patch literal 744 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 literal 0 HcmV?d00001 diff --git a/root/includes/acp/acp_portal_blocks.php b/root/includes/acp/acp_portal_blocks.php new file mode 100644 index 00000000..9fb8f069 --- /dev/null +++ b/root/includes/acp/acp_portal_blocks.php @@ -0,0 +1,497 @@ +tpl_name = 'acp_portal_blocks'; + $this->page_title = 'ACP_PORTAL_BLOCKS'; + + $form_name = 'acp_portal_blocks'; + add_form_key($form_name); + + switch ($action) + { + case 'save': + + if (!check_form_key($form_name)) + { + trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING); + } + + $block_title = utf8_normalize_nfc(request_var('block_title', '', true)); + $block_birthday = request_var('block_birthday', ''); + $block_online_friends = request_var('block_online_friends', ''); + $block_donation = request_var('block_donation', ''); + $block_latest_members = request_var('block_latest_members', ''); + $block_latest_bots = request_var('block_latest_bots', ''); + $block_type = request_var('block_type', ''); + $block_position = request_var('block_position', 0); + $block_groups = request_var('block_groups', 0); + $block_icon = request_var('block_icon', ''); + $block_text = ($block_type == 'custom') ? utf8_normalize_nfc(request_var('block_text', '', true)) : ''; + + if ($block_icon != '' && !preg_match('#(\.gif|\.png|\.jpg|\.jpeg)$#i', $block_icon)) + { + $block_icon = ''; + } + if (!$block_title) + { + trigger_error($user->lang['NO_BLOCK_TITLE'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + if ($block_type == 'custom' && $block_text == '') + { + trigger_error($user->lang['NO_BLOCK_TEXT'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + set_portal_config('portal_birthdays_ahead', $block_birthday); + set_portal_config('portal_max_online_friends', $block_online_friends); + set_portal_config('portal_pay_acc', $block_donation); + set_portal_config('portal_max_last_member', $block_latest_members); + set_portal_config('portal_last_visited_bots_number', $block_latest_bots); + + $sql_ary = array( + 'block_title' => $block_title, + 'block_type' => $block_type, + 'block_position' => $block_position, + 'block_groups' => $block_groups, + 'block_icon' => htmlspecialchars_decode($block_icon), + 'block_text' => ($block_type == 'custom') ? $block_text : '', + 'block_text_uid' => '', + 'block_text_options' => 7, + 'block_text_bitfield' => '', + ); + + $order_ary = array( + 'block_order' => $portal_config['num_blocks'] + 1, + ); + + // Get data for block text if specified + if ($sql_ary['block_text']) + { + generate_text_for_storage($sql_ary['block_text'], $sql_ary['block_text_uid'], $sql_ary['block_text_bitfield'], $sql_ary['block_text_options'], request_var('text_parse_bbcode', false), request_var('text_parse_urls', false), request_var('text_parse_smilies', false)); + } + + if ($block_id) + { + $sql = 'UPDATE ' . PORTAL_BLOCKS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE block_id = $block_id"; + $message = $user->lang['BLOCK_UPDATED']; + + add_log('admin', 'LOG_BLOCK_UPDATED', (!empty($user->lang[strtoupper($block_title)])) ? $user->lang[strtoupper($block_title)] : $block_title); + } + else + { + $sql = 'INSERT INTO ' . PORTAL_BLOCKS_TABLE . ' ' . $db->sql_build_array('INSERT', array_merge($sql_ary, $order_ary)); + $message = $user->lang['BLOCK_ADDED']; + + set_portal_config('num_blocks', $portal_config['num_blocks'] + 1, true); + add_log('admin', 'LOG_BLOCK_ADDED', (!empty($user->lang[strtoupper($block_title)])) ? $user->lang[strtoupper($block_title)] : $block_title); + } + $db->sql_query($sql); + + $cache->destroy('_blocks'); + + trigger_error($message . adm_back_link($this->u_action)); + + break; + + case 'delete': + + if (!$block_id) + { + trigger_error($user->lang['MUST_SELECT_BLOCK'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + if (confirm_box(true)) + { + $sql = 'SELECT block_title, block_order + FROM ' . PORTAL_BLOCKS_TABLE . " + WHERE block_id = $block_id"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + if ($row) + { + $row['block_title'] = (string) $row['block_title']; + $row['block_order'] = (int) $row['block_order']; + } + + $sql = 'DELETE FROM ' . PORTAL_BLOCKS_TABLE . " WHERE block_id = $block_id"; + $db->sql_query($sql); + + $sql = 'UPDATE ' . PORTAL_BLOCKS_TABLE . ' SET block_order = block_order - 1 WHERE block_order > ' . $row['block_order']; + $db->sql_query($sql); + + $cache->destroy('_blocks'); + + set_portal_config('num_blocks', $portal_config['num_blocks'] - 1, true); + add_log('admin', 'LOG_BLOCK_REMOVED', (!empty($user->lang[strtoupper($row['block_title'])])) ? $user->lang[strtoupper($row['block_title'])] : $row['block_title']); + } + else + { + confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( + 'i' => $id, + 'mode' => $mode, + 'block_id' => $block_id, + 'action' => 'delete', + ))); + } + + break; + + case 'disable': + + if (!$block_id) + { + trigger_error($user->lang['MUST_SELECT_BLOCK'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + $sql = 'SELECT block_title + FROM ' . PORTAL_BLOCKS_TABLE . " + WHERE block_id = $block_id"; + $result = $db->sql_query($sql); + $disabled_block = $db->sql_fetchfield('block_title'); + $db->sql_freeresult($result); + + $sql = 'UPDATE ' . PORTAL_BLOCKS_TABLE . " SET block_position = 0 WHERE block_id = $block_id"; + $db->sql_query($sql); + + $cache->destroy('_blocks'); + + add_log('admin', 'LOG_BLOCK_DISABLED', (!empty($user->lang[strtoupper($disabled_block)])) ? $user->lang[strtoupper($disabled_block)] : $disabled_block); + + break; + + case 'move_up': + case 'move_down': + + if (!$block_id) + { + trigger_error($user->lang['MUST_SELECT_BLOCK'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + // Get current order id... + $sql = 'SELECT block_order AS current_order + FROM ' . PORTAL_BLOCKS_TABLE . " + WHERE block_id = $block_id"; + $result = $db->sql_query($sql); + $current_order = (int) $db->sql_fetchfield('current_order'); + $db->sql_freeresult($result); + + if ($current_order == 0 && $action == 'move_up') + { + break; + } + $switch_order_id = ($action == 'move_down') ? $current_order + 1 : $current_order - 1; + + $sql = 'UPDATE ' . PORTAL_BLOCKS_TABLE . " + SET block_order = $current_order + WHERE block_order = $switch_order_id + AND block_id <> $block_id"; + $db->sql_query($sql); + + if ($db->sql_affectedrows()) + { + $sql = 'UPDATE ' . PORTAL_BLOCKS_TABLE . " + SET block_order = $switch_order_id + WHERE block_order = $current_order + AND block_id = $block_id"; + $db->sql_query($sql); + } + + $cache->destroy('_blocks'); + + break; + + case 'edit': + case 'add': + + include($phpbb_root_path . 'includes/functions_display.' . $phpEx); + + $user->add_lang('posting'); + + // Assigning custom bbcodes + display_custom_bbcodes(); + + $blocks = $existing_icons = array(); + + $sql = 'SELECT * + FROM ' . PORTAL_BLOCKS_TABLE . ' + ORDER BY block_order'; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $existing_icons[] = $row['block_icon']; + + if ($action == 'edit' && $block_id == $row['block_id']) + { + $blocks = $row; + } + } + $db->sql_freeresult($result); + + // Select the block icon + $icon_list = filelist($phpbb_root_path . $portal_icons_path); + $edit_icon = $icon_filename_list = ''; + + foreach ($icon_list as $path => $icon_ary) + { + sort($icon_ary); + + foreach ($icon_ary as $icon) + { + $icon = $path . $icon; + + if (!in_array($icon, $existing_icons) || $action == 'edit') + { + if ($blocks && $icon == $blocks['block_icon']) + { + $selected = ' selected="selected"'; + $edit_icon = $icon; + } + else + { + $selected = ''; + } + + if (strlen($icon) > 255) + { + continue; + } + + $icon_filename_list .= ''; + } + } + } + + $icon_filename_list = '' . $icon_filename_list; + unset($existing_icons, $icon_list); + + $block_groups = ''; + $sql = 'SELECT g.* + FROM ' . GROUPS_TABLE . ' g + ORDER BY g.group_id'; + $result = $db->sql_query($sql); + + $block_groups = ''; + while ($row = $db->sql_fetchrow($result)) + { + $block_groups .= ''; + } + $db->sql_freeresult($result); + + // Select the display position for block + $position_list = array( + 'none' => array($user->lang['BLOCK_POSITION_NONE'], BLOCK_NONE), + 'left' => array($user->lang['BLOCK_POSITION_LEFT'], BLOCK_LEFT), + 'right' => array($user->lang['BLOCK_POSITION_RIGHT'], BLOCK_RIGHT), + 'top' => array($user->lang['BLOCK_POSITION_TOP'], BLOCK_TOP), + 'bottom' => array($user->lang['BLOCK_POSITION_BOTTOM'], BLOCK_BOTTOM), + 'middle_top' => array($user->lang['BLOCK_POSITION_MIDDLE_TOP'], BLOCK_MIDDLE_TOP), + 'middle_bottom' => array($user->lang['BLOCK_POSITION_MIDDLE_BOTTOM'], BLOCK_MIDDLE_BOTTOM), + ); + + $s_position_options = ''; + + foreach ($position_list as $position_var => $position_ary) + { + $selected = (isset($blocks['block_position']) && $position_ary[1] == $blocks['block_position']) ? ' selected="selected"' : ''; + $s_position_options .= ''; + } + + // Select the block type + $type_list = array( + 0 => array($user->lang['BLOCK_CUSTOM'], 'custom'), + 1 => array($user->lang['BLOCK_BIRTHDAY'], 'birthday'), + 2 => array($user->lang['BLOCK_ONLINE'], 'online'), + 3 => array($user->lang['BLOCK_SEARCH'], 'search'), + 4 => array($user->lang['BLOCK_CLOCK'], 'clock'), + 5 => array($user->lang['BLOCK_USER_MENU'], 'user_menu'), + 6 => array($user->lang['BLOCK_CHANGE_STYLE'], 'change_style'), + 7 => array($user->lang['BLOCK_DONATION'], 'donation'), + 8 => array($user->lang['BLOCK_LINKS'], 'links'), + 9 => array($user->lang['BLOCK_LATEST_BOTS'], 'latest_bots'), + 10 => array($user->lang['BLOCK_LATEST_MEMBERS'], 'latest_members'), + 11 => array($user->lang['BLOCK_MINI_CALENDAR'], 'mini_calendar'), + 12 => array($user->lang['BLOCK_ONLINE_FRIENDS'], 'online_friends'), + 13 => array($user->lang['BLOCK_STATISTICS'], 'statistics'), + 14 => array($user->lang['BLOCK_TOP_POSTER'], 'top_poster'), + //15 => array($user->lang['BLOCK_'], ''),// Add your blocks here... + ); + + + + $s_type_options = ''; + + foreach ($type_list as $type_var => $type_ary) + { + $selected = (isset($blocks['block_type']) && $type_ary[1] == $blocks['block_type']) ? ' selected="selected"' : ''; + $s_type_options .= ''; + } + + $block_text_data = array( + 'text' => (isset($blocks['block_text'])) ? $blocks['block_text'] : '', + 'allow_bbcode' => true, + 'allow_smilies' => true, + 'allow_urls' => true + ); + + $block_text_preview = ''; + + if (isset($blocks['block_text'])) + { + if (!isset($blocks['block_text_uid'])) + { + $blocks['block_text_uid'] = ''; + $blocks['block_text_bitfield'] = ''; + $blocks['block_text_options'] = 0; + + generate_text_for_storage($blocks['block_text'], $blocks['block_text_uid'], $blocks['block_text_bitfield'], $blocks['block_text_options'], request_var('text_allow_bbcode', false), request_var('text_allow_urls', false), request_var('text_allow_smilies', false)); + } + $block_text_preview = generate_text_for_display($blocks['block_text'], $blocks['block_text_uid'], $blocks['block_text_bitfield'], $blocks['block_text_options']); + $block_text_data = generate_text_for_edit($blocks['block_text'], $blocks['block_text_uid'], $blocks['block_text_options']); + } + + $template->assign_vars(array( + 'TYPE' => (isset($blocks['block_type'])) ? $blocks['block_type'] : '', + 'ICONS_PATH' => $phpbb_root_path . $portal_icons_path, + + 'BLOCK_TITLE' => (isset($blocks['block_title'])) ? $blocks['block_title'] : '', + 'BLOCK_PAYPAL' => (isset($portal_config['portal_pay_acc'])) ? $portal_config['portal_pay_acc'] : '', + 'BLOCK_BIRTHDAY' => (isset($portal_config['portal_birthdays_ahead'])) ? $portal_config['portal_birthdays_ahead'] : '', + 'BLOCK_LATEST_MEMBERS' => (isset($portal_config['portal_max_last_member'])) ? $portal_config['portal_max_last_member'] : '', + 'BLOCK_ONLINE_FRIENDS' => (isset($portal_config['portal_max_online_friends'])) ? $portal_config['portal_max_online_friends'] : '', + 'BLOCK_LATEST_BOTS' => (isset($portal_config['portal_last_visited_bots_number'])) ? $portal_config['portal_last_visited_bots_number'] : '', + 'BLOCK_GROUPS' => (isset($blocks['block_groups'])) ? $blocks['block_groups'] : 0, + 'BLOCK_POSITION' => (isset($blocks['block_position'])) ? $blocks['block_position'] : 0, + 'BLOCK_ICON' => ($edit_icon) ? $phpbb_root_path . $portal_icons_path . '/' . $edit_icon : $phpbb_admin_path . 'images/spacer.gif', + 'BLOCK_TEXT' => $block_text_data['text'], + 'BLOCK_TEXT_PREVIEW' => $block_text_preview, + + 'U_BACK' => $this->u_action, + 'U_ACTION' => $this->u_action . '&id=' . $block_id, + + 'S_EDIT' => true, + 'S_ICON_FILENAME_LIST' => $icon_filename_list, + 'S_POSITION_OPTIONS' => $s_position_options, + 'S_BLOCK_GROUPS' => $block_groups, + 'S_TYPE_OPTIONS' => $s_type_options, + 'S_SELECT_BLOCK' => (!isset($blocks['block_type']) || $blocks['block_type'] != 'custom') ? true : false, + 'S_SELECT_BIRTHDAY' => (!isset($blocks['block_type']) || $blocks['block_type'] != 'birthday') ? true : false, + 'S_SELECT_ONLINE_FRIENDS' => (!isset($blocks['block_type']) || $blocks['block_type'] != 'online_friends') ? true : false, + 'S_SELECT_PAYPAL' => (!isset($blocks['block_type']) || $blocks['block_type'] != 'donation') ? true : false, + 'S_SELECT_LATEST_MEMBERS' => (!isset($blocks['block_type']) || $blocks['block_type'] != 'latest_members') ? true : false, + 'S_SELECT_LATEST_BOTS' => (!isset($blocks['block_type']) || $blocks['block_type'] != 'latest_bots') ? true : false, + 'S_TEXT_BBCODE_CHECKED' => ($block_text_data['allow_bbcode']) ? true : false, + 'S_TEXT_SMILIES_CHECKED' => ($block_text_data['allow_smilies']) ? true : false, + 'S_TEXT_URLS_CHECKED' => ($block_text_data['allow_urls']) ? true : false, + )); + + return; + + break; + } + + $template->assign_vars(array( + 'U_ACTION' => $this->u_action, + )); + + $sql = 'SELECT * + FROM ' . PORTAL_BLOCKS_TABLE . ' + ORDER BY block_order'; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + switch ($row['block_position']) + { + case BLOCK_LEFT: + $position = $user->lang['BLOCK_POSITION_LEFT']; + break; + + case BLOCK_RIGHT: + $position = $user->lang['BLOCK_POSITION_RIGHT']; + break; + + case BLOCK_TOP: + $position = $user->lang['BLOCK_POSITION_TOP']; + break; + + case BLOCK_BOTTOM: + $position = $user->lang['BLOCK_POSITION_BOTTOM']; + break; + + case BLOCK_MIDDLE_TOP: + $position = $user->lang['BLOCK_POSITION_MIDDLE_TOP']; + break; + + case BLOCK_MIDDLE_BOTTOM: + $position = $user->lang['BLOCK_POSITION_MIDDLE_BOTTOM']; + break; + + case BLOCK_NONE: + default: + $position = $user->lang['BLOCK_POSITION_NONE']; + break; + } + + $template->assign_block_vars('blocks', array( + 'BLOCK_TITLE' => (!empty($user->lang[strtoupper($row['block_title'])])) ? $user->lang[strtoupper($row['block_title'])] : $row['block_title'], + 'BLOCK_POSITION' => $position, + //'BLOCK_GROUP' => $groups, + 'BLOCK_TYPE' => $user->lang['BLOCK_' . strtoupper($row['block_type'])], + 'BLOCK_ICON' => $phpbb_root_path . $portal_icons_path . '/' . $row['block_icon'], + + 'U_DISABLE' => $this->u_action . '&action=disable&id=' . $row['block_id'], + 'U_EDIT' => $this->u_action . '&action=edit&id=' . $row['block_id'], + 'U_DELETE' => $this->u_action . '&action=delete&id=' . $row['block_id'], + 'U_MOVE_UP' => $this->u_action . '&action=move_up&id=' . $row['block_id'], + 'U_MOVE_DOWN' => $this->u_action . '&action=move_down&id=' . $row['block_id'], + + 'S_BLOCK_ICON' => ($row['block_icon']) ? true : false, + 'S_BLOCK_DISABLED' => ($row['block_position'] == BLOCK_NONE) ? true : false, + )); + } + $db->sql_freeresult($result); + } +} + +?> \ No newline at end of file diff --git a/root/includes/acp/acp_portal_config.php b/root/includes/acp/acp_portal_config.php new file mode 100644 index 00000000..f10dcd52 --- /dev/null +++ b/root/includes/acp/acp_portal_config.php @@ -0,0 +1,170 @@ +add_lang('mods/portal'); + $submit = (isset($_POST['submit'])) ? true : false; + + $form_key = 'acp_time'; + add_form_key($form_key); + + /** + * Validation types are: + * string, int, bool, + * script_path (absolute path in url - beginning with / and no trailing slash), + * rpath (relative), rwpath (realtive, writeable), path (relative path, but able to escape the root), wpath (writeable) + */ + switch ($mode) + { + case 'config': + $display_vars = array( + 'title' => 'ACP_PORTAL_GENERAL_TITLE', + 'vars' => array( + 'legend1' => 'ACP_PORTAL_GENERAL_INFO', + 'portal_enable' => array('lang' => 'PORTAL_ENABLE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), + 'portal_left_column_width' => array('lang' => 'PORTAL_LEFT_COLUMN_WIDTH', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true), + 'portal_right_column_width' => array('lang' => 'PORTAL_RIGHT_COLUMN_WIDTH', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true), + ) + ); + break; + default: + trigger_error('NO_MODE', E_USER_ERROR); + break; + } + + $this->new_config = $config; + $cfg_array = (isset($_REQUEST['config'])) ? utf8_normalize_nfc(request_var('config', array('' => ''), true)) : $this->new_config; + $error = array(); + + // We validate the complete config if whished + validate_config_vars($display_vars['vars'], $cfg_array, $error); + if ($submit && !check_form_key($form_key)) + { + $error[] = $user->lang['FORM_INVALID']; + } + + // Do not write values if there is an error + if (sizeof($error)) + { + $submit = false; + } + + // We go through the display_vars to make sure no one is trying to set variables he/she is not allowed to... + foreach ($display_vars['vars'] as $config_name => $null) + { + if (!isset($cfg_array[$config_name]) || strpos($config_name, 'legend') !== false) + { + continue; + } + + $this->new_config[$config_name] = $config_value = $cfg_array[$config_name]; + + if ($submit) + { + set_portal_config($config_name, $config_value); + } + } + + if ($submit) + { + $cache->destroy('sql', PORTAL_CONFIG_TABLE); + add_log('admin', 'LOG_PORTAL_CONFIG', $user->lang['ACP_PORTAL_' . strtoupper($mode) . '_INFO']); + trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action)); + } + + $this->tpl_name = 'acp_portal_config'; + $this->page_title = $display_vars['title']; + + $template->assign_vars(array( + 'L_TITLE' => $user->lang[$display_vars['title']], + 'L_TITLE_EXPLAIN' => $user->lang[$display_vars['title'] . '_EXPLAIN'], + + 'S_ERROR' => (sizeof($error)) ? true : false, + 'ERROR_MSG' => implode('
', $error), + + 'U_ACTION' => $this->u_action) + ); + + // Output relevant page + foreach ($display_vars['vars'] as $config_key => $vars) + { + if (!is_array($vars) && strpos($config_key, 'legend') === false) + { + continue; + } + + if (strpos($config_key, 'legend') !== false) + { + $template->assign_block_vars('options', array( + 'S_LEGEND' => true, + 'LEGEND' => (isset($user->lang[$vars])) ? $user->lang[$vars] : $vars) + ); + + continue; + } + $this->new_config[$config_key] = $portal_config[$config_key]; + $type = explode(':', $vars['type']); + + $l_explain = ''; + if ($vars['explain']) + { + $l_explain = (isset($user->lang[$vars['lang'] . '_EXP'])) ? $user->lang[$vars['lang'] . '_EXP'] : ''; + } + + $content = build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars); + + if (empty($content)) + { + continue; + } + + $template->assign_block_vars('options', array( + 'KEY' => $config_key, + 'TITLE' => (isset($user->lang[$vars['lang']])) ? $user->lang[$vars['lang']] : $vars['lang'], + 'S_EXPLAIN' => $vars['explain'], + 'TITLE_EXPLAIN' => $l_explain, + 'CONTENT' => $content, + )); + + unset($display_vars['vars'][$config_key]); + } + } +} +?> \ No newline at end of file diff --git a/root/includes/acp/acp_portal_links.php b/root/includes/acp/acp_portal_links.php new file mode 100644 index 00000000..219c9a43 --- /dev/null +++ b/root/includes/acp/acp_portal_links.php @@ -0,0 +1,257 @@ +add_lang('mods/portal'); + $portal_root_path = PORTAL_ROOT_PATH; + $portal_icons_path = PORTAL_ICONS_PATH; + include($phpbb_root_path . $portal_root_path . 'includes/functions.' . $phpEx); + $portal_config = obtain_portal_config(); + + // Set up general vars + $action = request_var('action', ''); + $action = (isset($_POST['add'])) ? 'add' : $action; + $action = (isset($_POST['save'])) ? 'save' : $action; + $link_id = request_var('id', 0); + + $this->tpl_name = 'acp_portal_links'; + $this->page_title = 'ACP_PORTAL_LINKS'; + + $form_name = 'acp_portal_links'; + add_form_key($form_name); + + switch ($action) + { + case 'save': + + if (!check_form_key($form_name)) + { + trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING); + } + + $link_title = utf8_normalize_nfc(request_var('link_title', '', true)); + $link_is_cat = request_var('link_is_cat', 0); + $link_url = ($link_is_cat) ? '' : request_var('link_url', ''); + + if (!$link_title) + { + trigger_error($user->lang['NO_LINK_TITLE'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + if (!$link_is_cat && !$link_url) + { + trigger_error($user->lang['NO_LINK_URL'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + $sql_ary = array( + 'link_title' => $link_title, + 'link_is_cat' => $link_is_cat, + 'link_url' => htmlspecialchars_decode($link_url), + ); + + $order_ary = array( + 'link_order' => $portal_config['num_links'] + 1, + ); + + if ($link_id) + { + $sql = 'UPDATE ' . PORTAL_LINKS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE link_id = $link_id"; + $message = $user->lang['LINK_UPDATED']; + + add_log('admin', 'LOG_PORTAL_LINK_UPDATED', $link_title); + } + else + { + $sql = 'INSERT INTO ' . PORTAL_LINKS_TABLE . ' ' . $db->sql_build_array('INSERT', array_merge($sql_ary, $order_ary)); + $message = $user->lang['LINK_ADDED']; + + set_portal_config('num_links', $portal_config['num_links'] + 1, true); + add_log('admin', 'LOG_PORTAL_LINK_ADDED', $link_title); + } + $db->sql_query($sql); + + $cache->destroy('_links'); + + trigger_error($message . adm_back_link($this->u_action)); + + break; + + case 'delete': + + if (!$link_id) + { + trigger_error($user->lang['MUST_SELECT_LINK'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + if (confirm_box(true)) + { + $sql = 'SELECT link_title, link_order + FROM ' . PORTAL_LINKS_TABLE . " + WHERE link_id = $link_id"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + if ($row) + { + $row['link_title'] = (string) $row['link_title']; + $row['link_order'] = (int) $row['link_order']; + } + + $sql = 'DELETE FROM ' . PORTAL_LINKS_TABLE . " WHERE link_id = $link_id"; + $db->sql_query($sql); + + // Reset link order... + $sql = 'UPDATE ' . PORTAL_LINKS_TABLE . ' SET link_order = link_order - 1 WHERE link_order > ' . $row['link_order']; + $db->sql_query($sql); + + $cache->destroy('_links'); + + set_portal_config('num_links', $portal_config['num_links'] - 1, true); + add_log('admin', 'LOG_PORTAL_LINK_REMOVED', $row['link_title']); + } + else + { + confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( + 'i' => $id, + 'mode' => $mode, + 'link_id' => $link_id, + 'action' => 'delete', + ))); + } + + break; + + case 'move_up': + case 'move_down': + + if (!$link_id) + { + trigger_error($user->lang['MUST_SELECT_LINK'] . adm_back_link($this->u_action), E_USER_WARNING); + } + + // Get current order id... + $sql = 'SELECT link_order AS current_order + FROM ' . PORTAL_LINKS_TABLE . " + WHERE link_id = $link_id"; + $result = $db->sql_query($sql); + $current_order = (int) $db->sql_fetchfield('current_order'); + $db->sql_freeresult($result); + + if ($current_order == 0 && $action == 'move_up') + { + break; + } + + // on move_down, switch position with next order_id... + // on move_up, switch position with previous order_id... + $switch_order_id = ($action == 'move_down') ? $current_order + 1 : $current_order - 1; + + // Update order values + $sql = 'UPDATE ' . PORTAL_LINKS_TABLE . " + SET link_order = $current_order + WHERE link_order = $switch_order_id + AND link_id <> $link_id"; + $db->sql_query($sql); + + // Only update the other entry too if the previous entry got updated + if ($db->sql_affectedrows()) + { + $sql = 'UPDATE ' . PORTAL_LINKS_TABLE . " + SET link_order = $switch_order_id + WHERE link_order = $current_order + AND link_id = $link_id"; + $db->sql_query($sql); + } + + break; + + case 'edit': + case 'add': + + $links = array(); + + $sql = 'SELECT * + FROM ' . PORTAL_LINKS_TABLE . ' + ORDER BY link_order'; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + if ($action == 'edit' && $link_id == $row['link_id']) + { + $links = $row; + } + } + $db->sql_freeresult($result); + + $template->assign_vars(array( + 'LINK_TITLE' => (isset($links['link_title'])) ? $links['link_title'] : '', + 'LINK_URL' => (isset($links['link_url']) && !$links['link_is_cat']) ? $links['link_url'] : '', + + 'U_BACK' => $this->u_action, + 'U_ACTION' => $this->u_action . '&id=' . $link_id, + + 'S_EDIT' => true, + 'S_LINK_IS_CAT' => (!isset($links['link_is_cat']) || $links['link_is_cat']) ? true : false, + )); + + return; + + break; + } + + $template->assign_vars(array( + 'U_ACTION' => $this->u_action, + )); + + $sql = 'SELECT * + FROM ' . PORTAL_LINKS_TABLE . ' + ORDER BY link_order'; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $template->assign_block_vars('links', array( + 'LINK_TITLE' => $row['link_title'], + 'LINK_URL' => $row['link_url'], + + 'U_EDIT' => $this->u_action . '&action=edit&id=' . $row['link_id'], + 'U_DELETE' => $this->u_action . '&action=delete&id=' . $row['link_id'], + 'U_MOVE_UP' => $this->u_action . '&action=move_up&id=' . $row['link_id'], + 'U_MOVE_DOWN' => $this->u_action . '&action=move_down&id=' . $row['link_id'], + + 'S_LINK_IS_CAT' => ($row['link_is_cat']) ? true : false, + )); + } + $db->sql_freeresult($result); + } +} + +?> \ No newline at end of file diff --git a/root/includes/acp/info/acp_portal_blocks.php b/root/includes/acp/info/acp_portal_blocks.php new file mode 100644 index 00000000..f10d3d07 --- /dev/null +++ b/root/includes/acp/info/acp_portal_blocks.php @@ -0,0 +1,42 @@ + 'acp_portal_blocks', + 'title' => 'ACP_PORTAL_BLOCKS', + 'version' => '2.0.0', + 'modes' => array( + 'blocks' => array('title' => 'ACP_PORTAL_MANAGE_BLOCKS', 'auth' => 'acl_a_portal', 'cat' => array('ACP_PORTAL')), + ), + ); + } + + function install() + { + } + + function uninstall() + { + } +} + +?> \ No newline at end of file diff --git a/root/includes/acp/info/acp_portal_config.php b/root/includes/acp/info/acp_portal_config.php new file mode 100644 index 00000000..a7c7c7b0 --- /dev/null +++ b/root/includes/acp/info/acp_portal_config.php @@ -0,0 +1,42 @@ + 'acp_portal_config', + 'title' => 'ACP_PORTAL_INFO', + 'version' => '2.0.0', + 'modes' => array( + 'config' => array('title' => 'ACP_PORTAL_GENERAL_INFO', 'auth' => 'acl_a_portal', 'cat' => array('ACP_PORTAL')), + ), + ); + } + + function install() + { + } + + function uninstall() + { + } +} + +?> \ No newline at end of file diff --git a/root/includes/acp/info/acp_portal_links.php b/root/includes/acp/info/acp_portal_links.php new file mode 100644 index 00000000..e0285141 --- /dev/null +++ b/root/includes/acp/info/acp_portal_links.php @@ -0,0 +1,42 @@ + 'acp_portal_links', + 'title' => 'ACP_PORTAL_LINKS', + 'version' => '2.0.0', + 'modes' => array( + 'links' => array('title' => 'ACP_PORTAL_MANAGE_LINKS', 'auth' => 'acl_a_portal', 'cat' => array('ACP_PORTAL')), + ), + ); + } + + function install() + { + } + + function uninstall() + { + } +} + +?> \ No newline at end of file diff --git a/root/language/de/mods/info_acp_portal.php b/root/language/de/mods/info_acp_portal.php new file mode 100644 index 00000000..b6346840 --- /dev/null +++ b/root/language/de/mods/info_acp_portal.php @@ -0,0 +1,165 @@ + 'Block-Verwaltung', + 'ACP_PORTAL_BLOCKS_EXPLAIN' => 'Du kannst hier Blöcke anlegen, bearbeiten und löschen.', + 'ADD_BLOCK' => 'Neuer Block hinzufügen', + 'ACP_PORTAL_MANAGE_BLOCKS' => 'Blöcke verwalten', + + // general + 'ACP_PORTAL' => 'Portal', + 'ACP_PORTAL_GENERAL_INFO' => 'Allgemeine Einstellungen', + 'ACP_PORTAL_GENERAL_TITLE' => 'Portal Administration', + 'ACP_PORTAL_GENERAL_TITLE_EXPLAIN' => 'Hier kannst du allgemeine Einstellungen vornehmen.', + + 'BLOCK_ADDED' => 'The block was successfully added.', + 'BLOCK_FILENAME' => 'Block template file', + 'BLOCK_FILENAME_EXPLAIN' => 'Use this to define a tempalte file used for the block. The path is relative to the root phpBB directory.', + 'BLOCK_ICON' => 'Block icon', + 'BLOCK_ICON_EXPLAIN' => 'Use this to define a small icon associated with the block. The path is relative to the root phpBB directory.', + 'BLOCK_POSITION' => 'Display position', + 'BLOCK_POSITION_EXPLAIN' => 'Select the display position on index page.', + 'BLOCK_POSITION_BOTTOM' => 'Bottom', + 'BLOCK_POSITION_LEFT' => 'Left', + 'BLOCK_POSITION_MIDDLE_BOTTOM' => 'Middle - Bottom', + 'BLOCK_POSITION_MIDDLE_TOP' => 'Middle - Top', + 'BLOCK_POSITION_NONE' => 'Not display', + 'BLOCK_POSITION_RIGHT' => 'Right', + 'BLOCK_POSITION_TOP' => 'Top', + 'BLOCK_REMOVED' => 'The block was successfully deleted.', + 'BLOCK_TEXT' => 'Text', + 'BLOCK_TEXT_EXPLAIN' => 'Enter here the content of the block text.', + 'BLOCK_TITLE' => 'Block title', + 'BLOCK_TITLE_EXPLAIN' => 'Enter the displayed block title. Use language constant if name is served from language file: language/en/mods/portal.php', + 'BLOCK_TYPE' => 'Block type', + 'BLOCK_TYPE_EXPLAIN' => 'Select the block type.', + 'BLOCK_UPDATED' => 'The block was successfully updated.', + + 'MUST_SELECT_BLOCK' => 'You must select a block.', + + 'NO_BLOCK_HTML' => 'You have created block with template file but haven’t selected a template file for this block.', + 'NO_BLOCK_TEXT' => 'You have created custom text block but haven’t entered the content for this block.', + 'NO_BLOCK_TITLE' => 'You haven’t specified a title for the block.', + + 'SELECT_BLOCK_FILE' => 'Select a template file…', + 'SELECT_BLOCK_ICON' => 'Select an icon…', + 'SELECT_BLOCK_CLOCK' => 'Select an clock…', + 'SELECT_BLOCK_POSITION' => 'Select a position…', + 'SELECT_BLOCK_TYPE' => 'Select a type…', + + // Manage links + 'ACP_EXPRESS_LINKS_EXPLAIN' => 'Using this form you can add, edit, view and delete navigation links on the index page. You can also create special navigation links as categories which aren’t clickable links.', + 'ADD_LINK' => 'Add new navigation link', + 'ACP_PORTAL_MANAGE_LINKS' => 'Links verwalten', + + 'LINK_ADDED' => 'The navigation link was successfully added.', + 'LINK_CAT' => 'Navigation link category', + 'LINK_ICON' => 'Link icon', + 'LINK_ICON_EXPLAIN' => 'Use this to define a small icon associated with the navigation link. The path is relative to the root phpBB directory.', + 'LINK_IS_CAT' => 'Set as special link category', + 'LINK_REMOVED' => 'The navigation link was successfully deleted.', + 'LINK_TITLE' => 'Link title', + 'LINK_UPDATED' => 'The navigation link was successfully updated.', + 'LINK_URL' => 'Link URL', + + 'MUST_SELECT_LINK' => 'You must select a link.', + + 'NO_LINK_TITLE' => 'You haven’t specified a title for the navigation link.', + 'NO_LINK_URL' => 'You have created clickable navigation link but haven’t entered the URL for this navigation link.', + + 'SELECT_LINK_ICON' => 'Select an icon…', + + // paypal + 'PORTAL_PAY_ACC' => 'Paypal Account', + 'PORTAL_PAY_ACC_EXPLAIN' => 'Gib deine e-mail-Adresse an, die du bei Paypal benutzt, z.B. xxx@xxx.com', +)); + +// BLOCK TITLES +// Set additional block titles here... +// +// Example: +// 'BLOCK_TOP_POSTERS' => 'Top posters', /* Main block title */ +// 'BLOCK_TOP_POSTERS_SUB' => 'Posted', /* Legend, block sub-title */ +// +$lang = array_merge($lang, array( + 'BLOCK_BIRTHDAY' => 'Geburtstage', + 'BLOCK_EXPRESS_LINKS' => 'Navigation', + 'BLOCK_SEARCH' => 'Suche', + 'BLOCK_CLOCK' => 'Uhr', + 'BLOCK_USER_MENU' => 'Benutzer-Menü', + 'BLOCK_MAIN_MENU' => '', + 'BLOCK_CHANGE_STYLE' => 'Mein Board-Style', + 'BLOCK_ONLINE' => 'Wer ist Online?', + 'BLOCK_DONATION' => 'Paypal-Spenden', + 'BLOCK_LINKS' => 'Links', + 'BLOCK_LATEST_BOTS' => 'Bots', + 'BLOCK_LATEST_MEMBERS' => 'Neueste Mitglieder', + 'BLOCK_MINI_CALENDAR' => 'Kalender', + 'BLOCK_ONLINE_FRIENDS' => 'Freunde', + 'BLOCK_STATISTICS' => 'Statistik', + 'BLOCK_TOP_POSTER' => 'Top Poster', + 'BLOCK_CUSTOM' => 'Custom', + 'BLOCK_BOTS' => 'Letzten Bots', +)); + +// CUSTOM PAGE TITLES +// Set custom page titles here... +// +// Example: +// 'PAGE_ABOUT' => 'About us', /* Main page title */ +// 'PAGE_ABOUT_EXPLAIN' => 'Contact information here.', /* Explanation, page sub-title */ +// +$lang = array_merge($lang, array( +)); + +/** +* A copy of Handyman` s MOD version check, to view it on the gallery overview +*/ +$lang = array_merge($lang, array( + 'ANNOUNCEMENT_TOPIC' => 'Release Ankündigung', + 'CURRENT_VERSION' => 'Derzeitige Version', + 'DOWNLOAD_LATEST' => 'Neueste Version herunterladen', + 'LATEST_VERSION' => 'Neueste Version', + 'NO_INFO' => 'Der Server konnte nicht erreicht werden', + 'NOT_UP_TO_DATE' => '%s ist nicht aktuell', + 'RELEASE_ANNOUNCEMENT' => 'Ankündigungsthema', + 'UP_TO_DATE' => '%s ist aktuell', + 'VERSION_CHECK' => 'MOD Version Check', +)); + +?> \ No newline at end of file diff --git a/root/language/de/mods/portal.php b/root/language/de/mods/portal.php new file mode 100644 index 00000000..a2725498 --- /dev/null +++ b/root/language/de/mods/portal.php @@ -0,0 +1,185 @@ + 'In den nächsten %s Tagen', + 'NO_BIRTHDAYS_AHEAD' => 'In diesem Zeitraum hat kein Mitglied Geburtstag', +)); + +// Common +$lang = array_merge($lang, array( + 'POSTERS' => 'Posters', + + 'SEARCH_A9' => 'A9.com', + 'SEARCH_ACRONYM_FINDER' => 'AcronymFinder', + 'SEARCH_ALEXA' => 'Alexa', + 'SEARCH_ALTA_VISTA' => 'AltaVista', + 'SEARCH_AMAZON' => 'Amazon', + 'SEARCH_AOL' => 'AOL', + 'SEARCH_ASK' => 'Ask.com', + 'SEARCH_BAAMBOO' => 'BaamBoo', + 'SEARCH_BIT_TORRENT' => 'BitTorrent', + 'SEARCH_CREATIVE_COMMONS' => 'Crative Commons', + 'SEARCH_EBAY' => 'Ebay', + 'SEARCH_GOOGLE' => 'Google', + 'SEARCH_LIVE' => 'Windows Live', + 'SEARCH_LYCOS' => 'Lycos', + 'SEARCH_MININOVA' => 'Mininova', + 'SEARCH_REFERENCE' => 'Reference.com', + 'SEARCH_SOURCE_FORGE' => 'SourceForge', + 'SEARCH_TORRENT_PORTAL' => 'TorrentPortal', + 'SEARCH_TORRENT_SPY' => 'TorrentSpy', + 'SEARCH_TORRENTZ' => 'TorrentZ', + 'SEARCH_VDICT' => 'VDict', + 'SEARCH_WIKI_PEDIA' => 'WikiPedia', + 'SEARCH_YAHOO' => 'Yahoo! Search', + + 'WELCOME_YOU' => 'Welcome you', + + // paypal + 'PORTAL_PAY_ACC' => 'Paypal Account', + 'PORTAL_PAY_ACC_EXPLAIN' => 'Gib deine e-mail-Adresse an, die du bei Paypal benutzt, z.B. xxx@xxx.com', + +// User menu + 'UM_LOG_ME_IN' => 'Mich bei jedem Besuch automatisch anmelden', + 'UM_HIDE_ME' => 'Meinen Online-Status während dieser Sitzung verbergen', + 'UM_MAIN_SUBSCRIBED' => 'Benachrichtigungen verwalten', + 'UM_BOOKMARKS' => 'Lesezeichen verwalten', + 'M_MENU' => 'Menü', + 'M_ACP' => 'Administrations-Bereich', + + // search + 'GO' => 'Los', + 'SEARCH_BOARD' => 'Foren', + 'SEARCH_SERVICE' => 'Suchmaschinen', + 'SEARCH_LOOKUP' => 'Lookup', + 'SEARCH_TORRENT' => 'Torrent', + 'SEARCH_ADV' => 'erweiterte Suche', + +// Styles + 'STYLE_CHOOSE' => '', + +// Friends + 'FRIENDS_OFFLINE' => 'Offline', + 'FRIENDS_ONLINE' => 'Online', + 'NO_FRIENDS' => 'Derzeit sind keine Freunde definiert', + 'NO_FRIENDS_OFFLINE' => 'Keine Freunde offline', + 'NO_FRIENDS_ONLINE' => 'Keine Freunde online', + +// Statistics + 'ST_TOP' => 'Insgesamt', + 'ST_TOP_ANNS' => 'Bekanntmachungen insgesamt:', + 'ST_TOP_STICKYS' => 'Wichtig insgesamt:', + 'ST_TOT_ATTACH' => 'Dateianhänge insgesamt:', + + 'TOPICS_PER_DAY_OTHER' => 'Themen pro Tag: %d', + 'TOPICS_PER_DAY_ZERO' => 'Themen pro Tag: 0', + 'POSTS_PER_DAY_OTHER' => 'Beiträge pro Tag: %d', + 'POSTS_PER_DAY_ZERO' => 'Beiträge pro Tag: 0', + 'USERS_PER_DAY_OTHER' => 'Benutzer pro Tag: %d', + 'USERS_PER_DAY_ZERO' => 'Benutzer pro Tag: 0', + 'TOPICS_PER_USER_OTHER' => 'Themen pro Benutzer: %d', + 'TOPICS_PER_USER_ZERO' => 'Themen pro Benutzer: 0', + 'POSTS_PER_USER_OTHER' => 'Beiträge pro Benutzer: %d', + 'POSTS_PER_USER_ZERO' => 'Beiträge pro Benutzer: 0', + 'POSTS_PER_TOPIC_OTHER' => 'Beiträge pro Thema: %d', + 'POSTS_PER_TOPIC_ZERO' => 'Beiträge pro Thema: 0', + + +// PayPal + 'DONATION' => 'PayPal-Spenden', + 'DONATION_TEXT' => 'ist eine Webseite ohne jedes Gewinninteresse. Jeder der dieses Projekt unterstützen möchte, kann dies mit einer kleinen PayPal-Spende tun, damit die Rechnungen für den Server, die Domain, etc. bezahlt werden können.', + 'PAY_MSG' => 'Betrag bitte mit Punkt statt Komma trennen, z.B. 3.50', + 'PAY_ITEM' => 'Freiwillige Foren-Spende', + + 'AUD' => 'Australische Dollar (AUD)', + 'CAD' => 'Kanadische Dollar (CAD)', + 'CZK' => 'Tschechische Kronen (CZK)', + 'DKK' => 'Dänische Kronen (DKK)', + 'HKD' => 'Hongkong-Dollar (HKD)', + 'HUF' => 'Ungarische Forint (HUF)', + 'NZD' => 'Neuseeland-Dollar (NZD)', + 'NOK' => 'Norwegische Kronen (NOK)', + 'PLN' => 'Polnische Zloty (PLN)', + 'GBP' => 'Britische Pfund (GBP)', + 'SGD' => 'Singapur-Dollar (SGD)', + 'SEK' => 'Schwedische Kronen (SEK)', + 'CHF' => 'Schweizer Franken (CHF)', + 'JPY' => 'Japanische Yen (JPY)', + 'USD' => 'US-Dollar (USD)', + 'EUR' => 'Euro (EUR)', + 'MXN' => 'Mexikanische Pesos (MXN)', + 'ILS' => 'Neue Israelische Schekel (ILS)', +)); + +// BLOCK TITLES +// Set additional block titles here... +// +// Example: +// 'BLOCK_TOP_POSTERS' => 'Top posters', /* Main block title */ +// 'BLOCK_TOP_POSTERS_SUB' => 'Posted', /* Legend, block sub-title */ +// +$lang = array_merge($lang, array( + 'BLOCK_BIRTHDAY' => 'Geburtstage', + 'BLOCK_EXPRESS_LINKS' => 'Navigation', + 'BLOCK_SEARCH' => 'Suche', + 'BLOCK_CLOCK' => 'Uhr', + 'BLOCK_USER_MENU' => 'Benutzer-Menü', + 'BLOCK_CHANGE_STYLE' => 'Mein Board-Style', + 'BLOCK_ONLINE' => 'Wer ist Online?', + 'BLOCK_DONATION' => 'Paypal-Spenden', + 'BLOCK_LINKS' => 'Links', + 'BLOCK_LATEST_BOTS' => 'Bots', + 'BLOCK_LATEST_MEMBERS' => 'Neueste Mitglieder', + 'BLOCK_MINI_CALENDAR' => 'Kalender', + 'BLOCK_ONLINE_FRIENDS' => 'Freunde', + 'BLOCK_STATISTICS' => 'Statistik', + 'BLOCK_TOP_POSTER' => 'Top Poster', + 'BLOCK_CUSTOM' => 'Custom', + 'BLOCK_BOTS' => 'Letzten Bots-Besuche', +)); + +// CUSTOM PAGE TITLES +// Set custom page titles here... +// +// Example: +// 'PAGE_ABOUT' => 'About us', /* Main page title */ +// 'PAGE_ABOUT_EXPLAIN' => 'Contact information here.', /* Explanation, page sub-title */ +// +$lang = array_merge($lang, array( +)); + +?> \ No newline at end of file diff --git a/root/language/en/mods/info_acp_portal.php b/root/language/en/mods/info_acp_portal.php new file mode 100644 index 00000000..b6346840 --- /dev/null +++ b/root/language/en/mods/info_acp_portal.php @@ -0,0 +1,165 @@ + 'Block-Verwaltung', + 'ACP_PORTAL_BLOCKS_EXPLAIN' => 'Du kannst hier Blöcke anlegen, bearbeiten und löschen.', + 'ADD_BLOCK' => 'Neuer Block hinzufügen', + 'ACP_PORTAL_MANAGE_BLOCKS' => 'Blöcke verwalten', + + // general + 'ACP_PORTAL' => 'Portal', + 'ACP_PORTAL_GENERAL_INFO' => 'Allgemeine Einstellungen', + 'ACP_PORTAL_GENERAL_TITLE' => 'Portal Administration', + 'ACP_PORTAL_GENERAL_TITLE_EXPLAIN' => 'Hier kannst du allgemeine Einstellungen vornehmen.', + + 'BLOCK_ADDED' => 'The block was successfully added.', + 'BLOCK_FILENAME' => 'Block template file', + 'BLOCK_FILENAME_EXPLAIN' => 'Use this to define a tempalte file used for the block. The path is relative to the root phpBB directory.', + 'BLOCK_ICON' => 'Block icon', + 'BLOCK_ICON_EXPLAIN' => 'Use this to define a small icon associated with the block. The path is relative to the root phpBB directory.', + 'BLOCK_POSITION' => 'Display position', + 'BLOCK_POSITION_EXPLAIN' => 'Select the display position on index page.', + 'BLOCK_POSITION_BOTTOM' => 'Bottom', + 'BLOCK_POSITION_LEFT' => 'Left', + 'BLOCK_POSITION_MIDDLE_BOTTOM' => 'Middle - Bottom', + 'BLOCK_POSITION_MIDDLE_TOP' => 'Middle - Top', + 'BLOCK_POSITION_NONE' => 'Not display', + 'BLOCK_POSITION_RIGHT' => 'Right', + 'BLOCK_POSITION_TOP' => 'Top', + 'BLOCK_REMOVED' => 'The block was successfully deleted.', + 'BLOCK_TEXT' => 'Text', + 'BLOCK_TEXT_EXPLAIN' => 'Enter here the content of the block text.', + 'BLOCK_TITLE' => 'Block title', + 'BLOCK_TITLE_EXPLAIN' => 'Enter the displayed block title. Use language constant if name is served from language file: language/en/mods/portal.php', + 'BLOCK_TYPE' => 'Block type', + 'BLOCK_TYPE_EXPLAIN' => 'Select the block type.', + 'BLOCK_UPDATED' => 'The block was successfully updated.', + + 'MUST_SELECT_BLOCK' => 'You must select a block.', + + 'NO_BLOCK_HTML' => 'You have created block with template file but haven’t selected a template file for this block.', + 'NO_BLOCK_TEXT' => 'You have created custom text block but haven’t entered the content for this block.', + 'NO_BLOCK_TITLE' => 'You haven’t specified a title for the block.', + + 'SELECT_BLOCK_FILE' => 'Select a template file…', + 'SELECT_BLOCK_ICON' => 'Select an icon…', + 'SELECT_BLOCK_CLOCK' => 'Select an clock…', + 'SELECT_BLOCK_POSITION' => 'Select a position…', + 'SELECT_BLOCK_TYPE' => 'Select a type…', + + // Manage links + 'ACP_EXPRESS_LINKS_EXPLAIN' => 'Using this form you can add, edit, view and delete navigation links on the index page. You can also create special navigation links as categories which aren’t clickable links.', + 'ADD_LINK' => 'Add new navigation link', + 'ACP_PORTAL_MANAGE_LINKS' => 'Links verwalten', + + 'LINK_ADDED' => 'The navigation link was successfully added.', + 'LINK_CAT' => 'Navigation link category', + 'LINK_ICON' => 'Link icon', + 'LINK_ICON_EXPLAIN' => 'Use this to define a small icon associated with the navigation link. The path is relative to the root phpBB directory.', + 'LINK_IS_CAT' => 'Set as special link category', + 'LINK_REMOVED' => 'The navigation link was successfully deleted.', + 'LINK_TITLE' => 'Link title', + 'LINK_UPDATED' => 'The navigation link was successfully updated.', + 'LINK_URL' => 'Link URL', + + 'MUST_SELECT_LINK' => 'You must select a link.', + + 'NO_LINK_TITLE' => 'You haven’t specified a title for the navigation link.', + 'NO_LINK_URL' => 'You have created clickable navigation link but haven’t entered the URL for this navigation link.', + + 'SELECT_LINK_ICON' => 'Select an icon…', + + // paypal + 'PORTAL_PAY_ACC' => 'Paypal Account', + 'PORTAL_PAY_ACC_EXPLAIN' => 'Gib deine e-mail-Adresse an, die du bei Paypal benutzt, z.B. xxx@xxx.com', +)); + +// BLOCK TITLES +// Set additional block titles here... +// +// Example: +// 'BLOCK_TOP_POSTERS' => 'Top posters', /* Main block title */ +// 'BLOCK_TOP_POSTERS_SUB' => 'Posted', /* Legend, block sub-title */ +// +$lang = array_merge($lang, array( + 'BLOCK_BIRTHDAY' => 'Geburtstage', + 'BLOCK_EXPRESS_LINKS' => 'Navigation', + 'BLOCK_SEARCH' => 'Suche', + 'BLOCK_CLOCK' => 'Uhr', + 'BLOCK_USER_MENU' => 'Benutzer-Menü', + 'BLOCK_MAIN_MENU' => '', + 'BLOCK_CHANGE_STYLE' => 'Mein Board-Style', + 'BLOCK_ONLINE' => 'Wer ist Online?', + 'BLOCK_DONATION' => 'Paypal-Spenden', + 'BLOCK_LINKS' => 'Links', + 'BLOCK_LATEST_BOTS' => 'Bots', + 'BLOCK_LATEST_MEMBERS' => 'Neueste Mitglieder', + 'BLOCK_MINI_CALENDAR' => 'Kalender', + 'BLOCK_ONLINE_FRIENDS' => 'Freunde', + 'BLOCK_STATISTICS' => 'Statistik', + 'BLOCK_TOP_POSTER' => 'Top Poster', + 'BLOCK_CUSTOM' => 'Custom', + 'BLOCK_BOTS' => 'Letzten Bots', +)); + +// CUSTOM PAGE TITLES +// Set custom page titles here... +// +// Example: +// 'PAGE_ABOUT' => 'About us', /* Main page title */ +// 'PAGE_ABOUT_EXPLAIN' => 'Contact information here.', /* Explanation, page sub-title */ +// +$lang = array_merge($lang, array( +)); + +/** +* A copy of Handyman` s MOD version check, to view it on the gallery overview +*/ +$lang = array_merge($lang, array( + 'ANNOUNCEMENT_TOPIC' => 'Release Ankündigung', + 'CURRENT_VERSION' => 'Derzeitige Version', + 'DOWNLOAD_LATEST' => 'Neueste Version herunterladen', + 'LATEST_VERSION' => 'Neueste Version', + 'NO_INFO' => 'Der Server konnte nicht erreicht werden', + 'NOT_UP_TO_DATE' => '%s ist nicht aktuell', + 'RELEASE_ANNOUNCEMENT' => 'Ankündigungsthema', + 'UP_TO_DATE' => '%s ist aktuell', + 'VERSION_CHECK' => 'MOD Version Check', +)); + +?> \ No newline at end of file diff --git a/root/language/en/mods/portal.php b/root/language/en/mods/portal.php new file mode 100644 index 00000000..a2725498 --- /dev/null +++ b/root/language/en/mods/portal.php @@ -0,0 +1,185 @@ + 'In den nächsten %s Tagen', + 'NO_BIRTHDAYS_AHEAD' => 'In diesem Zeitraum hat kein Mitglied Geburtstag', +)); + +// Common +$lang = array_merge($lang, array( + 'POSTERS' => 'Posters', + + 'SEARCH_A9' => 'A9.com', + 'SEARCH_ACRONYM_FINDER' => 'AcronymFinder', + 'SEARCH_ALEXA' => 'Alexa', + 'SEARCH_ALTA_VISTA' => 'AltaVista', + 'SEARCH_AMAZON' => 'Amazon', + 'SEARCH_AOL' => 'AOL', + 'SEARCH_ASK' => 'Ask.com', + 'SEARCH_BAAMBOO' => 'BaamBoo', + 'SEARCH_BIT_TORRENT' => 'BitTorrent', + 'SEARCH_CREATIVE_COMMONS' => 'Crative Commons', + 'SEARCH_EBAY' => 'Ebay', + 'SEARCH_GOOGLE' => 'Google', + 'SEARCH_LIVE' => 'Windows Live', + 'SEARCH_LYCOS' => 'Lycos', + 'SEARCH_MININOVA' => 'Mininova', + 'SEARCH_REFERENCE' => 'Reference.com', + 'SEARCH_SOURCE_FORGE' => 'SourceForge', + 'SEARCH_TORRENT_PORTAL' => 'TorrentPortal', + 'SEARCH_TORRENT_SPY' => 'TorrentSpy', + 'SEARCH_TORRENTZ' => 'TorrentZ', + 'SEARCH_VDICT' => 'VDict', + 'SEARCH_WIKI_PEDIA' => 'WikiPedia', + 'SEARCH_YAHOO' => 'Yahoo! Search', + + 'WELCOME_YOU' => 'Welcome you', + + // paypal + 'PORTAL_PAY_ACC' => 'Paypal Account', + 'PORTAL_PAY_ACC_EXPLAIN' => 'Gib deine e-mail-Adresse an, die du bei Paypal benutzt, z.B. xxx@xxx.com', + +// User menu + 'UM_LOG_ME_IN' => 'Mich bei jedem Besuch automatisch anmelden', + 'UM_HIDE_ME' => 'Meinen Online-Status während dieser Sitzung verbergen', + 'UM_MAIN_SUBSCRIBED' => 'Benachrichtigungen verwalten', + 'UM_BOOKMARKS' => 'Lesezeichen verwalten', + 'M_MENU' => 'Menü', + 'M_ACP' => 'Administrations-Bereich', + + // search + 'GO' => 'Los', + 'SEARCH_BOARD' => 'Foren', + 'SEARCH_SERVICE' => 'Suchmaschinen', + 'SEARCH_LOOKUP' => 'Lookup', + 'SEARCH_TORRENT' => 'Torrent', + 'SEARCH_ADV' => 'erweiterte Suche', + +// Styles + 'STYLE_CHOOSE' => '', + +// Friends + 'FRIENDS_OFFLINE' => 'Offline', + 'FRIENDS_ONLINE' => 'Online', + 'NO_FRIENDS' => 'Derzeit sind keine Freunde definiert', + 'NO_FRIENDS_OFFLINE' => 'Keine Freunde offline', + 'NO_FRIENDS_ONLINE' => 'Keine Freunde online', + +// Statistics + 'ST_TOP' => 'Insgesamt', + 'ST_TOP_ANNS' => 'Bekanntmachungen insgesamt:', + 'ST_TOP_STICKYS' => 'Wichtig insgesamt:', + 'ST_TOT_ATTACH' => 'Dateianhänge insgesamt:', + + 'TOPICS_PER_DAY_OTHER' => 'Themen pro Tag: %d', + 'TOPICS_PER_DAY_ZERO' => 'Themen pro Tag: 0', + 'POSTS_PER_DAY_OTHER' => 'Beiträge pro Tag: %d', + 'POSTS_PER_DAY_ZERO' => 'Beiträge pro Tag: 0', + 'USERS_PER_DAY_OTHER' => 'Benutzer pro Tag: %d', + 'USERS_PER_DAY_ZERO' => 'Benutzer pro Tag: 0', + 'TOPICS_PER_USER_OTHER' => 'Themen pro Benutzer: %d', + 'TOPICS_PER_USER_ZERO' => 'Themen pro Benutzer: 0', + 'POSTS_PER_USER_OTHER' => 'Beiträge pro Benutzer: %d', + 'POSTS_PER_USER_ZERO' => 'Beiträge pro Benutzer: 0', + 'POSTS_PER_TOPIC_OTHER' => 'Beiträge pro Thema: %d', + 'POSTS_PER_TOPIC_ZERO' => 'Beiträge pro Thema: 0', + + +// PayPal + 'DONATION' => 'PayPal-Spenden', + 'DONATION_TEXT' => 'ist eine Webseite ohne jedes Gewinninteresse. Jeder der dieses Projekt unterstützen möchte, kann dies mit einer kleinen PayPal-Spende tun, damit die Rechnungen für den Server, die Domain, etc. bezahlt werden können.', + 'PAY_MSG' => 'Betrag bitte mit Punkt statt Komma trennen, z.B. 3.50', + 'PAY_ITEM' => 'Freiwillige Foren-Spende', + + 'AUD' => 'Australische Dollar (AUD)', + 'CAD' => 'Kanadische Dollar (CAD)', + 'CZK' => 'Tschechische Kronen (CZK)', + 'DKK' => 'Dänische Kronen (DKK)', + 'HKD' => 'Hongkong-Dollar (HKD)', + 'HUF' => 'Ungarische Forint (HUF)', + 'NZD' => 'Neuseeland-Dollar (NZD)', + 'NOK' => 'Norwegische Kronen (NOK)', + 'PLN' => 'Polnische Zloty (PLN)', + 'GBP' => 'Britische Pfund (GBP)', + 'SGD' => 'Singapur-Dollar (SGD)', + 'SEK' => 'Schwedische Kronen (SEK)', + 'CHF' => 'Schweizer Franken (CHF)', + 'JPY' => 'Japanische Yen (JPY)', + 'USD' => 'US-Dollar (USD)', + 'EUR' => 'Euro (EUR)', + 'MXN' => 'Mexikanische Pesos (MXN)', + 'ILS' => 'Neue Israelische Schekel (ILS)', +)); + +// BLOCK TITLES +// Set additional block titles here... +// +// Example: +// 'BLOCK_TOP_POSTERS' => 'Top posters', /* Main block title */ +// 'BLOCK_TOP_POSTERS_SUB' => 'Posted', /* Legend, block sub-title */ +// +$lang = array_merge($lang, array( + 'BLOCK_BIRTHDAY' => 'Geburtstage', + 'BLOCK_EXPRESS_LINKS' => 'Navigation', + 'BLOCK_SEARCH' => 'Suche', + 'BLOCK_CLOCK' => 'Uhr', + 'BLOCK_USER_MENU' => 'Benutzer-Menü', + 'BLOCK_CHANGE_STYLE' => 'Mein Board-Style', + 'BLOCK_ONLINE' => 'Wer ist Online?', + 'BLOCK_DONATION' => 'Paypal-Spenden', + 'BLOCK_LINKS' => 'Links', + 'BLOCK_LATEST_BOTS' => 'Bots', + 'BLOCK_LATEST_MEMBERS' => 'Neueste Mitglieder', + 'BLOCK_MINI_CALENDAR' => 'Kalender', + 'BLOCK_ONLINE_FRIENDS' => 'Freunde', + 'BLOCK_STATISTICS' => 'Statistik', + 'BLOCK_TOP_POSTER' => 'Top Poster', + 'BLOCK_CUSTOM' => 'Custom', + 'BLOCK_BOTS' => 'Letzten Bots-Besuche', +)); + +// CUSTOM PAGE TITLES +// Set custom page titles here... +// +// Example: +// 'PAGE_ABOUT' => 'About us', /* Main page title */ +// 'PAGE_ABOUT_EXPLAIN' => 'Contact information here.', /* Explanation, page sub-title */ +// +$lang = array_merge($lang, array( +)); + +?> \ No newline at end of file diff --git a/root/portal.php b/root/portal.php new file mode 100644 index 00000000..8e82a100 --- /dev/null +++ b/root/portal.php @@ -0,0 +1,214 @@ +session_begin(); +$auth->acl($user->data); +$user->setup('mods/portal'); + +$portal_root_path = PORTAL_ROOT_PATH; +$portal_icons_path = PORTAL_ICONS_PATH; +if (!function_exists('group_memberships')) +{ + include($phpbb_root_path . 'includes/functions_user.' . $phpEx); +} +if (!function_exists('obtain_portal_config')) +{ + include($phpbb_root_path . $portal_root_path . 'includes/functions.' . $phpEx); +} +$portal_config = obtain_portal_config(); + + +if (!$portal_config['portal_enable']) +{ + redirect($phpbb_root_path . 'index.' . $phpEx); +} + +if (file_exists($phpbb_root_path . 'install/index.' . $phpEx) && ($user->data['user_type'] == USER_FOUNDER)) +{ + $template->assign_var('S_DISPLAY_GENERAL', true); +} + +// Grab blocks +if ($portal_config['num_blocks'] > 0) +{ + $blocks = $cache->obtain_blocks(); + + if (sizeof($blocks)) + { + foreach ($blocks as $id => $data) + { + $group_id = $data['group']; + $user_id = $user->data['user_id']; + $is_in_group = ($data['group'] <> 0) ? group_memberships($group_id, $user_id , true) : true; + + /*if ($data['title'] == 'BLOCK_ANNOUNCEMENTS' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/announcements.' . $phpEx); + } + if ($data['title'] == 'BLOCK_ATTACHMENTS' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/attachments.' . $phpEx); + }*/ + if ($data['title'] == 'BLOCK_BIRTHDAY' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/birthday_list.' . $phpEx); + } + /*if ($data['title'] == 'BLOCK_CHANGE_STYLE' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/change_style.' . $phpEx); + }*/ + if ($data['title'] == 'BLOCK_DONATE' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/donate.' . $phpEx); + } + if ($data['title'] == 'BLOCK_ONLINE_FRIENDS' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/friends.' . $phpEx); + } + if ($data['title'] == 'BLOCK_LATEST_MEMBERS' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/latest_members.' . $phpEx); + } + if ($data['title'] == 'BLOCK_BOTS' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/latest_bots.' . $phpEx); + } + /*if ($data['title'] == 'BLOCK_LEADERS' && $data['position'] > 0 && $is_in_group) + { + if ($portal_config['portal_leaders_ext']) + { + include($phpbb_root_path . 'portal/block/leaders_ext.'.$phpEx); + } + else + { + include($phpbb_root_path . 'portal/block/leaders.'.$phpEx); + } + } + if ($data['title'] == 'BLOCK_LINK_US' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/link_us.' . $phpEx); + } + if ($data['title'] == 'BLOCK_MINI_CAL' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/mini_cal.' . $phpEx); + } + if ($data['title'] == 'BLOCK_POLL' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/poll.' . $phpEx); + } + if ($data['title'] == 'BLOCK_RANDOM_MEMBER' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/random_member.' . $phpEx); + } + if ($data['title'] == 'BLOCK_RECENT' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/recent.' . $phpEx); + }*/ + if ($data['title'] == 'BLOCK_STATISTICS' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/statistics.' . $phpEx); + } + if ($data['title'] == 'BLOCK_TOP_POSTERS' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/top_posters.' . $phpEx); + } + if ($data['title'] == 'BLOCK_USER_MENU' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/user_menu.' . $phpEx); + } + /*if ($data['title'] == 'BLOCK_WORDGRAPH' && $data['position'] > 0 && $is_in_group) + { + include($phpbb_root_path . $portal_root_path . 'block/wordgraph.' . $phpEx); + }*/ + + $template->assign_block_vars('blocks', array( + 'TYPE' => $data['type'], + 'ICON' => $phpbb_root_path . $portal_icons_path .'/' . $data['icon'], + 'TITLE' => (!empty($user->lang[strtoupper($data['title'])])) ? $user->lang[strtoupper($data['title'])] : $data['title'], + 'TEXT' => ($data['type'] == 'custom') ? generate_text_for_display($data['text'], $data['text_uid'], $data['text_bitfield'], $data['text_options']) : '', + + 'S_GROUP' => ($is_in_group) ? true : false, + 'S_ICON' => ($data['icon']) ? true : false, + 'S_BLOCK_LEFT' => ($data['position'] == BLOCK_LEFT) ? true : false, + 'S_BLOCK_RIGHT' => ($data['position'] == BLOCK_RIGHT) ? true : false, + 'S_BLOCK_TOP' => ($data['position'] == BLOCK_TOP) ? true : false, + 'S_BLOCK_BOTTOM' => ($data['position'] == BLOCK_BOTTOM) ? true : false, + 'S_BLOCK_MIDDLE_TOP' => ($data['position'] == BLOCK_MIDDLE_TOP) ? true : false, + 'S_BLOCK_MIDDLE_BOTTOM' => ($data['position'] == BLOCK_MIDDLE_BOTTOM) ? true : false, + )); + } + } +} + +$sql = 'SELECT block_position + FROM ' . PORTAL_BLOCKS_TABLE; +$result = $db->sql_query($sql); +$db->sql_freeresult($result); + +// Grab navigation links +//if ($portal_config['num_links'] > 0) +//{ +/* $links = $cache->obtain_links(); + + if (sizeof($links)) + { + foreach ($links as $id => $data) + { + $template->assign_block_vars('links', array( + 'TITLE' => $data['title'], + 'URL' => $data['url'], + + 'S_IS_CAT' => $data['is_cat'], + )); + } + } +//} +*/ +// Assign specific vars +$template->assign_vars(array( + 'WELCOME_USERNAME' => get_username_string('full', $user->data['user_id'], $user->data['username'], $user->data['user_colour']), + + 'U_M_BBCODE' => append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode'), + 'U_M_TERMS' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'), + 'U_M_PRV' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'), + + 'PAY_ACC' => $portal_config['portal_pay_acc'], + + 'S_SMALL_BLOCK' => ($row['block_position'] == BLOCK_LEFT || $row['block_position'] == BLOCK_RIGHT) ? true : false, + 'S_PORTAL_LEFT_COLUMN' => $portal_config['portal_left_column_width'], + 'S_PORTAL_RIGHT_COLUMN' => $portal_config['portal_right_column_width'], +)); + +// Output page +page_header($user->lang['INDEX']); + +$template->set_filenames(array( + 'body' => 'portal/portal_body.html') +); + +make_jumpbox(append_sid("{$phpbb_root_path}viewforum . $phpEx")); + +page_footer(); + +?> \ No newline at end of file diff --git a/root/portal/block/birthday_list.php b/root/portal/block/birthday_list.php new file mode 100644 index 00000000..9681e431 --- /dev/null +++ b/root/portal/block/birthday_list.php @@ -0,0 +1,86 @@ +timezone + $user->dst - date('Z')); + $cache_days = $portal_config['portal_birthdays_ahead']; + $sql_days = ''; + while ($cache_days > 0) + { + $day = getdate(time() + 86400 * $cache_days + $user->timezone + $user->dst - date('Z')); + $sql_days .= " OR u.user_birthday LIKE '" . $db->sql_escape(sprintf('%2d-%2d-', $day['mday'], $day['mon'])) . "%'"; + $cache_days--; + } + + switch ($db->sql_layer) + { + case 'mssql': + case 'mssql_odbc': + $order_by = 'u.user_birthday ASC'; + break; + + default: + $order_by = 'SUBSTRING(u.user_birthday FROM 4 FOR 2) ASC, SUBSTRING(u.user_birthday FROM 1 FOR 2) ASC, u.username_clean ASC'; + break; + } + $now = getdate(time() + $user->timezone + $user->dst - date('Z')); + $sql = 'SELECT u.user_id, u.username, u.user_colour, u.user_birthday + FROM ' . USERS_TABLE . ' u + LEFT JOIN ' . BANLIST_TABLE . " b ON (u.user_id = b.ban_userid) + WHERE (b.ban_id IS NULL + OR b.ban_exclude = 1) + AND (u.user_birthday LIKE '" . $db->sql_escape(sprintf('%2d-%2d-', $now['mday'], $now['mon'])) . "%' {$sql_days}) + AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ') + ORDER BY ' . $order_by; + $result = $db->sql_query($sql); + $today = sprintf('%2d-%2d-', $now['mday'], $now['mon']); + + while ($row = $db->sql_fetchrow($result)) + { + if (substr($row['user_birthday'], 0, 6) == $today) + { + $birthday_list .= get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']); + if ($age = (int) substr($row['user_birthday'], -4)) + { + $birthday_list .= ' (' . ($now['year'] - $age) . ')'; + } + $birthday_list .= '

'; + } + else + { + $birthday_ahead_list .= '' . get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']) . ''; + if ($age = (int) substr($row['user_birthday'], -4)) + { + $birthday_ahead_list .= ' (' . ($now['year'] - $age) . ')'; + } + $birthday_ahead_list .= '

'; + } + } + $db->sql_freeresult($result); +} + +// Assign index specific vars +$template->assign_vars(array( + 'BIRTHDAY_LIST' => $birthday_list, + 'BIRTHDAYS_AHEAD_LIST' => ($portal_config['portal_birthdays_ahead']) ? $birthday_ahead_list : '', + 'L_BIRTHDAYS_AHEAD' => sprintf($user->lang['BIRTHDAYS_AHEAD'], $portal_config['portal_birthdays_ahead']), + 'S_DISPLAY_BIRTHDAY_LIST' => ($config['load_birthdays']) ? true : false, +)); + +?> \ No newline at end of file diff --git a/root/portal/block/donate.php b/root/portal/block/donate.php new file mode 100644 index 00000000..ed42fdbb --- /dev/null +++ b/root/portal/block/donate.php @@ -0,0 +1,33 @@ +assign_var('S_DISPLAY_PAY_C', true); + } + + if ($portal_config['portal_pay_s_block']) + { + $template->assign_var('S_DISPLAY_PAY_S', true); + } + + // Assign specific vars + $template->assign_var('PAY_ACC', $portal_config['portal_pay_acc']); +} + +?> \ No newline at end of file diff --git a/root/portal/block/friends.php b/root/portal/block/friends.php new file mode 100644 index 00000000..5792c8c7 --- /dev/null +++ b/root/portal/block/friends.php @@ -0,0 +1,66 @@ +sql_build_query('SELECT_DISTINCT', array( + 'SELECT' => 'u.user_id, u.username, u.username_clean, u.user_colour, u.user_allow_viewonline, MAX(s.session_time) as online_time, MIN(s.session_viewonline) AS viewonline', + 'FROM' => array( + USERS_TABLE => 'u', + ZEBRA_TABLE => 'z' + ), + + 'LEFT_JOIN' => array( + array( + 'FROM' => array(SESSIONS_TABLE => 's'), + 'ON' => 's.session_user_id = z.zebra_id' + ) + ), + + 'WHERE' => 'z.user_id = ' . $user->data['user_id'] . ' + AND z.friend = 1 + AND u.user_id = z.zebra_id', + 'GROUP_BY' => 'z.zebra_id, u.user_id, u.username, u.user_allow_viewonline, u.user_colour', + 'ORDER_BY' => 'u.username_clean ASC', +)); + +$result = $db->sql_query_limit($sql, $portal_config['portal_max_online_friends']); + +while ($row = $db->sql_fetchrow($result)) +{ + $which = (time() - $update_time < $row['online_time'] && ($row['viewonline'] || $auth->acl_get('u_viewonline'))) ? 'online' : 'offline'; + $s_display_friends = ($row['user_id']) ? true : false; + + $template->assign_block_vars("friends_{$which}", array( + 'USER_ID' => $row['user_id'], + 'U_PROFILE' => get_username_string('profile', $row['user_id'], $row['username'], $row['user_colour']), + 'USER_COLOUR' => get_username_string('colour', $row['user_id'], $row['username'], $row['user_colour']), + 'USERNAME' => get_username_string('username', $row['user_id'], $row['username'], $row['user_colour']), + 'USERNAME_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'])) + ); +} +$db->sql_freeresult($result); + +// Assign specific vars +$template->assign_vars(array( + 'S_DISPLAY_FRIENDS' => $s_display_friends, + 'S_ZEBRA_ENABLED' => true, +)); + +?> \ No newline at end of file diff --git a/root/portal/block/index.html b/root/portal/block/index.html new file mode 100644 index 00000000..5832e4a2 --- /dev/null +++ b/root/portal/block/index.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/root/portal/block/latest_bots.php b/root/portal/block/latest_bots.php new file mode 100644 index 00000000..b6211233 --- /dev/null +++ b/root/portal/block/latest_bots.php @@ -0,0 +1,55 @@ +sql_query_limit($sql, $portal_config['portal_last_visited_bots_number']); +$first = true; +while ($row = $db->sql_fetchrow($result)) +{ + if (!$row['user_lastvisit'] && $first == TRUE) + { + $template->assign_vars(array( + 'S_DISPLAY_LAST_BOTS' => false, + )); + } + else + { + $template->assign_var('S_DISPLAY_LAST_BOTS', true); + + if( $row['user_lastvisit'] > 0 ) + { + $template->assign_block_vars('last_visited_bots', array( + 'BOT_NAME' => get_username_string('full', '', $row['username'], $row['user_colour']), + 'LAST_VISIT_DATE' => $user->format_date($row['user_lastvisit']), + )); + } + } + $first = false; +} +$db->sql_freeresult($result); + +// Assign specific vars +$template->assign_vars(array( + 'LAST_VISITED_BOTS' => sprintf($user->lang['LAST_VISITED_BOTS'], $portal_config['portal_last_visited_bots_number']), + 'S_LAST_VISITED_BOTS' => ($portal_config['portal_load_last_visited_bots']) ? true : false, +)); + +?> \ No newline at end of file diff --git a/root/portal/block/latest_members.php b/root/portal/block/latest_members.php new file mode 100644 index 00000000..60a9b460 --- /dev/null +++ b/root/portal/block/latest_members.php @@ -0,0 +1,35 @@ + ' . USER_IGNORE . ' + AND user_inactive_time = 0 + ORDER BY user_regdate DESC'; +$result = $db->sql_query_limit($sql, $portal_config['portal_max_last_member']); + +while( ($row = $db->sql_fetchrow($result)) && ($row['username']) ) +{ + $template->assign_block_vars('latest_members', array( + 'USERNAME_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + 'JOINED' => $user->format_date($row['user_regdate'], $format = 'd M'), + )); +} +$db->sql_freeresult($result); + +$template->assign_var('S_DISPLAY_LATEST_MEMBERS', true); + +?> \ No newline at end of file diff --git a/root/portal/block/statistics.php b/root/portal/block/statistics.php new file mode 100644 index 00000000..ecd44f4c --- /dev/null +++ b/root/portal/block/statistics.php @@ -0,0 +1,140 @@ +sql_query($sql)) ) + { + return false; + } + + $row = $db->sql_fetchrow($result); + + switch ( $mode ) + { + case 'announcementtotal': + return $row['announcement_total']; + break; + case 'stickytotal': + return $row['sticky_total']; + break; + case 'attachmentstotal': + return $row['attachments_total']; + break; + } + return false; +} + +// Set some stats, get posts count from forums data if we... hum... retrieve all forums data +$total_posts = $config['num_posts']; +$total_topics = $config['num_topics']; +$total_users = $config['num_users']; + +$l_total_user_s = ($total_users == 0) ? 'TOTAL_USERS_ZERO' : 'TOTAL_USERS_OTHER'; +$l_total_post_s = ($total_posts == 0) ? 'TOTAL_POSTS_ZERO' : 'TOTAL_POSTS_OTHER'; +$l_total_topic_s = ($total_topics == 0) ? 'TOTAL_TOPICS_ZERO' : 'TOTAL_TOPICS_OTHER'; + +// avarage stat +$board_days = ( time() - $config['board_startdate'] ) / 86400; + +$topics_per_day = ($total_topics) ? round($total_topics / $board_days, 0) : 0; +$posts_per_day = ($total_posts) ? round($total_posts / $board_days, 0) : 0; +$users_per_day = round($total_users / $board_days, 0); +$topics_per_user = ($total_topics) ? round($total_topics / $total_users, 0) : 0; +$posts_per_user = ($total_posts) ? round($total_posts / $total_users, 0) : 0; +$posts_per_topic = ($total_topics) ? round($total_posts / $total_topics, 0) : 0; + +if ($topics_per_day > $total_topics) +{ + $topics_per_day = $total_topics; +} + +if ($posts_per_day > $total_posts) +{ + $posts_per_day = $total_posts; +} + +if ($users_per_day > $total_users) +{ + $users_per_day = $total_users; +} + +if ($topics_per_user > $total_topics) +{ + $topics_per_user = $total_topics; +} + +if ($posts_per_user > $total_posts) +{ + $posts_per_user = $total_posts; +} + +if ($posts_per_topic > $total_posts) +{ + $posts_per_topic = $total_posts; +} + +$l_topics_per_day_s = ($total_topics == 0) ? 'TOPICS_PER_DAY_ZERO' : 'TOPICS_PER_DAY_OTHER'; +$l_posts_per_day_s = ($total_posts == 0) ? 'POSTS_PER_DAY_ZERO' : 'POSTS_PER_DAY_OTHER'; +$l_users_per_day_s = ($total_users == 0) ? 'USERS_PER_DAY_ZERO' : 'USERS_PER_DAY_OTHER'; +$l_topics_per_user_s = ($total_topics == 0) ? 'TOPICS_PER_USER_ZERO' : 'TOPICS_PER_USER_OTHER'; +$l_posts_per_user_s = ($total_posts == 0) ? 'POSTS_PER_USER_ZERO' : 'POSTS_PER_USER_OTHER'; +$l_posts_per_topic_s = ($total_posts == 0) ? 'POSTS_PER_TOPIC_ZERO' : 'POSTS_PER_TOPIC_OTHER'; + +// Assign specific vars +$template->assign_vars(array( + 'S_DISPLAY_ADVANCED_STAT' => true, + 'TOTAL_POSTS' => sprintf($user->lang[$l_total_post_s], $total_posts), + 'TOTAL_TOPICS' => sprintf($user->lang[$l_total_topic_s], $total_topics), + 'TOTAL_USERS' => sprintf($user->lang[$l_total_user_s], $total_users), + 'NEWEST_USER' => sprintf($user->lang['NEWEST_USER'], get_username_string('full', $config['newest_user_id'], $config['newest_username'], $config['newest_user_colour'])), + 'S_ANN' => get_db_stat('announcementtotal'), + 'S_SCT' => get_db_stat('stickytotal'), + 'S_TOT_ATTACH' => ($config['allow_attachments']) ? get_db_stat('attachmentstotal') : 0, + + // avarage stat + 'TOPICS_PER_DAY' => sprintf($user->lang[$l_topics_per_day_s], $topics_per_day), + 'POSTS_PER_DAY' => sprintf($user->lang[$l_posts_per_day_s], $posts_per_day), + 'USERS_PER_DAY' => sprintf($user->lang[$l_users_per_day_s], $users_per_day), + 'TOPICS_PER_USER' => sprintf($user->lang[$l_topics_per_user_s], $topics_per_user), + 'POSTS_PER_USER' => sprintf($user->lang[$l_posts_per_user_s], $posts_per_user), + 'POSTS_PER_TOPIC' => sprintf($user->lang[$l_posts_per_topic_s], $posts_per_topic), +)); + +?> \ No newline at end of file diff --git a/root/portal/block/top_posters.php b/root/portal/block/top_posters.php new file mode 100644 index 00000000..95b81eb4 --- /dev/null +++ b/root/portal/block/top_posters.php @@ -0,0 +1,39 @@ + ' . USER_IGNORE . ' + AND user_posts <> 0 + ORDER BY user_posts DESC'; +$result = $db->sql_query_limit($sql, $portal_config['portal_max_most_poster']); + +while( ($row = $db->sql_fetchrow($result)) && ($row['username']) ) +{ + $template->assign_block_vars('top_poster', array( + 'S_SEARCH_ACTION' => append_sid("{$phpbb_root_path}search.$phpEx", 'author_id=' . $row['user_id'] . '&sr=posts'), + 'USERNAME_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + 'POSTER_POSTS' => $row['user_posts'], + ) + ); +} +$db->sql_freeresult($result); + +$template->assign_var('S_DISPLAY_TOP_POSTERS', true); + +?> \ No newline at end of file diff --git a/root/portal/block/user_menu.php b/root/portal/block/user_menu.php new file mode 100644 index 00000000..ed469653 --- /dev/null +++ b/root/portal/block/user_menu.php @@ -0,0 +1,100 @@ +data['is_registered']) +{ + $ex_fid_ary = array_unique(array_merge(array_keys($auth->acl_getf('!f_read', true)), array_keys($auth->acl_getf('!f_search', true)))); + + if ($auth->acl_get('m_approve')) + { + $m_approve_fid_ary = array(-1); + $m_approve_fid_sql = ''; + } + else if ($auth->acl_getf_global('m_approve')) + { + $m_approve_fid_ary = array_diff(array_keys($auth->acl_getf('!m_approve', true)), $ex_fid_ary); + $m_approve_fid_sql = ' AND (p.post_approved = 1' . ((sizeof($m_approve_fid_ary)) ? ' OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) : '') . ')'; + } + else + { + $m_approve_fid_ary = array(); + $m_approve_fid_sql = ' AND p.post_approved = 1'; + } + + $sql = 'SELECT COUNT(distinct t.topic_id) as total + FROM ' . TOPICS_TABLE . ' t + WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . ' + AND t.topic_moved_id = 0 + ' . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . ' + ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : ''); + $result = $db->sql_query($sql); + $new_posts_count = (int) $db->sql_fetchfield('total'); + + // your post number + $sql = "SELECT user_posts + FROM " . USERS_TABLE . " + WHERE user_id = " . $user->data['user_id']; + $result = $db->sql_query($sql); + $you_posts_count = (int) $db->sql_fetchfield('user_posts'); +} +// +// - new posts since last visit & you post number +// + + +// Get user... +$user_id = $user->data['user_id']; +$username = $user->data['username']; + +$sql = 'SELECT * + FROM ' . USERS_TABLE . ' + WHERE ' . (($username) ? "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'" : "user_id = $user_id"); +$result = $db->sql_query($sql); +$member = $db->sql_fetchrow($result); +$db->sql_freeresult($result); +$avatar_img = get_user_avatar($member['user_avatar'], $member['user_avatar_type'], $member['user_avatar_width'], $member['user_avatar_height']); +$rank_title = $rank_img = ''; +get_user_rank($member['user_rank'], $member['user_posts'], $rank_title, $rank_img, $rank_img_src); +$username = $member['username']; +$user_id = (int) $member['user_id']; +$colour = $member['user_colour']; + +// Assign specific vars +$template->assign_vars(array( + 'L_NEW_POSTS' => $user->lang['SEARCH_NEW'] . ' (' . $new_posts_count . ')', + 'L_SELF_POSTS' => $user->lang['SEARCH_SELF'] . ' (' . $you_posts_count . ')', + + 'AVATAR_IMG' => $avatar_img, + 'RANK_TITLE' => $rank_title, + 'RANK_IMG' => $rank_img, + 'RANK_IMG_SRC' => $rank_img_src, + + 'USERNAME_FULL' => get_username_string('full', $user_id, $username, $colour), + 'USERNAME' => get_username_string('username', $user_id, $username, $colour), + 'USER_COLOR' => get_username_string('colour', $user_id, $username, $colour), + 'U_VIEW_PROFILE' => get_username_string('profile', $user_id, $username, $colour), + + 'U_NEW_POSTS' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=newposts'), + 'U_SELF_POSTS' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=egosearch'), + 'U_UM_BOOKMARKS' => ($config['allow_bookmarks']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=main&mode=bookmarks') : '', + 'U_UM_MAIN_SUBSCRIBED' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=main&mode=subscribed'), + 'U_MCP' => ($auth->acl_get('m_') || $auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&mode=front', true, $user->session_id) : '', +)); + +?> \ No newline at end of file diff --git a/root/portal/includes/functions.php b/root/portal/includes/functions.php new file mode 100644 index 00000000..ca769baa --- /dev/null +++ b/root/portal/includes/functions.php @@ -0,0 +1,650 @@ +get('portal_config')) !== true) + { + $portal_config = $cached_portal_config = array(); + + $sql = 'SELECT config_name, config_value + FROM ' . PORTAL_CONFIG_TABLE; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $cached_portal_config[$row['config_name']] = $row['config_value']; + $portal_config[$row['config_name']] = $row['config_value']; + } + $db->sql_freeresult($result); + + $cache->put('portal_config', $cached_portal_config); + } + + return $portal_config; +} + +/** +* Set config value. Creates missing config entry. +*/ +function set_portal_config($config_name, $config_value) +{ + global $db, $cache, $portal_config; + + $sql = 'UPDATE ' . PORTAL_CONFIG_TABLE . " + SET config_value = '" . $db->sql_escape($config_value) . "' + WHERE config_name = '" . $db->sql_escape($config_name) . "'"; + $db->sql_query($sql); + + if (!$db->sql_affectedrows() && !isset($portal_config[$config_name])) + { + $sql = 'INSERT INTO ' . PORTAL_CONFIG_TABLE . ' ' . $db->sql_build_array('INSERT', array( + 'config_name' => $config_name, + 'config_value' => $config_value)); + $db->sql_query($sql); + } + + $portal_config[$config_name] = $config_value; +} + +// fetch post for news & announce +function phpbb_fetch_posts($forum_from, $permissions, $number_of_posts, $text_length, $time, $type, $start = 0) +{ + global $db, $phpbb_root_path, $auth, $user, $bbcode_bitfield, $bbcode, $portal_config, $config; + + $posts = array(); + $post_time = ($time == 0) ? '' : 'AND t.topic_time > ' . (time() - $time * 86400); + $forum_from = ( strpos($forum_from, ',') !== FALSE ) ? explode(',', $forum_from) : (($forum_from != '') ? array($forum_from) : array()); + $str_where = ''; + $topic_icons = array(0); + $have_icons = 0; + + if( $permissions == TRUE ) + { + $disallow_access = array_unique(array_keys($auth->acl_getf('!f_read', true))); + } + else + { + $disallow_access = array(); + } + + $global_f = 0; + + if( sizeof($forum_from) ) + { + $disallow_access = array_diff($forum_from, $disallow_access); + if( !sizeof($disallow_access) ) + { + return array(); + } + + foreach( $disallow_access as $acc_id) + { + $acc_id = (int) $acc_id; + $str_where .= "t.forum_id = $acc_id OR "; + if( $type == 'announcements' && $global_f < 1 && $acc_id > 0 ) + { + $global_f = $acc_id; + } + } + } + else + { + foreach( $disallow_access as $acc_id ) + { + $acc_id = (int) $acc_id; + $str_where .= "t.forum_id <> $acc_id AND "; + } + } + + switch( $type ) + { + case "announcements": + $topic_type = '(( t.topic_type = ' . POST_ANNOUNCE . ') OR ( t.topic_type = ' . POST_GLOBAL . '))'; + $str_where = ( strlen($str_where) > 0 ) ? 'AND (t.forum_id = 0 OR (' . trim(substr($str_where, 0, -4)) . '))' : ''; + $user_link = 't.topic_poster = u.user_id'; + $post_link = 't.topic_first_post_id = p.post_id'; + $topic_order = 't.topic_time DESC'; + break; + case "news": + $topic_type = 't.topic_type = ' . POST_NORMAL; + $str_where = ( strlen($str_where) > 0 ) ? 'AND (' . trim(substr($str_where, 0, -4)) . ')' : ''; + $user_link = ( $portal_config['portal_news_style'] ) ? 't.topic_poster = u.user_id' : (( $portal_config['portal_news_show_last'] ) ? 't.topic_last_poster_id = u.user_id' : 't.topic_poster = u.user_id' ) ; + $post_link = ( $portal_config['portal_news_style'] ) ? 't.topic_first_post_id = p.post_id' : (( $portal_config['portal_news_show_last'] ) ? 't.topic_last_post_id = p.post_id' : 't.topic_first_post_id = p.post_id' ) ; + $topic_order = ( $portal_config['portal_news_show_last'] ) ? 't.topic_last_post_time DESC' : 't.topic_time DESC' ; + break; + case "news_all": + $topic_type = '( t.topic_type <> ' . POST_ANNOUNCE . ' ) AND ( t.topic_type <> ' . POST_GLOBAL . ')'; + $str_where = ( strlen($str_where) > 0 ) ? 'AND (' . trim(substr($str_where, 0, -4)) . ')' : ''; + $user_link = ( $portal_config['portal_news_style'] ) ? 't.topic_poster = u.user_id' : (( $portal_config['portal_news_show_last'] ) ? 't.topic_last_poster_id = u.user_id' : 't.topic_poster = u.user_id' ) ; + $post_link = ( $portal_config['portal_news_style'] ) ? 't.topic_first_post_id = p.post_id' : (( $portal_config['portal_news_show_last'] ) ? 't.topic_last_post_id = p.post_id' : 't.topic_first_post_id = p.post_id' ) ; + $topic_order = ( $portal_config['portal_news_show_last'] ) ? 't.topic_last_post_time DESC' : 't.topic_time DESC' ; + break; + } + + if( $type == 'announcements' && $global_f < 1 ) + { + $sql = 'SELECT + forum_id + FROM + ' . FORUMS_TABLE . ' + WHERE + forum_type = ' . FORUM_POST . ' + ' . str_replace('t.', '', $str_where) . ' + ORDER BY + forum_id'; + $result = $db->sql_query_limit($sql, 1); + $row = $db->sql_fetchrow($result); + + if( !sizeof( $row ) ) + { + return array(); + } + $global_f = $row['forum_id']; + } + + $sql_array = array( + 'SELECT' => 't.forum_id, + t.topic_id, + t.topic_last_post_id, + t.topic_last_post_time, + t.topic_time, + t.topic_title, + t.topic_attachment, + t.topic_views, + t.poll_title, + t.topic_replies, + t.topic_replies_real, + t.topic_poster, + t.topic_type, + t.topic_status, + t.topic_last_poster_name, + t.topic_last_poster_id, + t.topic_last_poster_colour, + t.icon_id, + u.username, + u.user_id, + u.user_type, + u.user_colour, + p.post_id, + p.poster_id, + p.post_time, + p.post_text, + p.post_attachment, + p.post_username, + p.enable_smilies, + p.enable_bbcode, + p.enable_magic_url, + p.bbcode_bitfield, + p.bbcode_uid, + f.forum_name, + f.enable_icons', + 'FROM' => array( + TOPICS_TABLE => 't', + ), + 'LEFT_JOIN' => array( + array( + 'FROM' => array(USERS_TABLE => 'u'), + 'ON' => $user_link, + ), + array( + 'FROM' => array(FORUMS_TABLE => 'f'), + 'ON' => 't.forum_id=f.forum_id', + ), + array( + 'FROM' => array(POSTS_TABLE => 'p'), + 'ON' => $post_link, + ), + ), + 'WHERE' => $topic_type . ' + ' . $post_time . ' + AND t.topic_status <> ' . ITEM_MOVED . ' + AND t.topic_approved = 1 + AND t.topic_moved_id = 0 + ' . $str_where, + 'ORDER_BY' => $topic_order, + ); + + $sql_array['LEFT_JOIN'][] = array('FROM' => array(TOPICS_POSTED_TABLE => 'tp'), 'ON' => 'tp.topic_id = t.topic_id AND tp.user_id = ' . $user->data['user_id']); + $sql_array['SELECT'] .= ', tp.topic_posted'; + $sql = $db->sql_build_query('SELECT', $sql_array); + + if ($number_of_posts <> 0) + { + $result = $db->sql_query_limit($sql, $number_of_posts, $start); + } + else + { + $result = $db->sql_query($sql); + } + + // Instantiate BBCode if need be + if ($bbcode_bitfield !== '') + { + $bbcode = new bbcode(base64_encode($bbcode_bitfield)); + } + + $i = 0; + + while ( $row = $db->sql_fetchrow($result) ) + { + $attachments = array(); + if( $config['allow_attachments'] && $row['post_id'] ) + { + // Pull attachment data + $sql2 = 'SELECT * + FROM ' . ATTACHMENTS_TABLE . ' + WHERE post_msg_id = '. $row['post_id'] .' + AND in_message = 0 + ORDER BY filetime DESC'; + $result2 = $db->sql_query($sql2); + + while ($row2 = $db->sql_fetchrow($result2)) + { + $attachments[] = $row2; + } + $db->sql_freeresult($result2); + } + + $posts[$i]['bbcode_uid'] = $row['bbcode_uid']; + $len_check = $row['post_text']; + $maxlen = $text_length; + + if (($text_length != 0) && (strlen($len_check) > $text_length)) + { + $message = censor_text(get_sub_taged_string(str_replace("\n", '
', $row['post_text']), $row['bbcode_uid'], $maxlen)); + $posts[$i]['striped'] = true; + } + else + { + $message = censor_text( str_replace("\n", '
', $row['post_text']) ); + } + + // Second parse bbcode here + if ($row['bbcode_bitfield']) + { + $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']); + } + if (!empty($attachments)) + { + parse_attachments($row['forum_id'], $message, $attachments, $update_count); + } + $message = smiley_text($message); // Always process smilies after parsing bbcodes + + if( $global_f < 1 ) + { + $global_f = $row['forum_id']; + } + + $topic_icons[] = $row['enable_icons']; + $have_icons = ( $row['icon_id'] > 0 ) ? 1 : $have_icons; + + $posts[$i] = array_merge($posts[$i], array( + 'post_text' => ap_validate($message), + 'topic_id' => $row['topic_id'], + 'topic_last_post_id' => $row['topic_last_post_id'], + 'topic_type' => $row['topic_type'], + 'topic_posted' => (isset($row['topic_posted']) && $row['topic_posted']) ? true : false, + 'icon_id' => $row['icon_id'], + 'topic_status' => $row['topic_status'], + 'forum_id' => $row['forum_id'], + 'topic_replies' => $row['topic_replies'], + 'topic_replies_real' => $row['topic_replies_real'], + 'topic_time' => $user->format_date($row['post_time']), + 'topic_last_post_time' => $row['topic_last_post_time'], + 'topic_title' => $row['topic_title'], + 'username' => $row['username'], + 'username_full' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], $row['post_username']), + 'username_full_last' => get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour'], $row['topic_last_poster_name']), + 'user_id' => $row['user_id'], + 'user_type' => $row['user_type'], + 'user_colour' => $row['user_colour'], + 'poll' => ($row['poll_title']) ? true : false, + 'attachment' => ($row['topic_attachment']) ? true : false, + 'topic_views' => $row['topic_views'], + 'forum_name' => $row['forum_name'], + 'attachments' => (!empty($attachments)) ? $attachments : array(), + )); + $posts['global_id'] = $global_f; + $i++; + } + + $posts['topic_icons'] = ( (max($topic_icons) > 0 ) && $have_icons ) ? true : false; + $posts['topic_count'] = $i; + + if( $global_f < 1 ) + { + return array(); + } + else + { + return $posts; + } +} + +/** +* Censor title, return short title +* +* @param $title string title to censor +* @param $limit int short title character limit +* +*/ +function character_limit(&$title, $limit = 0) +{ + $title = censor_text($title); + if ($limit > 0) + { + return (strlen(utf8_decode($title)) > $limit + 3) ? truncate_string($title, $limit) . '...' : $title; + } + else + { + return $title; + } +} + +// Don't let them mess up the complete portal layout in cut messages and do some real AP magic +function is_valid_bbtag($str, $bbuid) +{ + return (substr($str,0,1) == '[') && (strpos($str, ':'.$bbuid.']') > 0); +} + +function get_end_bbtag($tag, $bbuid) +{ + $etag = ''; + for($i=0;$i')+1); + return substr($str,0,strpos($str, $lim, strlen($lim))+strlen($lim)); +} + +function get_sub_taged_string($str, $bbuid, $maxlen) +{ + $sl = $str; + $ret = ''; + $ntext = ''; + $lret = ''; + $i = 0; + $cnt = $maxlen; + $last = ''; + $arr = array(); + + while((strlen($ntext) < $cnt) && (strlen($sl) > 0)) + { + $sr = ''; + if (substr($sl, 0, 1) == '[') $sr = substr($sl,0,strpos($sl,']')+1); + /* GESCHLOSSENE HTML-TAGS BEACHTEN */ + if (substr($sl, 0, 2) == '')+1); + $ret .= $sr; + } + else if (is_valid_bbtag($sr, $bbuid)) + { + if ($sr[1] == '/') + { + /* entfernt das endtag aus dem tag array */ + $tarr = array(); + $j = 0; + foreach ($arr as $elem) + { + if (strcmp($elem[1],$sr) != 0) $tarr[$j++] = $elem; + } + $arr = $tarr; + } + else + { + $arr[$i][0] = $sr; + $arr[$i++][1] = get_end_bbtag($sr, $bbuid); + } + $ret .= $sr; + } + else + { + $sr = get_next_word($sl); + $ret .= $sr; + $ntext .= $sr; + $last = $sr; + } + $sl = substr($sl, strlen($sr), strlen($sl)-strlen($sr)); + } + + $ret = trim($ret) . '...'; + $ap = ''; + + foreach ($arr as $elem) + { + $ap = $elem[1] . $ap; + } + $ret .= $ap; + + return $ret; +} + +function ap_validate($str) +{ + $s = str_replace('
', '
', $str); + return str_replace('
', '', $s); +} + +/** +* Pagination routine, generates archive number sequence +*/ +function generate_portal_pagination($base_url, $num_items, $per_page, $start_item, $type, $add_prevnext_text = false, $tpl_prefix = '') +{ + global $template, $user; + + switch( $type ) + { + case "announcements": + $pagination_type = 'ap'; + $anker = '#a'; + break; + case "news": + case "news_all": + $pagination_type = 'np'; + $anker = '#n'; + break; + } + + // Make sure $per_page is a valid value + $per_page = ($per_page <= 0) ? 1 : $per_page; + + $seperator = '' . $user->lang['COMMA_SEPARATOR'] . ''; + $total_pages = ceil($num_items / $per_page); + + if ($total_pages == 1 || !$num_items) + { + return false; + } + + $on_page = floor($start_item / $per_page) + 1; + $url_delim = (strpos($base_url, '?') === false) ? '?' : '&'; + + $page_string = ($on_page == 1) ? '1' : '1'; + + if ($total_pages > 5) + { + $start_cnt = min(max(1, $on_page - 4), $total_pages - 5); + $end_cnt = max(min($total_pages, $on_page + 4), 6); + + $page_string .= ($start_cnt > 1) ? ' ... ' : $seperator; + + for ($i = $start_cnt + 1; $i < $end_cnt; $i++) + { + $page_string .= ($i == $on_page) ? '' . $i . '' : '' . $i . ''; + if ($i < $end_cnt - 1) + { + $page_string .= $seperator; + } + } + $page_string .= ($end_cnt < $total_pages) ? ' ... ' : $seperator; + } + else + { + $page_string .= $seperator; + + for ($i = 2; $i < $total_pages; $i++) + { + $page_string .= ($i == $on_page) ? '' . $i . '' : '' . $i . ''; + if ($i < $total_pages) + { + $page_string .= $seperator; + } + } + } + $page_string .= ($on_page == $total_pages) ? '' . $total_pages . '' : '' . $total_pages . ''; + + if ($add_prevnext_text) + { + if ($on_page != 1) + { + $page_string = '' . $user->lang['PREVIOUS'] . '  ' . $page_string; + } + + if ($on_page != $total_pages) + { + $page_string .= '  ' . $user->lang['NEXT'] . ''; + } + } + + $template->assign_vars(array( + $tpl_prefix . 'BASE_URL' => $base_url, + 'A_' . $tpl_prefix . 'BASE_URL' => addslashes($base_url), + $tpl_prefix . 'PER_PAGE' => $per_page, + + $tpl_prefix . 'PREVIOUS_PAGE' => ($on_page == 1) ? '' : $base_url . "{$url_delim}" . $pagination_type . '=' . (($on_page - 2) * $per_page) . $anker, + $tpl_prefix . 'NEXT_PAGE' => ($on_page == $total_pages) ? '' : $base_url . "{$url_delim}" . $pagination_type . '=' . ($on_page * $per_page) . $anker, + $tpl_prefix . 'TOTAL_PAGES' => $total_pages, + )); + + return $page_string; +} + +/** +* Format user date for the Birthday block +* Note: this function is used as we already added timezones, etc +* +* borrowed from Upcoming Birthday Mod +* @author: lefty +* changed to work outside session.php by B3P +* @function: format_dateucb +*/ + +function format_birthday($date, $format = false) +{ + global $user; + $time->time_now = time(); + $lang_dates = $user->lang['datetime']; + $format = (!$format) ? $time->date_format : $format; + + // Short representation of month in format + if ((strpos($format, '\M') === false && strpos($format, 'M') !== false) || (strpos($format, '\r') === false && strpos($format, 'r') !== false)) + { + $lang_dates['May'] = $lang_dates['May_short']; + } + unset($lang_dates['May_short']); + + return strtr(@date(str_replace('|', '', $format), $date), $lang_dates); +} + +// Mini Cal. +class calendar +{ + var $dateYYY; // year in numeric format (YYYY) + var $dateMM; // month in numeric format (MM) + var $dateDD; // day in numeric format (DD) + var $ext_dateMM; // extended month (e.g. February) + var $daysMonth; // count of days in month + var $stamp; // timestamp + var $day; // return array s.a. + + /** + * convert date->timestamp + **/ + function makeTimestamp($date) + { + $this->stamp = strtotime($date); + return ($this->stamp); + } + + /** + * get date listed in array + **/ + function getMonth($callDate) + { + + $this->makeTimestamp($callDate); + $this->dateYYYY = date("Y", $this->stamp); + $this->dateMM = date("n", $this->stamp); + $this->ext_dateMM = date("F", $this->stamp); + $this->dateDD = date("d", $this->stamp); + $this->daysMonth = date("t", $this->stamp); + + for($i=1; $i < $this->daysMonth+1; $i++) + { + $this->makeTimestamp("$i $this->ext_dateMM $this->dateYYYY"); + $this->day[] = array( + "0" => "$i", + "1" => $this->dateMM, + "2" => $this->dateYYYY, + "3" => (date('w', $this->stamp)) + ); + } + } +} + +?> \ No newline at end of file diff --git a/root/portal/includes/functions_version_check.php b/root/portal/includes/functions_version_check.php new file mode 100644 index 00000000..dd695735 --- /dev/null +++ b/root/portal/includes/functions_version_check.php @@ -0,0 +1,191 @@ +lang['NO_INFO']; + $data = array( + 'title' => $var['title'], + 'description' => $user->lang['NO_INFO'], + 'download' => $user->lang['NO_INFO'], + 'announcement' => $user->lang['NO_INFO'], + ); + } + $file = get_remote_file($var['file'][0], '/' . $var['file'][1], $var['file'][2], $errstr, $errno); + + if ($file) + { + if (version_compare(PHP_VERSION, '5.0.0', '<')) + { + $row = array(); + $data_array = mvc_setup_array($file); + + $row = $data_array['mods'][$var['tag']]; + $mod_version = $row['mod_version']; + $mod_version = $mod_version['major'] . '.' . $mod_version['minor'] . '.' . $mod_version['revision'] . $mod_version['release']; + + $data = array( + 'title' => $row['title'], + 'description' => $row['description'], + 'download' => $row['download'], + 'announcement' => $row['announcement'], + ); + } + else + { + // let's not stop the page from loading if a mod author messed up their mod check file + // also take care of one of the easiest ways to mess up an xml file: "&" + $mod = @simplexml_load_string(str_replace('&', '&', $file)); + if (isset($mod->$var['tag'])) + { + $row = $mod->$var['tag']; + $mod_version = $row->mod_version->major . '.' . $row->mod_version->minor . '.' . $row->mod_version->revision . $row->mod_version->release; + + $data = array( + 'title' => $row->title, + 'description' => $row->description, + 'download' => $row->download, + 'announcement' => $row->announcement, + ); + } + } + } + + // remove spaces from the version in the mod file stored locally + $version = str_replace(' ', '', $var['version']); + if ($return_version) + { + return $version; + } + + $version_compare = (version_compare($version, $mod_version, '<')) ? false : true; + + $template->assign_block_vars('mods', array( + 'ANNOUNCEMENT' => $data['announcement'], + 'AUTHOR' => $var['author'], + 'CURRENT_VERSION' => $version, + 'DESCRIPTION' => $data['description'], + 'DOWNLOAD' => $data['download'], + 'LATEST_VERSION' => $mod_version, + 'TITLE' => $data['title'], + + 'UP_TO_DATE' => sprintf((!$version_compare) ? $user->lang['NOT_UP_TO_DATE'] : $user->lang['UP_TO_DATE'], $data['title']), + + 'S_UP_TO_DATE' => $version_compare, + + 'U_AUTHOR' => 'http://www.phpbb.com/community/memberlist.php?mode=viewprofile&un=' . $var['author'], + )); +} + +/** +* this is for php4 only +* kind of a dirty hack, but since I get the say on how the xml is done, I can have 4 levels max +*/ +function mvc_setup_array($xml) +{ + // Fire up the built-in XML parser + $values = $index = array(); + $parser = xml_parser_create(); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + + // this takes care of one possible xml error + $xml = str_replace('&', '&', $xml); + + // Set tag names and values + xml_parse_into_struct($parser, $xml, $values, $index); + + // Close down XML parser + xml_parser_free($parser); + + $ary = array(); + + foreach ($values as $value) + { + switch (trim($value['level'])) + { + case 1: + if ($value['type'] == 'open') + { + $one = $value['tag']; + } + else if ($value['type'] == 'complete') + { + $ary[$value['tag']] = $value['value']; + } + break; + + case 2: + if ($value['type'] == 'open') + { + $two = $value['tag']; + } + else if ($value['type'] == 'complete') + { + $ary[$one][$value['tag']] = $value['value']; + } + break; + + case 3: + if ($value['type'] == 'open') + { + $three = $value['tag']; + } + else if ($value['type'] == 'complete') + { + $ary[$one][$two][$value['tag']] = $value['value']; + } + break; + + case 4: + if ($value['type'] == 'complete') + { + $ary[$one][$two][$three][$value['tag']] = isset($value['value']) ? $value['value'] : ''; + } + break; + } + } + return $ary; +} + +?> \ No newline at end of file diff --git a/root/portal/includes/index.html b/root/portal/includes/index.html new file mode 100644 index 00000000..dc8f7f41 --- /dev/null +++ b/root/portal/includes/index.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/root/portal/index.html b/root/portal/index.html new file mode 100644 index 00000000..dc8f7f41 --- /dev/null +++ b/root/portal/index.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/_block_config.html b/root/styles/prosilver/template/portal/_block_config.html new file mode 100644 index 00000000..d759f234 --- /dev/null +++ b/root/styles/prosilver/template/portal/_block_config.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/birthday.html b/root/styles/prosilver/template/portal/block/birthday.html new file mode 100644 index 00000000..74770e21 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/birthday.html @@ -0,0 +1,12 @@ + + + {L_CONGRATULATIONS}:
{BIRTHDAY_LIST}
+ + {L_NO_BIRTHDAYS} + +

{L_BIRTHDAYS_AHEAD}

+ + {BIRTHDAYS_AHEAD_LIST} + + {L_NO_BIRTHDAYS_AHEAD} + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/change_style.html b/root/styles/prosilver/template/portal/block/change_style.html new file mode 100644 index 00000000..757dc88b --- /dev/null +++ b/root/styles/prosilver/template/portal/block/change_style.html @@ -0,0 +1,7 @@ + +{$LR_BLOCK_H_L} {L_BOARD_STYLE}{$LR_BLOCK_H_R} + +
+{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/clock.html b/root/styles/prosilver/template/portal/block/clock.html new file mode 100644 index 00000000..862e7f75 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/clock.html @@ -0,0 +1,8 @@ + +
+
+ + + + +
\ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/donation.html b/root/styles/prosilver/template/portal/block/donation.html new file mode 100644 index 00000000..5120168b --- /dev/null +++ b/root/styles/prosilver/template/portal/block/donation.html @@ -0,0 +1,39 @@ + +{SITENAME} {L_DONATION_TEXT} +
+
+
+
+ + + + + + + + + + +
+
+
+{L_PAY_MSG} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/general_block.html b/root/styles/prosilver/template/portal/block/general_block.html new file mode 100644 index 00000000..cbcabcad --- /dev/null +++ b/root/styles/prosilver/template/portal/block/general_block.html @@ -0,0 +1,12 @@ + +{$C_BLOCK_H_L}
{L_PORTAL_INSTALL}{L_INFORMATION}
{$C_BLOCK_H_R} + +{$C_BLOCK_F_L}{$C_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/index.html b/root/styles/prosilver/template/portal/block/index.html new file mode 100644 index 00000000..c3c1935f --- /dev/null +++ b/root/styles/prosilver/template/portal/block/index.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/jumpbox.html b/root/styles/prosilver/template/portal/block/jumpbox.html new file mode 100644 index 00000000..480e30f8 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/jumpbox.html @@ -0,0 +1,21 @@ + + +
+ + +
+ +
+ + + + +
+ +
+ \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/latest_bots.html b/root/styles/prosilver/template/portal/block/latest_bots.html new file mode 100644 index 00000000..edb1a5c5 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/latest_bots.html @@ -0,0 +1,5 @@ + + + {last_visited_bots.BOT_NAME}
{last_visited_bots.LAST_VISIT_DATE} +
+ diff --git a/root/styles/prosilver/template/portal/block/latest_members.html b/root/styles/prosilver/template/portal/block/latest_members.html new file mode 100644 index 00000000..af3ce11f --- /dev/null +++ b/root/styles/prosilver/template/portal/block/latest_members.html @@ -0,0 +1,7 @@ + +{L_USERNAME} +{L_JOINED}
+ + {latest_members.USERNAME_FULL} + {latest_members.JOINED}
+ \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/links.html b/root/styles/prosilver/template/portal/block/links.html new file mode 100644 index 00000000..4e75bfa6 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/links.html @@ -0,0 +1,14 @@ + +{$LR_BLOCK_H_L} {L_LINKS}{$LR_BLOCK_H_R} +
+ +
+{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} diff --git a/root/styles/prosilver/template/portal/block/mini_calendar.html b/root/styles/prosilver/template/portal/block/mini_calendar.html new file mode 100644 index 00000000..e92b3102 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/mini_calendar.html @@ -0,0 +1,31 @@ + +{$LR_BLOCK_H_L} {L_MINI_CALENDAR}{$LR_BLOCK_H_R} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{U_PREV_MONTH}{L_MINI_CAL_MONTH}{U_NEXT_MONTH}
{L_MINI_CAL_SUN}{L_MINI_CAL_MON}{L_MINI_CAL_TUE}{L_MINI_CAL_WED}{L_MINI_CAL_THU}{L_MINI_CAL_FRI}{L_MINI_CAL_SAT}{L_MINI_CAL_SUN}
{mini_cal_row.mini_cal_days.MINI_CAL_DAY}
+{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/online.html b/root/styles/prosilver/template/portal/block/online.html new file mode 100644 index 00000000..3f4e1f02 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/online.html @@ -0,0 +1,3 @@ + +{TOTAL_USERS_ONLINE} ({L_ONLINE_EXPLAIN})
{RECORD_USERS}

{LOGGED_IN_USER_LIST} +
{L_LEGEND}: {LEGEND} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/online_friends.html b/root/styles/prosilver/template/portal/block/online_friends.html new file mode 100644 index 00000000..46fa0352 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/online_friends.html @@ -0,0 +1,15 @@ + +{L_FRIENDS_ONLINE}
+ + {friends_online.USERNAME_FULL}
+ + {L_NO_FRIENDS_ONLINE} +
+ +
+{L_FRIENDS_OFFLINE}
+ + {friends_offline.USERNAME_FULL}
+ + {L_NO_FRIENDS_OFFLINE} + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/random_member.html b/root/styles/prosilver/template/portal/block/random_member.html new file mode 100644 index 00000000..5a39a07f --- /dev/null +++ b/root/styles/prosilver/template/portal/block/random_member.html @@ -0,0 +1,20 @@ + + +
{random_member.USERNAME_FULL}
+ {random_member.AVATAR_IMG}
+ {random_member.RANK_TITLE}
+ {random_member.RANK_IMG}
+
+
+ {L_RND_JOIN}:{random_member.JOINED}
+ {L_RND_POSTS}:{random_member.USER_POSTS}
+ + {L_RND_OCC}:   {random_member.USER_OCC}
+ + + {L_RND_FROM}:   {random_member.USER_FROM}
+ + + {L_RND_WWW}
+ + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/search.html b/root/styles/prosilver/template/portal/block/search.html new file mode 100644 index 00000000..ebbba4a7 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/search.html @@ -0,0 +1,74 @@ + + +
+

+ +

+

+ + + + +

+
+

{L_SH_ADV}

diff --git a/root/styles/prosilver/template/portal/block/statistics.html b/root/styles/prosilver/template/portal/block/statistics.html new file mode 100644 index 00000000..0cde5a92 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/statistics.html @@ -0,0 +1,19 @@ + +{L_ST_TOP}
+{TOTAL_POSTS}
+{TOTAL_TOPICS}
+{L_ST_TOP_ANNS} {S_ANN}
+{L_ST_TOP_STICKYS} {S_SCT}
+{L_ST_TOT_ATTACH} {S_TOT_ATTACH}
+ +
+{TOPICS_PER_DAY}
+{POSTS_PER_DAY}
+{USERS_PER_DAY}
+{TOPICS_PER_USER}
+{POSTS_PER_USER}
+{POSTS_PER_TOPIC}
+
+ +{TOTAL_USERS}
+{NEWEST_USER} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/top_poster.html b/root/styles/prosilver/template/portal/block/top_poster.html new file mode 100644 index 00000000..6103d841 --- /dev/null +++ b/root/styles/prosilver/template/portal/block/top_poster.html @@ -0,0 +1,11 @@ + + +{$LR_BLOCK_H_L} {L_TOP_POSTER}{$LR_BLOCK_H_R} + {L_USERNAME} + {L_POSTS}
+ + {top_poster.USERNAME_FULL} + {top_poster.POSTER_POSTS}
+ +{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/block/user_menu.html b/root/styles/prosilver/template/portal/block/user_menu.html new file mode 100644 index 00000000..422819fd --- /dev/null +++ b/root/styles/prosilver/template/portal/block/user_menu.html @@ -0,0 +1,36 @@ + +
+ {USERNAME}
+ + {AVATAR_IMG} + + + +
{RANK_TITLE} +
{RANK_IMG} +
+
+ \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/blocks_bottom.html b/root/styles/prosilver/template/portal/blocks_bottom.html new file mode 100644 index 00000000..e33ceb11 --- /dev/null +++ b/root/styles/prosilver/template/portal/blocks_bottom.html @@ -0,0 +1,24 @@ + + + {$LR_BLOCK_H_L}
style="background: url('{blocks.ICON}') no-repeat; padding-left: 20px; white-space: nowrap;">{blocks.TITLE}
{$LR_BLOCK_H_R} + + {blocks.TEXT} + + + + + + + + + + + + + + + + + {$LR_BLOCK_F_L}{$LR_BLOCK_F_R} + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/blocks_left.html b/root/styles/prosilver/template/portal/blocks_left.html new file mode 100644 index 00000000..d4a55012 --- /dev/null +++ b/root/styles/prosilver/template/portal/blocks_left.html @@ -0,0 +1,24 @@ + + + {$LR_BLOCK_H_L}
style="background: url('{blocks.ICON}') no-repeat; padding-left: 20px; white-space: nowrap;">{blocks.TITLE}
{$LR_BLOCK_H_R} + + {blocks.TEXT} + + + + + + + + + + + + + + + + + {$LR_BLOCK_F_L}{$LR_BLOCK_F_R} + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/blocks_middle_bottom.html b/root/styles/prosilver/template/portal/blocks_middle_bottom.html new file mode 100644 index 00000000..c33e5933 --- /dev/null +++ b/root/styles/prosilver/template/portal/blocks_middle_bottom.html @@ -0,0 +1,24 @@ + + + {$LR_BLOCK_H_L}
style="background: url('{blocks.ICON}') no-repeat; padding-left: 20px; white-space: nowrap;">{blocks.TITLE}
{$LR_BLOCK_H_R} + + {blocks.TEXT} + + + + + + + + + + + + + + + + + {$LR_BLOCK_F_L}{$LR_BLOCK_F_R} + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/blocks_middle_top.html b/root/styles/prosilver/template/portal/blocks_middle_top.html new file mode 100644 index 00000000..a6629919 --- /dev/null +++ b/root/styles/prosilver/template/portal/blocks_middle_top.html @@ -0,0 +1,24 @@ + + + {$LR_BLOCK_H_L}
style="background: url('{blocks.ICON}') no-repeat; padding-left: 20px; white-space: nowrap;">{blocks.TITLE}
{$LR_BLOCK_H_R} + + {blocks.TEXT} + + + + + + + + + + + + + + + + + {$LR_BLOCK_F_L}{$LR_BLOCK_F_R} + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/blocks_right.html b/root/styles/prosilver/template/portal/blocks_right.html new file mode 100644 index 00000000..7a4aa2c9 --- /dev/null +++ b/root/styles/prosilver/template/portal/blocks_right.html @@ -0,0 +1,24 @@ + + + {$LR_BLOCK_H_L}
style="background: url('{blocks.ICON}') no-repeat; padding-left: 20px; white-space: nowrap;">{blocks.TITLE}
{$LR_BLOCK_H_R} + + {blocks.TEXT} + + + + + + + + + + + + + + + + + {$LR_BLOCK_F_L}{$LR_BLOCK_F_R} + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/blocks_top.html b/root/styles/prosilver/template/portal/blocks_top.html new file mode 100644 index 00000000..ec132c03 --- /dev/null +++ b/root/styles/prosilver/template/portal/blocks_top.html @@ -0,0 +1,24 @@ + + + {$LR_BLOCK_H_L}
style="background: url('{blocks.ICON}') no-repeat; padding-left: 20px; white-space: nowrap;">{blocks.TITLE}
{$LR_BLOCK_H_R} + + {blocks.TEXT} + + + + + + + + + + + + + + + + + {$LR_BLOCK_F_L}{$LR_BLOCK_F_R} + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/index.html b/root/styles/prosilver/template/portal/index.html new file mode 100644 index 00000000..c3c1935f --- /dev/null +++ b/root/styles/prosilver/template/portal/index.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/portal_body.html b/root/styles/prosilver/template/portal/portal_body.html new file mode 100644 index 00000000..aacc1095 --- /dev/null +++ b/root/styles/prosilver/template/portal/portal_body.html @@ -0,0 +1,48 @@ + + + + + + +
+
+ {L_INFORMATION}: {PORTAL_VERSION_CHECK} +
+
+ + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + +
+
+ +
+ + + + + \ No newline at end of file diff --git a/root/styles/prosilver/theme/portal.css b/root/styles/prosilver/theme/portal.css new file mode 100644 index 00000000..d6c59910 --- /dev/null +++ b/root/styles/prosilver/theme/portal.css @@ -0,0 +1,52 @@ +/* inner corners */ + +span.portal-corners-top-inner { + margin: 0 -5px; +} + +span.portal-corners-bottom-inner { + margin: 0 -5px; + clear: both; +} + +span.portal-corners-top-inner, span.portal-corners-bottom-inner{ + font-size: 1px; + line-height: 1px; + display: block; + height: 5px; + background-repeat: no-repeat; +} + +/* main menu, user menu and the links */ + +.portal-navigation{ +width: auto; +} + +.portal-navigation ul{ +list-style-type: none; +margin: 0; +padding: 0; +margin-bottom: 8px; /*bottom spacing between each UL and rest of content*/ +} + +.portal-navigation ul li{ +padding-bottom: 2px; /*bottom spacing between menu items*/ +} + +.portal-navigation ul li a{ +background-image: url("{T_THEME_PATH}/images/portal/arrowbullet.gif"); +background-repeat: no-repeat; +background-position: center left; /*custom bullet list image*/ +display: block; +padding: 2px 0; +padding-left: 19px; /*link text is indented 19px*/ +font-weight: bold; +font-size: 90%; +} + +.portal-navigation div.menutitle{ +padding: 1px 0; +font: bold 90% 'Trebuchet MS', 'Lucida Grande', Arial, sans-serif; +font-size: 12px; +} \ No newline at end of file