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/timesheet/inc
/srv/http/vyvoj.adent.cz/egroupware/pfi/timesheet/inc/
Upload File:
Current File : /srv/http/vyvoj.adent.cz/egroupware/pfi/timesheet/inc/class.spreadsheet.inc.php
<?php
/**
 * eGroupWare
 *
 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
 * @link http://www.egroupware.org
 * @author Knut Moeller <k.moeller@metaways.de>
 * @copyright Knut Moeller <k.moeller@metaways.de>
 * @version $Id:$
 */


/**
 *
 * Spreadsheet main class
 *
 *
 */
class SpreadSheetDocument {

	// TODO generalize...
	// TODO internalize counts

	const TEMPDIR = '/tmp';		// system temppath   		TODO: better solution?
	const ZIP = 'zip';				// system zip command		TODO: zip via php possible? no shellexec ?

	private $debug = 0;

	private $temppath; 				// temppath (to assemble zip file)
	private $tempzip;				// temp zip file

	private $handle;				// filehandle OO export file for importexport

	// xml nodes
	private $doc;
	private $styles;
	private $body;
	private $spreadsheet; 			// contains tables ....



	// File handling, INIT

	function __construct($_handle) {
		$this->temppath = $this->mk_tempdir(self::TEMPDIR, 'cmsliteexport');
		$this->tempzip = tempnam('/tmp','cmslite_export_outfile');
		$this->handle = $_handle;
		$this->initSpreadsheet();
	}


	function __destruct() {
		@unlink($this->tempzip);
		@unlink($this->tempzip . '.zip');
		$this->remove_directory($this->temppath.'/');
	}



	/**
	 *   assemble the zipped OpenOffice Document
	 *
	 */
	public function finalize() {

		@mkdir($this->temppath."/META-INF");
		@mkdir($this->temppath."/Thumbnails");
		@mkdir($this->temppath."/Configurations2");
		@mkdir($this->temppath."/Configurations2/statusbar");
		@mkdir($this->temppath."/Configurations2/accelerator");
		@touch($this->temppath."/Configurations2/accelerator/current.xml");
		@mkdir($this->temppath."/Configurations2/floater");
		@mkdir($this->temppath."/Configurations2/popupmenu");
		@mkdir($this->temppath."/Configurations2/progressbar");
		@mkdir($this->temppath."/Configurations2/menubar");
		@mkdir($this->temppath."/Configurations2/toolbar");
		@mkdir($this->temppath."/Configurations2/images");
		@mkdir($this->temppath."/Configurations2/images/Bitmaps");

		// main content
		$this->write( $this->doc->saveXML(), "content.xml");
		if ($this->debug > 0) error_log(print_r($this->doc->saveXML(),true));

		$this->createMimetype();
		$this->createManifest();
		$this->createMeta();

		// create zip
		shell_exec("cd $this->temppath; ".self::ZIP." -r $this->tempzip.zip * ");

		// copy to filehandle
		if ($this->handle) {
			$fh = fopen($this->tempzip.'.zip', "rb");
			if($fh) {
				while (!feof($fh)) {
			   		fwrite($this->handle, fread($fh, 8192));
			 	}
			}
			fclose($fh);
		}
		else error_log("output file error");
	}



	protected function createMeta() {

		//TODO generate
		$content = '<?xml version="1.0" encoding="UTF-8"?>
<office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.0">
<office:meta><meta:generator>OpenOffice.org/2.0$Linux OpenOffice.org_project/680m5$Build-9011</meta:generator>
<meta:creation-date>2005-01-18T12:05:29</meta:creation-date><dc:date>2006-10-25T10:35:55</dc:date><meta:print-date>2006-01-17T10:57:23</meta:print-date>
<dc:language>de-DE</dc:language><meta:editing-cycles>218</meta:editing-cycles><meta:editing-duration>P1DT9H3M54S</meta:editing-duration>
<meta:user-defined meta:name="Info 1"/><meta:user-defined meta:name="Info 2"/><meta:user-defined meta:name="Info 3"/>
<meta:user-defined meta:name="Info 4"/><meta:document-statistic meta:table-count="12" meta:cell-count="969"/></office:meta></office:document-meta>';
		$this->write($content,"meta.xml");
	}

