From c420e9545f00385acc78b1df54d568a464f4bc19 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Thu, 21 May 2015 14:39:23 +0200 Subject: [PATCH 01/17] Release 1.5.2 This patch is the exact version as available from TER (but not from public svn/git) --- doc/manual.sxw | Bin 871872 -> 875804 bytes ext_emconf.php | 52 +++++++++++++++++++------------------------------ savefile.php | 10 +++++----- 3 files changed, 25 insertions(+), 37 deletions(-) diff --git a/doc/manual.sxw b/doc/manual.sxw index d538dbfefe2318abe54b03d434627624bc21967e..13761ae36f5bb2fc021a8a4121b73e990f09e568 100644 GIT binary patch delta 38784 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 F{Rf|?B1!-N delta 34677 zcmZs>V{|4#`|catwr$(CZB6WC;>i=+wr$(CZ6_1kIP;!!-v8cf?cKeq`ghfRf2rzT ztE#K6tPb|ROm+k%Sx_)Ep#NNarr%ug2>g)$KPF-V6QvSrz{A1)Cjsi;{r@IJDE&7f zexLEb_%E0Fe^?Qi^}igyPn1{=jQGFH-Tx&MpMW|38)^oIGp_ir2xI{XWdQ+hWdQ-9 zQvPpasIe-@zXIB7tP1wm?!T?Ay?c<01pif`%Kc!i%KhL4*#Fa#{sS4B{sZ-|K>sT+ zsp&tk#{UhrT2;WkB18SR^R4zhkTN9y4TipNfVaMHK-eBa{kQX}R$Xue0Dc)zWwhYl zJNdM9G8UdUN`)pRu>KhaBMT`N@;C~Aqj-2ZW8%hWH7ijZT3X)KJ%oU6SST<$zCG_n zydL*i{?N&X+c6CSIg(pKe_>5$5xVTu{c;%D=$(t;-xODqEUR_%mWGXY@sYSq(=On? z(On351p_>(2v2&Hw;O?F0A($b1t5d#y$_gc(@nnL(*p8;nO_}x=4R{)>(s_9ptNBQ zWj!p{Uk8R|&op*i*Y+hk?bcGR6k>w213Nxa;*H#3_EYl?F1NH^9d8fw&SB9k-NB`y zzk!rwA)#J${%UUg8xRX%pnv**fAjwtrT<*1Vcl?;fJ2Ffy$@e-x>2XH*|0rz%~&rH z`tr^Dvd-T+_a0rSF)<{{Wb+`(ctB{n0<6dnJ%}HUByNT?;cJNNtzU_63DZ**1HnMj zejwx(xH}LX2XL2kqa_L%es)v{ zU;Dco+xVO3ra`~CwbpQOgQB(FrFWM^I9vHR^#5rfHrJ0HC|$);RhNyDl_=T8Eo9Mk!!Q1 zs|N;b9(m^h9Gf=v94iUQF;=k)@t%Rd)<8;ZKf>H_P}>t59uFIZ|v05 z9yo4b;#A^ZI8?x{fx%0N&rre0^Zf|><`d`%i5VJrczlNWYuzamA%%45YjFv?GwAvL z?jIs<_Q)5!pW_>7?Lx|s&&^+?T(7IZ4>dQE`ulxAe~5LT*2mng4;fpdv?#+$1R#T6 z^&XBly>^5#V(N=hRe3THT&i6e@7(JJjxIL*I=32uZ6p8#2RWIREG>Zqc-cK)>AI8V zjtA>g%)ZWcL~mOj-q|^$?zVKFHx`@YrP_l#%$5<4zsJV}yO?)2>>a40WWAZ-q6kmn zv#nom>m5P{T+HOroH44w7 z;xE>+zb&T@^udt;1f6D07$(=uo=%iQW;x$=+!}NG*_KE-p!Xgj+!SN*oKfE$66ER_ z-0^l`AXO{l?hC)|FM%hYK{7uo)|Xn8T&=D%y+f;a!t$6*cKY0G5N<#dt;h(yq*nII z*DWtAIrU>3H+51$y+b_rqD*781%*5n1d7}7m`4eK6qE4*?_hpw1u3<2eB*kgVQ({L zM>B>MK8C8a_L-fK_0M+w zS!L0!4qoK7YWOQsCmOKDzEK16pM{Cr&4?Eft<$(LB z*p)6~quIs>_~t@7#3OVUN6O2~+;#*9qd^GZ{X{3b$>7mrx~pbHW}{qxln;>T76xY) zF56`{uA&sqUJorcl^NgjAYs#COlwd~^yM-Ua4g$MgJ<(u8KqNiWlLglWt%X{UrKqh zhs;T9!$2_sCIlmJ`C@($8ZNmXy*A<)& z0j*8~98anofV;J3+&D9xtDtjSifb5$kdzBN7WlNreln-O0t3v$7K##6+BfwqNx5w~ zVJ8&0T2 zWLOY;Y)+POi^CQha;vJji5$nx6%sA#+IrU+GXC-S_?G3RoKy8HyojdI=Y1?amIsNV z`70)SS6xu6MIvY|Oh1Z|?@Lg4&HYV(8IKD*0*b1kdIwDexHju*3Q`nA<)stgkIeek zV6#its?k;-#Glq*M!7Ve%^{zFWyIb>&Y|Z-;@meT^5oG(e^}%^X7O5QVrUOhV=1Buv~?}XMb6#Cb#0F*8hzq$vJv1} zU@xXvK|X=+@t|{Hd&X|pcPZLD$9mH52>Ej~urSr7LH#n$?ofer%)h|_SeNM^(I==P z`P~UszW7Y5CI(Uy_?wCxZMGbRa^qFTgqG`Bg4YNCo*r4ewl;Tlh-f0G2%83cm!Ni* zE}>U+1ke7@W$lC44F3S5@E_3s1M{4J!1xb#TH6N+{*zNv^$!^ES{{UMW_+CIwfL?# z#?(@X0QK0@`}4h52#ulXO6q>*JaE0I4|V!^{Kq+N6BM216!&_p39B zy1j~7FA)$79lJOETWQ7t+CvEqA%HK%=80lhnt-RaIcu*$BlEzJTLV`c>l3<*!wvDf zxG(JQ(D1T^kM%?v^1=6O5i>$j4yDi5PevLT4(ixIEpfGc4 zTg>5LB_N-Y0+cR~l8=FYzhjo#l}H?Fbbr4fDHg;qrd=JD9F9;E5f*n{7|;b;kxfIf zBi9_p^akd5=3!%|o08~z>O?6Tgbg$M4bQVo_`=UzpcfSdvCbc5J1go;lt^E9VD(CM z66Rv7)jjIn?^ejkV)E0Yw9Azke`V4>dRRTuTV~Ow6Z=bm6Avsf@T0bcMDWCPr#v5d%LB zphmwY3$QJGd{h0|o!smG^jqV5XJS|P&6^hBaD4NX@YSuTG5tgM!;HzIXc*lpceoi4 zZ2#O0{wrhG8Ps^NhMsEiQv(Ph^S7OFIz-!+&{~}h>;zliaY%oOzOGUUbPW&^$N5G8 zi@amIah=sFMv_&~BzzEjXG@+MsU9#9fN!E3Tzq)!js1g`xdDar|5lww#6R3Hlnsr^ zL{D|C0;PidXWr==YSb1wuEQUEGyZh`!vLg zMGWV8|J)Wlz_Dtn^;Qmu$?G#r9)#J%e>;)!GqqQfv16bk)h6q;>m<@w3AYh=YVPoI zMQ{hE3wjqu*Ho$8VGm%+|19nRLjN&!_m<+tO~CuY9{KUyR~;QR{B+T=;hy{Rdq5wk zb=W&5_en`%qT#E4@Y==%g{x)K28NtXLaI!UYi0-$z?T-~*eFRgw+?^7<8q>1g!%f^ zpPl7tYuyBjZUbZ960u&M;C91Y3~RK)%BFde@S{~3?e@7M>V+U?B_ zye{;`tjFX(voiTG>z68E8-6G03o!dM$Yti-{)8}(<0ooaJ&eYTb*CA5$>GO>kf@xu zT-p-^RO7SLGii%Lq`!k1T&IywzU447ur zyxElKSzdxO@A7<6{hD4bc6xvA_}&QARNddkVZ9gvhj=la=kPXBvlIq)Q$hVBpT8Jg z>&ZAbA;?q+^nH{<(oUTaRH=!3DhcUk4o9?yT043?%GyLu=VuJc;ZrlOTm$aICIM7J zSvtz%yEi35^T@&u4<1wXeKL*s4S2e?kjPHANZ}^Sl4EU$TF0+@b^@Z5x$pIofc1%c z%lhq498qu5P&dzng^WDCj<3bJ=}V|Zq3$ziQHcPdDO)LR|yXLSd1|@ zEEgCE0ct1u^@}z1dKrYo8F&wEr6{x|FZtas@%bSRJkQK|x9;wgP~+;fL% zby1ww0yFg)zc%|W9>CONT6p&|@@Db6f2#(_&f0sk;=2WMD7N>uV4DtU=iFSi-|6wW zej5pEM?I-pf~>kR0karNT{I5)}5L^?mSI86k>(R~azNN@M zN|gvZ5YFTH8WDp%E<|4Wi(?NQe3n}tylgG*Eu~&>=?VTURCYsa%YdD z_Y9aN8!H+k8=%CEiOs$SexJu`BrP?$E2pi2RItwXd2LOrno_8HmGUR$y(Rl$Q?SG2 z9LH4A?~zHy!FI>qUhGN^>x@gcJ<@OpjHm6`4D)nDJKp@cy_C)Dy4nHES8t8(Uq|CLCeZH?a*+xP95bd?r&FPC)!`D#aL_JguoEY#1 z=g(!6i_R(#Na9?X1e80np)wmna6{-oZ6PJ%$1Vu1$s;763i&$@q?G^Up~FibkzXvh zM@7hl5#aL5jj|V!-{z24ILMhsNXk6bd<42%Zw$gz!;HVtP24xl&J_oLjs3{>_<<6J zyulD7+O)G~{)Z@XPBvC4T@8!_1@*YAUh*@TxQG(wkI_;)q8Rju@Jto&;CK|juSH}y zqc?{?qZ8rGxmr+FYL9sgV-&-Cn1sG-X+J|j3Sb32cb?ZwRwd$^7&!64={Kpz%YYBp zs}K~>`U^qOia`B+Us{7Vpu{jvXg^zBR3@3=fW=cg4_;@Fq|}}@DLQT&NXQiBA>N4| z?okhCssSp&6az`kG}>|Iwc_S>b|E=74&vk&Q|utNYdg2Br8%XBV}XfBp3`rt<9&b*;hAvu$@o%kNX;8O&}?b+7s7a};30I!E^~edkrt2c#EZ6t zwz@!7=(!GL=98MHX=NJ9gJDAA0$#5<*`o`72Lr9|l(=+HMeyjMO^`_-eJ|HLg8Rsi zg!s4o^CNon{kht0FVKqz%|Jdv-t>f-tLkt+WgoB$A0uG8_O#<0DRQ=V;|*8-ZvphQ zOEXoo&a&D0@xC8NY9qMA!?uYJvs|1HsElWVi*`>`S#Q;Ji=EN!UJv_P)zs za-(|QXsqL7LVRHrYEMN?`nW%}_ja#!^6hy!Z^BcOnfo;w(Tv8(k|CKYwDfO6xo&VQ z_F;9vAEvY?v#23MNl9Q}`IUrkWYuTn?NyBm00{^$Fj_*%wWcP-(wDlEI|Tb>ffX7} zj`&o#N4eOBU^~kEj#@57jf&d!Mgf_IkaFP33p)Gayw^T*T(WM(Y2nmv>V|;0IJRYd zBzmHGo|>3AQn?ry*l7Mye>Tw1tQV4fXllpIz9Abxw<%*c@@J)M7wGS%CLS*GaA=7i z`E#FyZe9e1=}^g1KB#=uHc2Y-G8~Z@B1TT%aagLj(WWP~?L%FZC-O{=+$cNGhw1Wy+~QiNSA^MYHC~`*|Gp|>hI-$17I#lxWYEA z!AgD7q$;(@jL4I%U9`@MXlAeh$8K{Xn%VN%xNe!-{GxNU;%Rd@XYT&HNn7G<2WIkm z(@(v0byZ^5jjR3}7;y}*0G=anDu%K@2AQtJa#HR~XbVP#xg*-1dEz&V(sdqC=%rK! zt7wRuE;iQkM5uCg42f81HXu;5w01K(<<07o3aj}C={rrAW|KC=gi^+il(w;HT>vXl zL$p{N&xswqCNZ@IU&2*(p=Ho5qm5lvN3zk_?U_}q`9xSi&GuSajgM=4lV6aFi(2-E z3OVz6k)?;DQv$>GSL{{84!t}5VjEF=7+pcu+e^tEsgCQ{*i>k{8UPwMcQPFkg(pHK zghQll|87mf1@G~d`aHz;-pw%FD9;w`2uoUf2sR!4B%~be?yuehwqX_;gpt>RWp%ZM zB}=>{jKbR4PTGBq1LUWrIk2pp^_2((yCwW!PABM88TBPr0a;$ZP#AETvu#v4+3)KW zdSA_4Xm1u~2a0sQB>bPwIc~LxY#D|(_>Ao>6^*V1=hT|t@FN@CT_=jEOsjAP02@AY z*rF6JRV>(5OxFi_;^1qLnbo2Cg1}YG7*hFwp38*$G z88_H$R?9!;E{A4OBuDfw5L@8zm{6h)WAFYPhn7(2A{3f(?Za}BtEjI?0t|m7O{rsp z52RQ`l_SSsG5;h4l)&--8Au!Y02J=Hopn$C^0HKnGhSxZ843FnP@TF%&`Tt|P1`i@ z&Ei4i+!hPYgd9Ng`izXl9p?`~%`aw~4KlUOg#d{-}~HBF>+Cfb{nfI1&%vX)Oj z^is^44WD+Ea`-#=xa)wQU=h z(~}@fsn#fr>v}5+8cNoBML7u+_Ilx-Y$v{ zg%^NJCF_aR!VIX1+XdB?zt|xH`N1;U?JD4Rx>vS>m#u)6VSHUX0`^>aUQZ;hfZm~z zTD?SxeY{-kfqmse2j;z@+W;DmOq5?8gR)o!?C1 zyr+t+5vb5=5Ab$w1;lwbq(|tSr9no+UD!M@mGT=((6bq|&KNdlQr14N96;zyh#!ff ziP^drG;Z#>1|mZ+L`}n8pMh(hteo2vq%l}aj=!`Oi|pqh|}(& zN*^tyH+n!xhXH4YMK`$!BKTbYMoGvgH)qEM6BG7)&YQ~t7(WWam%cKA^l00RdrmB9 z7b9WGIL3>NvbfNy`_`8m|8~1pbezb`NDunVvWC$ zOz$0+C|o5=NfZa<9<^lwDU{LR0=ih^E?lcHRFIR24%qT`nu>Ou zf#8`QZB3k782ur(x|GE;c{p4pE=MsU#;V>C=_aG-3Dk=o7PgJ-#Y{TQnN;s{xs20W~zO+sECQ6}gP|PDDz%Yn{Aj9`(1Q$?yLN?|&Ks|VHrV4Rapa{yWYy=~Z5pA3j>td4!;F{Be zzdUf!2el&lG{cw#gE>OPW->4o3(3}P<5mxZ*|F`SuBZgBgSSZg*v$FQie@T*#XAf$ z7p2~tQk<8eN;-!E)M3JmK4cUwooSmgDulRLmX3_7xK7piBJUM9 zDU&MT%M}ti6v<(e$oikjNWvgsAdcOciQ;BdZF7gKa?tC;#pTpPBaxPWIr*ld$sKfn z(@tSD>m@R0>)~##dxcAipJz}rG4w~Lvgpj9`$r(Uw{iH4M&s+;M|2=A#){4W9v_r| z9ukH@?e&?#p&f;?;oDg`;D_t)T$(szoXPtyNy62L^PU}iI9Ppl3hW2i#H>0O>L->Y z5j41KcY{BFIb0l*Ke(P3)>m({w}5|sif4J_9aGoQjaTXcrw?5$Kp~ig@)GlFfg3+F zuPE^VU}wQVfySEp>2aaEh@c|@1jp-H81^&2uO7eFJ!4j=Kc-}g#vMR4pk1y@F%(dfkV;f<`=*V7{C$2k9;74MUvCDkPI5Xy=bs zb7t|(?th})kqyTtR#I2$n})l}zKjZP72P;Z#}plH7LtnTAjOsqD}?d@9zxj%eypAl z`J>!87~eW8q!AFMES|0gfco)KJ$Tb>=giQPn;9uP9g+d1*K95On;0vMmX*hoSHjbi zy_sDA};*Q0T(JD$=As?i%kq2YEyI`@uMs ze`4Ri!$YxGB}dL1`wSES>6CkpT#^vmWQ{tKM{vDO+qyr%O!IK@9bMa2o&ay4iHn!| zM3xDf>0pV*Y?cInbLEK1#!wGX^Fy_8#@LO>q;5{=((ijQ{sf+^41$7EAdQPi!x{BLS^2^U@eY^<# zStQRek@Jc(CuB>&A`w69d}Le)5e2bR{-Mpe5~4(;5GDe}N?tlWoX^f}GCg_1EJS=0 zTGu|1VTeq9gd92#KQfPa$6QFDH!@3bvdMyF(|+YUOB_|uPl)J;P64D#odn|u?KUb) zygOZ*hoxFXoE2r$0DmTH0|>`(?h*3nJ$Ral`coZ4BjXpq@T_8C{==PPvZ=Ok`2x1C zGW3Ek#rZ9sO`~|qNE@SC`%q1pcab!0p}0B%hVZCPa^xvVtH!=ygv*xKt2^12+J>4+ zr>4S(TCiq{!S;C<|r^AGxZ{k{1e`Idqm_T zjweU?O%fX5%`2n4f(hA~MIGtdP}iKlh3*!jttZKH#1TCzOS9RI4`i8$-U{RCz!aW&-by@Ea*=fINJa;6IiD(#U$2?%&SPVYJfT6MpVD3l za1X(C;hr6>&nBHGC-l$z^a+&LcJ&@EFv-ITEeo?t#jVLp_f@U@^KsRhih1+>dUtU0 zN&jh(m|v>e#Rl;=#|HcMarJ4>qlW!MoUB?JA=418m5G zz-t7+zP}K_;`)y&9H>UIzh<@D(H7#k1mmMY2yr4Yk6)2T(+OW$ak=NcagD94mAWC2 zUoCgP3}~rTnVWqIUG0@WDw~+Yydl<2aWKwyv)i9a)@1E95&|peHmn_1 ziROZK!4v*Wdwb<+e2B78?qiM@`9sKw$2&(r?OeTcoY;X~J53$jJ zCvatY1lhh@^$t|>7hy2rZyZ+SaUbNJHWUIG9#@d2wsMO>x$QC{hpKPny+t8N$hYvb zoODn+RK&yxGKz`OZ2h~+U?YyJZ2h9Bfo2qO00x7U4Zao%SS@v-nsZ(b?Ka}G(K?O} zq*mVUlRpaNZy=3o-ufzHTI~=+J_RzsmS)ida4273Qcbyqd>#M-WSN0_#bpO;3~VEt z@8yYs@K6|dP{ws6C{AyF0Ng{eQlBCb)FXMxFv~7!Ff8o5hp>?VV+Yc}?4*6?+4!!d zoSSOVNLx0;cK#pz4Ic{dn80W>h8|x=oSVGa}ARdvZM#BT4Ji57n%x?2tiO$ zId{f<+(x|k?3yt<-K>#pdgXd-tpay2&h;%f{AG56#cTy36MQLJewrgEnn`WvaszSc z0vtnHwQPHmIp!p%5;kFsufiiZV%s7BMg98c5A%f@C1jsaM+wFh0)6%fM^yC^MEAChE2d>eGri_kR;tb^UU-&oW9(M*4IMqp!O(W0#mOPYU}>v z{T^Z2{_k6vVC2jh{ewNQc1$!UWoqgvp|3RH`33J??hDq75L&4W$?i`R$-iA#pip6TFQ$VK=86u4DDYXJdd9v{{42ebb8{RrS*r6fx2t)x zq6H7s0danp{C3Qo5^_>NJK!BEbcOftaKM9y%O5olUkztXVrc5n>(>fu zR9Gt%W!-*$KgaawOs_}LQ0PfUK>H5G+Ow!|ZwmEJoI9wjz2B4{wjU8xa4FX8lN@o3 z)?Ybizp2`Gadq0G;gvfRSCVcz+?7?h=Tg! zVZ$RC5@{8_0s|9({CUDVC!95ulmC<%X%>OdbH|}ci{#We>Jz_OFBIa;23V#06LvUO zQvSCVX2V#}eMi1?-xK}bFYwTs#4@r8HOp0THIzfx^-QlOR+$)|65T|L=UEfo8Wvb| zhu0dQ{Nl*7OEsq|vR-xN4Bx6SGT2HviHn)C>lZ%G2c2a=e-TUCtoy%}w6Zg3;;=iW z+Luqx<_ocM>&x3!W`aECReBA|XWg_;)7hZ*ll!^`K}}JCelw3QqwZvqoMvXQsf@XY zu;<^66Va4=Abb~4MHDY*23ZAoomEemLg_(0icZ2DVw&(5a4A3=F-zqBx~(MLvDT`L z`b+2P-w}5}xsFf1H~IGKtaYu)U5epZi5~Z5kFR*^?r%zABt+ibv8#58T>zHoINVf3 zb*$+F#ywk8X;2| z6Pi*DK6=L6ZgA&c-!Vd0t|JGvw;Yzj5D?O86?HXK&%m^%vl8oEfz_`?G0u9I%$g=M zq@AHp3(K4DReA4OK~;mELiUBmNI`5&i&VvzxY?as`JRGX{muSByr~uEoc5v*f@cnlTiT=Uw30i8vdDvS zIw7n=?}y3d4>z=qSNVSW8LDbkDsu+84SFmLN_hqvncc zxQBhAt-qwmPPKq;x;O-I?~N~uKvr(gkE4XThQe-dCpW+ywO2gpJ*?r-Ie2~=v49ps zM3c*pfz`);9kRS*cv65%SJKbGbKg@l2MZLvi?J}rG2Gvc&S;2xGDCyAkEZ>bC0|k+ zl~nk6JP>7dG+p92h^!_SdYqmXR(};h0T(~26>pP@y)zWOEyIZ`>gfi2^nLObYA98u zUerrBMWN_lpGw$@fz3zX$e<>0w%yJ@fIt*;IvI;Ag-0@UF z{Q4l$Nx0%YvB_Aq=|OQ~Ll^@TuFp{yKZK$=M!a9xlGDDk6ROQKb{bY4wEo1A_>Ld{ ze7z~9mQoVwchdc;AtBUKbBjY4j&^FH5hhkfAu`Bq@g`ixgqa-V{bV)iaMh& z@V%3dX$)A@rG*}Bt_kcHg}h)P)?1dlelL?Lxsn42E;ebj(zT?? zBzIOmF=@~k2AvnUbdwh&zXaF?%zH^q3QK?4^I5I4;RJ}2+7IaxgUnTN>b~r%Rd&^I zvZx5L2_~1l*8<0!0(!VJs&#LidKtc8e7_P6XFHQD0`~-UtcwLxj>|uIoba>{|DA54 zv*rqxoElC&3_dMhz^nsg#h!D1y6W*ye#i?xno~S!7ru>bU)bq-fhKai>1PoaX$K4_ zDge-~{6E$?z%8uFyqYHL^|gqryD+kbI>N@r<21Q|7T@n3aXuse*Rb=67@K-;(x)EYM%mTX&Vj`^rn`{s>)m09)aG$!aI zC%cDM>FDDcx-?U)TD()EAmGaePbv5N=7~_XSKUy*a?AXi9_Cdcz7WcJ#gtXdnROSI_bE6GC!(fem%J@MWgV z6qO(89qkY&PI@lzvAxVhw9Yz~gPA78S`8Ekoxvq8kZokDrKuKZ8sXoQ7WPxRa+4g~ z=()$Qll+H)e|rqS===U025Zp<(V-GEq6Jsa)f4HfEst{Iz;iAHqSpo(C=Z9G8R+{s zPG7%Pvfu+44AZAP6_k=R=zxC752#Q+CmRA6p|G7A-=mkU2?tLU=dtuR3>=r%fhc|7 zWG>Vwe@_$z5~93tQw}uHtmg>{`Qvw((%{iW1m5?&TZ9DMQNHc}r1rgd{8;L$`ydDa zvcea>xLPt9eWO?81u?gD{5t(^ma4(4JzJ$d1v~-4!uj4vGmDt^Q?9Aa&ICJQMA0W` z7!&CL!ku1@Lu*K|G++p4m6HWy5rplYs8w3R^7r7W*UPo*tN4mT zd(%w%CtD~#!5y6c@knrDK`}f2%b(7{TK><;Ky%(%L(R^mm#FZCV#g75ob#6`^&)7D! zhQP#SRA!f~&|%pha{(&{nUdtJ0Kr_lBl!L=U9OP?$-4-Nk#!xIv;C+CoCy(&26jUZ zte@**g3TVm(&NA~KN-+W4w*TCw)&Nq@|B?9N_X@>JGtbTV2C}qV7sP?JWc((tF1%0 z*byO_Wm)sCrI}GYsZGBqMGDro=_U$8n@%6!Hykf@)sr9`ye#e_`67rwc0@}g{0!u) zoad|uQf6fj`ySzQ!oUXcV(_T)!+k6+j(G)^W$9hJ?9T+eU6(-}2N(cL$2O#HlYiZC zjR1i^`5|C@O@~GrU!{Ux+NpnR?rX^Q zLGDOjmQ`7TGVE&ODbIFD-_s2Bq*!0LlWi3EnF(eg+D}biR!xTPa)AC!D!X1-Bl5u4 z3jF>8A{F-^l8`1hwfyHqiZGPfnty4c>z(}CnJczdt3%e`tT&RK*w}l^E?xJfwwakt z^G1QRK3CX6(e{;?t#tNgbD*^H>#5gHu&QE638V_dNr0>9)Cx}st$?e(9J6f2?cQzH ztW-rUKdGOwu3kR33Px4^5bEZ4)EVxGc(w(OoLLKX<|tUSew+ZT2cPUj@E5lNQK+wA zustj}=z79d@Q*b^hDPI&Xw}GvA-A=%{zak54UnR`pC)h|XP{y?30O~13F^KRy!AD< z2Zk5hMBB-;58nYB_QhfPtUOuMkBx__xMq92+a4vDx+TTtILB|a;y8Eb$X#*2sP-CT zn7HY{`+Iu2E|v$#!iYX9j-=X>NN2)&g>>Mj|2wn{6~e8T-?RzY?=I4LaS<6+IFT}- zIzjHIFfuw5AslnYEH);I5n3_@Y4^^Fa4*0p4=3aPesrKn*IF(%Z&9-9n9K+hkDz8$ zm;}VT#tbsoB_!?~)V4hDEkMvfU?9>_tqi^+L|E<_b7cjnC=Z2czbGapnW!SVH zP^+;iy_wahlx&*=Q&ABXQRixI9x14*POzaIP}|k(@_kwyK3;zdO{U|2==^?he%}oI z{{DoOdt{sr;r{v!34jC8*WQ>Pz8+kSXFjla4>iwrS#lH&|Llw64P6)zq^c`&?pz>_ z{!(AumQ4Y4`4}lykK9eawFn_#XT{3GZ~847&I)79>w$CBk(5kOj#*Ed+|Rb~dq!1#~k`Ilriw-{7J0Oe&jP(KV@ z4BY_&Q%4jh&T;<=TcTa_qAq+}{sCk&QDX4o8xZwHF;v-2T+1I~`oUQD38X3|da5_T z#^0VQA!s}Td(j+x=Q1FgWs~@kUV+S9FM8Z6D~gn_Kxv2cLx^yVJhR`#D}2uaJ}Eo! zQA5Tsle8Y{NS4#{_z9y!r&_k(F0(EV3?>c0Cd$p*%eM#i8w=zLg!lgs;fqTO!N5U|G z`o(_eJ5ee@(ce3#3WPV6LaLEH`~gx}&jB5j5bSbzup>`K>QkxtutDC9kFp*ZMCAZ= z&}t5;+RFy)kxHXL96FmOAWxp^c7v?Ohta60+Y-EzbMUQdCla9;R^WgBT2d`Op)%>w zz>o%`G|ZCI8-n${ybFpYA9b#LxlU2HQ*DhVw54 zYnlXRTIj3u5FXzk2>g9_kK^5$Fvx(3{^c<#Wdwft44#Ffhrd)`ETRz`s+?r-5*@b> z34VcPGlbB)YV6Jit#=KDvK{b~N(^UDH?c!?H9FA;RWy*b9Rs{~_CQ|_)Ode!v_d3F zvLb99!M_pO5LtrBJK+EnD{)V>dRX#wS6ZNV?GZWk8AX}kAnj7}~W_!)oTF4sGV#LT*RP4N)vxV0O zqw){IPSir^Ciy$4SW6Rx&N-A~wcyS(t!Kns;L;oxAH&v9fol-=ZwYC{CqnsR1#%w&{JDqJGWORr z0j;tl)NBzkkSos`brjGG{W|V;HmU~gb;Hh8A1R_ogZW*RhnAFdw-SIkm#)gMs^HH* z|EQE`x3ol@SKx(M7H{}?#{(BP5tYJ-N^G<(JYiGnXYS7{BWjSPbZc`9Gzj<@dcz({ z1XggB%cL#O^wz;DamwBJHcm$lv}CbEOjIJ-W3p;?k|%cd6|i2AdoOCb9as57ClvF( zj$fkA(3WuyCwfl=aW){zW0fG+B6V8NQe-72joWtJeSL(4f9&2ziqadmmzGAL-cf+hbHKgEQ8pIp);Rw#*+qe2T!97gA zHzHR&7B6@N5GFSx2!R3rjVoor9^3$gTMA98yhRg;4xWY`CA1F%M@QCWP>gvGz$(Gz zB4{J!LYy#bYoQQaiF)NRa8lHKtwKZY|C*J6{P$@O^{Ya3B>9hku=h6Jy z6X9nE2tTeMVt1ICZWp9mOS0E}F$JS`%kxKRhoJ?GW8HX{9}*8LI5ADhSD!Yhu>TH7 z7;g4%i_GX+gk%aJvgq`quEY;{3Z8+e(tQAB&QVXC`0MiQ@Hph%GWlp-|u_ ztnXX*mGJVLxL%QaBzK}OcWLJ5iWtU-ZN|C@ATX=hIl18ZXk~+seY0%6&vd2+>Y1!r zf9BHnH(by-rhmj#k;yYGAiw41Z;nNR%ktVniMtE`gU&eJ8KR315tkZ}VaEGoD$T48 z_QV>{45E~H%?y4@Wt5?|#A*z6Z(|X2_883(OrX(~G_i~(Bor%Co?=3SJIAw6$Vogq zfKYw_i3>M7blnIBKLo1--CEypCVf#{)gbqC6K+xeMEVNtzQ`@568k3wF19nQbOQB* zgc|O<*}Ijhw%1dZ@&tstX%fw1bP;%rUYpx>L_Y~i?$AQaaoDf!RIn%;bn?WVg|)Zm z?xZT2YQ5I>hvh^8{;IJ3UG?R#?;Q#R5cGwsQzd)naS~uTV3+Dg1rf^pA}}G5YOz~* zfU&{@6f)DX+5)+@gnOUU1u>6_T3b2F=(;^5(B%0r>$K3wXRJ4DuJ29VywTEw zQSFzNjMu{=0-EeIW`q1ZP2Mit)AdWN|AKH?+#>byMXjB>KiGc-guGA%cX@x{JWLs! zL3N5j&9k&LtpR`C-GBWZKOUU~B)U7uMZT;LK~r_%K1HdXKocb))UkA5dS1|2yjH~< zDo2O@yZ}1OYMxNi@h&97hC;TK;@V-PBXC15;-$G1SV{*v^&yRiJmGAsFi|5|H-)Z} z+zDb6!owDO0X*K6OcHBNtjzCedSVZXrOO`-@@YL<4d%POY*S*xN=^l*kMT^ zE^U8+3}%Tnt}7e?FDYW%%%zZ|U{8Or=bHa$^FxX<3u!?Hu)#21BvyqrB)?ezK@6}* zjeVY!WBnEi2#T0+3xYe9(5KtqFhm!CMr@%F^8GpvN6;W5h}Hm&c!<@4)rbPwkao_G z(TEl zrWA8vAICOlXhG=!Kz~{TmY6OcUP@kq**07x4q=%3)`q1jFPeF42PBgBQ&5F`n)a$V92W9;^XE*I;UV6M?M z5-YN~*%^W599u>*dVhrwCfhQ&Aie_kne?}kS*Or7@*+?I;K+0NT`Mh9T#glevHgfSs-S*;eIGiLPOI?@hnM03|3Umr|B3jZO0*O}|ny(JDxN^|YzR8LR$7GB=9;KZ82Zc4z zm6^^INQk5y5ElS7Y}8kdhMF<>bTq*|3uGCGh&+<72bGW(SMmbOgQ+SqW<+JgX>W&( zjC*Jb1<55+5??`!j-jz6;fLagQMOTZ9jk0<5L4M0UC1w1m!bz&rrrt_*Y13Y5?yFz z%tLkZNT-rC@&5pHK#RX2s$uR>F)|u@Z!s?Ac7{NXxk%T3T}FQ&_Y2WSX#FDs4x?hO zLDw9Ki4z(+6Gi4sWnsf;HYE6Cs`FNGtCM8z6B@!Pq}=783Jk>*J-c-seje_5p|8rN zn*<-@2N=L*6JuMKww2jnYyyYa^IwDj8z5gXZhpCX-!@K#xJApaiVnNLeDqr)3evG= zkuiHzjwH1&^HhIGuOg%&`Ocq=F$f8G-;VUyfdt6ho(+(qG-`+AyQsV`5~LU*0{S?* zhe=|Vwmp)B7rT`R$|WT3Y@PQhmkop%gwwI@MF=d*$uo~);n#i;Psx`EB)-r=OjuhG z#c^$b=Ex0o&EoY)2z52eYB|{Pk0Y|DuDoT$KalSM^Rs_sYP@6}VI&Iqa;NOxryK@B z^>^e(dsOijkwDS)Z;bDY6@Fc$ypO|xTcw|3#DM8|a@UnY(bI{G8BZi0AZAb`NNz>RT0QZOTK?O>6TSjEyzDIx>zIdTgGclUbk`5)n&wy|NM@4~Y?1?+u3Jc4#pf`L}05*;7eX~gb+#Nqsynt;Tt7D*nRKb|WO%f`X>4JK?~-xT7(hT>g-K*l09G*kY`nDrySZb$VzjY==?1)oL`L-j7Cs32*`m&1r2|+gf)}swzMajmcF6|yVHwT#lIv-HtGl*#E(Gh z>5l-(c^4`RxNn@EC&W91BE3}9WQuk|iRC65BVexvll#qr@O})!2O)r;Oq_db`@LU{ zpT=ail5&@^{W~eCq2}yoADE}I;mrI^v3+Z?*8qBDjrF)pQblA)Jr7PmB9sa-43Tow zJ)>bgn3oO&4HtiHkZX~xNS1^8zt2US^(?^(S6%0!1!8#Wa&*)67k}51G;=7#ZPuw> zd?scC64s{qtp99cAtH=a@kxas&jW~{y&E`2iU7vR-ZrL7li_AY{SE2k<4|zp)~47Z zn8h7sXdYzSghD{Z>JEnTfFmfe18ZdIDoAvbuFPNZBi?_%{q*MJCDmX{1upv9d$DVd zABhBEgz;k8lmqUmqFaP;VRG5>?|9lAUZ@Z9r=m_46#xMeV_?}Ys{e(xzl?2_vDX!# z%8gzicIKTT;vL51qR7@|p32$-a;XBh@!a8i!1>=vELAViF9~!HesyKA86dWYwmenk zZ1K3!jZJ?E#ghpBk^`kL#?}>Z!&unte8uHkluVDM^)D2ENu0n+dvR{@)Z)#EeMSc< zvCiEFhTeyz<6EsP;p^$d!@Z;qy8qMyxI%`%JiW6n>rSpx*B?7}+dsz#n-Bi=NPWpP zxy5G`uX8{#G2qZ4-UvXXC#)DJ)5o@>gx}v`2%mo|-7uRa+Rt^*dNnw$6Yc?PU6ZIU znGm|7Jn`5bSronVSyFzWa+8)NB`jUu0-unKx4mRL@w#Kb$DCN{aiv1!8~*LY32cYC zg9#dcbYu)LS1EB)QjZ;zN~K{66pRhGa7!%oN59qItBbmPg zN#%c@FOfUY*Nb=P4Mb!{^Uz`DV_|R#5L!ZwbU9HTdON&9AIqNN)e^K|StMUzpcFIY zD>)E@AHOlrdTLqWaZm+sroRA!gEH3RV1Q*?VP*nm5b1I-DvoKs^$i2|?PeXXS9I|B zo1aJ7t~nV3G(@UE#NdVv(9Oy-wp6#C#khY^IcPlISmE;nWL?hgzM)uu?CURJ=l0`o3Pv_{8p*vfD|MU#wW3x|n~e zPde}7t}hW+!m4`_wh#w^VU{SrNg6OiA!-KtbZ$h~US^g+ZG4_@3=?UTKT73+!IR{L z;7ff_GD3&!r`uyS#<2Y&Oa%*U>z?w%LaIxtK6W+_j)h5C1|pRoYU}`kkCu;Am#W~^ zuyjTEQoUKAi!0MUEO0?oMNDn)!Qp>F+Obi`x*a>#tpiY!H-Y9x4knE2O@r%c0Epmf z#lf}z^x)bYl`;rwc+YzzWM;$AF)MPkM=17kt_Y>imVR7TptxDY9p_)yKPCtrPfZSY)ai|_*o}HJq ziBCw&n#qWSC#Pk!gKt1IiVGBy{Y!C!#B5n#dZPf@NT@AO4M$lf?1P%m@;KYN==bd& zKf;jO=r2q3Cg@u>my zsJAV7lN6VtZ9)#o;mmJ_!y&0}zI}|s*#l-Nq4E9PT{!a@j(r-C_;5e}?b8p|X8!G) zzkNgZd*b7}fckla|lG2+?F_K|sko&#lJ_`Lph&1X@jcWsig&#Ov<}+omhGo0+ zH`8WEhgYS@$CJ_CLe!C2~Gc1r<0{^!#*G&<-TfQJybfQNvh^!Ib zJ>Jiq#nOibyQT7}RtalFW zeadO`NYz4lMmZ&Di3FGm*;pt{j)gWwXFG-wM2~3(y2^A74;}aje6fGJpNGuKb`=GZ zIKU7>1UyJLS%O6jg{kz?J`E{EgkL%0r-W8YK0}|b$KxI-g9Y=DqXQJ-ShdUJjDh%n z`&fk?w6jo3P^??4S*Q+l-RH+gU8TCxH8G8GvrC^wNr)diIxT8jx-IHN#~O1G_yag; zl5$knVOSJZV0;d?6U2Xz&|w?6L2SpToLCt>;OxkEwkSNIr*vpQbD(150f1#?{Lrvxt*{WKDX_(} z40d;apP+uWqruZ)hfsiP%XOU@bIf)rM2LaSgB-yA9d5s6*^Xuz-zUQ2<9e!U(12?( zqcq-ak~Q6Dy+D7@il!t}o6XgB3*(k5G1_)}-T{66gi&BPxhc|(xuZ1+8oIks{)?5j z9M*vV?uleaD;6oOjO9(|)7;T0Ke{UY%M>@++RZ43$9u9b)ZWZ}e*LMU2&EagD!!zt zR%d9|YuBo)isgzOk^@NA2d;4uaQ`vheD9o}3Ytp5v>&=us@& z)(-C}GuPi8^8Y+A@aKW0EIDH+PNl3W2EGVYx}WdryQ>P2 z+?%f}m9mwtZf{$Hr=xX2AlkP@ZnDIX2Z=yPy&>J1(DeRV&~%iSZF4#;@Dy90spxF? zV3X13nCO2KO?gzrB6C4H50rK9CN-gI3GCg7KLNDuy%+V}{a0aqvC~|RL1qKi&kD`g z2F#Vu|G5yDQsL7OI1ORf!O!Y1fS;>FLTi2rKiw|LZRp&+mNVMambk0>qV~?eyeqo- ze}>X-v$|c~z5*ysg35J(u$};fYwp7gdEfGhw#t9?@@{;x0;`|OP$wjt+O=|qV8alu-4F?h~adUN04T``z( zZx^?Y+a8Xnq7V#{pGqGQFuS;NkW%P=RC;xq?wc9XsUBgxQn%ODsrM>$Iw~XfAj3(Ujq79FE9SeWycp2|MmsMzuhih zTKr2u|7#Hcxa|HU`L6)}uR#8uvwk`Ge_;GtQ-rb%2eVJc$=(&RX2&clp09fW0Gd~)Mfg$;T`aEuGoBU0&0tnBVgJ)$TYpaL^Z{mOVcDnny zJc~J>>)#1L8SqhX|85-j)m;8_asM_BCLr)_lpMinoeiDZp;F7~jx@jS<0DyLKOZ`K zx*sz}!CuDl-I<{uNWxFcvj3{p`&Gw+%v~Nuz@CS0aB6ms-B8lP#--1lJ5zOHnENk zEZ(1})>6RI<)6=ReT@*5%~)KKT`(Wb5f^I7a0^@AC$jSGuyG{RJ-F(m6dK>asX7w- zOni}rn~w1~TJ%;vjOLpI=#%)CuITdFA4Z*ss%u=s*GO;~{P)};IeUfqFzO8N%G^%8 z0=H)kksoRcXUiOZ>{)+9WdX}!BY9*rKkzSxP=@9GlIm*7#RajnY0MmJyfVRoRY)^! zJ`UzI9P=5?S?z*Cb={3f5QNRT^OoK{qmd;6KeYPl%{F0-$DA?{5bxo2k#W8j5|};1 ze)bQDAZEtD|5Rcw)5o>_{VCEN}ji-uH1!AX|-HI+l!wP zzC9lF6O79ro+E62=SZ5lP7Mz9S z8dpE{GkNtOkJED+*F1bLXwaUobZsOk;Qmam8>VrAMHT8VFKO2fqucMMDeIK!I`Kzk zcDk@5?*%F>1l6lcyqfMchO(OORkEkT#Y6{_?O+dn?t&DbH0K%&P34_erh+TKWlnKe^lF4N*l;5dYZUZ@iG@;MWiz2CSus<}b0 zH%v*7#=M4ODgHDtGX$gBrlSo-o*B^BFlx7d0P`x%{{T=+2ME7+TRCbB002N!002-+ z0|XQR00000JY)ViKyn~y4Fv!I4Y%?Y4KD$gQx^>q0Wp`f7Y!~lGA=YES7~lDG9XWI zWo}PqW@%$(E^l&YUvP47YGq?|FE%(ZZ80(=LUn0uWGy)|I5w9Q7!9`=WMOn=J~A*c zI4v+YEi*7wF*G_dH99plmkSvUiUBp3mKhB$3o%4gF*ZmwHcc@(m(3XsH6?*|kde^e zyo}&XqN_+q%mb>5a{7L`&^)tA=3(#A9P&uAAxctzWaqQG7UXyoz8!095COmZdk3Bs+g!mz6U)98a*c zH~ zDKwZm|39a0@vZ)i8&#RPb$ibZl5=Hzt7J$+XU$dJj~{440U;(HthsP>zTTziq2Py( zUOgB?l+FBtXhhb%mkULq{DTm#p*0&P16Sr-d<&GIH z629~A7xY8tC-}X%NOWp%KR2PvXM+#h7MYs~_y5Bt2J~;ne=C0NibTUHpbarR>drATOf@c=WP}Mg;XCK@(fSp#v~kvUHOOdMSYlh^yYHo{7{Yq)UEzq6TBA|gz|ZS{w3}wF zt~F;JCm^TMBpUd$bl^<_I-;r?RONHFX40x8j$(O^jH%Pw=YN=I6zVL}bv>`9Vq1|P z0I6~dH!(bn3)Yd2NzD#jI}OkU?r^b(UHD#nWvf|b1M;rTI zSwS*ueis+V&k$-_U}I6J>Mm>^xHn_u%Sa30ycc9(V+2K1^Y^;uN#ec0!94%eF%zec7%@SGN}VEHhf>z3IP>HHx`rW)`PuI6+9Ap(_Oh(G@rt>K5e z+RG`aG&;@)r~$J-`H_2ncd_>(=-g$RRgv^pAG8*Y01^k#%2PEf#C(;_WKx3QUhL=p~DNj^sKE7t_l>%r{7Z3iOvtJzSO>Y!B+y1(T># zgmuWcSpSP#oe@!K>rP(P1o+)x%#~bSPppVTe>6%L+SM|!-4M%vLvEcpjML_ryUUvE zJ}@SvNz-14_$Pt(8iQ0ePfh&sBXerh+^W|J%LugzpRn@ynh-4GePXn89I3wl8Bin9 zj8wHXs7hvOuyxHQI;o7oiJmjJGu~R~hZ<`nlE*luDvi0yzFi!AdS>(s#x=LRj`-u_ zc{G69gz{JoIstiq*PgS*zAFV+TfL6=Cb;thw{lf}35JUZyFz5^0%E&pMmmGV5usKo%zxyB;4;7#Ivx1j@dIX>xTgF(@C^wpPO%0b< z3{JFelDBl@8O-$rxFK5g+Mt!8v7{n>7xXwAEcLUlNfE~lgJ7U~r=KMP>><}x5%b>C zZzqR=ah%@i04K_?DU%S7pCSu)z(d3(qVr)&K-yp?%&05KaBdIJgM zd+)24&Iz4O71p^r_iH0;!p}lKU`s@`1u+yRj6I!Cq+NwITVTqM4C{gNz8n*Od`FK$ z_$v5KCg1G{l^a;F3$j4Qn+skT)kYdgY0tI!RV+92od6m&f zG_XKCFctHY5zzwKj_y7@i`2g33iqIkDpS8`QK?uuV^rT z0$#^tb5+0O8ZGauDbb}-cNWGjuEPb=UK?pBwN8d1WX)?qW6`J=v1kA#;}ZQ7_4v0t z&{qSz5{Hu7`*1nIRJ_{mX>T!7e?+2eF`gBkZfOh$<2H6c*wzIeNr=OyV<`t-clto9 z0H2(qw$@&2Hn#1y?Iu-+oPVVQ3rgC5E}45yafqN8sWN zNQA04&1b?y0yzUMo~$LyK&afIMd%|u(d7UM&$})m%eF$3Rk7P;wI!e>lBCbkLi1P( z-)^m03jfZD`d^Mn3Wt>3rfAjxBYW2XLo~H6jhK7kqJIw&>l-_xT)eYX>W5T+$)MJF zpNAow4u$^e+8$G@1)-T%qT+*cOZR@%k{XrGyAe@H-VA!sQ+dB-ACX?>koelsi^_p* zrKpp1e9qbrlYELQX+Pt1Nt`BF=HJ75dqH@9_2i?fta)O$_$ka0wf@1V zK2evICa3#MRz}@Q)WRD3l|=!6MQ#GgC@CLRDz9-pg}(Da2c}Yxr)(QOhhQ7JnIf=8 z8DD&Y8-9nAdYO|PsR+3YV<)P_3e})H%=Ogl)*TAti+?pF#Hr)_ZGJkFSaRUBz`B<> zA-J+pD2B_C%1a*Xv6_nS#v)2B>|ML;)yiFkQYuw+Fk zoY1^MP-fHxm|X}*Ig)l_6}tzTu;BX?K&hDj(_(+ckw=X4yIO=+_(`sa`AP>tbIY~o z;C2lF4%Av4B_WlSEQ8-es%tGtXr0F#Gxhw=`_WWBl9h)OvazF3aOD^aM z8E8dWCK|kW-XWJi3cxFjcxxqB(RC6H9qbvugERTv`e!Y^8EcXM&xMl1Y#aO3?Zgu%szW`%-K?)6ND zByP{Z$HMKhp1tpXYPdh;Y}*&HN1QS-84KcWN8=a&+%-B(GTu!mRx-Jz={{bp6Z4Oq zU=uVty(LbtklT3Ne^<|hUu%ep*cGE&`Dk}53*$IBkzVw^R=y_)|HPw~rBH5lCx?o$ z^t!)qfNOmzM~3^)fPhD6m=JZJkrb;>SqUjG_sxKw&PlF+j2V?T%|e5sCzI11lO1K5 zR~YM%JXs-DNK?(=<+m2E7P`+m-= zWc#17K#psZU5o!ngeBgj^%*MW+g!|EDuoNeIAboQNp>cSn-pxlZhL^WlwEiD!=EjK zax_NLNCDb^7(cZwsgDV0>!Z;X9$J!u9BFm6AM!JmJL5kHul1|?+lTpJ>bSjI-3*us zIqL7DlCM0E!e<=)DENuy3avO^hs&|hZ!(ot|2|+WIMA3MwiH>*0 zxtS^wauz(uOjp1%nOM2LI+?kXbD@t%*gFEW{(lUj@(UE$X3g2uP3L)(f|JH za)I9`d3!s&np4EOE)Y$nP-j`^1hrY~pZ(@FC@@h;lAAB>8!t3CqQax`c&YuDmPEOA zDh!){iPZ>WeN9D;FiwL9e(~;gG|*+)GDz9s*b!u??VHW9AlcDK-SHiFEd01kVasMI z_r|CBN*qzdOZDn!A(@ZqQAaK`#d9xb@L1a?lbz_R!>H-Da8bI56X(Pe=CAeX|^YbF|apFe!1;CRJoGX2cIgiA&AVJ&mxloU!K# zF-J+@gZ*2`i!QjGFNZzdkWkYtPltI{03m$_+PGD`bV{31g0QtQ43cCMCl-0)$$Urvczxr_s-vG$;3GSte6=JveGy z-}Li(u24zk!|9tp>zz$&%W@5KaSe4D^`0){c~#3Etd5-&S!nMuUc?1oqGhK)rYMhk zw;&lJk;;23_L+Bza1fdHVXWkT?HCa|>*0TA0)O|l(J9{*+RA4I z20=uOIq$da%tHoU9qi7k-H#k5Le6(M3KIutOCl!v4L+E%W#LffIr5Qz-zeCb19QZd z20z1TT$b@Jk{hQh6|8wz=$&tvlxcUi|NUCJjb8To_i(HgYU(WMXYyEAh&+eJX`ozfC<2IISChtkQasgcHB0^@!h}fy;PN1lnRB9Oav?y6~RpU;JnIb00J5N^%y`=amRepneleY*V?Dlbp%R&n! zyC;981xyQG!F!h>;Qq(NK5-4nI^!F|$hE^)xpOdWGG&`+HVXBBrpK9CuUCGtNO+sL z{*evyOp8?W-8*CUnIZZOlj`re_v{k}>!RrSrWrDL>H9tNm$oVCeEEmrOg5cPdPg~) zdS>}QGevAaf28mk4V6p%S>Dg3T1pzV0la>&i|rFrCN;;#-0{u3+ffqA4$02j5{+)? z?1Ekb*UmtpWE1^=%!M=nYw0W?#`swXcm=FJpkF+WcwcUy<;btEd>_2JwI+Gdg4y`UKEttKXe()xg~@Eln$N1sVrvh)#^4L;=#13Wq`@yVLHEs1(L8gKH%tTE zaRJ6(ym+6$bYXAFWU@|D^?o1~Ok%RuL<=#t7yF*7U=9}qG~6i241F-CJT+;eRZ#px zswDRWp1S~l!k)kh?HYVk7=I_ndgkA$F$DMQ#2oo;USC@DiK5>!%IhhP-xcqEFx`#+ z8(&0j^?`Z z!TL&m#5c=R34F2E` z(#|Y~4&eFWib(-WY&SvBF#SIeWbvig7OJ9}h#rF%Y<`z!cGQX3=^()0 zm0A}B{^2m0m3huMGSw#reQQ(MGz8mELRnD_NopdUQADJob`C14#!(a+klSkpj;caUQ;~oZVmbfPed$wGtq71#7zU zM3Lm>qLw6gP|CsKCL`r<`o#KPl$On~7gZ<%lUUTlWk@^&9d;QWCBcv85rpD0Vz zhkGiuPNnel>ArsAprIQ*&vfi)4GFHQwlBN?ExkuIbT6*vu8DHpce1iOpg6n4R}aTIvp#=o?ewysZ-y7?FU-Y z0kapTnDDceGpajwwQUhvt3&aRzE@UkkcAbJlRc-C>+hDiAQErc%h#^@eo|strc7SP zeJ^8vPgzoIH3u4LAy%X*VHOS!#2qXjdrwQR+bFLW7{Mr7Hm*0yoGTHyyFZzqU*$UA z{sY8hu;F$3g3zB&)t=ielMTy%e0G9k*l%^kZS;N3r92id>fsc5`0(9in5jv5lBr39 zPwk`#m7y!+#8pqnXV}KGNqc+rpH0?W_fNs*`))n|Le@S`>*U1*-{1U_%EGG&dWKb+ zdoPMWbA2}s(%)V~bxa=0r%!5oTQAS2jVTW43{97RoF*gOy5U8TV8pV2WJeMnLb~fr zWvLLRrv(kUF?AmAvfXc#BqSCEqcnUR{KzCvVi|Cpmu~B-_lTqOlA@^Kp*`Ut1wof1 z9Z5;j=Y8>@`yz8?^;jk<`aRk zPU)Q(CS?hyu(LEQul2el)mBXXZ#?NX`QEZUEQlEe`$is#l}f9Oo~2l2#kdfo05b~K zF1+Je@$yfq^8_b-iuGHZIu`=!F&amww{<3M~xXvc>o+ko%IsuB1C?{Xi$(HoZ@OT)XfjwRgkM`iu);<0Y)T z3vkcci1}ZB-j)nzQ8Y5axA z8juN-T=+|WFrjL{u5?W|(m7LiBXVjDHa%^ffoUct6IF;gg{@rZYU|QOX#tbsg1Gl5 z(HVOzCs7Y*#xo|_231jP`XJ^=NM?j9 zLv`1~7e(|jzHpdBWL?lc)k~^DsGAkS;@OCjn#DPPcOuNauTg%kFKPPch?fVJYU`d+ zlGxrh^*x(1CmGP3P=WAC>~H#IqUSo^a@z`=LKp4U3Y_s1xjOGMUxJ!n8D8L6l(qd? zcBWkdLvNWGC%QFHK!2^=2!THgN?>@KptXvyx!^6sM|S< zJm(jGlF7L54eOpt1oKz?O)d)amkqnp?o{$rXfA&4=rFKdq^8A&4W9r((<*+11zgQJ z2!a``p;e{k!d9wL*lt)Rm*RS;*R!CIO=aUJ8GfCLYN zd*((p52!IE%wARhN4QvQPW#Apx7V% z&jgO?*6KvJd2i};#_$EC98WuFdv7&t2!gsowASm=zvM!&{-js7$F8=xm??oHu&D{h zT|1#Iketnj1Gx*?y)YE>Iq0SUviZ|=; z**X<|NJw-jfjKfDxeij^My^YA=17)sAKX^%>vEr_Y?LTdvostC4dxLuUILtVT zdu~>oPm-D5{$fa554xHnvI%P2TH3p!oAo8 z7FDQi1JSJqW!+GR+0d0HJ}xAY_#;)-f?0GgYI(AL`-hl!o?TQVmV#4Rt>4e)G^sAu z0-F1cM}zG(eiZ)13fvP_^bfGa8Oc6cI1S%#h$Asi)f+x%18BEO8~Dxe^gfeHhC& zm4M<7b&%s^#!0rSK-nxRY>n7yLud?4v}u4YsM9r8isr$hDZ^~9Ab86`$z=iRx9Z&=iumxS*%H}w?g57c;G^TvX(BXzKd!N) zz+aA7sefHx+O&r`z}F4cmEi{oZd=TvIS?4Yu z8>H}0$Oc0!$q~fQfu$AXgz^p@Rrgxb>jkt17&Y@890A#{^}tAQ;PCDtBt9lBC; z^VMt4Hl$^iQrQG2A@)zmwb)ojur_Nlpcgzo`d5F zbxB=*pGtO6K6k+scw+)6V>074A9zZyl|HZ=V+U}uX?~I3r-sI&@ONf(W_I+IUWt>n zX_xUQH0qb5bc*nQMe_rY0^0pUw-?a zYf!bMy}~i~+;Q4pq9={Bf*$AW(uvdc%$Rk9Wr7*^$_4g+w|j|uQtO1XV7ef8 zVm@1)y|USSg?3=TGxb%EGiFyiPjbz~{Jc4)<;?FYa3z2WFb zW%gw++hp;bBo|Y5;9MJD$@-!JzZjNI=|MJn#k!?*onYij;ccX|SY}QXzNx~yOU^rB zVxK2}{Ds0GbPly|wCh@N-B3GsBv#5>FBs_3am=1M|FWA%xXlPgYZA*6Saqq?W)9j2 zOf1KCbTKz$#pqL@|D^JgpPDb-;@gfD4#YiGSQVu;`8fWxMEI8w6|=0A-?cbMUlj_i zpjGI*R_#V)Xs_{O*(tFqay#dnO-e~rpx`Kfy@{G77}-*LTlddWiiTIwf)DG30aYCn zSTDMMys9B4R{v^=9*2r*QT(5=Q8N~y!W#q%@O{3o>L|ej01=IPq598HcP92mRHClG zZeW{MIhmo|S3n5tdAl5<0(kNW#+JJHdjlDW=K(!mQ9b;;A)H>+;7EuWWlq05c-`mp=W=Meb6nb4jahaqI_8O^RYIp!{`MV`ff8|To# zYRE~ZQNadW-ay)a|Ngn!iR7ec(^?vG^|WcAJ4)|xez;U~bIEyxMtm(0Ak<-G$5F02 zj$<;azqy(6da8>f+veqN$Wqo7H}5J z7`qv1*U_hC|8H1+Mw7*j=VHJoe?od`s!E!QAo&jw{{v7<2MCdn(f9fz008?W002-+ z0|XQR2mlBGJY)Vim-tH!9Dl`HTXWhv5Pm>$0x%#%6{$8AG9e*p8M1Kr?HS}4?pj0iF z%ca$GF@NEOg?#b4K26ilX)Rk@sn_eJY<9iW6MPm1zo1J$54fI4pm!oJu4nWz#+i`o zVxw9;Kd)3TN*~GWPJg-wGrfuS$=B+a)5AzlLSN4}(XM?xtCkO={WpZce52si%2}Aq$BXrtDrfjJOK5Mfhz<9%8Lyx6WEVOmpf9V3T}iC+o;bdQ#+GCiD-Nhavxs6 z|7fetUY5Os@hO+PS-k7N6IE%6E?jIFhd#gow>e+E_NB5v)qic#QmcQh@9okmbQxF) zmW;BM2+t^wwgpP9Ts=EXXh&!*qK$H&m20PaM&VS5=nhG}ce%NcNO@1(Fhtwb(?V`0 zTPg2JxU0s%z|-KjB@XNn(i;YUj?Zn=dB|^GfH`KjjI?@4B-NPP{!3~izCWOn-cj^} zaZEh}2giW3w|`s)2s3&FCilX73_1q=exeQ9_mBg741xLTHi=x2ztCoX=yfZ9o00T&Y5p;Q{xfG#>8*IjPWT9|<)1}w;?h++xK6kkV&h0Jba zl%K(saJSm+01sPjcv~W-K@>CmZYxX%GzMuHjX@{xvwz7kxM0X<7}uZ85GZUIE7QXy zSxa7=7k2|GG(t8y)HN*MbD;{poH`+=a#<|xC~}5^7UVTCph=>|%8QQAAd|i+Fw+QT zLH>+9$c+y9vz;5gp!ca%uEdYEt7orTkNl=Hm`2n1v3ehjI`t=iQeiG12IEO(KE<(z z+Ewg#9)FhPf4c4_?8%Gj|G3p@x!bBo(}+Dy$4<+w-d5bnLxS>Oxsx`Z4#|X&7V+_u zUk)MjG2UA~{<*1)`VVQBG>LOdIt%icI!n?yCtm72lg=Z)M*`A1C)2=*@_B}f$%vTw z8{!WgO*;3)4V%N6&ZH(yOGhkG4yMY!)U$``6Fq{+ig%DjYS z#hWcSCY%eMaoAq9?3sOgg8Cz%zToTw3?C<7nG!XxPVYp9(oJC7k?t^Ntrx^PPFW9C zvVT(!lQ?F}dj;~6YI=OQZkr0&X1W>EXLwlk(fYi}gtAc#873VjT*@xwaCG0X7V$u+&=Q*_3uB^Q3va?b3~%r!5|_$0TV~at4MR2) zDRG~SSDU)P+{Yr3-Uql@wVie-%Pz&O(0@%D>qNq(q-o!MQhjd9N(Hl@7gjrX0QWY1+0K54?Z6UKg+9nTc+nF{ z<37g?K~J`E;8M_Mer~fHKoLD#m2K8qvvuHBJ?g?MgxN6^RuK_og~V@KIQ#3dp?^VZKZ~vCl!40#@DOZNBU(#SkKHCwTWsH{1APt8tSZJst1W!#pta^!LWM9U z(u~KIaGR8Sz$~1U-)4}eh$71U4gI35J-uhWn(g}wT~uNbJ!?VW_da~`*!ICe-AII+vH2QfVa@`6*#?^zA2d3qu%1& zCdD)J8kzgn-QR2OleN7x^t|3fx*KRsWgeN z$+>cFZS4wP!`?Wdt9E9Fa;x=pTa zRldW&Sc7X)U3qoy_swp>_T3xJJDbmG-SKY!UDm+PcxuywWk$cdKic;lSAFb~tM^%Z zlVI=5rz-K6wMEu2&-QiwdUvC#smqhR?dy;3S~-2r1~2Dg zp7&vb=^uXU>6jk-7geM4mSdhm`-6|_pu}K)-(j~B69dB(;JWDmZ$>5&1`%)y0Iiyy zzB`mxpB=~rb3TUhI>J{XTZZxa!Dafwc!}-Qd!DqJSDABY35!YVe2&U^vk}0=Q1PXU${>CVfoFSwKnV-G7-TJ2FX3 zKOey>4{Yp!Ju}ansk~o~fdPbdAt@e8uFhr!tG13psNRsgW@(%xBLfJds&4H9sTQBE z8Of^vcX1-n#mst3*uXOT|FervUlYa43A0*#QoY1hK?Vj8Mm22O5-zZo{#88Un0{Fu z2{d)uHjomD=?@}#<>B@PfMlNEfM`~@%_=Sl3nf^S?t9eB@LNC+rcbYq=GBUUE+E+?7?ShzN>cMm^eS?5(2YZ0XU~PA@jUx<#u#4FD4-z9vU^}@!-1l(P=uEO zwD299@yJb62^3vRBzdP_l;)L8Lw6B!kp@i2NZ^SrFGF!^Nl9j2dNDT3kkh{?l0F88 RSI*Pl$MCAN`MdD~#R0#lIl%w` diff --git a/ext_emconf.php b/ext_emconf.php index 552578c..e5cc108 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -1,50 +1,38 @@ 'SmoothGallery for TYPO3', 'description' => 'Slideshow & Gallery. Shows images from directory folders, from records and inside tt_content (Element "Text with images") DAM and tt_news. +Thumbnail-Browser, +Lightbox. Demo: http://www.rggooglemap.com/dev/rgsmoothgallery.html', 'category' => 'plugin', - 'shy' => 0, - 'version' => '1.5.1', - 'dependencies' => '', - 'conflicts' => '', - 'priority' => '', - 'loadOrder' => '', - 'module' => '', + 'version' => '1.5.2', 'state' => 'stable', 'uploadfolder' => 0, 'createDirs' => 'uploads/tx_rgsmoothgallery/', - 'modify_tables' => '', - 'clearcacheonload' => 1, - 'lockType' => '', + 'clearcacheonload' => 0, 'author' => 'Georg Ringer (just2b)', 'author_email' => 'http://www.just2b.com', 'author_company' => 'http://www.just2b.com', - 'CGLcompliance' => '', - 'CGLcompliance_note' => '', - 'constraints' => array( - 'depends' => array( + 'constraints' => + array ( + 'depends' => + array ( ), - 'conflicts' => array( + 'conflicts' => + array ( ), - 'suggests' => array( - 'rgfolderselector' => '0.0.1', - 't3mootools' => '1.0.0', + 'suggests' => + array ( ), ), - '_md5_values_when_last_written' => 'a:77:{s:9:"ChangeLog";s:4:"5272";s:10:"README.txt";s:4:"ee2d";s:31:"class.tx_rgsmoothgallery_fe.php";s:4:"85e6";s:33:"class.tx_rgsmoothgallery_rgsg.php";s:4:"3502";s:21:"ext_conf_template.txt";s:4:"c9b6";s:12:"ext_icon.gif";s:4:"ecd9";s:17:"ext_localconf.php";s:4:"8220";s:14:"ext_tables.php";s:4:"f8c5";s:14:"ext_tables.sql";s:4:"0d79";s:28:"ext_typoscript_constants.txt";s:4:"3b61";s:18:"flexformDAM_ds.xml";s:4:"6178";s:15:"flexform_ds.xml";s:4:"c433";s:33:"icon_tx_rgsmoothgallery_image.gif";s:4:"ecd9";s:13:"locallang.xml";s:4:"0d92";s:16:"locallang_db.xml";s:4:"1a7d";s:12:"savefile.php";s:4:"cd91";s:14:"t3mootools.txt";s:4:"c2f6";s:7:"tca.php";s:4:"a7aa";s:26:"res/css/externalThumbs.css";s:4:"6325";s:27:"res/css/externalThumbs2.css";s:4:"c95c";s:22:"res/css/jd.gallery.css";s:4:"8040";s:27:"res/css/jd.galleryColor.css";s:4:"fb23";s:26:"res/css/jd.galleryCool.css";s:4:"fac0";s:25:"res/css/jd.galleryMod.css";s:4:"a71a";s:18:"res/css/layout.css";s:4:"59a9";s:21:"res/css/slightbox.css";s:4:"68cb";s:26:"res/css/slightboxColor.css";s:4:"4211";s:27:"res/css/img/ajax-loader.gif";s:4:"37e2";s:19:"res/css/img/big.gif";s:4:"e438";s:23:"res/css/img/carrow1.gif";s:4:"6994";s:23:"res/css/img/carrow2.gif";s:4:"7502";s:21:"res/css/img/close.gif";s:4:"97ab";s:24:"res/css/img/close9yj.gif";s:4:"5bc0";s:29:"res/css/img/control_pause.png";s:4:"9c20";s:28:"res/css/img/control_play.png";s:4:"3170";s:33:"res/css/img/control_play_blue.png";s:4:"56f5";s:26:"res/css/img/cooldesign.zip";s:4:"4851";s:27:"res/css/img/cooldisplay.png";s:4:"ef80";s:24:"res/css/img/coolnext.gif";s:4:"8045";s:24:"res/css/img/coolplus.gif";s:4:"5a67";s:24:"res/css/img/coolprev.gif";s:4:"ef26";s:20:"res/css/img/disk.png";s:4:"bb6d";s:23:"res/css/img/fleche1.gif";s:4:"a413";s:23:"res/css/img/fleche1.png";s:4:"6193";s:23:"res/css/img/fleche2.gif";s:4:"3c35";s:23:"res/css/img/fleche2.png";s:4:"e0a1";s:20:"res/css/img/left.gif";s:4:"f785";s:33:"res/css/img/loading-bar-black.gif";s:4:"b010";s:34:"res/css/img/loading-bar-black2.gif";s:4:"d552";s:25:"res/css/img/nextlabel.gif";s:4:"485d";s:20:"res/css/img/open.gif";s:4:"15f6";s:20:"res/css/img/open.png";s:4:"c2b2";s:21:"res/css/img/pause.gif";s:4:"f56b";s:20:"res/css/img/play.gif";s:4:"3ad6";s:25:"res/css/img/prevlabel.gif";s:4:"d935";s:23:"res/css/img/printer.png";s:4:"2424";s:21:"res/css/img/right.gif";s:4:"0999";s:20:"res/css/img/save.gif";s:4:"6691";s:29:"res/scripts/HistoryManager.js";s:4:"8948";s:29:"res/scripts/jd.gallery1010.js";s:4:"352d";s:28:"res/scripts/jd.galleryMod.js";s:4:"fa47";s:23:"res/scripts/mootools.js";s:4:"9f73";s:36:"res/scripts/mootools.uncompressed.js";s:4:"de7f";s:29:"res/scripts/mootools.v1.00.js";s:4:"cf85";s:27:"res/scripts/slightbox107.js";s:4:"942d";s:15:"pi1/_ce_wiz.gif";s:4:"ecd9";s:14:"pi1/ce_wiz.gif";s:4:"9573";s:36:"pi1/class.tx_rgsmoothgallery_pi1.php";s:4:"3134";s:44:"pi1/class.tx_rgsmoothgallery_pi1_wizicon.php";s:4:"23b7";s:13:"pi1/clear.gif";s:4:"cc11";s:17:"pi1/locallang.xml";s:4:"f748";s:7:"pi1/tmp";s:4:"6c78";s:24:"pi1/static/editorcfg.txt";s:4:"bc8a";s:20:"pi1/static/setup.txt";s:4:"4160";s:14:"doc/manual.sxw";s:4:"6028";s:19:"doc/wizard_form.dat";s:4:"fa36";s:20:"doc/wizard_form.html";s:4:"6053";}', - 'suggests' => array( - ), ); -?> \ No newline at end of file diff --git a/savefile.php b/savefile.php index 33c3ad0..d46b4d4 100644 --- a/savefile.php +++ b/savefile.php @@ -38,11 +38,11 @@ $image = $_GET['image']; -// first check if the requested file has an valid image file extension, not the nicest security feature but at least it prevents from downloading php files like localconf.php. -// thx peter klein + // remove domain if it is prepended +$image = str_replace(t3lib_div::getIndpEnv('TYPO3_SITE_URL'), '', $image); $allowedExtensions = t3lib_div::trimExplode(',', (strlen($TYPO3_CONF_VARS['GFX']['imagefile_ext']) > 0 ? $TYPO3_CONF_VARS['GFX']['imagefile_ext'] : 'gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai'), 1); $imageInfo = pathinfo($image); - if(!in_array(strtolower($imageInfo['extension']), $allowedExtensions)) { die('You try to download a file, you are not allowed to download'); } +if(!is_file(t3lib_div::getFileAbsFileName($image)) || !in_array(strtolower($imageInfo['extension']), $allowedExtensions)) { die('You try to download a file, you are not allowed to download'); } switch ($_GET['mode']) { @@ -72,7 +72,7 @@ function printit(){ window.close(); } window.onload = printit; - + @@ -103,7 +103,7 @@ function force_download ($filename, $mimetype='') { default: $mimetype="application/force-download"; } } - + // Make sure there's nothing else left From 04a5222f719afc0eeb7a884d529470a31164f4f9 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Thu, 21 May 2015 14:47:03 +0200 Subject: [PATCH 02/17] Compatibility TYPO3 6.2 This is the patch submitted on https://forge.typo3.org/issues/58818 by Kay Strobach that should bring TYPO3 6.2 compatibility --- pi1/class.tx_rgsmoothgallery_pi1.php | 2 -- pi1/class.tx_rgsmoothgallery_pi1_wizicon.php | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pi1/class.tx_rgsmoothgallery_pi1.php b/pi1/class.tx_rgsmoothgallery_pi1.php index 0d1b121..9dc404e 100644 --- a/pi1/class.tx_rgsmoothgallery_pi1.php +++ b/pi1/class.tx_rgsmoothgallery_pi1.php @@ -22,8 +22,6 @@ * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ -require_once(PATH_tslib . 'class.tslib_pibase.php'); - /** * Plugin 'SmoothGallery' for the 'rgsmoothgallery' extension. * diff --git a/pi1/class.tx_rgsmoothgallery_pi1_wizicon.php b/pi1/class.tx_rgsmoothgallery_pi1_wizicon.php index be97c3a..ffa02b6 100644 --- a/pi1/class.tx_rgsmoothgallery_pi1_wizicon.php +++ b/pi1/class.tx_rgsmoothgallery_pi1_wizicon.php @@ -62,7 +62,7 @@ function proc($wizardItems) { */ function includeLocalLang() { $llFile = t3lib_extMgm::extPath('rgsmoothgallery').'locallang.xml'; - $LOCAL_LANG = t3lib_div::readLLXMLfile($llFile, $GLOBALS['LANG']->lang); + $LOCAL_LANG = t3lib_div::readLLfile($llFile, $GLOBALS['LANG']->lang); return $LOCAL_LANG; } From 96d93ca1075b11363caf198493b051dc7c203c62 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Thu, 21 May 2015 15:26:30 +0200 Subject: [PATCH 03/17] Release 1.6.0 --- .gitignore | 1 + README.rst | 11 +++++++++++ README.txt | 2 -- composer.json | 8 ++++++++ doc/wizard_form.dat | 1 - doc/wizard_form.html | 12 ------------ ext_emconf.php | 40 ++++++++++++++++++---------------------- 7 files changed, 38 insertions(+), 37 deletions(-) create mode 100644 .gitignore create mode 100644 README.rst delete mode 100644 README.txt create mode 100644 composer.json delete mode 100644 doc/wizard_form.dat delete mode 100644 doc/wizard_form.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..187adb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/nbproject/ \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..72ef874 --- /dev/null +++ b/README.rst @@ -0,0 +1,11 @@ +SmoothGallery +============= + +A TYPO3 extension to create slideshow and galleries. + +This is a fork of `rgsmoothgallery`_ 1.5.2 to provide TYPO3 6.2+ compatibility. + +Read more in ``doc/`` folder. + +.. _rgsmoothgallery: https://forge.typo3.org/projects/extension-rgsmoothgallery + diff --git a/README.txt b/README.txt deleted file mode 100644 index 2b9aebe..0000000 --- a/README.txt +++ /dev/null @@ -1,2 +0,0 @@ - -Feel free to add some documentation or simply add a link to the online manual. diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..a506992 --- /dev/null +++ b/composer.json @@ -0,0 +1,8 @@ +{ + "name": "ecodev/rgsmoothgallery", + "type": "typo3-cms-extension", + "description": "Slideshow & Gallery. Shows images from directory folders, from records and inside tt_content (Element 'Text with images') DAM and tt_news. +Thumbnail-Browser, +Lightbox.", + "homepage": "https://github.com/ecodev/rgsmoothgallery", + "license": "GPL-2.0+", + "keywords": ["TYPO3 CMS", "slider", "slideshow", "gallery"] +} diff --git a/doc/wizard_form.dat b/doc/wizard_form.dat deleted file mode 100644 index 3cfbd30..0000000 --- a/doc/wizard_form.dat +++ /dev/null @@ -1 +0,0 @@ -a:4:{s:4:"save";a:3:{s:13:"extension_key";s:15:"rgsmoothgallery";s:18:"print_wop_comments";s:1:"0";s:15:"overwrite_files";a:15:{s:9:"ChangeLog";s:1:"1";s:10:"README.txt";s:1:"1";s:12:"ext_icon.gif";s:1:"1";s:17:"ext_localconf.php";s:1:"1";s:14:"ext_tables.php";s:1:"1";s:13:"locallang.xml";s:1:"1";s:16:"locallang_db.xml";s:1:"1";s:19:"doc/wizard_form.dat";s:1:"1";s:20:"doc/wizard_form.html";s:1:"1";s:14:"pi1/ce_wiz.gif";s:1:"1";s:36:"pi1/class.tx_rgsmoothgallery_pi1.php";s:1:"1";s:44:"pi1/class.tx_rgsmoothgallery_pi1_wizicon.php";s:1:"1";s:13:"pi1/clear.gif";s:1:"1";s:17:"pi1/locallang.xml";s:1:"1";s:24:"pi1/static/editorcfg.txt";s:1:"1";}}s:6:"emconf";a:1:{i:1;a:7:{s:5:"title";s:23:"smoothgallery for TYPO3";s:11:"description";s:48:"Another gallery with slideshow and slide effects";s:8:"category";s:6:"plugin";s:5:"state";s:5:"alpha";s:12:"dependencies";s:0:"";s:6:"author";s:12:"Georg Ringer";s:12:"author_email";s:21:"http://www.just2b.com";}}s:9:"languages";a:1:{i:1;a:45:{s:2:"ar";s:1:"0";s:2:"my";s:1:"0";s:2:"eu";s:1:"0";s:2:"ba";s:1:"0";s:2:"br";s:1:"0";s:2:"bg";s:1:"0";s:2:"ca";s:1:"0";s:2:"ch";s:1:"0";s:2:"hk";s:1:"0";s:2:"hr";s:1:"0";s:2:"cz";s:1:"0";s:2:"dk";s:1:"0";s:2:"nl";s:1:"0";s:2:"eo";s:1:"0";s:2:"et";s:1:"0";s:2:"fo";s:1:"0";s:2:"fi";s:1:"0";s:2:"fr";s:1:"0";s:2:"de";s:1:"1";s:2:"gr";s:1:"0";s:2:"gl";s:1:"0";s:2:"he";s:1:"0";s:2:"hi";s:1:"0";s:2:"hu";s:1:"0";s:2:"is";s:1:"0";s:2:"it";s:1:"0";s:2:"jp";s:1:"0";s:2:"kr";s:1:"0";s:2:"lv";s:1:"0";s:2:"lt";s:1:"0";s:2:"no";s:1:"0";s:2:"fa";s:1:"0";s:2:"pl";s:1:"0";s:2:"pt";s:1:"0";s:2:"ro";s:1:"0";s:2:"ru";s:1:"0";s:2:"sr";s:1:"0";s:2:"sk";s:1:"0";s:2:"si";s:1:"0";s:2:"es";s:1:"0";s:2:"se";s:1:"0";s:2:"th";s:1:"0";s:2:"tr";s:1:"0";s:2:"ua";s:1:"0";s:2:"vn";s:1:"0";}}s:2:"pi";a:1:{i:1;a:10:{s:5:"title";s:13:"SmoothGallery";s:8:"title_de";s:13:"SmoothGallery";s:13:"plus_user_obj";s:1:"0";s:23:"plus_not_staticTemplate";s:1:"0";s:7:"addType";s:9:"list_type";s:8:"plus_wiz";s:1:"1";s:20:"plus_wiz_description";s:31:"Gallery and slideshow in 1 tool";s:23:"plus_wiz_description_de";s:0:"";s:8:"tag_name";s:0:"";s:12:"plus_user_ex";s:1:"0";}}} \ No newline at end of file diff --git a/doc/wizard_form.html b/doc/wizard_form.html deleted file mode 100644 index d312414..0000000 --- a/doc/wizard_form.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Untitled - - - - -
General info
Enter general information about the extension here: Title, description, category, author...
Title:
Description:
Category:
State
Dependencies (comma list of extkeys):
Author Name:
Author email:

Setup languages
Start here by entering the number of system languages you want to use in your extension.
Enter which languages to setup:
Arabic
Bahasa Malaysia
Basque
Bosnian
Brazilian Portuguese
Bulgarian
Catalan
Chinese (Simpl)
Chinese (Trad)
Croatian
Czech
Danish
Dutch
Esperanto
Estonian
Faroese
Finnish
French
German
Greek
Greenlandic
Hebrew
Hindi
Hungarian
Icelandic
Italian
Japanese
Korean
Latvian
Lithuanian
Norwegian
Persian
Polish
Portuguese
Romanian
Russian
Serbian
Slovak
Slovenian
Spanish
Swedish
Thai
Turkish
Ukrainian
Vietnamese

Frontend Plugins
Create frontend plugins. Plugins are web applications running on the website itself (not in the backend of TYPO3). The default guestbook, message board, shop, rating feature etc. are examples of plugins.
Enter a title for the plugin:
[English]
[German]
USER cObjects are cached. Make it a non-cached USER_INT instead
Enable this option if you want the TypoScript code to be set by default. Otherwise the code will go into a static template file which must be included in the template record (recommended is to not set this option).
Add to 'Insert Plugin' list in Content Elements'
Most frontend plugins should be added to the Plugin list of Content Element type 'Insert Plugin'. This is what happens with most other plugins you know of.


Add icon to 'New Content Element' wizard:

Write a description for the entry (if any):
[English]
[German]
Add as a 'Textbox' type
The Textbox Content Element is not very common but has a confortable set of fields: Bodytext and image upload.

Add as a 'Menu/Sitemap' item
Adds the plugin to the Menu/Sitemap list. Use this if your plugin is a list of links to pages or elements on the website. An alternative sitemap? Or some special kind of menu in a special design?

Add as a totally new Content Element type
You can also take the plunge into a whole new content element type! Scarry eh?

Add as a new header type
Finally you might insert a new header type here:

Processing of userdefined tag
If you wish the plugin to process content from a userdefined tag in Content Element text-fields, enter the tagname here. Eg. if you wish the tags <mytag>This is the content</mytag> to be your userdefined tags, just enter 'mytag' in this field (lowercase a-z, 0-9 and underscore):
Just include library
In this case your library is just included when pages are rendered.

Provide TypoScript example for USER cObject in 'page.1000'
- - \ No newline at end of file diff --git a/ext_emconf.php b/ext_emconf.php index e5cc108..ab17d88 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -1,38 +1,34 @@ 'SmoothGallery for TYPO3', - 'description' => 'Slideshow & Gallery. Shows images from directory folders, from records and inside tt_content (Element "Text with images") DAM and tt_news. +Thumbnail-Browser, +Lightbox. Demo: http://www.rggooglemap.com/dev/rgsmoothgallery.html', + 'description' => 'Slideshow & Gallery. Shows images from directory folders, from records and inside tt_content (Element "Text with images") DAM and tt_news. +Thumbnail-Browser, +Lightbox.', 'category' => 'plugin', - 'version' => '1.5.2', + 'shy' => 0, + 'version' => '1.6.0', + 'dependencies' => '', + 'conflicts' => '', + 'priority' => '', + 'loadOrder' => '', + 'module' => '', 'state' => 'stable', 'uploadfolder' => 0, 'createDirs' => 'uploads/tx_rgsmoothgallery/', + 'modify_tables' => '', 'clearcacheonload' => 0, + 'lockType' => '', 'author' => 'Georg Ringer (just2b)', 'author_email' => 'http://www.just2b.com', 'author_company' => 'http://www.just2b.com', - 'constraints' => - array ( - 'depends' => - array ( + 'CGLcompliance' => '', + 'CGLcompliance_note' => '', + 'constraints' => array( + 'depends' => array( + 'typo3' => '6.1.0-7.99.99', ), - 'conflicts' => - array ( + 'conflicts' => array( ), - 'suggests' => - array ( + 'suggests' => array( ), ), ); - From 74d16bbb4b2f09f058e2f1400e32f831bc831bd0 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Fri, 22 May 2015 09:15:22 +0200 Subject: [PATCH 04/17] Fix code style with PHP-CS-Fixer to be cloesr to PSR --- class.tx_rgsmoothgallery_fe.php | 439 +- class.tx_rgsmoothgallery_rgsg.php | 105 +- ext_emconf.php | 60 +- ext_localconf.php | 22 +- ext_tables.php | 84 +- flexformDAM_ds.xml | 816 +- flexform_ds.xml | 642 +- locallang.xml | 338 +- locallang_db.xml | 76 +- pi1/class.tx_rgsmoothgallery_pi1.php | 1907 +++-- pi1/class.tx_rgsmoothgallery_pi1_wizicon.php | 116 +- pi1/locallang.xml | 66 +- pi1/tmp | 763 +- res/css/externalThumbs.css | 30 +- res/css/externalThumbs2.css | 14 +- res/css/jd.gallery.css | 298 +- res/css/jd.galleryColor.css | 238 +- res/css/jd.galleryCool.css | 266 +- res/css/jd.galleryMod.css | 270 +- res/css/layout.css | 68 +- res/css/slightbox.css | 136 +- res/css/slightboxColor.css | 122 +- res/scripts/HistoryManager.js | 600 +- res/scripts/jd.gallery1010.js | 1077 +-- res/scripts/jd.galleryMod.js | 1004 +-- res/scripts/mootools.js | 22 +- res/scripts/mootools.uncompressed.js | 7164 +++++++++--------- res/scripts/mootools.v1.00.js | 25 +- res/scripts/slightbox107.js | 805 +- savefile.php | 209 +- tca.php | 118 +- 31 files changed, 9014 insertions(+), 8886 deletions(-) diff --git a/class.tx_rgsmoothgallery_fe.php b/class.tx_rgsmoothgallery_fe.php index 88ea438..749a2d0 100644 --- a/class.tx_rgsmoothgallery_fe.php +++ b/class.tx_rgsmoothgallery_fe.php @@ -1,243 +1,238 @@ -* All rights reserved -* -* This script is part of the TYPO3 project. The TYPO3 project 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. -* -* The GNU General Public License can be found at -* http://www.gnu.org/copyleft/gpl.html. -* -* This script 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. -* -* This copyright notice MUST APPEAR in all copies of the script! -***************************************************************/ + +/* * ************************************************************* + * Copyright notice + * + * (c) 2006 Georg Ringer + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project 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. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script 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. + * + * This copyright notice MUST APPEAR in all copies of the script! + * ************************************************************* */ + /** -* Hook for the 'rgsmoothgallery' extension. -* -* @author Georg Ringer -*/ - -class tx_rgsmoothgallery_fe{ - - // hook for tt_news - function extraItemMarkerProcessor($markerArray, $row, $lConf, &$pObj) { - $this->cObj = t3lib_div::makeInstance('tslib_cObj'); // local cObj. - $this->pObj = &$pObj; - $this->realConf = $pObj; - - // configuration array of rgSmoothGallery - $rgsgConfDefault = $this->realConf->conf['rgsmoothgallery.']; - - // merge with special configuration (based on chosen CODE [SINGLE, LIST, LATEST]) if this is available - if (is_array($rgsgConfDefault[$pObj->config['code'].'.'])) { - $rgsgConf = t3lib_div::array_merge_recursive_overrule($rgsgConfDefault, $rgsgConfDefault[$pObj->config['code'].'.']); - } else { - $rgsgConf = $rgsgConfDefault; - } - - #echo t3lib_div::view_array($rgsgConf); - $this->rgsgConf = $rgsgConf; - // if the configuration is available, otherwise just do nothing - if ($rgsgConf) { - - // unique ID > uid of the record - $uniqueId = $row['uid']; - - // possibility to use a different field for the images + caption - $imageField = $this->rgsgConf['imageField'] ? $this->rgsgConf['imageField'] : 'image'; - $imageFieldPrefix = $this->rgsgConf['imageFieldPrefix'] ? $this->rgsgConf['imageFieldPrefix'] : 'uploads/pics/'; - $captionField = $this->rgsgConf['captionField'] ? $this->rgsgConf['captionField'] : 'imagecaption'; - - - // query for the images & caption - $field = 'pid,uid,'.$imageField.','.$captionField; - $table = 'tt_news'; - $where = 'uid = '.$uniqueId; - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($field,$table,$where); - $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); - if ($GLOBALS['TSFE']->sys_language_content) { - $OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':''); - $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tt_news', $row, $GLOBALS['TSFE']->sys_language_content, ''); - } - - // needed fields: image & imagecaption - $images = explode(',',$row[$imageField]); - $caption = explode("\n",$row[$captionField]); - - // If there are any images and minimum count of images is reached - if ($row[$imageField] && count($images) >= $rgsgConf['minimumImages']) { - // call rgsmoothgallery - require_once( t3lib_extMgm::extPath('rgsmoothgallery').'pi1/class.tx_rgsmoothgallery_pi1.php'); - $this->gallery = t3lib_div::makeInstance('tx_rgsmoothgallery_pi1'); - - // if no js is available - $noJsImg = $rgsgConf['big.']; - $noJsImg['file'] = $imageFieldPrefix.$images[0]; - - if ($rgsgConf['externalControl']==1) { - $externalControl1 = 'var myGallery'.$uniqueId.';'; - } else { - $externalControl2 = 'var'; - } - - // real unique key, needed for more than 1 view of tt_news on 1 page - $uniqueId = $this->realConf->config['code'].$uniqueId; - - // configuration of gallery - $lightbox = ($rgsgConf['lightbox']==1) ? 'true' : 'false'; - $lightbox2= ($rgsgConf['lightbox']==1) ? 'var mylightbox = new LightboxSmoothgallery();' : ''; - $duration = ($rgsgConf['duration']) ? 'timed:true,delay: '.$rgsgConf['duration'] : 'timed:false'; - $thumbs = ($rgsgConf['showThumbs']==1) ? 'true' : 'false'; - $arrows = ($rgsgConf['arrows']==1) ? 'true' : 'false'; - - // advanced settings (from TS + tab flexform configuration) - $advancedSettings.= ($rgsgConf['hideInfoPane']==1) ? 'showInfopane: false,' : ''; - if ($rgsgConf['thumbOpacity'] && $rgsgConf['thumbOpacity'] > 0 && $rgsgConf['thumbOpacity']<=1) $advancedSettings.= 'thumbOpacity: '.$rgsgConf['thumbOpacity'].','; - if ($rgsgConf['slideInfoZoneOpacity'] && $rgsgConf['slideInfoZoneOpacity'] && $rgsgConf['slideInfoZoneOpacity'] > 0 && $rgsgConf['slideInfoZoneOpacity']<=1) $advancedSettings.= 'slideInfoZoneOpacity: '.$rgsgConf['slideInfoZoneOpacity'].','; - $advancedSettings.= ($rgsgConf['thumbSpacing']) ? 'thumbSpacing: '.$rgsgConf['thumbSpacing'].',' : ''; - - // external thumbs - $advancedSettings.= ($rgsgConf['externalThumbs']) ? 'useExternalCarousel:true,carouselElement:$("'.$rgsgConf['externalThumbs'].'"),' : ''; - - - // configuration - $configuration = ' - - '; - - // get the JS - - - $content =$this->gallery->getJs(1,1,1,0,$rgsgConf['width'],$rgsgConf['height'],$rgsgConf['width'],$rgsgConf['height'],'',$uniqueId,$rgsgConf,$configuration); - // Begin the gallery - $content.= $this->gallery->beginGallery($uniqueId); - // add the images - $i=0; - foreach ($images as $key=>$value) { - $path = $imageFieldPrefix.$value; - // single Image - $imgTSConfigThumb = $rgsgConf['thumb.']; - $imgTSConfigThumb['file'] = $path; - $imgTSConfigBig = $rgsgConf['big.']; - $imgTSConfigBig['file'] = $path; - $imgTSConfigLightbox = $rgsgConf['lightbox.']; - $imgTSConfigLightbox['file'] = $path; - # $lightbox = ($rgsgConf['lightbox']==1) ? $this->cObj->IMG_RESOURCE($imgTSConfigLightbox) : $this->cObj->IMG_RESOURCE($imgTSConfigLightbox); - - // caption text - $text =explode('|',$caption[$i]); - - // add image - - $content.=$this->addImage( - $path, - $text[0], - $text[1], - true, - true, - $path, - $limitImages - ); - $i++; - } # end foreach file - - // end of image - $content.=$this->gallery->endGallery(); - - // write new gallery into the marker - $markerName = $this->rgsgConf['imageMarker'] ? $this->rgsgConf['imageMarker'] : 'NEWS_IMAGE'; - $markerArray['###'.$markerName.'###'] ='
'.$content.'
'; - } elseif ($this->rgsgConf['imageMarker']!='') { - $markerArray['###'.$this->rgsgConf['imageMarker'].'###'] = ''; - } - } # end if ($rgsgConf) { - - return $markerArray; - } #end extraItemMarkerProcessor - - function addImage($path,$title,$description,$thumb,$lightbox,$uniqueID,$limitImages=0) { - if ($this->rgsgConf['hideInfoPane']!=1) { - $text = (!$title) ? '' : "

$title

"; - $text.=(!$description) ? '' : "

$description

"; - } - - // generate images - if ($this->rgsgConf['watermark']) { - $imgTSConfigBig = $this->rgsgConf['big2.']; - $imgTSConfigBig['file.']['10.']['file'] = $path; - $imgTSConfigLightbox = $this->rgsgConf['lightbox2.']; - $imgTSConfigLightbox['file.']['10.']['file'] = $path; - } else { - $imgTSConfigBig = $this->rgsgConf['big.']; - $imgTSConfigBig['file'] = $path; - $imgTSConfigLightbox = $this->rgsgConf['lightbox.']; - $imgTSConfigLightbox['file'] = $path; - } - $bigImage = $this->cObj->IMG_RESOURCE($imgTSConfigBig); - - $lightbox = ($this->rgsgConf['lightbox']) ? $this->cObj->IMG_RESOURCE($imgTSConfigLightbox) : 'javascript:void(0)' ; - $lightBoxImage='
'; - - if ($this->rgsgConf['showThumbs']) { - $imgTSConfigThumb = $this->rgsgConf['thumb.']; - $imgTSConfigThumb['file'] = $path; - $thumbImage = ''; - } - - // build the image element - $singleImage .= ' + '; + + // get the JS + + + $content = $this->gallery->getJs(1, 1, 1, 0, $rgsgConf['width'], $rgsgConf['height'], $rgsgConf['width'], $rgsgConf['height'], '', $uniqueId, $rgsgConf, $configuration); + // Begin the gallery + $content .= $this->gallery->beginGallery($uniqueId); + // add the images + $i = 0; + foreach ($images as $key => $value) { + $path = $imageFieldPrefix . $value; + // single Image + $imgTSConfigThumb = $rgsgConf['thumb.']; + $imgTSConfigThumb['file'] = $path; + $imgTSConfigBig = $rgsgConf['big.']; + $imgTSConfigBig['file'] = $path; + $imgTSConfigLightbox = $rgsgConf['lightbox.']; + $imgTSConfigLightbox['file'] = $path; + # $lightbox = ($rgsgConf['lightbox']==1) ? $this->cObj->IMG_RESOURCE($imgTSConfigLightbox) : $this->cObj->IMG_RESOURCE($imgTSConfigLightbox); + // caption text + $text = explode('|', $caption[$i]); + + // add image + + $content .= $this->addImage( + $path, $text[0], $text[1], true, true, $path, $limitImages + ); + $i++; + } # end foreach file + // end of image + $content .= $this->gallery->endGallery(); + + // write new gallery into the marker + $markerName = $this->rgsgConf['imageMarker'] ? $this->rgsgConf['imageMarker'] : 'NEWS_IMAGE'; + $markerArray['###' . $markerName . '###'] = '
' . $content . '
'; + } elseif ($this->rgsgConf['imageMarker'] != '') { + $markerArray['###' . $this->rgsgConf['imageMarker'] . '###'] = ''; + } + } # end if ($rgsgConf) { + + return $markerArray; + } + +#end extraItemMarkerProcessor + public function addImage($path, $title, $description, $thumb, $lightbox, $uniqueID, $limitImages = 0) + { + if ($this->rgsgConf['hideInfoPane'] != 1) { + $text = (!$title) ? '' : "

$title

"; + $text .= (!$description) ? '' : "

$description

"; + } + + // generate images + if ($this->rgsgConf['watermark']) { + $imgTSConfigBig = $this->rgsgConf['big2.']; + $imgTSConfigBig['file.']['10.']['file'] = $path; + $imgTSConfigLightbox = $this->rgsgConf['lightbox2.']; + $imgTSConfigLightbox['file.']['10.']['file'] = $path; + } else { + $imgTSConfigBig = $this->rgsgConf['big.']; + $imgTSConfigBig['file'] = $path; + $imgTSConfigLightbox = $this->rgsgConf['lightbox.']; + $imgTSConfigLightbox['file'] = $path; + } + $bigImage = $this->cObj->IMG_RESOURCE($imgTSConfigBig); + + $lightbox = ($this->rgsgConf['lightbox']) ? $this->cObj->IMG_RESOURCE($imgTSConfigLightbox) : 'javascript:void(0)'; + $lightBoxImage = ''; + + if ($this->rgsgConf['showThumbs']) { + $imgTSConfigThumb = $this->rgsgConf['thumb.']; + $imgTSConfigThumb['file'] = $path; + $thumbImage = ''; + } + + // build the image element + $singleImage .= '
- '.$text.$lightBoxImage.' - - '.$thumbImage.' -
'; - - return $singleImage; - } + ' . $text . $lightBoxImage . ' + + ' . $thumbImage . ' + '; + return $singleImage; + } } -if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rgsmoothgallery/class.tx_rgsmoothgallery_fe.php']) { -include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rgsmoothgallery/class.tx_rgsmoothgallery_fe.php']); +if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rgsmoothgallery/class.tx_rgsmoothgallery_fe.php']) { + include_once $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rgsmoothgallery/class.tx_rgsmoothgallery_fe.php']; } - -?> diff --git a/class.tx_rgsmoothgallery_rgsg.php b/class.tx_rgsmoothgallery_rgsg.php index 8ca4b83..d618d82 100644 --- a/class.tx_rgsmoothgallery_rgsg.php +++ b/class.tx_rgsmoothgallery_rgsg.php @@ -1,69 +1,66 @@ getRootLine($GLOBALS['TSFE']->id); + $TSObj = t3lib_div::makeInstance('t3lib_tsparser_ext'); + $TSObj->tt_track = 0; + $TSObj->init(); + $TSObj->runThroughTemplates($rootLine); + $TSObj->generateConfig(); + $this->conf = $TSObj->setup['plugin.']['tx_rgsmoothgallery_pi1.']; - $sysPageObj = t3lib_div::makeInstance('t3lib_pageSelect'); - $rootLine = $sysPageObj->getRootLine($GLOBALS['TSFE']->id); - $TSObj = t3lib_div::makeInstance('t3lib_tsparser_ext'); - $TSObj->tt_track = 0; - $TSObj->init(); - $TSObj->runThroughTemplates($rootLine); - $TSObj->generateConfig(); - $this->conf = $TSObj->setup['plugin.']['tx_rgsmoothgallery_pi1.']; + $split = strpos($GLOBALS['TSFE']->currentRecord, ':'); + $id = substr($GLOBALS['TSFE']->currentRecord, $split + 1); + $where = 'uid =' . $id; + $table = 'tt_content'; + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('imagewidth,imageheight', $table, $where, $groupBy = '', $orderBy, $limit = ''); + $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); - $split=strpos($GLOBALS['TSFE']->currentRecord,':'); - $id = substr($GLOBALS['TSFE']->currentRecord,$split+1); - $where = 'uid ='.$id; - $table = 'tt_content'; - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('imagewidth,imageheight',$table,$where,$groupBy='',$orderBy,$limit=''); -$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); + $css .= ($row['imagewidth']) ? 'width:' . $row['imagewidth'] . 'px;' : ''; + $css .= ($row['imageheight']) ? 'height:' . $row['imageheight'] . 'px;' : ''; + $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery' . $id] = '#myGallery' . $id . ' {' . $css . '}'; -$css .= ($row['imagewidth']) ? 'width:'.$row['imagewidth'].'px;' : ''; -$css .= ($row['imageheight']) ? 'height:'.$row['imageheight'].'px;' : ''; - $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery'.$id] = '#myGallery'.$id.' {'.$css.'}'; + if (t3lib_extMgm::isLoaded('t3mootools')) { + require_once t3lib_extMgm::extPath('t3mootools') . 'class.tx_t3mootools.php'; + } - if (t3lib_extMgm::isLoaded('t3mootools')) { - require_once(t3lib_extMgm::extPath('t3mootools').'class.tx_t3mootools.php'); - } + if (defined('T3MOOTOOLS')) { + tx_t3mootools::addMooJS(); + } else { + $header .= $this->getPath($this->conf['pathToMootools']) ? '' : ''; + } - if (defined('T3MOOTOOLS')) { - tx_t3mootools::addMooJS(); + // path to js + css - } else { - $header.= $this->getPath($this->conf['pathToMootools']) ? '' :''; - - } - - // path to js + css - - $GLOBALS['TSFE']->additionalHeaderData['rgsmoothgallery'] = $header.' - - - - + $GLOBALS['TSFE']->additionalHeaderData['rgsmoothgallery'] = $header . ' + + + + '; + return $content; + } -return $content; -} - + public function getPath($path) + { + if (substr($path, 0, 4) == 'EXT:') { + $keyEndPos = strpos($path, '/', 6); + $key = substr($path, 4, $keyEndPos - 4); + $keyPath = t3lib_extMgm::siteRelpath($key); + $newPath = $keyPath . substr($path, $keyEndPos + 1); - function getPath($path) { - if (substr($path,0,4)=='EXT:') { - $keyEndPos = strpos($path, '/', 6); - $key = substr($path,4,$keyEndPos-4); - $keyPath = t3lib_extMgm::siteRelpath($key); - $newPath = $keyPath.substr($path,$keyEndPos+1); - return $newPath; - } else { - return $path; + return $newPath; + } else { + return $path; + } } - } # end getPath - } -?> diff --git a/ext_emconf.php b/ext_emconf.php index ab17d88..f991acf 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -1,34 +1,34 @@ 'SmoothGallery for TYPO3', - 'description' => 'Slideshow & Gallery. Shows images from directory folders, from records and inside tt_content (Element "Text with images") DAM and tt_news. +Thumbnail-Browser, +Lightbox.', - 'category' => 'plugin', - 'shy' => 0, - 'version' => '1.6.0', - 'dependencies' => '', - 'conflicts' => '', - 'priority' => '', - 'loadOrder' => '', - 'module' => '', - 'state' => 'stable', - 'uploadfolder' => 0, - 'createDirs' => 'uploads/tx_rgsmoothgallery/', - 'modify_tables' => '', - 'clearcacheonload' => 0, - 'lockType' => '', - 'author' => 'Georg Ringer (just2b)', - 'author_email' => 'http://www.just2b.com', - 'author_company' => 'http://www.just2b.com', - 'CGLcompliance' => '', - 'CGLcompliance_note' => '', - 'constraints' => array( - 'depends' => array( - 'typo3' => '6.1.0-7.99.99', - ), - 'conflicts' => array( - ), - 'suggests' => array( - ), - ), + 'title' => 'SmoothGallery for TYPO3', + 'description' => 'Slideshow & Gallery. Shows images from directory folders, from records and inside tt_content (Element "Text with images") DAM and tt_news. +Thumbnail-Browser, +Lightbox.', + 'category' => 'plugin', + 'shy' => 0, + 'version' => '1.6.0', + 'dependencies' => '', + 'conflicts' => '', + 'priority' => '', + 'loadOrder' => '', + 'module' => '', + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => 'uploads/tx_rgsmoothgallery/', + 'modify_tables' => '', + 'clearcacheonload' => 0, + 'lockType' => '', + 'author' => 'Georg Ringer (just2b)', + 'author_email' => 'http://www.just2b.com', + 'author_company' => 'http://www.just2b.com', + 'CGLcompliance' => '', + 'CGLcompliance_note' => '', + 'constraints' => array( + 'depends' => array( + 'typo3' => '6.1.0-7.99.99', + ), + 'conflicts' => array( + ), + 'suggests' => array( + ), + ), ); diff --git a/ext_localconf.php b/ext_localconf.php index 40d8bee..b43e0db 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -1,22 +1,24 @@ +; diff --git a/ext_tables.php b/ext_tables.php index c47ffeb..89a00c0 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -1,71 +1,69 @@ array ( - 'title' => 'LLL:EXT:rgsmoothgallery/locallang_db.xml:tx_rgsmoothgallery_image', - 'label' => 'title', - 'tstamp' => 'tstamp', - 'crdate' => 'crdate', +$TCA["tx_rgsmoothgallery_image"] = array( + "ctrl" => array( + 'title' => 'LLL:EXT:rgsmoothgallery/locallang_db.xml:tx_rgsmoothgallery_image', + 'label' => 'title', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', - 'languageField' => 'sys_language_uid', - 'transOrigPointerField' => 'l18n_parent', - 'transOrigDiffSourceField' => 'l18n_diffsource', - 'sortby' => 'sorting', - 'delete' => 'deleted', - 'enablecolumns' => array ( + 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l18n_parent', + 'transOrigDiffSourceField' => 'l18n_diffsource', + 'sortby' => 'sorting', + 'delete' => 'deleted', + 'enablecolumns' => array( 'disabled' => 'hidden', ), - 'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY).'tca.php', - 'iconfile' => t3lib_extMgm::extRelPath($_EXTKEY).'icon_tx_rgsmoothgallery_image.gif', + 'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY) . 'tca.php', + 'iconfile' => t3lib_extMgm::extRelPath($_EXTKEY) . 'icon_tx_rgsmoothgallery_image.gif', ), - "feInterface" => array ( + "feInterface" => array( "fe_admin_fieldList" => "sys_language_uid, l18n_parent, l18n_diffsource, hidden, title, description, image", - ) + ), ); - -$tempColumns = Array ( - "tx_rgsmoothgallery_rgsg" => Array ( - "exclude" => 1, - "label" => "LLL:EXT:rgsmoothgallery/locallang_db.xml:tt_content.tx_rgsmoothgallery_rgsg", - "config" => Array ( +$tempColumns = array( + "tx_rgsmoothgallery_rgsg" => array( + "exclude" => 1, + "label" => "LLL:EXT:rgsmoothgallery/locallang_db.xml:tt_content.tx_rgsmoothgallery_rgsg", + "config" => array( "type" => "check", - ) + ), ), ); t3lib_div::loadTCA("tt_content"); -t3lib_extMgm::addTCAcolumns("tt_content",$tempColumns,1); +t3lib_extMgm::addTCAcolumns("tt_content", $tempColumns, 1); - $GLOBALS['TCA']['tt_content']['palettes']['7']['showitem'] .= ',tx_rgsmoothgallery_rgsg'; /* -t3lib_div::loadTCA("tt_content"); -t3lib_extMgm::addTCAcolumns("tt_content",$tempColumns,1); -t3lib_extMgm::addToAllTCAtypes("tt_content","tx_rgsmoothgallery_rgsg;;;;1-1-1"); -*/ - - -?> + t3lib_div::loadTCA("tt_content"); + t3lib_extMgm::addTCAcolumns("tt_content",$tempColumns,1); + t3lib_extMgm::addToAllTCAtypes("tt_content","tx_rgsmoothgallery_rgsg;;;;1-1-1"); + */; diff --git a/flexformDAM_ds.xml b/flexformDAM_ds.xml index 59b5b76..21d5aa9 100644 --- a/flexformDAM_ds.xml +++ b/flexformDAM_ds.xml @@ -1,410 +1,410 @@ - - 1 - - - - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.title - - array - - - - - - - select - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.0 - DIRECTORY - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.1 - RECORDS - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.3 - DAM - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.4 - DAMCAT - - - - - - - - - - - FIELD:mode:!IN:RECORDS,DAM - - - input - 25 - trim - - <_PADDING>2 - - popup - Folder Selector - link_popup.gif - - height=400,width=400,status=0,menubar=0,scrollbars=1 - - - - - - - - - FIELD:mode:!IN:RECORDS,DAM,DAMCAT - - - text - 40 - 10 - - - - - - - FIELD:mode:=:RECORDS - - - group - db - pages - 3 - 50 - 0 - 1 - 30 - - - - - - - FIELD:mode:=:DAM - - - group - db - tx_dam - 10 - 1 - tx_dam_mm_ref - 1 - 1 - - rgsmoothgallery - - php,php3 - 50 - 0 - 1 - 30 - - - - - - - FIELD:mode:=:DAMCAT - - - group - db - tx_dam_cat - 5 - 1 - php,php3 - 50 - 0 - 1 - 30 - - - - - - - FIELD:mode:=:DAMCAT - - - select - - - - - - - LLL:EXT:cms/locallang_ttc.php:recursive.I.1 - 1 - - - LLL:EXT:cms/locallang_ttc.php:recursive.I.2 - 2 - - - LLL:EXT:cms/locallang_ttc.php:recursive.I.3 - 3 - - - LLL:EXT:cms/locallang_ttc.php:recursive.I.4 - 4 - - - LLL:EXT:cms/locallang_ttc.php:recursive.I.5 - 250 - - - 0 - 1 - 1 - - - - - - - - - input - 3 - - - - - - - - - input - 3 - - - - - - - - - input - 3 - - - - - - - - - input - 3 - - - - - - - - - - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.advanced.title - - array - - - - - - - check - 1 - - - - - - - - - - - check - 1 - - - - - - - - - check - 1 - - - - - - - - - check - 0 - - - - - - - - - check - - - - - - - - - input - 3 - int,trim - 0 - - - - - - - - - - - - - input - 3 - double,trim - 0 - - - - - - - - - input - 4 - trim - - - - - - - - - - check - - - - - - - - - input - 3 - double,trim - 0 - - - - - - - - - input - 10 - - - - - - - - - - check - - - - - - - - - text - 30 - 2 - - - - - - - - - - + + 1 + + + + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.title + + array + + + + + + + select + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.0 + DIRECTORY + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.1 + RECORDS + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.3 + DAM + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.4 + DAMCAT + + + + + + + + + + + FIELD:mode:!IN:RECORDS,DAM + + + input + 25 + trim + + <_PADDING>2 + + popup + Folder Selector + link_popup.gif + + height=400,width=400,status=0,menubar=0,scrollbars=1 + + + + + + + + + FIELD:mode:!IN:RECORDS,DAM,DAMCAT + + + text + 40 + 10 + + + + + + + FIELD:mode:=:RECORDS + + + group + db + pages + 3 + 50 + 0 + 1 + 30 + + + + + + + FIELD:mode:=:DAM + + + group + db + tx_dam + 10 + 1 + tx_dam_mm_ref + 1 + 1 + + rgsmoothgallery + + php,php3 + 50 + 0 + 1 + 30 + + + + + + + FIELD:mode:=:DAMCAT + + + group + db + tx_dam_cat + 5 + 1 + php,php3 + 50 + 0 + 1 + 30 + + + + + + + FIELD:mode:=:DAMCAT + + + select + + + + + + + LLL:EXT:cms/locallang_ttc.php:recursive.I.1 + 1 + + + LLL:EXT:cms/locallang_ttc.php:recursive.I.2 + 2 + + + LLL:EXT:cms/locallang_ttc.php:recursive.I.3 + 3 + + + LLL:EXT:cms/locallang_ttc.php:recursive.I.4 + 4 + + + LLL:EXT:cms/locallang_ttc.php:recursive.I.5 + 250 + + + 0 + 1 + 1 + + + + + + + + + input + 3 + + + + + + + + + input + 3 + + + + + + + + + input + 3 + + + + + + + + + input + 3 + + + + + + + + + + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.advanced.title + + array + + + + + + + check + 1 + + + + + + + + + + + check + 1 + + + + + + + + + check + 1 + + + + + + + + + check + 0 + + + + + + + + + check + + + + + + + + + input + 3 + int,trim + 0 + + + + + + + + + + + + + input + 3 + double,trim + 0 + + + + + + + + + input + 4 + trim + + + + + + + + + + check + + + + + + + + + input + 3 + double,trim + 0 + + + + + + + + + input + 10 + + + + + + + + + + check + + + + + + + + + text + 30 + 2 + + + + + + + + + + diff --git a/flexform_ds.xml b/flexform_ds.xml index 305ef07..437a6ac 100644 --- a/flexform_ds.xml +++ b/flexform_ds.xml @@ -1,323 +1,323 @@ - - 1 - - - - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.title - - array - - - - - - - select - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.0 - DIRECTORY - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.1 - RECORDS - - - - - - - - - - - FIELD:mode:!IN:RECORDS,DAM,DAMCAT - - - input - 25 - trim - - <_PADDING>2 - - popup - Folder Selector - link_popup.gif - - height=400,width=400,status=0,menubar=0,scrollbars=1 - - - - - - - - - FIELD:mode:!IN:RECORDS,DAM,DAMCAT - - - text - 40 - 10 - - - - - - - FIELD:mode:=:RECORDS - - - group - db - pages - 3 - 50 - 0 - 1 - 30 - - - - - - - - - input - 3 - - - - - - - - - input - 3 - - - - - - - - - input - 3 - - - - - - - - - input - 3 - - - - - - - - - - - - - - LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.advanced.title - - array - - - - - - - check - 1 - - - - - - - - - - - check - 1 - - - - - - - - - check - 1 - - - - - - - - - check - 0 - - - - - - - - - check - - - - - - - - - - - input - 3 - int,trim - 0 - - - - - - - - - - - - - input - 3 - double,trim - 0 - - - - - - - - - input - 4 - trim - - - - - - - - - - check - - - - - - - - - input - 3 - double,trim - 0 - - - - - - - - - input - 10 - - - - - - - - - - check - - - - - - - - - text - 30 - 2 - - - - - - - - - - + + 1 + + + + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.title + + array + + + + + + + select + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.0 + DIRECTORY + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.general.mode.1 + RECORDS + + + + + + + + + + + FIELD:mode:!IN:RECORDS,DAM,DAMCAT + + + input + 25 + trim + + <_PADDING>2 + + popup + Folder Selector + link_popup.gif + + height=400,width=400,status=0,menubar=0,scrollbars=1 + + + + + + + + + FIELD:mode:!IN:RECORDS,DAM,DAMCAT + + + text + 40 + 10 + + + + + + + FIELD:mode:=:RECORDS + + + group + db + pages + 3 + 50 + 0 + 1 + 30 + + + + + + + + + input + 3 + + + + + + + + + input + 3 + + + + + + + + + input + 3 + + + + + + + + + input + 3 + + + + + + + + + + + + + + LLL:EXT:rgsmoothgallery/locallang.xml:flexform.sheets.advanced.title + + array + + + + + + + check + 1 + + + + + + + + + + + check + 1 + + + + + + + + + check + 1 + + + + + + + + + check + 0 + + + + + + + + + check + + + + + + + + + + + input + 3 + int,trim + 0 + + + + + + + + + + + + + input + 3 + double,trim + 0 + + + + + + + + + input + 4 + trim + + + + + + + + + + check + + + + + + + + + input + 3 + double,trim + 0 + + + + + + + + + input + 10 + + + + + + + + + + check + + + + + + + + + text + 30 + 2 + + + + + + + + + + diff --git a/locallang.xml b/locallang.xml index 189dc5c..4a79194 100644 --- a/locallang.xml +++ b/locallang.xml @@ -1,171 +1,171 @@ - - module - Language labels for extension 'rgsmoothgallery' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + module + Language labels for extension 'rgsmoothgallery' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/locallang_db.xml b/locallang_db.xml index b8364fd..e359d27 100644 --- a/locallang_db.xml +++ b/locallang_db.xml @@ -1,42 +1,42 @@ - - database - Language labels for database tables/fields belonging to extension 'rgsmoothgallery' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + database + Language labels for database tables/fields belonging to extension 'rgsmoothgallery' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/pi1/class.tx_rgsmoothgallery_pi1.php b/pi1/class.tx_rgsmoothgallery_pi1.php index 9dc404e..2dfe8a3 100644 --- a/pi1/class.tx_rgsmoothgallery_pi1.php +++ b/pi1/class.tx_rgsmoothgallery_pi1.php @@ -1,5 +1,6 @@ @@ -20,7 +21,7 @@ * GNU General Public License for more details. * * This copyright notice MUST APPEAR in all copies of the script! - ***************************************************************/ + * ************************************************************* */ /** * Plugin 'SmoothGallery' for the 'rgsmoothgallery' extension. @@ -29,525 +30,506 @@ * @package TYPO3 * @subpackage tx_rgsmoothgallery */ -class tx_rgsmoothgallery_pi1 extends tslib_pibase { - var $prefixId = 'tx_rgsmoothgallery_pi1'; // Same as class name - var $scriptRelPath = 'pi1/class.tx_rgsmoothgallery_pi1.php'; // Path to this script relative to the extension dir. - var $extKey = 'rgsmoothgallery'; // The extension key. - var $pi_checkCHash = true; - - /** - * Just some intialization, mainly reading the settings in the flexforms - * - * @param array $conf: The PlugIn configuration - */ - function init($conf) { - $this->conf = $conf; // Storing configuration as a member var - $this->pi_loadLL(); // Loading language-labels - $this->pi_setPiVarDefaults(); // Set default piVars from TS - $this->pi_initPIflexForm(); // Init FlexForm configuration for plugin - - - // Template code - $this->templateCode = $this->cObj->fileResource( $this->conf['templateFile'] ); - $this->config['count'] = 0; - - // configuration flexforms - $this->config['mode'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'mode', 'sDEF' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'mode', 'sDEF' ) : $this->conf['mode']; - $this->config['duration'] = intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'time', 'sDEF' ) ) ? intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'time', 'sDEF' ) ) : intval( $this->conf['duration'] ); - $this->config['startingpoint'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'startingpoint', 'sDEF' ) ? trim( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'startingpoint', 'sDEF' ) ) : trim( $this->conf['startingpoint'] ); - $pid = $this->conf['startingpointrecords'] ? $this->conf['startingpointrecords'] : $GLOBALS['TSFE']->id; - $this->conf['startingpointrecords'] = $this->conf['startingpointrecords'] ? $this->conf['startingpointrecords'] : $pid; - $this->config['startingpointrecords'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'startingpointrecords', 'sDEF' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'startingpointrecords', 'sDEF' ) :($this->conf['startingpointrecords']); - $this->config['startingpointdam'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'startingpointdam', 'sDEF' ); - $this->config['startingpointdamcat'] = $this->getFlexform( 'sDEF', 'startingpointdamcat', 'startingpointdamcat' ); - $this->config['recursivedamcat'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'recursivedamcat', 'sDEF' ); - $this->config['text'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'text', 'sDEF' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'text', 'sDEF' ) : $this->conf['text']; - $this->config['id'] = $this->cObj->data['uid'] . $this->conf['id']; - - // size of images, overwritten by flexforms - $this->config['width'] = ($this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'width', 'sDEF' )) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'width', 'sDEF' ) : $this->conf['big.']['file.']['maxW']; - # if ($this->config['width']) $this->conf['big.']['file.']['maxW'] = $this->config['width']; - $this->config['height'] = ($this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'height', 'sDEF' )) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'height', 'sDEF' ) : $this->conf['big.']['file.']['maxH']; - # if ($this->config['height']) $this->conf['big.']['file.']['maxH'] = $this->config['height']; - - - $this->config['heightGallery'] = intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'heightgallery', 'sDEF' ) ) ? intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'heightgallery', 'sDEF' ) ) : $this->conf['heightGallery']; - $this->config['widthGallery'] = intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'widthgallery', 'sDEF' ) ) ? intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'widthgallery', 'sDEF' ) ) : $this->conf['widthGallery']; - - if (strpos( $this->config['width'], 'c' ) || strpos( $this->config['width'], 'm' ) || strpos( $this->config['height'], 'c' ) || strpos( $this->config['height'], 'm' )) { - $this->conf['big.']['file.']['width'] = $this->config['width']; - $this->conf['big.']['file.']['height'] = $this->config['height']; - $this->conf['big2.']['file.']['10.']['file.']['width'] = $this->config['width']; - $this->conf['big2.']['file.']['10.']['file.']['height'] = $this->config['height']; - - unset( $this->conf['big.']['file.']['maxW'] ); - unset( $this->conf['big.']['file.']['maxH'] ); - unset( $this->conf['big2.']['file.']['10.']['file.']['maxW'] ); - unset( $this->conf['big2.']['file.']['10.']['file.']['maxH'] ); - } else { - if ($this->config['width']) { - $this->conf['big.']['file.']['maxW'] = $this->config['width']; - $this->conf['big2.']['file.']['10.']['file.']['maxW'] = $this->config['width']; - } - if ($this->config['height']) { - $this->conf['big.']['file.']['maxH'] = $this->config['height']; - $this->conf['big2.']['file.']['10.']['file.']['maxH'] = $this->config['height']; - } - if (!$this->config['heightGallery']) $this->config['heightGallery'] = $this->config['height']; - if (!$this->config['widthGallery']) $this->config['widthGallery'] = $this->config['width']; - } - - // check starting point for missing slash - if (substr($this->config['startingpoint'], -1) != '/') { - $this->config['startingpoint'] = $this->config['startingpoint'].'/'; - } - - if (substr($this->config['startingpoint'], 0,1) == '/') { - $size = strlen($this->config['startingpoint']); - $this->config['startingpoint'] = substr($this->config['startingpoint'],1,$size-1); - } - - - /* - * Advanced settings - */ - $this->config['hideInfoPane'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'infopane', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'infopane', 'advanced' ) : $this->conf['hideInfoPane']; - $this->config['thumbOpacity'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'thumbopacity', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'thumbopacity', 'advanced' ) : $this->conf['thumbOpacity']; - $this->config['slideInfoZoneOpacity'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'slideinfozoneopacity', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'slideinfozoneopacity', 'advanced' ) : $this->conf['slideInfoZoneOpacity']; - $this->config['thumbSpacing'] = intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'thumbspacing', 'advanced' ) ) ? intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'thumbspacing', 'advanced' ) ) : $this->conf['thumbSpacing']; - - $this->config['watermarks'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'watermark', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'watermark', 'advanced' ) : $this->conf['watermarks']; - $this->config['limitImagesDisplayed'] = intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'limitImagesDisplayed', 'advanced' ) ) ? intval( $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'limitImagesDisplayed', 'advanced' ) ) : intval( $this->conf['limitImagesDisplayed'] ); - - $this->config['lightbox'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'lightbox', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'lightbox', 'advanced' ) : $this->conf['lightbox']; - $this->config['showThumbs'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'showThumbs', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'showThumbs', 'advanced' ) : $this->conf['showThumbs']; - $this->config['showPlay'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'showPlay', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'showPlay', 'advanced' ) : $this->conf['showPlay']; - $this->config['arrows'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'arrows', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'arrows', 'advanced' ) : $this->conf['arrows']; - $this->config['advancedSettings'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'advancedsettings', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'advancedsettings', 'advanced' ) : $this->conf['advancedSettings']; - $this->config['externalThumbs'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'externalthumbs', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'externalthumbs', 'advanced' ) : $this->conf['externalThumbs']; - $this->config['externalControl'] = $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'externalcontrol', 'advanced' ) ? $this->pi_getFFvalue( $this->cObj->data['pi_flexform'], 'externalcontrol', 'advanced' ) : $this->conf['externalControl']; - - /* - * Split characters from Extension Manager - */ - $tmp_confArr = unserialize( $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['rgsmoothgallery'] ); - $tmp_confArr['splitRecord'] = ($tmp_confArr['splitRecord']) ? $tmp_confArr['splitRecord'] : '\n'; - $this->config['splitRecord'] = ($tmp_confArr['splitRecord'] == '\n') ? "\n" : $tmp_confArr['splitRecord']; - - $this->config['splitComment'] = ($tmp_confArr['splitComment']) ? $tmp_confArr['splitComment'] : '|'; - - /* - * StdWrap options for every value from flexforms merged with TS to override it again with TS and to manipulate it with stdWrap things - */ - - foreach ( $this->config as $key => $value ) { - $this->config[$key] = $this->cObj->stdWrap( $value, $this->conf[$key . '.'] ); - } - - } - - /** - * The main method of the PlugIn - * for showing the SmoothGallery - * - * @param string $content: The PlugIn content - * @param array $conf: The PlugIn configuration - * @return The gallery - */ - function main($content, $conf) { - $this->init( $conf ); - $this->pi_setPiVarDefaults(); - $this->pi_loadLL(); - $this->pi_USER_INT_obj = 0; // Configuring so caching is expected. - $this->pi_initPIflexForm(); // Init FlexForm configuration for plugin - - if ($this->conf['pathToJdgalleryJS'] == '') { - return $this->pi_getLL( 'errorIncludeStatic' ); - } else { - // get the needed js to load the gallery and to start it - $content .= $this->getJs( - $this->config['lightbox'], - $this->config['showThumbs'], - $this->config['arrows'], - $this->config['duration'], - $this->config['width'], - $this->config['height'], - $this->config['widthGallery'], - $this->config['heightGallery'], - $this->config['advancedSettings'], - $this->config['id'], - $this->conf - ); - - // depending on the chosen settings the images come from different places - $content .= $this->getImageDifferentPlaces( $this->config['limitImagesDisplayed'] ); - - #return $this->pi_wrapInBaseClass($content); - return '
' . $content . '
'; - } - - } # end main - - - /** - * Just some divs needed for the gallery - * - * @param string/int $uniqueId: A unique ID to have more than 1 galleries on 1 page - * @return The opened divs - */ - function beginGallery($uniqueId, $limitImages = 0) { - if ($limitImages == 1) { - $content = '
'; - } - else { - $content = '
'; - } - - // Save button && Print button - $content .= ''; - - if (is_array( $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraBeginGalleryHook'] )) { - foreach ( $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraBeginGalleryHook'] as $_classRef ) { - $_procObj = & t3lib_div::getUserObj( $_classRef ); - $content = $_procObj->extraBeginGalleryProcessor( $content, $limitImages, $this ); - } - } - return $content; - } # end beginGallery - - /** - * Just some divs needed for the gallery - * - * @return The closed divs - */ - function endGallery() { - $content = '
'; - if (is_array( $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraEndGalleryHook'] )) { - foreach ( $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraEndGalleryHook'] as $_classRef ) { - $_procObj = & t3lib_div::getUserObj( $_classRef ); - $content = $_procObj->extraEndGalleryProcessor( $content, $this ); - } - } - return $content; - } # end endGallery - - /** - * get the images out of a directory - * - * @param int $limitImages: How many images to return; default=0 list all - * @return image(s) - */ - function getImagesDirectory($limitImages = 0) { - if (is_dir( $this->config['startingpoint'] )) { - $images = array(); - $images = $this->getFiles( $this->config['startingpoint'] ); - // randomise and limit image items returned from images array - // also useful to limit items in array to 1 item for use when no javascript in browser - // if $limitImages=0 then this if statement is bypassed and all images in images array returned for processing - if ($limitImages > 0) { - $images = $this->getSlicedRandomArray( $images, 0, $limitImages ); - } - - $content .= $this->beginGallery( $this->config['id'], $limitImages ); - - // read the description from field in flexforms - if ($this->config['text'] != '') { - $caption = explode( $this->config['splitRecord'], $this->config['text'] ); - } - - - - // add the images - foreach ( $images as $key => $value ) { - $path = $this->config['startingpoint'] . $value; - - // caption text - if ($caption[$key]) { - $text = explode( $this->config['splitComment'], $caption[$key] ); - } else { - // update of Xavier Perseguers (typo3@perseguers.ch) thx! - $text = $this->readImageInfo( $this->config['startingpoint'] . $value ); - } - - if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraGetImagesDirectoryHook'])) { - foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraGetImagesDirectoryHook'] as $_classRef ) { - $_procObj = & t3lib_div::getUserObj( $_classRef ); - $text = $_procObj->extraGetImagesDirectoryHook( $text, $this->config['startingpoint'] . $value, $this ); - } - } - - // add element to slideshow - $content.=$this->addImage( - $path, - $text[0], - $text[1], - $this->config['showThumbs'], - $this->config['lightbox'], - $path, - $limitImages - ); - - } # end foreach file - - - $content .= $this->endGallery(); - } # end is_dir - return $content; - } # end getImagesDirectory - - /** - * get the images out of records a user created in the backend before - * - * @param int $limitImages: How many images to return; default=0 list all - * @return image(s) - */ - function getImagesRecords($limitImages = 0) { - //prepare query - $sort = 'sorting'; - $fields = 'title,image,description,l18n_parent'; - $tables = 'tx_rgsmoothgallery_image'; - $temp_where = 'pid IN (' . $this->config['startingpointrecords'] . ') AND hidden=0 AND deleted=0 AND sys_language_uid = ' . $GLOBALS['TSFE']->sys_language_content; - - $content .= $this->beginGallery( $this->config['id'], $limitImages ); - - // add the images - // randomise and limit image items returned from images array - // also useful to limit items in array to 1 item for use when no javascript in browser - // if $limitImages=0 then this if statement is bypassed and all images in images array returned for processing - if ($limitImages > 0) { - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( $fields, $tables, $temp_where, '', 'rand()', $limitImages ); - } else { - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( $fields, $tables, $temp_where, '', $sort, '' ); - } - $this->sys_language_mode = $this->conf['sys_language_mode'] ? $this->conf['sys_language_mode'] : $GLOBALS['TSFE']->sys_language_mode; - while ( $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc( $res ) ) { - - if ($GLOBALS['TSFE']->sys_language_content) { - $OLmode = ($this->sys_language_mode == 'strict' ? 'hideNonTranslated' : ''); - $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay( 'tx_rgsmoothgallery_image', $row, $GLOBALS['TSFE']->sys_language_content, $OLmode ); - } - - if ($row['image'] == '') { - $res2 = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 'image', $tables, 'uid=' . $row['l18n_parent'] ); - $row2 = $GLOBALS['TYPO3_DB']->sql_fetch_assoc( $res2 ); - $row['image'] = $row2['image']; - } - - $path = 'uploads/tx_rgsmoothgallery/' . $row['image']; - - // add element to slideshow - $content.=$this->addImage( - $path, - $row['title'], - $row['description'], - $this->config['showThumbs'], - $this->config['lightbox'], - $path, - $limitImages - ); - - - } # end foreach file - - - $content .= $this->endGallery(); - return $content; - } # getImagesRecords - - /** - * get the images out of DAM - * - * @param int $limitImages: How many images to return; default=0 list all - * @return image(s) - */ - function getImagesDam($limitImages = 0) { - // update of ian (ian@webian.it) thx! - // check if there's a localized version of the current content object - $uid = $this->cObj->data['uid']; - if ($this->cObj->data['_LOCALIZED_UID']) { - $uid = $this->cObj->data['_LOCALIZED_UID']; - } - $sys_language_uid = $GLOBALS['TSFE']->sys_language_content; - - // get all the files - $images = tx_dam_db::getReferencedFiles( 'tt_content', $uid, 'rgsmoothgallery', 'tx_dam_mm_ref' ); - - // randomise and limit image items returned from images array - if ($limitImages > 0) { - $test = ($images['files']); - $test = $this->getSlicedRandomArray( $test, 0, $limitImages ); - $images['files'] = $test; - } - - // begin gallery - $content .= $this->beginGallery( $this->config['id'], $limitImages ); - - // add image - foreach ( $images['files'] as $key => $path ) { - // get data from the single image - $fields = 'title,description'; - $tables = 'tx_dam'; - - // now i check the tx_dam table to see if there's a localization for the current DAM record (image) - $temp_where = 'l18n_parent = ' . $key . ' AND sys_language_uid = ' . $sys_language_uid; - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 'uid', $tables, $temp_where ); - // if i find a localized record i overwrite the default language $key with the localized language $key - if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc( $res )) { - $key = $row['uid']; - } - $GLOBALS['TYPO3_DB']->sql_free_result( $res ); - - $temp_where = 'uid = ' . $key; - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( $fields, $tables, $temp_where ); - $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc( $res ); - - // add element to slideshow - $content.=$this->addImage( - $path, - $row['title'], - $row['description'], - $this->config['showThumbs'], - $this->config['lightbox'], - $path, - $limitImages - ); - } - - $content .= $this->endGallery(); - return $content; - } # end getImagesDam - - /** - * get the images out of DAM - * - * @param int $limitImages: How many images to return; default=0 list all - * @return image(s) - */ - function getImagesDamCat($limitImages = 0) { - $content .= $this->beginGallery( $this->config['id'], $limitImages ); - - // add image - $list = str_replace( 'tx_dam_cat_', '', $this->config['startingpointdamcat'] ); - - $listRecursive = $this->getRecursiveDamCat( $list, $this->config['recursivedamcat'] ); - $listArray = explode( ',', $listRecursive ); - $files = Array(); - foreach ( $listArray as $cat ) { - - // add images from categories - $fields = 'tx_dam.uid,tx_dam.title,tx_dam.description,tx_dam.file_name,tx_dam.file_path'; - $tables = 'tx_dam,tx_dam_mm_cat'; - $temp_where = 'tx_dam.deleted = 0 AND tx_dam.file_mime_type=\'image\' AND tx_dam.hidden=0 AND tx_dam_mm_cat.uid_foreign=' . $cat . ' AND tx_dam_mm_cat.uid_local=tx_dam.uid'; - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( $fields, $tables, $temp_where, '', 'tx_dam.sorting' ); - - while ( $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc( $res ) ) { - $files[$row['uid']] = $row; # just add the image to an array - } - - $GLOBALS['TYPO3_DB']->sql_free_result( $res ); - } - - if ($limitImages > 0) { - $files = $this->getSlicedRandomArray( $files, 0, $limitImages ); - } - - // add the image for real - foreach ( $files as $key => $row ) { - $path = $row['file_path'] . $row['file_name']; - - // add element to slideshow - $content.=$this->addImage( - $path, - $row['title'], - nl2br($row['description']), - $this->config['showThumbs'], - $this->config['lightbox'], - $path, - $limitImages - ); - } - - $content .= $this->endGallery(); - return $content; - } - - /** - * Loads all the needed javascript stuff and - * does the configuration of the gallery - * - * @param boolean $lightboxVal: Lightbox activated= - * @param boolean $thumbsVal: Thumbnail preview activated? - * @param boolean $arrowsVal: Arrows to neighbour images activated? - * @param string $durationVal: If automatic slideshow the value of the delay - * @param int $width: Width of gallery (depricated) - * @param int $height: Height of gallery (depricated) - * @param string $advancedSettings: Advanced configuration - * @param string/int $uniqueId: A unique ID to have more than 1 galleries on 1 page - * $param array $conf: $configuration-array - * @return The gallery - */ - function getJs($lightboxVal, $thumbsVal, $arrowsVal, $durationVal, $width, $height, $widthGallery, $heightGallery, $advancedSettings, $uniqueId, $conf, $overrideJS = '') { - $this->conf = $conf; - - if (t3lib_extMgm::isLoaded( 't3mootools' )) { - require_once(t3lib_extMgm::extPath( 't3mootools' ) . 'class.tx_t3mootools.php'); - } - if (defined( 'T3MOOTOOLS' )) { - tx_t3mootools::addMooJS(); - } else { - $header .= $this->getPath( $this->conf['pathToMootools'] ) ? '' : ''; - } - - // path to js + css - $GLOBALS['TSFE']->additionalHeaderData['rgsmoothgallery'] = $header . ' - - - - +class tx_rgsmoothgallery_pi1 extends tslib_pibase +{ + public $prefixId = 'tx_rgsmoothgallery_pi1'; // Same as class name + public $scriptRelPath = 'pi1/class.tx_rgsmoothgallery_pi1.php'; // Path to this script relative to the extension dir. + public $extKey = 'rgsmoothgallery'; // The extension key. + public $pi_checkCHash = true; + + /** + * Just some intialization, mainly reading the settings in the flexforms + * + * @param array $conf: The PlugIn configuration + */ + public function init($conf) + { + $this->conf = $conf; // Storing configuration as a member var + $this->pi_loadLL(); // Loading language-labels + $this->pi_setPiVarDefaults(); // Set default piVars from TS + $this->pi_initPIflexForm(); // Init FlexForm configuration for plugin + // Template code + $this->templateCode = $this->cObj->fileResource($this->conf['templateFile']); + $this->config['count'] = 0; + + // configuration flexforms + $this->config['mode'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'mode', 'sDEF') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'mode', 'sDEF') : $this->conf['mode']; + $this->config['duration'] = intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'time', 'sDEF')) ? intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'time', 'sDEF')) : intval($this->conf['duration']); + $this->config['startingpoint'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'startingpoint', 'sDEF') ? trim($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'startingpoint', 'sDEF')) : trim($this->conf['startingpoint']); + $pid = $this->conf['startingpointrecords'] ? $this->conf['startingpointrecords'] : $GLOBALS['TSFE']->id; + $this->conf['startingpointrecords'] = $this->conf['startingpointrecords'] ? $this->conf['startingpointrecords'] : $pid; + $this->config['startingpointrecords'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'startingpointrecords', 'sDEF') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'startingpointrecords', 'sDEF') : ($this->conf['startingpointrecords']); + $this->config['startingpointdam'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'startingpointdam', 'sDEF'); + $this->config['startingpointdamcat'] = $this->getFlexform('sDEF', 'startingpointdamcat', 'startingpointdamcat'); + $this->config['recursivedamcat'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'recursivedamcat', 'sDEF'); + $this->config['text'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'text', 'sDEF') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'text', 'sDEF') : $this->conf['text']; + $this->config['id'] = $this->cObj->data['uid'] . $this->conf['id']; + + // size of images, overwritten by flexforms + $this->config['width'] = ($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'width', 'sDEF')) ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'width', 'sDEF') : $this->conf['big.']['file.']['maxW']; + # if ($this->config['width']) $this->conf['big.']['file.']['maxW'] = $this->config['width']; + $this->config['height'] = ($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'height', 'sDEF')) ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'height', 'sDEF') : $this->conf['big.']['file.']['maxH']; + # if ($this->config['height']) $this->conf['big.']['file.']['maxH'] = $this->config['height']; + + + $this->config['heightGallery'] = intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'heightgallery', 'sDEF')) ? intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'heightgallery', 'sDEF')) : $this->conf['heightGallery']; + $this->config['widthGallery'] = intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'widthgallery', 'sDEF')) ? intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'widthgallery', 'sDEF')) : $this->conf['widthGallery']; + + if (strpos($this->config['width'], 'c') || strpos($this->config['width'], 'm') || strpos($this->config['height'], 'c') || strpos($this->config['height'], 'm')) { + $this->conf['big.']['file.']['width'] = $this->config['width']; + $this->conf['big.']['file.']['height'] = $this->config['height']; + $this->conf['big2.']['file.']['10.']['file.']['width'] = $this->config['width']; + $this->conf['big2.']['file.']['10.']['file.']['height'] = $this->config['height']; + + unset($this->conf['big.']['file.']['maxW']); + unset($this->conf['big.']['file.']['maxH']); + unset($this->conf['big2.']['file.']['10.']['file.']['maxW']); + unset($this->conf['big2.']['file.']['10.']['file.']['maxH']); + } else { + if ($this->config['width']) { + $this->conf['big.']['file.']['maxW'] = $this->config['width']; + $this->conf['big2.']['file.']['10.']['file.']['maxW'] = $this->config['width']; + } + if ($this->config['height']) { + $this->conf['big.']['file.']['maxH'] = $this->config['height']; + $this->conf['big2.']['file.']['10.']['file.']['maxH'] = $this->config['height']; + } + if (!$this->config['heightGallery']) { + $this->config['heightGallery'] = $this->config['height']; + } + if (!$this->config['widthGallery']) { + $this->config['widthGallery'] = $this->config['width']; + } + } + + // check starting point for missing slash + if (substr($this->config['startingpoint'], -1) != '/') { + $this->config['startingpoint'] = $this->config['startingpoint'] . '/'; + } + + if (substr($this->config['startingpoint'], 0, 1) == '/') { + $size = strlen($this->config['startingpoint']); + $this->config['startingpoint'] = substr($this->config['startingpoint'], 1, $size - 1); + } + + /* + * Advanced settings + */ + $this->config['hideInfoPane'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'infopane', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'infopane', 'advanced') : $this->conf['hideInfoPane']; + $this->config['thumbOpacity'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'thumbopacity', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'thumbopacity', 'advanced') : $this->conf['thumbOpacity']; + $this->config['slideInfoZoneOpacity'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'slideinfozoneopacity', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'slideinfozoneopacity', 'advanced') : $this->conf['slideInfoZoneOpacity']; + $this->config['thumbSpacing'] = intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'thumbspacing', 'advanced')) ? intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'thumbspacing', 'advanced')) : $this->conf['thumbSpacing']; + + $this->config['watermarks'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'watermark', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'watermark', 'advanced') : $this->conf['watermarks']; + $this->config['limitImagesDisplayed'] = intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'limitImagesDisplayed', 'advanced')) ? intval($this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'limitImagesDisplayed', 'advanced')) : intval($this->conf['limitImagesDisplayed']); + + $this->config['lightbox'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'lightbox', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'lightbox', 'advanced') : $this->conf['lightbox']; + $this->config['showThumbs'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'showThumbs', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'showThumbs', 'advanced') : $this->conf['showThumbs']; + $this->config['showPlay'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'showPlay', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'showPlay', 'advanced') : $this->conf['showPlay']; + $this->config['arrows'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'arrows', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'arrows', 'advanced') : $this->conf['arrows']; + $this->config['advancedSettings'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'advancedsettings', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'advancedsettings', 'advanced') : $this->conf['advancedSettings']; + $this->config['externalThumbs'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'externalthumbs', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'externalthumbs', 'advanced') : $this->conf['externalThumbs']; + $this->config['externalControl'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'externalcontrol', 'advanced') ? $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'externalcontrol', 'advanced') : $this->conf['externalControl']; + + /* + * Split characters from Extension Manager + */ + $tmp_confArr = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['rgsmoothgallery']); + $tmp_confArr['splitRecord'] = ($tmp_confArr['splitRecord']) ? $tmp_confArr['splitRecord'] : '\n'; + $this->config['splitRecord'] = ($tmp_confArr['splitRecord'] == '\n') ? "\n" : $tmp_confArr['splitRecord']; + + $this->config['splitComment'] = ($tmp_confArr['splitComment']) ? $tmp_confArr['splitComment'] : '|'; + + /* + * StdWrap options for every value from flexforms merged with TS to override it again with TS and to manipulate it with stdWrap things + */ + + foreach ($this->config as $key => $value) { + $this->config[$key] = $this->cObj->stdWrap($value, $this->conf[$key . '.']); + } + } + + /** + * The main method of the PlugIn + * for showing the SmoothGallery + * + * @param string $content: The PlugIn content + * @param array $conf: The PlugIn configuration + * @return The gallery + */ + public function main($content, $conf) + { + $this->init($conf); + $this->pi_setPiVarDefaults(); + $this->pi_loadLL(); + $this->pi_USER_INT_obj = 0; // Configuring so caching is expected. + $this->pi_initPIflexForm(); // Init FlexForm configuration for plugin + + if ($this->conf['pathToJdgalleryJS'] == '') { + return $this->pi_getLL('errorIncludeStatic'); + } else { + // get the needed js to load the gallery and to start it + $content .= $this->getJs( + $this->config['lightbox'], $this->config['showThumbs'], $this->config['arrows'], $this->config['duration'], $this->config['width'], $this->config['height'], $this->config['widthGallery'], $this->config['heightGallery'], $this->config['advancedSettings'], $this->config['id'], $this->conf + ); + + // depending on the chosen settings the images come from different places + $content .= $this->getImageDifferentPlaces($this->config['limitImagesDisplayed']); + + #return $this->pi_wrapInBaseClass($content); + return '
' . $content . '
'; + } + } + +# end main + /** + * Just some divs needed for the gallery + * + * @param string/int $uniqueId: A unique ID to have more than 1 galleries on 1 page + * @return The opened divs + */ + public function beginGallery($uniqueId, $limitImages = 0) + { + if ($limitImages == 1) { + $content = '
'; + } else { + $content = '
'; + } + + // Save button && Print button + $content .= ''; + + if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraBeginGalleryHook'])) { + foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraBeginGalleryHook'] as $_classRef) { + $_procObj = & t3lib_div::getUserObj($_classRef); + $content = $_procObj->extraBeginGalleryProcessor($content, $limitImages, $this); + } + } + + return $content; + } + +# end beginGallery + /** + * Just some divs needed for the gallery + * + * @return The closed divs + */ + public function endGallery() + { + $content = '
'; + if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraEndGalleryHook'])) { + foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraEndGalleryHook'] as $_classRef) { + $_procObj = & t3lib_div::getUserObj($_classRef); + $content = $_procObj->extraEndGalleryProcessor($content, $this); + } + } + + return $content; + } + +# end endGallery + /** + * get the images out of a directory + * + * @param int $limitImages: How many images to return; default=0 list all + * @return image(s) + */ + public function getImagesDirectory($limitImages = 0) + { + if (is_dir($this->config['startingpoint'])) { + $images = array(); + $images = $this->getFiles($this->config['startingpoint']); + // randomise and limit image items returned from images array + // also useful to limit items in array to 1 item for use when no javascript in browser + // if $limitImages=0 then this if statement is bypassed and all images in images array returned for processing + if ($limitImages > 0) { + $images = $this->getSlicedRandomArray($images, 0, $limitImages); + } + + $content .= $this->beginGallery($this->config['id'], $limitImages); + + // read the description from field in flexforms + if ($this->config['text'] != '') { + $caption = explode($this->config['splitRecord'], $this->config['text']); + } + + // add the images + foreach ($images as $key => $value) { + $path = $this->config['startingpoint'] . $value; + + // caption text + if ($caption[$key]) { + $text = explode($this->config['splitComment'], $caption[$key]); + } else { + // update of Xavier Perseguers (typo3@perseguers.ch) thx! + $text = $this->readImageInfo($this->config['startingpoint'] . $value); + } + + if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraGetImagesDirectoryHook'])) { + foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rgsmoothgallery']['extraGetImagesDirectoryHook'] as $_classRef) { + $_procObj = & t3lib_div::getUserObj($_classRef); + $text = $_procObj->extraGetImagesDirectoryHook($text, $this->config['startingpoint'] . $value, $this); + } + } + + // add element to slideshow + $content .= $this->addImage( + $path, $text[0], $text[1], $this->config['showThumbs'], $this->config['lightbox'], $path, $limitImages + ); + } # end foreach file + + + $content .= $this->endGallery(); + } # end is_dir + return $content; + } + +# end getImagesDirectory + /** + * get the images out of records a user created in the backend before + * + * @param int $limitImages: How many images to return; default=0 list all + * @return image(s) + */ + public function getImagesRecords($limitImages = 0) + { + //prepare query + $sort = 'sorting'; + $fields = 'title,image,description,l18n_parent'; + $tables = 'tx_rgsmoothgallery_image'; + $temp_where = 'pid IN (' . $this->config['startingpointrecords'] . ') AND hidden=0 AND deleted=0 AND sys_language_uid = ' . $GLOBALS['TSFE']->sys_language_content; + + $content .= $this->beginGallery($this->config['id'], $limitImages); + + // add the images + // randomise and limit image items returned from images array + // also useful to limit items in array to 1 item for use when no javascript in browser + // if $limitImages=0 then this if statement is bypassed and all images in images array returned for processing + if ($limitImages > 0) { + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $tables, $temp_where, '', 'rand()', $limitImages); + } else { + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $tables, $temp_where, '', $sort, ''); + } + $this->sys_language_mode = $this->conf['sys_language_mode'] ? $this->conf['sys_language_mode'] : $GLOBALS['TSFE']->sys_language_mode; + while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { + if ($GLOBALS['TSFE']->sys_language_content) { + $OLmode = ($this->sys_language_mode == 'strict' ? 'hideNonTranslated' : ''); + $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_rgsmoothgallery_image', $row, $GLOBALS['TSFE']->sys_language_content, $OLmode); + } + + if ($row['image'] == '') { + $res2 = $GLOBALS['TYPO3_DB']->exec_SELECTquery('image', $tables, 'uid=' . $row['l18n_parent']); + $row2 = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res2); + $row['image'] = $row2['image']; + } + + $path = 'uploads/tx_rgsmoothgallery/' . $row['image']; + + // add element to slideshow + $content .= $this->addImage( + $path, $row['title'], $row['description'], $this->config['showThumbs'], $this->config['lightbox'], $path, $limitImages + ); + } # end foreach file + + + $content .= $this->endGallery(); + + return $content; + } + +# getImagesRecords + /** + * get the images out of DAM + * + * @param int $limitImages: How many images to return; default=0 list all + * @return image(s) + */ + public function getImagesDam($limitImages = 0) + { + // update of ian (ian@webian.it) thx! + // check if there's a localized version of the current content object + $uid = $this->cObj->data['uid']; + if ($this->cObj->data['_LOCALIZED_UID']) { + $uid = $this->cObj->data['_LOCALIZED_UID']; + } + $sys_language_uid = $GLOBALS['TSFE']->sys_language_content; + + // get all the files + $images = tx_dam_db::getReferencedFiles('tt_content', $uid, 'rgsmoothgallery', 'tx_dam_mm_ref'); + + // randomise and limit image items returned from images array + if ($limitImages > 0) { + $test = ($images['files']); + $test = $this->getSlicedRandomArray($test, 0, $limitImages); + $images['files'] = $test; + } + + // begin gallery + $content .= $this->beginGallery($this->config['id'], $limitImages); + + // add image + foreach ($images['files'] as $key => $path) { + // get data from the single image + $fields = 'title,description'; + $tables = 'tx_dam'; + + // now i check the tx_dam table to see if there's a localization for the current DAM record (image) + $temp_where = 'l18n_parent = ' . $key . ' AND sys_language_uid = ' . $sys_language_uid; + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', $tables, $temp_where); + // if i find a localized record i overwrite the default language $key with the localized language $key + if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { + $key = $row['uid']; + } + $GLOBALS['TYPO3_DB']->sql_free_result($res); + + $temp_where = 'uid = ' . $key; + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $tables, $temp_where); + $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); + + // add element to slideshow + $content .= $this->addImage( + $path, $row['title'], $row['description'], $this->config['showThumbs'], $this->config['lightbox'], $path, $limitImages + ); + } + + $content .= $this->endGallery(); + + return $content; + } + +# end getImagesDam + /** + * get the images out of DAM + * + * @param int $limitImages: How many images to return; default=0 list all + * @return image(s) + */ + public function getImagesDamCat($limitImages = 0) + { + $content .= $this->beginGallery($this->config['id'], $limitImages); + + // add image + $list = str_replace('tx_dam_cat_', '', $this->config['startingpointdamcat']); + + $listRecursive = $this->getRecursiveDamCat($list, $this->config['recursivedamcat']); + $listArray = explode(',', $listRecursive); + $files = array(); + foreach ($listArray as $cat) { + + // add images from categories + $fields = 'tx_dam.uid,tx_dam.title,tx_dam.description,tx_dam.file_name,tx_dam.file_path'; + $tables = 'tx_dam,tx_dam_mm_cat'; + $temp_where = 'tx_dam.deleted = 0 AND tx_dam.file_mime_type=\'image\' AND tx_dam.hidden=0 AND tx_dam_mm_cat.uid_foreign=' . $cat . ' AND tx_dam_mm_cat.uid_local=tx_dam.uid'; + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $tables, $temp_where, '', 'tx_dam.sorting'); + + while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { + $files[$row['uid']] = $row; # just add the image to an array + } + + $GLOBALS['TYPO3_DB']->sql_free_result($res); + } + + if ($limitImages > 0) { + $files = $this->getSlicedRandomArray($files, 0, $limitImages); + } + + // add the image for real + foreach ($files as $key => $row) { + $path = $row['file_path'] . $row['file_name']; + + // add element to slideshow + $content .= $this->addImage( + $path, $row['title'], nl2br($row['description']), $this->config['showThumbs'], $this->config['lightbox'], $path, $limitImages + ); + } + + $content .= $this->endGallery(); + + return $content; + } + + /** + * Loads all the needed javascript stuff and + * does the configuration of the gallery + * + * @param boolean $lightboxVal: Lightbox activated= + * @param boolean $thumbsVal: Thumbnail preview activated? + * @param boolean $arrowsVal: Arrows to neighbour images activated? + * @param string $durationVal: If automatic slideshow the value of the delay + * @param int $width: Width of gallery (depricated) + * @param int $height: Height of gallery (depricated) + * @param string $advancedSettings: Advanced configuration + * @param string/int $uniqueId: A unique ID to have more than 1 galleries on 1 page + * $param array $conf: $configuration-array + * @return The gallery + */ + public function getJs($lightboxVal, $thumbsVal, $arrowsVal, $durationVal, $width, $height, $widthGallery, $heightGallery, $advancedSettings, $uniqueId, $conf, $overrideJS = '') + { + $this->conf = $conf; + + if (t3lib_extMgm::isLoaded('t3mootools')) { + require_once t3lib_extMgm::extPath('t3mootools') . 'class.tx_t3mootools.php'; + } + if (defined('T3MOOTOOLS')) { + tx_t3mootools::addMooJS(); + } else { + $header .= $this->getPath($this->conf['pathToMootools']) ? '' : ''; + } + + // path to js + css + $GLOBALS['TSFE']->additionalHeaderData['rgsmoothgallery'] = $header . ' + + + + '; - - if ($this->config['externalControl'] == 1) { - $externalControl1 = 'var myGallery' . $uniqueId . ';'; - } else { - $externalControl2 = 'var'; - } - - // inline CSS for different size of gallery - $widthGallery = $widthGallery ? 'width:' . $widthGallery . 'px;' : ''; - $heightGallery = $heightGallery ? 'height:' . $heightGallery . 'px;' : ''; - if ($heightGallery != '' || $widthGallery != '') { - $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery' . $uniqueId] = '#myGallery' . $uniqueId . ' {' . $widthGallery . $heightGallery . '}'; - } - - // inline CSS for the loading bar if plugin not loaded and for the given height of the gallery - $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery' . $uniqueId] .= ' .rgsgnest' . $uniqueId . ' { ' . $widthGallery . $heightGallery . ' }'; - - if ($this->conf['rgsmoothgallerylinks'] == 1) { - $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery' . $uniqueId] .= ' .rgsglinks' . $uniqueId . ' { ' . $widthGallery . ' }'; - } - - // configuration of gallery - $lightbox = ($lightboxVal == 1) ? 'true' : 'false'; - $duration = ($durationVal) ? 'timed:true,delay: ' . $durationVal : 'timed:false'; - $thumbs = ($thumbsVal == 1) ? 'true' : 'false'; - $arrows = ($arrowsVal == 1) ? 'true' : 'false'; - - // advanced settings (from TS + tab flexform configuration) - $advancedSettings .= ($this->config['hideInfoPane']) ? 'showInfopane: false,' : ''; - if ($this->config['thumbOpacity'] && $this->config['thumbOpacity'] > 0 && $this->config['thumbOpacity']<=1) $advancedSettings.= 'thumbOpacity: '.$this->config['thumbOpacity'].','; - if (!$this->config['hideInfoPane'] && $this->config['slideInfoZoneOpacity'] && $this->config['slideInfoZoneOpacity'] > 0 && $this->config['slideInfoZoneOpacity']<=1) $advancedSettings.= 'slideInfoZoneOpacity: '.$this->config['slideInfoZoneOpacity'].','; - $advancedSettings .= ($this->config['thumbSpacing']) ? 'thumbSpacing: ' . $this->config['thumbSpacing'] . ',' : ''; - $advancedSettings .= ($this->config['showPlay']) ? 'showPlay: true,' : ''; - - // external thumbs - $advancedSettings .= ($this->config['externalThumbs']) ? 'useExternalCarousel:true,carouselElement:$("' . $this->config['externalThumbs'] . '"),' : ''; - # - - // js needed to load the gallery and to get it started - if ($overrideJS != '') { - $js = $overrideJS; - } else { - $js .= ' + + if ($this->config['externalControl'] == 1) { + $externalControl1 = 'var myGallery' . $uniqueId . ';'; + } else { + $externalControl2 = 'var'; + } + + // inline CSS for different size of gallery + $widthGallery = $widthGallery ? 'width:' . $widthGallery . 'px;' : ''; + $heightGallery = $heightGallery ? 'height:' . $heightGallery . 'px;' : ''; + if ($heightGallery != '' || $widthGallery != '') { + $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery' . $uniqueId] = '#myGallery' . $uniqueId . ' {' . $widthGallery . $heightGallery . '}'; + } + + // inline CSS for the loading bar if plugin not loaded and for the given height of the gallery + $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery' . $uniqueId] .= ' .rgsgnest' . $uniqueId . ' { ' . $widthGallery . $heightGallery . ' }'; + + if ($this->conf['rgsmoothgallerylinks'] == 1) { + $GLOBALS['TSFE']->additionalCSS['rgsmoothgallery' . $uniqueId] .= ' .rgsglinks' . $uniqueId . ' { ' . $widthGallery . ' }'; + } + + // configuration of gallery + $lightbox = ($lightboxVal == 1) ? 'true' : 'false'; + $duration = ($durationVal) ? 'timed:true,delay: ' . $durationVal : 'timed:false'; + $thumbs = ($thumbsVal == 1) ? 'true' : 'false'; + $arrows = ($arrowsVal == 1) ? 'true' : 'false'; + + // advanced settings (from TS + tab flexform configuration) + $advancedSettings .= ($this->config['hideInfoPane']) ? 'showInfopane: false,' : ''; + if ($this->config['thumbOpacity'] && $this->config['thumbOpacity'] > 0 && $this->config['thumbOpacity'] <= 1) { + $advancedSettings .= 'thumbOpacity: ' . $this->config['thumbOpacity'] . ','; + } + if (!$this->config['hideInfoPane'] && $this->config['slideInfoZoneOpacity'] && $this->config['slideInfoZoneOpacity'] > 0 && $this->config['slideInfoZoneOpacity'] <= 1) { + $advancedSettings .= 'slideInfoZoneOpacity: ' . $this->config['slideInfoZoneOpacity'] . ','; + } + $advancedSettings .= ($this->config['thumbSpacing']) ? 'thumbSpacing: ' . $this->config['thumbSpacing'] . ',' : ''; + $advancedSettings .= ($this->config['showPlay']) ? 'showPlay: true,' : ''; + + // external thumbs + $advancedSettings .= ($this->config['externalThumbs']) ? 'useExternalCarousel:true,carouselElement:$("' . $this->config['externalThumbs'] . '"),' : ''; + # + // js needed to load the gallery and to get it started + if ($overrideJS != '') { + $js = $overrideJS; + } else { + $js .= ' '; - if ($this->conf['noscript'] == 1) { - $js .= '