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/vyvoj.adent.cz/egroupware/pfi/setup/inc
/srv/http/vyvoj.adent.cz/egroupware/pfi/setup/inc/
Upload File:
Current File : /srv/http/vyvoj.adent.cz/egroupware/pfi/setup/inc/class.setup.inc.php
<?php
/**
 * Setup
 *
 * @link http://www.egroupware.org
 * @package setup
 * @author Joseph Engo <jengo@phpgroupware.org>
 * @author Dan Kuykendall <seek3r@phpgroupware.org>
 * @author Mark Peters <skeeter@phpgroupware.org>
 * @author Miles Lott <milos@groupwhere.org>
 * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
 * @version $Id: class.setup.inc.php 23836 2007-05-08 14:58:22Z lkneschke $
 */

	class egw_dummy {
		var $db;
		var $common;
		var $accounts;
		
		function invalidate_session_cache() { }
	}

	class setup
	{
		var $db;
		var $config_table       = 'egw_config';
		var $applications_table = 'egw_applications';
		var $acl_table          = 'egw_acl';
		var $accounts_table     = 'egw_accounts';
		var $prefs_table        = 'egw_preferences';
		var $lang_table         = 'egw_lang';
		var $languages_table    = 'egw_languages';
		var $hooks_table        = 'egw_hooks';
		var $cats_table         = 'egw_categories';
		var $oProc;
		var $cookie_domain;

		var $detection;
		var $process;
		var $lang;
		var $html;
		
		var $system_charset;

		/* table name vars */
		var $tbl_apps;
		var $tbl_config;
		var $tbl_hooks;
		
		/**
		 * @var float $required_php_version php version required by eGroupWare
		 */
		var $required_php_version = 4.3;
		var $recommended_php_version = '5+';

		function setup($html=False, $translation=False)
		{
			// setup us as $GLOBALS['egw_setup'], as this gets used in our sub-objects
			$GLOBALS['egw_setup'] =& $this;

			$this->detection =& CreateObject('setup.setup_detection');
			$this->process   =& CreateObject('setup.setup_process');

			if ($_REQUEST['system_charset']) $this->system_charset = $_REQUEST['system_charset'];

			/* The setup application needs these */
			if ($html) $this->html =& CreateObject('setup.setup_html');
			if ($translation) $this->translation =& CreateObject('setup.setup_translation');
		}

		/**
		 * include api db class for the ConfigDomain and connect to the db
		 */
		function loaddb($connect_and_setcharset=true)
		{
			if(!isset($this->ConfigDomain) || empty($this->ConfigDomain))
			{
				$this->ConfigDomain = get_var('ConfigDomain',array('COOKIE','POST'),$_POST['FormDomain']);
			}

			$GLOBALS['egw_info']['server']['db_type'] = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_type'];

			if ($GLOBALS['egw_info']['server']['db_type'] == 'pgsql')
			{
				$GLOBALS['egw_info']['server']['db_persistent'] = False;
			}
			$this->db           =& CreateObject('phpgwapi.egw_db');
			$this->db->Host     = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_host'];
			$this->db->Port     = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_port'];
			$this->db->Type     = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_type'];
			$this->db->Database = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_name'];
			$this->db->User     = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_user'];
			$this->db->Password = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_pass'];
			
			$this->db->set_app('phpgwapi');
			
			if ($connect_and_setcharset)
			{
				$this->db->Halt_On_Error = 'no';	// table might not be created at that stage
				
				$this->set_table_names();		// sets/checks config- and applications-table-name

				// Set the DB's client charset if a system-charset is set
				$this->db->select($this->config_table,'config_value',array(
					'config_app'  => 'phpgwapi',
					'config_name' => 'system_charset',
				),__LINE__,__FILE__);
				if ($this->db->next_record() && $this->db->f(0))
				{
					$this->system_charset = $this->db->f(0);
					$this->db_charset_was = $this->db->Link_ID->GetCharSet();	// needed for the update

					// we can NOT set the DB charset for mysql, if the api version < 1.0.1.019, as it would mess up the DB content!!!
					if (substr($this->db->Type,0,5) == 'mysql')	// we need to check the api version
					{
						$this->db->select($this->applications_table,'app_version',array(
							'app_name'  => 'phpgwapi',
						),__LINE__,__FILE__);
						$api_version = $this->db->next_record() ? $this->db->f(0) : false;
					}
					if (!$api_version || !$this->alessthanb($api_version,'1.0.1.019'))
					{
						$this->db->Link_ID->SetCharSet($this->system_charset);
					}
				}	
				$this->db->Halt_On_Error = 'yes';	// setting the default again
			}
		}

		/**
		* Set the domain used for cookies
		*
		* @return string domain
		*/
		function set_cookiedomain()
		{
			// Use HTTP_X_FORWARDED_HOST if set, which is the case behind a none-transparent proxy
			$this->cookie_domain = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ?  $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST'];

			// remove port from HTTP_HOST
			if (preg_match("/^(.*):(.*)$/",$this->cookie_domain,$arr))
			{
				$this->cookie_domain = $arr[1];
			}
			if (count(explode('.',$this->cookie_domain)) <= 1)
			{
				// setcookie dont likes domains without dots, leaving it empty, gets setcookie to fill the domain in
				$this->cookie_domain = '';
			}
		}

		/**
		* Set a cookie
		*
		* @param string $cookiename name of cookie to be set
		* @param string $cookievalue value to be used, if unset cookie is cleared (optional)
		* @param int $cookietime when cookie should expire, 0 for session only (optional)
		*/
		function set_cookie($cookiename,$cookievalue='',$cookietime=0)
		{
			if(!isset($this->cookie_domain))
			{
				$this->set_cookiedomain();
			}
			setcookie($cookiename,$cookievalue,$cookietime,'/',$this->cookie_domain);
		}

		/**
		 * authenticate the setup user
		 *
		 * @param	$auth_type	???
		 */
		function auth($auth_type='Config')
		{
			#phpinfo();
			$FormLogout = get_var('FormLogout',  array('GET','POST'));
			$ConfigLang   = get_var('ConfigLang',  array('POST','COOKIE'));
			if(!$FormLogout)
			{
				$ConfigLogin  = get_var('ConfigLogin', array('POST'));
				$HeaderLogin  = get_var('HeaderLogin', array('POST'));
				$FormDomain   = get_var('FormDomain',  array('POST'));
				$FormUser     = get_var('FormUser',    array('POST'));
				$FormPW       = get_var('FormPW',      array('POST'));

				$this->ConfigDomain = get_var('ConfigDomain',array('POST','COOKIE'));
				$ConfigUser   = get_var('ConfigUser',  array('POST','COOKIE'));
				$ConfigPW     = get_var('ConfigPW',    array('POST','COOKIE'));
				$HeaderUser   = get_var('HeaderUser',  array('POST','COOKIE'));
				$HeaderPW     = get_var('HeaderPW',    array('POST','COOKIE'));

				/* Setup defaults to aid in header upgrade to version 1.26.
				 * This was the first version to include the following values.
				 */
				if(!@isset($GLOBALS['egw_domain'][$FormDomain]['config_user']) && isset($GLOBALS['egw_domain'][$FormDomain]))
				{
					@$GLOBALS['egw_domain'][$FormDomain]['config_user'] = 'admin';
				}
				if(!@isset($GLOBALS['egw_info']['server']['header_admin_user']))
				{
					@$GLOBALS['egw_info']['server']['header_admin_user'] = 'admin';
				}
			}

			$remoteip   = $_SERVER['REMOTE_ADDR'];
			if(!empty($remoteip) && !$this->checkip($remoteip)) { return False; }

			/* If FormLogout is set, simply invalidate the cookies (LOGOUT) */
			switch(strtolower($FormLogout))
			{
				case 'config':
					/* config logout */
					$expire = time() - 86400;
					$this->set_cookie('ConfigUser','',$expire,'/');
					$this->set_cookie('ConfigPW','',$expire,'/');
					$this->set_cookie('ConfigDomain','',$expire,'/');
//					$this->set_cookie('ConfigLang','',$expire,'/');
					$GLOBALS['egw_info']['setup']['LastDomain'] = $_COOKIE['ConfigDomain'];
					$GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('You have successfully logged out');
					$GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
					return False;
				case 'header':
					/* header admin logout */
					$expire = time() - 86400;
					$this->set_cookie('HeaderUser','',$expire,'/');
					$this->set_cookie('HeaderPW','',$expire,'/');
//					$this->set_cookie('ConfigLang','',$expire,'/');
					$GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('You have successfully logged out');
					$GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
					return False;
			}

			/* We get here if FormLogout is not set (LOGIN or subsequent pages) */
			/* Expire login if idle for 20 minutes.  The cookies are updated on every page load. */
			$expire = (int)(time() + (1200*9));

			switch(strtolower($auth_type))
			{
				case 'header':
					if(!empty($HeaderLogin))
					{
						/* header admin login */
						/* New test is md5, cleartext version is for header < 1.26 */
						if ($this->check_auth($FormUser,$FormPW,$GLOBALS['egw_info']['server']['header_admin_user'],
							$GLOBALS['egw_info']['server']['header_admin_password']))
						{
							$this->set_cookie('HeaderUser',$FormUser,$expire,'/');
							$this->set_cookie('HeaderPW',md5($FormPW),$expire,'/');
							$this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
							return True;
						}
						else
						{
							$GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('Invalid password');
							$GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
							return False;
						}
					}
					elseif(!empty($HeaderPW) && $auth_type == 'Header')
					{
						// Returning after login to header admin
						/* New test is md5, cleartext version is for header < 1.26 */
						if ($this->check_auth($HeaderUser,$HeaderPW,$GLOBALS['egw_info']['server']['header_admin_user'],
							$GLOBALS['egw_info']['server']['header_admin_password']))
						{
							$this->set_cookie('HeaderUser',$HeaderUser,$expire,'/');
							$this->set_cookie('HeaderPW',$HeaderPW,$expire,'/');
							$this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
							return True;
						}
						else
						{
							$GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('Invalid password');
							$GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
							return False;
						}
					}
					break;
				case 'config':
					if(!empty($ConfigLogin))
					{
						/* config login */
						/* New test is md5, cleartext version is for header < 1.26 */
						if (isset($GLOBALS['egw_domain'][$FormDomain]) &&
							$this->check_auth($FormUser,$FormPW,@$GLOBALS['egw_domain'][$FormDomain]['config_user'],
							@$GLOBALS['egw_domain'][$FormDomain]['config_passwd']))
						{
							$this->set_cookie('ConfigUser',$FormUser,$expire,'/');
							$this->set_cookie('ConfigPW',md5($FormPW),$expire,'/');
							$this->set_cookie('ConfigDomain',$FormDomain,$expire,'/');
							/* Set this now since the cookie will not be available until the next page load */
							$this->ConfigDomain = $FormDomain;
							$this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
							return True;
						}
						else
						{
							$GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid password');
							$GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
							return False;
						}
					}
					elseif(!empty($ConfigPW))
					{
						// Returning after login to config
						/* New test is md5, cleartext version is for header < 1.26 */
						if ($this->check_auth($ConfigUser,$ConfigPW,@$GLOBALS['egw_domain'][$this->ConfigDomain]['config_user'],
							@$GLOBALS['egw_domain'][$this->ConfigDomain]['config_passwd']))
						{
							$this->set_cookie('ConfigUser',$ConfigUser,$expire,'/');
							$this->set_cookie('ConfigPW',$ConfigPW,$expire,'/');
							$this->set_cookie('ConfigDomain',$this->ConfigDomain,$expire,'/');
							$this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
							return True;
						}
						else
						{
							$GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid password');
							$GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
							return False;
						}
					}
					break;
			}

			return False;
		}

        /**
        * check if username and password is valid
        *
        * this function compares the supplied and stored username and password
		* as any of the passwords can be clear text or md5 we convert them to md5 
		* internal and compare always the md5 hashs
        *
        * @param string $user the user supplied username
        * @param string $pw the user supplied password
        * @param string $conf_user the configured username
        * @param string $conf_pw the configured password
        * @returns bool
        */
		function check_auth($user,$pw,$conf_user,$conf_pw)
		{
			#echo "<p>setup::check_auth('$user','$pw','$conf_user','$conf_pw')</p>\n";exit;
			if ($user != $conf_user)
			{
				return False; // wrong username
			}

			// Verify that $pw is not already encoded as md5
			if(!preg_match('/^[0-9a-f]{32}$/',$conf_pw))
			{
				$conf_pw = md5($conf_pw);
			}
			

			// Verify that $pw is not already encoded as md5
			if(!preg_match('/^[0-9a-f]{32}$/',$pw))
			{
				$pw = md5($pw);
			}
			
			return $pw == $conf_pw;
			 
		}

		function checkip($remoteip='')
		{
			//echo "<p>setup::checkip($remoteip) against setup_acl='".$GLOBALS['egw_info']['server']['setup_acl']."'</p>\n";
			$allowed_ips = explode(',',@$GLOBALS['egw_info']['server']['setup_acl']);
			if(empty($GLOBALS['egw_info']['server']['setup_acl']) || !is_array($allowed_ips))
			{
				return True;	// no test
			}
			$remotes = explode('.',$remoteip);
			foreach($allowed_ips as $value)
			{
				if (!preg_match('/^[0-9.]+$/',$value))
				{
					$value = gethostbyname($was=$value);		// resolve domain-name, eg. a dyndns account
					//echo "resolving '$was' to '$value'<br>\n";
				}
				$values = explode('.',$value);
				for($i = 0; $i < count($values); ++$i)
				{
					if ((int) $values[$i] != (int) $remotes[$i])
					{
						break;
					}
				}
				if ($i == count($values))
				{
					return True;	// match
				}
			}
			$GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
			$GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid IP address');

			return False;
		}

		/**
		 * Return X.X.X major version from X.X.X.X versionstring
		 *
		 * @param	$
		 */
		function get_major($versionstring)
		{
			if(!$versionstring)
			{
				return False;
			}

			$version = str_replace('pre','.',$versionstring);
			$varray  = explode('.',$version);
			$major   = implode('.',array($varray[0],$varray[1],$varray[2]));

			return $major;
		}

		/**
		 * Clear system/user level cache so as to have it rebuilt with the next access
		 *
		 * @deprecated AFAIK this code is not used anymore -- RalfBecker 2005/11/04
		 */
		function clear_session_cache()
		{
		}

		/**
		 * Add an application to the phpgw_applications table
		 *
		 * @param	$appname	Application 'name' with a matching $setup_info[$appname] array slice
		 * @param	$enable		 * optional, set to True/False to override setup.inc.php setting
		 */
		function register_app($appname,$enable=99)
		{
			$setup_info = $GLOBALS['setup_info'];

			if(!$appname)
			{
				return False;
			}

			if($enable==99)
			{
				$enable = $setup_info[$appname]['enable'];
			}
			$enable = (int)$enable;

			if($GLOBALS['DEBUG'])
			{
				echo '<br>register_app(): ' . $appname . ', version: ' . $setup_info[$appname]['version'] . ', table: ' . $appstbl . '<br>';
				// _debug_array($setup_info[$appname]);
			}

			if($setup_info[$appname]['version'])
			{
				if($setup_info[$appname]['tables'])
				{
					$tables = implode(',',$setup_info[$appname]['tables']);
				}
				if ($setup_info[$appname]['tables_use_prefix'] == True)
				{
					if($GLOBALS['DEBUG'])
					{
						echo "<br>$appname uses tables_use_prefix, storing ". $setup_info[$appname]['tables_prefix']." as prefix for tables\n";
					}
					$this->db->insert($this->config_table,array(
							'config_app'	=> $appname,
							'config_name'	=> $appname.'_tables_prefix',
							'config_value'	=> $setup_info[$appname]['tables_prefix'],
						),False,__LINE__,__FILE__);
				}
				$this->db->insert($this->applications_table,array(
						'app_name'		=> $appname,
						'app_enabled'	=> $enable,
						'app_order'		=> $setup_info[$appname]['app_order'],
						'app_tables'	=> $tables,
						'app_version'	=> $setup_info[$appname]['version'],
					),False,__LINE__,__FILE__);

				$this->clear_session_cache();
			}
		}

		/**
		 * Check if an application has info in the db
		 *
		 * @param	$appname	Application 'name' with a matching $setup_info[$appname] array slice
		 * @param	$enabled	optional, set to False to not enable this app
		 */
		function app_registered($appname)
		{
			$setup_info = $GLOBALS['setup_info'];

			if(!$appname)
			{
				return False;
			}

			if(@$GLOBALS['DEBUG'])
			{
				echo '<br>app_registered(): checking ' . $appname . ', table: ' . $this->applications_table;
				// _debug_array($setup_info[$appname]);
			}

			$this->db->select($this->applications_table,'COUNT(*)',array('app_name' => $appname),__LINE__,__FILE__);
			if($this->db->next_record() && $this->db->f(0))
			{
				if(@$GLOBALS['DEBUG'])
				{
					echo '... app previously registered.';
				}
				return True;
			}
			if(@$GLOBALS['DEBUG'])
			{
				echo '... app not registered';
			}
			return False;
		}

		/**
		 * Update application info in the db
		 *
		 * @param	$appname	Application 'name' with a matching $setup_info[$appname] array slice
		 * @param	$enabled	optional, set to False to not enable this app
		 */
		function update_app($appname)
		{
			$setup_info = $GLOBALS['setup_info'];

			if(!$appname)
			{
				return False;
			}

			if($GLOBALS['DEBUG'])
			{
				echo '<br>update_app(): ' . $appname . ', version: ' . $setup_info[$appname]['currentver'] . ', table: ' . $this->applications_table . '<br>';
				// _debug_array($setup_info[$appname]);
			}

			if(!$this->app_registered($appname))
			{
				return False;
			}

			if($setup_info[$appname]['version'])
			{
				//echo '<br>' . $setup_info[$appname]['version'];
				if($setup_info[$appname]['tables'])
				{
					$tables = implode(',',$setup_info[$appname]['tables']);
				}
				$this->db->update($this->applications_table,array(
						'app_enabled'	=> $setup_info[$appname]['enable'],
						'app_order'		=> $setup_info[$appname]['app_order'],
						'app_tables'	=> $tables,
						'app_version'	=> $setup_info[$appname]['version'],
					),array('app_name'=>$appname),__LINE__,__FILE__);
			}
		}

		/**
		 * Update application version in applications table, post upgrade
		 *
		 * @param	$setup_info		 * Array of application information (multiple apps or single)
		 * @param	$appname		 * Application 'name' with a matching $setup_info[$appname] array slice
		 * @param	$tableschanged	???
		 */
		function update_app_version($setup_info, $appname, $tableschanged = True)
		{
			if(!$appname)
			{
				return False;
			}

			if($tableschanged == True)
			{
				$GLOBALS['egw_info']['setup']['tableschanged'] = True;
			}
			if($setup_info[$appname]['currentver'])
			{
				$this->db->update($this->applications_table,array(
						'app_version'	=> $setup_info[$appname]['currentver'],
					),array('app_name'=>$appname),__LINE__,__FILE__);
			}
			return $setup_info;
		}

		/**
		 * de-Register an application
		 *
		 * @param	$appname	Application 'name' with a matching $setup_info[$appname] array slice
		 */
		function deregister_app($appname)
		{
			if(!$appname)
			{
				return False;
			}
			$setup_info = $GLOBALS['setup_info'];

			//echo 'DELETING application: ' . $appname;
			$this->db->delete($this->applications_table,array('app_name'=>$appname),__LINE__,__FILE__);
			$this->clear_session_cache();
		}

		/**
		 * Register an application's hooks
		 *
		 * @param	$appname	Application 'name' with a matching $setup_info[$appname] array slice
		 */
		function register_hooks($appname)
		{
			$setup_info = $GLOBALS['setup_info'];

			if(!$appname)
			{
				return False;
			}

			if(!$this->hooks_table)	// No hooks table yet
			{
				return False;
			}

			if (!is_object($this->hooks))
			{
				$this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
			}
			$this->hooks->register_hooks($appname,$setup_info[$appname]['hooks']);
		}

		/**
		 * Update an application's hooks
		 *
		 * @param	$appname	Application 'name' with a matching $setup_info[$appname] array slice
		 */
		function update_hooks($appname)
		{
			$this->register_hooks($appname);
		}

		/**
		 * de-Register an application's hooks
		 *
		 * @param	$appname	Application 'name' with a matching $setup_info[$appname] array slice
		 */
		function deregister_hooks($appname)
		{
			if(!$this->hooks_table)	// No hooks table yet
			{
				return False;
			}

			if(!$appname)
			{
				return False;
			}
			
			//echo "DELETING hooks for: " . $setup_info[$appname]['name'];
			if (!is_object($this->hooks))
			{
				$this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
			}
			$this->hooks->register_hooks($appname);
		}

		/**
		  * call the hooks for a single application
		  *
		  * @param $location hook location - required
		  * @param $appname application name - optional
		 */
		function hook($location, $appname='')
		{
			if (!is_object($this->hooks))
			{
				$this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
			}
			return $this->hooks->single($location,$appname,True,True);
		}

		/**
		 * egw version checking, is param 1 < param 2 in phpgw versionspeak?
		 * @param	$a	phpgw version number to check if less than $b
		 * @param	$b	phpgw version number to check $a against
		 * @return	True if $a < $b
		 */
		function alessthanb($a,$b,$DEBUG=False)
		{
			$num = array('1st','2nd','3rd','4th');

			if($DEBUG)
			{
				echo'<br>Input values: '
					. 'A="'.$a.'", B="'.$b.'"';
			}
			$newa = str_replace('pre','.',$a);
			$newb = str_replace('pre','.',$b);
			$testa = explode('.',$newa);
			if(@$testa[1] == '')
			{
				$testa[1] = 0;
			}

			$testb = explode('.',$newb);
			if(@$testb[1] == '')
			{
				$testb[1] = 0;
			}
			if(@$testb[3] == '')
			{
				$testb[3] = 0;
			}
			$less = 0;

			for($i=0;$i<count($testa);$i++)
			{
				if($DEBUG) { echo'<br>Checking if '. (int)$testa[$i] . ' is less than ' . (int)$testb[$i] . ' ...'; }
				if((int)$testa[$i] < (int)$testb[$i])
				{
					if ($DEBUG) { echo ' yes.'; }
					$less++;
					if($i<3)
					{
						/* Ensure that this is definitely smaller */
						if($DEBUG) { echo"  This is the $num[$i] octet, so A is definitely less than B."; }
						$less = 5;
						break;
					}
				}
				elseif((int)$testa[$i] > (int)$testb[$i])
				{
					if($DEBUG) { echo ' no.'; }
					$less--;
					if($i<2)
					{
						/* Ensure that this is definitely greater */
						if($DEBUG) { echo"  This is the $num[$i] octet, so A is definitely greater than B."; }
						$less = -5;
						break;
					}
				}
				else
				{
					if($DEBUG) { echo ' no, they are equal or of different length.'; }
					// makes sure eg. '1.0.0' is counted less the '1.0.0.xxx' !
					$less = count($testa) < count($testb) ? 1 : 0;
				}
			}
			if($DEBUG) { echo '<br>Check value is: "'.$less.'"'; }
			if($less>0)
			{
				if($DEBUG) { echo '<br>A is less than B'; }
				return True;
			}
			elseif($less<0)
			{
				if($DEBUG) { echo '<br>A is greater than B'; }
				return False;
			}
			else
			{
				if($DEBUG) { echo '<br>A is equal to B'; }
				return False;
			}
		}

		/**
		 * egw version checking, is param 1 > param 2 in phpgw versionspeak?
		 *
		 * @param	$a	phpgw version number to check if more than $b
		 * @param	$b	phpgw version number to check $a against
		 * @return	True if $a < $b
		 */
		function amorethanb($a,$b,$DEBUG=False)
		{
			$num = array('1st','2nd','3rd','4th');

			if($DEBUG)
			{
				echo'<br>Input values: '
					. 'A="'.$a.'", B="'.$b.'"';
			}
			$newa = str_replace('pre','.',$a);
			$newb = str_replace('pre','.',$b);
			$testa = explode('.',$newa);
			if($testa[3] == '')
			{
				$testa[3] = 0;
			}
			$testb = explode('.',$newb);
			if($testb[3] == '')
			{
				$testb[3] = 0;
			}
			$less = 0;

			for($i=0;$i<count($testa);$i++)
			{
				if($DEBUG) { echo'<br>Checking if '. (int)$testa[$i] . ' is more than ' . (int)$testb[$i] . ' ...'; }
				if((int)$testa[$i] > (int)$testb[$i])
				{
					if($DEBUG) { echo ' yes.'; }
					$less++;
					if($i<3)
					{
						/* Ensure that this is definitely greater */
						if($DEBUG) { echo"  This is the $num[$i] octet, so A is definitely greater than B."; }
						$less = 5;
						break;
					}
				}
				elseif((int)$testa[$i] < (int)$testb[$i])
				{
					if($DEBUG) { echo ' no.'; }
					$less--;
					if($i<2)
					{
						/* Ensure that this is definitely smaller */
						if($DEBUG) { echo"  This is the $num[$i] octet, so A is definitely less than B."; }
						$less = -5;
						break;
					}
				}
				else
				{
					if($DEBUG) { echo ' no, they are equal.'; }
					$less = 0;
				}
			}
			if($DEBUG) { echo '<br>Check value is: "'.$less.'"'; }
			if($less>0)
			{
				if($DEBUG) { echo '<br>A is greater than B'; }
				return True;
			}
			elseif($less<0)
			{
				if($DEBUG) { echo '<br>A is less than B'; }
				return False;
			}
			else
			{
				if($DEBUG) { echo '<br>A is equal to B'; }
				return False;
			}
		}

		function setup_account_object()
		{
			if (!is_object($GLOBALS['egw']->accounts))
			{
				if (!is_object($this->db))
				{
					$this->loaddb();
				}
				/* Load up some configured values */
				$this->db->select($this->config_table,'config_name,config_value',
					"config_name LIKE 'ldap%' OR config_name LIKE 'account_%' OR config_name LIKE '%encryption%' OR config_name='auth_type'",__LINE__,__FILE__);
				while(($row = $this->db->row(true)))
				{
					if (!isset($GLOBALS['egw_info']['server'][$row['config_name']]))	// dont overwrite
					{
						$GLOBALS['egw_info']['server'][$row['config_name']] = $row['config_value'];
					}
				}
				if (!is_object($GLOBALS['egw']))
				{
					$GLOBALS['egw'] =& new egw_dummy();
					$GLOBALS['phpgw'] =& $GLOBALS['egw'];
				}
				$GLOBALS['egw']->db          = clone($this->db);
				$GLOBALS['egw']->common      =& CreateObject('phpgwapi.common');
				$GLOBALS['egw']->accounts    =& CreateObject('phpgwapi.accounts');

				if(($GLOBALS['egw_info']['server']['account_repository'] == 'ldap') &&
					!$GLOBALS['egw']->accounts->ds)
				{
					printf("<b>Error: Error connecting to LDAP server %s!</b><br>",$GLOBALS['egw_info']['server']['ldap_host']);
					return false;
				}
			}
			return true;
		}

		/**
		 * add an user account or a user group
		 *
		 * if the $username already exists, only the id is returned, no new user / group gets created
		 *
		 * @param string $username alphanumerical username or groupname (account_lid)
		 * @param string $first first name
		 * @param string $last last name
		 * @param $passwd string cleartext pw
		 * @param string/boolean $primary_group Groupname for users primary group or False for a group, default 'Default'
		 * @param boolean $changepw user has right to change pw, default False = Pw change NOT allowed
		 * @param string $email 
		 * @return int the numerical user-id
		 */
		function add_account($username,$first,$last,$passwd,$primary_group='Default',$changepw=False,$email='')
		{
			$this->setup_account_object();

			$primary_group_id = $primary_group ? $GLOBALS['egw']->accounts->name2id($primary_group) : False;

			if(!($accountid = $GLOBALS['egw']->accounts->name2id($username)))
			{
				$account = array(
					'account_type'      => $primary_group ? 'u' : 'g',
					'account_lid'       => $username,
					'account_passwd'    => $passwd,
					'account_firstname' => $first,
					'account_lastname'  => $last,
					'account_status'    => 'A',
					'account_primary_group' => $primary_group_id,
					'account_expires'   => -1,
					'account_email'     => $email,
					'account_members'   => ''
				);
				if (!($accountid = $GLOBALS['egw']->accounts->save($account)))
				{
					error_log("setup::add_account('$username','$first','$last',\$passwd,'$primary_group',$changepw,'$email') failed! accountid=$accountid");
					return false;
				}
			}
			if ($primary_group)	// only for users, NOT groups
			{
				$memberships = $GLOBALS['egw']->accounts->memberships($accountid,true);
	
				if($primary_group_id && !in_array($primary_group_id,$memberships))
				{
					$memberships[] = $primary_group_id;
					
					$GLOBALS['egw']->accounts->set_memberships($memberships,$accountid);
				}
				if (!$changepw) $this->add_acl('preferences','nopasswordchange',$accountid);
			}
			error_log("setup::add_account('$username','$first','$last',\$passwd,'$primary_group',$changepw,'$email') successfull created accountid=$accountid");
			return $accountid;
		}
		
		/**
		 * Set the memberships of an account
		 *
		 * @param array $groups array of group-id's
		 * @param int $user account_id
		 */
		function set_memberships($groups,$user)
		{
			$this->setup_account_object();
			
			return $GLOBALS['egw']->accounts->set_memberships($groups,$user);
		}
		
		/**
		 * Check if accounts other then the automatically installed anonymous account exist
		 *
		 * We check via the account object, to deal with different account-storages
		 *
		 * @return boolean
		 */
		function accounts_exist()
		{
			if (!$this->setup_account_object()) return false;

			$accounts = $GLOBALS['egw']->accounts->search(array(
				'type'   => 'accounts',
				'start'  => 0,
				'offset' => 2	// we only need to check 2 accounts, if we just check for not anonymous
			));
			
			if (!$accounts || !is_array($accounts) || !count($accounts))
			{
				return false;
			}
			foreach($accounts as $account)
			{
				if ($account['account_lid'] != 'anonymous')
				{
					// we might add further checks, eg. if the account really has admin rights here
					return true;
				}
			}
			return false;
		}

		/**
		 * Add ACL rights
		 *
		 * Dont use it to set group-membership, use set_memberships instead!
		 * 
		 * @param $app string/array with app-names
		 * @param $locations string eg. run
		 * @param $account int/string accountid or account_lid
		 * @param $rights int rights to set, default 1
		 */
		function add_acl($apps,$location,$account,$rights=1)
		{
			error_log("setup::add_acl(".(is_array($apps) ? "array('".implode("','",$apps)."')" : "'$apps'").",'$location',$account,$rights)");
			if (!is_numeric($account))
			{
				$this->setup_account_object();
				$account = $GLOBALS['egw']->accounts->name2id($account);
			}
			if(!is_object($this->db))
			{
				$this->loaddb();
			}

			if(!is_array($apps))
			{
				$apps = array($apps);
			}
			foreach($apps as $app)
			{
				$this->db->delete($this->acl_table,array(
					'acl_appname'  => $app,
					'acl_location' => $location,
					'acl_account'  => $account
				),__LINE__,__FILE__);

				if ((int) $rights)
				{
					$this->db->insert($this->acl_table,array(
						'acl_rights' => $rights
					),array(
						'acl_appname'  => $app,
						'acl_location' => $location,
						'acl_account'  => $account,
					),__LINE__,__FILE__);
				}
			}
		}
		
		/**
		 * checks if one of the given tables exist, returns the first match
		 *
		 * @param array $tables array with possible table-names
		 * @return string/boolean tablename or false
		 */
		function table_exist($tables,$force_refresh=False)
		{
			static $table_names = False;
			
			if (!$table_names || $force_refresh) $table_names = $this->db->table_names();
			
			if (!$table_names) return false;
			
			foreach($table_names as $data)	
			{
				if (($key = array_search($data['table_name'],$tables)) !== false)
				{
					return $tables[$key];
				}
			}
			return false;
		}
		
		/**
		 * Checks and set the names of the tables, which get accessed before an update: eg. config- and applications-table
		 *
		 * Other tables can always use the most up to date name
		 */
		function set_table_names($force_refresh=False)
		{
			foreach(array(
				'config_table'       => array('egw_config','phpgw_config','config'),
				'applications_table' => array('egw_applications','phpgw_applications','applications'),
				'accounts_table'     => array('egw_accounts','phpgw_accounts'),
				'acl_table'          => array('egw_acl','phpgw_acl'),
				'lang_table'         => array('egw_lang','phpgw_lang','lang'),
				'languages_table'    => array('egw_languages','phpgw_languages','languages'),
			) as $name => $tables)
			{
				$table = $this->table_exist($tables,$force_refresh);

				if ($table && $table != $this->$name)	// only overwrite the default name, if we realy got one (important for new installs)
				{
					$this->$name = $table;
				}
				//echo "<p>setup::set_table_names: $name = '{$this->$name}'</p>\n";
			}
		}
	}