	protected function createMimetype() {
		$content = 'application/vnd.oasis.opendocument.spreadsheet';
		$this->write($content,"mimetype");

	}

	protected function createManifest() {
		//TODO generate
$content = '<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
 <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.spreadsheet" manifest:full-path="/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/statusbar/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/accelerator/current.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/accelerator/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/floater/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/popupmenu/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/progressbar/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/menubar/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/toolbar/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/images/Bitmaps/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/images/"/>
 <manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration" manifest:full-path="Configurations2/"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/"/>
</manifest:manifest>';

		$this->write($content,"META-INF/manifest.xml");
	}


	protected function initSpreadsheet() {

		$this->doc = new DOMDocument ('1.0', 'UTF-8');
		$this->doc->formatOutput = true;

		$root = $this->doc->createElementNS('urn:oasis:names:tc:opendocument:xmlns:office:1.0',
								'office:document-content');
		$this->doc->appendChild($root);

		// define Namespaces....

		$namespaces = array(
			'style' => 'urn:oasis:names:tc:opendocument:xmlns:style:1.0',
			'text' => 'urn:oasis:names:tc:opendocument:xmlns:text:1.0',
			'table' => 'urn:oasis:names:tc:opendocument:xmlns:table:1.0',
			'draw' => 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0',
			'fo' => 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0',
			'xlink' => 'http://www.w3.org/1999/xlink',
			'dc' => 'http://purl.org/dc/elements/1.1/',
			'meta' => 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
			'number' => 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0',
			'svg' => 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0',
			'chart' => 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0',
			'dr3d' => 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0',
			'math' => 'http://www.w3.org/1998/Math/MathML',
			'form' => 'urn:oasis:names:tc:opendocument:xmlns:form:1.0',
			'script' => 'urn:oasis:names:tc:opendocument:xmlns:script:1.0',
			'ooo' => 'http://openoffice.org/2004/office',
			'ooow' => 'http://openoffice.org/2004/writer',
			'oooc' => 'http://openoffice.org/2004/calc',
			'dom' => 'http://www.w3.org/2001/xml-events',
			'xforms' => 'http://www.w3.org/2002/xforms',
			'xsd' => 'http://www.w3.org/2001/XMLSchema',
			'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');

		foreach ($namespaces as $name => $url) {
			$root->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:$name", $url);
		}
		$root->setAttribute('office:version', '1.0');


		// main parts

		$node = $root->appendChild( $this->doc->createElement('office:scripts') );
		$node = $root->appendChild( $this->doc->createElement('office:font-face-decls') );
		$this->styles = $root->appendChild( $this->doc->createElement('office:automatic-styles') );
		$this->body = $root->appendChild( $this->doc->createElement('office:body') );
		$this->spreadsheet = $this->body->appendChild( $this->doc->createElement('office:spreadsheet') );

		// styles

		$this->initTableStyles();
		$this->initColumnStyles();
		$this->initRowStyles();
		$this->initCellStyles();
		$this->initNumberStyles();
	}


	/**
	 * 	define the table styles
 	 */
	protected function initTableStyles() {
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ta1');
		$style->setAttribute('style:family', 'table');
		$style->setAttribute('style:master-page-name', 'Default');
		$property = $style->appendChild($this->doc->createElement('style:table-properties'));
		$property->setAttribute('table:display', 'true');
		$property->setAttribute('style:writing-mode', 'lr-tb');
	}

	/**
	 * 	define the column styles
 	 */
	protected function initColumnStyles() {
		$this->addColumnStyle('co1');
	}

	public function addColumnStyle($_name, $_width='2.267cm') {
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', $_name);
		$style->setAttribute('style:family', 'table-column');
		$property = $style->appendChild($this->doc->createElement('style:table-column-properties'));
		$property->setAttribute('fo:break-before', 'auto');
		$property->setAttribute('style:column-width', $_width);
	}


