+dD'w% ^E'w%@BP  /:sE'w%^E'w%dDEw%GeD'w%dD'w%Zzv%Notes2Couch``` Ō`  Ō)ŌŌ` Ō`  RE'w% bd0@ SE'w%G rE'w%GeD'w%^E'w%SE'w%PE'w%&3D@{ " i/- !~/ _@/ _@B0dz= / _@/ _@/ `YPE'w%bYtE'w%ZP\^BpN a1E'#4TyZU2fG CPV v;F9.#~dM f.ļa3œI$ɔ"/`bCAM+p! tB^dGÂʎ)iX_eׂ݀J*<_kqk  @'Qۊd)Q>fYِ!9)]^H{>@Y9t 3D2k C ^v|3 VB,ܛG Mi,@ a= J.NT̈CQIWβب"2 A=tÜ۰H7:|T;ց-sJIAM .Z@-5 Z=Vgr\)`vM9 ,@'eTPaR$nȔ7ra1 J2w}C yӦM?ݺ/!gHTC2d4`*00:)6 ʱ 3H 4c萐RĨR&Eľ2:LޜP Ę"cʌNH A7`meU:!Z0+ *%:$9]"I <呤200& `V?nxOǸ례 +@PmEԏ0WaXD@leqFjd@ &K"ذ C'7iؒ:{APt+C;Вoo~ Pt 5H* "|h4 by#,IИ X0V+m\rpDT^$ ^B(]il߅P"cHn0`#Fe56{e FԐQbЦV7ZXdEN@ ` $p H0ĠDƈ Č R ցЋ@Cty(PBi"sY &3pP M0678Ls$#!cTٻ@a @ 0[[@ b!bB(d@#"UJ b;զ7t`he-1& CpmFB&Qő+fp1dɔ-c;sХS];w 4xaB 6tr$ɒ&OLr%4[OfG da & l&lMP Yf\p{&eʸxPXa:TRP @?p>啙=XeVS fJTi:F؄93gV ,pa$Dl0ahHECfv}ksƞwܳ`>#V*EM4rqQ'`֔*Ҙ C{qht $U\g0b2qbqH*i14@D-1R : Hxx(u@G>$$UȲB!ea@P Ö!a +>x)%vK+* ̋!)1Br$IFDԼу'G7(¶튷 !LyhBg~ȶ մha!+?gh+k$ QɃeq+F B*gS@ eATN&pTߚZBˆf P *AP5J 4RS7x ^|囕Ď9,ر 0EGcôw{[3(A6R]7mM;`RSH&~5k?;s:{D bCL$6㧮GnqӇ >d2!(ʔ+U:`l6xbǯJ})Zv^U]aҎB؀-(NTARN&Iv؜nS?z݁mԺ4rF-#}g&w$wk{2ߩVB;n, amRQnJ1$ ɤ)$-ʼn'Q+ $jS |\#o|\ʐ2jJ]N L xÂvTEѤ$8ŋYvKfCa ,_rك{ ՍԢ9Zl#j*YR.a-w1 VcӞW= 0ǍW0;≊|v:A9vq'1l%T!9׳puuj.I4g1D@S#Zhs.pe3hIAUm^2{%+}۪k 9ЯClyh5*XV{ 3ʙoQe9Vsf jӮ7Z>EШB¬le FȮqT▢~D)L:U^ D?z>^(I*&NZ'%pb1-:IʗvrxUԼoRW]-U>mG(-<<9x6ycQѦ)HJ_%t҄H :I-r3!5y@P'<*XA5xܛOڛ/u\m"-Iޒhf $jb%8(&&)ʢYe4M]#)pB}k޹C 9Y@g85($?J_7HOV}/Gpf7yweIAT­'B(h)K9͑FL<@2mY"a`ZR0Dŏp =~ar@D,IR=31—%Q\wΒ&U& 1& Ze06C1Q(r#y>՛}NnU"ŸtknE/L:ؚJo~-!kσXz扳b_-beck>]&ˆ%xSj޶qg؃MPܳ0$V`Ô!Y!$rAO{VĜ'ޣ⭔kO7l:W{,IAm T,Mkr2Ȗ/v"ecѪa52q:/z)Gp\zVn9s_fn٣bN\bW[V:fI{|14ă E  ?'n=JR@{ˋyWN586v slUZ] BfپÓ&V2H@X)_]pMj[gaM KH;w嗌]vZo)`1#VMOD37K-M".η7W.)$I.U1+ ?B|kG:3cM5>,DH ?jdYcI13$8 T{D^űH/]vK2R3#B}0ywH3c8V=uvĎ6Є8¥QEM jBItryrapi0hۧ10uk$j gO y>a/v0KTv[ccì[2hS6` Ǝ1Ds{֏ z1sodE>ٴ/?W3Yȶ?p`=z%?dMwf>^ |H7_9髑Gk6l70[_O /]LyOƭ}!8<ԾN-_!ziR1 ž}'ݑv>}1 fߏR|>+]$y#|tzw^0'6@5nş ׻ ^k7yls׫Z!>> s'oAΞL^&~dkvP,fyJ5$~٣WҵJݟpoDʬ{b'_N {`~@;N? quڨ%S;^N:G]fsrn ۧK m%0n?ϡIyha>/?E&_ dS.IY?NjӅ]#ZcB;T잏WeX腁G7 !A/$dw@ 9ԑ34l@ C $1+\%;y9s5xSɕ&I0g=# RW>8eɰh b(:|$FKPm9o䀘  D o3q b5IӦ Aa MOɇG&8xdtA b[u]p<tL+h" s@8yC\2"r 4 ˬ7uƠ!#7g޸P,&!$!D]= E~Nl[@QĬ&tx 2rbH6lq$Lۚ:[CEΐAd$AbkXhmB޼aS&[} H+A;Tf}wcOaEʺ0 UԫY 0_@/ _@/jS!%(1`Z gQ0vd _@/ _@. 3P7٢Av E/ _@/ _@/Ng』 ~ U&^/ tè`yI%`eD!zH2).Z&5s)Ks30z#X% 6y @C }&N92 x1tE'w%?,  `p ?Wr SFrGv%D'w%eD'w%?8fcD'w%cOc'F(Ap%"x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk +hv%h+}% O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVBV1.0BCBA0BLvNNO_^O~xZ}zӝ㪦ї*驲4a62dr>3\6f,ܪ:$P.ENMAPS8~PURSAFO_mA/@"jnG@ |Z3Y<0\Q;D ^g"OԳl ;qE㊟;aɄX[Jo9( d#!A"0Bh7.KlPG;ya"- 1&q,@ؕ* $ACLDigest p@@#t5KeD'w%KeD'w%dD'w%zv%J1lv@UCAeDTw%@~ eD'w%t       $TITLE$FormPrivs$FormUsers$Body$Flags$Class$Modified$Comment$AssistTrigger$AssistType$AssistFlags$AssistFlags2$UpdatedBy$$FormScript_O$LANGUAGE$Writers$PWriters$FlagsExt$FileSize$MimeType$DesignerVersion$XPageAlt$ClassIndexItem$C1$ $Modified 1S2S3S$FlagsX  0SL1S4S5SDf$TITLE"BVb~nwnyTb͜'O tgp&$;]} 4FnWz=g% (W2G%q=ܞCu9f 6GhQCT`sHRň"!w߭C}5fjccrRζ{?e ?y儡܀A2,9Dn=*uX[#Os㴂{Ȧmأk.~}g.'NPLD]~;Q)`SȽPW/O. ǯ%FҗX}c#Yf VY/*hFR%JTF 1Fm\Myx+ 0 # G \   >D     > sE'w%N@`•B&UCa(P6 }EAxTzPTjRTjRd| *hRpJ.J0OWWKEqQA_NxBeDUD kUص`D |]qUة+`NR[$򪀡4 I* ԛQe4DTQPBLD@Qe)P?*K_@KI 5@@OZBQE DqOC5He PqD%i!qk`J)e j#TN""B`JR4B'`h] 6U(]5 FIdAL,Bh|1"`sE'w%z   /U i  bbzz$$\\33OOe vw_exportlogsP42rGv%©.v%YCN=Art)rs Meks/O=ALISE5/C=LVhfrm_exportconfigP"ѕ.DXWIv%z >'w%CCN=Art)rs Meks/O=ALISE5/C=LV h pg_xheaderV&өғ/ԤYIv%YIv%C34WQw1CN=Art)rs Meks/O=ALISE5/C=LVwx.02 sidebar (xpagestyle)V*퇷}YIv%Iv%C34WQw1CN=Art)rs Meks/O=ALISE5/C=LVi pg_xsidebarV*퇷}YIv%Iv%C34WQw1CN=Art)rs Meks/O=ALISE5/C=LVvx.03 border (xpagestyle)V.FYIv%ZIv%C34WQw1CN=Art)rs Meks/O=ALISE5/C=LVh pg_xborderV.FYIv%ZIv%C34WQw1CN=Art)rs Meks/O=ALISE5/C=LVh form headerUB1akgJv%{='w%CUAx3w1CN=Mris .bols/O=ALISE5/C=LVq(001. check connection)RV0-)v%)u>v%fL3CN=Art)rs Meks/O=ALISE5/C=LVlag_checkconnectionRV0-)v%)u>v%fL3CN=Art)rs Meks/O=ALISE5/C=LVl(002. export data)RbN)6v%_Jw%fL3CN=Art)rs Meks/O=ALISE5/C=LVg ag_exportdataRbN)6v%_Jw%fL3CN=Art)rs Meks/O=ALISE5/C=LViMdomino_logo.jpg6f<>m$Tv%†$Tv%34CiQPLdominologo.jpg6f<>m$Tv%†$Tv%34CiQPJ couchdb.jpg7jV$Tv%m='w%D34CiQPd frm_exportlogOn*p\_!PWv%Daw%CN=Art)rs Meks/O=ALISE5/C=LVF .classpath4;Qn@M w%°M w%~C4g;G7$profileR010lastvalues_cn=mris bols/o=it alise/c=lv]E'w%$0 CN=Mris .bols/O=IT ALISE/C=LV/2 \@Z XX S55  ##bd (exportlogs)P42rGv%©.v%YCN=Art)rs Meks/O=ALISE5/C=LV\b exportlogsP42rGv%©.v%YCN=Art)rs Meks/O=ALISE5/C=LV@lexprot configurationP"ѕ.DXWIv%z >'w%CCN=Art)rs Meks/O=ALISE5/C=LVqx.01 header (xpagestyle)V&өғ/ԤYIv%YIv%C34WQw1CN=Art)rs Meks/O=ALISE5/C=LV$} mainframeset notes (xpage style)U2c` HF\Iv%Y>Jv%#34CQwCN=Art)rs Meks/O=ALISE5/C=LVj mainxframesetU2c` HF\Iv%Y>Jv%#34CQwCN=Art)rs Meks/O=ALISE5/C=LV ols.snapps.jsonwriterS69MxߟQiIv%iIv%s34QCN=Art)rs Meks/O=ALISE5/C=LVjhttpcoanectionTB6CStIv%='w%sj34QCN=Art)rs Meks/O=ALISE5/C=LVbqlib_httpconnectionls2jSF'ӁTtIv%='w%s34QCN=Art)rs Meks/O=ALISE5/C=LVplibhttpconnectionls2jSF'ӁTtIv%='w%s34QCN=Art)rs Meks/O=ALISE5/C=LVlsfrm_formheaderUJ1akgJv%{='w%CUAx3w1CN=Mris .bols/O=ALISE5/C=LVnlib_systemfunctionsSNdɸ$ Av%>'w%s34QCN=Art)rs Meks/O=ALISE5/C=LVmlibsystemfunctionsSNdɸ$ Ov%>'w%s34QCN=Art)rs Meks/O=ALISE5/C=LVo001. check connectionRV0-)v%)u>v%fL3CN=Art)rs Meks/O=ALISE5/C=LVj002. export dataRbN)6v%_Jw%fL3CN=Art)rs Meks/O=ALISE5/C=LVa export logOn*p\_!PWv%Daw%CN=Art)rs Meas/O=ALISE5/C=LVZ `alldocsQ~$-5Uw%Uw%PYCN=Art)rs Meks/O=ALISE5/C=LVNclass xmlprocessor4v r.? w%~=w%s34QLbuild.properties4*7M w%='w%~C4gS F plugin.xml4}%ۨ:M w%=M w%~C4g E.project5!O'w%"өғ/ԤYIv%YIv%&퇷}YIv%Iv%*6CStIv%='w%B'ӁTtIv%='w%Fdɸ$ Ov%->'w%NN)6v%³_Jw%bV$Tv%m='w%j!*p\_!PWv%Daw%n_$Hgv>v%fv>v%rݴMZɱFv%Fv%vLӏ^nOw%nOw%z$-5Uw%Uw%~*7M w%='w%Š!S$9}t='w%t='w%šFh3vPŽR>'w%Tt?'w%žC*dcv3AB'w%XC'w%¢}I0RE'w%]E'w% ll**vP  FFWr SFrGv%D'w%&A rGv%u,w%FYIv%ZIv%.c` HF\Iv%Y>Jv%29MxߟQiIv%iIv%61akgJv%{='w%J0-)v%*)u>v%V/.v%.v%Z<>m$Tv%$Tv%fv r.? w%#~=w%‚;Qn@M w%M w%†}%ۨ:M w%=M w%Žv!O^%rGv% FeD'w% eB 3eD'w%Wr SFrGv%D'w%@eD'w%?eD'w%eD'w%  LCH[θґvCN=Art)rs Meks/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVh&A rGv%u,w% eD'w%eD'w%eD'w%   n  L"  4Jn      $TITLE$FormPrivs$FormUsers$Body$Flags$Class$Modified$Comment$AssistTrigghr$AssistType$AssistFlags$AssistFlags2$UpdatedBy$$FormScript_O$LANGUAGE$Writers$PWriters$FlagsExt$FileSize$MimeType$DesignerVersion$XPageAlt$ClassIndexItem $Modified 1S2S3S$FlagsX  0SL1S4S5S3724Df$TITLECN=Mris .bols/O=ALISE5/C=LVd42rGv% .v% eD'w%>DE'w%eD'w%   D!  |   ^  >          8   1(ExportLogs)|vw_ExportLogsCN=Art)rs Meks/O=ALISE5/C=LV| $0i$3y" $0$3$Conflict$REF"Form frm_ExportLog  L1S2S3SDf$0EVCh VC $ $0Created $0i$3Exported by$$3y  4S&   +WCWCB 538Tahoma638Tahoma738Tahoma838TahomaY7"ѕ.DXWIv%¹z >'w% eD'w%peD'w%eD'w%  , D!   0  n  o   g  !"# K$ I aExprot Configurationfrm_ExportConfigCN=Art)rs Mekx/O=ALISE5/C=LVForm header | sfrm_FormHeader0000000000000000C7 fld_CouchDbURLfld_LNReplicaIDfld_LNFilePathfld_LNServerfld_LNDb&өғ/ԤYIv%YIv%eD'w% !\eD'w%eD'w%  * D!   $   X.01 Header (xPageStyle)pg_XHeaderCN=Art)rs Meks/O=ALISE5/C=LVC34WQw17*퇷}YIv%Iv%eD'w% (_eD'w%eD'w% , D!    $  ! X.02 Sidebar (xPageStyle)pg_XSideBarCN=Art)rs Meks/O=ALISE5/C=LVC34WQw17.FYIv%ZIv%eD'w% /eD'w%eD'w%  * D!   $ h  X.03 Border (xPageStyle)pg_XBorderCN=Art)rs Meks/O=ALISE5/C=LVC34WQw172c` HF\Iv%Y>Jv%eD'w%3eD'w%eH'w%D! . %    CN=Art)rs Meks/O=ALISE5/C=LVMainFrameset Notes (xPage Style)|MainXFrameset#34CQw769MxߟQiIv%iIv%@eD'w% ;ieD'w%eD'w% D!&   ' ( d) r /7CN=Art)rs Meks/O=ALISE5/C=LV6#v%ls.snapps.JSONWriters34Q1tB6CStIv%='w%@eD'w% JeD'w%eD'w% D!  ' * Z+D+D O7CN=Art)rs Meks/O=ALISE5/C=LVHttpConnectionsj34Q1:oGu%='w%%%source%%.jar86oYQ8%>|='w%='w%%%object%%.jarx~fpF'ӁTtIv%='w%@eD'w%NeD'w%eD'w%D!  ' (  ) v CN=Art)rs Meks/O=ALISE5/C=LVlib_HttpConnectionLS2Js34Q1J1akgJv%{='w%eD'w% l eD'w%eD'w%  " D   L $   Form headersfrm_FormHeaderCN=Mris .bols/O=ALISE5/C=LVCUAx3w18.5Ndɸ$ Ov%->'w%@eD'w%w?eD'w%eD'w%D!- - -' -( Q-) <%- -CN=Art)rs Meks/O=ALISE5/C=LVlib_SystemFunctionss34Q1V0-)v%()u>v%!eD'w%eD'w%eD'w%, * **- *. */ *0 *1 *2 *3 f*4 ** *5 *D!*6 * * *7* ~*u>v%(001. Check connection)|ag_CheckConnection@ETs4CN=Art)rs Meks/O=ALISE5/C=LV@fL37RZ/.v%.v%#eD'w%eD'w%eD'w% L#XCN=Art)rs Meks/O=ALISE5/C=LVbN)6v%³_Jw%%eD'w%eD'w%eD'w%8 ~8 N,  - . / 0 1 2 3 f4 * r(5 KD!6   7 _Jw%(002. Export data)|ag_ExportData@ETs4CN=Art)rs Meks/O=ALISE5/C=LV@fL37^Xf<>m$Tv%$Tv%'eD'w%#eD'w%eD'w%  0 9 : ; < = > ? @   OL#domino_logo.jpg34CiQPD??M@image/jpeg*Tv%domino_logo.jpg7CN=Art)rs Meks/O=ALISE5/C=LVjV$Tv%m='w%)eD'w%*eD'w%eD'w% 0 9 : ; < = > ? @  A  NLC couchdb.jpgD??U@image/jpeg"Tv%houchdb.jpg7C:\Temp\notesC86992\~couchdb.jpgCN=Art)rs Meks/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVD34CiQPn*p\_!PWv%Daw%+eD'w%w%eD'w%eD'w%   D!   , B ; n     "C# :$  Y Export Logfrm_ExportLogCN=Art)rs Meks/O=ALISE5/C=LVForm header | sfrm_FormHeader0000000000000000.MainFrameset Notes (xPage Style)|MainXFramesetContent7 fld_Bodyfld_CouchDbURLfld_LNFilePathfld_LNServerr_$Hgv>v%fv>v%-eD'w%eD'w%eD'w% L#XCN=Art)rs Meks/O=ALISE5/C=LVvݴMZɱFv%Fv%/eD'w%eD'w%eD'w% L#XCN=Art)rs Meks/O=ALISE5/C=LVzLӏ^nOw%nOw%1eD'w%eH'w%eD'w% L#XCN=Art)rs Meks/O=ALISE5/C=LV~$-5Uw%Uw%3eD'w% oeD'w%eD'w%  D! (       +AllDocsCN=Art)rs Meks/O=ALISE5/C=LV( $Conflict$REFf1DVC P $0# A0&   +WC BPY7`(XH(H@` t  dhD@0@9  30y=IT ALISE/C=LVAgita Krkliap@*TE'w%TE'w%dD'w%zv%J1lv@UCAMETw%2 eD'w% $0i$3y(# $0$3$Conflict$REF$C1$"Form frm_ExportLog  L1S2S3SDf$0W~\TBD&3kk(G 48I(ӥHo $9&PvEs bb?f?[J|'ϕqUw[MpSuӓ㍛RUukQibf4χO'\C=πmwYYO9PS(V~wVbeA?hUL1?(]j|* W1A_lKs=i=n%33{{~CYŚ^ = .ks8A*dդuHŏZzoMZ2r%ka\l?7 sF]{SdMs<"=T:`3oƶ4WLx? eiXIiNUƐA!'+vK}X&#lz7Np0ԕ@Ai£Dk1*;Oƽ$͒7#/]C+u浀 k&TV$C)#h.ϖKb8owTc^HKn㚩VGy>42rGv% .v% eD'w%>@t#yl :& Categori_zeN|(_Edit Document (_Send Document "_Forward ,_Move To Folder...=|._Remove From Folder>|#& Categori_zeN|(_Edit Document (_Send Document "_Forward ,_Move To Folder...=|._Remove From Foldere>|.v%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&i$vV>E "6,Exprot Configurationfrm_ExportConfigYk><Y "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader7m><>m "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar>< >K< "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder><!>_<B "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset><5>s<B "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 w) > <I><B "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB O >!<]><B+= "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB F  >5<q><B-?Qc4 "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB F J," Form headersfrm_FormHeader  >I<><BASew4 "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02"Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB F J," Form headersfrm_FormHeaderN  >]<><BUgy4>  "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB F J," Form headersfrm_FormHeaderN V6,(201. Check connection)|ag_CheckConnection5!3>q<><'Bi{4>#! "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPbgeStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB F J," Form headersfrm_FormHeaderN V6,(001. Check connection)|ag_CheckConnectionb #[5G><><;B}4>7I5 "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB F J," Form headersfrm_FormHeaderN V6,(001. Check connection)|ag_CheckConnectionb #f F(p!H( (#'(ExportLogs)|vw_ExportLogsY!CN=Art)rs Meks/O=ALISE5/C=LV7C C34WQw1#34CQwls.snapps.JSONWriters34Q$PHttpConnectionsj34Qlib_HttpConnectionLS2J CUAx3w1 CN=Mris .bols/O=ALISE5/C=LV8.5lib_SystemFunctionsfL34ETs"(002. Export data)|ag_ExportDatadomino_logo.jpg34CiQPD image/jpeg couchdb.jpg D34CiQP AllDocsPYClass XMLProbessor .classpath~C4g"CN=Aigars Prkons/O=ALISE5/C=LVbuild.properties plugin.xml .project~C4gPCouchdb-logo.jpgweFr3a:d`\X#n7 ͠k no#:n+ddn%nG.:[ 0 bC b b bi >n L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v% B3 7:\.v%42rGv%~ B 7:\Uw%$-5Uw% 偒 F ='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@S@*7M w%  ~=w%!!CN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVv r.? w% LX րa et='w%@!S$9}t='w%j r Ea e\m='w%CN=Art)rs Meks/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVU@V$Tv%f FLX :a e\$Tv%M@<>m$Tv%n* Export Logfrm_ExportLogB7 :\Daw%*p\_!PWv%"6,Exprot Configurationfrm_ExportConfigB` :\z >'w%ѕ.DXWIv%J," Form headersfrm_FormHeaderB̀ ր{='w%1akgJv%B @ :\='w%6CStIv%F @ :='w%'ӁTtIv%N @ :>'w%dɸ$ Ov%6 w@ :\iIv%9MxߟQiIv%2:0MainFrameset Notes (xPage Style)|MainXFramesetBn 7:\Y1Jv%c` HF\Iv% L  =M w%$@}%ۨ:M w% n;:nCdd n=n_.:s 0 b[ b b b > n 8 L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v% B3 7:\.v%42rGv%~ B 7:\Uw%$-5Uw% 偒 F ='w% CN=Aigars Prkons/O1ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@S@*7M w%  ~=w%!!CN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVv r.? w% LX րa et='w%@!S$9}t='w%j r Eae\m='w%CN=Art)rs Meks/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVU@V$Tv%f FLX :a e\$Tv%M@<>m$Tv%n* Export Logfrm_ExportLogB7 :\Daw%*p\_!PWv%"6,Exprot Configurationfrm_ExportConfigB` :\z >'w%ѕ.DXWIv%J," Form headersfrm_FormHeaderB̀ ր{='w%1akgJv%B @ :\='w%6CStIv%F @ :='w%'ӁTtIv%N @ :>'w%dɸ$ Ov%6 w@ :\iIv%9MxߟQiIv%2:0MainFrameset Notes (xPage Style)|MainXFramesetBn 7:\Y>Jv%c` HF\Iv% L  =M w%$@}%ۨ:M w%&4* X.01 Header (xPageStyle)pg_XHeaderBd :\YIv%өғ/ԤYIv% ~=w%!!CN=Art)rs Meks/O=AAISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVv r.? w% LX րa et='w%@!S$9}t='w%j r Ea e\m='w%CN=Art)rs Meks/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVU@V$Tv%f FLX :a e\$Tv%M@<>m$Tv%n* Export Logfrm_ExportLogB7 :\Daw%*p\_!PWv%"6,Exprot Configurationfrm_ExportConfigB` :\z >'w%ѕ.DXWIv%J," Form headersfrm_FormHeaderB̀ ր{='w%1akgJv%B @ :\='w%6CStIv%F @ :='w%'ӁTtIv%N @ :>'w%dɸ$ Ov% >9<u><B1CUg4>!2Sew "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6 wB F J," Form headersfrm_FormHeaderN V6,(001. Check connection)|ag_CheckConaectionb #f Fj rn* Export Logfrm_ExportLog~       >9<u><B1CUg4>!2Sew "6,Exprot Configurationfrm_ExportConfig&4* X.01 Header (xPageStyle)pg_XHeader*6, X.02 Sidebar (xPageStyle)pg_XSideBar.4* X.03 Border (xPageStyle)pg_XBorder2:0MainFrameset Notes (xPage Style)|MainXFrameset6wB F J," Form headersfrm_FormHeaderN V6,(001. Check connection)|ag_CheckConnectionb #f Fj rn* Export Logfrm_ExportLog~       9n9 L  M w%t@;Qn@M w%sQnQ L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%n:=n L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v%'n:Und L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C1LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v% B3 7:\.v%42rGv%n:mnd?d L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v% B3 7:\.v%42rGv%~ B 7:\Uw%$-5Uw%on7:ndWd L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v% B3 7:\.v%42rGv%~ B 7:\Uw%$-5Uw% 偒 F ='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@S@*7M w%  y  _Ink:nsdd;nm!n. : 0) b b bO b >En 8A : 8I L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v% B3 7:\.v%42rGv%~ B 7:\Uw%$-5Uw% 偒 F ='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@S@*7M w%  ~=w%!!CN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVv r.? w% LX րa et='w%@!S$9}t='w%j r Ea e\m='w%CN=Art)rs Meks/O=ALISE5/C=AVCN=Mris .bols/O=ALISE5/C=LVU@V$Tv%f FLX :a e\$Tv%M@<>m$Tv%n* Export Logfrm_ExportLogB7 :\Daw%*p\_!PWv%"6,Exprot Configurationfrm_ExportConfigB` :\z >'w%ѕ.DXWIv%J," Form headersfrm_FormHeaderB̀ ր{='w%1akgJv%B @ :\='w%6CStIv%F @ :='w%'ӁTtIv%N @ :>'w%dɸ$ Ov%6 w@ :\iIv%9MxߟQiIv%2:0MainFrameset Notes (xPage Style!|MainXFramesetBn 7:\Y>Jv%c` HF\Iv% L  =M w%$@}%ۨ:M w%&4* X.01 Header (xPageStyle)pg_XHeaderBd :\YIv%өғ/ԤYIv%*6, X.02 Sidebar (xPageStyle)pg_XSideBarBd :\Iv%퇷}YIv%.4* X.03 Border (xPageStyle)pg_XBorderBd :\ZIv%FYIv%;nm!n. : 0) b b bO b >E n 8A : 8I L  M w%t@;Qn@M w%  F "='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@!Ov%@0-)v%b #L  :7\_Jw%@N)6v% B3 7:\.v%42rGv%~ B 7:\Uw%$-5Uw% 偒 F ='w% CN=Aigars Prkons/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LV@S@*7M w%  ~=w%!!CN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVCN=Art)rs Meks/O=IT ALISE/C=LVCN=Art)rs Meks/O=ALISE5/C=LVv r.? w% LX րa et='w%@!S$9}t='w%j r Ea e\m='w%CN=Art)rs Meks/O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVU@V$Tv%f FLX :a e\$Tv%M@<>m$Tv%n* Export Logfrm_ExportLogB7 :\Daw%*p\_!PWv%"6,Exprot Configurationfrm_ExportConfigB` :\z >'w%ѕ.DXWIv%J," Form headersfrm_FormHeaderB̀ ր{='w%1akgJv%B @ :\='w%6CStIv%F @ :='w%'ӁTtIv%N @ :>'w%dɸ$ Ov%6 w@ :\iIv%9MxߟQiIv%2:0MainFrameset Notes (xPage Style)|MainXFramesetBn 7:\Q>Jv%c` HF\Iv% L  =M w%$@}%ۨ:M w%&4* X.01 Header (xPageStyle)pg_XHeaderBd :\YIv%өғ/ԤYIv%*6, X.02 Sidebar (xPageStyle)pg_XSideBarBd :\Iv%퇷}YIv%.4* X.03 Border (xPageStyle)pg_XBorderBd 1\ZIv%FYIv% _  !! !! (!i(H! (p"ѕ.DXWIv%¹z >'w% eD'w%¸p]_0.#Notes 2 Couch: Export configurationl&Tahoma&ArialWingdings'++LotusScript Development Environment:2:5:(Options):0:74 Option Public Option Declare Use "lib_SystemFunctions" '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Function lsf_StoreLastValues() As Boolean '++LotusScript Development Environment:2:5:(Declarations):0:2 '++LotusScript Development Environment:2:1:lsf_StoreLastValues:1:8 Function lsf_StoreLastValues() As Boolean On Error Goto errh Dim pDoc As NotesDocument Dim fieldList List As String fieldList("fld_LNDb")="" fieldList("fld_LNServer")="" fieldList("fld_LNFilePath")="" fieldList("fld_LNReplicaID")="" fieldList("fld_CouchDbURL")="" fieldList("fld_TmpPath")="" Set pDoc = g.db.GetProfileDocument("LastValues", g.session.UserName) Forall fld In fieldList Call pDoc.ReplaceItemValue(Listtag(fld), g.doc.GetItemValue(Listtag(fld))) End Forall Call pDoc.Save(False, False) lsf_StoreLastValues = True Exit Function errh: Error 3000, " [" & Lsi_info(2) & ": " & Cstr( Erl ) & "] " & Error Exit Function End FunctionLSOBen<$8 T<<<Lotus ProductV0.0W32I*72F7314lNEWDELETEL INITIALIZE, TERMINATE OBJECTlib_SystemFunctions\LIB_SYSTEMFUNCTIONSLSF_STORELASTVALUESERRH<PDOC` NOTESDOCUMENT%LSXBE NOTESDATABASE FIELDLISTXfld_LNDb fld_LNServer`fld_LNFilePathfld_LNReplicaIDfld_CouchDbURL fld_TmpPathtGlDBGETPROFILEDOCUMENT LastValues@SESSIONUSERNAMEFLDREPLACEITEMVALUEPDOC GETITEMVALUESAVE [h: ] GLOBAL NOTESSESSION NOTESITEMp#V TTdd HttttT P0LLL).i].).i]d@, c\    d).i]d@, c    d  @ @\ & @x ``  `!S`!0S(Sd p   <S  <).i]d@, c     < ).i].).i]d@, c (<  < < S L$ D :Ҍ :}od}}od}}od}}od}}od}}@od}^TKL,}KL-##Jd5#KT,yKL ,y##17KT,L#1 ]!" }Tֿ}`}l#$ frm_ExportConfig'++LotusScript Development Environment:2:5:(Options):0:66 '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Sub Postopen(Source As Notesuidocument) Declare Sub Queryclose(Source As Notesuidocument, Continue As Variant) Declare Sub Querysave(Source As Notesuidocument, Continue As Variant) '++LotusScript Development Environment:2:5:(Declarations):0:2 '++LotusScript Development Environment:2:2:BindEvents:1:129 Private Sub BindEvents(Byval Objectname_ As String) Static Source As NOTESUIDOCUMENT Set Source = Bind(Objectname_) On Event Postopen From Source Call Postopen On Event Queryclose From Source Call Queryclose On Event Querysave From Source Call Querysave End Sub '++LotusScript Development Environment:2:2:Postopen:1:12 Sub Postopen(Source As Notesuidocument) Call g.init(Source) End Sub '++LotusScript Development Environment:2:2:Queryclose:1:12 Sub Queryclose(Source As Notesuidocument, Continue As Variant) Call lsf_StoreLastValues() End Sub '++LotusScript Development Environment:2:2:Querysave:1:12 Sub Querysave(Source As Notesuidocument, Continue As Variant) Continue = False End SubLSOBengX$,8TllhhhLotus ProductV0.0gXW32IH*882E814lNEWDELETE INITIALIZEl TERMINATEOBJECT(GLOBALS) FRM_EXPORTCONFIG(Globals) frm_ExportConfig,SOURCEdCONTINUE BINDEVENTS OBJECTNAME_NOTESUIDOCUMENT%LSXUIPOSTOPEN QUERYCLOSE QUERYSAVEGINITXLSF_STORELASTVALUESLIB_SYSTEMFUNCTIONSGLOBAL NOTESDOCUMENT%LSXBE NOTESDATABASE\x]l0\\\\Lh).i]d 3pa   > O dtttdd[t 0]]@h & @\\   \\\!S!0S (!(S!@  @p).i].).i]d@, c`    ).i]d@, c$   k [\IG\lG\G\K, ]#)h#1]t 0  Z8888  $Hidden area ZPb00 0.#Notes 2 Couch: Export configurationfld_FormTitleP>0  0SaveOptions Zq1sfrm_FormHeader*Form header | sfrm_FormHeaderZ  dZ,!\> :(<Z P/tV+D PVPt(t!T: a [ a [PR0  Lotus Notes databasefld_SrcDbLabel ZUkIZkIUZ kIU ,!\> :(<"IpUZ "I BT  P0 VV :1 ( LastValues2 1 3S4S6S10S12S15Sfld_LNDbwA ,!\> :(<"IpU  P^0 . .  LastValues2  4S6Sfld_LNServerServerw A ,!\> :(<"IpU  P`0 ..  LastValues2  4S6Sfld_LNFilePath File pathw A ,!\> :(<"IpUZ "I T ^T  P0 VV :1 ( LastValues2 1 3S4S6S10S12S15Sfld_LNReplicaIDwAZ kI!T :w A '++LotusScript Development Environment:2:5:(Options):0:66 '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Sub Click(Source As Button) '++LotusScript Development Environment:2:5:(Declarations):0:2 '++LotusScript Development Environment:2:2:BindEvents:1:129 Private Sub BindEvents(Byval Objectname_ As String) Static Source As BUTTON Set Source = Bind(Objectname_) On Event Click From Source Call Click End Sub '++LotusScript Development Environment:2:2:Click:1:12 Sub Click(Source As Button) On Error Goto errh Dim rv As Variant Dim extDb As NotesDatabase rv = g.ws.Prompt(13, g.doc.GetItemValue("fld_AddDBLink")(0), "") If Not Isarray(rv) Then Exit Sub Call g.doc.ReplaceItemValue("fld_LNServer", rv(0)) Call g.doc.ReplaceItemValue("fld_LNFilePath", rv(1)) If lsf_ProcessLNDatabase(extDb) Then Call g.uidoc.refresh() End If Exit Sub errh: Msgbox Error & | in line | & Erl(), 64, |Lotus Notes (| & Lsi_info(2) & |)| Exit Sub End Sub%LSOBen$0$|$80Tlll@@@00XXXXLotus ProductV0.00W32I4*7843F14lNEWDELETE INITIALIZEL TERMINATEOBJECT(GLOBALS) FRM_EXPORTCONFIGt(Globals) frm_ExportConfigXSOURCE` BINDEVENTS OBJECTNAME_BUTTON%LSIDECLICKXERRHRVEXTDB  NOTESDATABASE%LSXBEG0WS8PROMPTDOC GETITEMVALUE fld_AddDBLinkREPLACEITEMVALUE fld_LNServerfld_LNFilePathLSF_PROCESSLNDATABASEPUIDOC REFRESH in line  Lotus Notes ()LIB_SYSTEMFUNCTIONSGLOBALNOTESUIWORKSPACE%LSXUI NOTESDOCUMENT NOTESITEMNOTESUIDOCUMENTs]l\\\\4d0P).i]dmaZ  x$$ ).i]d@, c$ 0$ 0 0  0 x\`]]$@ X&$ @l!XS!X0Sl(XS $HHHH).i]d 3pa|0  |  =| &&XS \\\).i].).i]d@, c$( $   0$ \ $  ).i].).i]d@, c$P ($    !$ @  0X`S ).i]d 3pa|  |  [\I G\l  :^K@Ll,H K@L,\}<#d}#^8K@L,}f #1K@L,}f #1)^#8K@L,# !}@}4ֿ}T"#x w APP0w  [Choose database]fld_AddDBLinkw A_: a [ a [PJ0 CouchDbfld_TargetDbLabel Z  P/tV+D PVPt(tCT  kI ,!\> :(<"IpU  P`0 ..  LastValues2  4S6Sfld_CouchDbURLUrlw A :w AB44(ag_CheckConnection  4Sw APV0w [Check connection]fld_CheckCouchDBLinkw Aw A:a [PH0   Log entriesfld_LogLabel Z P/tV+D PVPt(t!T: kIZkI)T8Ea*fld_DBFilePath   1S,!\> :(<"IpUZ "I !T:w Aq0vw_ExportLogsvw_ExportLogs>!Dd@      ZkI!T:  '++LotusScript Development Environment:2:5:(Options):0:66 '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Sub Click(Source As Button) '++LotusScript Development Environment:2:5:(Declarations):0:2 '++LotusScript Development Environment:2:2:BindEvents:1:129 Private Sub BindEvents(Byval Objectname_ As String) Static Source As BUTTON Set Source = Bind(Objectname_) On Event Click From Source Call Click End Sub '++LotusScript Development Environment:2:2:Click:1:12 Sub Click(Source As Button) On Error Goto errh Dim coll As NotesDocumentCollection Set coll = g.db.Search(|Form = "frm_ExportLog"|, Nothing, 0) If coll.Count > 0 Then If Messagebox("Are you sure you want to delete all log entries", 36, g.doc.GetItemValue("fld_CleadLogLink")(0)) = 6 Then Call coll.RemoveAll(True) Call g.uidoc.Refresh(True, True) End If Else Print "There are no log entries here" End If Exit Sub errh: Msgbox Error & | in line | & Erl(), 64, |Lotus Notes (| & Lsi_info(2) & |)| Exit Sub End SubLSOBen"8lx$80Tlllx0x  8844Lotus ProductV0.08W32I*7C2F814lNEWDELETE INITIALIZEL TERMINATEOBJECTH(GLOBALS) FRM_EXPORTCONFIGt(Globals) frm_ExportConfigSOURCE` BINDEVENTS OBJECTNAME_BUTTON%LSIDECLICKERRHXCOLLNOTESDOCUMENTCOLLECTION8%LSXBELGDBSEARCHForm = "frm_ExportLog"COUNT/Are you sure you want to delete all log entries(DOC GETITEMVALUEfld_CleadLogLink REMOVEALLUIDOC,REFRESHThere are no log entries here in line  Lotus Notes ( )LIB_SYSTEMFUNCTIONSGLOBALL NOTESDATABASEl NOTESDATETIME NOTESDOCUMENTNOTESUIDOCUMENT%LSXUI<r -hv]l\\\\4d P).i]dmaZ  x $ 8$$$ ).i]d@, c   x]hv]@ & @x\xx  (\x!S!0S((S \ 84).i]d@, c  8 8 8 8   8 400).i]d@, c8 4 4 4$L2S\ 0xxP).i].).i]d@, c4 0 0 0 80 0 <   `S, xp).i]d 3pal0 < xl x [\I G\l  :y^KL(,}#K-#8E}\$KL ,}#d+8K,$#KL\,#: }P?}@}ֿ} !x  PL0  [Clear log]fld_CleadLogLink _Z <00$ ag_ExportData  4S. Export%B_rb  [ >'w%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&iԷRl`<%xhOS# YN DI1Svyz/+]x'Q]r klGpE [8k? p$HTMLCode$Info$SubForm_RepIDs$WindowTitle$Script$$Script_O$$ScriptName$$FormScript$$$FormScript_O$Body\&өғ/ԤYIv%YIv%eD'w%\TT_aaZ  Zd,A8!\> (<&Rp/Z&RTZ&RT 8!Zmmmm =Iv%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&i" L9H\kjzEտdwRE݆ʆLT=YM/p1Win9|-raqs a_.#$HTMLCode$Info$$ScriptName$Body_*퇷}YIv%Iv%eD'w%_#_ aaZ  Zd,A8!\> (<&Rp/Z&RT 8!Zmm Zmmmm Iv%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&i@+1p8"Ә08z0|uN{l`_hV%x D3UK NqU!*_'0$HTMLCode$Info$WindowTitle$$ScriptName$Body.FYIv%ZIv%eD'w%;_OaaZmmmm (.Tv%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&iaݧF;dT^n sl1MHk+ 'jw0d R`(~n s)q| 9l W*#$HTMLCode$Info$$ScriptName$Body2c` HF\Iv%Y>Jv%eD'w%Y BE4@p p- pg_XSideBar?>4@p p, pg_XHeaderB4@p p, pg_XBorder>4@p p, pg_XBorder;@Contentp p?2frm_ExportConfig4@p p, pg_XBorder4@p p- pg_XSideBar?p>Jv%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&i5g8wc!.psXQqn$?A %BȅPS<8^r.۹>i+yTov+ptH jd1$TITLE$Comment$FrameSeti69MxߟQiIv%iIv%eD'w%iB'++LotusScript Development Environment:2:5:(Options):0:74 Option Public Option Declare %INCLUDE "lsconst.lss" '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Class JSONWriter '++LotusScript Development Environment:2:5:(Declarations):0:10 %REM Copyright 2007, 2008 SNAPPS (Strategic Net Applications, Inc.) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. %END REM '************************************************* 'Globalization constants Const ERR_MISPLACED_BEGIN_ARRAY = "Misplaced array beginning." Const ERR_MISPLACED_BEGIN_OBJECT = "Misplaced object beginning." Const ERR_MISPLACED_END_ARRAY = "Misplaced array ending." Const ERR_MISPLACED_END_OBJECT = "Misplaced object ending." Const ERR_MISPLACED_KEY = "Misplaced key." Const ERR_BLANK_KEY = "Blank key." Const ERR_MISPLACED_VALUE = "Value out of sequence." Const ERR_MISSING_END_CHAR = "Missing end character(s)." Const ERR_NESTING_ERROR = "Nesting error." Const ERR_NESTING_TOO_DEEP = "Nesting too deep." '************************************************* Const MODE_INITIAL = 1 Const MODE_ARRAY = 2 Const MODE_OBJECT = 3 Const MODE_KEY = 4 Const MODE_DONE = 5 Const MAX_DEPTH = 20 Const TYPE_UNKNOWN = "UNKNOWN" Class JSONWriter '********************************************************************************************* '* Version: 1.0.1 '* Purpose: This class provides two ways of outputing JSON text. The first is '* to pass an array, list, NotesDocument, NotesDocumentCollection, '* NotesView, NotesViewEntryCollection, or NotesViewEntry to the ToJSON method. '* This will render the object as JSON. If the object is a type of view object, '* the output will be taken from the column values. The output data is basically '* the same as the properties/values of NotesViewEntry. If the object is a '* document, its output follows the NotesDocument properties/values. '* '* Hints: Set the IncludeRichTextItems property to false to ignore rich text '* items. Set the number of characters to output from a rich text item with '* the TruncateRichText property. By default, the output for multiple documents '* is an associative array (as seen below). To output a normal array, '* set the OutputAsArray property to True. To output specific fields, pass an array '* with the field names to SetFieldsToOutput. To reset, pass an empty string. '* To output view data as documents instead of as column values, set the '* OutputViewAsDocuments property to true. '* '* NOTE: All field data is placed into the "Items" object. Field names are '* set to lowercase. The value of the field is in an array called "Values". '* The datatype is put in "Type". '* "Items":{"field1":{"Values":["my value"],"Type":"TEXT"}} '* '* Date output format: yyyy/mm/dd hh:mm:ss UTC+|-hh:mm '* '* Single document (default): '* {"UNID": '* {"Authors":["CN=Troy Reimer\/O=SNA"],...,"Items":{"field1": ...}} '* } '* Single document (OutputAsArray = true): '* [ '* {"Authors":["CN=Troy Reimer\/O=SNA"],...,"Items":{"field1": ...}} '* ] '* Mutliple documents (default): '* { '* "unid1":{"Authors":["CN=Troy Reimer\/O=SNA"],...,"Items":{"field1":...}}, '* "unid2":{"Authors":["CN=Troy Reimer\/O=SNA"],...,"Items":{"field1":...}} '* } '* Mutliple documents (OutputAsArray = true): '* [ '* {"Authors":["CN=Troy Reimer\/O=SNA"],...,"Items":{"field1": ...}}, '* {"Authors":["CN=Troy Reimer\/O=SNA"],...,"Items":{"field1": ...}} '* ] '* '* This class also provides an pseudo-object oriented way of creating JSON text. '* Each public method returns a string with the JSON text requested. '* It generates an error if arrays and objects are not begun and ended '* in the correct order. The first method called must be either BeginArray '* or BeginObject. The AppendValue method accepts only scalar values. '* Example: '* set json = New JSONWriter '* sResult = json.BeginObject '* sResult = sResult & json.Key("single value") '* sResult = sResult & json.AppendValue(1) '* sResult = sResult & json.Key("multi") '* sResult = sResult & json.BeginArray '* sResult = sResult & json.AppendValue(split("1,2", ",")) 'an array '* sResult = sResult & json.EndArray '* sResult = sResult & json.EndObject '* '*Prpperties: DoEscapeStrings (boolean, default is True) '* IncludeRichTextItems (boolean, default is True) '* OuputAsArray (boolean, default is False) '* OutputViewAsDocuments(boolean, default is False) '* TruncateRichText (long) '* '* Methods: AppendJSON(JSON String) '* AppendValue(Value(s)) '* BeginArray '* BeginCallbackFunction '* BeginObject '* EndArray '* EndCallbackFunction '* EndObject '* Key(Name) '* SetFieldsToOutput(array) '* ToJSON(Array | List | NotesDocument | NotesDocumentCollection | View | '* NotesViewEntryCollection | NotesViewEntry) '* '* Author: Troy Reimer (treimer@snapps.com) '********************************************************************************************* Private m_sEscapes List As String 'a list of escape characters Private m_iMode As Integer 'the current mode Private m_bAddComma As Boolean 'boolean to add comma before next write Private m_iStack() As Integer 'the stack of objects/arrays added to the JSON Private m_iTop As Integer 'the top of the stack Private m_bIncludeRichTextItems As Boolean 'whether to output RichText items (default true) Private m_iTruncateRichText As Long 'number of characters to extract from RichText items Private m_bOutputAsArray As Boolean 'output multiple documents as a JSON array (default false) Private m_bOutputViewAsDocuments As Boolean 'output the data from the view entry column values Private m_sFieldTypes List As String Private m_sFieldsToOutput List As String Private m_bTruncateFields As Boolean Private m_bDoEscape As Boolean 'true by default Property Get DoEscapeStrings As Boolean DoEscapeStrings = Me.m_bDoEscape End Property Property Set DoEscapeStrings As Boolean Me.m_bDoEscape = DoEscapeStrings End Property Property Get IncludeRichTextItems As Boolean IncludeRichTextItems = Me.m_bIncludeRichTextItems End Property Property Set IncludeRichTextItems As Boolean Me.m_bIncludeRichTextItems = IncludeRichTextItems End Property Property Get OutputAsArray As Boolean OutputAsArray = Me.m_bOutputAsArray End Property Property Set OutputAsArray As Boolean Me.m_bOutputAsArray = OutputAsArray End Property Property Get OutputViewAsDocuments As Boolean OutputViewAsDocuments = Me.m_bOutputViewAsDocuments End Property Property Set OutputViewAsDocuments As Boolean Me.m_bOutputViewAsDocuments = OutputViewAsDocuments End Property Property Get TrunctateRichText As Long TrunctateRichText = Me.m_iTruncateRichText End Property Property Set TruncateRichText As Long Me.m_iTruncateRichText = TruncateRichText End Property Public Sub New Me.m_sEscapes(|\|) = |\\| Me.m_sEscapes(|"|) = |\"| Me.m_sEscapes(|/|) = |\/| Me.m_sEscapes(Chr(8)) = |\b| Me.m_sEscapes(Chr(12)) = |\f| Me.m_sEscapes(Chr(10)) = |\n| Me.m_sEscapes(Chr(13)) = |\r| Me.m_sEscapes(Chr(9)) = |\t| Me.m_bIncludeRichTextItems = True Me.m_iTruncateRichText = -1 Me.m_bDoEscape = True Call Me.LoadFieldTypes Redim Me.m_iStack(MAX_DEPTH) Call Me.Reset End Sub Public Function BeginArray As String '********************************************************************************************* '* Purpose: This appends the array character, "[", to the end of the JSON string. '* '* Calls: Push '********************************************************************************************* Dim sComma As String If Me.m_iMode = MODE_INITIAL Or Me.m_iMode = MODE_OBJECT Or Me.m_iMode = MODE_ARRAY Then If Me.m_bAddComma Then sComma = "," End If BeginArray = sComma & "[" Me.Push(MODE_ARRAY) Me.m_bAddComma = False Else 'error - Misplaced array Error 1000, ERR_MISPLACED_BEGIN_ARRAY End If End Function Public Function BeginObject As String '********************************************************************************************* '* Purpose: This appends the object character, "{", to the end of the JSON string. '* '* Calls: Push '********************************************************************************************* Dim sComma As String If Me.m_iMode = MODE_INITIAL Then Me.m_iMode = MODE_OBJECT End If If Me.m_iMode = MODE_OBJECT Or Me.m_iMode = MODE_ARRAY Then If Me.m_bAddComma Then sComma = "," End If BeginObject = sComma & "{" Me.Push(MODE_OBJECT) Me.m_bAddComma = False Me.m_iMode = MODE_KEY Else 'error - misplaced object Error 1000, ERR_MISPLACED_BEGIN_OBJECT End If End Function Public Function BeginCallbackFunction(p_sFunctionName As String) As String '********************************************************************************************* '* Purpose: This returns a string with the name of the callback function and the '* open paren '********************************************************************************************* BeginCallbackFunction = p_sFunctionName & "(" End Function Public Function EndArray As String '********************************************************************************************* '* Purpose: This appends the array character, "]", to the end of the JSON string. '* '* Calls: Pop '********************************************************************************************* If Me.m_iMode = MODE_ARRAY Then Me.Pop(MODE_ARRAY) EndArray = "]" Me.m_bAddComma = True Else 'error - Misplaced end array Error 1000, ERR_MISPLACED_END_ARRAY End If End Function Public Function EndObject As String '********************************************************************************************* '* Purpose: This appends the array character, "}", to the end of the JSON string. '* '* Calls: Pop '********************************************************************************************* If Me.m_iMode = MODE_OBJECT Or Me.m_iMode = MODE_KEY Then Me.Pop(MODE_OBJECT) EndObject = "}" Me.m_bAddComma = True Else 'error - Misplaced end object Error 1000, ERR_MISPLACED_END_OBJECT End If End Function Public Function EndCallbackFunction As String '********************************************************************************************* '* Purpose: This returns a string the close paren '********************************************************************************************* EndCallbackFunction = ")" End Function Public Function Key(p_sKey As String) As String '********************************************************************************************* '* Purpose: This sub appends the key value to the end of the JSON string. '* '* Input: p_sKey: The name of the key '********************************************************************************************* Dim sComma As String If p_sKey <> "" Then If Me.m_iMode = MODE_KEY Or Me.m_iMode = MODE_OBJECT Then If Me.m_bAddComma Then sComma = "," End If Key = sComma & |"| & p_sKey & |"| & |:| Me.m_iMode = MODE_OBJECT Me.m_bAddComma = False Else 'error - misplaced key Error 1000, ERR_MISPLACED_KEY End If Else 'error - blank key Error 1000, ERR_BLANK_KEY End If End Function Public Function AppendJSON(p_sJSON As String) As String '********************************************************************************************* '* Purpose: This appends an incoming JSON string to the end of the output. '* It does not format or escape the string. It assumes that the string is '* valid JSON. '* '* Input: p_sJSON: The JSON string to add '********************************************************************************************* Dim sReturn As String If Me.m_iMode = MODE_ARRAY Or Me.m_iMode = MODE_OBJECT Then If Me.m_bAddComma And Me.m_iMode = MODE_ARRAY Then sReturn = "," End If sReturn = sReturn & p_sJSON Me.m_bAddComma = True Else 'error - value out of sequence Error 1000, ERR_MISPLACED_VALUE End If AppendJSON = sReturn End Function Public Function AppendValue(p_vValue As Variant) As String '********************************************************************************************* '* Purpose: This appends the value to the end of the JSON string. It only accepts '* scalar values and arrays of scalar values as input. If an array is passed in, '* a recursive call is made for each index of the array. For string values, '* it calls the Escape function. '* '* Input: p_vValue: The scalar value(s) to add '* '* Calls: AppendValue '* Escape '* FormatDate '********************************************************************************************* Dim sReturn As String If Isarray(p_vValue) Then If Me.m_iMode = MODE_ARRAY Then Forall v In p_vValue sReturn = sReturn & AppendValue(v) End Forall Else 'error Error 1000, ERR_MISPLACED_VALUE End If Else If Me.m_iMode = MODE_ARRAY Or Me.m_iMode = MODE_OBJECT Then If Me.m_bAddComma And Me.m_iMode = MODE_ARRAY Then sReturn = "," End If Select Case Datatype(p_vValue) Case V_STRING, v_VARIANT sReturn = sReturn & |"| & Me.Escape(Cstr(p_vValue)) & |"| Case V_INTEGER, V_LONG, V_DOUBLE, V_CURRENCY, V_BYTE sReturn = sReturn & p_vValue Case V_NULL sReturn = sReturn & "null" Case V_BOOLEAN If p_vValue Then sReturn = sReturn & "true" Else sReturn = sReturn & "false" End If Case V_DATE sReturn = sReturn & |"| & Me.FormatDate(Cstr(p_vValue)) & |"| Case Else 'if the datatype is not known then return an empty string sReturn = sReturn & |""| End Select Me.m_bAddComma = True Else 'error - value out of sequence Error 1000, ERR_MISPLACED_VALUE End If End If AppendValue = sReturn End Function Public Sub SetFieldsToOutput(p_vInput As Variant) '********************************************************************************************* '* Purpose: This sets a list of fields to output. The input can either be an array of field '* names or a string of a single field name. If the value is "", the fields to '* output is set back to output all. '********************************************************************************************* Erase Me.m_sFieldsToOutput If Isarray(p_vInput) Then Forall e In p_vInput Me.m_sFieldsToOutput(Lcase(e)) = "" End Forall Me.m_bTruncateFields = True Elseif Datatype(p_vInput) = V_STRING Then If p_vInput <> "" Then Me.m_sFieldsToOutput(Lcase(p_vInput)) = "" Me.m_bTruncateFields = True Else Me.m_bTruncateFields = False End If End If End Sub Public Function ToJSON(p_vInput As Variant) As String '********************************************************************************************* '* Purpose: This function converts the input to JSON text. The input can be a scalar '* array or list. It can also be a NotesDocument, NotesDocumentCollection, '* NotesView, NotesViewEntry, or NotesViewEntryCollection. '* Ultimately, if a Notes object is passed in, the output will be from the '* NotesDocument object(s). '* '* Input: p_vInput: The thing to convert to JSON text '* '* Output: JSON text representation of the input '* '* Calls: AppendValue '* BeginArray '* BeginObject '* DocumentToJSON '* EndArray '* EndObject '* EntryToJSON '* Key '* Reset '********************************************************************************************* Dim doc As NotesDocument Dim vec As NotesViewEntryCollection Dim entry As NotesViewEntry Dim sType As String Dim sReturn As String Dim bIsScalar As Boolean Dim bSaveOutput As Boolean Call Me.Reset If Isarray(p_vInput) Then 'process array If Isscalar(p_vInput(0)) Then sReturn = Me.BeginArray sReturn = sReturn & Me.AppendValue(p_vInput) sReturn = sReturn & Me.EndArray Else sType = Typename(p_vInput(0)) If sType = "NOTESDOCUMENT" Or sType = "NOTESVIEWENTRY" Then 'change the output style to array bSaveOutput = Me.m_bOutputAsArray Me.m_bOutputAsArray = True sReturn = Me.BeginNotesObject Forall e In p_vInput If sType = "NOTESVIEWENTRY" And Me.m_bOutputViewAsDocuments = False Then 'output the column values for this entry sReturn = sReturn & Me.EntryToJSON(e) Else 'output all document values sReturn = sReturn & Me.DocumentToJSON(e) End If End Forall sReturn = sReturn & Me.EndNotesObject 'reset the output style Me.m_bOutputAsArray = bSaveOutput End If End If Elseif Islist(p_vInput) Then 'process list 'retrieve the first element to find the type Forall e In p_vInput bIsScalar = Isscalar(e) sType = Typename(e) Exit Forall End Forall If bIsScalar Then sReturn = Me.BeginObject Forall e In p_vInput sReturn = sReturn & Me.Key(Listtag(e)) sReturn = sReturn & Me.AppendValue(e) End Forall sReturn = sReturn & Me.EndObject Else 'change the output style to array bSaveOutput = Me.m_bOutputAsArray Me.m_bOutputAsArray = True 'process Notes objects sReturn = Me.BeginObject Forall e In p_vInput sReturn = sReturn & Me.Key(Listtag(e)) sReturn = sReturn & Me.BuildNotesObjectJSON(e) End Forall sReturn = sReturn & Me.EndObject 'reset the output style Me.m_bOutputAsArray = bSaveOutput End If Else 'process Notes objects sReturn = Me.BuildNotesObjectJSON(p_vInput) End If ToJSON = sReturn Call Me.Reset End Function Private Function Escape(p_sInput As String) As String '********************************************************************************************* '* Purpose: This function escapes the characters listed in the m_sEscapes variable. '* It also converts any ISO control characters to the unicode equivalent. '* '* Inuput: p_sInput: The string to escape '********************************************************************************************* Dim sEscape As String Dim sReturn As String Dim sChar As String Dim iCode As Long Dim i As Integer Dim iLen As Integer If Me.m_bDoEscape Then sEscape = p_sInput 'first escape the appropriate characters Forall e In Me.m_sEscapes sEscape = Replace(sEscape, Listtag(e), e) End Forall 'now we need to build the return string. iLen = Len(sEscape) For i = 1 To iLen sChar = Mid(sEscape, i, 1) iCode = Uni(sChar) 'check to see if any chars are ISO control characters Select Case iCode Case &H0000 To &H001F sReturn = sReturn & "\u" & Right("00" & Cstr(Hex(iCode)), 4) Case &H007F To &H009F sReturn = sReturn & "\u" & Right("00" & Cstr(Hex(iCode)), 4) Case Else sReturn = sReturn & sChar End Select Next Else sReturn = p_sInput End If Escape = sReturn End Function Private Function FormatDate(p_sInput As String) As String '********************************************************************************************* '* Purpose: This function formats the date in the following way: '* yyyy/mm/dd hh:mm:ss UTC+|-hh:mm '* '* Inuput: p_sInput: The date string to format '* ' Output: The formatted date string '********************************************************************************************* Dim ndate As NotesDateTime Dim sUTC As String Dim sHour As String Dim sZone As String Dim sMinute As String Dim sDirection As String Set ndate = New NotesDateTime(p_sInput) sZone = Abs(ndate.TimeZone) If Len(sZone) > 2 Then sHour = Right(sZone, 2) sMinute = Left(sZone, 2) Else sHour = sZone sMinute = "00" End If If ndate.IsDST Then sHour = Abs(-(Cint(sHour)) + 1) End If If ndate.TimeZone < 0 Then sDirection = "+" Else sDirection = "-" End If FormatDate = Format(p_sInput, "yyyy/mm/dd hh:mm:ss") + " UTC" & sDirection & Format(sHour, "00") & Format(sMinute, "00") End Function Private Sub Pop(p_iMode As Integer) '********************************************************************************************* '* Purpose: This sub moves the stack pointer back one place. If it finds itself at the '* beginning, then the mode is set to MODE_DONE. '* '* Input: p_iMode: The current mode '********************************************************************************************* If Me.m_iTop > 0 Then If Me.m_iStack(Me.m_iTop - 1) = p_iMode Then Me.m_iTop = Me.m_iTop - 1 If Me.m_iTop = 0 Then Me.m_iMode = MODE_DONE Else Me.m_iMode = Me.m_iStack(Me.m_iTop - 1) End If Else 'error - nesting error Error 1000, ERR_NESTING_ERROR End If Else 'error - error nesting error Error 1000, ERR_NESTING_ERROR End If End Sub Private Sub Push(p_iMode As Integer) '********************************************************************************************* '* Purpose: This sub moves the stack pointer forward one place. It checks to make '* sure we are not attempting to go past the MAX_DEPTH. '* '* Input: p_iMode: The current mode '********************************************************************************************* If Me.m_iTop < MAX_DEPTH Then Me.m_iStack(Me.m_iTop) = p_iMode Me.m_iMode = p_iMode Me.m_iTop = Me.m_iTop + 1 Else 'error - nesting too deep Error 1000, ERR_NESTING_TOO_DEEP End If End Sub Private Sub Reset '********************************************************************************************* '* Purpose: This sub resets the writer to its original state '********************************************************************************************* Me.m_bAddComma = False Me.m_iMode = MODE_INITIAL Me.m_iTop = 0 End Sub Private Function BuildNotesObjectJSON(p_vInput As Variant) As String '********************************************************************************************* '* Purpose: This function outputs JSON text for the input Notes object '* '* Input: p_entry: The Notes object to convert to JSON text '* '* Output: The JSON text for the NotesDocument '* '* Calls: AppendValue '* BeginArray '* BeginObject '* DocumentToJSON '* EndArray '* EndObject '* EntryToJSON '* Key '********************************************************************************************* Dim vec As NotesViewEntryCollection Dim entry As NotesViewEntry Dim doc As NotesDocument Dim sType As String Dim sReturn As String sType = Typename(p_vInput) Select Case sType Case "NOTESDOCUMENT", "NOTESVIEWENTRY" sReturn = sReturn & Me.BeginNotesObject If sType = "NOTESVIEWENTRY" And Me.m_bOutputViewAsDocuments = False Then 'output the column values for this entry sReturn = sReturn & Me.EntryToJSON(p_vInput) Else 'output the document values sReturn = sReturn & Me.DocumentToJSON(p_vInput) End If sReturn = sReturn & Me.EndNotesObject Case "NOTESDOCUMENTCOLLECTION" Set doc = p_vInput.GetFirstDocument If Not (doc Is Nothing) Then sReturn = sReturn & Me.BeginNotesObject Do Until doc Is Nothing sReturn = sReturn & Me.DocumentToJSON(doc) Set doc = p_vInput.GetNextDocument(doc) Loop sReturn = sReturn & Me.EndNotesObject End If Case "NOTESVIEW", "NOTESVIEWENTRYCOLLECTION" If sType = "NOTESVIEW" Then Set vec = p_vInput.AllEntries Elseif sType = "NOTESVIEWENTRYCOLLECTION" Then Set vec = p_vInput End If Set entry = vec.GetFirstEntry If Not (entry Is Nothing) Then sReturn = sReturn & Me.BeginNotesObject Do Until entry Is Nothing If Me.m_bOutputViewAsDocuments Then 'output the data as documents sReturn = sReturn & Me.DocumentToJSON(entry.Document) Else 'output the data as defined in the view columns sReturn = sReturn & Me.EntryToJSON(entry) End If Set entry = vec.GetNextEntry(entry) Loop sReturn = sReturn & Me.EndNotesObject End If End Select BuildNotesObjectJSON = sReturn End Function Private Function DocumentToJSON(p_doc As Variant) As String '********************************************************************************************* '* Purpose: This function outputs the NotesDocument as JSON text. '* Most NotesDocument properties are output as are all data items. '* However, the RichText items can be excluded by setting IncludeRichText '* to false. RichText items can also be truncated by setting the '* number of characters with the TruncateRichText property '* NOTE: All item key values are set to lowercase. '* '* Input: p_doc: The NotesDocument or NotesViewEntry to convert to JSON text '* '* Output: The JSON text for the NotesDocument '* '* Calls: AppendValue '* BeginArray '* BeginObject '* BuildFieldJSON '* EndArray '* EndObject '* Key '********************************************************************************************* Dim doc As NotesDocument Dim sType As String Dim sReturn As String Dim vEval As Variant sType = Typename(p_doc) If sType = "NOTESVIEWENTRY" Then Set doc = p_doc.Document Elseif sType = "NOTESDOCUMENT" Then Set doc = p_doc End If If Not (doc Is Nothing) Then 'if this is output as an object, add the UNID as a key If Me.m_bOutputAsArray = False Then sReturn = sReturn & Me.Key(doc.UniversalID) End If sReturn = sReturn & Me.BeginObject sReturn = sReturn & Me.Key("Authors") sReturn = sReturn & Me.BeginArray sReturn = sReturn & Me.AppendValue(p_doc.Authors) sReturn = sReturn & Me.EndArray 'output info about the attachments vEval = Evaluate(|@Attachments|, p_doc) sReturn = sReturn & Me.Key("Attachments") sReturn = sReturn & Me.AppendValue(Cint(vEval(0))) vEval = Evaluate(|@AttachmentNames|, p_doc) sReturn = sReturn & Me.Key("AttachmentNames") sReturn = sReturn & Me.BeginArray sReturn = sReturn & Me.AppendValue(vEval) sReturn = sReturn & Me.EndArray vEval = Evaluate(|@AttachmentLengths|, p_doc) sReturn = sReturn & Me.Key("AttachmentLengths") sReturn = sReturn & Me.BeginArray sReturn = sReturn & Me.AppendValue(vEval) sReturn = sReturn & Me.EndArray vEval = Evaluate(|@AttachmentModifiedTimes|, p_doc) sReturn = sReturn & Me.Key("AttachmentModifiedTimes") sReturn = sReturn & Me.BeginArray sReturn = sReturn & Me.AppendValue(vEval) sReturn = sReturn & Me.EndArray 'output additional NotesDocument properties sReturn = sReturn & Me.Key("Created") sReturn = sReturn & Me.AppendValue(p_doc.Created) sReturn = sReturn & Me.Key("HttpURL") sReturn = sReturn & Me.AppendValue(p_doc.HttpURL) sReturn = sReturn & Me.Key("IsResponse") sReturn = sReturn & Me.AppendValue(p_doc.IsResponse) sReturn = sReturn & Me.Key("LastAccessed") sReturn = sReturn & Me.AppendValue(p_doc.LastAccessed) sReturn = sReturn & Me.Key("LastModified") sReturn = sReturn & Me.AppendValue(p_doc.LastModified) sReturn = sReturn & Me.Key("NoteID") sReturn = sReturn & Me.AppendValue(p_doc.NoteID) sReturn = sReturn & Me.Key("NotesURL") sReturn = sReturn & Me.AppendValue(p_doc.NotesURL) sReturn = sReturn & Me.Key("ParentDocumentUNID") sReturn = sReturn & Me.AppendValue(p_doc.ParentDocumentUNID) sReturn = sReturn & Me.Key("UniversalID") sReturn = sReturn & Me.AppendValue(p_doc.UniversalID) 'output the data items sReturn = sReturn & Me.Key("Items") sReturn = sReturn & Me.BeginObject Forall i In p_doc.Items If Me.m_bTruncateFields = False Or (Me.m_bTruncateFields And Iselement(Me.m_sFieldsToOutput(Lcase(i.Name)))) Then If i.Type <> RICHTEXT Then 'if the item is not rich text, simply output the value(s) sReturn = sReturn & Me.BuildFieldJSON(i, p_doc.GetItemValue(i.Name)) Elseif i.Type = RICHTEXT And Me.m_bIncludeRichTextItems Then 'check to see if we are outputting rich text If Me.m_iTruncateRichText > -1 Then 'we are truncating the rich text that is output sReturn = sReturn & Me.BuildFieldJSON(i, Left(p_doc.GetItemValue(i.Name)(0), Me.m_iTruncateRichText)) Else 'output the rich text item sReturn = sReturn & Me.BuildFieldJSON(i, p_doc.GetItemValue(i.Name)) End If End If End If End Forall sReturn = sReturn & Me.EndObject sReturn = sReturn & Me.EndObject End If DocumentToJSON = sReturn End Function Private Function EntryToJSON(p_entry As Variant) As String '********************************************************************************************* '* Purpose: This function outputs the NotesEntry as JSON text. '* Most NotesEntry properties are output as are all column values. '* '* Input: p_entry: The NotesViewEntry to convert to JSON text '* '* Output: The JSON text for the NotesDocument '* '* Calls: AppendValue '* BeginArray '* BeginObject '* EndArray '* EndObject '* Key '********************************************************************************************* Dim sReturn As String Dim vColumnValues As Variant Dim iCount As Long Dim x As Long If Not(p_entry Is Nothing) Then If Typename(p_entry) = "NOTESVIEWENTRY" Then 'if this is output as an object, add the UNID as a key If Me.m_bOutputAsArray = False Then sReturn = sReturn & Me.Key(p_entry.UniversalID) End If sReturn = sReturn & Me.BeginObject 'output values about the entry sReturn = sReturn & Me.Key("ChildCount") sReturn = sReturn & Me.AppendValue(p_entry.ChildCount) sReturn = sReturn & Me.Key("ColumnIndentLevel") sReturn = sReturn & Me.AppendValue(p_entry.ColumnIndentLevel) sReturn = sReturn & Me.Key("DescendantCount") sReturn = sReturn & Me.AppendValue(p_entry.DescendantCount) sReturn = sReturn & Me.Key("IndentLevel") sReturn = sReturn & Me.AppendValue(p_entry.IndentLevel) sReturn = sReturn & Me.Key("IsCategory") sReturn = sReturn & Me.AppendValue(p_entry.IsCategory) sReturn = sReturn & Me.Key("IsConflict") sReturn = sReturn & Me.AppendValue(p_entry.IsConflict) sReturn = sReturn & Me.Key("IsDocument") sReturn = sReturn & Me.AppendValue(p_entry.IsDocument) sReturn = sReturn & Me.Key("IsTotal") sReturn = sReturn & Me.AppendValue(p_entry.IsTotal) sReturn = sReturn & Me.Key("IsValid") sReturn = sReturn & Me.AppendValue(p_entry.IsValid) sReturn = sReturn & Me.Key("NoteID") sReturn = sReturn & Me.AppendValue(p_entry.NoteID) sReturn = sReturn & Me.Key("SiblingCount") sReturn = sReturn & Me.AppendValue(p_entry.SiblingCount) sReturn = sReturn & Me.Key("UniversalID") sReturn = sReturn & Me.AppendValue(p_entry.UniversalID) 'output the data items sReturn = sReturn & Me.Key("ColumnValues") sReturn = sReturn & Me.BeginObject vColumnValues = p_entry.ColumnValues iCount = Ubound(vColumnValues) For x = 0 To iCount sReturn = sReturn & Me.Key(Cstr(x)) sReturn = sReturn & Me.AppendValue(vColumnValues(x)) Next sReturn = sReturn & Me.EndObject sReturn = sReturn & Me.EndObject End If End If EntryToJSON = sReturn End Function Private Function BeginNotesObject As String '********************************************************************************************* '* Purpose: This function outputs a "{" or "[" based on the OutputAsArray property '********************************************************************************************* 'start the object/array If Me.m_bOutputAsArray Then BeginNotesObject = Me.BeginArray Else BeginNotesObject = Me.BeginObject End If End Function Private Function EndNotesObject As String '********************************************************************************************* '* Purpose: This function outputs a "}" or "]" based on the OutputAsArray property '********************************************************************************************* 'end the object/array If Me.m_bOutputAsArray Then EndNotesObject = Me.EndArray Else EndNotesObject = Me.EndObject End If End Function Private Function BuildFieldJSON(p_item As NotesItem, p_vValue As Variant) As String '********************************************************************************************* '* Purpose: This function formats the field output '********************************************************************************************* Dim sReturn As String sReturn = sReturn & Me.Key(Lcase(p_item.Name)) sReturn = sReturn & Me.BeginObject sReturn = sReturn & Me.Key("Values") sReturn = sReturn & Me.BeginArray sReturn = sReturn & Me.AppendValue(p_vValue) sReturn = sReturn & Me.EndArray sReturn = sReturn & Me.Key("Type") If Iselement(Me.m_sFieldTypes(p_item.Type)) Then sReturn = sReturn & Me.AppendValue(Me.m_sFieldTypes(p_item.Type)) Else sReturn = sReturn & Me.AppendValue(TYPE_UNKNOWN) End If sReturn = sReturn & Me.EndObject BuildFieldJSON = sReturn End Function Private Sub LoadFieldTypes '********************************************************************************************* '* Purpose: This sub loads the names for the datatype constants '********************************************************************************************* Me.m_sFieldTypes(16) = "ACTIONCD" Me.m_sFieldTypes(17) = "ASSISTANTINFO" Me.m_sFieldTypes(1084) = "ATTACHMENT" Me.m_sFieldTypes(1076) = "AUTHORS" Me.m_sFieldTypes(2) = "COLLATION" Me.m_sFieldTypes(1024) = "DATETIMES" Me.m_sFieldTypes(1090) = "EMBEDDEDOBJECT" Me.m_sFieldTypes(256) = "ERRORITEM" Me.m_sFieldTypes(1536) = "FORMULA" Me.m_sFieldTypes(21) = "HTML" Me.m_sFieldTypes(6) = "ICON" Me.m_sFieldTypes(20) = "LSOBJECT" Me.m_sFieldTypes(25) = "MIME_PART" Me.m_sFieldTypes(1074) = "NAMES" Me.m_sFieldTypes(7) = "NOTELINKS" Me.m_sFieldTypes(4) = "NOTEREFS" Me.m_sFieldTypes(768) = "NUMBERS" Me.m_sFieldTypes(1085) = "OTHEROBJECT" Me.m_sFieldTypes(15) = "QUERYCD" Me.m_sFieldTypes(1075) = "READERS" Me.m_sFieldTypes(1282) = "RFC822TEXT" Me.m_sFieldTypes(1) = "RICHTEXT" Me.m_sFieldTypes(8) = "SIGNATURE" Me.m_sFieldTypes(1280) = "TEXT" Me.m_sFieldTypes(512) = "UNAVAILABLE" Me.m_sFieldTypes(0) = "UNKNOWN" Me.m_sFieldTypes(14) = "USERDATA" Me.m_sFieldTypes(1792) = "USERID" Me.m_sFieldTypes(18) = "VIEWMAPDATA" Me.m_sFieldTypes(19) = "VIEWMAPLAYOUT" End Sub End ClassLSOBen,418%+$8Tr0h (( (  ( hH H0(     (+,!!X X (|$++Lotus ProductV0.018%W32I8%*7C41414lNEWDELETE INITIALIZE( TERMINATEOBJECT lsconst.lssV_EMPTYpV_NULL4 V_INTEGERV_LONGV_SINGLEDV_DOUBLEX V_CURRENCYV_DATEV_STRING V_DISPATCHV_ERROR V_BOOLEAN V_VARIANT V_IUNKNOWN V_DECIMAL|V_BYTEP V_CLIENTHDL V_TYPEINSTdV_LSOBJL V_PRODOBJV_BYREFV_ARRAYV_LIST V_DYNAMIC MB_OK MB_OKCANCEL(MB_ABORTRETRYIGNOREdMB_YESNOCANCELMB_YESNOMB_RETRYCANCEL MB_ICONSTOPMB_ICONQUESTION MB_ICONEXCLAMATION`MB_ICONINFORMATION@ MB_APPLMODAL MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3MB_SYSTEMMODAL,IDOKIDCANCELIDABORTLIDRETRY<IDIGNOREhIDYESIDNO ATTR_NORMAL ATTR_READONLY ATTR_HIDDENH ATTR_SYSTEM8 ATTR_VOLUMEp ATTR_DIRECTORYT ATTR_ARCHIVE ATTR_MODEp ATTR_HANDLE ATTR_INPUT0 ATTR_OUTPUT ATTR_RANDOM ATTR_APPEND ATTR_BINARY SHELL_NORMAL_FOCUS SHELL_MIN_FOCUSTSHELL_MAX_FOCUSSHELL_NORMAL_NO_FOCUSSHELL_MIN_NO_FOCUSpIME_NOT_INSTALLEDp IME_ON< IME_OFF IME_HIRAGANAIME_KATAKANA_DBCS IME_KATAKANA_SBCS IME_HANGEULIME_HANJACONVERTIME_ALPHA_DBCS IME_ALPHA_SBCS SC_UPPERCASE\ SC_LOWERCASE( SC_PROPERCASE SC_WIDE SC_NARROWL SC_KATAKANA SC_HIRAGANA SC_NATIVEDIGIT SC_ARABICDIGIT lsprcval.lss| LSI_THREAD_LINE LSI_THREAD_PROC LSI_THREAD_MODULE LSI_THREAD_VERSION LSI_THREAD_LANGUAGED LSI_THREAD_COUNTRYl LSI_THREAD_TICKS LSI_THREAD_TICKS_PER_SEC4 LSI_THREAD_PROCESS_IDLSI_THREAD_TASK_ID LSI_THREAD_CALLPROCT LSI_THREAD_CALLMODULEERR_MISPLACED_BEGIN_ARRAY Misplaced array beginning. ERR_MISPLACED_BEGIN_OBJECT(Misplaced object beginning.ERR_MISPLACED_END_ARRAY Misplaced array ending.dERR_MISPLACED_END_OBJECT Misplaced object ending.(ERR_MISPLACED_KEYDMisplaced key. ERR_BLANK_KEYp Blank key.ERR_MISPLACED_VALUEHValue out of sequence.\ERR_MISSING_END_CHARMissing end character(s). ERR_NESTING_ERRORDNesting error.ERR_NESTING_TOO_DEEPNesting too deep.T MODE_INITIAL MODE_ARRAYt MODE_OBJECTMODE_KEY MODE_DONE MAX_DEPTH TYPE_UNKNOWNUNKNOWN@ JSONWRITER  M_SESCAPESM_IMODE M_BADDCOMMADM_ISTACKlM_ITOP4M_BINCLUDERICHTEXTITEMSM_ITRUNCATERICHTEXTM_BOUTPUTASARRAYM_BOUTPUTVIEWASDOCUMENTS0 M_SFIELDTYPES\M_SFIELDSTOOUTPUTM_BTRUNCATEFIELDS M_BDOESCAPEDOESCAPESTRINGSINCLUDERICHTEXTITEMS OUTPUTASARRAYpOUTPUTVIEWASDOCUMENTSTRUNCTATERICHTEXTTRUNCATERICHTEXT\\\"x\"/\/\b\f\n \r\\t@LOADFIELDTYPESRESET\ BEGINARRAY(SCOMMA4,[PUSH BEGINOBJECT{BEGINCALLBACKFUNCTIONP_SFUNCTIONNAME<(ENDARRAYTPOP] ENDOBJECT}\ENDCALLBACKFUNCTION)8KEYLP_SKEY: APPENDJSONP_SJSONSRETURN APPENDVALUE0P_VVALUElVESCAPE|nullltruefalse, FORMATDATE,""SETFIELDSTOOUTPUTP_VINPUTE`TOJSON DOC@ NOTESDOCUMENT$%LSXBE NOTESDATABASE`VECNOTESVIEWENTRYCOLLECTIONDENTRYNOTESVIEWENTRYSTYPE BISSCALAR BSAVEOUTPUTBEGINNOTESOBJECT ENTRYTOJSONDOCUMENTTOJSON@ENDNOTESOBJECTBUILDNOTESOBJECTJSONTP_SINPUTSESCAPESCHAR<ICODEHIlILEN\ud00NDATE NOTESDATETIMESUTCSHOUR SZONEXSMINUTEH SDIRECTIONTIMEZONEISDST+ -Xyyyy/mm/dd hh:mm:ss UTCP_IMODENOTESDOCUMENTCOLLECTIONxGETFIRSTDOCUMENTGETNEXTDOCUMENT@ NOTESVIEW ALLENTRIES GETFIRSTENTRYDOCUMENT GETNEXTENTRYlP_DOCVEVAL UNIVERSALIDAuthorsdAUTHORS, @Attachmentst Attachments@AttachmentNamesAttachmentNames`@AttachmentLengths AttachmentLengthsL@AttachmentModifiedTimes$AttachmentModifiedTimes8CreatedCREATEDHttpURLHTTPURL IsResponse@ ISRESPONSE LastAccessed LASTACCESSEDT LastModified LASTMODIFIED(NoteIDl NOTEIDNotesURL8NOTESURLParentDocumentUNIDPARENTDOCUMENTUNID UniversalIDtItemsITEMS\$NAMEPTYPE RICHTEXTBUILDFIELDJSON GETITEMVALUE P_ENTRY VCOLUMNVALUES ICOUNTD X ChilLdCount! CHILDCOUNT ColumnIndentLevel!COLUMNINDENTLEVEL$"DescendantCount$!DESCENDANTCOUNT IndentLevel! INDENTLEVEL! IsCategory\! ISCATEGORY@! IsConflictH$ ISCONFLICTx! IsDocument! ISDOCUMENT!IsTotal"ISTOTALd"IsValid"ISVALID" SiblingCountD" SIBLINGCOUNTx" ColumnValues" COLUMNVALUES"P_ITEM # NOTESITEM"Values$Type#ACTIONCD8# ASSISTANTINFO$ ATTACHMENT# COLLATION\# DATETIMES#EMBEDDEDOBJECTt# ERRORITEM#FORMULA$HTML#ICON#LSOBJECT# MIME_PART,$NAMES% NOTELINKS$NOTEREFSNUMBERS OTHEROBJECT$QUERYCDp$READERS$ RFC822TEXT SIGNATURE$TEXT UNAVAILABLE$USERDATAUSERID VIEWMAPDATA VIEWMAPLAYOUT 1* (HhHH,HH(h\Ht h  (  ( H8!hhT"h#(@( H(Hhh,PhH (0H@hh$(DHdhh(Hhhh0@P( l((Hh    $H<HX(tH( h(   (4X( Hhh  h $ L h t( H H  h  H  (   @  ( `  t (  H H  h   ,  P  H t  H ( 0 H h  H   h       ( h 8 p H  h $ X    $ Hh   ( LtH h   , H `x0 |$,.(.(h)l-XD&%,|*"H#$.@  , .`D (X "  ( @888@H` X# " H ( (    ( (.   H (((((= (8888K   D& (xxxxZ (h   H(w H(H p( p(p(hD(HXHXMXXD` (`'(I((pppp[(@(@)`(`(hhxxx``(0PPP0@@@P(|*(... 8.&(...0."l-( h.""|"|"".hl"\"\"x! dHx!!!0X 0000).i].).i]d@, c$ X     X ,!D).i]d@, c  X  X X !l" !!pl////l/l/).i]d\"d ,!|$////).i]d,!l" !|" "" .. #<( D#.d#d#T##..####D##xT##<d#t#t##### #(.0%(\$%<%\%L%%l$l$|%|%l%l%\$\$ l$<%+h/$///$/$/).i]d %! |$ |$ |$L%\%X |$\%%l%|% %D&$+,(4&4&4&4& \&(&&&& \'.4( ((((|(((|(|(\(l(L(L(,(<( ,(<(<(L(d ,!\( !l(l( |( )d($)0$)$)d)d)4)t)D)T)00 P4)dD)t)|T)T) d)t)0|*H(*l*,*,*L*L*<*<***\*\*l*l*P,*H<*L*\*l*$+ (++++  ,,(++++ |"111111).i].).i]d\,|$ (+  + + l-T(,-\-\-\-L-L-,-,-<-<--<-TL-h" +\-.((( 4H$/{T0[`0/$ ,! ! ,!D \ ,! /! ,! !0DD?}H0+x0<F\1d0i0DRt1p49070߷( 1 10,!<h1xT ,1H @81 Kz D1 !D!vP1|!D!!"7LH"> 1,   $ ]HH\HI ]H\I ](H\I8 ]xH\I ]YcI}m}}m}}m}Bm} Bm} Bm} Bm} Bm}\ c\H /l-#~ \q/&#Y~X Y~ Y~x 8=H8 ^X}t]HJX}|/D&~x #\ : }p Y~X 8 c~ Y~ Y~x 8IH8 ^}t]J}/D&~ #\ c~ : } ]I} Y~x 8#/%~x #]p}8\ :  }X   Y~ Y~ 8#/%~ #]}X\ : } !]}"+Ix}8u,Y~ Y~ 8K-H8 .^}t/0]hJ}Ix}}1c~ 2\ 3: 5}$67: 9}h:;FY~x Y~ 8<GHY~x 8 H^P}tIJ^PJPI@K\ L: N}OP]0JPQa]8ObY~x 8.cI5.d^J/`Z. #e7.f: h}ij:qkY~x Y~ 8JlHY~x 8 m^}tno: p2~92~8 1q^J}/"I#}:r2~X9 2~x92~92~92~81s^JI:t2~881u^J}P:v2~x831wI8x^J}`y:z^J}p{:G|2~8 1}^J}/#I#}:1^J}: ]>:\ : }]J\(w]82I5.F.Im(}7.\8 :L]>~8:I}8!IIm(}\8 : \8 /&#]x8fx "82^|"/#^|"J|"/`]x#^|"J|"/#:^l"fx :Jl"}Jl"}8^"H \ ^|"/|*#Ix5.NJl"}H8^|"J|"/)Z. #:^|"J|"/(Z. #7.^|"J|"/$+#\J" :4]x8Ix5..^"Z. "ۧ ^l"Z. ::7.J"8Z^|"/h#Ix5./^|"J|"/y.#^|"J|"/`Z. #7.^|"J|"/#:v^"H \ ^|"/h#Ix5./^|"J|"/y.#^|"J|"/'Z. #7.^|"J|"/#\J" :^|"/']x#]hJ|"/&#HH8 ^d#IT#H5.#^d#^d#y.Z. t7.b^d#%bX^.4 ^#Jd#XM!b J#<#:$238(1%^t#Jt#}@}LX GP:U&238(1'^t#Jt#}@}LX GP:1)^t#Jt#J#:X :t+^.6A,: -^t#IT#.0]D#Jt#1C^<%+|$Il$$D^l%K<%-/#E^l%%8*F^\%Jl%PG^|%Jl%JH:I^\%Jl%J^|%}LKMK<%-$/#8N^\%J\%OPK<%-/#8Q^%}R: S^%}TU]\$Il$} F}LJ%J\%}LFJ|%}LFV_Y 8o`Y hW8Hac Y bY 8cc~ d:ecY hfg: i}tjk: m}tnoxY ~ 82yY mWzcW{c Y |: ~}\ c~X c ^l(],(::2}92}8c1^|(J|(/|*#Jl(}H8^|(J|(/)],(#:^|(J|(/(],(#^|(J|(/$+#:s2}p8t1^\(N,(PH/J\(Š8S^|(J|(/|*#J\(9)^|(J|(/(^\(#^\(N,(ST/^\(%:^|(J|(/$+#:2}92}p81Jl(}8^<(N,(P`/:Jl(}p8 ^<(I,(^L(K<(,l/#JL(Š8{^|(J|(/|*#JL(9QH8^|(J|(/(KL(-/##:^|(J|(/)^L(#^L(K<(,/JL(#:^|(J|(/$+#: 1:Jl(:](J|(^T)]4):JT)}8^D)N4)P/:JT)}8 ^D)I4)JD)Š8fH8^d)Jd)/KD)-0##^d)Jd)/h#^d)Jd)/}#^d)Jd)/#^d)Jd)/`N4)U$0#^d)Jd)/#^t)I4)1^d)Jd)/}#^d)Jd)/`et)# ^t)I4)1 ^d)Jd)/}D# ^d)Jd)/# ^d)Jd)/`^t)#^d)Jd)/#^t)I4)1^d)Jd)/}#^d)Jd)/#^d)Jd)/`^t)#^d)Jd)/#^t)I4)1^d)Jd)/}#^d)Jd)/#^d)Jd)/`^t)#^d)Jd)/#^d)Jd)/}(#^d)Jd)/`N4)U00#^d)Jd)/}P# ^d)Jd)/`N4)U<0#!^d)Jd)/}x#"^d)Jd)/`N4)UH0##^d)Jd)/}#$^d)Jd)/`N4)UT0#%^d)Jd)/}#&^d)Jd)/`N4)U`0#'^d)Jd)/}0#(^d)Jd)/`N4)Ul0#)^d)Jd)/}X#*^d)Jd)/`N4)Ux0#+^d)Jd)/}#,^d)Jd)/`N4)U0#-^d)Jd)/}#.^d)Jd)/`N4)U0#1^d)Jd)/}#2^d)Jd)/h#3N4)P0504H8H8F0U0 Ih(x85F0P0~0807^d)Jd)/,Z0#+N4)S0F0U0&+#:9F0P0~0H8t:Y89<^d)Jd)/,Z0#+N4)S0F0U0%dYJ#>:/@^d)Jd)/,Z0#+N4)S0F0U0&+#BCDE70F^d)Jd)/#H^d)Jd)/#IK]$)Jd)LcI,*Š8d],*:}8fH8g^<*J<*/N,*U0#hi^<*J<*/h#l^<*J<*/}#m^<*J<*/`N,*U0#n^<*J<*/} #o^<*J<*/`N,*U1#p^<*J<*/}p #q^<*J<*/`N,*U1#r^<*J<*/} #s^<*J<*/`N,*U 1#t^<*J<*/} #u^<*J<*/`N,*U,1#v^<*J<*/}(!#w^<*J<*/`N,*U81#x^<*J<*/}`!#y^<*J<*/`N,*UD1#z^<*J<*/}!#{^<*J<*/`N,*UP1#|^<*J<*/}!#}^<*J<*/`N,*U\1#~^<*J<*/}0#^<*J<*/`N,*Ul0#^<*J<*/}!#^<*J<*/`N,*Uh1#^<*J<*/}#^<*J<*/`N,*U0#^<*J<*/}("#^<*J<*/h#^L*N,*Pt1bJL*;bX^148^<*J<*/X#^<*J<*/`XfL* #^16^<*J<*/#^<*J<*/#]*J<*H8]+/#:]+/h#H8]+/#:]+/#^\-J\-/K<--1#I#^\-J\-/h#^\-J\-/}"#^\-J\-/#^\-J\-/`]L-#^\-J\-/#^\-J\-/}"#K<--1#hx8 ^\-J\-/`K<--1#m#:^\-J\-/`}#^\-J\-/#],-J\-m}"m}"<m}"4m}m} #m}$#Bm}<#m}`#m}x#m}#m}#m}#m}#2m}#m}#m}$m}$=m}0$m}L$3m}`$m}t$m}<m}$m}$m}$m}m}$m}$m}%m}%8 rW sW W  _  jIv%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&i$MW,-\ctP6zȕ& SvjTP s `EaI>>}H5EcՖy(u1Rު7>$DesignerVersion$TITLE$PublicAccess$ScriptLib$ScriptLib_OPKq<HttpConnection.javaVMo8=0 WJ{\nMN #lndRKRV}";n19_o3Y_o |:xHӜk00UT֣ MRlK蟷*ͥOaM,a א, p9g"AU|>|0ʺn `cL[WUe$:Ν! ;֠+;+F\* Z!ٌ0+ 1h) (PCPiׁ8bWC81۫[.r7K,.~;9_\O "aJD{3뒭rJP/PrmOr写z}P'َE\F+jOTcyeH.Ϙ( %@}vSƭ DWtwԅ̓ (:\HrF٨6~B3 32'yhqt!4n I#hb)Ρ;2G ז}8"dAحԦBV0cQ _ vՠIN%cڲ LܩYJ>6t.#RSCao|-Mh=r=6h*>5qclC}g%ABmm <Ȋ)ܵ{Qs!Оɱ݂wgvep\@DmI[Z$&i("x}#˩ޟڔ]]kɦoeBg \_.WR4n%=Dϟ .xѫwl須hzh2U* okr0ey7aNr]]D;!*x:G=tԂ;X=Rf9E\m+# J#J^ӊRƱ~(B tU:plzz7j(P.k{:d1 !xfra`mUbg22դ'3Ň[TIx=㧱wɯ<Ͻ PK 3 PKq< 3 HttpConnection.javaPKAtPKq<HttpConnection.classVYSWvas܂˰%FeH\\`8=vd_s*/>Īd&Ryª/w$NIY)j{sn_ P:0,0"pIǨⲁ+ńI LxNL \.0Wue:o 7n q[;" âHHhǐ,̖eyKf+r>%pGǻ:s1<~Ǻoe7;=ޯHؙJx);a_I:yYܔlܬqɴYTfy q.Iyi1q]ChN®TFM.*皵掞r\(S7`ieUJl#*+:jʛVrtg&>_Jo₉tr %=Wpi)mm66/Qv~fV/VeOvU&(-S* 3d  A^X\Ͳ0ĊrՒK6zgBy+v220Yڏƶ}Iyj`C5K霻,ʔ QT%uJihmK+Kvd 拸76Zvs2cǥjTIsV%]lt:{/W6CsgZBO!wAJlCv#(%TQ-Q jA&!l (n@9^5@ DžuECDhgEzd\.^<߰SPK<c]yDJ1xA#2"wY27@.4y'sgx:ĻgTtÑ|0};y4=}.$#>U /* ɏEn3uE5e3&nZGXO/@/MxEm_O ʜLvqh6![y)%jJfuFxaǮ7rt Ecgrs>Y*M4Z}R9Φi|0[/|QbFE~b~<. 4&3~B%PK1 PKq<1 HttpConnection.classPKB$B6CStIv%='w%eD'w%.aYHttpConnection.classC:\prog\notes7_\data%%source%%.jar%%object%%.jar='w%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&iݛ>u s,`DX;I?27$YPs+fLW&%GIȝ\(5Q :!cxVbbH ^$DesignerVersion$TITLE$PublicAccess$AssistAction$FILE%%source%%.jar$FILE%%object%%.jarF'ӁTtIv%='w%eD'w%T'++LotusScript Development Environment:2:5:(Options):0:74 Option Public Option Declare Uselsx "*javacon" Use "HttpConnection" '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Class HttpConnection '++LotusScript Development Environment:2:5:(Declarations):0:10 %REM Copyright 2010 TietoEnator Alise (developed by Arturs Mekss) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. %END REM Class HttpConnection Private js As JAVASESSION Private jHttpClass As JAVACLASS Private jHttpObj As JavaObject Private url As String Private method As String Private proxyHost As String Private proxyPort As String Public Sub new(reqMethod As String, reqUrl As String) On Error Goto errhandle Set js = New JAVASESSION Set jHttpClass = js.GetClass("HttpConnection") Set jHttpObj = jHttpClass.CreateObject method = reqMethod url = reqUrl Exit Sub errhandle: Call onError() Exit Sub End Sub Public Sub Delete Call jHttpObj.close() End Sub Private Sub Open() Call jHttpObj.Open(method, url, proxyHost, proxyPort) End Sub Public Function send(reqMessage) As Variant On Error Goto errhandle Call Me.Open() send = jHttpObj.processRequest(reqMessage) Exit Function errhandle: Call onError() Exit Function End Function Public Sub setProxy(pHost As String, pPort As String) proxyHost = pHost proxyPort = pPort End Sub Public Sub setRequestProperty(key As String, value As String) Call jHttpObj.setRequestProperty(key, value) End Sub Public Function getResponseCode() As Variant On Error Goto errhandle Call Me.Open() getResponseCode = jHttpObj.getResponseCode() Exit Function errhandle: Call onError() Exit Function End Function Private Sub onError() Error 3000, " [" & Getthreadinfo( 10 ) & ": " & Cstr( Erl ) & "] " & Error End Sub End ClassLSOBen) xt $ T ll  Lotus ProductV0.0 xW32Ix|8*786FF14lNEWDELETE INITIALIZE$ TERMINATEOBJECT(*javacon*JAVACONHttpConnectionHTTPCONNECTIONJS JAVASESSIONH njavacon.dlllJavaSessionADT_ClassControl JHTTPCLASS` JAVACLASSJavaClassADT_ClassControlJHTTPOBJ JAVAOBJECTJavaObjectADT_ClassControl URL,METHOD PROXYHOST PROXYPORTP REQMETHOD REQURL ERRHANDLEpGETCLASS@ CREATEOBJECTONERRORCLOSE`OPENSEND REQMESSAGEPROCESSREQUEST0SETPROXYPHOSTPPORTTSETREQUESTPROPERTY`KEYVALUEGETRESPONSECODE [l: ]  $ |,Zv] \\Ldd,llllljtL t    jt l jtl(  d pL L( T d||| dt dDTTTDD T    # $4 74 \0l t l  lt   lDT"M4k:ӌ:Ҽ" :z$\\+$%\K\,l}#&\K,#'\I(\I*+/#,-0KT'14KT\\\\'58 :9/L#:]|KS]%;</#=>A\IDB\ITCFKT ]] 'GJ :K/L#L]KS %MN/#OPS }X r}d}pT ='w%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&i`d?X@>X̟vЯl4ov^!_ ݕ.iQr&>N\t9Ʌ$Xŧn=HC@هB+7B5^ x-$TITLE$PublicAccess$ScriptLib$ScriptLib_O J1akgJv%{='w%eD'w% =Ԇ_J&Arial&Tahoma00.03 HeaderZZ   d2=c +,!\> :(<"ZTVV`}@<1domino_logo.jpg }@42Couchdb-logo.jpg`6p"Z6TVV PH0   fld_FormTitlefld_HTitlebg Z6TVVg P:0 fld_HTitle2bg ZO6O  d6CZ6C6Tg  P{='w%cOc'F(Ap%"x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk +hv%h+}% O=ALISE5/C=LVCN=Mris .bols/O=ALISE5/C=LVBV1.0BCBA0BLvNNO_^O~xZ}zӝ㪦ї*驲4a62dr>3\6f,ܪ:$P.ENMAPS8~PURSAFO_mA/@"jnG@ |Z3Y<0\Q;D ^g"OԳcǶ$A=R A7bޭkW!vmjRhW|:P=1{mA'UR_g#í?q #$HTMLCode$Info$$ScriptName$Body?Ndɸ$ Ov%->'w%eD'w%?z'++LotusScript Development Environment:2:5:(Options):0:74 Option Public Option Declare '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Class Global Declare Class StringBuffer Declare Function lsf_GetExtDatabase(server As String, filepath As String, IsSilent As Boolean) As NotesDatabase Declare Function lsf_FormatReplicaID(db As NotesDatabase) As String Declare Sub Initialize Declare Function lsf_ProcessLNDatabase(extDb As NotesDatabase) As Boolean Declare Function lsf_ParseFilePath(filePath As String) As String Declare Function lsf_CleanText(sourceStr As String) As String Declare Function lsf_GetContentType(fileNameStr As String) As String '++LotusScript Development Environment:2:5:(Declarations):0:10 Dim g As Global Class Global Public session As NotesSession Public db As NotesDatabase Public doc As NotesDocument Public ws As NotesUIWorkspace Public uidoc As NotesUIDocument Public cache List As Variant Private IsOnServerState As Boolean Public Sub new() Set session = New NotesSession Set db = session.CurrentDatabase IsOnServerState = session.IsOnServer If Not IsOnServerState Then Set ws = New NotesUIWorkspace End If End Sub Public Sub init(source As Variant) On Error Goto errh Dim typeStr As String If Ucase(Typename(source)) = "NOTESUIDOCUMENT" Then Set uidoc = source Set doc = uidoc.Document Elseif Ucase(Typename(source)) = "NOTESDOCUMENT" Then Set doc = source Else Error 3000, "Unsupported source type" End If Exit Sub errh: Call Me.onError() Exit Sub End Sub Public Function isOnServer() As Boolean isOnServer = IsOnServerState End Function Private Sub onError() Error 3000, " [" & Getthreadinfo( 10 ) & ": " & Cstr( Erl ) & "] " & Error End Sub End Class Class StringBuffer Private session As NotesSession Private body As NotesStream Public Sub New() Set session = New NotesSession Set body = session.CreateStream End Sub Public Sub Delete() Call body.Close() End Sub Public Function Append(source As String) As Boolean body.WriteText(source) End Function Public Function GetText() As String body.Position = 0 GetText = body.ReadText End Function End Class '++LotusScript Development Environment:2:1:lsf_GetExtDatabase:1:8 Function lsf_GetExtDatabase(server As String, filepath As String, IsSilent As Boolean) As NotesDatabase On Error Goto errh Dim result As New NotesDatabase("", "") If Lcase(server) = "local" Then server = "" If result.OpenWithFailover(server, filepath) Then Set lsf_GetExtDatabase = result Else If Not IsSilent Then Error 3000, |Could not open database "| & server & " : " & filepath & |"| End If End If Exit Function errh: Error Err, " [" & Lsi_info(2) & ": " & Cstr( Erl ) & "] " & Error Exit Function End Function '++LotusScript Development Environment:2:1:lsf_FormatReplicaID:1:8 Function lsf_FormatReplicaID(db As NotesDatabase) As String On Error Goto errh Dim replicaID As String If Not db Is Nothing Then If db.IsOpen Then replicaID = db.ReplicaID lsf_FormatReplicaID = Left(replicaID,8) + ":" + Right(replicaID,8) End If End If Exit Function errh: Error Err, " [" & Lsi_info(2) & ": " & Cstr( Erl ) & "] " & Error Exit Function End Function '++LotusScript Development Environment:2:2:Initialize:1:10 Sub Initialize If g Is Nothing Then Set g = New Global End Sub '++LotusScript Development Environment:2:1:lsf_ProcessLNDatabase:1:8 Function lsf_ProcessLNDatabase(extDb As NotesDatabase) As Boolean On Error Goto errh Dim serverStr As String, pathStr As String serverStr = g.doc.GetItemValue("fld_LNServer")(0) pathStr = g.doc.GetItemValue("fld_LNFilePath")(0) If pathStr = "" Then Call g.doc.ReplaceItemValue("fld_LNDb", "") Call g.doc.ReplaceItemValue("fld_LNReplicaID", "") Else Set extDb = lsf_GetExtDatabase(serverStr, pathStr, False) If extDb.IsOpen Then If serverStr = "" Then Call g.doc.ReplaceItemValue("fld_LNServer", "Local") Call g.doc.ReplaceItemValue("fld_LNDb", extDb.Title) Call g.doc.ReplaceItemValue("fld_LNReplicaID", lsf_FormatReplicaID(extDb)) lsf_ProcessLNDatabase = True Else Call g.doc.ReplaceItemValue("fld_LNDb", "") Call g.doc.ReplaceItemValue("fld_LNReplicaID", "Can't open specified database!") End If End If Exit Function errh: Error Err, " [" & Lsi_info(2) & ": " & Cstr( Erl ) & "] " & Error Exit Function End Function '++LotusScript Development Environment:2:1:lsf_ParseFilePath:1:8 Function lsf_ParseFilePath(filePath As String) As String On Error Goto errh Dim delimiter As String If filePath = "" Then Exit Function ' - get delimiter If Instr(filePath, "/") Then delimiter = "/" Else delimiter = "\" End If ' - if filePath ends up with delimiter then there is no need to add it again If Right(filePath, 1) = delimiter Then delimiter = "" lsf_ParseFilePath = filePath + delimiter Exit Function errh: Error Err, " [" & Lsi_info(2) & ": " & Cstr( Erl ) & "] " & Error Exit Function End Function '++LotusScript Development Environment:2:1:lsf_CleanText:1:8 Function lsf_CleanText(sourceStr As String) As String On Error Goto errh Dim badSymbs(1) As String badSymbs(0) = Chr(10) badSymbs(1) = Chr(13) lsf_CleanText = Replace(sourceStr, badSymbs, "") Exit Function errh: Error Err, " [" & Lsi_info(2) & ": " & Cstr( Erl ) & "] " & Error Exit Function End Function '++LotusScript Development Environment:2:1:lsf_GetContentType:1:8 Function lsf_GetContentType(fileNameStr As String) As String On Error Goto errh Dim ext As String, rv As String If Instr(fileNameStr, ".") > 0 Then ext = Lcase(Strrightback(fileNameStr, ".")) Select Case ext Case "txt": rv = "text/plain" Case "gif": rv = "image/gif" Case "jpg", "jpeg": rv = "image/jpeg" '... End Select End If lsf_GetContentType = rv Exit Function errh: Error Err, " [" & Lsi_info(2) & ": " & Cstr( Erl ) & "] " & Error Exit Function End FunctionLSOBen\x4 x$LThd d hh\ \ 4 4  x LL44|xxLotus ProductV0.0x W32I8*786FF14lNEWDELETE INITIALIZE TERMINATEOBJECTSERVERFILEPATHISSILENTDB8EXTDB SOURCESTR| FILENAMESTR$GGLOBALlSESSION NOTESSESSION$%LSXBE NOTESDATABASEDOC NOTESDOCUMENTHWSXNOTESUIWORKSPACE%LSXUIUIDOCNOTESUIDOCUMENTDCACHEISONSERVERSTATECURRENTDATABASEP ISONSERVERINITpSOURCEERRHdTYPESTR0DOCUMENTUnsupported source typeONERROR [|: ]  STRINGBUFFERBODY NOTESSTREAM CREATESTREAMCLOSE\APPEND0 WRITETEXTGETTEXTPOSITIONtREADTEXTdLSF_GETEXTDATABASEXRESULT$local OPENWITHFAILOVER8Could not open database "| : 4"LSF_FORMATREPLICAID REPLICAIDISOPEN:LSF_PROCESSLNDATABASE SERVERSTRPATHSTR GETITEMVALUE fld_LNServerfld_LNFilePathREPLACEITEMVALUEhfld_LNDbfld_LNReplicaIDLocalHTITLE`Can't open specified database!LSF_PARSEFILEPATH DELIMITERp/\x LSF_CLEANTEXTBADSYMBS\LSF_GETCONTENTTYPELEXTRV.txt( text/plain@gif image/gifjpgjpeg image/jpeg NOTESITEM xêFd   |( <000((p`<<0pLPPtPP).i]d@, cp  |p | |< | @@@).i]d@, cp| Lp L L` LDDD).i].).i]d@, cpL  p     L  p).i]d 3pa     `  ().i]d 3pa p L@\ (  G   0T( 4$ l  $$l < |xlHHllO).i]dp 4l    (    "  4T T T T 64\ x  < , , < <    WL L L L  x L , <  L 4 <       $ $ $ $  < Lh _ <  dddttt  L $Ll\\Ll||||\l$lL Vht$D44DD$$zXXXX4tD d 0  00@@@@ 0 t L   [ |p 4 | F 4p 4HK 4p 4lH6 `I 4p 4Lp L@hD p  \  p x  |).i].).i]d@, cp4 (xp  x x  \<+|$\K<-P#\K<-t#ۥH8  \+$!"% :c(]:X}(8)\`I*\K`-#:0+]:X}8,\I-: . } /12/#347]H8; }h r}t}<C\$+|$D\K$,#EGK,#HJK,I #1KMK.H!N]T K,l#OS :zT^< +L}}$VI I}8] }WK< ,I I #8X] J< Y:*ZI, 8[ }I }(I }4\]_`}hֿ}t}abf :RiI Š8?jK -#8/k^ K -#l] J J}J Pmnpq}hֿ}t}rsvG8[*#wz :}^KL,}#d~^KL,}8#dJ}8.KL,D}}#1KL,D}}#1:]t)d ^^#Kt-#8\J}8KL,D}}#1KL,D}Kt-@##1KL,D})\ ]t##1]d:+KL,D}}#1KL,D}}#1}hֿ}t} :hI\}8I\}d8^l}d: ^l}lI\PJl8^l}]LI\Jl}hֿ}t} ::oD BoD B]$]4^D}t}hֿ}t} :I}8{^ I}I:U2}8 1^0}:D2} 8 1^0},:,2}D92}P8 1^0}`: 1:J :]J0}hֿ}t} ,xQ<d<tx$t >'w%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&ix,eZFSUO'!X.?mꭒtn$4G1k=+p)oo_CE4!$2=Gav%rGv%Started running agent '(001. Check connection)|ag_CheckConnection' on 18.05.2010 15:02:06 Running on all documents in database: 13 total Found 13 document(s) that match search criteria Ran LotusScript code Done running agent '(001. Check connection)|ag_CheckConnection' on 18.05.2010 15:02:11 _$Hgv>v%ªV0-)v%*)u>v%!eD'w%”bN'++LotusScript Development Environment:2:5:(Options):0:74 Option Public Option Declare Use "lib_SystemFunctions" Use "lib_HttpConnectionLS2J" '++LotusScript Development Environment:2:5:(Forward):0:1 Declare Sub Initialize '++LotusScript Development Environment:2:5:(Declarations):0:2 '++LotusScript Development Environment:2:2:Initialize:1:10 Sub Initialize On Error Goto errh Dim con As HttpConnection Dim urlStr As String Call g.init(g.ws.CurrentDocument) urlStr = g.doc.getItemValue("fld_CouchDbURL")(0) If urlStr <> "" Then Set con = New HttpConnection("GET", urlStr) 'Call con.setProxy("proxy.alise.lv", "8080") Messagebox "Request response code: " + Cstr(con.getResponseCode()), 64, g.doc.getItemValue("fld_CheckCouchDBLink")(0) Else Messagebox "CouchDb url is not defined", 64, "Information" End If Exit Sub errh: Msgbox Error & | in line | & Erl(), 64, |Lotus Notes (| & Lsi_info(2) & |)| Exit Sub End SubLSOBend(,DP$8HT,,,,P,,Lotus ProductV0.0d(W32I,d*8212814lNEWDELETE INITIALIZE TERMINATEOBJECTlib_SystemFunctionsXLIB_SYSTEMFUNCTIONSlib_HttpConnectionLS2JtLIB_HTTPCONNECTIONLS2JERRHCONHTTPCONNECTIONURLSTRGINITWS CURRENTDOCUMENTDOC4 GETITEMVALUE@fld_CouchDbURLGETRequest response code: GETRESPONSECODEXfld_CheckCouchDBLinkCouchDb url is not defined8 Informationt in line ` Lotus Notes ()GLOBALNOTESUIWORKSPACE%LSXUINOTESUIDOCUMENT NOTESDOCUMENT%LSXBE NOTESDATABASEh6 x <& @,,h000!S!S(\  L@ ,& @d4@@4!,S!,0S@(!,(S,S44 xxxxx).i]d 3paH     PP).i]d 3pa ,S P).i].).i]d@, cD PD P P  ).i]d@, cD D  PD P!Sx:Ҍ: :K,@KL-x##^KL4,}#dJ}8=^*}8^#}DK,#@KL4,}#d:}@}}$@}<ֿ}\  < u>v%dOd|Z\l%#x<g%x<:% O=ALISE5/C=LV O=ALISE5/C=LVBV1.0BCBA0BLvNNO#,T;5 c.Sib=-LҪ2X N|qIkwe.<t񐈳-0lp,ENMA5~)-5~PURSAFO9P ߙjIr0K3*4Zao,`%qw,޺|EY%eHYk tk't% 'w% O=ALISE5/C=LVCN=Art)rs Meks/O=ALISE5/C=LVBV1.0BCBA0BLvNNO>jFQ:F&HTb] S~ urRI~R_ouR&{:si6[m%Z|/ENMAja_~PURSAFO0+sFx! 3?ŻC5{ e8iXPhT :N@'Y9l P.&qlBG&iL3FS$M`i̓՝SS `z;H(|Mƪ)O(cP-{@*禶Apr uY $TITLE$AssistType$AssistLastRun$AssistDocCount$FlagsExt$AssistFlags$AssistInfo$AssistQuery$AssistAction$AssistAction_Ex$Restricted0MU;'w%_Jw%rGv%Started running agent '(002. Export data)|ag_ExportData' on 18.05.2010 13:47:57 Running on all documents in database: 12 total Found 12 document(s) that match search criteria Ran LotusScript code Done running agent '(002. Export data)|ag_ExportData' on 18.05.2010 13:48:04 &%bJw%ªbN)6v%³_Jw%%eD'w%-LSOBen "@Ed@(0"$8xT Xhxx  dhddL L XX0,0DD    Lotus ProductV0.0 "@E W32I ̫t *82D7014lNEWDELETE INITIALIZE TERMINATEHOBJECTlib_SystemFunctionsDLIB_SYSTEMFUNCTIONS0lib_HttpConnectionLS2JLIB_HTTPCONNECTIONLS2JLls.snapps.JSONWriterLS.SNAPPS.JSONWRITERClass XMLProcessorCLASS XMLPROCESSOR$PRE_FIXXNotestMAXURLSTRdPOSTMSGxDOCxSOURCE FIELDNAME DOMPARSERNODE LOGDOCUMENTBODYDOC NOTESDOCUMENT%LSXBE< NOTESDATABASE0BODYNOTESRICHTEXTITEMPARENTDATABASEREPLACEITEMVALUEForm frm_ExportLogT fld_LNServer GETITEMVALUEfld_LNFilePathfld_CouchDbURLdfld_BodySAVEWRITELOGSTR  APPENDTEXT0 ADDNEWLINEERRHEXTDBEXTCOLLxNOTESDOCUMENTCOLLECTIONEXTDOCCNT MAXSTRGINITWSCURRENTDOCUMENTCACHElogDocpurlStrP/LSF_PROCESSLNDATABASE ALLDOCUMENTSdGETFIRSTDOCUMENT COUNT LSF_DOC2JSONGETNEXTDOCUMENT Processed:  of #Error: CouchDb url is not specifiedError: NotesDb is not specified @ in line  Lotus Notes (\) LSF_SENDDATAhCONHTTPCONNECTIONLPUTSEND [t: ] BUF STRINGBUFFERH JSONd JSONWRITER TRANSFORM APPEND, BEGINOBJECT KEY $DominoMeta UniversalID APPENDVALUE UNIVERSALID NoteID NOTEID IsResponse ISRESPONSE@ ParentID PARENTDOCUMENTUNIDT Createdh CREATED LastAccessed@ LASTACCESSED LastModified LASTMODIFIED, ENDOBJECTH ITMNAME0 ITM ITEMS\ NAME _ Item " " was renamed to " " TYPE RICHTEXT ITEM LSF_RT2HTML VALUESt BEGINARRAY@ ENDARRAYT GETTEXT SESSION NOTESSESSION DB\ CURRENTDATABASEhSTREAM NOTESSTREAM0 CREATESTREAM4 EXPORTERt NOTESDXLEXPORTER CREATEDXLEXPORTER<SETINPUT SETOUTPUT PROCESS READTEXTPLSF_B64PROCESSDXLNODE NOTESDOMPARSER, NOTESDOMNODECHILDPARENT<INFONODE$NODEATTRIBUTESNOTESDOMNAMEDNODEMAPX NODEATTRIBUTEPNOTESDOMATTRIBUTENODElB64DATA B64FILENAMEXB64EXTIISNULL$ HASCHILDNODES FIRSTCHILDH PARENTNODE CHILDSCOUNT NUMBEROFCHILDNODESNODENAMEGIF NODEVALUE.gifx ATTACHMENTREFJPEGX.jpgFILEDATA| ATTRIBUTES`NUMBEROFENTRIES(GETITEMd ATTRIBUTENAME4nameATTRIBUTEVALUE. NEXTSIBLINGLSF_XSLT}=<?xml version="1.0" encoding="UTF-8"?> <!-- XSLT style sheet containing template rules for DXL <richtext> constructs. The general approach is: - Data and structure is separate from presentation. Generate HTML for data and structure (e.g. table). Generate CSS for presentation details. - If there is a fairly direct mapping between DXL and HTML, use it (e.g. table). - Otherwise, generate <div>s for block-level DXL constructs like <par> and <section>, and generate <span>s for inline-level DXL constructs like <urllink> and <button>. NOTES * HideWhen is handled by hiding the entity with a display:none style, not by skipping generation of the item. * the stylesheet part of this may be better off done as a separate callable template that can be placed in the head tag. TO DO * numbered lists (use xsl:number ? how?) * output xhtml instead of html * pardefs should be done with a key so that they can be unique across all richtext fields --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:dxl="http://www.lotus.com/dxl"> <!-- Stylesheet Templates --> <!-- Variables used throughout this style sheet. Allows for easy change. --> <xsl:variable name="sectExpandIcon"><xsl:value-of select="$iconBase"/>icons/expand.gif</xsl:variable> <xsl:variable name="sectCollapseIcon"><xsl:value-of select="$iconBase"/>icons/collapse.gif</xsl:variable> <xsl:variable name="doclinkIcon"><xsl:value-of select="$iconBase"/>icons/doclink.gif</xsl:variable> <xsl:variable name="databasePath"><xsl:value-of select="dxl:database/@path"/></xsl:variable> <!-- Sample datetime in DXL: 20041020T101600,22-04 One with only date: 20041217 This code always maps the first representation to the format: 10/20 10:16 AM It always maps the second representation to the format: 12/17/2004 A more robust implementation would allow for various formats. --> <xsl:template match="dxl:datetime"> <xsl:choose> <xsl:when test="string-length(.) &lt;= 8"> <xsl:value-of select="substring(.,5,2)"/>/<xsl:value-of select="substring(.,7,2)"/>/<xsl:value-of select="substring(.,1,4)"/> </xsl:when> <xsl:otherwise> <xsl:variable name="militaryHour"> <xsl:value-of select="substring(.,10,2)"/> </xsl:variable> <xsl:variable name="hour"> <xsl:choose> <xsl:when test="$militaryHour = 0">12</xsl:when> <xsl:when test="$militaryHour &lt;= 12"><xsl:value-of select="$militaryHour"/></xsl:when> <xsl:otherwise><xsl:value-of select="$militaryHour - 12"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="ampm"> <xsl:if test="$militaryHour &lt; 12">AM</xsl:if> <xsl:if test="$militaryHour >= 12">PM</xsl:if> </xsl:variable> <xsl:value-of select="substring(.,5,2)"/>/<xsl:value-of select="substring(.,7,2)"/> <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text> <xsl:value-of select="$hour"/>:<xsl:value-of select="substring(.,12,2)"/> <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text> <xsl:value-of select="$ampm"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- Call this template to emit default styles for richtext constructs. For example, the default font within a form body (FormBody class) is 10 point Default Sans Serif. --> <xsl:template name="defaultRichtextStyles"> div.sExpand { display: block } div.sCollapse { display: none } .FormBody {font: 10pt sans-serif;} .FormBody table{border-collapse: collapse } .FormBody td {border-style: solid; border-width: 1px; border-color: black} .ButtonTag {background-color: #c0c0c0; width: 1in; border: 3px solid; border-color: #eee #888 #888 #eee; cursor:pointer;} </xsl:template> <!-- Call this template to emit default Javascript code. Here we have code to handle the expanding and collapsing of sections. --> </xsl:template name="defaultJavascript"> var collapseIcon = "<xsl:value-of select="$sectCollapseIcon"/>"; var expandIcon = "<xsl:value-of select="$sectExpandIcon"/>"; function _dChangeSect(secNum) { var secElem = document.getElementById(secNum); var iElem = document.getElementById("i" + secNum); if (secElem.className=="sExpand") { secElem.className = "sCollapse"; iElem.src = expandIcon; } else { secElem.className = "sExpand"; iElem.src = collapseIcon; } return true; } </xsl:template> <!-- Call this template to emit any CSS styles for richtext constructs in the source DXL document. --> <xsl:template name="richtextStyles"> <!-- pardef styles DXL <pardef>s have an id attribute whose integer value is unique within the DXL note. We generate a CSS class name from that value to contain styles for that paragraph. For example, for input DXL containing: <pardef id='6' align='center' leftmargin='0.0313in'/> the code below could generate this CSS class: .F6{ margin-left: 0.0313in; text-align:center; } --> <xsl:for-each select="//dxl:pardef"> .<xsl:value-of select="concat($runContext, @id)"/> <xsl:text>{ </xsl:text> <xsl:if test="@leftmargin[contains(.,'in')]"> <xsl:text>margin-left: </xsl:text> <!-- Within a tablecell, this maps directly. Otherwise, we subtract 1 inch off the DXL value. Notes by default hides the first 3/4" of the display and thus the default 1" margin appears like a 1/4" margin on the screen. Browsers don't hide any of the left margin this way. --> <xsl:choose> <xsl:when test="ancestor::dxl:tablecell"><xsl:value-of select="@leftmargin"/></xsl:when> <xsl:otherwise><xsl:value-of select="concat(substring-before(@leftmargin,'in')-1, 'in')"/></xsl:otherwise> </xsl:choose> <xsl:text>; </xsl:text> </xsl:if> <!-- Important note on Hide When paragraphs. We are ?assuming that since we are producing HTML, we should be displaying only those paragraphs that were intended to be visible for reading to web browsers. Thus any HTML generated for a paragraph that is hide web or hide read has a style so that it does not display. (This makes the HTML a bit verbose because it still contains all of the paragraphs' data, even if the data will not be displayed.) --> <xsl:if test="@hide[contains(., 'web') or contains(.,'read')]"> <xsl:text>display: none; </xsl:text> </xsl:if> <!-- Lists don't map well to HTML because DXL does not represent the structure of a list. A <pardef> with a list attribute is part of a list, but there is no DXL structure to delimit the list. Thus a list element is treated the same way a paragraph is, as a <div> (see below). We can generate the correct style for unordered lists, but it is a complex issue to generate numbering for numbered lists so we change them to use "circle" bullets instead. --> <xsl:if test="@list"> <xsl:choose> <xsl:when test="@list='bullet' or @list='circle'"> <xsl:text>display: list-item;</xsl:text> </xsl:when> <xsl:when test="@list='square'"><xsl:text>display: list-item; list-style-type: square;</xsl:text></xsl:when> <xsl:when test="@list='number'"><xsl:text>display: list-item; list-style-type: circle; </xsl:text></xsl:when> <xsl:when test="contains(@list,'roman')"><xsl:text>display: list-item; list-style-type: circle; </xsl:text></xsl:when> <xsl:when test="contains(@list,'alpha')"><xsl:text>display: list-item; list-style-type: circle; </xsl:text></xsl:when> </xsl:choose> </xsl:if> <!-- <pardef> alignment maps to text-align. --> <xsl:if test="@align[.='left' or .='center' or .='right']"> <xsl:text>text-align:</xsl:text><xsl:value-of select="@align"/><xsl:text>; </xsl:text> </xsl:if> <xsl:text>}</xsl:text> </xsl:for-each> <!-- Notes on generate-id(): - It is an XSLT function that generates a unique IDO for the selected node in the input tree. Note that this style sheet relies on the fact that the separate template rules for a specific node generate the same ID, which facilitates us emitting a CSS class in one rule and referencing it in another. - The XSLT processor in Domino can generate ids such as "N05A2CBB0.059CF1AA". The dot in these ids are problematic when used in CSS. Thus we use translate(generate-id(),'.','_') instead. This replaces the dot with an underscore so we get "N05A2CBB0_059CF1AA" instead. --> <!-- table styles (only consider tags that actually have attributes) --> <xsl:for-each select="//dxl:table[attribute::* or dxl:border]"> <xsl:variable name="tableId"><xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/></xsl:variable> div#<xsl:value-of select="concat('T_',$tableId)"/> <xsl:text>{</xsl:text> <xsl:if test="@leftmargin[contains(.,'in')]"> <xsl:text>margin-left: </xsl:text> <xsl:choose> <xsl:when test="ancestor::dxl:tablecell"><xsl:value-of select="@leftmargin"/></xsl:when> <xsl:otherwise><xsl:value-of select="concat(substring-before(@leftmargin,'in')-1, 'in')"/></xsl:otherwise> </xsl:choose> <xsl:text>; </xsl:text> </xsl:if> <!-- right margins won't work directly because notes measures them from the left and CSS specifies as a width. --> <xsl:if test="@rightmargin[contains(.,'in')]"> <xsl:text>margin-right: </xsl:text> <xsl:value-of select="@rightmargin"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:text>}</xsl:text> table#<xsl:value-of select="$tableId"/> <xsl:text>{</xsl:text> <xsl:if test="@widthtype='fitmargins' or @widthtype='fitwindow'"> <xsl:text>width: 100%;</xsl:text> </xsl:if> <xsl:if test="contains(@widthtype, 'fixed')"> <xsl:text>width: </xsl:text><xsl:value-of select="@refwidth"/><xsl:text>; </xsl:text> <xsl:variable name="tabAlign"><xsl:value-of select="substring-after(@widthtype,'fixed')"/></xs_l:variable> <xsl:choose> <xsl:when test="$tabAlign = 'center'"><xsl:text>margin-left: auto; margin-right: auto; </xsl:text></xsl:when> <xsl:when test="$tabAlign = 'right'"><xsl:text>margin-left: auto; margin-right: 0in;</xsl:text></xsl:when> </xsl:choose> </xsl:if> <xsl:if test="@bgcolor"> <xsl:text>background-color: </xsl:text><xsl:value-of select="@bgcolor"/><xsl:text>;</xsl:text> </xsl:if> <xsl:if test="dxl:border/@style"><xsl:text>border-style: </xsl:text><xsl:value-of select="dxl:border/@style"/><xsl:text>;</xsl:text></xsl:if> <xsl:if test="dxl:border/@width"><xsl:text>border-width: </xsl:text><xsl:value-of select="dxl:border/@width"/><xsl:text>;</xsl:text></xsl:if> <xsl:if test="dxl:border/@color"><xsl:text>border-color: </xsl:text><xsl:value-of select="dxl:border/@color"/><xsl:text>;</xsl:text></xsl:if> <xsl:text>}</xsl:text> </xsl:for-each> <xsl:for-each select="//dxl:table/@cellbordercolor"> table#<xsl:value-of select="concat($runContext,generate-id(parent::node()))"/> td { border-color: <xsl:value-of select="."/> } </xsl:for-each> <xsl:for-each select="//dxl:tablecolumn"> <xsl:if test="@width"> col#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/>{ width: <xsl:value-of select="@width"/> } </xsl:if> </xsl:for-each> <!-- process tablecell attributes --> <xsl:for-each select="//dxl:tablecell[attribute::*]"> td#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/>{ <xsl:apply-templates select="./attribute::*" mode="tdStyles"/> } </xsl:for-each> <xsl:for-each select="//dxl:tablecell[dxl:cellbackground/dxl:imageref]"> td#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/>{ background-image:url(<xsl:value-of select="dxl:cellbackground/dxl:imageref/@name"/>); } </xsl:for-each> <!-- runs containing fonts --> <xsl:for-each select="//dxl:run[descendant::dxl:font]"> span#<xsl:value-of select="concat($runContext,translate(geonerate-id(),'.','_'))"/> { <xsl:apply-templates select="dxl:font[1]" mode="runFontStyle"/> } </xsl:for-each> <!-- buttons: just for fun, to show where they would be on the document --> <xsl:for-each select="//dxl:button"> div#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/> <xsl:text> { </xsl:text> <xsl:if test="dxl:font"><xsl:apply-templates select="dxl:font[1]" mode="runFontStyle"/></xsl:if> <xsl:if test="@width"><xsl:text>width: </xsl:text><xsl:value-of select="@width"/><xsl:text>;</xsl:text></xsl:if> <xsl:text> }</xsl:text> </xsl:for-each> </xsl:template> <!-- End of richtextStyles template --> <!-- <font> data maps to various CSS styles. --> <xsl:template match="dxl:font" mode="runFontStyle"> <xsl:if test="@size">font-size:<xsl:value-of select="@size"/>;</xsl:if> <xsl:if test="@color">color:<xsl:value-of select="@color"/>;</xsl:if> <xsl:if test="contains(@style,'italic')">font-style:italic;</xsl:if> <xsl:if test="contains(@style,'bold')">font-weight:bold;</xsl:if> <xsl:if test="contains(@style,'underline')">text-decoration:underline;</xsl:if> <xsl:if test="contains(@style,'strikethrough')">text-decoration:line-through;</xsl:if> <xsl:if test="@name">font-family:<xsl:value-of select="@name"/></xsl:if> </xsl:template> <!-- Templates with mode="tdStyles" handle tablecell attributes. --> <xsl:template match="@borderwidth" mode="tdStyles"> <xsl:text>border-width: </xsl:text><xsl:value-of select="."/><xsl:text>;</xsl:text> </xsl:template> <xsl:template match="@width" mode="tdStyles"> <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>;</xsl:text> </xsl:template> <xsl:template match="@bgcolor" mode="tdStyles"> background-color: <xsl:value-of select="."/>; </xsl:template> <!-- No output for any other tablecell attributes. --> <xsl:template match="attribute::*" mode="tdStyles"> </xsl:template> <!-- HTML Transformations --> <xsl:template match="dxl:richtext"> <xsl:apply-templates/> </xsl:template> <!-- The characteristics of a DXL <par def="9"> are defined by a <pardef id="9">. But to complicate matters, the DXL Exporter omits the <par> def attribute if it is the same as the most recent preceding sibling <par> with a def attribute. This code locates the correct <par> def attribute and then finds the <pardef> with that id. The <par> maps to a <div> in DXL. The <div> references a CSS class name. The class was generated by other template rules above. --> <xsl:template match="dxl:par"> <xsl:variable name="parDefVal"> <xsl:choose> <xsl:when test="@def"> <xsl:value-of select="@def"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="preceding-sibling::dxl:par[@def][1]/@def" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="parDefNode" select="preceding::dxl:pardef[@id=$parDefVal]" /> <div class="{concat($runContext, $parDefVal)}"> <xsl:apply-templates/> <xsl:if test="not(descendant::*/text() or ./text())"><br/></xsl:if> </div> </xsl:template> <!-- <urllink> maps directly to <a>. --> <xsl:template match="dxl:urllink"> <a href="{@href}"> <xsl:apply-templates/> </a> </xsl:template> <!-- <doclink> maps to <a>. --> <xsl:template match="dxl:doclink"> <a href="notes:///{@database}/{@view}/{@document}"><img src="{$doclinkIcon}" /></a> <!-- Note that DXL doclink has a replicaId but not a server hint, thus we can't generate the following style of link unless we hardcode the host name. --> <!-- <a href="http://localhost/{$databasePath}/{@view}/{@document}"><img src="{$doclinkIcon}" /></a> --> </xsl:template>x: <!-- <run>s map to <span>s styled with a CSS ID class. The class was generated by other template rules above. --> <xsl:template match="dxl:run"> <span id="{concat($runContext,translate(generate-id(),'.','_'))}"> <xsl:apply-templates/> </span> </xsl:template> <!-- <table>s map to <table>s. The HTML table is contained in a <div>. As with everything here, the CSS is emitted separately above. --> <xsl:template match="dxl:table"> <xsl:variable name="tableId"> <xsl:value-of select="concat($runContext, translate(generate-id(),'.','_'))"/> </xsl:variable> <div id="T_{$tableId}" class="TableContainer"> <xsl:element name="table"> <xsl:attribute name="id"><xsl:value-of select="$tableId"/></xsl:attribute> <xsl:if test="@widthtype='fitmargins' or @widthtype='fitwindow'"> <xsl:attribute name="width">100%</xsl:attribute> </xsl:if> <colgroup> <xsl:for-each select="dxl:tablecolumn"> <col id="{concat($runContext,translate(generate-id(),'.','_'))}"/> </xsl:for-each> </colgroup> <xsl:apply-templates/> </xsl:element> </div> </xsl:template> <!-- <tablerow> maps directly to <tr>. --> <xsl:template match="dxl:tablerow"> <tr> <xsl:apply-templates/> </tr> </xsl:template> <!-- <tablecell> maps directly to <td>. --> <xsl:template match="dxl:tablecell"> <td id="{concat($runContext,translate(generate-id(),'.','_'))}"> <xsl:if test="@columnspan"><xsl:attribute name="colspan"><xsl:value-of select="@columnspan"/></xsl:attribute></xsl:if> <xsl:if test="@rowspan"><xsl:attribute name="rowspan"><xsl:value-of select="@rowspan"/></xsl:attribute></xsl:if> <xsl:apply-templates/> </td> </xsl:template> <!-- <button>s map to <div>s. If the DXL button contains JavaScript, we can carry it over into the HTML. Buttons with other types of code don't map, we just put in a dummy Javascript action. --> <xsl:template match="dxl:button"> <div class="ButtonTag" id="{concat($runContext,translate(generate-id(),'.','_'))}"> <xsl:attribute name="onClick"> <xsl:choose> <xsl:when test="dxl:code[@event='onClick' and @for='web']/dxl:javascript"><xsl:value-of select="dxl:code/dxl:javascript"/></xsl:when> <xsl:otherwise><xsl:text>return alert('Button is just for show');</xsl:text></xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:apply-templates/> </div> </xsl:template> <!-- Ignore any occurrences of <code> that aren't otherwise handled. --> <xsl:template match="dxl:code"/> <xsl:template match="dxl:button/dxl:code[@event='onClick' and @for='web']/dxl:javascript"> <xsl:attribute name="onclick"><xsl:value-of select="."/></xsl:attribute> </xsl:template> <!-- <section>s map to <div>s which contain an <img> for the twistie. We specify JavaScript code for the <img> onclick attribute so that the section can be expanded and collapsed in the browser. --> <xsl:template match="dxl:section"> <xsl:variable name="secId" select="concat($runContext,translate(generate-id(),'.','_'))"/> <xsl:variable name="sq">'</xsl:variable> <!-- This can't have pardefs because we don't yet handle the "negative" offset from the default 1" margin. <div class="{concat($runContext,dxl:sectiontitle/@pardef)}"> --> <div> <img id="{concat('i', $secId)}" src="{$sectExpandIcon}" onclick="_dChangeSect({concat($sq,$secId,$sq)})"/> <xsl:apply-templates select="dxl:sectiontitle"/> </div> <div class="sCollapse" id="{$secId}"><xsl:apply-templates select="dxl:sectiontitle/following-sibling::*"/></div> </xsl:template> <!-- <break> maps directly to <br>. --> <xsl:template match="dxl:break"> <xsl:element name="br"/> </xsl:template> <!-- <horizrule> maps directly to <hr>. --> <xsl:template match="dxl:horizrule"> <hr /> </xsl:template> <xsl:template match="dxl:text"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>< NOTESITEMGLOBALNOTESUIWORKSPACE%LSXUINOTESUIDOCUMENTīNOTESXMLPROCESSORrL<?xml version="1.0" encoding="UTF-8"?> <!-- XSLT style sheet containing template rules for DXL <richtext> constructs. The general approach is: - Data and structure is separate from presentation. Generate HTML for data and structure (e.g. table). Generate CSS for presentation details. - If there is a fairly direct mapping between DXL and HTML, use it (e.g. table). - Otherwise, generate <div>s for block-level DXL constructs like <par> and <section>, and generate <span>s for inline-level DXL constructs like <urllink> and <button>. NOTES * HideWhen is handled by hiding the entity with a display:none style, not by skipping generation of the item. * the stylesheet part of this may be better off done as a separate callable template that can be placed in the head tag. TO DO * numbered lists (use xsl:number ? how?) * output xhtml instead of html * pardefs should be done with a key so that they can be unique across all richtext fields --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:dxl="http://www.lotus.com/dxl"> <!-- Stylesheet Templates --> <!-- Variables used throughout this style sheet. Allows for easy change. --> <xsl:variable name="sectExpandIcon"><xsl:value-of select="$iconBase"/>icons/expand.gif</xsl:variable> <xsl:variable name="sectCollapseIcon"><xsl:value-of select="$iconBase"/>icons/collapse.gif</xsl:variable> <xsl:variable name="doclinkIcon"><xsl:value-of select="$iconBase"/>icons/doclink.gif</xsl:variable> <xsl:variable name="databasePath"><xsl:value-of select="dxl:database/@path"/></xsl:variable> <!-- Sample datetime in DXL: 20041020T101600,22-04 One with only date: 20041217 This code always maps the first representation to the format: 10/20 10:16 AM It always maps the second representation to the format: 12/17/2004 A more robust implementation would allow for various formats. --> <xsl:template match="dxl:datetime"> <xsl:choose> <xsl:when test="string-length(.) &lt;= 8"> <xsl:value-of select="substring(.,5,2)"/>/<xsl:value-of select="substring(.,7,2)"/>/<xsl:value-of select="substring(.,1,4)"/> </xsl:when> <xsl:otherwise> <xsl:variable name="militaryHour"> <xsl:value-of select="substring(.,10,2)"/> </xsl:variable> <xsl:variable name="hour"> <xsl:choose> <xsl:when test="$militaryHour = 0">12</xsl:when> <xsl:when test="$militaryHour &lt;= 12"><xsl:value-of select="$militaryHour"/></xsl:when> <xsl:otherwise><xsl:value-of select="$militaryHour - 12"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="ampm"> <xsl:if test="$militaryHour &lt; 12">AM</xsl:if> <xsl:if test="$militaryHour >= 12">PM</xsl:if> </xsl:variable> <xsl:value-of select="substring(.,5,2)"/>/<xsl:value-of select="substring(.,7,2)"/> <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text> <xsl:value-of select="$hour"/>:<xsl:value-of select="substring(.,12,2)"/> <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text> <xsl:value-of select="$ampm"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- Call this template to emit default styles for richtext constructs. For example, the default font within a form body (FormBody class) is 10 point Default Sans Serif. --> <xsl:template name="defaultRichtextStyles"> div.sExpand { display: block } div.sCollapse { display: none } .FormBody {font: 10pt sans-serif;} .FormBody table{border-collapse: collapse } .FormBody td {border-style: solid; border-width: 1px; border-color: black} .ButtonTag {background-color: #c0c0c0; width: 1in; border: 3px solid; border-color: #eee #888 #888 #eee; cursor:pointer;} </xsl:template> <!-- Call this template to emit default Javascript code. Here we have code to handle the expanding and collapsing of sections. --> <xsl:template name="defaultJavascript"> var collapseIcon = "<xsl:value-of select="$sectCollapseIcon"/>"; var expandIcon = "<xsl:value-of select="$sectExpandIcon"/>"; function _dChangeSect(secNum)  { var secElem = document.getElementById(secNum); var iElem = document.getElementById("i" + secNum); if (secElem.className=="sExpand") { secElem.className = "sCollapse"; iElem.src = expandIcon; } else { secElem.className = "sExpand"; iElem.src = collapseIcon; } return true; } </xsl:template> <!-- Call this template to emit any CSS styles for richtext constructs in the source DXL document. --> <xsl:template name="richtextStyles"> <!-- pardef styles DXL <pardef>s have an id attribute whose integer value is unique within the DXL note. We generate a CSS class name from that value to contain styles for that paragraph. For example, for input DXL containing: <pardef id='6' align='center' leftmargin='0.0313in'/> the code below could generate this CSS class: .F6{ margin-left: 0.0313in; text-align:center; } --> <xsl:for-each select="//dxl:pardef"> .<xsl:value-of select="concat($runContext, @id)"/> <xsl:text>{ </xsl:text> <xsl:if test="@leftmargin[contains(.,'in')]"> <xsl:text>margin-left: </xsl:text> <!-- Within a tablecell, this maps directly. Otherwise, we subtract 1 inch off the DXL value. Notes by default hides the first 3/4" of the display and thus the default 1" margin appears like a 1/4" margin on the screen. Browsers don't hide any of the left margin this way. --> <xsl:choose> <xsl:when test="ancestor::dxl:tablecell"><xsl:value-of select="@leftmargin"/></xsl:when> <xsl:otherwise><xsl:value-of select="concat(substring-before(@leftmargin,'in')-1, 'in')"/></xsl:otherwise> </xsl:choose> <xsl:text>; </xsl:text> </xsl:if> <!-- Important note on Hide When paragraphs. We are assuming that since we are producing HTML, we should be displaying only those paragraphs that were intended to be visible for reading to web browsers. Thus any HTML generated for a paragraph that i/s hide web or hide read has a style so that it does not display. (This makes the HTML a bit verbose because it still contains all of the paragraphs' data, even if the data will not be displayed.) --> <xsl:if test="@hide[contains(., 'web') or contains(.,'read')]"> <xsl:text>display: none; </xsl:text> </xsl:if> <!-- Lists don't map well to HTML because DXL does not represent the structure of a list. A <pardef> with a list attribute is part of a list, but there is no DXL structure to delimit the list. Thus a list element is treated the same way a paragraph is, as a <div> (see below). We can generate the correct style for unordered lists, but it is a complex issue to generate numbering for numbered lists so we change them to use "circle" bullets instead. --> <xsl:if test="@list"> <xsl:choose> <xsl:when test="@list='bullet' or @list='circle'"> <xsl:text>display: list-item;</xsl:text> </xsl:when> <xsl:when test="@list='square'"><xsl:text>display: list-item; list-style-type: square;</xsl:text></xsl:when> <xsl:when test="@list='number'"><xsl:text>display: list-item; list-style-type: circle; </xsl:text></xsl:when> <xsl:when test="contains(@list,'roman')"><xsl:text>display: list-item; list-style-type: circle; </xsl:text></xsl:when> <xsl:when test="contains(@list,'alpha')"><xsl:text>display: list-item; list-style-type: circle; </xsl:text></xsl:when> </xsl:choose> </xsl:if> <!-- <pardef> alignment maps to text-align. --> <xsl:if test="@align[.='left' or .='center' or .='right']"> <xsl:text>text-align:</xsl:text><xsl:value-of select="@align"/><xsl:text>; </xsl:text> </xsl:if> <xsl:text>}</xsl:text> </xsl:for-each> <!-- Notes on generate-id(): - It is an XSLT function that generates a unique ID for the selected node in the input tree. Note that this style sheet relies on the fact that the separate template rules for a specific node generate the same ID, which facilitates us emitting a C?SS class in one rule and referencing it in another. - The XSLT processor in Domino can generate ids such as "N05A2CBB0.059CF1AA". The dot in these ids are problematic when used in CSS. Thus we use translate(generate-id(),'.','_') instead. This replaces the dot with an underscore so we get "N05A2CBB0_059CF1AA" instead. --> <!-- table styles (only consider tags that actually have attributes) --> <xsl:for-each select="//dxl:table[attribute::* or dxl:border]"> <xsl:variable name="tableId"><xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/></xsl:variable> div#<xsl:value-of select="concat('T_',$tableId)"/> <xsl:text>{</xsl:text> <xsl:if test="@leftmargin[contains(.,'in')]"> <xsl:text>margin-left: </xsl:text> <xsl:choose> <xsl:when test="ancestor::dxl:tablecell"><xsl:value-of select="@leftmargin"/></xsl:when> <xsl:otherwise><xsl:value-of select="concat(substring-before(@leftmargin,'in')-1, 'in')"/></xsl:otherwise> </xsl:choose> <xsl:text>; </xsl:text> </xsl:if> <!-- right margins won't work directly because notes measures them from the left and CSS specifies as a width. --> <xsl:if test="@rightmargin[contains(.,'in')]"> <xsl:text>margin-right: </xsl:text> <xsl:value-of select="@rightmargin"/> <xsl:text>; </xsl:text> </xsl:if> <xsl:text>}</xsl:text> table#<xsl:value-of select="$tableId"/> <xsl:text>{</xsl:text> <xsl:if test="@widthtype='fitmargins' or @widthtype='fitwindow'"> <xsl:text>width: 100%;</xsl:text> </xsl:if> <xsl:if test="contains(@widthtype, 'fixed')"> <xsl:text>width: </xsl:text><xsl:value-of select="@refwidth"/><xsl:text>; </xsl:text> <xsl:variable name="tabAlign"><xsl:value-of select="substring-after(@widthtype,'fixed')"/></xsl:variable> <xsl:choose> <xsl:when test="$tabAlign = 'center'"><xsl:text>margin-left: auto; margin-right: auto; </xsl:text></xsl:when> <xsl:when test="$tabAlign = 'right'"><xsl:text>margin-Oleft: auto; margin-right: 0in;</xsl:text></xsl:when> </xsl:choose> </xsl:if> <xsl:if test="@bgcolor"> <xsl:text>background-color: </xsl:text><xsl:value-of select="@bgcolor"/><xsl:text>;</xsl:text> </xsl:if> <xsl:if test="dxl:border/@style"><xsl:text>border-style: </xsl:text><xsl:value-of select="dxl:border/@style"/><xsl:text>;</xsl:text></xsl:if> <xsl:if test="dxl:border/@width"><xsl:text>border-width: </xsl:text><xsl:value-of select="dxl:border/@width"/><xsl:text>;</xsl:text></xsl:if> <xsl:if test="dxl:border/@color"><xsl:text>border-color: </xsl:text><xsl:value-of select="dxl:border/@color"/><xsl:text>;</xsl:text></xsl:if> <xsl:text>}</xsl:text> </xsl:for-each> <xsl:for-each select="//dxl:table/@cellbordercolor"> table#<xsl:value-of select="concat($runContext,generate-id(parent::node()))"/> td { border-color: <xsl:value-of select="."/> } </xsl:for-each> <xsl:for-each select="//dxl:tablecolumn"> <xsl:if test="@width"> col#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/>{ width: <xsl:value-of select="@width"/> } </xsl:if> </xsl:for-each> <!-- process tablecell attributes --> <xsl:for-each select="//dxl:tablecell[attribute::*]"> td#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/>{ <xsl:apply-templates select="./attribute::*" mode="tdStyles"/> } </xsl:for-each> <xsl:for-each select="//dxl:tablecell[dxl:cellbackground/dxl:imageref]"> td#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/>{ background-image:url(<xsl:value-of select="dxl:cellbackground/dxl:imageref/@name"/>); } </xsl:for-each> <!-- runs containing fonts --> <xsl:for-each select="//dxl:run[descendant::dxl:font]"> span#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/> { <xsl:apply-templates select="dxl:font[1]" mode="runFontStyle"/> } </xsl:for-each> <!-- buttons: just for fun, to show where they would be on the document --> <xsl:for-each _select="//dxl:button"> div#<xsl:value-of select="concat($runContext,translate(generate-id(),'.','_'))"/> <xsl:text> { </xsl:text> <xsl:if test="dxl:font"><xsl:apply-templates select="dxl:font[1]" mode="runFontStyle"/></xsl:if> <xsl:if test="@width"><xsl:text>width: </xsl:text><xsl:value-of select="@width"/><xsl:text>;</xsl:text></xsl:if> <xsl:text> }</xsl:text> </xsl:for-each> </xsl:template> <!-- End of richtextStyles template --> <!-- <font> data maps to various CSS styles. --> <xsl:template match="dxl:font" mode="runFontStyle"> <xsl:if test="@size">font-size:<xsl:value-of select="@size"/>;</xsl:if> <xsl:if test="@color">color:<xsl:value-of select="@color"/>;</xsl:if> <xsl:if test="contains(@style,'italic')">font-style:italic;</xsl:if> <xsl:if test="contains(@style,'bold')">font-weight:bold;</xsl:if> <xsl:if test="contains(@style,'underline')">text-decoration:underline;</xsl:if> <xsl:if test="contains(@style,'strikethrough')">text-decoration:line-through;</xsl:if> <xsl:if test="@name">font-family:<xsl:value-of select="@name"/></xsl:if> </xsl:template> <!-- Templates with mode="tdStyles" handle tablecell attributes. --> <xsl:template match="@borderwidth" mode="tdStyles"> <xsl:text>border-width: </xsl:text><xsl:value-of select="."/><xsl:text>;</xsl:text> </xsl:template> <xsl:template match="@width" mode="tdStyles"> <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>;</xsl:text> </xsl:template> <xsl:template match="@bgcolor" mode="tdStyles"> background-color: <xsl:value-of select="."/>; </xsl:template> <!-- No output for any other tablecell attributes. --> <xsl:template match="attribute::*" mode="tdStyles"> </xsl:template> <!-- HTML Transformations --> <xsl:template match="dxl:richtext"> <xsl:apply-templates/> </xsl:template> <!-- The characteristics of a DXL <par def="9"> are defined by a <pardef id="9">. But to complicate matters, the DXL Exporter omits the <par> def attribute if it is the same as the most recent proeceding sibling <par> with a def attribute. This code locates the correct <par> def attribute and then finds the <pardef> with that id. The <par> maps to a <div> in DXL. The <div> references a CSS class name. The class was generated by other template rules above. --> <xsl:template match="dxl:par"> <xsl:variable name="parDefVal"> <xsl:choose> <xsl:when test="@def"> <xsl:value-of select="@def"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="preceding-sibling::dxl:par[@def][1]/@def" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="parDefNode" select="preceding::dxl:pardef[@id=$parDefVal]" /> <div class="{concat($runContext, $parDefVal)}"> <xsl:apply-templates/> <xsl:if test="not(descendant::*/text() or ./text())"><br/></xsl:if> </div> </xsl:template> <!-- <urllink> maps directly to <a>. --> <xsl:template match="dxl:urllink"> <a hr