PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i5h-3LL

HOME


5h-3LL 1.0
DIR: /srv/http/adent.cz/cmsmadesimple.adent.cz/lib
/srv/http/adent.cz/cmsmadesimple.adent.cz/lib/
Upload File:
Current File : /srv/http/adent.cz/cmsmadesimple.adent.cz/lib/test.functions.php
<?php // -*- mode:php; tab-width:4; indent-tabs-mode:t; c-basic-offset:4; -*-
#CMS - CMS Made Simple
#(c)2004-2008 by Ted Kulp (ted@cmsmadesimple.org)
#This project's homepage is: http://cmsmadesimple.org
#
#This program is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#$Id: test.functions.php 5128 2008-10-08 21:14:46Z alby $

/**
 * Handles test functions and values for CMSMS
 *
 * @package CMS
 */

/**
 * Array with PHP driver => DB server
 *
 * @return array
*/
function getSupportedDBDriver()
{
	return array('mysqli'=>'mysql', 'mysql'=>'mysql', 'pgsql'=>'pgsql');
}

/**
 * Array with minimum and recommended values
 *
 * @return array
 * @var string $property
*/
function getTestValues( $property )
{
	$range = array(
		'php_version'			=> array('minimum'=>'4.3.0', 'recommended'=>'5.0.4'),
		'gd_version'			=> array('minimum'=>2),
		'memory_limit'			=> array('minimum'=>'16M', 'recommended'=>'24M'),
		'max_execution_time'	=> array('minimum'=>30, 'recommended'=>60),
		'post_max_size'			=> array('minimum'=>'2M', 'recommended'=>'10M'),
		'upload_max_filesize'	=> array('minimum'=>'2M', 'recommended'=>'10M'),

		'mysql_version'			=> array('minimum'=>'3.23', 'recommended'=>'4.1'),
		'pgsql_version'			=> array('minimum'=>'7.4', 'recommended'=>'8'),
		'sqlite_version'		=> array('minimum'=>'', 'recommended'=>''),
	);

	if(array_key_exists($property, $range))
	{
		if(empty($range[$property]['recommended']))
		{
			$range[$property]['recommended'] = $range[$property]['minimum'];
		}
		return array($range[$property]['minimum'], $range[$property]['recommended']);
	}

	return array();
}

/**
 * @return array
 * @var mixed   $result
 * @var boolean $set
*/
function testGlobal( $result, $set = false )
{
	static $continueon = true;
	static $special_failed = false;

	if( ($set) && (is_array($result)) )
	{
		$return = array($continueon, $special_failed);
		list($continueon, $special_failed) = $result;
		return $return;
	}

	if($result === '')
	{
		return array($continueon, $special_failed);
	}
	elseif($result == true)
	{
		$continueon = false;
	}
	elseif($result == false)
	{
		$special_failed = true;
	}

	return array($continueon, $special_failed);
}

/**
 * @return boolean
 * @var string $test
*/
function extension_loaded_or( $test )
{
	$a = extension_loaded(strtolower($test));
	$b = extension_loaded(strtoupper($test));
	return (bool)($a | $b);
}