	/**
	 * 	define the row styles
 	 */
	protected function initRowStyles() {

			// standard
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ro1');
		$style->setAttribute('style:family', 'table-row');
		$property = $style->appendChild($this->doc->createElement('style:table-row-properties'));
		$property->setAttribute('style:row-height', '0.48cm');
		$property->setAttribute('fo:break-before', 'auto');
		$property->setAttribute('style:use-optimal-row-height', 'true');

			// double height
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ro2');
		$style->setAttribute('style:family', 'table-row');
		$property = $style->appendChild($this->doc->createElement('style:table-row-properties'));
		$property->setAttribute('style:row-height', '1.053cm');
		$property->setAttribute('fo:break-before', 'auto');
		$property->setAttribute('style:use-optimal-row-height', 'false');

	}


	/**
	 * 	define the cell styles
 	 */
	protected function initCellStyles() {

			// default
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ce1');
		$style->setAttribute('style:family', 'table-cell');
		$style->setAttribute('style:parent-style-name', 'Default');

		$property = $style->appendChild($this->doc->createElement('style:table-cell-properties'));
		$property->setAttribute('fo:border', 'none');
		$this->appendTextAttributes($style);

			// default bold
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ce2');
		$style->setAttribute('style:family', 'table-cell');
		$style->setAttribute('style:parent-style-name', 'Default');

		$property = $style->appendChild($this->doc->createElement('style:table-cell-properties'));
		$property->setAttribute('fo:border', 'none');
		$this->appendTextAttributes($style, true);

			// default bold + border
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ce3');
		$style->setAttribute('style:family', 'table-cell');
		$style->setAttribute('style:parent-style-name', 'Default');

		$property = $style->appendChild($this->doc->createElement('style:table-cell-properties'));
		$property->setAttribute('fo:border', '0.002cm solid #000000');
		$this->appendTextAttributes($style, true);



			// N2 decimal
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ce101');
		$style->setAttribute('style:family', 'table-cell');
		$style->setAttribute('style:parent-style-name', 'Default');
		$style->setAttribute('style:data-style-name', 'N2');

		$property = $style->appendChild($this->doc->createElement('style:table-cell-properties'));
		$property->setAttribute('fo:border', 'none');
		$this->appendTextAttributes($style);


			// N0 decimal
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ce100');
		$style->setAttribute('style:family', 'table-cell');
		$style->setAttribute('style:parent-style-name', 'Default');
		$style->setAttribute('style:data-style-name', 'N0');

		$property = $style->appendChild($this->doc->createElement('style:table-cell-properties'));
		$property->setAttribute('fo:border', 'none');
		$this->appendTextAttributes($style);


			// N3 decimal Sum
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ce102');
		$style->setAttribute('style:family', 'table-cell');
		$style->setAttribute('style:parent-style-name', 'Default');
		$style->setAttribute('style:data-style-name', 'N2');

		$property = $style->appendChild($this->doc->createElement('style:table-cell-properties'));
		$property->setAttribute('fo:border', 'none');
		$this->appendTextAttributes($style, true);


			// N4 date
		$style = $this->styles->appendChild($this->doc->createElement('style:style'));
		$style->setAttribute('style:name', 'ce103');
		$style->setAttribute('style:family', 'table-cell');
		$style->setAttribute('style:parent-style-name', 'Default');
		$style->setAttribute('style:data-style-name', 'N4');

		$property = $style->appendChild($this->doc->createElement('style:table-cell-properties'));
		$property->setAttribute('fo:border', 'none');
		$this->appendTextAttributes($style);

	}


	protected function appendTextAttributes($_style, $_bold=false) {
		$property = $_style->appendChild($this->doc->createElement('style:text-properties'));
		$property->setAttribute('style:use-window-font-color', 'true' );
		$property->setAttribute('style:text-outline', 'false' );
		$property->setAttribute('style:text-line-through-style', 'none' );
		$property->setAttribute('style:font-name', 'Arial1' );
		$property->setAttribute('style:text-underline-style', 'none' );
		$property->setAttribute('style:font-size-asian', '10pt'  );
		$property->setAttribute('style:font-style-asian', 'normal' );
		$property->setAttribute('style:font-weight-asian', 'bold' );
		$property->setAttribute('style:font-size-complex', '10pt' );
		$property->setAttribute('style:font-style-complex', 'normal' );
		$property->setAttribute('style:font-weight-complex', 'bold' );
		$property->setAttribute('fo:font-size', '10pt'  );
		$property->setAttribute('fo:font-style', 'normal'  );
		$property->setAttribute('fo:text-shadow', 'none' );
		$property->setAttribute('fo:font-weight', ($_bold)?'bold':'normal' );
	}