/**
 * @return string
 * @var object  $test
 * @var boolean $required
 * @var string  $message
 * @var string  $error_fragment
 * @var string  $error
*/
function getTestReturn( &$test, $required, $message = '', $error_fragment = '', $error = '' )
{
	switch($test->res)
	{
		case 'green':
			list($test->continueon, $test->special_failed) = testGlobal('');
			$test->res_text = lang('success');
			break;
		case 'yellow':
		case 'red':
			list($test->continueon, $test->special_failed) = testGlobal($required);
			if($test->res == 'yellow')
			{
				$test->res_text = lang('caution');
			}
			elseif($test->res == 'red')
			{
				$test->res_text = lang('failure');
			}

			if(trim($message) != '')
			{
				$test->message = $message;
			}
			if(trim($error_fragment) != '')
			{
				$test->error_fragment = $error_fragment;
			}
			if(trim($error) != '')
			{
				$test->error = $error;
			}
			break;
	}

	return true;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $db
 * @var string  $message
*/
function & testSupportedDatabase( $required, $title, $db = false, $message = '' )
{
	$drivers = getSupportedDBDriver();

//TODO?
	if($db)
	{
		$serverInfo = $db->ServerInfo();
		$_test = testConfig('', 'dbms');
		if(! empty($_test->value))
		{
			$dbms = $_test->value;
			list($minimum, $recommended) = getTestValues($drivers[$dbms].'_version');
			$test = testVersionRange('', $title, $serverInfo['version'], $message, $minimum, $recommended, false);
			$test->opt = $serverInfo['description'];
			$test->res = 'green';
			getTestReturn($test, $required);
			return $test;
		}
		$test =&new StdClass();
		$test->title = $title;
		if($required)
		{
			$test->res = 'red';
		}
		else
		{
			$test->res = 'yellow';
		}
		getTestReturn($test, $required, $message);
		return $test;
	}
//TODO

	$test =&new StdClass();
	$test->title = $title;

	if(count($drivers) > 0)
	{
		$return = array();
		foreach($drivers as $driver=>$server)
		{
			if(extension_loaded_or($driver))
			{
				$return[] = $driver;
			}
		}

		$test->value = implode(',', $return);
		$test->secondvalue = $return;

		if(count($return) > 0)
		{
			$test->res = 'green';
		}
		else
		{
			if($required)
			{
				$test->res = 'red';
			}
			else
			{
				$test->res = 'yellow';
			}
		}
		getTestReturn($test, $required, $message, 'DB_driver_missing');
	}
	else
	{
		$test->res = 'red';
		getTestReturn($test, $required, $message, 'DB_driver_missing', lang('no_db_driver'));
	}

	return $test;
}

/**
 * @return string
 * @var integer $info
*/
function getEmbedPhpInfo( $info = INFO_ALL )
{
	/**
	 * callback function to eventually add an extra space in passed <td class="v">...</td>
	 * after a ";" or "@" char to let the browser split long lines nicely
	 */
	function _sysinfo_phpinfo_v_callback($matches)
	{
		$matches[2] = preg_replace('%(?<!\s)([;@])(?!\s)%', "$1 ", $matches[2]);
		return $matches[1].$matches[2].$matches[3];
	}

	ob_start();
	phpinfo($info);
	$output = preg_replace(array('/^.*<body[^>]*>/is', '/<\/body[^>]*>.*$/is'), '', ob_get_clean(), 1);

	$output = preg_replace('/width="[0-9]+"/i', 'width="85%"', $output);
	$output = str_replace('<table border="0" cellpadding="3" width="85%">', '<table class="phpinfo">', $output);
	$output = str_replace('<hr />', '', $output);
	$output = str_replace('<tr class="h">', '<tr>', $output);
	$output = str_replace('<a name=', '<a id=', $output);
	$output = str_replace('<font', '<span', $output);
	$output = str_replace('</font', '</span', $output);
	$output = str_replace(',', ', ', $output);
	// match class "v" td cells an pass them to callback function
	return preg_replace_callback('%(<td class="v">)(.*?)(</td>)%i', '_sysinfo_phpinfo_v_callback', $output);
}

/**
 * @return mixed
 * @var string $module
*/
function getApacheModules( $module = false )
{
	if(function_exists('apache_get_modules'))
	{
		$modules = apache_get_modules();
		if($module)
		{
			if(in_array($module, $modules)) return true;
			else return false;
		}
		return $modules;
	}

	return false;
}

/**
 * @return object
 * @var string $title
 * @var string $value
 * @var string $return
 * @var string $message
 * @var string $error_fragment	
 * @var string $error
*/
function & testDummy( $title, $value, $return, $message = '', $error_fragment = '', $error = '' )
{
	$test =&new StdClass();
	$test->title = $title;
	$test->value = $value;
	$test->secondvalue = null;
	$test->res = $return;

	getTestReturn($test, '', $message, $error_fragment, $error);
	return $test;
}

/**
 * @return object
 * @var string $title
 * @var string $varname
 * @var string $testfunc
 * @var string $message
*/
function & testConfig( $title, $varname, $testfunc = '', $message = '' )
{
	global $gCms;
	$config = $gCms->config;

	if( (isset($config[$varname])) && (is_bool($config[$varname])) )
	{
		$value = (true == $config[$varname]) ? 'true' : 'false';
	}
	else if(! empty($config[$varname]))
	{
		$value = $config[$varname];
		if(! empty($testfunc))
		{
			$test = $testfunc('', $title, $value);
		}
	}
	else
	{
		$value = '';
	}

	if(! isset($test))
	{
		$test =&new StdClass();
		$test->title = $title;
		$test->value = $value;
		$test->secondvalue = null;
		if(trim($message) != '')
		{
			$test->message = $message;
		}
	}

	return $test;
}

/**
 * @return boolean
 * @var object $test
 * @var string $varname
 * @var string $type
*/
function testIni( &$test, $varname, $type )
{
	$error = null;
	$str = ini_get($varname);

	switch($type)
	{
		case 'boolean':
			$str = (bool) $str;
			break;
		case 'integer':
			if($str === '') break;
			$str = (int) $str;
			break;
		case 'string':
			$str = (string) $str;
			if(empty($str))
			{
				#$error = lang('could_not_retrieve_a_value');
				if((string) get_cfg_var($varname) != '')
				{
					$str = (string) get_cfg_var($varname);
					#$error .= lang('displaying_the_value_originally');
				}
			}
			break;
	}

	$test->ini_val = $str;
	$test->error = $error;
	return true;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var mixed   $var
 * @var string  $message
 * @var boolean $ini
 * @var boolean $empty_is_ok
 * @var string  $error_fragment
*/
function & testInteger( $required, $title, $var, $message = '', $ini = true, $empty_is_ok = true, $error_fragment = '' )
{
	$test =&new StdClass();
	$test->title = $title;

	if($ini)
	{
		testIni($test, $var, 'integer');
	}
	else
	{
		$test->ini_val = $var;
	}

	if($test->ini_val === '')
	{
		if($empty_is_ok) $test->value = lang('on');
		else $test->value = 0;
	}
	else
	{
		$test->value = $test->ini_val;
	}

	if(empty($test->value))
	{
		if($required)
		{
			$test->res = 'red';
		}
		else
		{
			$test->res = 'yellow';
		}
	}
	else
	{
		$test->res = 'green';
	}

	getTestReturn($test, $required, $message, $error_fragment);
	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var mixed   $var
 * @var string  $message
 * @var boolean $ini
 * @var boolean $code_empty
 * @var boolean $code_not_empty
 * @var string  $error_fragment
*/
function & testString( $required, $title, $var, $message = '', $ini = true, $code_empty = 'green', $code_not_empty = 'yellow', $error_fragment = '' )
{
	$test =&new StdClass();
	$test->title = $title;

	if($ini)
	{
		testIni($test, $var, 'string');
	}
	else
	{
		$test->ini_val = $var;
	}

	$test->value = $test->ini_val;
	if(empty($test->value))
	{
		$test->res = $code_empty;
	}
	else
	{
		$test->value = str_replace(',', ', ', $test->value);
		$test->res = $code_not_empty;
	}

	getTestReturn($test, $required, $message, $error_fragment);
	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var mixed   $var
 * @var string  $message
 * @var boolean $ini
 * @var boolean $negative_test
 * @var string  $error_fragment
*/
function & testBoolean( $required, $title, $var, $message = '', $ini = true, $negative_test = false, $error_fragment = '' )
{
	$test =&new StdClass();
	$test->title = $title;

	if($ini)
	{
		testIni($test, $var, 'boolean');
	}
	else
	{
		$test->ini_val = $var;
	}
	$test->ini_val = $negative_test ? (! (bool) $test->ini_val) : (bool) $test->ini_val;

	if($test->ini_val == false)
	{
		$test->value = $negative_test ? lang('on') : lang('off');
		$test->secondvalue = $negative_test ? lang('true') : lang('false');
		if($required)
		{
			$test->res = 'red';
		}
		else
		{
			$test->res = 'yellow';
		}
	}
	else
	{
		$test->value = $negative_test ? lang('off') : lang('on');
		$test->secondvalue = $negative_test ? lang('false') : lang('true');
		$test->res = 'green';
	}

	getTestReturn($test, $required, $message, $error_fragment);
	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var mixed   $var
 * @var string  $message
 * @var mixed   $minimum
 * @var mixed   $recommended
 * @var boolean $ini
 * @var int     $unlimited
 * @var string  $error_fragment
*/
function & testVersionRange( $required, $title, $var, $message = '', $minimum, $recommended, $ini = true, $unlimited = null, $error_fragment='' )
{
	$test =& new StdClass();
	$test->title = $title;

	if($ini)
	{
		testIni($test, $var, 'string');
		if(isset($test->error))
		{
			$required = false;
		}
	}
	else
	{
		$test->ini_val = $var;
	}

	$test->value = $test->ini_val;
	$test->secondvalue = null;

	if( (! is_null($unlimited)) && ($test->ini_val == (string) $unlimited) )
	{
		$test->value = lang('unlimited');
		$test->res = 'green';
		getTestReturn($test, $required);
	}
	elseif(version_compare($test->ini_val, $minimum) < 0)
	{
		$test->res = 'red';
		getTestReturn($test, $required, $message, $error_fragment);
	}
	elseif(version_compare($test->ini_val, $recommended) < 0)
	{
		$test->res = 'yellow';
		getTestReturn($test, false, $message, $error_fragment);
	}
	else
	{
		$test->res = 'green';
		getTestReturn($test, $required);
	}

	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var mixed   $var
 * @var string  $message
 * @var mixed   $minimum
 * @var mixed   $recommended
 * @var boolean $ini
 * @var boolean $test_as_bytes
 * @var int     $unlimited
 * @var string  $error_fragment
*/
function & testRange( $required, $title, $var, $message = '', $minimum, $recommended, $ini = true, $test_as_bytes = false, $unlimited = null, $error_fragment = '' )
{
	$test =& new StdClass();
	$test->title = $title;

	if($ini)
	{
		testIni($test, $var, 'string');
		if(isset($test->error))
		{
			$required = false;
		}
	}
	else
	{
		$test->ini_val = $var;
	}

	$test->value = $test->ini_val;
	$test->secondvalue = null;
	if($test_as_bytes)
	{
		$test->ini_val = returnBytes($test->ini_val);
		$minimum = returnBytes($minimum);
		$recommended = returnBytes($recommended);
	}

	if( (! is_null($unlimited)) && ((int) $test->ini_val == (int) $unlimited) )
	{
		$test->value = lang('unlimited');
		$test->res = 'green';
		getTestReturn($test, $required);
	}
	elseif((int) $test->ini_val < $minimum)
	{
		$test->res = 'red';
		getTestReturn($test, $required, $message, $error_fragment);
	}
	elseif((int) $test->ini_val < $recommended)
	{
		$test->res = 'yellow';
		getTestReturn($test, false, $message, $error_fragment);
	}
	else
	{
		$test->res = 'green';
		getTestReturn($test, $required);
	}

	return $test;
}

/**
 * @return int
 * @var string $val
 */
function returnBytes( $val )
{
	if(is_string($val) && $val != '')
	{
		$val = trim($val);
		$last = strtolower(substr($val, strlen($val/1), 1));
		switch($last)
		{
			case 'g':
				$val *= 1024;
			case 'm':
				$val *= 1024;
			case 'k':
				$val *= 1024;
		}
	}

	return (int) $val;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $umask
 * @var string  $message
 * @var boolean $debug
 * @var string  $dir
 * @var string  $file
 * @var string  $data
 */
function & testUmask( $required, $title, $umask, $message = '', $debug = false, $dir = '', $file = '_test_umask_', $data = 'this is a test' )
{
	$test =& new StdClass();
	$test->title = $title;

	if(empty($dir))
	{
		$dir = TMP_CACHE_LOCATION;
	}

	$_test = true;
	if($debug)
	{
		if( (! is_dir($dir)) || (! is_writable($dir)) ) $_test = false;
	}
	else
	{
		if( (! @is_dir($dir)) || (! @is_writable($dir)) ) $_test = false;
	}


	if(! $_test)
	{
		$test->res = 'red';
		getTestReturn($test, $required, $message, 'Directory_not_writable', lang('errordirectorynotwritable').' ('.$dir .')');
		return $test;
	}
	$_test = true;

	clearstatcache();
	$test->value = $dir;
	$test->secondvalue = substr(sprintf('%o', @fileperms($dir)), -4);

	$test_file = $dir . DIRECTORY_SEPARATOR . $file;
	if(file_exists($test_file)) @unlink($test_file);

	if($debug)
	{
		umask(octdec($umask));
		$fp = fopen($test_file, "w");
	}
	else
	{
		@umask(octdec($umask));
		$fp = @fopen($test_file, "w");
	}

	if($fp !== false)
	{
		$_return = '';
		if($debug) $_return = fwrite($fp, $data);
		else       $_return = @fwrite($fp, $data);
		@fclose($fp);

		$_opt = permission_stat($test_file, $debug);
		if($_opt == false)
		{
			if($required)
			{
				$test->res = 'red';
			}
			else
			{
				$test->res = 'yellow';
			}
			getTestReturn($test, $required, $message, 'Can.27t_create_file', lang('errorcantcreatefile').' ('.$test_file.')');
			return $test;
		}

		$test->opt = $_opt;

		if($debug) unlink($test_file);
		else      @unlink($test_file);
		if(! empty($_return))
		{
			$test->res = 'green';
			getTestReturn($test, $required);
			return $test;
		}
	}

	$test->res = 'red';
	getTestReturn($test, $required, $message, 'Can.27t_create_file', lang('errorcantcreatefile').' ('.$test_file.')');
	return $test;
}



/**
 * @return array
 * @var string  $file
 * @var boolean $debug
 */
function permission_stat( $file, $debug = false )
{
	$opt = array();
	clearstatcache();
	$filestat = stat($file);
	if($filestat == false)
	{
		return false;
	}

	clearstatcache();
	if($debug) $mode = fileperms($file);
	else       $mode = @fileperms($file);

	$opt['permsdec'] = substr(sprintf('%o', $mode), -4);
	$opt['permsstr'] = permission_octal2string($mode);

	// functions not available on WAMP systems
	if( (function_exists('posix_getpwuid')) && (function_exists('posix_getgrgid')) )
	{
		if($debug)
		{
			$userinfo = posix_getpwuid($filestat[4]);
			$groupinfo = posix_getgrgid($filestat[5]);
		}
		else
		{
			$userinfo = @posix_getpwuid($filestat[4]);
			$groupinfo = @posix_getgrgid($filestat[5]);
		}
		$opt['username'] = isset($userinfo['name']) ? $userinfo['name'] : lang('unknown');
		$opt['usergroup'] = isset($groupinfo['name']) ? $groupinfo['name'] : lang('unknown');
	}
	else
	{
		$opt['username'] = lang('unknown');
		$opt['usergroup'] = lang('unknown');
	}

	return $opt;
}

/**
 * @return string
 * @var octal $mode
 */
function permission_octal2string( $mode )
{
	if(($mode & 0xC000) === 0xC000) {
		$type = 's';
	} elseif(($mode & 0xA000) === 0xA000) {
		$type = 'l';
	} elseif(($mode & 0x8000) === 0x8000) {
		$type = '-';
	} elseif(($mode & 0x6000) === 0x6000) {
		$type = 'b';
	} elseif(($mode & 0x4000) === 0x4000) {
		$type = 'd';
	} elseif(($mode & 0x2000) === 0x2000) {
		$type = 'c';
	} elseif(($mode & 0x1000) === 0x1000) {
		$type = 'p';
	} else{
		$type = '?';
	}

	$owner  = ($mode & 00400) ? 'r' : '-';
	$owner .= ($mode & 00200) ? 'w' : '-';
	if($mode & 0x800) {
		$owner .= ($mode & 00100) ? 's' : 'S';
	} else {
		$owner .= ($mode & 00100) ? 'x' : '-';
	}

	$group  = ($mode & 00040) ? 'r' : '-';
	$group .= ($mode & 00020) ? 'w' : '-';
	if($mode & 0x400) {
		$group .= ($mode & 00010) ? 's' : 'S';
	} else {
		$group .= ($mode & 00010) ? 'x' : '-';
	}

	$other  = ($mode & 00004) ? 'r' : '-';
	$other .= ($mode & 00002) ? 'w' : '-';
	if($mode & 0x200) {
		$other .= ($mode & 00001) ? 't' : 'T';
	} else {
		$other .= ($mode & 00001) ? 'x' : '-';
	}

	return $type . $owner . $group . $other;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $message
 * @var boolean $debug
 * @var string  $dir
 * @var string  $file
*/
function & testCreateDirAndFile( $required, $title, $message = '', $debug = false, $dir = '_test_dir_file_', $file = '_test_dir_file_' )
{
	$test =& new StdClass();
	$test->title = $title;
	$dir = cms_join_path(TMP_CACHE_LOCATION, $dir);
	$file = cms_join_path($dir, $file);

	if($debug)
	{
		if(file_exists($file)) unlink($file);
		if( (is_dir($dir)) && (false !== strpos($dir, dirname(dirname(__FILE__)))) ) rmdir($dir);

		if(! mkdir($dir)) $test->error = lang('errordirectorynotwritable') .' ('. $dir . ')';
		if(! touch($file)) $test->error = lang('errorcantcreatefile') .' ('. $file . ')';
		$_test = file_exists($file);
	}
	else
	{
		if(file_exists($file)) @unlink($file);
		if( (@is_dir($dir)) && (false !== strpos($dir, dirname(dirname(__FILE__)))) ) @rmdir($dir);

		@mkdir($dir);
		@touch($file);
		$_test = file_exists($file);
		@unlink($file);
		@rmdir($dir);
	}

	if(! $_test)
	{
		$test->res = 'red';
		getTestReturn($test, $required, $message, 'Can.27t_create_file');
	}
	else
	{
		$test->res = 'green';
		getTestReturn($test, $required);
	}

	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $dir
 * @var string  $message
 * @var boolean $quick
 * @var boolean $debug
 * @var string  $file
 * @var string  $data
*/
function & testDirWrite( $required, $title, $dir, $message = '', $quick = 0, $debug = false, $file = '_test_dir_write_', $data = 'this is a test' )
{
	$test =& new StdClass();
	$test->title = $title;

	if(empty($dir))
	{
		$dir = TMP_CACHE_LOCATION;
	}
	$test->value = $dir;
	$test->secondvalue = substr(sprintf('%o', @fileperms($dir)), -4);

	$_test = true;
	if($debug)
	{
		if( (! is_dir($dir)) || (! is_writable($dir)) ) $_test = false;
	}
	else
	{
		if( (! @is_dir($dir)) || (! @is_writable($dir)) ) $_test = false;
	}


	if($_test)
	{
		if($quick)
		{
			// we're only doing the quick test which sucks
			$test->res = 'green';
			getTestReturn($test, $required);
			return $test;
		}

		$test_file = $dir . DIRECTORY_SEPARATOR . $file;
		if(file_exists($test_file))
		{
			if($debug) unlink($test_file);
			else      @unlink($test_file);
		}

		if($debug) $fp = fopen($test_file, "w");
		else       $fp = @fopen($test_file, "w");
		if($fp !== false)
		{
			$_return = '';
//			flock($fp, LOCK_EX); //no on NFS filesystem
			if($debug) $_return = fwrite($fp, $data);
			else       $_return = @fwrite($fp, $data);
//			flock($fp, LOCK_UN);
			@fclose($fp);

			if(! $debug) @unlink($test_file);

			if(! empty($_return))
			{
				$test->res = 'green';
				getTestReturn($test, $required);
				return $test;
			}
		}
	}

	$test->res = 'red';
	getTestReturn($test, $required, $message, 'Directory_not_writable', lang('errordirectorynotwritable').' ('.$dir.')');
	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $file
 * @var string  $message
 * @var boolean $debug
*/
function & testFileWritable( $required, $title, $file, $message = '', $debug = false )
{
	$test =& new StdClass();
	$test->title = $title;

	if(empty($file))
	{
		$test->error = lang('errorfilenot');
		return $test;
	}

	$test->value = $file;
	$test->secondvalue = substr(sprintf('%o', @fileperms($file)), -4);

	$_test = true;
	if($debug)
	{
		if( (! is_file($file)) || (! is_writable($file)) ) $_test = false;
	}
	else
	{
		if( (! @is_file($file)) || (! @is_writable($file)) ) $_test = false;
	}


	if($_test)
	{
		$_test = file_exists($file);

		if($debug) $fp = fopen($file, "a");
		else       $fp = @fopen($file, "a");
		if($fp !== false)
		{
			@fclose($fp);
			if(! $_test) @unlink($file);

			$test->res = 'green';
			getTestReturn($test, $required);
			return $test;
		}
	}

	$test->res = 'red';
	getTestReturn($test, $required, $message, 'File_not_writable', lang('errorfilenotwritable').' ('.$file.')');
	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $dir
 * @var string  $message
 * @var boolean $debug
 * @var int     $timeout
 * @var string  $search
*/
function & testRemoteFile( $required, $title, $url = '', $message = '', $debug = false, $timeout = 10, $search = 'cmsmadesimple' )
{
	if(empty($url))
	{
		$url = 'http://dev.cmsmadesimple.org/latest_version.php';
	}

	$test =& new StdClass();
	$test->title = $title;
	//$test->value = $url;

	if(! $url_info = parse_url($url))
	{
		// Relative or invalid URL?
		$test->res = 'red';
		getTestReturn($test, $required, '', '', lang('invalid_test'));
		return $test;
	}

	switch($url_info['scheme'])
	{
		case 'https':
			$scheme = 'ssl://';
			$port = (isset($url_info['port'])) ? $url_info['port'] : 443;
			break;
		case 'http':
		default:
			$scheme = '';
			$port = (isset($url_info['port'])) ? $url_info['port'] : 80;
	}
	$complete_url  = (isset($url_info['path'])) ? $url_info['path'] : '/';
	$complete_url .= (isset($url_info['query'])) ? '?'.$url_info['query'] : '';


	// TEST FSOCKOPEN
	if($debug) $handle = fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, $timeout);
	else       $handle = @fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, $timeout);
	if($handle)
	{
		$out  = "GET " . $complete_url . " HTTP/1.1\r\n";
		$out .= "Host: " . $url_info['host'] . "\r\n";
		$out .= "Connection: Close\r\n\r\n";
		if($debug)
		{
			fwrite($handle, $out);
			stream_set_blocking($handle, 1);
			stream_set_timeout($handle, $timeout);
			$_info = stream_get_meta_data($handle);
		}
		else
		{
			@fwrite($handle, $out);
			@stream_set_blocking($handle, 1);
			@stream_set_timeout($handle, $timeout);
			$_info = @stream_get_meta_data($handle);
		}

		$content_fsockopen = '';
		while( (! feof($handle)) && (! $_info['timed_out']) )
		{
			if($debug) $content_fsockopen .= fgets($handle, 128);
			else       $content_fsockopen .= @fgets($handle, 128);
			$_info = stream_get_meta_data($handle);
		}
		@fclose($handle);

		if($_info['timed_out'])
		{
			$test->opt['fsockopen']['ok'] = 1;
			$test->opt['fsockopen']['res'] = 'yellow';
			$test->opt['fsockopen']['res_text'] = lang('caution');
			$test->opt['fsockopen']['message'] = lang('remote_connection_timeout');
		}
		else
		{
			$test->opt['fsockopen']['ok'] = 0;
		}
	}
	else
	{
		$test->res = 'red';
		getTestReturn($test, $required, '', '', lang('connection_error'));
		return $test;
	}

	if($test->opt['fsockopen']['ok'] < 1)
	{
		if( (! empty($search)) && (false !== strpos($content_fsockopen, $search)) )
		{
			$test->opt['fsockopen']['res'] = 'green';
			$test->opt['fsockopen']['res_text'] = lang('success');
			$test->opt['fsockopen']['message'] = lang('search_string_find');
		}
		elseif(false !== strpos($content_fsockopen, '200 OK'))
		{
			$test->opt['fsockopen']['ok'] = 1;
			$test->opt['fsockopen']['res'] = 'yellow';
			$test->opt['fsockopen']['res_text'] = lang('caution');
			$test->opt['fsockopen']['message'] = lang('remote_response_ok');
		}
		elseif(false !== strpos($content_fsockopen, '404 Not Found'))
		{
			$test->opt['fsockopen']['ok'] = 1;
			$test->opt['fsockopen']['res'] = 'yellow';
			$test->opt['fsockopen']['res_text'] = lang('caution');
			$test->opt['fsockopen']['message'] = lang('remote_response_404');
		}
		else
		{
			$test->opt['fsockopen']['ok'] = 2;
			$test->opt['fsockopen']['res'] = 'red';
			$test->opt['fsockopen']['res_text'] = lang('failure');
			$test->opt['fsockopen']['message'] = lang('remote_response_error');
		}
	}


	// TEST FOPEN
	$test->opt['fopen']['ok'] = 2;
	$result = testBoolean('', '', 'allow_url_fopen', '', true, false);
	if($result->res == 'green')
	{
		if($debug) $handle = fopen($url, 'rb');
		else       $handle = @fopen($url, 'rb');
		if(false == $handle)
		{
			$test->opt['fopen']['ok'] = 2;
			$test->opt['fopen']['res'] = 'red';
			$test->opt['fopen']['res_text'] = lang('failure');
			$test->opt['fopen']['message'] = lang('connection_failed');
		}
		else
		{
			if($debug)
			{
				stream_set_blocking($handle, 1);
				stream_set_timeout($handle, $timeout);
				$_info = stream_get_meta_data($handle);
			}
			else
			{
				@stream_set_blocking($handle, 1);
				@stream_set_timeout($handle, $timeout);
				$_info = @stream_get_meta_data($handle);
			}

			$content_fopen = '';
			while( (! feof($handle)) && (! $_info['timed_out']) )
			{
				if($debug) $content_fopen .= fgets($handle, 128);
				else       $content_fopen .= @fgets($handle, 128);
				$_info = stream_get_meta_data($handle);
			}
			@fclose($handle);

			if($_info['timed_out'])
			{
				$test->opt['fopen']['ok'] = 1;
				$test->opt['fopen']['res'] = 'yellow';
				$test->opt['fopen']['res_text'] = lang('caution');
				$test->opt['fopen']['message'] = lang('remote_connection_timeout');
			}
			else
			{
				$test->opt['fopen']['ok'] = 0;
			}
		}
	}
	else
	{
		$test->opt['fopen']['res'] = 'red';
		$test->opt['fopen']['res_text'] = lang('failure');
		$test->opt['fopen']['message'] = lang('test_allow_url_fopen_failed');
	}


	if($test->opt['fopen']['ok'] < 1)
	{
		if( (! empty($search)) && (false !== strpos($content_fopen, $search)) )
		{
			$test->opt['fopen']['res'] = 'green';
			$test->opt['fopen']['res_text'] = lang('success');
			$test->opt['fopen']['message'] = lang('search_string_find');
		}
		elseif(false !== strpos($content_fopen, '200 OK'))
		{
			$test->opt['fopen']['ok'] = 1;
			$test->opt['fopen']['res'] = 'yellow';
			$test->opt['fopen']['res_text'] = lang('caution');
			$test->opt['fopen']['message'] = lang('remote_response_ok');
		}
		elseif(false !== strpos($content_fopen, '404 Not Found'))
		{
			$test->opt['fopen']['ok'] = 1;
			$test->opt['fopen']['res'] = 'yellow';
			$test->opt['fopen']['res_text'] = lang('caution');
			$test->opt['fopen']['message'] = lang('remote_response_404');
		}
		else
		{
			$test->opt['fopen']['ok'] = 2;
			$test->opt['fopen']['res'] = 'red';
			$test->opt['fopen']['res_text'] = lang('failure');
			$test->opt['fopen']['message'] = lang('remote_response_error');
		}
	}


	$result = $test->opt['fsockopen']['ok'] + $test->opt['fopen']['ok'];
	switch($result)
	{
		case 0:
				$test->res = 'green';
				getTestReturn($test, $required);
				break;
		case 1:
		case 2:
		case 3:
				$test->res = 'yellow';
				getTestReturn($test, false, '', 'Connection_error');
				break;
		default:
				$test->res = 'red';
				getTestReturn($test, $required, $message, 'Connection_error');
	}

	return $test;
}


/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $file
 * @var string  $checksum
 * @var string  $message
 * @var string  $formattime
 * @var boolean $debug
*/
function & testFileChecksum( $required, $title, $file, $checksum, $message = '', $formattime = '%c', $debug = false )
{
	$test =& new StdClass();
	$test->title = $title;
	$test->value = $file;

	if(is_dir($file))
	{
		$test->secondvalue = lang('is_directory');
		$test->res = 'yellow';
		getTestReturn($test, '', '', '', lang('is_directory').' ('.$file.')');
		return $test;
	}

	if(! file_exists($file))
	{
		$test->secondvalue = lang('nofiles');
		$test->res = 'red';
		getTestReturn($test, '', $message, '', lang('nofiles').' ('.$file.')');
		return $test;
	}

	if($debug) $_test = is_readable($file);
	else       $_test = @is_readable($file);
	if(! $_test)
	{
		$test->secondvalue = lang('is_readable_false');
		$test->res = 'yellow';
		getTestReturn($test, '', '', '', lang('is_readable_false').' ('.$file.')');
		return $test;
	}

	if($debug) $file_checksum = md5_file($file);
	else       $file_checksum = @md5_file($file);
	if(false == $file_checksum)
	{
		$test->secondvalue = lang('not_checksum');
		$test->res = 'yellow';
		getTestReturn($test, '', '', '', lang('not_checksum').' ('.$file.')');
		return $test;
	}

	if($file_checksum == $checksum)
	{
		$test->secondvalue = lang('checksum_match');
		$test->res = 'green';
		getTestReturn($test, $required);
		return $test;
	}

	if($debug) $test->opt['file_timestamp'] = filemtime($file);
	else       $test->opt['file_timestamp'] = @filemtime($file);
	$test->opt['format_timestamp'] = $formattime;

	$test->secondvalue = lang('checksum_not_match');
	$test->res = 'red';
	getTestReturn($test, $required, $message, '', lang('checksum_not_match'));
	return $test;
}

/**
 * @return string
 * @var string $sess_path
*/
function testSessionSavePath( $sess_path )
{
	if(empty($sess_path))
	{
		$sess_path = ini_get('session.save_path');
	}

	if('files' == ini_get('session.save_handler'))
	{
		if(empty($sess_path))
		{
			if(! function_exists('sys_get_temp_dir'))
			{
				if(! empty($_ENV['TMP'])) return realpath($_ENV['TMP']);
				if(! empty($_ENV['TMPDIR'])) return realpath($_ENV['TMPDIR']);
				if(! empty($_ENV['TEMP'])) return realpath($_ENV['TEMP']);
				if( ('1' != ini_get('safe_mode')) && ($tempfile = tempnam('', 'cms')) )
				{
					if(file_exists($tempfile))
					{
						@unlink($tempfile);
						return realpath(dirname($tempfile));
					}
				}
			}
			else
			{
				return rtrim(sys_get_temp_dir(), '\\/');
			}
		}
		else
		{
			if (strrpos($sess_path, ";") !== false) //Can be 5;777;/tmp
			{
				$sess_path = substr($sess_path, strrpos($sess_path, ";")+1);
			}
			return $sess_path;
		}
	}

	return '';
}

/**
 * @return object
 * @var string $inputname
*/
function & testFileUploads( $inputname )
{
	$_errors = array(
		UPLOAD_ERR_INI_SIZE => lang('upload_err_ini_size'),
		UPLOAD_ERR_FORM_SIZE => lang('upload_err_form_size'),
		UPLOAD_ERR_PARTIAL => lang('upload_err_partial'),
		UPLOAD_ERR_NO_FILE => lang('upload_err_no_file'),
		UPLOAD_ERR_NO_TMP_DIR => lang('upload_err_no_tmp_dir'), //at least PHP 4.3.10 or PHP 5.0.3
		UPLOAD_ERR_CANT_WRITE => lang('upload_err_cant_write'), //at least PHP 5.1.0
		UPLOAD_ERR_EXTENSION => lang('upload_err_extension'), //at least PHP 5.2.0
	);

	function orderFiles(&$file_upl)
	{
		$_ary = array();
		$_count = count($file_upl['name']);
		$_keys = array_keys($file_upl);
		for($i=0; $i<$_count; $i++)
		{
			foreach($_keys as $key) $_ary[$i][$key] = $file_upl[$key][$i];
		}

		return $_ary;
	}

	$test =& new StdClass();
	$test->files = array();

	$result = testBoolean('', '', 'file_uploads', '', true, false);
	if($result->res != 'green')
	{
		$test->res = 'red';
		getTestReturn($test, '', '', 'Function_file_uploads_disabled', lang('function_file_uploads_off'));
		return $test;
	}

	if(! isset($_FILES["$inputname"]))
	{
		$test->res = 'red';
		getTestReturn($test, '', '', '', lang('error_nofileuploaded'));
		return $test;
	}

	$_files = array();
	if(is_array($_FILES["$inputname"]['name'])) $_files = orderFiles($_FILES["$inputname"]);
	else $_files[] = $_FILES["$inputname"];

	foreach($_files as $i=>$_file)
	{
		$_data = $_file;

		if( (! is_uploaded_file($_file['tmp_name'])) || ($_file['error'] !== UPLOAD_ERR_OK) )
		{
			if(isset($_errors[$_file['error']]))
			{
				$_data['error_string'] = $_errors[$_file['error']];
			}
			elseif($_file['size'] == 0)
			{
				$_data['error_string'] = lang('upload_err_empty');
			}
			elseif(! is_readable($_file['tmp_name']))
			{
				$_data['error_string'] = lang('upload_file_no_readable');
            }
			else
			{
				$_data['error_string'] = lang('upload_err_unknown');
			}
		}

		$test->files["$i"] = $_data;
	}

	return $test;
}

/**
 * @return object
 * @var boolean $required
 * @var string  $title
 * @var string  $minimum
 * @var string  $message
 * @var string  $error_fragment
*/
function & testGDVersion( $required, $title, $minimum, $message = '', $error_fragment = '' )
{
	$test =& new StdClass();
	$test->title = $title;

	$gd_version_number = GDVersion();
	$test->value = $gd_version_number;
	$test->secondvalue = null;

	if($gd_version_number < $minimum)
	{
		if($required)
		{
			$test->res = 'red';
		}
		else
		{
			$test->res = 'yellow';
		}
	}
	else
	{
		$test->res = 'green';
	}

	getTestReturn($test, $required, $message, $error_fragment);
	return $test;
}

/**
 * @return string
*/
function GDVersion()
{
	static $gd_version_number = null;

	if(is_null($gd_version_number)) {
		if(extension_loaded('gd')) {
			if(defined('GD_MAJOR_VERSION')) {
				$gd_version_number = GD_MAJOR_VERSION;
				return $gd_version_number;
			}
			$gdinfo = @gd_info();
			if(preg_match('/\d+/', $gdinfo['GD Version'], $gdinfo)) {
				$gd_version_number = (int) $gdinfo[0];
			} else {
				$gd_version_number = 1;
			}
			return $gd_version_number;
		}
		$gd_version_number = 0;
	}

	return $gd_version_number;
}
# vim:ts=4 sw=4 noet
?>