	/**
	 * 	define the number styles
 	 */
	protected function initNumberStyles() {

			// N2 : decimal precision 2
		$style = $this->styles->appendChild($this->doc->createElement('number:number-style'));
		$style->setAttribute('style:name', 'N2');
		$property = $style->appendChild($this->doc->createElement('number:number'));
		$property->setAttribute('number:decimal-places', '2');
		$property->setAttribute('number:min-integer-digits', '1');
		$property->setAttribute('number:grouping', 'false');

			// N0 : plain integer N0
		$style = $this->styles->appendChild($this->doc->createElement('number:number-style'));
		$style->setAttribute('style:name', 'N0');
		$property = $style->appendChild($this->doc->createElement('number:number'));
		$property->setAttribute('number:decimal-places', '0');
		$property->setAttribute('number:min-integer-digits', '0');
		$property->setAttribute('number:grouping', 'false');

			// N4 : date
		$style = $this->styles->appendChild($this->doc->createElement('number:date-style'));
		$style->setAttribute('style:name', 'N4');
		$style->setAttribute('number:automatic-order', 'true');

		$property = $style->appendChild($this->doc->createElement('number:day'));
		$property->setAttribute('number:style', 'long');
		$property = $style->appendChild($this->doc->createElement('number:text', '.'));

		$property = $style->appendChild($this->doc->createElement('number:month'));
		$property->setAttribute('number:style', 'long');
		$property = $style->appendChild($this->doc->createElement('number:text', '.'));

		$property = $style->appendChild($this->doc->createElement('number:year'));
	}




	/* GETTER,SETTER FUNCTIONS */

	public function getDoc() {
		return $this->doc;
	}

	public function get() {
		return $this->spreadsheet;
	}

	public function toString() {
		return (is_object($this->doc)) ? $this->doc->saveXML() : 'empty' ;
	}



	/* HELPER FUNCTIONS */

	private function mk_tempdir($dir, $prefix='', $mode=0700) {
	   if (substr($dir, -1) != '/') $dir .= '/';

	   do {
	     $path = $dir.$prefix.mt_rand(0, 9999999);
	   } while (!mkdir($path, $mode));

	   return $path;
	}

	private function write($content, $file) {
		$fh = fopen ($this->temppath.'/'.$file, "w") or die("can't open tempfile ". $this->temppath.'/'.$file);
		fwrite($fh, $content) or die ("cannot write to tempfile ". $this->temppath.'/'.$file);
		fclose($fh);
	}

	private function remove_directory($dir) {
		   $dir_contents = scandir($dir);
		   foreach ($dir_contents as $item) {
		       if (is_dir($dir.$item) && $item != '.' && $item != '..') {
		           $this->remove_directory($dir.$item.'/');
		       }
		       elseif (file_exists($dir.$item) && $item != '.' && $item != '..') {
		           unlink($dir.$item);
		       }
		   }
		   rmdir($dir);
	}

} // class




/**
 *
 *
 *
 */
class SpreadSheetTable {

	private $doc;
	private $table;
	private $columns;


	function __construct($_spreadsheet, $_name) {
		$this->doc = $_spreadsheet->getDoc();
		$this->spreadsheet = $_spreadsheet->get();

		if (is_object($this->doc)) {
			$this->table = $this->spreadsheet->appendChild( $this->doc->createElement('table:table') );
			$this->table->setAttribute('table:name', $_name);
			$this->table->setAttribute('table:style-name', 'ta1');
			$this->table->setAttribute('table:print','false');
		}
		else return false;
	}

	/**
	 *
	 */
	public function get() {
		return $this->table;
	}


	/**
	 * add column
	 * @return colElement
	 */
	public function addColumn($_name='co1', $_cellstylename='ce1', $_repeat=1) {
		$col = $this->table->appendChild( $this->doc->createElement('table:table-column') );
		$col->setAttribute('table:style-name', $_name);
		$col->setAttribute('table:number-columns-repeated',$_repeat);
		$col->setAttribute('table:default-cell-style-name', $_cellstylename);

		// table:number-columns-repeated="2"
		return $col;
	}


	/**
	 * add row
	 * @return rowElement
	 * @param type: normal, double (height)
	 */
	public function addRow($_type='normal') {
		$row = $this->table->appendChild( $this->doc->createElement('table:table-row') );
		$row->setAttribute('table:style-name', ($_type=='normal') ? 'ro1' : 'ro2');
		return $row;
	}


	/**
	 * requires row element, adds one cell to it
	 * @return cellElement
	 */
	public function addCell( $row, $type, $value, $attributes=array() ) {
		$cell = $row->appendChild( $this->doc->createElement('table:table-cell') );
		cellType($this->doc, $cell, $type, $value, $attributes);
		return $cell;
	}


	/**
	 * requires row element, adds multiple cells
	 */
	public function addCells( $row, $type, $values,  $attributes=array() ) {
		if (!is_array($values)) {
			echo "array required";
			return false;
		}
		foreach ($values as $value) {
			$this->addCell($row, $type, $value, $attributes);
		}
	}

} // class




/**
 *
 * type factory
 *
 */
function cellType($_doc, $_cell, $_type, $_value, $_attributes=array()) {

	//TODO think about attribute dispatching <-> xml cell definition

	switch ($_type) {
		case 'float' 	:  return new SpreadSheetCellTypeFloat	($_doc, $_cell, $_value, $_attributes);
		case 'int' 	:  return new SpreadSheetCellTypeInt	($_doc, $_cell, $_value, $_attributes);
		case 'formula' 	:  return new SpreadSheetCellTypeFormula($_doc, $_cell, $_value, $_attributes);
		case 'date' 	:  return new SpreadSheetCellTypeDate	($_doc, $_cell, $_value, $_attributes);
		default		:  return new SpreadSheetCellTypeString ($_doc, $_cell, $_value, $_attributes);
	}
}


/**
 * string type cell
 */
class SpreadSheetCellTypeString {

	function __construct($doc, $cell, $value, $_attributes) {
		$cell->setAttribute('office:value-type', 'string');

		$name = 'ce1';
		if (array_search('bold', $_attributes) !== FALSE ) {
			$name = 'ce2';
			if (array_search('border', $_attributes) !== FALSE ) {
				$name = 'ce3';
			}
		}
		$cell->setAttribute('table:style-name', $name);

		$cell->appendChild( $doc->createElement('text:p', $value) );
	}
}


/**
 * float type cell
 */
class SpreadSheetCellTypeFloat {
	function __construct($doc, $cell, $value, $_attributes) {
		$cell->setAttribute('office:value-type', 'float');
		$cell->setAttribute('office:value', number_format($value, 2, '.', '') );
		$cell->setAttribute('table:style-name', 'ce101');
		$cell->appendChild( $doc->createElement('text:p', number_format($value, 2, ',', '')) );
	}
}


/**
 * int type cell
 */
class SpreadSheetCellTypeInt {
	function __construct($doc, $cell, $value, $_attributes) {
		$cell->setAttribute('office:value-type', 'float');
		$cell->setAttribute('office:value', number_format($value, 0, ',', ''));
		$cell->setAttribute('table:style-name', 'ce100');
		$cell->appendChild( $doc->createElement('text:p', number_format($value, 0, ',', '')) );
	}
}


/**
 * date type cell
 */
class SpreadSheetCellTypeDate {
	function __construct($doc, $cell, $value, $_attributes) {
		if (($timestamp = strtotime($value)) === false) {
		   echo "Wrong date ($value)";
		}
		else {
			$cell->setAttribute('office:value-type', 'date');
			$cell->setAttribute('office:date-value', strftime("%Y-%m-%d", $timestamp) );
			$cell->setAttribute('table:style-name', 'ce103');
			$cell->appendChild( $doc->createElement('text:p', strftime("%d.%m.%Y", $timestamp) ) );
		}
	}
}


/**
 * formula type cell
 */
class SpreadSheetCellTypeFormula {

	function __construct($doc, $cell, $value, $_attributes) {
		$cell->setAttribute('table:formula', 'oooc:='.$value);
		$cell->setAttribute('office:value-type', 'float');
		$cell->setAttribute('office:value', '0');
		$cell->setAttribute('table:style-name', 'ce102');
		$cell->appendChild( $doc->createElement('text:p', '0,00' ));
	}
}


?>