#!/bin/sh # MetaCard 2.4 stack # The following is not ASCII text, # so now would be a good time to q out of more exec mc $0 "$@" MetaDoc`+MetaDoc - AcceuilU helvetica PZon preOpenStack start using "Execution Error" start using "libURL" end preOpenStack + menu.gif@1+GIF89a1HttHHtHHHtttHtttHHHttHtttHtHtHtHHtHHtHHtHHtttHttߜHHߜtttHttHHtHHttttHtttHtHttt߿ߜߜ߿ߜ߿ߜ!,1@ "\!Ç#B("ŋ3bܨ#ǏC)$ɓ&S\%˗atIs͚8osϞ@ rQG"])ӧNB:QUXju׮`%ٳhӪ]˶۷pʝKݻx˷߿(Y+^̸ǐ#KsA:=Y?tF6tDtQ4HKBg͵Ts'-`a >x☣7e`Vnꀇ? "&"шH<%Ptb(*R .z` H20Swό1#a6#9jq#cd#Al0.N# 23 Ie# I9Ir],)uyԮ.ԋ'21kjB9ge$e]؅+ɤ}ȷQ8f[R:|p\*SJpu2-{fZFJJ*ũ,^KRW)5uց,*XQ$*-[LǤA ʛd1r1p2K*Q-Ѳ8epzt.E˭yVb YLYҴ)i:SvY%e"J13 斝t 7M,-]KJrr6LAbӐ2`*W_ V j:WĒ*իrE^dj3GlMw.˙E,^. tM_j{Ǝlj%4ҥf2,d!ZvVhW\ pIFI|#y[5:yWVm!bz x;L+=z/|+̾~Vѿ 0,& 0',aRư3E$Ǻ vwmVa߉W.p',2ClH ᱏ /DDnv$1~#ѧSG,tӋW'ҁ2id(x+߃@ H3laYϸrv h3-y~&sY+>Jyс< yOfzӠfΥ՝veP35)uXz D@ Rbl qUf,* (Gߋ@_;'5u H/gA9tF/FݞW:`wKߝo7\؄pammޞkG!xwTGÝ퀛" x r 7x3'{{?{xQhЋ o@N|Cҟ ӄdm?2އq~{v58t_*TZ5^XxEր (Xx87ȁW"x%b#x?\AutOVv$G7(!6)GkƂfZ5[gEI53uKHhL&u\LXk A -]Q0w4VXUV{XjH%6reZrqM7 s 1|Ɵ7} ᩞ"gW'.ҟOy1,:>.y5F{LEQjNʔW7q2xs6j?>crX(cR6)"I/s:%\Z ,}hr1&1P)ni4.j'rPLrjB*fLdRmhqyX͂jle&n?%6wK(TkT.q CS.2.jbKf1.i%0umjp opkpJXzS"-($ pr)ĨJ/pʬ*V(2׉JpeYඪ@%Gƫ5.*$ZqlLdX:/dV# @vtpʪGba,۲ȧ Dj5Hjeg5]{gCEgkSsVXLX#IP5ԶѴ4Ko5TUCj۷r5@tNI3Xe3zsB'=ǎ䙐[{<[?ǶMJ'Jĸpuug+3fV{v[gRzA|{dطyt»hxvK}{;{׼7 b|zaxӳ[7#{' +Gv72Fhe:'w qg @ 3۽@|yV>0>= j<gUiW{Y ?[i] x_>a\ic<*)jzipN,VLnlчYǺY~ iq<0j{ NJňǑȓf5hMd&$<ʤ\ʦ\F8$ʬʮʩiD<˴\˶Eaq`˽,ܖŜǼ$ά<]<\ͩ,͝\gAܜ͔ͮ )Δ욿؂y$ S휶l\^=ًOZEp;W],YH-{ĺ쨂A(CϲTЯHt$iKуx\ad+K ҶĴ&'r+_';,Gbӂ;MPd :-o*n_B'VtkBX SxJ슐Z25`JAUo+NpRW-qص:mY"i8v*{h.2(VX- fׇo-+sn#]ɶ'H)5mAj=rgTYۉZ5ۭԉJB<O=mՉqn2Tʭ񧽁]U%}܀H&o,]*޶֙R kݝV9mه:бMӔmqq[N2*nNRMV(4E L)–n1={MuB*^DްdjqNO-tU/Vc.ZI^jMGڂM= ɲ9Q¶!PkeM.a/~#>e`C;K:dB}Y1HJ^^y7I6ёn^$Í-s[>$J,6MniO^5OגN[Nh꼎/$3ޓZߍ,eL Zb_hWA))v?_[DBdOh O"e!_#*o,-+,4l5Ռ<@B?X=lJNzR|9VOcyZb^b8fOvj nr5vOSD|xC7R!XeFX͏NOz|mԹ}Zd CO=f>Gzc/c/ɿbobϿbկğuƿ\Iϱ9oAP)=y`“(  >QD-^ĘQF%Rd$MDyReʔ+]|G5męSg΄$T!P;ETR"„*ӥԨU_dUVK{tOEEVmŧ# WLkU XeɎXmCREru ?׿bY`3MͥMkV_]N3bѵQ[7}\Fٶ{rd} tg[E.Z9uwͳ0'ޮ^h_zDШ<?K¬,;B=Z0!$A 0ţ0Ф T1ƚBD};Bw^G!1 1Zh!C&,#5RrJ-#r2;(2̂j$qʻQG1r/G[3Ίz;59廊Ml O?2;$ξ%) e2դcO=gKE#0IkN7NGSB%RTU,<$_RX-)R]k=E_+Yֹp5Yi.X 6[ms6ba6\qo7]u_+s\7^y%kw7_}7&l8_Fx' Wф 5ڈ/xb ƸcX?&?jhȇaڐ]lώ?xeh(4s:3!2mhPebv p p)h %")e ziUZÑ=D"$u율>[sٮƺoိ_MNkH"InZo^"CܮEԜuP0"/o}O6Q~i:lCڑr"![hyN4$qL]AS^!* @xjB2B}Y# E~w Z|$06$3!OW0L1i5#pesCXC"Fh<ݱ ;`ݞ70">0 bdaH,4#!DH1"*Fd)!+Rd#ȇAҔ+c- 7Ro(~2A KvO cib-oirq,Ƀ|3泐ܭ|ʄHXVF̚o溴ʧ`0]y7r2xv3 S$1AxFV gnkCM^z[^C @R3eofaDl Q(m4]$"Jq%6Ef @H!0IR^sCzÉNebs E?pN>I0od6}_R$u=ʰd`TX"ֱ.S4@Jc]th6O\R[wyYgRLYhv-H7YB[$-kIS\vnZ d5 \¶m s܍vdVwufU}{|èWbs{V/kWmqa%v'_Kΰ|+LaWUw*>[(^u_rZ|cK Ʒq,hCF2 '^hd*Cjr" [sܞ/|f6W+r弤4#gOQ9'uΝgB~약?DoЏvС-1Eѓ0ImdB}>M7.Ϋ(>x!iX7t%!T<.pBlkZl<'dBr6?mZQ0A$@o?!B}s_$ɩwD]A}s|d:nu#-n ?xpZ+d94l%wNm -!@O H|"֎"_|~7$NB:s.aadAr ϯPo?M7?/߹j9]s]W/n/#q:!T@@Y܃   4lD<Ҿ4A{dAiD$0\,A|AQ ̭B!:B$$B1%$4,(A)>*6+-&BB1C3$@RbC4tÖ+π0;b\_mؿ^Ե^Kޤ"7U'i#ܝVH\u T_w޽c((E _r D ٿ`c^\uZߧn_0_E_^` c_`uBwbZb aMቈ(^Ma#v:%_0 bb ^i`Έի--](߇T6ڽ?Z ܋y&խ}WG9;/^Y:[4d)CnCnQn<_K5DDk&6.Gfvvpa pKJ<'/pWpgHo H p G Jq'K/GWowqpqqIr '#/$H$gr%wrl()G)r*u ; New ButtonAAon mouseUp close this stack go to stack "consult" end mouseUp 0xPT Patients  New ButtonA.on mouseUp go to stack "liste" end mouseUp xNT Liste des patients et recherche  New ButtonA/on mouseUp go to stack "agenda" end mouseUp xPS Rendez-vous  New ButtonA-on mouseUp go to stack "Aide" end mouseUp LyPSAide  New ButtonAon mouseUp answer "MetaDoc a t ralis par Dr. Ghazi CHERIF" & return & " COPYRIGHT Ghazi CHERIF 2005 (R)" end mouseUp yPSA propos de MetaDoc... signature.gif @ GIF89a$/7&HAMWtN"|1b6Y,oEuO)tt;h/aRHCM),Rtg/hmHT6DIrtkettth;ta3gEy6Yh,Rptt;hqRJMbHygIwwZMZwHHtqLpSowwyghzwwwwwwwhh/66HMHtF6E,Z,h"k4hu(6CHHIIEPYHzIHtwwttwwwtthIthߜ;HHQjiwuqtߜH֖I֖YXלt֪wֵ֪n|tfCր|HK,Mm,Ztk`FHWAtHgHRswwhbMZHtIJkwwtthh6֜twww;HYsQvZvw6HAHnZwրtMtdtb]ӸٸߜԺΜߜً֪֪ݿּߑ֑Ӫֿߑ뜿뜿؏߿֜!,@ H*\ȰÇ#"M-%G>"F4d&3q ԦH9V)N;fM|c`]mPHڄ@譌 PGñR :1W̢*PW z ipV8B2e`Xp-'mA.2^ @Y df C/HEI۸s&xj ZFv%$+OF tr8y*̋ Fb@:"#DzjҶDe*,nXR(͵tB3`` $qL0$,xd _   3 ` 2qGD#Hm!iXٰK.6GHl:)D2dm8PkJ֖+i#H4y,h]iRe]}B9ABOfNUb#dhY 5Г." pYmDFH3*%dSefF$.0\[ns&^*X(fCFT.LI6: %́  a\-H3FkS.T 0Qq5P0=4JHi< 0A {^B3L!tt'-g mA)(1$O.Zƀn6&KkUA԰ B>=S6$HH" { LU N9r ) LM@'pCx[$D>U7M8lp-7ܢn.[kw%~G$B<г)SKL_E-ߖC—g"S"#Q^BtnQE1M7U،*LJZbk+7#AdJc.Pt~?r@186 HN@`G, qn( p!<  *g![$C,E2"ʽA`  _V"()FM6HC4p>|@Cf4s<X"|&i4T1"pOX" 'rE,0Ӥ$,uE^iz3XF'4Z<"X!:(!Kc5v 5 8x5gdY -@KC")To1CxЈ@dhRҕ@,!fA^/d!L'L8`Q3"vy5@06iD%操6i[LA]aA| ?щh|N vX,tn)Ctb4 X:!_d 1^Q!! wѳY{q)|[ɷVA2fMx#fiiQ]hRxJvU 5gr xJegH^>)D`Wf馜v}騤jꩨJZ*멕j뭸 +k&6F+V,GvF2k&VZPBTe Va0)zf1A~DGYvahy'iD"(T,"'(y4Aܐ+5ȞmQkqR`y RQfkD6D~] !Ej=F9UHi ը!I.0z rF;/T9C@+]):gxik>[D7bAׂMcsqAd7D9"Ѥ^MQҲ9F%v!n7yR4~e\N% e. ۉS_LHp% := L&H Z̠7z DGH< WBS")l gHCOg5̡w8@ ߒHLMhD%:P H*ZQ$S>0+e`K^$1J&JR=@}$'¾xz7R, d*-.1 sF %l *HBu]DD^hXlNJdi$ImFH:^G,dwy>JK h&`QOL`H)‚ ='Zt" )6՜eF57x /?7{ZpgH>Kϗ)nN{kfVGinц9 *EgAYRPa AJsV$Y08&Dz {w thK fRqηHM;"+?_Q/*1uǪvϯ"CQNzԬ!+RO ףYB|0A M^??%؃H٢{bڦC`%}뢨 QRC]fz)i%+r8ꔓWwS4!~yRRMJ5BA5*W5RQF.r/ g};syTOQu&H0GX~PTQ+'7:8%$"A'wZGwaV8Lc,F R$'estr} @t5Wqޅ%P_A>3qQeh~ZS?!8!k1#2!Trwv1[=X[KPM8d{qu;t[xR _WHpeisO8)vrOOTu9ZKcIt#DoFvLK8{PpE#`¦Wr昊pIuhPY%y42qXvm![g6drY]2=:1džkȊt{(";.HHJo]mqX/Uu0(YL'jqK?KU2|ݦfҀ !b[5-7ґfZU! '!x:c g6uPf,Nw 6'|y9VNrY>%J8n&>u;v m,]9*ֆk-1!J9H9cٓUR-1i0XH9ٚ yٛe9eYd#i6Vib"֙dԙbM+ÝbbYVT+g湞-vd9YyٟYz ;bas.gif @-GIF89a-HtHHHtHHHtHHtHttttHttHtߜHtHttHHHHtߜߜߜ!,-@SH*\ȰÇ#JHŋ3jȱǏ CIIN\ɲ˗0cʜI͛!l!:J:)̀'><@8jʵׯ`-z0 !]u&yՁ@M툾P!@(Xi᷏GT{ٱN QLsӨ%z8PP @/Z:mDϝ]_Ϛ 8iУc;PvPbm۷q/ӫ_>fm\۾Ͽ(D^& ]|3Hم@vHFA^e"TepMZq{X{$hz=Y m`IhY ^JٶdnBnI*$_:] ؋L"ha)l jdj7UUՙ%JbRck矀GCr:l吝6裐F*餔Vj饘f馜v駠*ꨤj꩟ꪬ*무֊'뮼+Dzڪ6`)@VkA0驧)ҎPhyPJّ)t ƋY ) ):B䎙ٝ Y_k-fg>]a S A;Y!@&ܛB_VƼq72$q:lͳ ̍=2WŌ s%i?jm`^w ^whpűlG#jfYeD YwRi$x:~ܷR47[}!U#Jx S0u͞  _Du՞}B]1œnH%/o<|'7G/Wog=Mo${Do{D{%>ou; &b`sAՄ+}eXS@!W^]P=̦'FnJ"v60̔*';ӊҙ )*Nlp(d $B(_ RHp~rZhä )$RdV[3;cyn|efŋh/(x'wilD))[RIQn&#IdQG@w8!][])9g 3)3,n(;Ț[Z6$I I?d"9eg.c_cKh!!0OaOP΍o\z(A!c{Ցg0=VC94T kfXC}hn$n(P:),YoIlai(@3 #vɐ$owI?ZBUNn`o̦ yk4^3ulR#%tR+JJժM !)K75zIj8,$`MZd١upkڂxͫ^׾UR`K5\:H@; barre.gif @&Z1 6GIF89a1HtHHtHtHHHtHtttHtHttHttHHtHHtttHtߜHHߜttH33t3HttHHtt`Ϝ`tHtHHĿHtHHtHttߧ߿ߜߜ!,1@H*\ȰÇ#JHŋ3jȱǏ CI"(S\ɲ˗0cʜI͛8sɳϟ@ JѣHlӧ: իX$?@C؄n5riVk¥w'.p6׽gέ[iOhQBig p UX9XdҠӨS.C Mp$"E! N r58DmBh,q3'ͨIb0r(^~oϿ e߅ Vx=Ԃ 6F(Vhtv ($h(,h~.(4h%x msQb $o]KPCfL ( #u֒{vņm ŵI tIc@Ĕ1\/Ixiw &}:_Cs9 q@+vqu`|\'W@`[rME2$6D)/Pn'¥XRrZU@|m4ܺww)AiA[#.m+/ݫ,l'3G,1?Qg1k׺Iԕv (I e;>!Zn3VkPR4D}@s'<,th)z&9Kؔ PbRԲ YѕO0Jv^MYN w.  [BN C&o* (JҔ%-mGݜ4LXS.da#uǨ 0zn uBh;D:BsU:V @192ns zBBK[邨9 *. Y%yGJzOUnj3Zn!H+&\%NJVhW qُ.ÌX@դ , k!L WB-KA gH8̡@ H"HL&:P4*Z.NQ^ ÈB"d; L(@)*(c !FЬ/E4Lj YF8;G`Gx"\I2FQ`jԕ"ifIbjY,d-kDrAblွdH0i$B5G'qUDRTDVOUh,[88P!j`e6kj|[`6#S? v.ZfAxǒ*㵈~Z *1x&q[h)!z/=q݄ 󧛎!=.Va0ΒKDAʢC#`ӣAIB*QE-]Sfǜs 48^^hh5sNq .68PøJ4IF4`[`(JR eJ*()}uNc' ʉ ,K+ͶYkѮN3e^IZ OӴ44gBId\^EڇLNp Yr~L( /"iOVe]VN #[w%쥝d)M$!@T諸< 25L_E@,'VGPuG}GvI^ Q+S2_ȅĶBdSrLempXβ.{]f L2hNsŬ6p\:xγi;$ New ButtonACon mouseUp close this stack go to stack "metadoc" end mouseUp P6:Retour vers l'cran d'acceuil % New ButtonA*on mouseUp modeless "find" end mouseUp PJ6: Recherche & New ButtonA1on mouseUp go to stack "recettes" end mouseUp P~6:Recettes mensuelles ' New ButtonA1on mouseUp go to stack "formules" end mouseUp P6:Formules courantes ( New ButtonAon mouseUp answer "Voulez-vous crer une nouvelle fiche/patient ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom out create card put the number of this card & "/" & the number of cards into field "numfich" end if end mouseUp P6:Nouveau patient ) New ButtonACon mouseUp if the number of cards > 1 then answer "Voulez-vous supprimer ce patient ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom in delete this card put the number of this card & "/" & the number of cards into field "numfich" end if else answer "Impossible de supprimer ce patient !" end if end mouseUp P6:Supprimer patient * New ButtonA=on mouseUp set cursor to busy save this stack end mouseUp PH6: Enregistrer + New ButtonAon mouseUp visual effect scroll right go to first card put the number of this card & "/" & the number of cards into field "numfich" end mouseUp P~6:Premier patient , New ButtonAon mouseUp visual effect scroll right go to prev card put the number of this card & "/" & the number of cards into field "numfich" end mouseUp P6:Patient prcdent - New ButtonAon mouseUp visual effect scroll left go to next card put the number of this card & "/" & the number of cards into field "numfich" end mouseUp P6:Patient suivant . New ButtonAon mouseUp visual effect scroll left go to last card put the number of this card & "/" & the number of cards into field "numfich" end mouseUp P6:Dernier patient / New ButtonA*on mouseUp ask file "Exporter la fiche de ce patient" with "DATA1.txt" with filter "*.txt" if it is empty then exit mouseup open file it for write repeat with i = 1 to the number of cards write field "etatcivil" of card i & "|" & field "ss" of card i & "|" & field "AMed" of card i & "|" & field "cons" of card i & "|" & field "bio" of card i & "|" & field "radio" of card i & "|" & field "trait" of card i & "|" & field "certif" of card i & "|" & field "demexa" of card i & return & "" to file it end repeat close file it end mouseUp H6:$Exporter le fichier au format texte cREVGeneralscriptChecksum+#z]C X bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelectionchar 498 to 497script

on mouseUp

ask file "Exporter la fiche de ce patient" with "DATA1.txt" with filter "*.txt"

if it is empty then exit mouseup

open file it for write

repeat with i = 1 to the number of cards

write field "etatcivil" of card i & "|" & field "ss" of card i & "|" & field "AMed" of card i & "|" & field "cons" of card i & "|" & field "bio" of card i & "|" & field "radio" of card i & "|" & field "trait" of card i & "|" & field "certif" of card i & "|" & field "demexa" of card i & return & "§" to file it

end repeat

close file it

end mouseUp

0 New ButtonAon mouseUp -- find the text file with your addresses answer file "Slctionnez le fichier importer :" of type text if it is empty then exit mouseUp else put it into fileName end if set itemDelimiter to "|" -- each "item" is separated from the next by a tab open file fileName repeat forever read from file fileName until return & "" -- read just one line from the file put it into newLine if it is empty then exit repeat -- quit reading at the end of the file create card -- create a new card, naturally -- Adapt this to match the order of fields in your file put item 1 of newLine into field "etatcivil" put item 2 of newLine into field "ss" put item 3 of newLine into field "AMed" put item 4 of newLine into field "cons" put item 5 of newLine into field "bio" put item 6 of newLine into field "radio" put item 7 of newLine into field "trait" put item 8 of newline into field "certif" put item 9 of newLine into field "demexa" -- this saves the person's birthday and such in the "Notes" field. end repeat close file fileName -- you've finished with it end mouseUp |6:Importer des fiches cREVGeneralscriptChecksum~!1ɴiJ0N/ bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelectionchar 993 to 992scriptK

on mouseUp

-- find the text file with your addresses

answer file "Sélctionnez le fichier à importer :" of type text

if it is empty then

exit mouseUp

else

put it into fileName

end if

set itemDelimiter to "|"

-- each "item" is separated from the next by a tab

open file fileName

repeat forever

read from file fileName until return & "§"

-- read just one line from the file

put it into newLine

if it is empty then exit repeat

-- quit reading at the end of the file

create card

-- create a new card, naturally

-- Adapt this to match the order of fields in your file

put item 1 of newLine into field "etatcivil"

put item 2 of newLine into field "ss"

put item 3 of newLine into field "AMed"

put item 4 of newLine into field "cons"

put item 5 of newLine into field "bio"

put item 6 of newLine into field "radio"

put item 7 of newLine into field "trait"

put item 8 of newline into field "certif"

put item 9 of newLine into field "demexa"

-- this saves the person's birthday and such in the "Notes" field.

end repeat

close file fileName -- you've finished with it

end mouseUp

1 New ButtonAon mouseUp ask file "Exporter la fiche de ce patient" with "FICH1.txt" with filter "*.txt" if it is empty then exit mouseup open file it for write write field "etatcivil" & return & field "AMed" & return & field "ss" & return & field "cons" & return & field "bio" & return & field "radio" & return & field "trait" & return & field "certif" & return & field "demexa" to file it close file it end mouseUp 6: Exporter la fiche de ce patient cREVGeneralscriptChecksum$\hPY bookmarks handlerListmouseUpscriptSelectionchar 213 to 212 prevHandlermouseUp tempScriptscript

on mouseUp

ask file "Exporter la fiche de ce patient" with "FICH1.txt" with filter "*.txt"

if it is empty then exit mouseup

open file it for write

write field "etatcivil" & return & field "AMed" & return & field "ss" & return & field "cons" & return & field "bio" & return & field "radio" & return & field "trait" & return & field "certif" & return & field "demexa" to file it

close file it

end mouseUp

2 New ButtonAKon mouseUp set the textstyle of the selectedtext to "plain" end mouseUp P8dNormal 3 New ButtonAJon mouseUp set the textstyle of the selectedtext to "bold" end mouseUp PTdGras 4 New ButtonALon mouseUp set the textstyle of the selectedtext to "italic" end mouseUp Pnd Italique 5 New ButtonAOon mouseUp set the textstyle of the selectedtext to "underline" end mouseUp Pd Soulign 6 New ButtonAOon mouseUp set the textstyle of the selectedtext to "strikeout" end mouseUp PdBarr 7 New ButtonAIon mouseUp set the textstyle of the selectedtext to "box" end mouseUp PdEncadr 8 New ButtonAGon mouseUp set the textcolor of selectedtext to "black" end mouseUp P&f(Noir 9 New ButtonAEon mouseUp set the textcolor of selectedtext to "red" end mouseUp PJf(Rouge : New ButtonAGon mouseUp set the textcolor of selectedtext to "green" end mouseUp Pnf(Vert ; New ButtonAFon mouseUp set the textcolor of selectedtext to "blue" end mouseUp Pf(Bleu < New ButtonAon mouseUp undo end mouseUp PdAnnuler = New ButtonAon mouseUp cut end mouseUp Pd(Couper > New ButtonAon mouseUp copy end mouseUp PJd"Copier ? New ButtonA on mouseUp paste end mouseUp PxdColler @ New ButtonA/on mouseUp go to stack "agenda" end mouseUp P Rendez-vous A New ButtonA.on mouseUp go to stack "liste" end mouseUp PListe des patients numfich   1/2 ddate   mercredi 4 janvier 2006 Copy(`@ H  Ostosynthse   `@Hmen.gif @jSGIF89aSHtHttHHtHHHttߜH߿ttHtHtHtt߿ߜߜߜߜ!,S@EH*\ !JL8БAć,h< "i`$͛`\yϟ@*<#ѣH @eڔ@NI `Ht)V"q&ɖ 'ҫU LpOI9V %k )t,JuG.~Yc3#.Jqbn̐kMnVM$R}(j*5ΣK}UKԌ=b!uYXC lfLn}{M]r%byƑG@nm֙x3w1P\'D@g'[Ee7LlyjE'"T}_5";biblio pon mouseUp put the selectedtext of me into field "copy" select the text of field "copy" copy end mouseUp h*Bibliothque de "jargon"(Antcdants mdicaux HTA Diabte Notion d'atopie Asthme Infarctus du myocarde (Antcdants chirurgicaux Appendicectomie Cholesystectomie Ostosynthse (Antcdants gynco-obsttricaux G P DDR Cycles Grossesse (Vaccinations SAT - VAT Grippe BCG DTPC Rappel Hpatite B (Habitudes Tabagisme Alcool (Motifs et signes fonctionnels Cphale Fivre Syndrome grippal Douleur Bilan d'HTA Contrle de routine (Signes cliniques TA : Pouls : Poids : Taille : BMI : A l'auscultation Rles Souffles (Actes Vaccination Nbulisation Injection Suture (Diagnostics Angine Bronchite Grippe (Biologie Glycmie Ure ECBU Crat NFS VS CRP (Radio Echographie Scanner Rx de thorax IRM   New ButtonA/on mouseUp go to stack "listes" end mouseUp Ph$Editer le jargon onglet1a onglet1.gif @ 6;GIF89aHtHHtHttHtHHtHHtttHHHtttHHHttHHHttttHttHHtHHtHHttߜHߜt߿ttHttHHtHHttttttHttHttߜ߿߿߿ߜߜ߿߿ߜ߿߿ߜ!,@H*\ȰÇ#JHŋ3jȱǏ CIINVRaK$YĪ/k &œ<3QC9#P*ՅM $15 Zq\*PZC ö+څ- {` #>~zS]7-(5QJ˱0a $++F&xbfu7 "ovm:膖*^O#|`kr|o]+,+Oӫ__\,˟O}ǫϿ\~h&.F(;5fQv!K@e{%(bK5瑅=(4_N)8h@)$OQ/L6x>iNvHtY\vGdDT}ĕZ}rnIldbQ$fz*3"IQW>%ZiY.\Wd( n)^۝s 9&Qh)꧐BBMEQzd_k,AAKAZRl(K۵+gl g\[k+tN;շVekl_I.K'LY  耽Y-!ٱA,sP5u 1 " U[TO\1 A1P Qٰq<¬C1UrV̒R VLtCFotL,A^P аy]o4@Ƌ.T_һUB6v֭xPqO*G.ˍ9ѓtb뗷JJ(0e!l3#ٺq~jy_% 7$]W^kG3_F-ɗT_'!a/rھ{˥olR쒧ՊJM 4I帇;d! q$6,P ĠW@U#\o\xgBJkjX6 t0 HL"GP& +0'遯ydI2t2LP1n\_S&;%D q+"x>q"` g:STڇ7E2$I;wt(=)\k}s 4Op\JT).dDm/&,7 ~㊥ŴBe2O+Gj>ę6H 8KTКL:'Ms~<(lF 'I,YFџY pd ]d;.N ɳ4~IUIܸFRf<*NNP8i9w;ZDSPE҅6i=*83N-U&*`M N}]:E׀`Z)Qw0ne:늩kIm)KTJӒlW'^8ފH$ȥ9t$UDΊH=To-+27KJDYbU+K9`R25.|It JhH-ƎKلYvis{rmMs`z_N]NXׄ<{ ip7'%|m_qN/W5$xc^5[7^5TEQoSHIZ-=T>\Uyu^n_yd+qZJ3/Z,|7}|/d "䱿_{>Bhk5~zg~Grr}6s GT2%{xV9FF s$!`M5@kWrByYUf:KZQ5J_tBxA_H؄'N8gyRHg=TXH+D|{NY}"Ru^dR6hZVA($!4$d8b؀h?wxx5:f{U?wWP8xo8xO0GĆW;(| !I'MAP(9` E0MGts71w{+%L=\xsEvj؋$3|4ȍxX8([H>[i{$[yh?zcCx8V(UYU'K8Z{LJ %?~[QULEVZ16yxZɗ*Ixa9c1y{g$8HE{KPZU\XuZVX]VŏKRO!F _ژe9[YnÑߙWzIKxd, 'ַxґX, J}\[t!I>\~8|މ8CW{  cQ~)ٚ#چ縞)ڋ-d/:I(4zi8q<j@:IFzH+;bűKN RZVTz<1Zڥ^JcTdR,b"dijOaqeœrCqecz:93Gڤ$Up6jXpSfm$B ԓ&ml[(*gzZ'[P(nKl_j֦z%6jt"x.&ꪔ ?džf{Rs.0I҆Zm}(ʮeHD&Y=Ьx&9Zժ'DV : ڊ? (Dڨک ^pAg!Ϊp˦(kk6j꺨Z!E-zp!hpt8S+Ɔ^TaN@O:QN۵t.Ƶs@۪ڭzojHT- ?oIkKZ^˶AIheͶ k!0YK6qGUhۆg WW{洡E趣MdblwkoѺ6Dkk4묩縣Px}83\[urz:S [7x6[) >Z;QۿHz< &|⧳ׅ E\|8: N<$\&|(* z!2<4\6|8; 틢 @L!2_yNe(=MD$hs]D BFhH,FL]%["F/d'jj8+:˕%P' 9mm{Ea]s0u~,,dșh|l,b?e(QD5k%prdžcXmFz}׈hxiz ^ˣoD ZlK9٘:;-q-8@ 3?W ]lG =^ՂU3|-@#amQ%`xO7=o1Xyhq5Yׂ=֞\֍&]bf?T3M#Č\πVvIBWpx(ڟܦW1%C80.ma& ծ;.5Է4ԝuMuڙTTӳlȭEҭͥߪI<+P }ѴFԼ-Hf+eI \IГԈ%Nu;=^u?.AE^tCKGNIOQ^:#b}X *mc#&*t )ݝ7 Ҋ >MSN &>W|0 Y}@2Mqy]dI6~> KoZ}3t>v@`.`bNZ~P%GYrMJ '#ŎK~sp"]Z<7(XK[Oba!N9D-5ia "\ٻ=鹞S:j)(Y8Պ g 4;=3-p ~K^~:_2*?pT=nJD>}>/N6Q:6Nu՜[#!ECnH*.R&jDqAsηp!.2ˮ]t&/h~9S3U/G9r磙BO?9 ]1 RA\蔏ݧHkLq[!&n1nԠɟS/o0@)T:__ɖx.QGlNBX/Nrnd@@DP„:dQbÉ-^ĘQF=~RH%MDRJ-]2tXP%D+ięSN=}TP%cJI2)AK>UTU^ӐNc̺"D)j<c l06Y# Kn`(kqY;nYa;uld)lVKfX^ms̈aA]1HӲn=(/ mB褫u<9ō'/>hZqg^=xl q\~)%N$: bK S9Z;hB2kC)[a> ,ÁC68d-r1Ņd[@!$"dI'#QЦ(2K-r)OѸ +4+1θ3;3 L22,"c77s`;L)3 #OEC C>A)M$,4)L$Cr#֖0Ӕ=Թ֜[ R(=/;˽(cleV:5V%-qZdKW58idX9ԖEMqqү}/ MKĮ5Ѕ!ssA-+CuW#~gm0[}6sO:9R=w|wlNvVeOJCͣk?Cn (({mfkfG//4ԣ{]ka0Yo&@Pvn"k1.[`f;q$hQ?/>Ր4?س8 [VQ8# L7(@1 T  K?+ l82@뗵pA*BA3j?S@<zh\94(;q0IK@PAԛ!40B+Ds3c"5 7k"D[z8,>l&?|C6$C)DD*CcIJZDF B+JKLMNOŊ""RQ4TTżBUtWԍVYeZ\Ce^_a `$cDFddafFU|hƜjFlƗnǃp$GrD{:tdGwZGvG+[*8yG!B2Fj~ǁGLDw9HdHJ+xGSኇ&4| ȎÛ"*\H4ɪɄtɫ 8H|ɚTR?m7"+-AM($eMiRHT'FMSI}$BSC&0nD1$[ k1j 8ѲPT3 9ȺYBMURUSE& b5樰nu:NܱBָ;Eَq]9x(0mmS.]J,>V+NQrENq΃e ye,]hPOюSSc+a -V[(1[6٤Pe"EmZLJ TKW䨀"UZuK@=f[!8-[{[XT*QZ͚@eu5O8θUX}\а[ӟuEV. )cPZ[} -}P]Ru*T!R ĥ' ]읍ȵK\٭E xY1 Sߓ]t[^^ܻ5۞_dli=^Sӌ_h b([Ym`f\:[HMʁCt9ZeyQYԋ ։'//R+a][ '!I_lc 1hhAb5M$a'a}3Q4b+}W}b%߫`;~b3CqU XR]~90&wbKYxU#,֔.fVDv1fbmdNnKD Q^P>e$e4VvTV` ^Y΍WNMP' :GelEFWeU_]ViZbe>:X=)n=]>zNڈW#TOc'eNkydTe !~%uBY/&h 6h[㌖J_>h{>e[iiVUFiɕ鎦鞴霶ɝNf隆iei2j`>ɥgv.閞jj&:XjUg:dgUjCIkEVR,ngOVktj\PLy¶MzB깴jlaXυ+2'=15VY^SeOFfjou:gǐκRЙpkm"nVVe6inr1۞+8 m!;Uyq(FkcpZnle Vޖ-✅Q`]mNnoR챮Bo5^oyNRD7gȭcf!nEeT: q 'p>n|Q?fMFpZG{zq`oQ1\lm.pVfdHb#owp )4Ao\rCn5NDqfw0DXJkw JhkElp9w T.dE/E0˜֨tS%wsC?=ju "h2U9nB_%Po.bR/U/Tq~W#*8W읁!uIoIcr@V(>BOoֲP׏/ZpeU֖m>rjnfnWxDm|Qq/iUt_wuUfyѶnlMzIx|mv&yym}s(umt}Y}-nogXo}gXnWgu w@/o?o0, "R*0BR 6LB1 '&H"GpăA.dJ 3n $J!3 ŕ G/  f*֬Zr+ذbǒ-k,ڴjמe-W ʅ[nVvYoWL0Ċ3n1ȄFQ.|k왫 C.m4ԪW.jyle6ܺwY|go9ҧ?853iikW۝:Ǔ/OD1'{ӯo>r? 8 k^^ :`x bAx!j!q8"%x]N("1'_U(#9c~*֨\< 9$ENޏi$M:$!$HQzPk] WZeMDDUb"VaZ%M藍VxQq[VJRt0fV_VmKf9^uxe uYE q{VP,QH}BnAG9E#@4RI) ҩRPm+LR9*Qh&*:z%)B%IzN+SUR!<$GO@!+d ;R*C4R0L+-\Y T &W]YGP t"ZV#/1Q¡PܮAH1sJH`>qSFuJC,GI*,H4\QgM>t}N`mI}yHtF۩7 y+mowߌK>9 "yߓV9睟8|k~09fdy,[I逹φz~t.zK,^"dfshbiseqC<%@O%5\EJ֑O[Rkӟ~;,*+|/oZ<rֳWJ2镅zZKB_+0P|:f$ B!M֮~ b!ؠf0y/l%  KvZ[(s3vų $ Z0a2Y 3xL@x Y*cu,a%OoG8V{(pq,[MV<[N↵U #mخM O +=’$m{^Ͱll%Hhm#$B 헲3')M]z^\dJ7 NO%rɢe)&: pe}S'<)#vŝ'>Y"z~ŞC ϸ$Fi1>@Wfυ>^g.=MK Q8+ݝ&^0;NJziOR1IiVhڒD~o}>HFhJ>egT] _O[U)хv4.æ_:TtŰ8eTbBP&|*P"Y%fLqWƬP8dưpsV#U)__bDLo#K1FGr.dLՅ!!]1|mWmߺK֭je&nRR1Er.s 6@ҷRmܦ5gBwPfnvj3v`#)IIXVP-vU5"5)ݒje9Ͽ& {~\(0%}1g$LQp}t;d1'\G%HTꘐ.F'+ 5jNStM7""Y8eje 򂇌YؑkۺƵ+seBW|u f3H`13ۼ7'$]2Hrkyֳy/bG,䙛MN kprgLzus]3Ͼ6)boz~6\M]Ѿf[޾?:o˭[^71nb3𼫭{{-p^uwp?#Ϻ<~3T\OC>i;5"?$)q.p򈾼x?m\h̽=b8'-s3B˰Λ.d}Vpկg}^7. w}fxϮvɖ}nKf.}vtn}~y.x\}\%~V/y8E~gR/y!-}=r.]]x6^PrN۹UN:v0gASYPjh'W0h:lp7XKxmߊv<ݨ`Տi0 ɤ qwwҧ6;TA a|!c`gV\r'XJbp%YXy}Uk)xaKHI$W# H#O6ިqƣF9($4H&L6PFdYQViXf\ 5e5^)}[} [T?Llf,HgmzVUTEZa ki' q A9^~VWm߁)ꨤ:ꗦꪬ 무j뭸"%kzk&6FVk>Kmvn k(fd*h9i{Y֝y.V/lݠx:мr" (~00'pyioo}JP_,2l(*01lؖ<,>-LH'm*J7?2 TW k޵ob\dpW#D6c]ql.q}/օ gvŚQj8cwў. iN?mzꬷ.;̰n"׎w{-j6j{w_ y#(k]TgpOAgF {췟/,o  `'F<h2 d˘֔2SMMy# BQb!EP3"ꯇ@ ~("q(D<X 2=t"@)R"?-r"dO%0y3 JRbL4HD3ͅ(Sh4w͸l3f\eBA.ijW gBρ0"yd/R@Ne$HrJ9@*  :N@tEuQ$ q B$" rBDFS$L n@ S1lžz L]~+hQjܔ\w^Uf'EO̭uE}$ΐU**,Ԃ6o1Vֈ2pjzX`G_-`tTѴxyNJ=zu,dGتty=l| hb&T:%mgԹ=@3r&ڂ|T f5H֔^SRZnpE3;Xջ'YMVVCOqKպ|Kͯ~LN;8ES'L%Ŝ 0Ec O'<2U1-)Sײ2 --s23'/sI:a1Q3CD|*(-ӑ2`WAl}@uˊ,!GvRgɹӠkCM}ԨթSj-հcMfָ?fjZHIs=ѹ %gYIst]<4ג: 3hoϊs*~LiFFib~M.OHOk!~a5g2/rlOsO[Σn븶lii/98w9Ї,:9ҏN9ԣ[䓸Q [_#r[&.HǢfWJuY;'~/8߆?|xb3IrUօl׵>wŊ捷COѓ֦?=SzT~=A-ùG3'u=^tmqxoSYo [Hܣl7{_W6:[BrS&/3mUFULi%!\TVN["reNuŁY8y̴KeX$c#hNug%(6!\5HQ3^Ioj"yeJ#d~`uYOYaXL8x[hTpUh1jJI-kXThJ[dXra P\!B8;hpUȃW}Uh8E!'N8v @1:'@s(SaXx>PB磉"m )Q}Ńvb좋nbc2ԌOHUcU哂d[TS0wyp\T́l]xQވVEuXUXB.ELgmq8CbHYbX^( rQ )w>18 cqbcŒ yxؒ&)&YNaӓL2R]"a7+C;$34Q?UIW%H:}^#B^~badYzVUr3 k ! TzEbvhG9mrZl\U cUiHF|y}w LyIٚ)I9TH)H~©GY_tȹEʹWԜYlikY n aa{y !3>YITu۱鞄)aQ71^љX U7q zEKڡ| w":W&Zx(,x.2kZt8E4ՙ磝AYq 1 Pq !ة:1q_A 1e' HUaz )S@Pf:cn4TxwX+8U?ԣjZFz{שJf3*+fHo-|),j9@w?Qaqo3*õb&Jۣ(ʭ B3G(/^+$uj\ʙ1Ḟ]Jƌ!fv)60Nڑ!1ˌ6҃ʥ̇6BRC |'rijd16\M$2k qi('ԊT i *k5B fn;,+vZ[y0ғGI ʈh[ tY*N-`MSճQMT7*]Cvq8yW46y  2kR yjyF(QuVb Nj&}$Y(GhgGXR_yZѧِl|#Bgmy&o2Z8igۭ}cfF ZXvSSJ韞|_MLp'݃f7r]juU#iY/y]gWݷ]+˅gb}{\R~P#"}%[ nLΕT<4 *4N?%#'%.+N/n27ۺ{:+<@N9>#F>+HVyL2b!OHlX S.lSL>pE2fmN؈Bfފnxpцs=f~qyQRUZ-!"rR ף mf"+"HȄG6~(ޢ]9P y;)y c(iNa^2U+wצ]e]E!YuZ%RȎ^HU®X>ގ>DK~jH(dN>+G梁:_? ;Ff4 "?V&?2B,O$(2_J8 Q[U~W\Q/^a 1\uNMHӤy~P%vacyq<}YIn zo`ន5xk? 2v7IrpΏ |rXmT`.*pn[dUxV>_۸eT\A^llx[z5)]V.fPRM?8濠R?D7: _vf!D@ DPB >QD-^ĘQF=~!$EDRJ-]SL5mF4i0M=}TPEI0QM>UT< ZUV]~d֬b͞EVZ,ɶW\uþW^}~W`… |XbƍLXdʕ-,yYfΝGZhbAFZjY[G׳mƝ[ifݽ}f]p 7\nP  *0]!v+$buwȽy T?}A `_ke@ t+` p /@ 14$ CjԿH1F.y+PT1-qi^W?yo&iZе>I*Oy u] pZU D~䔅r ZGV$d coulϰUcp[؊/8K^OzC eP^>$N/v1`4<>l\9h,ih9!TBLgr?}9g@P4-4hB/P6TuuhDЊTJ9ub*<$=RA$zK1hd?"H?@Ra2" ऍ=0#iJ:h;PlIG\V49ȆBJՔB-gԫ-U"'kՎ]S5t^(M>5IfV?ꗁnDl@L`ZcY d4㎌2K%/2i#j[ o \ qO.מu<]wNu͙]튓wMך54ћ^gt{_ }Kז,`W4M` !I F-rZ!=<R!5@At 'J<Wd1Q&5N╝>)U/$XDBveW}| G(-%<_lzXVHSMS(4u[Du*t]h_5z64$ ]iIҕv1Kowt 5j炚Ա3[jUխ>ݫa=:Ysupו7ja4vܱ]I褔Vj$=Z駠*j2iꪬYBrꬴj*򔫤w&lEâF+6++Rܮj+..kTƻ ''IpE.JB!5GC2)Q'!BHRLN!BPIIHZɁȱlف pƋ9 J~l-LPZR!1!4MEՔ(VZs)y2R6?ֲXDcs2 vӖdfo O<-\/}Α *+öQ;,SΉτA b Ѐހ ?5dS*Cn6pAUeiMfԛLcT-T΀M{&Uz` XJֲhMZ V?p\J׺xͫ^׾5`GB(-qM`#RXp6UO3O=6zXwfB[}MiE{B-lg;*-nw 5Vy |{< `kI΍+꞉ͮ3w]M{=L.|7o ؛H \" /L'&MpFxi0G, $NRLYʪ1gA4αl{cq{q ˸3>2_%N1)S9V򄳬s2,1f/<5n~sz,ҹݽ3DE1MbRVq@,1X,F_@˞~1./ U}Obz2HUU5%>jbgac}N=jFG3t'Hm =7`"g,ȡⶁLbnPYQ0}Jh\* o3G+t+#Eh)Q1HJ h&fȑ*ҧ> ӓ~{ ZǡN(;'5i?7Wwu$S?5fځ}d~~/W)gt @ |1} {'|]Sfw2P'vASqS1 X}~*bm%G'?H9&AXFJH60$jb6='E1Sh%UȄ.DlrkZd\؅@WdXfxhjl؆npvG+Uk3$2mԆEmO''5YK8dE#h:޵YHgZ؉XZ8U(dFd]8U(X4C*BXs>ʸӌx>3=xؓ8=؍<8S;蘎H;:Xs:ӏh938y y8 ِ79wS)7l <""$96&y\* =!-/`13)5)7c9Ɍ;a=>,)D3H=FmKMUOI=J98SV)3X,\2^(Huhg jh)oIK~>T+8:q 8[!7VArQFܾ+X"vk$IP+6Zhs(7&jFہ0~ù{egRGEhLĊ !* Je0SR[ƴ}|)nLuׯN g;l#e\O I|" ܻ6'GlGǕd?||S|^,  HLgf\ɘĞ \ûé£< ʦJh$ZlL%G% +::% ̘lJ<㌧+݌ƃ̩\Ι-K yϱSL-]ж8CDoФuDC}MѣmB TD8Zå,.02=jĄH~K& ,}:v3A-D7G MO-ʠT4x`K^M29րRfm)i]k}bSur,h}υz}t-v׿ׂ&]׈؉ْ͍=]ICٚ M֜rؤ]^ ק=nڣ4ړ b-۠ڶ͚ۯۼ-͓٩]͢]ھΖGbml]B]_ /*m޵n=ߛ#m߃]*߂ݎ ຍ8Mm ),^)Dނ (>Q&~9"∂,Ψ+g25,.%E@>CB~RJEP^&;>vxm!ZX]R>8dX gNfkn\tv~䙮~>㣞^.⭞n>ᷞn.Nɮn>Ӟn.۾ݎ^.~>n.~N_/ _//o?!#%O')+/-/o1357_9/;=?ACϤyzzHOJܝR?_U|u@H`[?6_oK^j_'EoOq/`4}=BN.'$iP?1h=Wm)y[l0VTKjy ™O +Eʍ{<۽!J+›t ջ [Ŀ{_RԪ OƩÆFL}|"\`q빧͖۴yh̉`@ DPB >@;(FX0=~RH%MDRJ-]@L5męSN=}:dGD&< SRM>UTU^5QZ~VXe͞E+Gk'W\u[t$סnX`…mwoPƍ?Ydʕ-_ƜYfΝ=@JņMFZj_K[lڵQ[n޽}\pō[\r͝?]tձ; cons(Hdddddd@4~  0=============================================== mercredi 8 juin 2005 11:36 PM Fivre Bilan d'HTA TA : Pouls : Poids : Taille : A l'auscultation, Rles --- > Suture  @blue Diagnostic : Angine  0=============================================== lundi 6 juin 2005 12:28 PM  `@~ New ButtonAon mouseUp put return & "===============================================" & return & the long system date && "" && the short system time after field "cons" end mouseUp P*P$,Cliquez ici pour commencer une consultation  New ButtonAon mouseUp show group "onglet1" hide group "onglet2" hide group "onglet3" hide group "onglet4" hide group "onglet5" hide group "onglet6" end mouseUp @F  New ButtonAon mouseUp show group "onglet2" hide group "onglet1" hide group "onglet3" hide group "onglet4" hide group "onglet5" hide group "onglet6" end mouseUp @bX  New ButtonAon mouseUp hide group "onglet1" hide group "onglet2" hide group "onglet3" show group "onglet4" hide group "onglet5" hide group "onglet6" end mouseUp @$ ! New ButtonAon mouseUp show group "onglet5" hide group "onglet1" hide group "onglet2" hide group "onglet3" hide group "onglet4" hide group "onglet6" end mouseUp @T " New ButtonAon mouseUp hide group "onglet1" hide group "onglet2" hide group "onglet3" hide group "onglet4" hide group "onglet5" show group "onglet6" end mouseUp @0 Ponglet4a onglet4.gif @ jGIF89aHtHHtHHtHHtHttHHHtttttHHHttHttttHttHHtHHtߜH߿ttHttHHtHHtHtHtHt߿ߜߜ߿ߜ߿ߜ!,@{H*\ȰÇ#JHŋ3jȱǏ CIɇNjLiʗ.|I7k)fN}JO9[ N{(hթ&40510>d+.sj(blXVkn'j 4k`FUvw/K-,A?F40|l[N_߼Oeլ=8jX'lݵCe LKBrbL-c~w aå}~XӫOlquug$V ]\t]jWkvTcIԃgYcfxzQ8o9`WֆuXPYEw7] fXZiX#x ff:tDSpVZ@m`6e+}HhTQip)ti6Ԟ|矀*蠄j衈&袌6裐F*餔Vj饘f馂'5u稤jꩨ*SQlbꬴj뭸l*G>k챣,C2KB]y# AC_Qvв^DSvP].VYUL]ۃh|MqVPJ)l{PFlG,Ϛb\wYn 5 (2+,4+\<7?mH8 PG-5SgE/}Ms-d{`;]l tm7p:w@3an|ǝG^2=g9c8̛.W zzSެ.ݮNNvr߮Cͻo<:7|<Wo}g{K}c'G{Vٞu@ƭ#'X[qXtEEAWk0@'H Z̠-HَakrGŽ/u+ WH2/, UBo8ajBvᯀH"I3%}pLiDMX,鞘,zbz2%N#6ΆěHG%V{ụxC=|@Ƒdy>A&+4 II{̤.HMzr?IqLeNBU2w%&QZUy]h^#0ea3.\2R|45iwLqXxq@iDX:eN: o\1)"s+q_ 40D;Rl~(G uBaDgTLGB}B2dZI @7YO~Q|5Ӓ館T} L=AVpT4YPԥ=gT"Em|ӦLhW13UT+!@Ж~O72u~Xa ze)[֨,'r/\Z^!E7@aGX4 'f) t̪ϙ򔳝 ;iIxжimᨹbe]0(7j(wy-&'nnmK#r,u׺+ykE [Nih8S!u`=h/l7W<0` ~w2~(ݯJr^cK&4/'4 S>07q; [ -AI .C~>d:J^kȴ1=U= ;GN'fE?rVbv8Y}]lP܀ ;eu{. @MA_mu0_1?-:Fg۵ T}}mB :ezߏJC״*<~3mУ7`ՋֵkG/=zUjղ0%?ݿdEW IV}] HX|{71"xWR}ɧEP!GuW@ g7gx^E}ww{qCMg*ѥN 6+7eA(Cԅ8VVtT":<y/ׅ^p`NV\HyRf`%>c(mhqKFspc Æybekp;wD~H͓o.LX]y|;V%~Vhr@gu-UO WJ!Y:9 geR#e-3RVujk8Cъ5Xph'LDqԈbx"a؍Ha8Vvtv F@{4UDHCWL)ENhXR T9W9Yyn[y]ik_ɕ6dAacy06Yk NaY^)D:aX?RT!h"rjɁ$cpq`X!XOI/5iX:HjGJ Ij<Zs Zڒ` m#!ʎ'Ji+JJ2k%Zl5I4<[)ڃ?JG>:Vh?KzhN\[,LK{ \N!i,},"D{O9x-UV @wsY|+PIX?GĜ^>%@u=LɃ\7|Ɔ#wv7kx><A7,<Èĭ c" ɽX ˮ Q[p[U 7˰\˿ \Ʋ7|Hd ḱ ڀгeگ0w#ڤbY8sNL'cF۵,wmM٭E9ԍEzҍE-&ݛ#]=) qН-Jgp8i*:jߚ*5ࠄ%|.:$|}gNBb9~(n:*-n0Wdb3/.>9';exU?nAe~.f.m?izYmn3z^2H8k>,ZT,N*dN:Z4~|j>;>ά؞GS.ю>~W֭gw~#+^r^7_"t6k?t 5"/5!_H(4' * 2o4-_7N8a:>_37FMG3H_g@+NkM(T_V01Zo6\-f )d_cjilpcb/soBryy^)3l_?O3K_Io_桯2_6qx1_Byofs/OoOq8^>Y6?m~tSCjox ^h_-xN"(=`F;c4(aŋ9z̈Ab#Ƈ `H#K4!Fd̙){YhJK>UTU^ŚUV]~VXe͞TԦOJ}k5S7%D |[߼&H*p`F񊔸H,K90p̫-Z֭][lڵm߾v{/V໚F>hx <{RJџ>֛Řy\Gnzݿ_|֧?T6#7-'CJ92" Nc8l.2#ȻL(!Hx/EWdE_\>1+:Fn1H!$H#]QK5 ؀J+2RL3D3M\E&"S-N;DM7T+-N@%PC6$'G4RI'RK/4SASO?e-Q2LPOE5UUWOTUYgV[rշXW_\1"`E6Yeb\6ZifZm)7[E\sE}t߅7^mu\y7^]^}8`B_F8a3 _8bX/8V[F59d[]vGF9e*YWwW9feO9g3nfw:h{gFZ^KMi]⧧zޚfjV6ꟹ;U6Zl>fm@vmn;*.Xo'1^ g@7k'6+Bj%D!NBvj-J78y.7L qC5鐇?,8+ G4 )Ol8EHW|ΆbE15d4cςF5W3ĜF:" cڰ9H)#d"x6Y<<0 19HMnjc%IR̐Z)U0y u[ZGJҖD%"oґe){aZ.&1c&2|&L*n N Mnvӛg89NrӜDg:չNvӝ,$IMznŕ'O~沟$@:PԠE ; Cbio(kdddddd@8d   mai 2005 juin 2005 Urmie 23 mol/l 50 mol/l Glycmie 1 g/l 2 g/l   mai juin juillet Urmie 12 mol/l Hb  D`@Ea@8z Fradio(hpppppp@:  Scanner (mai 2005) : RAS $Echographie : Balonnement abdominal  Scanner  G`@K New ButtonAon mouseUp show group "onglet1" hide group "onglet2" hide group "onglet3" hide group "onglet4" hide group "onglet5" hide group "onglet6" end mouseUp @H L New ButtonAon mouseUp hide group "onglet1" show group "onglet2" hide group "onglet3" hide group "onglet4" hide group "onglet5" hide group "onglet6" end mouseUp @`X M New ButtonAon mouseUp hide group "onglet1" hide group "onglet2" show group "onglet3" hide group "onglet4" hide group "onglet5" hide group "onglet6" end mouseUp @d N New ButtonAon mouseUp show group "onglet5" hide group "onglet1" hide group "onglet2" hide group "onglet3" hide group "onglet4" hide group "onglet6" end mouseUp @V O New ButtonAon mouseUp hide group "onglet1" hide group "onglet2" hide group "onglet3" hide group "onglet4" hide group "onglet5" show group "onglet6" end mouseUp @. vonglet5a onglet5.gif @ +JGIF89aHtHHtHHtHHtHHtttHHHtttttHHHtHtttttHttHHtHHtHHttߜH߿ttHttHHtHHtttHtHtt߿ߜߜ߿ߜ߿߿ߜ!,@H*\ȰÇ#JHŋ3jȱǏ CIɈNbLʓ. |Í7k 28%eX{G?MOK   |[e>_R]A<4~NSBrnuc@\|LHj-d< 4 .S3ՒA)1-K7VץpX̢H-z`]ƹLeT7F1$2 Cl,rA5eja;J1K! ce-X`$(*12׫0pLV TJi.|  Ot%F&rbQ_o|E2JmɼԘV^Df2J fe3lk"b8s`aGpGL;)N|ӝ\0Yy6ӛ=z2nИ B#1SYHQ5Fs (#; .V!!IL]&}dA"eJ4|iI?Zӛ':ULf̓1((BT(IiP6uSU9zE r3&*NRSL_~CbUj][:tY)1C$UQZ7M6Q~ +Rg%*5t8+16,XZU*}C1[BRZ5S]\u_\Ik]Y9GYͮvz xKMuu|KI~ ɓ&nLgAPx-O"P6it1I Xc|_Mp#9H9$lub/64œ7VP(gjDPv0`*x.#$mCx9DJh|:֛ZN*ESvVgCYtn\[[:6CҖ"$6/ Vky8a.0QR͵6 [m{Jý&@zy|]Z F5ZYGjؙCEE"rѪ]CL!NoM=.]ӣy~Z@ܲx5M~dٕ; P$Ʒo EhEd֕DbB8E5Jv+vB=VHWD>,B S?:کTvv9i\$,a{\o{I QϾ݁k '$ۡB:(_\>4|.U܂S^KOy/hz󔁲_krԛ]zn 7']ƷI |>gnUL)j?3ͼIG>X8| '~7dX(tG|}"&qn.(+|)xd">(=;0g'(FFGz(VNqbqWONօB/Q/uoa+?DٴkiĆVsqeI ؇:'`燀XDXY8H؈؄QuAG;BpTrDG> u{/RLjE3oHH |t+H(h8hlx~H˨7h(87Ǎ٣7XBZި}E;t}̨5xUQNjxY=c= p(y}F7-%!y9yX {޸y)'9K|6و3فK+Hӓ29ѷЈLiXN^uZٕrn^%dPJ f*g)&ikcҖ#n"6a CUn2[21!ST7f~09O`_c `d$ChY9;((X` p%2wcW`6CySvK!jHqxb= ~1rV@`=iBe/heWpUA6MAha1gfiliIiygHa }ds!h<@iQh{jʁ2hᡪىyY!kDtY!!pdqgiPy b38jjBZiFX:zbx\:J7ڠG.\&=)L uƝ" pEG%i6EQjSHr@›ff-QIoV  jz=R#y {zHVc:xV2wDQ~bpzxg-gJ碉w6LQ!ک;TVt꬇ dơ_!*U*;J1ڬ* Sҫ*@ʉ uIkpwz&W# ˖u۱ ]$[&K$X*k0\.HX2&`96s){:[&5>+]-Ș(BK4kԳA MLrJQEW]?,TAJIHRW["Ohb"twCbp@PJEgf m3A0:״ѷq&,Job-eq9+N끢[-RWK su~jX8ZX$~9kdV '›k;'ۼ"[6;[{^y7Kcے{aɽ:929f6õIVgIi뵖+/O璶QY+sauSEKT̯{ LHoP&p Z滍Ny ᫴ ̰XA,L{W{țPLS'Ċȁ8I,ٽ[|)[ĬƀcD9(DzXulƾ[CGl c\+B7<ƍ,e2bY<=,<!Ilwy,xZ\ͪ< =ܑ%CYU\4TIZVH\:,7j܌ (N, ҡ|)Jo<6}38 Y ܕm0$RVg> e4Aw[Qn]ým3俖]K_٥٩-&X2 4[%.M .?\ߞm2MmVLGQwPgSEۋGW"Y R`.|O"-@||:al?Gc<=^ 沼9=MŞ)CD"q.[> ]v~Hz|~趭^®!ōPnN;3B](Mh~ ^>72x<h.c&>]dΈ  ql]&yϞTˎCx#ǾK^'_\d'n^?)7> ,_P.T!JxA'*t 2!ůf\EG4\%ڙ5y /ൃMh!D?R3L_+m2Ԅ[uUWӃUa`MVZᩁ01OV6ny.+qb@Zn؁~jqʄg0D[j΂ob;9kOp҉>c'A$κފj+E??b@T'Iɂv ,$AH @3ОJI$h=)S- a[  > $L Gm ta:49R6lzK"H :R4\(D,0By H%CԿ&5QAۜӻT2O/\hD(PMټG:'U'OSe!r?N}JHRQdU/QBX##sL.ߚ3iGs^}m1]=+W6zyLD¯QJ99A(` Lf=+'dq20K ". پJu,n齍skc!$ջ`M;]A9m[yAB@6}R|M%Mgg`(z vftYUH._5JgScZHA :fRn?:"Brq÷!=LѾW]u+x؉ǽ_wqu7w觧x{|R~7zg}w?y㧿e?}x3`)Ё`%8A VЂS5AvЃaO;Є'Da UB-a e8C/auCЇ38D"шD&6щK8E*VъkE.vцQb8F2VeDcոoc:7SwcG>яd 9HBҐDd">E6ґd$%9IJVQm Dxd(]Ju%e*QTt3%]9ɏ b=\[/7LҖDfjLf"v,f3wXhZ]ba )MQ<6Wuf&d%NR^TfPtn;gS9g>#Osb1u $ ' <}$4?FuEtԠH/XU&eCʜetQtA)lcԤTOSBQs d `=jįu`j [ |`E麲Pu(2W%5mXb3X&V5=gaSf\\)Cǖ$+h"ևeGidT8PZ-x -lk#>ŝ(~[ֆ5Ӌ@%}Kbt\E"smzj :@XLZ^jLi7v,aG8+ /6lOV0/-|nxn=؋ ofMx(s] Ϙ0vm8Ƭ}Y@</⍱"OyH[(4!@(U[jjVeEeq-bfixX-0ug=8G|K͇݇3'`56I#u;\~?;1ؿ?{榿/~?? $ً 0܈C@ |@ @g,>.i01*AX⿔{*AA r80LL3c <"%dB|&Q(TBYA+t.-=lqCA13&*>6?,L C:d:=%˘l?>Ę7< D$@rDDDDB\D< DE\@z  E,#D`YSD?W\6TEME4D[LE\C$EZ_=;D %FNcĺe]@AhEګƯ@a1Hsp Glɢk,Ztw*GyF.dF8LSyQTT B%CT^E$DKDDm*) SdBUhS4?QU"]ȴ:,m[PdUB,5pZMȢ *`I++bVl-SՌH[+ & 'pnuq-sRueWGSfۮsӂBWq=yWU$]OWj!U 8Wp]XOӇ ׀5Mo3ME> U%NwHcX?cYirϛٜٝUٟڠZVTY=ZMX3V4پ,ZbeY\ښY$YZݬZZ5ЧȨA6: !}ʵ{ڵ2M%R[sّmZK5aCWx*/}RSSO`us\Y\.5\ׯMH{z[PS6S'\7խHaj::un{S=ۋ]\`3T`T5CU RMF yA^Xިqс^^ME ^ޔ%ݕMZ۴OP_v_-=Y]__EYRn_~T_ V &QX_`ajvvᲈ:e``L,\`fߦ +z=fAFƒ`&>K]Znbc^b!蝸ZcYKM[(3Hxt.bD3B:c; c-݂@Z4f ~BP7_0&AF` L6+׃ .mu Uچxe(yVDe]caPMQEC4f1aQ\ijvE;fj[uo6|fҔ_, NX*[.^azd5cIf!g7h܏Rxh6LDHFhM ̃cSI]F>m>EC.h_.Dn^[D 6d%fio xb&p>v\g>V!VibnaqFN`ee.1fVhzAǿd`PN[ NDbvk).q&m_6mŎFZ.ۛnĔA ێH薔ᕖménnRN(g6lU0l  mai juin juil aout sept oct nov   ggval(j@l0l  1 0.6 1.8 1.2 0.9 0.2 1.9  i(j@0l   jgval2(j@0l   n(j@@0l   ogval3(j@n0l   p(j@0l   qgval4(j@0l   rggraph (Xon mouseUp repeat for i = 1 to 7 put line i of field "gval" * 100 / field "gmax" into g repeat for j = 1 to g put "|" after line i of field "ggraph" end repeat end repeat end mouseUp @l  3|||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||| [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| =|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| .||||||||||||||||||||||||||||||||||||||||||||| |||||||||| `|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  sggraph2 (H@l   tggraph3 (H@l   uggraph4 (H@l    New Buttoneyon mouseUp select the text of field "ggraph" delete if line 1 of field "gval" is not a number and line 2 of field "gval" is not a number and line 3 of field "gval" is not a number and line 4 of field "gval" is not a number and line 5 of field "gval" is not a number and line 6 of field "gval" is not a number and line 7 of field "gval" is not a number and field "gmax" is not a number then answer "Veuillez utiliser le . comme sparateur dcimal !" end if put line 1 of field "gval" * 100 / field "gmax" into v repeat with i = 1 to v put "|" after line 1 of field "ggraph" end repeat put line 2 of field "gval" * 100 / field "gmax" into v repeat with i = 1 to v put "|" after line 2 of field "ggraph" end repeat put line 3 of field "gval" * 100 / field "gmax" into v repeat with i = 1 to v put "|" after line 3 of field "ggraph" end repeat put line 5 of field "gval" * 100 / field "gmax" into v repeat with i = 1 to v put "|" after line 5 of field "ggraph" end repeat put line 4 of field "gval" * 100 / field "gmax" into v repeat with i = 1 to v put "|" after line 4 of field "ggraph" end repeat put line 6 of field "gval" * 100 / field "gmax" into v repeat with i = 1 to v put "|" after line 6 of field "ggraph" end repeat put line 7 of field "gval" * 100 / field "gmax" into v repeat with i = 1 to v put "|" after line 7 of field "ggraph" end repeat end mouseUp Dessiner graphique cREVGeneralscriptChecksumDnoF="< revUniqueID 1118167572814 bookmarks handlerListmouseUpscriptSelectionchar 330 to 329 prevHandlermouseUp tempScriptscript r

on mouseUp

select the text of field "ggraph"

delete

if line 1 of field "gval" is not a number and line 2 of field "gval" is not a number and line 3 of field "gval" is not a number and line 4 of field "gval" is not a number and line 5 of field "gval" is not a number and line 6 of field "gval" is not a number and line 7 of field "gval" is not a number and field "gmax" is not a number

then

answer "Veuillez utiliser le . comme séparateur décimal !"

end if

put line 1 of field "gval" * 100 / field "gmax" into v

repeat with i = 1 to v

put "|" after line 1 of field "ggraph"

end repeat

put line 2 of field "gval" * 100 / field "gmax" into v

repeat with i = 1 to v

put "|" after line 2 of field "ggraph"

end repeat

put line 3 of field "gval" * 100 / field "gmax" into v

repeat with i = 1 to v

put "|" after line 3 of field "ggraph"

end repeat

put line 5 of field "gval" * 100 / field "gmax" into v

repeat with i = 1 to v

put "|" after line 5 of field "ggraph"

end repeat

put line 4 of field "gval" * 100 / field "gmax" into v

repeat with i = 1 to v

put "|" after line 4 of field "ggraph"

end repeat

put line 6 of field "gval" * 100 / field "gmax" into v

repeat with i = 1 to v

put "|" after line 6 of field "ggraph"

end repeat

put line 7 of field "gval" * 100 / field "gmax" into v

repeat with i = 1 to v

put "|" after line 7 of field "ggraph"

end repeat

end mouseUp

 New Buttoneyon mouseUp select the text of field "ggraph2" delete if line 1 of field "gval2" is not a number and line 2 of field "gval2" is not a number and line 3 of field "gval2" is not a number and line 4 of field "gval2" is not a number and line 5 of field "gval2" is not a number and line 6 of field "gval2" is not a number and line 7 of field "gval2" is not a number and field "gmax2" is not a number then answer "Veuillez utiliser le . comme sparateur dcimal !" end if put line 1 of field "gval2" * 100 / field "gmax2" into v repeat with i = 1 to v put "|" after line 1 of field "ggraph2" end repeat put line 2 of field "gval2" * 100 / field "gmax2" into v repeat with i = 1 to v put "|" after line 2 of field "ggraph2" end repeat put line 3 of field "gval2" * 100 / field "gmax2" into v repeat with i = 1 to v put "|" after line 3 of field "ggraph2" end repeat put line 5 of field "gval2" * 100 / field "gmax2" into v repeat with i = 1 to v put "|" after line 5 of field "ggraph2" end repeat put line 4 of field "gval2" * 100 / field "gmax2" into v repeat with i = 1 to v put "|" after line 4 of field "ggraph2" end repeat put line 6 of field "gval2" * 100 / field "gmax2" into v repeat with i = 1 to v put "|" after line 6 of field "ggraph2" end repeat put line 7 of field "gval2" * 100 / field "gmax2" into v repeat with i = 1 to v put "|" after line 7 of field "ggraph2" end repeat end mouseUp Dessiner graphique cREVGeneralscriptChecksumK(d=. qi revUniqueID 1118167572814 bookmarks handlerListmouseUpscriptSelectionchar 337 to 336 prevHandlermouseUp tempScriptscript

on mouseUp

select the text of field "ggraph2"

delete

if line 1 of field "gval2" is not a number and line 2 of field "gval2" is not a number and line 3 of field "gval2" is not a number and line 4 of field "gval2" is not a number and line 5 of field "gval2" is not a number and line 6 of field "gval2" is not a number and line 7 of field "gval2" is not a number and field "gmax2" is not a number

then

answer "Veuillez utiliser le . comme séparateur décimal !"

end if

put line 1 of field "gval2" * 100 / field "gmax2" into v

repeat with i = 1 to v

put "|" after line 1 of field "ggraph2"

end repeat

put line 2 of field "gval2" * 100 / field "gmax2" into v

repeat with i = 1 to v

put "|" after line 2 of field "ggraph2"

end repeat

put line 3 of field "gval2" * 100 / field "gmax2" into v

repeat with i = 1 to v

put "|" after line 3 of field "ggraph2"

end repeat

put line 5 of field "gval2" * 100 / field "gmax2" into v

repeat with i = 1 to v

put "|" after line 5 of field "ggraph2"

end repeat

put line 4 of field "gval2" * 100 / field "gmax2" into v

repeat with i = 1 to v

put "|" after line 4 of field "ggraph2"

end repeat

put line 6 of field "gval2" * 100 / field "gmax2" into v

repeat with i = 1 to v

put "|" after line 6 of field "ggraph2"

end repeat

put line 7 of field "gval2" * 100 / field "gmax2" into v

repeat with i = 1 to v

put "|" after line 7 of field "ggraph2"

end repeat

end mouseUp

 New Buttoneyon mouseUp select the text of field "ggraph3" delete if line 1 of field "gval3" is not a number and line 2 of field "gval3" is not a number and line 3 of field "gval3" is not a number and line 4 of field "gval3" is not a number and line 5 of field "gval3" is not a number and line 6 of field "gval3" is not a number and line 7 of field "gval3" is not a number and field "gmax3" is not a number then answer "Veuillez utiliser le . comme sparateur dcimal !" end if put line 1 of field "gval3" * 100 / field "gmax3" into v repeat with i = 1 to v put "|" after line 1 of field "ggraph3" end repeat put line 2 of field "gval3" * 100 / field "gmax3" into v repeat with i = 1 to v put "|" after line 2 of field "ggraph3" end repeat put line 3 of field "gval3" * 100 / field "gmax3" into v repeat with i = 1 to v put "|" after line 3 of field "ggraph3" end repeat put line 5 of field "gval3" * 100 / field "gmax3" into v repeat with i = 1 to v put "|" after line 5 of field "ggraph3" end repeat put line 4 of field "gval3" * 100 / field "gmax3" into v repeat with i = 1 to v put "|" after line 4 of field "ggraph3" end repeat put line 6 of field "gval3" * 100 / field "gmax3" into v repeat with i = 1 to v put "|" after line 6 of field "ggraph3" end repeat put line 7 of field "gval3" * 100 / field "gmax3" into v repeat with i = 1 to v put "|" after line 7 of field "ggraph3" end repeat end mouseUp Dessiner graphique cREVGeneralscriptChecksumKQ~zui revUniqueID 1118167572814 bookmarks handlerListmouseUpscriptSelectionchar 337 to 336 prevHandlermouseUp tempScriptscript

on mouseUp

select the text of field "ggraph3"

delete

if line 1 of field "gval3" is not a number and line 2 of field "gval3" is not a number and line 3 of field "gval3" is not a number and line 4 of field "gval3" is not a number and line 5 of field "gval3" is not a number and line 6 of field "gval3" is not a number and line 7 of field "gval3" is not a number and field "gmax3" is not a number

then

answer "Veuillez utiliser le . comme séparateur décimal !"

end if

put line 1 of field "gval3" * 100 / field "gmax3" into v

repeat with i = 1 to v

put "|" after line 1 of field "ggraph3"

end repeat

put line 2 of field "gval3" * 100 / field "gmax3" into v

repeat with i = 1 to v

put "|" after line 2 of field "ggraph3"

end repeat

put line 3 of field "gval3" * 100 / field "gmax3" into v

repeat with i = 1 to v

put "|" after line 3 of field "ggraph3"

end repeat

put line 5 of field "gval3" * 100 / field "gmax3" into v

repeat with i = 1 to v

put "|" after line 5 of field "ggraph3"

end repeat

put line 4 of field "gval3" * 100 / field "gmax3" into v

repeat with i = 1 to v

put "|" after line 4 of field "ggraph3"

end repeat

put line 6 of field "gval3" * 100 / field "gmax3" into v

repeat with i = 1 to v

put "|" after line 6 of field "ggraph3"

end repeat

put line 7 of field "gval3" * 100 / field "gmax3" into v

repeat with i = 1 to v

put "|" after line 7 of field "ggraph3"

end repeat

end mouseUp

 New Buttoneyon mouseUp select the text of field "ggraph4" delete if line 1 of field "gval4" is not a number and line 2 of field "gval4" is not a number and line 3 of field "gval4" is not a number and line 4 of field "gval4" is not a number and line 5 of field "gval4" is not a number and line 6 of field "gval4" is not a number and line 7 of field "gval4" is not a number and field "gmax4" is not a number then answer "Veuillez utiliser le . comme sparateur dcimal !" end if put line 1 of field "gval4" * 100 / field "gmax4" into v repeat with i = 1 to v put "|" after line 1 of field "ggraph4" end repeat put line 2 of field "gval4" * 100 / field "gmax4" into v repeat with i = 1 to v put "|" after line 2 of field "ggraph4" end repeat put line 3 of field "gval4" * 100 / field "gmax4" into v repeat with i = 1 to v put "|" after line 3 of field "ggraph4" end repeat put line 5 of field "gval4" * 100 / field "gmax4" into v repeat with i = 1 to v put "|" after line 5 of field "ggraph4" end repeat put line 4 of field "gval4" * 100 / field "gmax4" into v repeat with i = 1 to v put "|" after line 4 of field "ggraph4" end repeat put line 6 of field "gval4" * 100 / field "gmax4" into v repeat with i = 1 to v put "|" after line 6 of field "ggraph4" end repeat put line 7 of field "gval4" * 100 / field "gmax4" into v repeat with i = 1 to v put "|" after line 7 of field "ggraph4" end repeat end mouseUp Dessiner graphique cREVGeneralscriptChecksumxv*k^Hԗ revUniqueID 1118167572814 bookmarks handlerListmouseUpscriptSelectionchar 375 to 374 prevHandlermouseUp tempScriptscript

on mouseUp

select the text of field "ggraph4"

delete

if line 1 of field "gval4" is not a number and line 2 of field "gval4" is not a number and line 3 of field "gval4" is not a number and line 4 of field "gval4" is not a number and line 5 of field "gval4" is not a number and line 6 of field "gval4" is not a number and line 7 of field "gval4" is not a number and field "gmax4" is not a number

then

answer "Veuillez utiliser le . comme séparateur décimal !"

end if

put line 1 of field "gval4" * 100 / field "gmax4" into v

repeat with i = 1 to v

put "|" after line 1 of field "ggraph4"

end repeat

put line 2 of field "gval4" * 100 / field "gmax4" into v

repeat with i = 1 to v

put "|" after line 2 of field "ggraph4"

end repeat

put line 3 of field "gval4" * 100 / field "gmax4" into v

repeat with i = 1 to v

put "|" after line 3 of field "ggraph4"

end repeat

put line 5 of field "gval4" * 100 / field "gmax4" into v

repeat with i = 1 to v

put "|" after line 5 of field "ggraph4"

end repeat

put line 4 of field "gval4" * 100 / field "gmax4" into v

repeat with i = 1 to v

put "|" after line 4 of field "ggraph4"

end repeat

put line 6 of field "gval4" * 100 / field "gmax4" into v

repeat with i = 1 to v

put "|" after line 6 of field "ggraph4"

end repeat

put line 7 of field "gval4" * 100 / field "gmax4" into v

repeat with i = 1 to v

put "|" after line 7 of field "ggraph4"

end repeat

end mouseUp

onglet6i onglet6.gif @ &GIF89aHtHHtHHtHHtHttHHHtttttHHHttttHttHHtHHtߜH߿ttHttHHtHHtttHtHtHt߿ߜߜ߿ߜ߿ߜ!,@{H*\ȰÇ#JHŋ3jȱǏ CIINVRaK$YĪ/k &œ<3QC5"0P*ՅM 0FZq\CPZö%څ- kF >~zS]7-(5Q˱0a $+n +F&xbfu7!vm膖*^{Gs3skV1zD֮;νOӫop˟OdK(|I%W3 6!(\{+AZv vHA ("EE!#,^?4hHK0DyR_U%ٚ_%)SI`TSţVQtUX`ז^Db%U@%kOTq: lubCB~Fj/"W8({F*餔רZ馜vQ~茟jꩨ^*uBv9c뮼>8+QhAk3EWW%iKX+kﻷ J/l:o70zo23I^v6tTIA V7 յzI:pCO UU%l3.S١j74~NjEX;pLg`cZ.ՀmWo-vh m7de}1\ h+ l,Ҭ'97Qo| fzp_A(+p^LX#>"%eEmTZۜH7(Ta{hsYȔ } jmvHɔdͥ b,ɅGiy±.%hpSzV0'l#mR&ѫ& PwSnť A j"T0 :H%HLu.ҒɔRD_@UAzP-jfj& 2E ԶvըC}gƮ"K^W!.qm|빜 7DYjCY, 8{MeZW*f ‹'Ule]esMݺN>h+l^|g-oS08E森:2 @aϚ֪ 틺ty ؄ҹɲ7Xm'%^mm'N[Gn#{ X(EܔP-WgN8Ϲw>'yy6,K9.zGt/IRZ`Lx9LlNduYSW+dT]%%wm 'i7?g8KkԿCknfգ7%0qH}}k_po{3?A?}3Zw?~G巾/nWꇾyMzvG5Xg8Vtvf g ؀ o|W~}$7gHs "8$eOw*H@.0/28S`V6xs#<@s*BX5DxHHf,W-HzKAGBqǡ;Qwo͡~ ENM+u'!-0;_e-s,UQq29,!8l--+t9":(;[NUvC8V_!!Stmjjܦn&X#W;9B.w3pOqRiSGV:(W@,&VLJ#yٵdOY1iz5W`)u\ő<%-ى>9VPv"d1iW$Y4>jIk_Q9%Uf-diZيt Vni]Ml0 \RXENsM5Ʉ0Eɂ9z!фArsFmJ1)bÛ W|=ٙY{qIiΘ#TPǸ;u Z. LhZxڴa۹XV )KŜ6;{^;[v*[tȹ{}ځPԻ~̃u˼4짺:ZJh zV]x%IGDb) n3cK,t)47 F!t]+)8Í$Fp7@s;(aXyiŽCҸQ\-2c;L)%Ȕ$ L8E(Qjv%i6kaaʤ6yMevT `Z*pN\ozחieחPo o}g\iƗ9y mqǾx@vW?6nnBD [RKLL}*f=FͲ6({LmN^mObd!jlnpr=teg}xz|6.aksEz-S@m=r>1m/V0Pڼ$_Oc/:0,$qڨ)J͇%``} CSگ͞-h S#q3#hL'h1VGU#'F.We@=( gޮKXQأqIBgu&=^ήjĿƏ.Y&Jk#Pc}a !۱k5xr&ꞇk|ẉ(e+fkqKi& FE@TN.멾N8K:7Y2튼3+̿^^B5^3-VY¢ { ~to+u}Ⱦ>Q5뒟w& ~ %Y1v>ngTgu(8S9iO`@CI7$VA[;NBV80ŞI$P4rukkLe(?cGxYvrahRb/գ,6 &f~#`ŢkHkNJ $Kq@ Tě&Ae%RZlW A߅>_4N|Tz@O_Z.,kFA^$^lMeNVuXߥ2fW]ů}PTOA6xQ`-VУAx0B>@HQ :48P!DMI8.IvԨ@N=}TPEsRMjTUFUkӐ~T'خS-kXmݾ*5.\H+tm^UXп6Xw//bɆ)WƜeV9wc MFZj֭][lڵmƝ[n޽}\8mōvݓq͝?]t*]vݽ/͟G^ٿ_|ǟ_~/@$|k8dA0B 'B /Đ5l<?1D<(ApDWdRlé`tFoı9ѩs2H!"2I%d&J+*ʫK/|HL30̣ČqN3(R8M=,܌) z8"AJ&*8H%3$Kzу tR`@>WeuJ5M+$x`,,*+aՠ"!SH[*_ P)R, |=褔]6؆sEمv6_}svX,۲"ML3ᦄ8jcEa@b+o:Tzc=&dYK@>e9NY[?_fK-o2=yeFKKON:jYǘnZjmz^snY.`"6 f n&6ƛdpݦ!bgM-<u T]T& XhqrUU}wTdt 0ܢ]_J8("7As ?-! Xx9WvF mi=|jg!gNG(XAu\őrv=_GۅXCP7)er Z+ρZUMSc51uᙘ.0[b a E4Ƅ% T8Cl1` uC0aMCDb~POhFъWKD,vыE2q\c͸F6* `MzQ(c 31HhP?O#9LjD)I cJ^=DeeXƒP2XZB(|bJ (7/\qTF7"Ҕ3Ke22xaК.e@a 7SJ Tf:J~̫^êy<^Ҁ 3.aEKMB(QD(`Ix"ғ%hYO$ڧH69cj "Ƅ-% cRԥN$Yj̗T-*UNĩԧ7i:ԒDEjnjZΤ6Uv35Sڪ"sW*TIU;jXUլ_"JϺV.{l+ZиuIs-]B¦^ `kJ|MBU,BH1Mrζ>ZC nmjE_1L-] nOp[3IKzr,TbB$u +Lv,ru z,yhkM.Z.[W8e{]NfW8_úͲg3) ur1iZR^keor9iZb֞=2 ~bZ1S=Lcq_ 1d$yLry,(W;S,'r_N f2".s#fqf:33ng>&q!7â$8hj81}A@YfŀK%^B]dӕ,2+}K)2QڊR>̜R& .5]fԖ 504PDg8ĩv8]\6Tr~UV{'i㈯;zҖ-A85uOfiJ#fi`W "&i/]ie>8zS@氜U]ns$mպ9D)qWF{O(q| J_3 ]4קqT>9sO$>~Iy+X=[pDX\gc,vޏ}]a +;nʱһMV/yīZ}ЗּUztrI{γLev{]}o_/7J##?<<}W~~c>GV~<׿҇R {{Ӌ+C:) 15qr8K57 K|>#@V[=@== KGkAAAN "-/"0 -:AI:u5YR [с ȓ c3L(˭ʁQ`a.G rH3CY®Zܚ:d" ǀؔHvlckkD]rhod%hk(N6@k3F&{۶^D_J'OEk)RtEm[V̥Py;*Cy[daR{1, 2,F8y'%|7ArƜF$F^!2D@D z8C&} SG9k9uņm}8ny ȃCGdtR&\!8zh h.0(FƁaI HI2F*Ǣ8GDx ;~G(bԹ{$Jcdv+J'1H÷T[0tȭ'h| SJpd7i0TCJk(^:ۺ;)fKٻvK,(kJŒzRLBqt%\34c˞Ž Ѵ@SMS{ċMѼDM؛MMA3=348tM3LM,ոOTp\2k̓P,O 5lP }PPm %3O4UO3 }-A(Q RRPտ"#M']KQ)M*m$%QҍN&2 O122N324N,S+.5/ Mt3S;U*cSSd?@N=%,-P%=%RCS(S T0M7KMNUIU>AQ$]-mmSQMU,UJ=U.URM$YTXu(VWbcdEVK]U0EUeU"dV]hSMVe2(]VpT[VrUCv%^_yVWyTzVmVhWV~ wo%3n{mu G=р}؄2sQs؋5X dSPNΊsjk6 ;F:"8櫯vX{T,Sf #9#+6.L2*wv,71Kynjk.Z<0H'}ڶ)-?sXgjtnPSj_Qhwjka'SmYrrj(%06A'7-lzYwwyӃ89Y jyT6P`[ ﮃ~U}%D'U7.tO-?wO8ͬrZxා|>qהކ?^,XPh ~7πXBf=Ё `AXm 5煇ORApd=C]O7,\iBa! aD:Z@!:(.ؔXX̢.z` H'px6 2ӑ1x̣EΈ5 IBLd6fE$C@d̤&7I=./I"9  0G@JYoi  %S(/KE4X<&^ֲ$FL<9b@%MůyD'#hɇ (@ J:ZD-'σ&9$B`D HG GРD)UȆϢ.<g5&"uѥha;6GehߌjCԩC"KyJ"vRa9ǤЫ]mI*GSNzե2Yw Աb*XU69U*b5UkX!T5Xme]͚־5h[+jX~յa+UI zT,h! B¶-?;ű mryJbNunmݞVZj5nQ[ܺFi|kZ좖YYWmlV˾Xgu_*XQe[xi;\ l^*]v Xk3ozgX/)p&a8~줻`sK_b5.r&똺^^o;OZqӶb Gy(Ӳ< 7'fwm%gf2LaS=GNٷL0Έ&Du^V5Q8јS`*{OMBvqE\19ӨVYa*SM>5?zȵvvFӖ-~l,a;a;E:#ymMlVQsm[pўl{\ZM fUi>c`.]`{UHތ5,!L53-.{|^μhox>w3ԭ{7=K7=P _tbCs^]{Xg{0]]8ڧt=/RIb:מ/=_|^o!"}Be2OiO_ ,e6).2$? IUꓑH7'`M `WJK7Fd}e_'PJh NԀTPgLȤL#KO8E4K!KHN4.N!LܔJĀPDTqRv|RxX8HuYȅ}'f~ę{I0sS%rsuWaf)VptyaIdeo wܒ1"3ڹp)Fh f_֡k^&f6jbIq9)㦡c dfwj%? ɛA#-pb1eҡ*5jiqY"6qBz*aRGZaI@ w)fvopV)r@ٗɣ۲=h2fzh n:6Ж2sJ;Edw:f7ڑ9MʡeE-ZiG6ƣ8UJdv,4:l"+. 69r&Ʃ˂u9vړw&ZT/e3*NF왢J+oJʬũkrh͊Ꙩъ&Ruߪ;36-튮HPɐm4CT(9vtg>.󚧝٫*5ʞ1gîL-j vzvjZz+#KK\{j"c *ӲyX$dʖ#G @B>BP&T+ZM A:˓Fk6)kOcq9^iLKgCZt& r KAKckrZ+ R,r >fGd>;:=ǩsP;ع ²j4K =e;WrRi73+ ˈq˶u: ;یb!rڼң6{~)Taq99ڛ6+WFgzz {?K˼%;(rk7^17{b|. 1kw ɾ/+#\*?܋$y<>@yz|l ٝ{iPlGElU|7̝ɱ;y[zl:ŖTXmܽn)ǔ޻ؘNL|lO e'<[1lرMl~{?̙_ \exx> ʦ<5i[ʧO\XI^,P4 q˼|{ʽLM487}#m~|鉜) Z.>]>>] ^j^~%'ϖ+/~߾>0.0?26_ .F>D?:/<e 3_d= nool/ _~XBf/) t,o{AG;$&7jIOO(Ɖ303[a/?*?x1ﴕ߽w?_ɻK£o$c3& + r#;@ DxA QD-J$pƆ/~RH%MDRJ-]tLkޜSN<}Ҵ g͘OM1R6_>UTURyshС[! M,QD>-¥H?W\ubuu,ױ^˖ݻQl^9z WȌn>YdYV1+ƪ1EФRFZyev9vg` WuqZҺe\p,]-{/m~_.᷾.]\|s :6jxSwr_d/ܗO4L+m>D%'9ZZkߨ3=(?1D?/ WPFC+IDoq»ȽpkZG'NG#,GkrxSOF;M"J3 NmQ܌Ӻ,D ZM?DG*eӳ rҺJ6=?l9D m,-eգ2+Cٜ5BHUTRO-5U]%X`GN# 7UIA$`sXmIdP؎ E2uu_w[w5Z >#\۲;]HGՅ`J 6{J[-hG-Ü;`7o5U^DIέvS]_6yu(f"S̐XLY&fŴa=z3y#aSxxho,zafYz4ƞ}KT&:?wN2q@Ƣ3cnifWv8N/s^-o͔DRuN>U??3rina.j<+|ADѓyXyHU`=x٦nڏ.p;ͅ>kWx-W璡>.z>dZc޾U}¯|۝eߤy?Mϭ&٥e_3QtsR#V5_m,|hePb,8Bt]f ,e$afJz贷Py3kP{0XáOdp8-ъ` *,>-8[eц]8EmdcRDjߣ#яrt!@'q>k_4w?g&Y&kd&D5*YqT%nD8YH"d9Tֲ7I}Na-chBBr~!(L[>'c1ALUt.H8VR;9j3i&ErәsZsfi^ r3nfH}j4gBٗ*ckeAQyPt9C|QJԠ+yP%sJRh#)F3knThHO:lQdMmxt; )8gCu$NEZOn[4Uu:UB5(G*ly*HկUc!sVH[ǸҪԨZ$&맘aJTrf]`f1 5ʤkŊ՟dC+Yٯ:i8ݺrVT jH+ؼ! jvR-\]rlF|ЛaQ+\ƖrcS$r75N)C]]릷]&1x n nES^'p{3ag3Yr,,ck!+ᏁvJks; {*^k3̮%#\Z8N RΤq"6W{˿_pF+'r~ӌ=OYfYe)f%{Kgٙ;s1ȼE g jjmQL˚u,^;c=湣u]SZi0ܡYօ5nF_ǚƶmϐHb솅bWOD= :|ݗ8 1/?u.o¡%wWf(E})9FxߝbM8~%NCKٰrH\"_m%s,lqsÔi+85>"ՖtDvқ^o_V?V:Î롏gYm}Z'9_Fs9|vݙw{Ѷ9^h|tvcuʋ~C}E?zҗG}Uza|ߋ:?z}u{(Wg:{_w;{ u/>gD3[W_>獯Nwk @;?36cc{@??6s>, ?@ A ,[i@ <@H[;)1B $A5B0L/B')CC3B ;2C9?LB@B:D<68FtGHIJKL|jrAB DQ,CR8>MTUdVtEM?+tCW[\]E[,T^a$FGź{;tEKE.|vWU=<\WDX06TǕ5D؏X^XZМC7Y {Zg;׃=Ԅ-XdW R% )? 8 B@. QaCС)3I/cD@BJ  rׯ`ÊKv(ThӪ]˶۷pʝKeןO 0t%VC,Hx˜ myw٨!L0_E}MӨS^ͺkvC dy爷z߮ck.+/NPp x\hJ0}:`^3UF%tՁ+/j^Q.@3}4AC)g]Wd`|gr=v ($V, P:A[,H%[}5C;գ(D'R5RWb { N:RNQ95L)X !]!%pTZai^K-8P! 't,]cAbV`TAH_KX)i]8ǀE'` $"ifb~>fanYM|hyNyꤸy~<ͧ{x:骢eylRA^ʞٯ,k覫n;agendaGon closestack set the cursor to busy save this stack end closestack `W Rendez-vousUCourierUTimes New RomanWTimes New RomanWTimes New RomanU helveticaWCourierUCourier UCourier @ @ @i  rdvfin.gif @8GIF89aHtHtHHtHttttHHHHHtHtttttHtttHtHHtߜHߜt߿ttHtttHHttttHtHtttߜ߿ߜߜߜ߿ߜ߿ߜ!,@wH*\ȰÇ#JHŋ3jȱǏ CI2!'S\%˗.cœ)&M'Kɳϟ@ :'NHm*MtӗM>*)Q1 E!~%qٳhӪ(WTV+w]wEqcb2h 0(N;V+%Lp `͘C@3a6+iK<ŗm0Vl0'BĔ=zvl3Q}Wwﻝ;mYy8,pY {496(GCgAb9n gT:sZ 6 pB\k7(#qօh8<6ĝA ӏH&L6PF)TViXf\v`2IFyfi&lj9gn)u'y{i8衋蠌BcJ襀i駝)jiꨠNiy^fꜯJ*iJ(zzækzzNjviB;jdJ&묯̊.nͮknz Z/pz+Zl/:0 ︑^咚lj;{*s2Kl17k3ꋲl0A=)ܰtm;/w(L @ &X ِUYJ&ZXStWACbHm3"2-(:xv@z_̣ I>rlL" yF(-%$IJshNzc!𓨬!Tғ{d#i*zqu"^K{t,b{ID! kb:sR+KDrKC)KRO 'ESn2L'Y{T<=M,Ms!;Eo2 iDsbsMh~ @w?0Jd#9Vx&Q|uG<"[8LܦZY̮X`43Rڲe~N9Un.>Ypc.׹wn L8GI?V|/lqh6̛~߹Pc ֮On~y'^5,;RZּ?ÌkXڞ*5L$S dR嵳h(Az&6LK k۪/ r+Lvޜ-Õ oIjLɩ_8-Y@1a #Z?WeL(7S򕻼0cNۼ8yQޣ@5H_ d);sb&1^$aQO¾xC < 'KX( ,1^&0M!Nb ԑ8 4I_V$vg2GW~tæ7`!Jc P?pN{~ُC_A&Qȃ'=A4d#N^|r˾{qCCOpB?$8Xx8#:j6 76bsqVr;f">qqs77'0E77JY%o/Xq8/ 1"37+#)k6;['628/5IH1Kh/Mh4QHrSȃ g%0Y8/hTqCdxoā<oN-B(Ex0qrqn(H7lHh(,+؂}9Eąz8JDhU,=Z}p'f8\xx8867;rvApH38x(dȂ8.tVxؘڸEG4Rd6D\C55fek֣=VG0ՎY帏Vk&d$d#mC3X II5֐ـiD?('9HÑ2C!Mɒ7> G1Y 5)IHOT:IUÔ""_4ToKYbA;),SY8i CJyfI6zEdiB9UZٗ ԣYYW:ɗD<6)h9eӃIOViX_]xWٙ t)A)=IM)vqY-s8kUBT)-I?ky=zÜCAG1yYKy=Y)Iu8yIYi iS_B%ɞ Gٔ)(y:> -9ڡ$ ڟz 4.?)*!W8l=K296"ڢ@z0U=ʡ):xG:D&Z.UQJ8JXꖷKUɥSd BBnʕ&LZ[Igژ]:̆(֕m)?6e)C`IyMz Pi:ʓmکqsScztmzʪJ|ڨ ɚZ;AiF JڙĚiګɉ xZ{:XF RWJj䚮ĘڅzjqU* :z0^zDZf +Ⱥf퉮xiVjmÊhsqȇ*Ȅ53(;khy$8زh{x҉xjȌp،6* XZ۵\^`cK xhjW2SQ#7t[v+tbrpr{~h~{ y;}{uPv[v"k)P}:q;^1pr{TQ3{~tgwzq|!gy;#!ҧ޷}>A}{K~gwx!ȗ|K槻zAK!Km;KQq]'xС wx'| '@a$y{$#?U7u 2 ~ !| 1|1;z8Qw;Yx#q#˰NJ$9-]m EcR z1ٱ Igk&TAŚ+K'`z ^^)'#^ԘF4^SC.~Z}Z2i&[G&(3=!+ D.gP>-zn^ebXNZR>pT>k{KNx i(m9;.j窭N~ށnAy࡮N\%^(^(Ip)|.N<՛U {hw*o{NFvv=,O^tΦ%(v"^H߮/>۾j_.>N NAeQ,.Ζ3of鷄NȮy=+VB%sW8O`oNjlT_Aa>ZizM.GI_*/V?'^o!?5Aiko'>w_Obo&NsߠJꍿߗ[/Y1:OJn_?~NP?\R避?f_ȜBnp@F=s?@@:t8B >QD-^ĘQF=~HpCIRJ-]Ӡ’i'Mvtf͠ eETRk|0jSU^ S wsGW`mFi4PmݾW\uśmEaU\w`… *R'؝@X2@ƜY澀YhU+.UiU\Zl22,em޽}s<=R=#S^\͝;nϭ_\YZrσG^zmX^+hk֎|8e㎉/>Ѐ@L @{0Z\Bڐ<.BD1EH?\s 7wTGNpĄJH#Cbq* %[#CLL=-K/P:H=#H5oFyMpM;C4p5 <))L:et@!s;K>;3Q+KM7S6js?7kS d9Mvk!mu7^MK|qHCM6bG@"SK!$'6>1t'A+cN!qg[Q>8K`ָ-r qcǪ(^F|XCC1[#Em z+$IVQ~Dc(ӈ71|l$_4yHNo#w?f yKc!RT"#y)2ÄV,= ke4?yQVseZ_4ILip8V̐Lʦжn3U1(e:*s>NWQv'TCOX~DINT.lcfMԤ'EiJveSNϡb9M"NS4dEVM(d͋*j,YNUj݄մKLGK\A#ϧt#i&BYw ֢ުٺn:7U2~)Rӕ2Ձ3Z[>-X+dʹ支29uCmQ^SF!P:΂Vey\?{u_[հub{Ejf}.ZjRXn׻w^׼Ey՛^׽{_׾}_׿`Fw7vp!'>+;9ø辚4[+3= ӾX; ՛3[?s?/{˿?[3.@+4: <<* 3>S@;7cCA:.3 >1c2S$:{>o>t2ӳ@#"@<í H+4B)\3A>/CB#ɳ4l9:sC#Ē@1EkAX|EbA[lD\|#%O8,3b1^ƛ#C3y\EFjVWl/nDoD[T23 a$2viȈ3GlGmT/DY,EȐɑLeB$ĠȀ$ɖtɗɘ1XIXTIDCɝɞOsŚ/FɣDʤT% I/A\ʩʪJkJLI8ʯ˰̽$˴T˵dK83K˷˹˺˻8˼˾̿K$LTdż>jȔɤ<R,Jbʹک,M<++$R.ₑ*dšMT.j«.,$,!<,Ԅ.Ld.lM|Md<.ټJ-8OIO8. O O-*MOrOĒNzOMt-JP売N+\.. OP P-yTMuSoo-s?tmφXf׻"׍W11ReS~}WuXe%V,oYx=^HؔX)UXEWYy%wؑEWjS|;]UamUYvڋ ׀AXMZ{T^._YY٫J-חZmѩ+%UEեMU:ZX'][UM[מeYFYn VYmY\UZ<ָMZi\\[m[w]Vƽ*[E"M՛ۀXՌYݿ%%څWV]ݟ]\}]m]OmU\%eEܲ۵]^\M\]%ޙZq]u^EZ;\_l%اX޳U]Z]P4FVˬU Z ff&a-f:ʗfva4#ybG9ʨ⊹ja!I s`'#.v^Baj(N *Wb,V⬴a[" 2*^ (5|J]cGѣZKz:Ǝ<:+b AYP,.nIGn.#dK^6~X7bN(e#<>J.U6HNCn-Uvh9-[U)y] FVGfB.'*c 9.AvhcDe( i ?^PRwfc,eNl&~bNcgeexiw&M\g{j.algYid/s6 x&Y6z#O|kc`֕3 w&)!invJ}BF2ƦYijʛ?N 碶R *^h,Q%6 f!Ciz&]r}F+tN)5B ehPfh"kjQh&&l-f |#vI0gJ>kCfF F i68^8n渣ؖmbNaN߮i&ў&n(FF F)TFjY~Ж!Ne16j+eF>b~ognp^gξ 1G!pFp\1n)X^ۮpWXfn /lr?qoVg6)Vk^ߐFqnq~pYpLp0!w^NthaFk(Ɇp_^$Gq,kvF_縆־knr.Ɇ#%1r/pJj 'io*s:'Ps&DwsS .ri'$0qEW"o)D~tYX]_&WbuNf_UO8O͙>:o)vfffB)u- t̹siOvt(t3 u>j{O%W5WͱnGw/%vw}O~?z7Mny7ymwqn>V?vHGg'CYw_yf6wvMyx=7xw Ak'ornRB(~_xw{<|gha~xzMFs4z .!Owy=Q+~ňjcRKe~A9%ɍXHrT6V9Vn&y bb.yIl)n %'-d !'`%&p8[B)0^!]:)ay*}}X+@! 魯e 땺,d*em8.{.윾Y-X/+\/q;pz|f`*\0Ůֈ퀚z[1Ʈ0q˨v|r"{2ˮ*<x*:}|{*=[i 0%s/jG,:jQ6;|P?+ٯ\W|J;Y6qPT4sAg6JC,RvG\{&h1yS6k?y w֥|(їHF<;hG8۸s߫J5S~i'_~6==:󣗍g%77RM~W>ѠOY$Oȸ vW4Ub:)` X5ٹ y`rHs9{ޝ,$ZBW+cv*{S6*qMěE@>ll K`5+$VH cbM+(Qw{]th=ꉁ ;?Bo?;$ PlQ FI>ih#';YIصђa(ܤ.>h>ҕңthKU&b$P<=Q0sIpL&1WVB@˄f)HU:4(Y X" ~&ܦ8(tʱdLvȐ(E`z7$f? 1 9f&GcDtw| 6yKU:D?G:J)͞P3ai)IZڴ6%@{ڛfroܤ."ObS X~let¦F+Pupzf \* ],m@mZ}#ȹq{f*Z1иhPT+_W:r0 h0^myD#b;K`VuH,vJ4]݂\CD/ueEJ0t{5#`}ͦNO9HCnM$+Ed |YX]s:XO\iWk-Y?`)pj޼̕5mzWcz6šxe[Z׾,H_5Ta\biU|M.Kki Ŵŭ>I6s6].M1 cXfeg̗>,/`l(Ć57ʷ/U[l[9冻 (,Ʃnl'dmV3=ʓp;JkȠgЖx|'.j9vNtVx +Mf) ,a}Y"PJ2U=ѫcJC]:l@>ga*w嵬-hzmw*Ki>4jw}6q"ٚK(3lfqn礦ZqB֏wRMG$Dyͻb+w~#qQ>#ӌqWSQm?l_npO>6~QnȿgɭM󧆻F?W\cZ2ѬoY|ӝܡKJx?[i3d;Pdv)V])o1-۽ExuǪb\Suoςs>N7; l _Q]uq+~Y_y#!F!SNRHI!fn!vi KE NnIP!\$򊚴KvE!aʊᄙK!"G"aO##:(L$$Zb%K'Ȣj&-a/.t+M11b)) #!.0V11^6j#2r#Q)3#*-b: E £K4"} 66#3>c!%$+ $&֡;#=Z#Bj"57G2ED6D22?GF:VcG"Gb;;~$6B*"CF[KdKd77>۵a.0$1#?j>bdPP2*"8BdRJH$HSVQTʣآ$(ңN2%M*MRREOQQ^;  (h@T  Martin     (h@T     (h@T     (h@T  Dupont    (h@T     (h@T&     (h@T<     (h@TT     (h@Tl     (h@T     (h@T     (h@T     (h@     (h@     (h@     (h@     (h@  Albert    (h@     (h@     (h@*     (h@B     (h@X     (h@p     (h@     (h@     (h@     (h@     (h@    rvdate *h  Le mardi 21 juin 2005.  Le lundi 6 juin 2005.  Le jeudi 30 juin 2005.  New ButtonA1on mouseUp go to stack "calendar" end mouseUp Px** Calendrier  New ButtonAon mouseUp set usesystemdate to true visual effect zoom out create card ask "Entrez la date de la journe crer : (au format jj/mm/aaaa)" if it is a date then put it into field "tdate" convert field "tdate" to long date put "Le" && the text of field "tdate" & "." into field "rvdate" else answer "Entrez une date au format jj/mm/aaaa !" delete this card end if end mouseUp P** Nouvelle journe de rendez-vous  New ButtonAon mouseUp if the number of cards > 1 then answer "Voulez-vous supprimer cette journe ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom in delete this card end if else answer "Impossible de supprimer cette journe !" end if end mouseUp P**!Supprimer journe de rendez-vous  New ButtonAFon mouseUp visual effect scroll right go to first card end mouseUp P"**Premire journe  New ButtonAEon mouseUp visual effect scroll right go to prev card end mouseUp PT**Journe prcdente  New ButtonADon mouseUp visual effect scroll left go to next card end mouseUp P**Journe suivante  New ButtonADon mouseUp visual effect scroll left go to last card end mouseUp P**Dernire journe  New ButtonAGon mouseUp ask "Entrez le terme rechercher :" find it end mouseUp P** Recherche tdate  B  jeudi 30 juin 2005 recettesGon closestack set the cursor to busy save this stack end closestack `Recettes Mensuelles UCourierUTimes New RomanWTimes New RomanWTimes New RomanU helvetica @i recettes.gif @GIF89aHtHHHttHHtttttHHHHHtHtttttHtttHtHHtHtߜHߜt߿ttHttHHtHHttttHtHtttߜ߿ߜߜߜ߿ߜ߿ߜ!,@H*\ȰÇ#JHŋ3jȱǏ Irɒ(OLr˖0_ʌIs͚8osϞ@ JtѢH*MtM JJիXju CvKٳhӪ]+,K{8Jݻu5. H^}_0H (䂌 .[+[<3Ϙ~`捐7:k"@\!/@S{C'``y߽\U:끕ON`!K6mr_Z=#ݿ-01!]$CAhq)AEWр &`]ieFoM$^w8oMՂpYdvA}p ֏@)Dy]*턒L6PF)TViXf\v`NYS:9`SK9&&Yks2[ri'zfPY&N-Dgn.虏Rjhx^ ib)n:iv*sj~:kꨢ) ZjTB2Ԭv.*$ֆMkmr-bʽJ--'.Aچ -;.[еˮۯ\CtJ澵0?sj׸oic!w\j(ɎJ,2-1͎s+&3K߼6jTWmXwIoe`-v[7KhlO5-t׍v,l|won G}7O5ÐWn5wyx褗NdkI.w: /|뷧97<ŏ;g=߁3o>K}9/?[>5zyHf$}3 I1!0v a5(3 =,t`L`H󑰆8 w!x;X:P܊+2EpMq3I`VTEDn#$/jČiAcH$w@dUۤ'Zx>ŏc#F|6(z"E:|$#IIZ&3Mz(CIJ2#4\7 ^DmQBXKРV@{"LUE6HHVqh.-Pt3!!砹"HM0&E75"@7ɀ0]D Yg=Ƽ{g2fA l )@@A\KgWN.O92@`%v:H>&VDS4ƴiAܴ#'uu%,v1gOV!rNSVANeX*VdKkM.uw_׻&:ؘUWG#,*H.+MVW|E,\,^V{Sd;Y҆v3ccvrQe*Ve$}ȶ-m2.t\׸Cnr$2Wā\,o{֖4I] 6!/k`ﶸ.ib<v߃[}/~ݛw/zB͖f-Z6׵'+aw85,9S# ΰܯ7FBx@2kFmȕK"l=PLeQUβ؊.m^3d=1k\>V?@B3|:'x4}|dAZ m43s`!Mi\َLGM{GDcԨa'Vw jt'X u!q*-kG>vlR'٣f6=ik)vma6njaJv{tCfRa;c˸A,]!BݸW*rx-}D}GqߍU9)nr5&9V9w>:Ї.FO:җ3N:ԧ.uXϺַ{xk:'f_ " سjۄBJĢGH:a4dJzvT:yHe_g LBT&7.H@ YI*2x!!HI]!TB:w;B&3y~g-OSe|)|T"! nt^%J wG%9I^+}IPgd^Ӄ2.çzb|SH|8xq!?%rF~d3vzǀxv?p{QT{WG2OOwQ|({ 8 OP @URv!SQ="w Q~~WLN~]tG%X7SWRPw|DxL!x{A򂰑Q"wO҅JJigNv^Vuzh^ֈZ\evxo6$oesMr,'NA4rrhIf2sXs*XXr8Zo҄[ĈUZcx#gc+/茐#(ZE #ȍ^x&+X)3fW1Z3T1Ux(E Y5️ ikɐ,C Ii) Y5XWWDa^(钏)cWW-y(Y%5)0z%*++5ӵhɔI2QI,SITUA6i= VɒE1__v`hQki`l/k`sj Ɨ viٗ"%2vF&ٖF՘ 6i^90Y族阣YI9AZ_w蚯i/)e/..Ϣɛ4:Yi9- ɜ9yYY-ݹ#33IdFÁiΨ;.39&=60EƟ埱3dyjYpJ幟;c:I 4yɡ:¹b b6rar%+-J/ r52c#(2ڣ>.0j?z8JGJd+hmqShUqW*hնxmjmb gYJ_eg]kȦTFpjfgsJwen_zov]:d`*frqoʨQէzf:KFzhڨj eRUJKqEdMUkƫj*VJjDPҚCZ؊Cͺ !BZ ʭ n ʈZCzBDAگ4D{A:km ;ڰkZ %TkBz#z$A!["(A 4't2K[d8@Ӳ>kC4 D?@{:᪴ӳN=F㦝xXZ[wGVdر״ Gn5f+Ei!kqV'}Ynm gqE}GG{KEKy{FUroZjok;Êjkq,*~pG#ghKEqE ^^‘_b]ƻ軗b[\'ZB9YX%VG(HV답[UTU;[{꛾컾۾;[{ۿ<\| sKHV?਎+W"6䑈SÚ#Q$ey-r}1дFrUyS‡ A!N.L7ba{";6~roH Fap2,RMN TywSx}~ a$ObOdh_SaPg9ۋӫKGݻF^xSIMB_Xνjh>m\~l>O.QGn{nZFapNo$rN=1(}N瑾t~n.awy^?Օ',\~H+>뢮Z^3xΔȫXŽ Y띶5KEF~Xii'>OY6< hCң:2CWI 5#Q)9KZEu`/+8ۤck[]j(wi_$zo6i5(tOpy_ie"??_/I$n`I)/??ajrO/ίr߿~Oϟo~?D@ DH l C FxC;b8qFK6Ǖ[ #˘!gN;)L9bO tbR4thSR!RͤZ:2̮^͞Z6հdv\cײU'Q?]N}kj`Qez0H]S"fqqɔ?^eÊ7#WsgɟAWVщ9Nmlkgm:6ٝsױQ;8>i'7 6bh;z&ʵ3o9 -| ֥ݼor_51N@`I> ;0zArp=b 8(%o):\.]|1Cħ&Wq)wG?N#p܋FlJI&rI¢ҷːSA1̒0J:,41N=OJYҢ/ *}.5Fet4QEQ?-iRH#=PL }TS*MJ%S#M$.LgV[o5W]wW_6Xa%Xc3]eYg6ZiZkMvY[o7\q%7X#7]ue]wm\m᥷^{7_nMV_8`V[IF8afׂc=a'bb7cx1NcG&dh>dWfed=7bgMfwa9h~ߐF:iyХ:a&Qj:ke&l&l؆;n݆Nnޘmvoj G<5XqOW!rkFr7/s9=t,pOGVKu5g]iǽus{sWx嶽w[zꯏz7{ùk?7?W}{~~u~]M1n$ @&pkk`-> Va˜5nЃEl'WBz-^Ck5(r ̙(ш*ث$.щj8+oW|O쎆E.]^h0v*4nqob&5FNG=}bi/r!qGE֐ !BN򈕴Cl^|#A)BIr;t)5J2҇t=XP-q@]#YI`$0L’Ɯ؞hq'5Lm& &6ipnd9y@gStgO͓=9S~6Ȁ,-sCQ.7ӈь @AʽvռIOZOtkKwQO5}^IqjS:oi~=z75*T锩ӣS+UBU-R:n5uNDZt-+訚V}[_Uju*?ɊWUuh4XְElbX6ֱld%;YVֲlf,1lhE;ZҖִEmjU{ZΦV4& _cvj9ymݥvvWJ8[`)f^tU.,>]n[骮zn E–BB=YJJ抷>y{KL^ׅƵ~WC:\s[\ֶ2t5 cO7ZE`R0xs58 n 4  2c\-c95 M S)c\5팱X#5Q榲E_zQyV.|cʱ-j6Zjͥ}jg9o6͓sΆrtAC9Q.4}D#z)k4-Io4h/M;9ӘwCHz5s 1 then answer "Voulez-vous supprimer les recettes de ce mois ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom in delete this card end if else answer "Impossible de supprimer les recttes de ce mois !" end if end mouseUp PB($Supprimer mois de recettes  New ButtonA~on mouseUp put return & the long system date & tab & "================================" after field "recettes" end mouseUp Pt($Nouvelle journe  New ButtonAon mouseUp put return & the short system time & return & line 1 of field "etatcivil" of stack "consult" && line 2 of field "etatcivil" of stack "consult" & tab & line 1 of field "ss" of stack "consult" after field "recettes" end mouseUp P($!Insrer date et patient courants  New ButtonAFon mouseUp visual effect scroll right go to first card end mouseUp P($ Premier mois  New ButtonAEon mouseUp visual effect scroll right go to prev card end mouseUp P ($Mois prcdent  New ButtonADon mouseUp visual effect scroll left go to next card end mouseUp P@($ Mois suivant  New ButtonADon mouseUp visual effect scroll left go to last card end mouseUp Pr($ Dernier mois  New ButtonACon mouseUp Ask "Entrz le terme recherch :" find it end mouseUp P($ Recherche  New ButtonAon mouseUp ask file "Exporter les recettes du mois" with "REC1.txt" with filter "*.txt" if it is empty then exit mouseup open file it for write write field "mois" & return & field "recettes" to file it close file it end mouseUp P($*Exporter recettes du mois au format texte tmois xl  2005,6,6,2,0,0,2   rectit.gif @ GIF89aHttHHttHHtttHHHtHtttHHttߜHߜttHtHHtHtttHtt߿ߜ߿ߜߜ߿߿ߜߜ!,@H*\ȰÇ#JHŋ3jȱGh0BDX򄋑+h͛C,yRL}6 Pp*] @C3DH>iLPI-DnJ$ӌ:'tJ4\ʬzU Zzٿ LÈ+^̸ǐ#o4 Œ>'XFaL"eer0jKް *vVV g$eKR7w6awe)#d]nrO)_? d[-}L>HC҃DE)R[P-Y&$dՄ&~j "G@VERvyxRZu%`iH Od RwI%`V y݉L6$cUX&>iXf\v`)dih fbmT%&QQPQyAUВ9`'AT)N'$BB:"Sps:[\TzoA@W^;inH+Bm5Hڨ(\sAՙ (V۱u.e,Fp~4mX-X>DtUL'QuYe#P8s?u!BBBMki j%%⣫@Mj3ūW{B5݁ 1\H1_ Y)^]RClʄPTFKKD0VWFD i`ɅxQ/@b'6(C։,%BHB`0 "D晛 {(.K|x ›ݫ;^[1W4pگ,IUwSdWo@<0Xn)"h7}lUr!D_U qXu0@iסFm}j65hHqƕQ~h$E#ڵdyH!.qh9HP qeIvfL'.4qYI5ImͩC~ Y Tי}(au@<*b4@=aDiCDv:@b fڊވ|YŪB~&ժξgTѦlBV.9mYݖt-gjm!~{5-D{@`ʖ/IE 1"FA K0p„) k+[ѸkO%֨yv.+W<4P-kU…yzE= m[!䙖8@P2(``8 : QrAt `t5EsxOIU?aqPQ]PQBvE QdgPc砇.褗n騧:PEq뫇:d}FvPw/D IrG/E=Wۛ=VT W7e}}:ރ~{SU';ΨԵ~XΏv "!AP8 p@K)`=r$nbζn{Mrܱk^B!PJ~Qj%98Y|׺>r2c[ &nm,O[3θ7qr ;~q7W*w96@|6w@yЇ>HOzҏ;KG:ӕ X:ַ_]`Ǻg7{^vfww۝o@|xp?;&OyP<7yG1S>ҳDOW갏졮u=O|k>?ϗϾ{oJf5~ܑV֮gCfY+{'pk("o;"&&D6$+xS17q!?cc&+}%)21pY7%;3M6ij8(c(҃-Hv-`>`7IY0+AY,N2) bY]NU"N*岁 A/VR071Y+26F,C^ǃ=xpfȆ@p/a="~)CS/dYEuTpH~EjxȥTSQ2!O0O#@"$vS8OwLU1 Ձ1($1TObGth8荍؁F(HRYo1g\!Y2H<!Rg3`8h/9ȉh-8縊2zSSY-8Әh ATXY1-SFh@# ;DD$g83’/P & Ǒ EELOFa=5~3];`I}TCqT]R ;<ԑ zAٝ GiX9W4GiHTԚ%G9 X͵MI=*E9:zZnsEbUFԥ]}*ܕ3YEM+j&lvQD4WJ6?jŨBzDZTGI+c۵ 7䴌T)Y Y y !Z WFM.P! qjvz-KMʤ8YjC4ZA}-ńWy_%6`җרANh|;F+2ة76L)-0Zh2>VO!%ZRa0e *YXyԟ_**Ժ\YQIQZ~xi>Е^z\[F AN((xN#oڮX St 7E'yZ5^e:R5ሪNiL. QƥZWf-Ki*Ɉ^J^:09ΨpX9զ5+M-] jdzZc0۵ª)`(Jzbp]3HeyY˨/v{[VvNN[1 q>;ۣ&ff)7"\#!AXt =jinefˮB>˔Q;]q ՛6qyd WKӛ껾۾ޫ-vA?+[bq?$Ap'F W6BhU8ⴛ[zW&|z*D7u0Lu74u|8:,|>w|B<ĈG}F|ĞWr$r1z*(QLzNB:~)x}'-Ԅk׃:Љ""&U9@ Q`uA؃1q#&4mop6aڡN/x:}=ւMCa3RB-۰]גּTgv10gh)QQFE*5SB(*4ٝ-ۚҜφєرhh1yӐZ+ڰ]]N*A 11gNu/ 0#6ېYފ}z_e#q\M3=f J G0#l.n6oB10(S -h`4]Y"6[H+ (n,bdl.Pa5č'A4!޾ڝ+mMK#M] =[~g v7q*%`b3A&i)131,XXR>XӭXᚈ.^k^͢ޱ錮߾}xR}=(ZI R(39=_m Hm?*A^#.39鶞VR|66=֊f1-"t#S9#8/ eoNNd#@#`8ERߖTmn"]/MaCG$Y"r<6Oڷes߇./̄QDFXQF E@Dʐ!@zp `HRBH%'f0#GE]SRQ>UԨJR:@\nV^ɂEkl٬Z-۵ Ruś.݆|eC #lpm}mZkϾղ԰o9KkթåMFMbԀ[׭1hkyWT-7{2\ȝ&m[t9F]vewʕ3ġE߇o}۵;݊"/;nl*;P2Bk? /P12>8 APL:Fo1*0sdI'R9*ESB76Lɤ(@3׼M͉J,od =144 PȄS#98b,Q4kp)1U34ӴSKEųE0.̲L U4VTV[;6"u^{ԓO [ZeϾJHV!OZYY6\NU6]SJ/=J\y }3BBdw|y3.TV<W 율`_)Dx ,6h&*DrB%V \i CY`hVjQ}!)Bid9&裗v'p2h'KxF7kҹh9φM3X{jP@$Dy\k3X͒Rh1opȿ#=pU8~|c%}?<m)6 b5`m *WiXǕe(KݒKzJu z)b7%iK& S&o%JV"?I}LuMEv͖\-%aҗŊ]<(ei5f.M89RlJ]>Z#Gi5S4]<5ʤEեɂ%`*]`bhN}AC}RQTn st*SS($IK=TDˊJ56A9R~| b>.귵inQWqUꦎfYUUu!SCP+?qx l< u"gh7u۪ZWf\V"Ş(HVM+[-⥅\_Tݻ!Нם<ۘЯ"XԞ{v T@7]R̕h &1qXװf~V^3>Udd< ֔lRo[YV]̓9` c3®pI-QvX[19~-"zj_V(F@CNFC3)  P=ф[[PH9yXP6e3^r`vc( d L`3%ħ?o-J/ g&Ğ,lRhǸl-w<vE>r'GyUr/yoYm7yus&xЅ>@Lf<1~j[O:kkꘒzu}uFO^W?y c[jI> Q}1k!Z DJۉ,onxsXG|M$$AI4^vUz{ 7}e?{=6{~?|@|7χ>0W~?~G??$44{ד==@=[ = =>4 @C3+D웾sAkKA[?A !D#D$T ̽`@ |=*+)@ B =/܀ 0<>.,21$C1$3t0T>D>L9CC9D;dk D@$DB?,D>FG,pDDKFDpH|MDSkX?(EU?VDEVB?EEY,\"XE\0B@b4Ba $\jB)|B,\ iBhh̽T o\:yC<DT}<DDDDHLLDkLD|ȉ\H|DRHRTȎHőX$I[Œ?B],F`Ƙ|a<ƘLdL@{FɞʠJ4ʣTʥ侂ʧHʪ?"ʬ$ʮflԶ#˲4˙˴T˵d˶t˷˸˹˺˻˼˽˾˿$4lTdtDŽ̛6}CKLʄ,̍ͽ9&$tȄ8rMs#s8ϔ33qќMţKZ7WrMqSDp{KjNzMqKYLMtդڌ7KD!LPLܐ 2K40;AK4H / 'e),$/ j,$y ʮZ3ρ'.2PY:|9 > P:z a&! e)ј闝P: R h<= jQ'-!<*S+.,*u!P3P:ê'Ћ˱{%=4 %0" JrAT»h6trQ ,Ӎvg^D uF^>c_ cdUBfT6;a=5-]f% }u1t^kN#%sNׇEfYunK&O]NWVbNv'\6}d2&&h4^i}i5e fb֖^X%&i9M-/FWu_5jii#jxܩ}|,'aO6s (`^kl6>ng*üeP]M" ] ^ezHldk=liuVl((^ژܮ% b/R(nж]c>])aV>l"^.i9h (NNo_vK&C6U k3Ćj5 %Vbf`Z5pYn`nz1FV.L^n|.pՅ-QծTv5 N)~k2{J~ֲ!g. 2U{mFE+5N ?i> -6n-`Z d,>loNz ͳxr2 $GlffK-1Š>1*4 s/30o!vo Kj$cn0 gssSsrN#'Z('6\ukOqr1& Uňx9U[#loff21δ P"j[rSGF" uu X HuFKWtVaY.9)n N4N(.FvڲvzFn5+o/<(x_ Tyg' *m"7Ԟ7%@yvo6sʦ W%?yW7z@wa_o/G{,z o7^,; o #ɷ)ﺖv@|!1)';ȿ6_Ο+٦ {tW YC&@}}E}}) /}"M/u7|WYX}8wzm 1K)~bzs3y|G?*«),h „ 2l!Ĉ'Xq"ƌ\4GK paɓ;jl Kg|)% Μ:wgΙ@ ѠF"m(ǞOsi*֬Zf+װ R C̔RJYKʚ"@%M ` f͗E31dȏRneb>v4L3ТeZm&dbd0ҵ76@{dϞ"i32r1'wrѩO9s\2Mǝs}p # @\rlJt o%tY8^kxRgbAsEuO1'uhRGjuCF -8N(+FH!95e FȠ]X"=XXXARCb2t6Xf8%P FxFz9&Hxܓ H]v4Z%S >`)& g%y(YhC&f8 d7YRٜ-$Izjj铒6`tቩIiR1~Gꎾ 懏ꤘҺzƨu;,]gݖ(.%;):WunNkPFE;/{/껨Xzy,Z% ڪPK*[L&4nqNrII]9-21|hW) +Lr*WrlE}4 iћOYP6sNSlE%5]OtFMϲ uviK6+{6q3 6Fbg?r >8=c+|W =Yg.jY~9d8+~.$\irGncJs.6z:Ӣpz#eC_<_(d#tt:˫?;[fO~:z|{u#K~ç6=ϥ5tOSUqXnF$a-%jhNLA)bnqq'TZ#B2~d Fa1+e"@R.{(2#b(J ?L749K%H0Bq,c۠.>YҤYvĠ %eDֲħ= sG<, Y_%_DvEmBcH@ @tɚ, (!K*[2fI\BAr͌;FNoX51W:$5, HA6d])'_z^zfbJʂFUhC|3=P-)FC3щDI8Jhq,Jя^h"Q)|䡕DjR{qOe -55Uq kJ SvY׿un\l)])no&a%}^+F( Ee(e8JֲDƨYU,i4؎ʰdYW'jT]"m4ֶv}t u1$ u[UnvwThJpb]R[-ɼg_pY[D" |-ζ%8JY(`yTr^nMuycW!5&1ݻ͂ܗ}9g:Ρ}'E>FHbʳ/;.zӁ/\Հ+*]y&I!~H4I $(ozzUt5H453q.$QI)jgydGs2j 2B\H@6:ŏ~Tc?3C}Q+]6GoO_L@<}3Akg8o #FM'l+v)նx NᚍD߬uM6u;hJpx v 5D`WyܿÍmbgU#Wx{Gмr;h._w*KCkX_D,[?57N$idddrT6F~eP%a׺5Vn]3%Oj[^1:DVc}d\%8n2D`B\6D]騕92WeC SJ소E`WaaU3%d_^$yf&Sk*aG恘b_d0c&RVąq^_dW!w}BaU &q~dngqI"uz!s/zgz,t 㘦=µ~Lg1ʧIRgd"^$ ([ ezgTt*naB\T~'wj6(ԙۆ%^hjfhX~B&&(yl h0O ߏ~bۙ ua_wVii )ii~*) )".fhy2"Bhzͤ ؜'^)exi DIAYJXQ`eSNᙝ. FhAYڌX  M*/F2oM^/fn/vo/bo/oίHmgTmHX$>.$F6a,pp,"pFY05m[yFEppGxՒ`p-=npp0t D1e _ Oުvpp4;1WlSZp|DZ `'q 1w- 0K f՞h h|0+Xx4ٱK Z F& ?wrIy #So&7nq0p>1s,rXԩ*'k"K822//܀031132'043?34G4O35W5_s3l37w7388SL93::3;ij<3=׳=3>>3t?3@@4A?$B/4C7C?CL4EWE_4Fg4FC224H 036I4J?63KtKs;ǴLϴ9>4NNs?O4P#4D5Q5HF'R/5GWG4TGH4UWUgKgVw3LӴWN5YuO5Z? Q[#Rǵ\OtSS/0ߵT'^3Io_v6Ks`Gs`6a_J8VJ;67w5:S6X3Lgve<3 Fg>{v<{6i>ZA4[B6DvB5EKm\+u] ^HH{4M5Gpp3v6DssDttvutu4t?t?wa6Ws6Gxc79x7g6GtMw||u}wXwMs6Ovgwj>v>8O6P6l5@nF6"S5q#wpkx wp3`7 6b83k7M,6`w_c5{Oyd7MpuOv~Wv|7ew5b98h7iv8_v@Yk94ut׶B#59ӵn6nG8#yoxox8^ :k8_8k8?8?z8`zkyzG73wk6ӷk6}'sO9Ccyio99o9yl9y39yǵptT+;a?e_X+h3Migv׻i 4MADsZ |95G +;τ;QLLW;]S;Gs;c8Kɣʯ'{|DSxSE_l{5bϣȓȗɛ{<ң|3Ǽۼ_'3=k;vKnS=0=ڧگ=۷ۿ=ǽ=׽}C; poids(h@(L  50  taille(h@BL  1.70 poids2(h@"L  90 age(h@<L  90 creat(h@VL  170 ct(h@L  3 hdl(h@L  2 tg(h@*L  3 ddr(h@L  09/01/2005 bmi(h@xL  17.301038 Fc(h@@  28.125 Hc(h@B  33.088235 ldl(h@FL  0.4 terme(h@L  21.142857 jj(h@T  25/09/2005 New ButtonAon mouseUp if field "poids" is not a number and field "taille" is not a number then answer "Veuillez utiliser le . comme sparateur dcimal !" else put (field "poids" / (field "taille" * field "taille")) into field "bmi" end if end mouseUp @L   New ButtonAton mouseUp if field "poids2" is not a number and field "age" is not a number and field "creat" is not a number then answer "Veuillez utiliser le . comme sparateur dcimal !" else put ((140 - field "age") * field "poids2") / field "creat" / 0.8 into field "Hc" put 0.85 * ((140 - field "age") * field "poids2") / field "creat" / 0.8 into field "Fc" end if end mouseUp @L   New ButtonAon mouseUp if field "ct" is not a number and field "hdl" is not a number and field "tg" is not a number then answer "Veuillez utiliser le . comme sparateur dcimal !" else put field "ct" - field "hdl" - (field "tg" / 5) into field "ldl" end if end mouseUp @lL$  New ButtonA(on mouseUp set the usesystemdate to true if text of field "DDR" is a date then put field "DDR" into d convert d to seconds put d + (604800 * 37) into t convert t to short date put t into field "jj" else answer "Entrez une date (xx/xx/xxxx) svp !" end if end mouseUp @pL   New ButtonAEon mouseUp set the usesystemdate to true if text of field "DDR" is a date then put field "DDR" into d convert d to seconds convert the system date to seconds put it into s put (s - d) / 604800 into t put t into field "terme" else answer "Entrez une date (xx/xx/xxxx) svp !" end if end mouseUp @,L   certificats0on closestack save this stack end closestack `Certificats et lettresUCourierUTimes New RomanUTimes New RomanWTimes New Roman @ @i certif.gif @ GIF89aHtHttHttttHHHHHtHtttttHtttHtHHtHttߜHߜt߿ttHttHHtHHttttHtHtttߜ߿ߜ߿ߜߜ߿ߜ߿ߜ!,@Hp*LpÆJHqŊ/jqǎ ? Irɒ(OLr%0WʌIs͚8osϞ@N|yѣH*]ʴӧPJJիXjʵׯ`ÊU ,EǪ] 6kHkF6a=v  @`!-;`͖10*\8 3/5P:kНW e}]ڙ# h&~ n&V+_Ns~vYٽ7~ϗ~oj~u\qcM'[յǛ}m^9Vle (NU7!"Y(0(4G?u$Tw}C:2#GC(ԎA<$ID# YCS&$BRIJ6e)X< Fa٘r^ئY٣ȧD':'Ze'y萏&J(|ޙiDZ(&Z)w*]z*tB Ro:"S>!ÒU,P,M9;Abm6-R܆+V;..ztycnn޻i{/(.pp2.;pwg?\BqẔڍ,Ų3Ӭ7L^'(DmGcحH7PG-TXg\2w-dm6j.lIk)/pmxS(7ؓ߀N׳,'vյVG.6Jn#Mw#RN)褗nXCtꬷ^u.8wɵ簯?:o|޽_}̻yG/}>?w=X姯~vu~o?WS{.ML /:'>z$_ bς{ < ':խ+! g!w(n@ H"HL&:PH):(_=1[Q^841 -U!\*+gPӨ}xkc>O-Z(;J$"F2򑎌$$'Y1JZR&3MzyH ~kѐ;G) X"Zj%>I ^<^# 䒔27pxP8{*0L7"EAmp(6jnHA`K{8)#K@ +RP""/|g X,8)DeT3EBײ4Xʢn67Ԧ:PTJժZgᒘ%9mHIMSUvLd H$%3#1d G5i]]3fQz\E@1Sk8E*JulXJylX5;rOx f[9r6hlfC{;YzWe[0i,Wce٪ b+\7-n6t+{. >ֻ!nv&^[$k,x;^F+g{^Rwmozի_ڷ%/voٞ`6X&wbRŞF}0&\kFT/.^cb8y_dJdH d!rM2,*׵ۆeml;2\6*{2歉pLgͩzu7d=w&ЈF/Їv2I[zl*/AfQ]1Q?Mn_W-R4wMOY%blk6mE:.պ~6,]Gڲ2Q=kjs;ۋNoMjvṻ]ks~Ɵ|Yh^7X=~b5j~+ umݖH1jmE.+Fj]O֬b֊l7' s|5/պ>:Ї%H?ғ%NoԣN[Ꚅzߝh=R\&Ţ"*DRqQsRҥT-KR_c^qT`*!%z{WcO߸WD{WRYa}UQNlP}$}sC {WKd{{P}]1/!bP'LAQg>$q\!TA7'R}Y}XKGA4xbQXSx!w (xDCq/p]!}YwOAwexOJ{Ka';4HOxNaa!t(Teh*rXT?lvEW"vU؈8s(a%pp#r'GV-q+8VitlUhU(4r~V~&sqQ6-ዡ8eBZX$Y^?EhD?CR ?J[([B`b;dTnTI?#[cY1ZǶ/"lD󦊆qk\gֳ!oKVldcwwJz#!ǸVFùQq;CB6+o۷ qj"[pk9kh;RTū4fdK˫JDVȼV$HWwXڛܻ۽;[{꛾컾۾;[{ۿT\|V&\ \A&Ѻl<6 ~*U,R!l7R8X!Q)mJ@aH4RQ'z[$^&~n,.0ElH8V6r؉=pVt7GEC#68rO艳ȉ@Tw6]Ί.T!o匥R:VuA^N\>su>9P;n$yhn¶歸B)Nbi,bMF)n]%Jgni"~^ Y&ܐBHfY9X~r!]@^XŽh;8u1$Y.iWY~>틑eju3rNX#ZNbꩥ3Na)NZ%4 Y)?+ m>?dOܘb. M/dC-Oi9}^h4_3 $#'$B_y6]D49rr/SoIED?Uo@1 ^a?D":p{xF)/O o䯙oJ.oD@ DH l C'V%v8dȑ$/V,Ǖ,5l0K*dx#ŝ8arbM1T)i¥LZ$hPSZ= QS]F}Ќ`=kֵiբ-KV[2;lLw sgΕCc69BҥEK4׃=uڵy,^&oMiݻөf><9pő侽kY{?ozvS?g>{z/JML#C[J9T:j@At<EUĭ W44Co _.FkQG G8ڎEDO(I 5q9(2,&=M#)Ԏ1$P6MtOѼN C@ B,Ӿ5 @Qj4{tIDDQTNԪRϜ&"md5VUk}D2!5UMIE6YeeYg6ZiZk6[m%N7\q%\sE7]u%VI$ׅ7^y祷^{7Q ݅+_8`&v[|`fa&`~!b/Ƹal+c?9d햼GF9eWEe9fgy]9fwfog&h ETfi7ib:kx㤹;lϽF;mn4d߆;59/ͻo's+r=7\csGIG=u{v[u_77pavm'Wvw6y>:G$OewyOr>|Y_|9'?׏zهq_Ͽ786vlZ@M LFЂ55 nЃBEp'TQ˜/D a8Ï/w4BC:l=b~D"i+bVB*щ6ٞ8EzɐW"NE.ˆb5D1Zd4cvD эg쓻nF:,2a8tv,Ga?Δ}5B OiJR u}A5Q]6MS꼝NDJՖj\E_ Iԛh$J?ymu+סtiZ{WnyZ>Vws5,a'vϬ%c!+NVz0KmhE;ZҖִEmjUZֵֶmle;[ڮl$ۅ[ַnp;\73XTfDZ g\kϺ{;Pk.?tmɺXޮɷ"}_wYMn_c/M狿rl  0HZιmA+b޵wZǨbtvK@^񽱃9l9WUd1ߗ k1 a [3d;x^Tr[_ܻ0?2^+ks ]HHrYNF+ ZȜaJI 0o)8I7Zi1Ze-/=gG^OFRw5VZUsyѷ~Wk^Ⱦ5#k[ {b>Wv5ie';fQ\k;Mpj܌.˭; certifi(h@  Je soussign, Dr Tartempio Grard, certifie avoir examin Monsieur X le 04/09/2005. Cet examen ne trouve aucune contre-indication au mariage. En particuliers, l'examen physique et les examens biologiques sont sans particularits. Sce cerificat est dlivr l'intress en main propre pour valoir ce que de droit.   ` certit ll.  Certificat pr-nuptial  Certificat de longue maladie  New ButtonAon mouseUp answer "Voulez-vous crer un nouveau certificat ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom out create card ask "Entrez le titre du certificat :" put it into field "certit" end if end mouseUp P$*$Nouveau certificat  New ButtonAon mouseUp if the number of cards > 1 then answer "Voulez-vous supprimer ce certificat ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom in delete this card end if else answer "Impossible de supprimer ce certificat !" end if end mouseUp PX*$Supprimer certificat  New ButtonAon mouseUp go to stack "print" put field "certifi" of stack "certificats" into field "pcorps" of stack "print" put field "certit" of stack "certificats" into field "ptitre" of stack "print" end mouseUp P*$Imprimer certificat  New ButtonAFon mouseUp visual effect scroll right go to first card end mouseUp P*$Premier certificat  New ButtonAEon mouseUp visual effect scroll right go to prev card end mouseUp P*$Certificat prcdent  New ButtonADon mouseUp visual effect scroll left go to next card end mouseUp P"*$Certificat suivant  New ButtonADon mouseUp visual effect scroll left go to last card end mouseUp PV*$Dernier certificat  New ButtonADon mouseUp ask "Entrez le terme recherch :" find it end mouseUp P*$ Recherche  New ButtonAon mouseUp put return & "-- " & the short system date && "-" && field "certit" after field "certif" of stack "consult" end mouseUp P*$Exporter vers fiche examens0on closestack save this stack end closestack `#Demandes d'examens complmentairesUCourierWTimes New Roman @ @ @i certif.gif @ GIF89aHtHttHttttHHHHHtHtttttHtttHtHHtHttߜHߜt߿ttHttHHtHHttttHtHtttߜ߿ߜ߿ߜߜ߿ߜ߿ߜ!,@Hp*LpÆJHqŊ/jqǎ ? Irɒ(OLr%0WʌIs͚8osϞ@N|yѣH*]ʴӧPJJիXjʵׯ`ÊU ,EǪ] 6kHkF6a=v  @`!-;`͖10*\8 3/5P:kНW e}]ڙ# h&~ n&V+_Ns~vYٽ7~ϗ~oj~u\qcM'[յǛ}m^9Vle (NU7!"Y(0(4G?u$Tw}C:2#GC(ԎA<$ID# YCS&$BRIJ6e)X< Fa٘r^ئY٣ȧD':'Ze'y萏&J(|ޙiDZ(&Z)w*]z*tB Ro:"S>!ÒU,P,M9;Abm6-R܆+V;..ztycnn޻i{/(.pp2.;pwg?\BqẔڍ,Ų3Ӭ7L^'(DmGcحH7PG-TXg\2w-dm6j.lIk)/pmxS(7ؓ߀N׳,'vյVG.6Jn#Mw#RN)褗nXCtꬷ^u.8wɵ簯?:o|޽_}̻yG/}>?w=X姯~vu~o?WS{.ML /:'>z$_ bς{ < ':խ+! g!w(n@ H"HL&:PH):(_=1[Q^841 -U!\*+gPӨ}xkc>O-Z(;J$"F2򑎌$$'Y1JZR&3MzyH ~kѐ;G) X"Zj%>I ^<^# 䒔27pxP8{*0L7"EAmp(6jnHA`K{8)#K@ +RP""/|g X,8)DeT3EBײ4Xʢn67Ԧ:PTJժZgᒘ%9mHIMSUvLd H$%3#1d G5i]]3fQz\E@1Sk8E*JulXJylX5;rOx f[9r6hlfC{;YzWe[0i,Wce٪ b+\7-n6t+{. >ֻ!nv&^[$k,x;^F+g{^Rwmozի_ڷ%/voٞ`6X&wbRŞF}0&\kFT/.^cb8y_dJdH d!rM2,*׵ۆeml;2\6*{2歉pLgͩzu7d=w&ЈF/Їv2I[zl*/AfQ]1Q?Mn_W-R4wMOY%blk6mE:.պ~6,]Gڲ2Q=kjs;ۋNoMjvṻ]ks~Ɵ|Yh^7X=~b5j~+ umݖH1jmE.+Fj]O֬b֊l7' s|5/պ>:Ї%H?ғ%NoԣN[Ꚅzߝh=R\&Ţ"*DRqQsRҥT-KR_c^qT`*!%z{WcO߸WD{WRYa}UQNlP}$}sC {WKd{{P}]1/!bP'LAQg>$q\!TA7'R}Y}XKGA4xbQXSx!w (xDCq/p]!}YwOAwexOJ{Ka';4HOxNaa!t(Teh*rXT?lvEW"vU؈8s(a%pp#r'GV-q+8VitlUhU(4r~V~&sqQ6-ዡ8eBZX$Y^?EhD?CR ?J[([B`b;dTnTI?#[cY1ZǶ/"lD󦊆qk\gֳ!oKVldcwwJz#!ǸVFùQq;CB6+o۷ qj"[pk9kh;RTū4fdK˫JDVȼV$HWwXڛܻ۽;[{꛾컾۾;[{ۿT\|V&\ \A&Ѻl<6 ~*U,R!l7R8X!Q)mJ@aH4RQ'z[$^&~n,.0ElH8V6r؉=pVt7GEC#68rO艳ȉ@Tw6]Ί.T!o匥R:VuA^N\>su>9P;n$yhn¶歸B)Nbi,bMF)n]%Jgni"~^ Y&ܐBHfY9X~r!]@^XŽh;8u1$Y.iWY~>틑eju3rNX#ZNbꩥ3Na)NZ%4 Y)?+ m>?dOܘb. M/dC-Oi9}^h4_3 $#'$B_y6]D49rr/SoIED?Uo@1 ^a?D":p{xF)/O o䯙oJ.oD@ DH l C'V%v8dȑ$/V,Ǖ,5l0K*dx#ŝ8arbM1T)i¥LZ$hPSZ= QS]F}Ќ`=kֵiբ-KV[2;lLw sgΕCc69BҥEK4׃=uڵy,^&oMiݻөf><9pő侽kY{?ozvS?g>{z/JML#C[J9T:j@At<EUĭ W44Co _.FkQG G8ڎEDO(I 5q9(2,&=M#)Ԏ1$P6MtOѼN C@ B,Ӿ5 @Qj4{tIDDQTNԪRϜ&"md5VUk}D2!5UMIE6YeeYg6ZiZk6[m%N7\q%\sE7]u%VI$ׅ7^y祷^{7Q ݅+_8`&v[|`fa&`~!b/Ƹal+c?9d햼GF9eWEe9fgy]9fwfog&h ETfi7ib:kx㤹;lϽF;mn4d߆;59/ͻo's+r=7\csGIG=u{v[u_77pavm'Wvw6y>:G$OewyOr>|Y_|9'?׏zهq_Ͽ786vlZ@M LFЂ55 nЃBEp'TQ˜/D a8Ï/w4BC:l=b~D"i+bVB*щ6ٞ8EzɐW"NE.ˆb5D1Zd4cvD эg쓻nF:,2a8tv,Ga?Δ}5B OiJR u}A5Q]6MS꼝NDJՖj\E_ Iԛh$J?ymu+סtiZ{WnyZ>Vws5,a'vϬ%c!+NVz0KmhE;ZҖִEmjUZֵֶmle;[ڮl$ۅ[ַnp;\73XTfDZ g\kϺ{;Pk.?tmɺXޮɷ"}_wYMn_c/M狿rl  0HZιmA+b޵wZǨbtvK@^񽱃9l9WUd1ߗ k1 a [3d;x^Tr[_ܻ0?2^+ks ]HHrYNF+ ZȜaJI 0o)8I7Zi1Ze-/=gG^OFRw5VZUsyѷ~Wk^Ⱦ5#k[ {b>Wv5ie';fQ\k;Mpj܌.˭; exam(h@  - Crat - Plaquettes - Cratininmie - Cratininmie - Glycmie  - Crat - Plaquettes - Echographie abdominale - NFS - Scanner crbral -  - Glycmie - NFS - Echographie abdominale`@ examtit l   Bilan de diabte (annuel)  Bilan d'HTA  Bilan de routine  New ButtonAon mouseUp answer "Voulez-vous crer une nouvelle demande d'examens ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom out create card ask "Entrez le titre du bilan :" put it into field "examtit" end if end mouseUp P$*$Nouveau bilan  New ButtonAon mouseUp if the number of cards > 1 then answer "Voulez-vous supprimer ce bilan ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom in delete this card end if else answer "Impossible de supprimer ce bilan !" end if end mouseUp PX*$Supprimer bilan  New ButtonA7on mouseUp go to stack "print" put field "exam" of stack "examens" into field "pcorps" of stack "print" put line 4 of field "etatcivil" of stack "consult" && line 2 of field "etatcivil" of stack "consult" && line 1 of field "etatcivil" of stack "consult" into field "ptitre" of stack "print" end mouseUp P*$Imprimer bilan  New ButtonAFon mouseUp visual effect scroll right go to first card end mouseUp P*$Premier bilan  New ButtonAEon mouseUp visual effect scroll right go to prev card end mouseUp P*$Bilan prcdent  New ButtonADon mouseUp visual effect scroll left go to next card end mouseUp P"*$Bilan suivant  New ButtonADon mouseUp visual effect scroll left go to last card end mouseUp PV*$Dernier bilan  New ButtonADon mouseUp Ask "Entrez le terme recherch :" find it end mouseUp P*$ Recherche  New ButtonAon mouseUp put return & "-- " & the short system date & " - " & field "exam" after field "demexa" of stack "consult" end mouseUp P*$Exporter vers fiche  New Button(]Xon mouseUp put return & "- " & the selectedtext of me after field "exam" end mouseUp lOGlycmie Cratininmie NFS Plaquettes Echographie abdominale Scanner crbral   ordonnanceson closestack save this stack end closestack on opencard put empty into field "mlist" repeat with i = 1 to the number of cards put return & line 2 of field "nmed" of card i && number of card i after field "mlist" end repeat sort field "mlist" ascending end opencard ` OrdonnancesUCourier UCourierU helvetica UCourier UArial WArial @ @iord.gif @)GIF89aHtHHtHttHtHHtHHtHHHtttHHHttHtHtHtttttHttHHtHHtttHHttߜHߜt߿ttHtttHHtttHttttHtHtHtttߜ߿ߜ߿ߜߜߜ߿ߜ!,@H*\ȰÇ#JHŋ3jȱǏ CIR$J\ɲ˗0cʜIM)5ɳϟ@ J(M wfDԨS'U2JիXjʵׯ`ÊKٳhӪMqj¦>Q[x˷݅TܷQ?$!P1`H\L"LB'][tbAiHl@padP]Pe< 1AoOsDGxGL\EQ`Go 7qEBcSAUY$SI{(w6ՄB՝[Ety0*"EՁO%co!@"Su->4#L6EJ]y.ByVf\*"Fvi߭ehlpvєU)fay|Ӌt4~%d&M:Р>eBJ[eBz+pZ` [$06YAZjz~v2z ŨQ$8YpHzJK >Vijcz>5ear;ԤkR&vBYVIR/ :j2*fpZ&n,ZP)JDn$hH}̝Ɇ*D( UAj2 I'Bk([?\BB-NtB!h{Ѵ6!zm!lhu['@9&kE&- ,`/أNDٕ5bJ1 CnۊmgHCTiƖ)SmahiZdzZVql[!{ĠcjGysץV+;z؇Ooy@ao.?_z Fntok Rx-w@jQETxADԻT5f_)lA ʛ 5Ƚ`W'ƄiD FL"9)H| *P՛?B1AK9jaHXGQ,a:I'4ksnlBG3*4sܜwҤgUMUEmb\$KTM(ø#`[ ؄בANf|3Y֕ h/[i'9CH@qؚl҇ Y@gQN Y>&`&AHy>SQ7ǩIA:O湧* z>Nn|FQ5O\GB28F (LYUuFD)0KAE]|s2'>4)"2"R|N+C+>qoDʘWE%r4 kqxԠL!pd/#CU!-B2}MTⅮyo\v7Δ gύ峎h^@ֺlZmhΚs}53s2CB h l (vm0-Ι&Xx/ hx\Jqόf_kjOi5kaכ&i;(,uںfT/qZF P+X[*5=$wn=ȻVnq[. Nqo,3 ĕ '%jfO% ]14Ex U Z|63-Œj}C_MRC\uimB4 qGO^M0ypOv$UN;1ƞ[ZGU<&6n;kC>#NG>y~f 4:Ke5_L{̶-ϱ^)Ik^%JP:u (v7&4,'&>[eŸ偌fux^#ؘڈ^؍`ȈXvMS\1zrN5'SL9Y̥ ِ<1E( $u㑑ȑ #E!y6dc])IJhDKhtX> VF0;"p8')@ p8?"7Cj!d"#fH.)WȌ8$W  !dQF+PV`H`G!Ove'`QwAe!F[e>W ;ja/Fiv$AIhaoSEi@jIff%d !1G80X Z qbwLQFT W4bza8޶o_AQ` #$ho ᚈPV`oy=QP˩>hxCH_#Lac֞4V(VGљZq!4 VމL qas?t-6!Wו҅Y䗓= hjDD@ dR:TZN3NI踥\zP[aZ(^9KWg庍Ah6[*:64J4:<r*j'X<4Cq!P7 ('97]9Kj?7T zt40@dGj'0vG}wzMYBCˇ`Kb$?GwWc|wD[8LZC3 n%LI9 qR`ںR)5H[H&0ZhPsǵ_סڼHc1*x; %ɳp #*ۨ{⛌pI|/|B1ts+T,g)CǾoLBwSoȗwз|'G2T}K+4=P:"l2${^Zq[#ߜnV^h~븞뺾.>^>ؽʾq~솶Q#K?N햚Nָ]q"[K$.AT.DKa ^~-.{Q x^^J5. ?4L.~]$ ̭Ȳht򠛑 ʹ!A_YY&}o)GDp*ѝY{!h9hyiex7"\)NK)1o#ziK3@P3aɛ񃈢蹢p !fG O;!X,j A'qRB5"ee,ʹgv)4:hwO6QHO`Q aU!/a p0F_e!xX<˽"qGxZG>CӒK@@2DP!BHF@"-. q#rQHN&$y$ʔ#3nTRf  48" pxCЙ!(Qď_ThT# 2JZ5U2"J<#ӔfjhVmݾڋtٚ(FC T0 I@kNQV%-^b6"Dry"It(႔BҔ ٶ f|0cH$;pō#0yԂ5 ::m}{0f)C5 K1w`n(4Kw v쫴re 7tki$J+d <B$jr/s6Ė Ob=k(Jѵ2l2*,[A'R9ޢ.|,.+,1C'T !!2΅[(#AC,% JI9A%PC4*ETCT…~TAH/=TRI1SO?5A[R?EEոM7MUW_5֪XUT)O5WKԵW_SZV 6aMYg7f]ف[oV><[_å\ueq*Z\M]z7VEZ}A_&XN~#KVa(e*8c7&~8NC&d%?}We_biG9gHAb%&H\c祟gR[Wc[jv֤Z&l a^c߆jiv츑n6umɵo^pWM{b O'qՖ_5 ^^,'xxw%P!]@x>+ "$ P Kdp0E mrW0-'e3ܔ5G! eAuwY`pĝ8OJX A :8h^ CBER"UT:Ӱ7C AvQ!:I6$y8B:J#Q=<*Qqb瞸@1{cTbD@Xv'+Knx6~Ҕ.K#Dⴭ Y*uHO,i78RdH-YDx.FRѠlyc"3~9g>'0Qy+@ TBft9өByGcJMb j&?d&üT1#ЙbdXTHHȨBZDKntw4Z( n iLOIvQ(D'Ԓ=%d>z2*"..!xyK~l|3q%u Y1jMZըiSVI>ĊBoTkfX:Xuu,a-.u5]ldR`]IHR$U%fi] _ lf˻^X}/{)ס71a0\9_|w/޸΋`1]Y |M߈Ҵ܌/,}SMHTOd 3U %TT]y,jp I݄Kˢ׸ ~~FB)CII5RL0^9U&H*,; xrTSƂcn]t۩ռʨ2p_}hVy0* Z/9:gΝʳOKwI,iRC ^Ke9ԯfue;?ťɈvj]z\4xHٹ~k h:uӫly)_3tϣV8q#Q}CfPtV} gujOQmEʖ^-Sx:5xiM"4=IȘz1nUNw_ ׌'W?.Mc7[k_ꪵEN7`8?dsNN z 'Kkoi[5/rWn$ϯĊʱWu67' ݈AMH_Mn.Nm<康>3'QGَ"˜uk!O{ҷHeAڻBL*Z{:o|S&_Vg~-G>SN?0Yo߶>3]rg~𛿸>?7_?;s. : ó|ib@ 39s?,;*17'ɧ;;< s1sAJ1;??-0ᨰ "SHpK"|2C̣ě&l,s+m3v=£B4 /01̼̓!8=0h#C7 ? @6K\C13$4E=G˞L=1JDD:<Z {[\(;EQC`Աa>3NCFSeY|Fg,FhfiFm|nG!rsܛt !CmËH@X:: B[SGaZD8h'@':s0p) Hjlo ?kA1˨!P15HIP8;)ITBI09Ƃ,T":\+E%*#)2I;DP23Tjє,TMbMq||ٔ:D89 ٵ+N ̎1MG͘ق6W) X+/e묯 ♞NL #GMMMJ K31kAЛ=Hr((K:* 63Ӓҍ%EK56N}Խѕ8R-Z!Ԉ%ލ1إ٥|^^ٕ޺Ո͘E E_]_mysܭ_9%5=UU\$&M mv V>F`6 O&]5a naZUN>[`` ia"U`%v[b42⿕_,&>Х%ے6b_b52=+ cjb~uc7d NB6Cd'`GN?7bJb)d*6 dePVHD>aT^K`aWnUȝdZcX e]~d^~f`f[e\Nbc>fa.f_Nffdf^eicg~-el6:od8\O>!ggl2&^gYUeܷOnVfExRgfg~lBhUf.ؾfvVfvYFdnh[P|NcxI6FVfv闆阖陦隶i!&6FVfj駆ꨖjF ; mlistzxon mouseUp put word 2 of the selectedtext into f if there is a card f then go to card f end if end mouseUp @   DOLIPRANE 1 EFFERALGAN 2  DOLIPRANE 1 EFFERALGAN 2  `@  ord(h@Dv m1) EFFERALGAN 4 cp.5 fois par jour toutes les 6 heures pendant x jours aprs les repas matin, midi et soir. K2) DOLIPRANE 8 sup. 4 fois par jour pendant x semaines pendant les repas.`@Dv nmed (h@^  Antalgiques DOLIPRANE Paractamol 16 cp. sc. 500 mg |8 1000 500 mg 1 g x 1 4 fois/24h douleurs ou fivre !Insuffisence hpatique, allergie toxicit hpatique (A:>4g/j) 4 6h entre les prises  Antalgiques EFFERALGAN Paractamol 8/16 cp. eff. 500/1000 mg 500 mg 1 g x 1 4 fois/24h douleurs ou fivre Insuffisence hpatique Toxicit hpatique (A:>4 g/j) 4 6 h entre les prises New ButtonAon mouseUp put empty into field "mlist" repeat with i = 1 to the number of cards put return & line 2 of field "nmed" of card i && number of card i after field "mlist" end repeat sort field "mlist" ascending end mouseUp P$"Raffraichir la liste  New ButtonA8on mouseUp go to stack "print" put field "ord" of stack "ordonnances" into field "pcorps" of stack "print" put line 4 of field "etatcivil" of stack "consult" && line 2 of field "etatcivil" of stack "consult" && line 1 of field "etatcivil" of stack "consult" into field "ptitre" of stack "print" end mouseUp P$"Imprimer l'ordonnance  New ButtonAZon mouseUp put return & field "ord" after field "trait" of stack "consult" end mouseUp P.$"Exporter vers la fiche  New ButtonAon mouseUp answer "Voulez-vous entrer un nouveau mdicament ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom in create card end if end mouseUp Pb$"Nouveau mdicament  New ButtonAon mouseUp if the number of cards > 1 then answer "Voulez-vous supprimer ce mdicament ?" with "Oui" or "Non" if it is "Oui" then visual effect zoom in delete this card end if else answer "Impossible de supprimer ce mdicament !" end if end mouseUp P$"Supprimer mdicament  New ButtonADon mouseUp ask "Entrez le terme recherch :" find it end mouseUp P$" Recherche  New ButtonA5on mouseUp sort cards by field "nmed" end mouseUp P$"Tri par famille mdicamenteuse  New ButtonAFon mouseUp visual effect scroll right go to first card end mouseUp P$"Premier mdicament  New ButtonAEon mouseUp visual effect scroll right go to prev card end mouseUp P$"Mdicament prcdent  New ButtonADon mouseUp visual effect scroll left go to next card end mouseUp PB$"Mdicament suivant  New ButtonADon mouseUp visual effect scroll left go to last card end mouseUp Pj$"Dernier mdicament  New ButtonAUon mouseUp put ") " & line 2 of field "nmed" & " " after field "ord" end mouseUp PB "Insrer mdicament bordMon mouseUp put " " & the selectedtext of me after field "ord" end mouseUp Pd "Insrer jargoncp. gl. cap. sup. sac. fl. Amp. goutte(s) bouffe(s) pulv. fois par jour toutes les 6 heures pendant x jours pendant x semaines pendant x mois pendant les repas aprs les repas avant les repas matin, midi et soir le soir jeun matin et midi  New ButtonA/on mouseUp go to stack "ordlist" end mouseUp P "Editer jargon  Calendar2 `on preOpenStack set the loc of this stack to the screenLoc # Set up local language set the text of btn "UserStartDay" to the system weekDayNames set the text of btn "UserMonth" to the system MonthNames if the label of btn "UserStartDay" is not among the lines of btn "UserStartDay" then set the label of btn "UserStartDay" to line 1 of btn "UserStartDay" if the label of btn "UserMonth" is not among the lines of btn "UserMonth" then set the label of btn "UserMonth" to line 1 of btn "UserMonth" showCalendar end preOpenStack on showCalendar put max ("1970", min ("2037", fld "UserYear") ) into fld "UserYear" put lineOffset(the label of btn "UserStartDay",btn "UserStartDay") into weekStartsOn put lineOffset(the label of btn "UserMonth",btn "UserMonth") into tMonth put fld "UserYear" into tYear put FLCcalendar(weekStartsOn,tMonth,tYear) into cd fld "Calendar" select text of fld "UserYear" end showCalendar function FLCcalendar tStartDayNum,tM,tY,tLanguage # Syntax: FLCcalendar (, ,) put the system monthNames into tMonthNames get the abbrev system WeekDayNames repeat for each line L in it if len(L) is 2 then put space & L into L put char 1 to 3 of L &cr after tAbbrevWeekDayNames end repeat delete last char of tAbbrevWeekDayNames # Verify params... put tM &"/1/"& tY into tCalendarMonth convert tCalendarMonth to dateItems if the result <>"" then return "Date error" put item 1 of tCalendarMonth into tY put line (item 2 of tCalendarMonth) of tMonthNames && tY into monthHeader # Build Calendar day header line, starting from selected day of the week... put tAbbrevWeekDayNames into dayHeader put (line tStartDayNum to -1 of dayHeader)&cr&(line 1 to tStartDayNum -1 of dayHeader) into dayHeader replace cr with space in dayHeader # To centre the monthHeader... put char 1 to round((length(dayHeader)-length(monthHeader)) div 2) +1 of " " before monthHeader # Build Calendar... put empty into days if tStartDayNum is 1 then put 7 into tEndDayNum else put tStartDayNum -1 into tEndDayNum # Calculate position of first date... put (item 7 of tCalendarMonth) - (tStartDayNum)+1 into dayOffset if dayOffset < 1 then put (7+ dayOffset) into dayOffset repeat with dayNum = 1 to dayOffset -1 put " " after days end repeat # Complete Calendar... repeat while item 2 of tCalendarMonth is tM get " " & item 3 of tCalendarMonth & " " if length(it) is 3 then get " " & it if item 7 of tCalendarMonth is tEndDayNum then get it & cr put it after days add 1 to item 3 of tCalendarMonth convert tCalendarMonth from dateItems to long system date -- to force next line to update convert tCalendarMonth from long system date to dateItems end repeat return toUpper(monthHeader) & cr & dayHeader & cr & days end FLCcalendar bSfr Calendrier U Courier New U Courier New U Courier New UMS sans serif ULucida GrandeUVerdana UVerdana UVerdana UVerdana W Courier New `r  calendar     JUIN 2005 lun mar mer jeu ven sam dim  1 2 3 4 5  6 7 8 9 10 11 12  13 14 15 16 17 18 19  20 21 22 23 24 25 26  27 28 29 30  i =}P UserMonth uson mouseDown set the text of me to the system monthNames end mouseDown on menuPick showCalendar end menuPick ZujuinUjanvier fvrier mars avril mai juin juillet aot septembre octobre novembre dcembre  userStartDay uuon mouseDown set the text of me to the system weekDayNames end mouseDown on menuPick showCalendar end menuPick Aulundi4dimanche lundi mardi mercredi jeudi vendredi samedi  UserYearipon enterInField closeField end enterInField on returnInField closeField end returnInField on closeField showCalendar end closeField s3  2005  K@ printlon openstack show button "print" put "Le " & the long system date & "." into field "pdate" end openstack b<Apercu avant impression UTimes New RomanWTimes New RomanUTimes New RomanWTimes New Roman WTimes New Roman UTimes New Roman UTimes New RomanUArialUArialWArialUTimes New RomanWArialUArialUArial WTimes New Roman @ * @  Dr. Ghazi CHERIF  pcorps(H@   - Glycmie - NFS - Echographie abdominale pdate*J@Z  Le dimanche 12 juin 2005. ptitre* @,  Monsieur Jacques CHIRAC *H@  /Consultations sur RDV - 8h ~ 13h et 15h ~ 19h. *@(j  Mdecin gnraliste 15, rue Mustapha khraef 2037 - El Menzah Tl : 71 238 009 Fax : 71 238 009printeon mouseUp answer "Voulez-vous imprimer ce document ?" with "Oui" or "Non" if it is "Oui" then hide button "print" answer printer set printmargins to 10,10,10,10 set printscale to 0.75 print this card show button "print" end if end mouseUp DPf2pCliquez ici pour imprimer ! Imprimer KKListesdon openstack put the text of button "biblio" of stack consult into field "menlist" end openstack b}Listes UCourier UCourierUTimes New RomanWTimes New Roman WTimes New Roman WTimes New Roman UTimes New RomanWTimes New RomanWTimes New Roman @ menlist(j@8d  (Antcdants mdicaux HTA Diabte Notion d'atopie Asthme Infarctus du myocarde (Antcdants chirurgicaux Appendicectomie Cholesystectomie Ostosynthse !(Antcdants gynco-obsttricaux G P DDR Cycles Grossesse (Vaccinations SAT - VAT Grippe BCG DTPC Rappel Hpatite B (Habitudes Tabagisme Alcool (Motifs et signes fonctionnels Cphale Fivre Syndrome grippal Douleur Bilan d'HTA Contrle de routine (Signes cliniques TA : Pouls : Poids : Taille : BMI : A l'auscultation Rles Souffles (Actes Vaccination Nbulisation Injection Suture (Diagnostics Angine Bronchite Grippe (Biologie Glycmie Ure ECBU Crat NFS VS CRP (Radio Echographie Scanner Rx de thorax IRM  `8 New Buttonebon mouseUp put the text of field "menlist" into button "biblio" of stack "consult" end mouseUp lAppliquer la nouvelle liste ordlisteon openstack put the text of button "bord" of stack "ordonnances" into field "lord" end openstack b+Listes UCourierUTimes New RomanWTimes New RomanWTimes New Roman @ lord(j@>t  cp. gl. cap. sup. sac. fl. Amp. goutte(s) bouffe(s) pulv. fois par jour toutes les 6 heures pendant x jours pendant x semaines pendant x mois pendant les repas aprs les repas avant les repas matin, midi et soir le soir  jeun matin et midi  `@>t New Buttoneaon mouseUp put the text of field "lord" into button "bord" of stack "ordonnances" end mouseUp ~lAppliquer les changements AidebQFAide U helveticaU HelveticaU HelveticaU HelveticaUTimes New RomanUTimes New RomanUTimes New RomanUTimes New RomanUArialUArialUArialUTimes New RomanUTimes New RomanU helveticaU helveticaUTimes New RomanUArialUArialUTimes New RomanUArial @F @Fi 4 (`@ *v  9 Licence d'utilsation @# @Black# @ Blue$ @Black 1) Utilisation libre @Blue @Blue Le logiciel MetaDoc est libre d'utilisation. Vous pouvez l'installer sur votre ordinateur et l'utiliser sans limitation de temps. MetaDoc est gratuit, mais vous n'avez pas le droit de mettre tout ou partie du logiciel en consultation sur un site Internet ou de le proposer en tlchargement. L'auteur se rserve le droit d'tre l'unique distributeur. Vous n'avez pas le droit de faire un usage commercial de tout ou partie du logiciel propos. @ Black @ Black C2) Absence de responsabilit sur les dommages directs et indirects @BlueB @Blue L'installation et l'utilisation sont trs simplifies, l'auteur ne pourra tre tenu responsable en aucune circonstance de tout dommage, quel qu'il soit (dommages directs ou indirects), rsultant de l'installation, de l'utilisation ou de l'impossibilit d'utilisation de ce produit. @ Black L'auteur ne peut tre tenu responsable de consquences ngatives directes ou indirectes issues des informations contenues dans MetaDoc. @ Black L'auteur, malgr l'attention accorde la fonctionnalit du produit, ne s'engage nullement corriger, modifier ou faire voluer MetaDoc. @ Black @ Black 3) Proprit @Blue @Blue Le programme, y compris son code, sa documentation, son apparence, sa structure et son organisation, est un produit exclusif de l'auteur qui conserve en permanence les droits de proprit du programme ou de ses copies, modifications ou parties fusionnes. @ Black ZCe logiciel est protg par les lois du copyright et par les conventions internationales. @ BlackY *Toute distribution commerciale partielle ou totale ou toute modification a des fins commerciales par quelque moyen que ce soit est strictement interdite. Toute personne qui ne respecte pas ces dispositions se rend coupable du dlit de contrefaon et sera passible des sanctions prvues par la loi. @ Black)  F Aide A @ BlueA 1) Introduction @Blue @Black MJ'ai essay de faire un logiciel aussi simple et aussi intuitif que possible. Pour connaitre la fonction d'un bouton, il suffit de le pointer la souris (sans cliquer) et une bulle d'aide vous renseignera. N'hsitez-pas tester et explorer fond le logiciel afin d'en connatre toutes les fonctions, au demeurant assez simples. @BlackL @Black +2) Export et import des fiches de patients @Blue* @Blue NL'export et l'import des fiches de patient se fait au format texte. Les diffrents champs sont spars par un "|" et chaque patient est spar des autres par un retour la ligne et un "". Je dconseille donc l'utilisation de ces caractres (| et ) dans les fiches des patients : elles ne pourront pas tre correctement exportes. @BlackM Pour importer vos anciennes fiches, il suffit de les exporter dans un format lisible par un tableur quelconque (OpenOffice.org, Ms Exel ou Lotus 1.2.3) puis de les retravailler pour correspondre aux champs de MetaDoc. Un export au format texte (ou csf) avec comme sparateur de champs un "|" et sparateur d'enregistrement un retour la ligne et un "" est disponible dans la pluspart des tableurs (ou des SGBD) et vous permettra de les intgrer dans MetaDoc. @Black @Black #3) Insertion de termes du "jargon" @Blue" @Blue Pour insrer un terme ou une expression du jargon, il suffit de le slctionner dans la liste, de mettre le curseur l'endroit dsir et de cliquer sur l'icne "coller" de la barre de formatage. @Black @Black @Black  `* v New ButtonCp*on mouseUp go to next card end mouseUp :8  Moved Icons@@  @H @I @J @K @ @ @ @ @ @ @ @ @Hi328 Dffffff00 S8`%B" 0_8ppq9px?W  p@H@D@B@A@@@@ c?6σ???Ii329 Dffffff00 QaUuJi330 Dffffff00 b 0   ``b x\ p@@@{?><<~Ki331 Dffffff00 `k`@@@@@@@@@@@@@@@@@@@@@ D````Ș``Ș0000``00  6 7o$$$$$ |||"_ @@@@@@@@@@@@@@@@   @@@o   I I I I I I!@"5 @ 0i@@@@@@@?  @?? D Ș@@@@@@Ș``````0000``00 23"P"P"PB$"`wPB"` q PB"vw PB"`qw h P""pwP"qwP"qwhP" WUWUWUwhP"whP"whP"WUWUWwhP"whP"whP"WUWUw hP"BDwhP"whP" WUuUuUwhP"wP"wP"`w h P"DvhP"`f P"P"P"P DPU D Ș@@@@@@Ș``````0000``00 23"P"P"PB$"`wPB"` q PB"vw PB"`qw h P""pwP"qwP"qwUuwhP"wWuwUwhP"wWuwUwhP"wUwhP"wWuwhP"wUwhP"wWuwhP"wWuw hP"BDwhP"wWuwhP"wWuwhP"wP"wP"`w h P"DvhP"`f P"P"P"P DPU DȘ``@@@@@@PPPPPP00 @`  00  aC‚  @` 00 `@X@ H @@ @@ | 008,8,<\<\>>?|?|?? ? ??j  @@:@ @ ?@@ ????? Dxxxx||xx00  @  @@@@@@   @|B?>????>?e8x`?P@>||??||>@~??? Dxx||xx00  @@@@ <x <8H @ @@@  }??????&??????????@Cp@  @    `???x8 Dxx||xx00  @@@@ <x <8[  ( @$@  |*?????@p@  @    `D0<<???x8 Dxx||xx||xx00 z  @@  @@@ ??pp(xx||~~???K@ @  @@  @@  | 0  ``00  ?????i486 D00 ]@`Pht}@|xp`@[          & @ k@`a Ask Dialogron openCard end openCard on preOpenCard end preOpenCard on closeCard end closeCard on openStack end openStack ]@macintoshIcons992,993,994,995 motifIcons328,329,330,331windows95Icons996,997,998,999 U HelveticaU helvetica PJon doresize local twidth, iwidth, bwidth put the width of this stack into twidth if the visible of button 1 then put 48 into bwidth else put 16 into bwidth set the width of field 1 to twidth - (bwidth + 16) set the left of field 1 to bwidth set the width of field 2 to twidth - (bwidth + 16) set the left of field 2 to bwidth set the top of field 2 to the bottom of field 1 set the top of button 1 to the height of field 1 div 2 - 8 put (twidth - 120 ) div 3 into iwidth put iwidth into twidth set the default of button 2 to false repeat with i = 2 to the number of buttons set the left of button i to twidth set the bottom of button i to the height of this stack - 12 add the width of button i + iwidth to twidth end repeat set the default of button 2 to true end doresize on star local tstring put empty into tstring repeat with i = 1 to the number of characters in field 3 put "*" after tstring end repeat put tstring into field 2 end star on preOpenStack local twidth, dtype, foffset set the itemDelimiter to numToChar(0) put word 2 of item 1 of the dialogData into dtype set the fieldmode of me to dtype if dtype is "plain" or dtype is "password" or dtype is "clear" then hide button 1 put 0 into foffset else show button 1 switch the lookAndFeel case "Motif" get the motifIcons of this stack break case "Macintosh" case "Appearance Manager" get the macintoshIcons of this stack break default get the windows95Icons of this stack end switch set the itemDelimiter to comma set the icon of button 1 to item itemOffset(dtype, "error,information,question,warning") of it set the itemDelimiter to numToChar(0) put 40 into foffset end if if item 2 of the dialogData is empty then set the title of this stack to space else set the title of this stack to item 2 of the dialogData put item 3 of the dialogData into field 1 put max(the formattedWidth of field 1 + foffset + 24,\ the formattedWidth of field 2 + foffset + 24, 320) into twidth set the width of this stack to twidth set the height of field 1 to the formattedHeight of field 1 set the top of field 1 to 8 set the height of this stack to (the height of field 1) + 100 doresize if the fieldmode of me is "password" or the fieldmode of me is "clear" then put item 4 of the dialogData into field 3 star else put item 4 of the dialogData into field 2 set the dialogData to numToChar(0) set the itemDelimiter to comma end preOpenStack on keyDown which local tpos if the name of the target contains "field" \ and (the fieldmode of me is "password" or the fieldmode of me is "clear") then put the selectedChunk into tpos put which into character (word 2 of tpos) to (word 4 of tpos) of field 3 star select after character (word 2 of tpos) of field 2 else pass keyDown end keyDown on deleteKey if the fieldmode of me is "password" or the fieldmode of me is "clear" then deleteone else pass deleteKey end deleteKey on backspaceKey if the fieldmode of me is "password" or the fieldmode of me is "clear" then deleteone else pass backspaceKey end backspaceKey on deleteone local tpos put word 2 of the selectedChunk into tpos put empty into character (tpos - 1) of field 3 star select before character (tpos - 1) of field 2 end deleteone on commandKeyDown which if the fieldmode of me is "password" or the fieldmode of me is "clear" then local tpos switch which case "D" put word 2 of the selectedChunk into tpos put empty into character tpos of field 3 star select before character tpos of field 1 break case "H" deleteone break default pass commandKeyDown end switch else pass commandKeyDown end commandKeyDown on openField select the text of the target end openField on resizeStack doresize end resizeStack on returnInField click at the loc of button "OK" end returnInField on closeStack put empty into field 1 put empty into field 2 put empty into field 3 end closeStack @ fieldmodeplaina_\]`   \OKLpon mouseUp switch the fieldmode of this card case "clear" get field 3 break case "password" get mcencrypt(field 3) break default get field 2 break end switch set the dialogData to it close this stack end mouseUp BW4 ]CancelDp+on mouseUp close this stack end mouseUp W<  _`#  ` !`b8|  a New Button@@$( Answer Dialogon resizeStack end resizeStack on openStack end openStack on preOpenCard end preOpenCard on openCard end openCard on closeCard end closeCard i #vmacintoshIcons992,993,994,995 motifIcons328,329,330,331windows95Icons996,997,998,999 U HelveticaU helvetica P Ron preOpenStack local dtype, foffset, oldwidth, bwidth, twidth, iwidth, theight, curx, nchoices set the itemDelimiter to numToChar(0) put word 2 of item 1 of the dialogData into dtype if dtype is "plain" then hide button 1 put 0 into foffset else show button 1 switch the lookAndFeel case "Motif" get the motifIcons of this stack break case "Macintosh" case "Appearance Manager" get the macintoshIcons of this stack break default get the windows95Icons of this stack end switch set the itemDelimiter to comma set the icon of button "icon" to item itemOffset(dtype, "error,information,question,warning") of it set the itemDelimiter to numToChar(0) put 40 into foffset end if if item 2 of the dialogData is empty then set the title of this stack to space else set the title of this stack to item 2 of the dialogData put item 3 of dialogData into field 1 get item 4 of dialogData if it is empty then get "OK" put the number of lines in it into nchoices put 32 into bwidth if nchoices > the number of buttons - 1 then put the number of buttons - 1 into nchoices repeat with i = 2 to nchoices + 1 show button i set the name of button i to line nchoices + 2 - i of it set the width of button i to the formattedWidth of button i + 24 add the width of button i + 32 to bwidth end repeat set the dontWrap of field 1 to true put max(the formattedWidth of field 1 + foffset + 16, bwidth) into twidth if twidth > 600 then put 600 into twidth set the dontWrap of field 1 to false end if put the width of this stack into oldwidth set the width of this stack to twidth set the width of field 1 to twidth - foffset - 16 put the formattedHeight of field 1 + 68 into theight if theight > 400 then set the vScrollbar of field 1 to true put 400 into theight else set the vScrollbar of field 1 to false set the height of this stack to theight set the height of field 1 to theight - 68 set the top of button 1 to the height of field 1 div 2 - 12 set the topLeft of field 1 to foffset + 8, 8 put (twidth - bwidth) div (nchoices + 1) + 32 into iwidth put iwidth into curx if the lookAndFeel is "Macintosh" or the lookAndFeel is "Appearance Manager" then repeat with i = nchoices + 1 down to 2 set the left of button i to round(curx) add the width of button i + iwidth to curx set the bottom of button i to the height of this stack - 16 end repeat else repeat with i = 2 to nchoices + 1 set the left of button i to round(curx) add the width of button i + iwidth to curx set the bottom of button i to the height of this stack - 16 end repeat end if set the default of button 2 to true set the dialogData to empty end preOpenStack on closeStack repeat with i = 3 to the number of buttons hide button i end repeat set the default of button 2 to false end closeStack on mouseUp if the name of the target contains "button" then set the dialogData to the short name of the target close this stack end if end mouseUp #vz @2 +MetaDoc a t ralis par Dr. Ghazi CHERIF & COPYRIGHT Ghazi CHERIF 2005 (R)ziconBPon mouseUp end mouseUp  ((H OKD`xH3 OKD`H5 YesD`69 zD`4' yD`4' xD`i4' wD` 4)  Message BoxFcs%go "/home/raney/cragg/liburl_1010.mc"color SU HelveticaUCleanU HelveticaW HelveticaU HelveticaU HelveticaU HelveticaW HelveticaW HelveticaU Helvetica U Helvetica W HelveticaU HelveticaUCourierWCourierU Helvetica U Helvetica U HelveticaW HelveticaU HelveticaU Helvetica@U HelveticaU HelveticaAW HelveticaW HelveticaW HelveticaPW HelveticaTW HelveticaU HelveticaU Helvetica U Helvetica UCourier UCourier UCourierU LucidaBrightUSymbolUcharter U HelveticaULucida ULucida UClean UCourierUfixedUtimes U HelveticaU Font|cleanUFontU SuperscriptUColor|-UColor Ucharter WLucida WLucida WcleanW Helvetica UClean WClean W HelveticaU HelveticaW Helvetica@U HelveticaDU HelveticaHU HelveticaWcharterUcharterU HelveticaUcharterW HelveticaUnilUcharterU HelveticaUfixedU fangsong ti!U HelveticaU helveticaU helveticaU helveticaU helveticaU helveticaU helveticaU helveticaU helvetica U helveticaMessage Box Card P,local initted on resizeStack set the rect of field 1 to the rect of me end resizeStack on preOpenCard if not initted then set the topleft of this stack to max(0, the left of the topStack -\ (the width of this stack - the width of the topStack) div 2), \ min(the bottom of the topStack + 32, item 4 of the windowBoundingRect - 32) send "init" to field 1 put true into initted end if end preOpenCard on closeCard put empty into field 1 end closeCard on changed which, old, new put new into field 1 of me end changed  Message Field)p .local MessageBoxHistory, MessageBoxIndex on init put 1 into MessageBoxIndex put empty & return into MessageBoxHistory put empty into field 1 end init on errorDialog eerror, perror if perror is not empty then set the scripterror of card 1 of stack "Script Error" to perror modeless "Script Error" else set the errorobject of card 1 of stack "Execution Error" to the long id of the target set the executionerror of card 1 of stack "Execution Error" to eerror modeless "Execution Error" send "refresh" to card 1 of stack "Execution Error" end if end errorDialog on returnInField lock error dialogs if me is empty then exit to MetaCard if the traceStack is not empty then set defaultStack to the traceStack else set defaultStack to the topStack set the cs of stack "Message Box" to me put return after MessageBoxHistory put the cs of stack "Message Box" into the last line of MessageBoxHistory if the number of lines in MessageBoxHistory > 20 then delete line 1 of MessageBoxHistory put empty into msg put 1 into MessageBoxIndex if the number of lines in field 1 of stack "Execution Contexts" is not 0 then get the hilitedLine of field 1 of stack "Execution Contexts" if it is empty then get the number of lines of field 1 of stack "Execution Contexts" set the debugContext to line it of field 1 of stack "Execution Contexts" end if if word 1 of the cs of stack "Message Box" is not among the lines of the commandNames then if word 1 of the cs of stack "Message Box" is "the" \ or word 1 of the cs of stack "Message Box" is a number \ or token 2 of the cs of stack "Message Box" is "(" then put value(the cs of stack "Message Box", this card) else send the cs of stack "Message Box" to this card else if the number of lines in field 1 of stack "Execution Contexts" is 0 then do "global" && the globals & return & the cs of stack "Message Box" \ & return & "if the result is not empty then put the result" else debugdo the cs of stack "Message Box" & return & "if the result is not empty then put the result" end if unlock error dialogs end returnInField on prevline subtract 1 from MessageBoxIndex if MessageBoxIndex is 0 then put the number of lines in MessageBoxHistory into MessageBoxIndex put line MessageBoxIndex of MessageBoxHistory into me exit to MetaCard end prevline on nextline add 1 to MessageBoxIndex if MessageBoxIndex > the number of lines in MessageBoxHistory then put 1 into MessageBoxIndex put line MessageBoxIndex of MessageBoxHistory into me exit to MetaCard end nextline on commandKeyDown which handleKey which pass commandKeyDown end commandKeyDown on controlKeyDown which handleKey which pass controlKeyDown end controlKeyDown on handleKey which if which is "P" then prevline if which is "N" then nextline if which is "U" then put empty into msg exit to MetaCard end if end handleKey on arrowKey which if which is "up" then prevline if which is "down" then nextline pass arrowKey end arrowKey @   Execution Erroron errorDialog which put which set the executionerror of card 1 of stack "Execution Error" to which modeless "Execution Error" send "refresh" to card 1 of stack "Execution Error" end errorDialog  U HelveticaU helveticaU helveticaU helveticaU helveticaU helveticaU helveticaU helveticaU helveticaeExecution Error Card p local ee, ec, er, eo, ei, et on returnInField send "mouseUp" to button "Ignore" end returnInField on returnKey send "mouseUp" to button "Ignore" end returnKey on closeCard set the errorobject of me to empty set the executionerror of me to empty put empty into ee put empty into field "Error Message" put empty into field "Object" put empty into field "Bad Token" put 0 into field "Line" put 0 into field "Column" end closeCard on preOpenCard set the loc of this stack to the screenLoc end preOpenCard on refresh local lc, em, tei, teo, ter, tec put empty into ei put empty into eo put empty into er put empty into ec put empty into et put empty into field "Error Message" put the executionerror of me & cr after ee put the number of lines in ee into lc if lc > 100 then delete line 100 to lc of ee if lc < 2 or the number of items in ee < 6 then hide button "Script..." hide button "Debug..." put "thrown error" & cr into field "Error Message" end if repeat with i = the number of lines in ee down to 1 get item 1 of line i of ee put line it of field "Messages" into em if em is "Object Name:" then put item 4 of line i of ee into tei put the long name of tei into teo else put em & cr before field "Error Message" if item 2 of line i of ee is not 0 then put item 2 of line i of ee into ter put item 3 of line i of ee into tec end if put tei & cr before ei put teo & cr before eo put ter & cr before er put tec & cr before ec put item 4 of line i of ee & cr before et end if end repeat delete last char of field "Error Message" seterror 1 set the hilitedLines of field 1 to 1 end refresh on openCard set the hilitedLines of field 1 to 1 end openCard on openStack end openStack on preOpenStack end preOpenStack on openBackground end openBackground on preOpenBackground end preOpenBackground on seterror which if line which of eo contains quote & "Message Field" & quote\ or "mctools.mc" is not in the frontscripts \ or word 1 of the mainStacks is not "Home" then hide button "Script..." hide button "Debug..." else show button "Script..." show button "Debug..." end if put line which of eo into field "Object" put line which of er into field "Line" put line which of ec into field "Column" put line which of et into field "Bad Token" set the errorobject of me to line which of ei end seterror  errorobjectexecutionerror     Messages@ | e /Handler: Running low on memory, script aborted (recursionLimit: Recursion limit reached abs: error in source expression accept: bad expression &aclip: playLoudness is not an integer !acos: error in source expression acos: domain error add: error in matrix operation -add: destination has a bad format (numeric?) add: error in source expression add: can't set destination add: can't add array to scalar )aliasReference: error in file expression %Operators and: error in left operand &Operators and: error in right operand (Operators bitAnd: error in left operand )Operators bitAnd: error in right operand $annuity: error in period expression "annuity: error in rate expression %answer: error in question expression %answer: error in response expression "answer: error in title expression split: error in expression (arrowKey: error in direction expression arrowKey: not a direction !asin: error in source expression asin: domain error "ask: error in question expression ask: error in reply expression ask: error in title expression !atan2: error in first expression "atan2: error in second expression atan2: domain error !atan: error in source expression atan: domain error $average: error in source expression )base64Decode: error in source expression )base64Encode: error in source expression "baseConvert: bad destination base (baseConvert: error in source expression baseConvert: bad source base 'baseConvert: can't convert this number (baseConvert: destination is not base 10 beep: error in expression ,binaryDecode: destination is not a variable )binaryDecode: invalid data for parameter $binaryDecode: not enough parameters )binaryDecode: error in source expression )binaryEncode: invalid data for parameter $binaryEncode: not enough parameters )binaryEncode: error in source expression !Button: bad accelerator modifier !Button: family is not an integer %Button: menuButton is not an integer &Button: menuHistory is not an integer $Button: menuLines is not an integer #Button: mnemonic is not an integer %cancel: message id is not an integer &charToNum: error in source expression choose: error in expression choose: not a tool &Chunk: error in background expression Chunk: error in card expression Chunk: error in character range *Chunk: container is not a button or field !Chunk: error in chunk expression Chunk: error in item range Chunk: error in line range "Chunk: error in object expression %Chunk: error in range end expression 'Chunk: error in range start expression !Chunk: error in stack expression Chunk: error in text string Chunk: can't separate tokens Chunk: can't separate words Chunk: can't delete object Chunk: can't find object #Chunk: can't get object attributes 0Chunk: can't get value of destination container Chunk: can't get number Chunk: can't get source string Chunk: can't get substring Chunk: can't find substring Chunk: can't set attributes ,Chunk: can't store to destination container Chunk: can't set as a number Chunk: can't find background Chunk: can't find card Chunk: no such object Chunk: can't set property Chunk: can't find stack Chunk: no target found +Chunk: can't select object that isn't open !Chunk: source is not a container 'Chunk: can't find object to store into 'Chunk: can't get source from container &Chunk: destination is not a container click: script aborted )click: expression is not a button number !click: error in point expression !click: expression is not a point click: stack is not open clone: error in name expression clone: can't clone this object clone: stack is locked "clone: can't find object to clone close: error in name expression close: can't find stack #color: error setting selectedColor "compact: can't find stack to save compact: object is not a stack &compound: error in periods expression #compound: error in rate expression %compress: error in source expression ,compress: error occurred during compression $Operators &&: error in left operand %Operators &&: error in right operand #Operators &: error in left operand $Operators &: error in right operand *Operators contains: error in left operand +Operators contains: error in right operand #convert: can't read from container convert: can't set container !copy: invalid destination object $copy: can't find destination object copy: can't copy source object copy: can't find source object "copy: stack is password protected cos: error in source expression cos: domain error 5create: error in bad parent or background expression !create: error in name expression &create: error in file name expression %create: stack is locked (cantModify) crop: error in image expression crop: object is not an image $crop: error in rectangle expression $crop: expression is not a rectangle cut: can't find or copy object 'decompress: error in source expression *decompress: string is not compressed data 'decompress: error during decompression -delete: error in file or url name expression delete: can't find object disable: can't find object ,Stack: stack has not been given a file name "divide: error in matrix operation 0divide: destination has a bad format (numeric?) #divide: error in source expression divide: can't set destination %divide: can't divide scalar by array divide: range error (overflow) divide: divide by zero )Operators div: error in matrix operation %Operators div: error in left operand &Operators div: error in right operand -Operators div: can't divide scalar by matrix &Operators div: range error (overflow) Operators div: divide by zero do: aborted do: error in source expression do: error in statement do: error in expression !do: error in language expression 0do: unexpected end of line in source expression do: can't find command do: not a command do: license limit exceeded doMenu: error in expression "doMenu: don't know this menu item drag: script aborted drag: bad "button" number drag: bad end point expression drag: end point is not a point !drag: bad start point expression !drag: start point is not a point &driverNames: error in type expression !drives: error in type expression edit: can't find object $encrypt: error in source expression Operators =: error in operand "exp10: error in source expression exp10: domain error !exp1: error in source expression exp1: domain error !exp2: error in source expression exp2: domain error 5export: error in file (or mask file) name expression 'export: can't open file (or mask file) 5export: can't write to file, mask file, or container -export: no image selected, or image not open (export: selected object is not an image $Expression: error in numeric factor #Expression: error in string factor exp: error in source expression exp: domain error &extents: error in variable expression Factor: error in left operand Factor: error in right operand Field: bad text attributes %Field: hilitedLine is not an integer (Field: scrollbarWidth is not an integer Field: shift is not an integer *Field: tabstops is not a positive integer 2files: no permission to list files or directories filter: bad source string filter: bad pattern string filter: can't set destination find: bad source string flip: can't find image flip: object is not an image flushEvents: bad event type focus: not a valid control $fontNames: error in type expression fontSizes: bad font name fontStyles: bad font name fontStyles: bad font size 0format: bad format string or parameter mismatch $Function: error in function handler %Function: error in source expression !Function: source is not a number Function: is not a number get: error in expression get: can't set destination %globalLoc: coordinate is not a point #go: error in background expression go: error in card expression go: error in stack expression go: error in window expression *go: can't attach menu to this object type go: can't find destination grab: can't find object graphic: not an integer Operators >=: error in operands Operators >: error in operands Group: backSize is not a point 'Group: hilitedButton is not an integer Group: bad object type %Operators (): error in right operand Handler: aborted Handler: error in statement 'Handler: error in parameter expression %Handler: not a valid parameter index !hasMemory: bad amount expression (hide: error in visual effect expression hide: can't find object (hostAddress: error in socket expression /hostAddressToName: error in address expression #hostName: error in name expression ,hostNameToAddress: error in name expression if-then: aborted 'if-then: error in condition expression if-then: error in statement Image: bad pixmap id !Image: hotspot is not an integer Image: id is not an integer .Image: id is already in use by another object $Image: image must be open to set id #Image: hotSpot x is not an integer #Image: hotSpot y is not an integer import: error in expression .import: can't open file, mask file or display .import: can't read file, mask file or display 1import: destination stack is locked (cantModify) insert: can't find object insert: license limit exceeded intersect: two objects required $Operators is: error in left operand %Operators is: error in right operand %Operators is: can't compare operands 6Operators is: left operand of 'within' is not a point ;Operators is: right operand of 'within' is not a rectangle %isNumber: error in source expression "isoToMac: error source expression #Operators ,: error in left operand $Operators ,: error in right operand "keys: parameter is not a variable kill: no such process kill: bad number (launch: error in application expression #length: error in source expression Operators <=: error in operands Operators <: error in operands ln1: error in source expression ln1: domain error ln: error in source expression ln: domain error load: error in url expression "load: error in message expression $localLoc: coordinate is not a point "log10: error in source expression log10: domain error !log2: error in source expression log2: domain error 'longFilePath: error in file expression "macToIso: error source expression mark: bad card expression mark: error in find expression +matchChunk: can't set destination variable %matchChunk: bad or missing parameter (matchChunk: error in pattern expression 'matchChunk: error in source expression (matrix: range error in matrix operation +matrixMultiply: error in source expression ,matrixMultiply: can't multiply these arrays max: error in source expression *MCISendString: error in source expression &MD5digest: error in source expression #median: error in source expression "merge: error in source expression .Operators -: can't subtract array from scalar #Operators -: error in left operand $Operators -: error in right operand 7Operators -: range error (overflow) in array operation $Operators -: range error (overflow) min: error in source expression )Operators mod: error in matrix operation %Operators mod: error in left operand &Operators mod: error in right operand -Operators mod: can't divide scalar by matrix &Operators mod: range error (overflow) Operators mod: divide by zero "mouse: error in source expression move: script aborted move: can't find object move: bad end point expression move: bad duration expression move: duration is not a number move: end point is not a point !move: bad start point expression !move: start point is not a point $multiply: error in matrix operation 2multiply: destination has a bad format (numeric?) %multiply: error in source expression multiply: can't set destination )multiply: can't multiply scalar by array !multiply: range error (overflow) Operators <>: error in operands &Operators not: error in right operand )Operators bitNot: error in right operand &numToChar: error in source expression !Object: bad textAlign expression Object: unknown color Object: error in colors =Object: can't set layer (card not open, or control in group) Object: not a textStyle 6Object: stack locked, or object's script is executing +Object: object does not have this property !Object: height is not an integer Object: layer is not an integer !Object: margin is not an integer /Object: value is not a boolean (true or false) Object Name: #Object: property is not an integer "Object: coordinate is not a point )Object: rectangle does not have 4 points Object: no Home stack &Object: pixel value is not an integer !Object: pixmap is not an integer /Object: can't set script while it is executing Object: can't set this property %Object: textheight is not an integer #Object: textsize is not an integer )offset: error in start offset expression !offset: error in part expression "offset: error in whole expression "open: error in message expression open: error in name expression /open: no permission to open files or processes $Operators or: error in left operand %Operators or: error in right operand 'Operators bitOr: error in left operand (Operators bitOr: error in right operand 'Operators /: error in matrix operation #Operators /: error in left operand $Operators /: error in right operand +Operators /: can't divide scalar by matrix $Operators /: range error (overflow) Operators /: divide by zero param: error in expression param: bad parameter index "param: error in source expression param: is not a number $paste: stack is locked (cantModify) (peerAddress: error in socket expression =place: group is not in this stack or is already on this card place: can't find group place: can't find card place: source is not a group !place: destination is not a card $play: can't get sound or movie name play: bad movie location play: bad movie options #Operators +: error in left operand $Operators +: error in right operand $Operators +: range error (overflow) pop: can't set destination post: can't get source post: can't get destination pow: error in left operand pow: error in right operand pow: range error (overflow) ,print: can't get 'from' or 'to' coordinates !print: can't get number of cards print: can't get rectangle print: error printing 'print: error writing file (disk full?) print: coordinate not a point %print: expression is not a rectangle print: not a card .print: card or stack must be open to print it print: no card specified arcAngle: not an integer blinkRate: not a number penColor: bad color "colormap: bad color name or value )Object: error counting objects as number 'Object: error counting objects as text dragSpeed: not a number effectRate: not a number extendKey: not a number Property: bad array expression gridSize: not an integer idleRate: not a number lineSize: not an integer moveSpeed: not a number multiSpace: not a number polySides: not an integer repeatDelay: not a number repeatRate: not a number !doubleClickDelta: not an integer doubleClickTime: not a number roundRadius: not an integer slices: not an integer startAngle: not an integer traceDelay: not a number traceStack: not a stack name print: bad property value syncRate: not a number tooltipDelay: not a number typeRate: not a number userLevel: not an integer beep: not an integer brush: not an integer brush: can't find image #brushPattern: not a valid image id brushPattern: can't find image "Object: no object to set property "Object: can't set object property cursor: not an integer cursor: can't find image 5Property: value is not a boolean ("true" or "false") Property: value is not a number defaultStack: can't find stack !defaultMenuBar: can't find group $Object: does not have this property #Object: property is not an integer !penPattern: not a valid image id penPattern: can't find image 'randomSeed: property is not an integer socketTimeout: not a number "umask: property is not an integer push: object is not a card push: can't find card put: error in expression put: can't set destination put: can't put into destination *queryRegistry: error in source expression #random: error in source expression read: aborted read: error in 'at' expression $read: error in condition expression read: error in count expression read: error reading read: count is not an integer "read: error in 'until' expression read: file is not open read: error in 'for' expression read: process is not open !record: error in file expression -recordCompression: type must be 4 characters 'recordInput: type must be 4 characters remove: can't find object remove: object is not a group remove: object is not a card #rename: error in source expression (rename: error in destination expression repeat: aborted ,repeat: error in 'for' condition expression repeat: error in statement .repeat: error in 'until' condition expression .repeat: error in 'while' condition expression 1repeat: error in 'with' end condition expression 3repeat: error in 'with' start condition expression 2repeat: error in 'with' step condition expression &repeat: error setting 'with' variable replace: can't set container %replace: error in pattern expression )replace: error in replacement expression 'replace: error in container expression replaceText: bad parameter replaceText: bad source string #reply: error in keyword expression #reply: error in message expression %request: error in keyword expression %request: error in message expression %request: error in program expression 'request: no permission to request that "getResources: error in expression (getResources: no permission to get that return: error in expression revert: can't revert Home stack #rotate: error in object expression (rotate: object is not an editable image "rotate: error in angle expression +round: error in source or digit expression $save: error in file name expression save: saving disabled save: can't find stack to save save: object is not a stack $seek: error in file name expression !seek: error in offset expression seek: file is not open select: can't select target 3selectedChunk: error in button or field expression &selectedButton: bad family expression -selectedButton: bad parent object expression )send: error in message handler execution "send: error in message expression send: error in 'in' expression "send: error in program expression send: bad target expression !send: no permission to send that set: error in source expression set: can't set property 2setRegistry: no permission to get or set registry (setRegistry: error in source expression shell: aborted shell: can't run shell command "shell: error in source expression %shell: no permission to run commands (shortFilePath: error in file expression (show: error in visual effect expression #show: error in location expression *show: error in number of cards expression )show: location is not in proper x,y form show: can't find object sin: error in source expression sin: domain error sort: can't find object to sort sort: error sorting sort: can't find field ,specialFolderPath: error in type expression !sqrt: error in source expression sqrt: domain error Stack: bad decoration 4Stack: invalid id (must be greater than current id) Stack: invalid key Stack: bad substack name ,Stack: can't set mainStack (has substacks?) "Stack: deskIcon is not an integer #Stack: userLevel is not an integer Stack: size is not an integer #Stack: stack is password protected Stack: can't find mainStack Stack: stack is not a mainStack *Stack: error in external function handler start: can't find object start: stack is locked !start: expression is not a group start: license limit exceeded $Handler: error in source expression Handler: can't find handler stdDev: error in expression stop: error in expression stop: target is not a group $subtract: error in matrix operation 2subtract: destination has a bad format (numeric?) %subtract: error in source expression subtract: can't set destination +subtract: can't subtract array from scalar subwindow: error in expression &subwindow: can't find stack or button sum: error in source expression &switch: error in condition expression !switch: error in case expression switch: error in statement !textHeightSum: can't find object tan: error in source expression tan: domain error "there: error in source expression "throw: error in source expression 'Operators *: error in matrix operation #Operators *: error in left operand $Operators *: error in right operand $Operators *: range error (overflow) $toLower: error in source expression %topStack: error in source expression $toUpper: error in source expression $transpose: source is not a variable &transpose: can't transpose this array "trunc: error in source expression try: error in statement type: script aborted type: bad string expression ungroup: can't find group ungroup: target is not a group (uniDecode: error in language expression &uniDecode: error in source expression (uniEncode: error in language expression &uniEncode: error in source expression unload: error in url expression *unlock: expression is not a visual effect &urlDecode: error in source expression &urlEncode: error in source expression #urlStatus: error in url expression "value: error in source expression "value: error executing expression value: can't find object Array: bad index expression Chunk: source is not a number !Chunk: source is not a character visual: bad effect expression wait: aborted wait: error in expression !wait: expression is not a number within: can't find control within: not a point write: error in expression (Operators bitXor: error in left operand )Operators bitXor: error in right operand  Ignore pfon mouseUp close this stack set the traceAbort to true set the traceReturn to true end mouseUp 0|D e Perror Field 0H   8< e Object: Script...p7on mouseUp get the long id of the errorobject of this card set the history[it] of stack "Script Editor" to \ format("char %d of line %d of field \"Editor Field\"", field "Column", field "Line") editScript it close this stack set the traceAbort to true set the traceReturn to true end mouseUp |O e Object @8$ e Helppon mouseUp help end mouseUp |D e Debug...pon mouseUp MCdebugScript the long id of the errorobject of this card, empty, field "Line", field "Column" close this stack end mouseUp $|P e Error Message)pon mouseDoubleUp which if which is 3 and there is a file "eetext" then set the cursor to watch open file "eetext" read from file "eetext" until eof put it into field "Messages" close file "eetext" beep 1 else local term put item 1 of the clickText into term if there is a card term of stack "MetaTalk Reference" then go to card term of stack "MetaTalk Reference" end if end mouseDoubleUp on mouseUp seterror the hilitedlines of me end mouseUp (  ` &  Bad Token N\ e  \ e Processing Token:  `\@ e Column: Line 0\0 e 0  \, e Line: Column \' e 0CursorsfU Helvetica @ @ @ @  @  @ @ @ @ @ @ @ @ @ @ @ @ @c5 D00 dĂNw @A@`` 0p0 88^8  <8>>O?">߀>? `ǂpjw0?? c11 D00 [ 5[ @ AH0J $p>|x[?? c12 D00 Y> ?0@ A.>|xpY> ?c16 D88K!AA?02>>~~B D? P   ?B c17 D88I0 px<~~x<p 0<A?P   ?B c18 D88K0?AA!2~~>>B D? P   ?B c19 D88K?_O‚‚O_?- 0x<|~|x<0 B D? P   ?B c20 D88K!AA?02>>~~B D? P   ?B c21 D88I0 px<~~x<p 0<B D? P   ?B c22 D88K0?AA!2~~>>B D? P   ?B c23 D88K?_O‚‚O_?- 0x<|~|x<0 B D? P   ?B c1 D88B@ 7@`px|~|lLJ`pXpE0E Ec8 D88J      踂* `0 G@gPwԂ?C5%%%%?c24 D88A D@`px|A~AA|AlALAAACHP AAAAAAc25 D88I>>666> >D@`px|A~AIɂ|]lILIAABHPc26 D88N@ p@@@@p @FC@hu@@c27 D88H@@2LRJy@@yRJ2L@@>!aa!>@h3us@s3@c25 D88P8<pxÂ`f`6p<8>02)$"D!$H D@?x>h|f@ǂpp~| 1 and the last char of field "Directory" is not "/" then put the last item of field "Directory" into filterstring if filterstring is empty then put "*" into filterstring put the directory into field "Directory" if the last char of field "Directory" is not "/" then put "/" after field "Directory" put filterstring after field "Directory" put the directories into field "Directories" if field "Directories" is empty then put ".." into field "Directories" else sort field "Directories" if the visible of field "Files" then put the files into fnames filter fnames with filterstring put fnames into field "Files" sort field "Files" local dirwidth, filewidth, cwidth put max(48, the formattedWidth of field "Directories") into dirwidth put max(48, the formattedWidth of field "Files") into filewidth put max(the formattedWidth of field "Directory" + 16, dirwidth + filewidth + 24, 250) into cwidth set the width of field "Directories" to dirwidth set the width of field "Files" to filewidth set the left of field "Files" to the right of field "Directories" + 8 set the left of field "Flabel" to max(the right of field "Dlabel", the left of field "Files" - 8) else set the width of field "Directories" to 304 put 320 into cwidth end if set the width of this stack to cwidth local twidth, perspace, toffset repeat with i = 1 to the number of buttons add the width of button i to twidth end repeat put (cwidth - twidth) / 5 into perspace put perspace into toffset repeat with i = 1 to the number of buttons set the left of button i to round(toffset) add the width of button i + perspace to toffset end repeat set the width of field "Directory" to cwidth - 16 set the width of field "Selection" to cwidth - 32 set the scroll of field "Directories" to 0 unlock screen end refresh on returnKey send "mouseUp" to button id 1013 end returnKey on escapeKey send "mouseUp" to button id 1014 end escapeKey # command, title, prompt, filter, response on preOpenCard set the itemDelimiter to numToChar(0) if item 2 of the dialogData is empty then if word 1 of item 1 of the dialogData is "answer" then if word 2 of item 1 of the dialogData is "folder" then set the title of this stack to "Choose Directory" else set the title of this stack to "Open" else set the title of this stack to "Save" else set the title of this stack to item 2 of the dialogData put item 3 of the dialogData into field "Prompt" put the directory & "/" & item 4 of the dialogData into field "Directory" put item 5 of the dialogData into field "Selection" if word 2 of item 1 of the dialogData is "folder" then hide field "Files" hide field "Flabel" set the name of button id 1013 to "Choose" else show field "Files" show field "Flabel" if word 1 of item 1 of the dialogData is "answer" then set the name of button id 1013 to "Open" else set the name of button id 1013 to "Save" end if refresh end preOpenCard on closeStack put empty into field "Directory" put empty into field "Directories" put empty into field "Files" put empty into field "Selection" put empty into field "Prompt" set the dialogData to empty end closeStack on resizeStack local cheight put the height of this card into cheight repeat with i = 1 to 4 set the bottom of button i to cheight - 12 end repeat set the bottom of field "Selection" to the top of button 1 - 12 set the bottom of field "Prompt" to the top of field "Selection" - 2 set the height of field "Directories" to the top of field "Prompt" - 4 - the top of field "Directories" set the height of field "Files" to the top of field "Prompt" - 4 - the top of field "Files" end resizeStack l  Directories)pon mouseUp if not the visible of field "Files" then put the selectedText of me into field "Selection" end mouseUp on mouseDoubleUp local olddir put the directory into olddir set the directory to olddir & "/" & the clickText if the result is not empty then answer "Can't set to that directory." set the directory to olddir else refresh if not the visible of field "Files" then put empty into field "Selection" end mouseDoubleUp T 9`wU Files)pon mouseUp put the clickText into field "Selection" end mouseUp on mouseDoubleUp send "mouseUp" to button id 1013 end mouseDoubleUp on rawKeyUp put the selectedText of me into field "Selection" end rawKeyUp T 9`SU Dlabel<\ Directories: Flabel<0 Files: Prompt@  Directoryipon closeField local olddir, newdir put the directory into olddir put me into newdir if newdir contains "/" then repeat until the last char of newdir is "/" delete last char of newdir end repeat end if set the directory to newdir if the result is not empty then answer "Can't set to that directory." set the directory to olddir put olddir into me else refresh end closeField on openField select after last char of me end openField \ SaveDpon mouseUp local fname put field "Selection" into fname if the visible of field "Files" then repeat for each char c in fname if c is in " :?*<>\()[]{}|'`" & quote & tab then answer "Invalid file name character" && quote & c & quote && "in" & cr & fname exit to MetaCard end if end repeat end if if char 1 of fname is not "/" then if fname is empty then put the directory into fname else put "/" before fname if the directory is not "/" then put the directory before fname end if end if if the short name of me is "Save" then get fname set the itemDelimiter to "/" delete last item of it if there is no directory it then answer error "Directory" && it && "does not exist." exit to MetaCard else if there is a file fname then answer question "File" && fname && "exists. Overwrite?" with "Yes" or "No" if it is not "Yes" then exit to MetaCard end if end if end if if the short name of me is "Open" and there is no file fname then answer error "File" && fname && "does not exist." exit to MetaCard end if close this stack set the dialogData to fname end mouseUp ]< CancelDp+on mouseUp close this stack end mouseUp ]: HelpDpon mouseUp help end mouseUp "],  P File Filter:  SelectionipGon returnInField send "mouseUp" to button id 1013 end returnInField 5L FilterD`x]4  Page SetuphXU HelveticaPrint Setup Card P3function cn fieldname if field fieldname is not a number or field fieldname < 0 then beep 1 select text of field fieldname return true end if return false end cn on setprops local pwidth, pheight, swidth, sheight, pscale if cn("Top") or cn("Bottom") or cn("Left") or cn("Right") then exit to MetaCard send "setMargins" to group "Units" if cn("Scale") then exit to MetaCard if the printRotated then put item 1 of the the printPaperSize into pheight put item 2 of the the printPaperSize into pwidth else put item 1 of the the printPaperSize into pwidth put item 2 of the the printPaperSize into pheight end if subtract item 1 of the printMargins + item 3 of the printMargins from pwidth subtract item 2 of the printMargins + item 4 of the printMargins from pheight put the width of stack (the short name of button id 1109) into swidth put the height of stack (the short name of button id 1109) into sheight if the hilite of button "Pack Horizontally" then subtract (field "Scale" - 1) * item 2 of the printGutters from pwidth put pwidth / (swidth * field "Scale") into pscale if sheight * pscale > pheight then set the printScale to pheight / sheight else set the printScale to pscale else subtract (field "Scale" - 1) * item 1 of the printGutters from pheight put pheight / (sheight * field "Scale") into pscale if swidth * pscale > pwidth then set the printScale to pwidth / swidth else set the printScale to pscale end if set the printCardBorders to the hilite of button "Print Card Borders" set the printColors to the hilite of button "Color" close this stack end setprops on preOpenCard local sname, c put the short name of the topStack into sname set the name of button id 1109 to sname send "loadMargins" to group "Units" send "resetMargins" to group "Units" set the hilite of button "Print Card Borders" to the printCardBorders set the hilite of button "Color" to the printColors set the hilite of button "Black and White" to not the printColors end preOpenCard hXVST{oUYZ~OKMp#on mouseUp setprops end mouseUp $1J CancelEp+on mouseUp close this stack end mouseUp 0L HelpEpon mouseUp help end mouseUp 0L SScalei`,(  1Tipon scrollbarLineInc if cn("Scale") then exit to MetaCard if field "Scale" > 1 then subtract 1 from field "Scale" end scrollbarLineInc on scrollbarLineDec if cn("Scale") then exit to MetaCard add 1 to field "Scale" end scrollbarLineDec D* Z U Page Setup4 e< Page Setup MC Stack Menu  Y8 Stack: ZCards, Cards per row:VPacking&8Pack HorizontallyEDon mouseUp put "Cards per row:" into field "Cards" end mouseUp * Pack VerticallyEEon mouseUp put "Cards per column:" into field "Cards" end mouseUp Bx {Print Card Borders@EL oMargins)0(on scrollbarLineInc if cn("Top") or cn("Bottom") or cn("Left") or cn("Right") then exit to MetaCard if the hilite of button "Points" then subtract 1 from field (the short name of the target) else subtract 0.1 from field (the short name of the target) end scrollbarLineInc on scrollbarLineDec if cn("Top") or cn("Bottom") or cn("Left") or cn("Right") then exit to MetaCard if the hilite of button "Points" then add 1 to field (the short name of the target) else add 0.1 to field (the short name of the target) end scrollbarLineDec _ZUnits>local pmargins, pgutters on loadMargins put the printMargins into pmargins put the printGutters into pgutters end loadMargins on resetMargins local factor put 1 into factor if the hilite of button "inches" then put 72 into factor if the hilite of button "cms" then put 72/2.54 into factor put item 1 of pmargins / factor into field "Left" put item 2 of pmargins / factor into field "Top" put item 3 of pmargins / factor into field "Right" put item 4 of pmargins / factor into field "Bottom" put item 1 of pgutters / factor into field "Row" put item 2 of pgutters / factor into field "Column" end resetMargins on getMargins local factor, lmargin, tmargin, rmargin, bmargin, rgutter, cgutter put 1 into factor if the hilitedButton of group "Units" is 1 then put 72 into factor if the hilitedButton of group "Units" is 2 then put 72/2.54 into factor put round(field "Left" * factor) into lmargin put round(field "Top" * factor) into tmargin put round(field "Right" * factor) into rmargin put round(field "Bottom" * factor) into bmargin put lmargin, tmargin, rmargin, bmargin into pmargins put round(field "Row" * factor) into rgutter put round(field "Column" * factor) into cgutter put rgutter,cgutter into pgutters end getMargins on setMargins getMargins set the printMargins to pmargins set the printGutters to pgutters end setMargins on focusIn getMargins end focusIn on mouseUp local bname put the short name of the target into bname if bname is "inches" or bname is "cms" or bname is "points" then resetMargins end mouseUp Zr inchesE^vL cmsEv8 pointsEvD  \ Top: Topi`j, 1Topi` H  [ Bottom: Bottomi`j, 1Bottomi`   \ Row Gutter: Rowi`j, 0.5Rowi` l  l Left: Lefti`, 1Lefti`J   l Right: Righti`, 1Righti`J   l Column Gutter: Columni`, 0.5Columni`J   t8 Units: ~ < Output: Printer...Epon mouseUp if the platform is "Win32" or the platform is "MacOS" then answer printer else modeless "Printer Chooser" end mouseUp  D Output> ColorEB@ Black and WhiteE Printer Chooser 6 Pon preOpenCard set the hilite of button "Portrait" to not the printRotated set the hilite of button "Landscape" to the printRotated switch the printPaperSize case "612,1008" set hilitedButtonName of group "Paper Size" to "Legal" break case "595,842" set hilitedButtonName of group "Paper Size" to "A4" break default: set hilitedButtonName of group "Paper Size" to "Letter" end switch put the printCommand into field "Command" end preOpenCard on returnInField setprops end returnInField on returnKey setprops end returnKey on setprops set the printRotated to the hilite of button "Landscape" if the hilite of button "Letter" then set the printPaperSize to "612,792" if the hilite of button "Legal" then set the printPaperSize to "612,1008" if the hilite of button "A4" then set the printPaperSize to "595,842" if the printCommand is not field "Command" then set the printCommand to field "Command" if line 1 of the mainStacks is "Home" then set the preferences["printCommand"] of stack "Home" to field "Command" save stack "Home" end if end if close this stack end setprops 6 (` Paper Size: Commandi`XH  mv %s $HOME/mc/mc.ps HT Command: ` Orientation: Orientationd PortraitEh L  LandscapeE d  Paper Sized(LetterEh,@ LegalE,@ A4E,0 OKMp#on mouseUp setprops end mouseUp tL CancelEp+on mouseUp close this stack end mouseUp xtL HelpEpon mouseUp help end mouseUp tL  Navigator0 D Nav card Pion preOpenCard set the label of button "Stack Name" to the short name of the topstack end preOpenCard  DFirstBwfon mouseUp set the defaultStack to the label of button "Stack Name" go to first card end mouseUp $$Go to First Card? PrevBweon mouseUp set the defaultStack to the label of button "Stack Name" go to prev card end mouseUp $$$Go to Prev Card@ NextBweon mouseUp set the defaultStack to the label of button "Stack Name" go to next card end mouseUp H$$Go to Next CardA LastBweon mouseUp set the defaultStack to the label of button "Stack Name" go to last card end mouseUp l$$Go to Last CardB StartBw^on mouseUp set the defaultStack to the label of button "Stack Name" go start end mouseUp $$Go to First ViewedF BackBw_on mouseUp set the defaultStack to the label of button "Stack Name" go back 1 end mouseUp $$Go BackE ForwardBwbon mouseUp set the defaultStack to the label of button "Stack Name" go forward 1 end mouseUp $$ Go ForwardD FinishBw_on mouseUp set the defaultStack to the label of button "Stack Name" go finish end mouseUp $$Go to Last ViewedC  Find(D In stack: Stack Name4)eD( Navigator MC Stack Menu FindT Find Card P3on preOpenCard set the label of button "Stack Name" to the short name of the topStack end preOpenCard on MCFind local thilited, tstring set the cursor to watch put the hilitedButton of group 1 into thilited put field "Find" into tstring set the caseSensitive to the hilite of button "case sensitive" set the defaultStack to the label of button "Stack Name" if thilited is 1 then find tstring else if thilited is 2 then find whole tstring if the result is "not found" then beep 1 end MCFind on returnInField MCFind end returnInField TType"partial wordsD&h  whole wordsDn&j FindDp!on mouseUp MCFind end mouseUp >bT HelpDpon mouseUp help end mouseUp bT  Find)`D  @D In stack: Stack Name4)eH@ConsultMC Stack Menu case sensitiveD(x 2Brushesf @e @f @g @h @i @j @k @l @m @n @o @p @q @r @s @t @u @v @w @x @y @z @{! @|# @}% @~' @) @+ @- @/ @1 @ @ @ @ @eb101 D00 }fb102 D00 dXdgb103 D00 C@@@@@@@@@@@9???????????Chb104 D00 %     %ib105 D00 0 @          @0 ????????????jb106 D00 Y @@ L??Y??kb107 D00 >4>lb108 D00 %  %mb109 D00 "D @"D @"D @"t8p8p8p>|>|>|>nb110 D00 [@ @"D @"D@N8p8p@[>|>|@ob111 D00 1 $H @  ' 0` 1 <x pb112 D00 $(P@ @$8pb133 D00 >B A @@ @d @B@  @b134 D00 ,@ @.@ H@@  @b135 D00 +b136 D00  @@ qb113 D00 z @ D"@ D"@ D(lp8p8p8z|>|>|8rb114 D00 V@D"@ D"@I@p8p8V@|>|>sb115 D00 5$ @ H$ + `0 5<x< tb116 D00 $ @P @ $p ub117 D00 @@@@@@@@@@@@@@@@@@@@@@@@@@vb118 D00 f@@@@@@@@@@@@@@@@@@\fwb119 D00 H2Hxb120 D00 **yb121 D00 ?  ?????zb122 D00 @@{b123 D00 @?|b124 D00 }b125 D00 @ & @~b126 D00 @   @b127 D00   b128 D00 b129 D00 b130 D00 b131 D00  @@ b132 D00 elibURLwBlackwhite%Q cVersion1.0.10cDefaultHeader'METHOD --- HTTP/1.1 Host: User-Agent: customHTTPHeaders##libUrl v1.0.10 --------------------------------------------------------------------- ##shared locals local lvCount,lvBlockingUrl,lvBlockBypass, lvLogField, lvTickle local lvJumpOut ##used by libUrlResetAll to make sure "wait for messages" loops exit cleanly local laLoadReq,laLoadedUrls,laStatus,laUrl,laLength,laData local laAction,laUrlLoadStatus,laUrlErrorStatus,laLoadQ, laLoadingUrls local laUser,laPasswd,laAuth,laBytes,laLongFileName,laHost local laMessg,laPostData,laTemp local laCancelled,lvStatusCallback local laFile,laReadBytes,laWriteBytes local laConnectHost, laConnectID, laSocketUser local lvSocketToken, lvSocketOpenStart, lvSocketOpenMessageID ##for socket opening --------------------------------------------------------------------- ##http locals local laConn,laCode,laChunk,laRhHeader, laHaveHeader, laNeedChunk local laStatusCode, laStatusMessage local laLineNum,laTmpData local laHttpDataDone local laCurrentHttpHeaders ----------------------------------------------------------------------- ##ftp locals local lvFtpMode, lvFtpStopTime, lvDataPortCount, lvFtpListCommand local laFtpDataDone local laControlXDataMap ##control sockets keyed by data sockets local laHome,lvNeedDir local laControlXLocalMap,laTransPasvIP,laTransActvIP,laMode local laStopUnit, laStopSec local laFTPCommandStatus local lvFtpCommandSocket ##socket used by libUrlFtpCommand local laUrlByFile ##used by libUrlUploadFile to track which files go to which url #######Engine Calls############################################# ####### load url ############################################# ------------------------------------------------ on loadUrl x,y put false into lvJumpOut put ulStripUrl(x) into newUrl if lvCount is empty then put "6923" into lvCount end if switch case newUrl is among the lines of the keys of laLoadingUrls ##don't allow loads if the same url is waiting to load return "error URL is currently loading" ##with empty break case newUrl is not among the lines of the keys of laLoadedUrls OR laUrlLoadStatus[newUrl] is not "cached" put the long id of the target &","& item 2 of the params into laMessg[newUrl] put true into laLoadReq[newUrl] put 1 into laLoadingUrls[newUrl] #for tracking put "getData" into laAction[newUrl] put empty into laUrlErrorStatus[newUrl] put empty into laUrlLoadStatus[newUrl] put empty into laLoadedUrls[newUrl] ulGetFormat newUrl,lvCount if laUrlLoadStatus[newUrl] is "error" and not laCancelled[newurl] then ulSendMessage newUrl ##send message now only if error occurred befoe block point return "error" ---------------------- else if laCancelled[newUrl] then ##user cancelled after starting but before blocking point delete local laLoadedUrls[newUrl] delete local laUrlLoadStatus[newUrl] delete local laUrlErrorStatus[newUrl] delete local laStatus[newUrl] delete local laCancelled[newUrl] delete local laCurrentHttpHeaders[newUrl] else return empty end if ----------------------- break case newUrl is among the lines of the keys of laLoadedUrls and laUrlLoadStatus[newUrl] is "cached" #url is in cache put the long id of the target &","& item 2 of the params into laMessg[newUrl] ulSendMessage newUrl ##send message return empty end switch end loadUrl #############unload url############ on unloadUrl pUrl put ulStripUrl(pUrl) into pUrl ##need to check if it is loading or in loadQ if pUrl is among the lines of keys(laLoadingUrls) then delete local laLoadingUrls[pUrl] ulCancelRequest pUrl ##stop any current downloads delete local laData[pUrl] ##in case download hasn't started return empty else if pUrl is among the lines of keys(laUrlLoadStatus) then delete local laLoadedUrls[pUrl] delete local laUrlLoadStatus[pUrl] delete local laUrlErrorStatus[pUrl] delete local laStatus[pUrl] return empty else ##not loaded return "can't find url" end if end unloadUrl ############# get url ############ on getUrl x put false into lvJumpOut put ulStripUrl(x) into newUrl if newUrl is among the lines of the keys of laLoadedUrls and laUrlLoadStatus[newUrl] is "cached" then if "2.4.1" is in the version then return empty with laLoadedUrls[newUrl] else return empty with cachedUrl laLoadedUrls[newUrl] end if end if if newUrl is among the lines of keys(laLoadingUrls) then return "error URL is currently loading" with empty end if if lvBlockingUrl is empty or lvBlockBypass is true then put newUrl into lvBlockingUrl if lvCount is empty then put "6923" into lvCount end if put empty into laUrlErrorStatus[newUrl] put "getData" into laAction[newUrl] put empty into laData[newUrl] ulGetFormat newUrl,lvCount # convert url to components ##final clean up here delete local laStatus[newUrl] put laUrlErrorStatus[newUrl] into tRetResult delete local laUrlErrorStatus[newUrl] if "2.4.1" is in the version then ##for mc 2.4.1 engine only put laData[newUrl] into tRetData ##swap data before deleting laData delete local laData[newUrl] put empty into lvBlockingUrl ##clear return tRetResult with tRetData else put empty into lvBlockingUrl ##clear return tRetResult with url laData[newUrl] end if else ##blocked by previous request return "error Previous request not completed" with empty end if end getUrl ############### post Url ################### on postUrl y,x put false into lvJumpOut put ulStripUrl(x) into newUrl if newUrl is among the lines of keys(laLoadingUrls) then return "error URL is currently loading" with empty end if if lvBlockingUrl is empty or lvBlockBypass is true then put newUrl into lvBlockingUrl if lvCount is empty then put "6923" into lvCount end if put y into laPostData[newUrl] put "postData" into laAction[newUrl] put empty into laUrlErrorStatus[newUrl] put empty into laData[newUrl] ulGetFormat newUrl,lvCount # convert url to components ---------------------------------- ##final clean up here delete local laStatus[newUrl] put laUrlErrorStatus[newUrl] into tRetResult delete local laUrlErrorStatus[newUrl] if "2.4.1" is in the version then ##for mc 2.4.1 engine only put laData[newUrl] into tRetData delete local laData[newUrl] put empty into lvBlockingUrl ##clear return tRetResult with tRetData else put empty into lvBlockingUrl ##clear return tRetResult with url laData[newUrl] end if ----------------------------------- else ##blocked by previous request put "error Previous request not completed" into tRetResult return tRetResult with empty end if end postUrl ############### put x into url ################ on putUrl y,x put false into lvJumpOut put ulStripUrl(x) into newUrl if newUrl is among the lines of keys(laLoadingUrls) then return "error URL is currently loading" with empty end if if lvBlockingUrl is empty or lvBlockBypass is true then put newUrl into lvBlockingUrl if lvCount is empty then put "6923" into lvCount end if put y into laPostData[newUrl] put "putData" into laAction[newUrl] put empty into laUrlErrorStatus[newUrl] put empty into laData[newUrl] ulGetFormat newUrl,lvCount # convert url to components ---------------------------------- ##final clean up here delete local laStatus[newUrl] put laUrlErrorStatus[newUrl] into tRetResult delete local laUrlErrorStatus[newUrl] if "2.4.1" is in the version then ##for mc 2.4.1 engine only put laData[newUrl] into tRetData delete local laData[newUrl] put empty into lvBlockingUrl ##clear return tRetResult with tRetData else put empty into lvBlockingUrl ##clear return tRetResult with url laData[newUrl] end if ----------------------------------- else ##blocked by previous request put "error Previous request not completed" into tRetResult return tRetResult with empty end if end putUrl ###############delete url######################## on deleteUrl x put false into lvJumpOut put ulStripUrl(x) into newUrl if newUrl is among the lines of keys(laLoadingUrls) then return "error URL is currently loading" with empty end if if lvBlockingUrl is empty or lvBlockBypass is true then put newUrl into lvBlockingUrl if lvCount is empty then put "6923" into lvCount end if put "deleteData" into laAction[newUrl] put empty into laUrlErrorStatus[newUrl] ulGetFormat newUrl,lvCount # convert url to components ---------------------------------- ##final clean up here delete local laStatus[newUrl] put laUrlErrorStatus[newUrl] into tRetResult delete local laUrlErrorStatus[newUrl] if "2.4.1" is in the version then ##for mc 2.4.1 engine only put laData[newUrl] into tRetData delete local laData[newUrl] put empty into lvBlockingUrl ##clear return tRetResult with tRetData else put empty into lvBlockingUrl ##clear return tRetResult with url laData[newUrl] end if ----------------------------------- else ##blocked by previous request put "error Previous request not completed" into tRetResult return tRetResult with empty end if end deleteUrl ######## cachedUrls ################################################ on getCachedUrls #ensure url has "cached" status #there may be urls with data but with "error" status #for example, with a 404 error, the "courtesy page" may appear in the data put keys(laUrlLoadStatus) into tLoadedKeys repeat for each line tKey in tLoadedKeys if laUrlLoadStatus[tKey] is "cached" then put tKey & cr after tRes end if end repeat if char -1 of tRes is cr then delete char -1 of tRes return tRes end getCachedUrls ######## UrlStatus ################################################### on getUrlStatus x #x is url put ulStripUrl(x) into x return laUrlLoadStatus[x] end getUrlStatus ####################breaks down the url into components#################### on ulGetFormat pUrl,pCount local tPre,tUser,tPass,tHost,tPort,tFileName switch ##http with authorization name and password ( port specified) case matchText (pUrl, "^(http)://(.+):(.+)@(.[^/]+)(:.[^/]+)(/.*)",tPre,tUser,tPass,tHost,tPort,tFileName) is true ##with auth and special port break ##http with authorization name and password (no port specified) case matchText (pUrl, "^(http)://(.+):(.+)@(.[^/]+)(/.*)",tPre,tUser,tPass,tHost,tFileName) is true break ##http ( port specified) case matchText (pUrl, "^(http)://(.[^/]+)(:.[^/]+)(/.*)",tPre,tHost,tPort,tFileName) is true break ##http ( port specified) no filename case matchText (pUrl, "^(http)://(.[^/]+)(:.[^/]+)()",tPre,tHost,tPort,tFileName) is true break ##http ( no port specified) case matchText (pUrl, "^(http)://(.[^/]+)(/.*)",tPre,tHost,tFileName) is true break ##http ( no port specified) no file case matchText (pUrl, "^(http)://(.[^/]+)()",tPre,tHost,tFileName) is true #+# break ##ftp with authorization name and password (port specified) case matchText (pUrl, "^(ftp)://(.+):(.+)@(.[^/]+)(:.[^/]+)(/.*)",tPre,tUser,tPass,tHost,tPort,tFileName) is true break ##ftp with authorization name and password (no port specified) case matchText (pUrl, "^(ftp)://(.+):(.+)@(.[^/]+)(/.*)",tPre,tUser,tPass,tHost,tFileName) is true break ##ftp without name and password (port specified) case matchText (pUrl,"^(ftp)://(.[^/]+)(:.[^/]+)(/.*)",tPre, tHost,tPort,tFileName) is true break ##ftp without name and password (no port specified) case matchText (pUrl,"^(ftp)://(.[^/]+)(/.*)",tPre, tHost,tFileName) is true break default put "invalid URL: " & quote & pUrl & quote into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "error" into laUrlLoadStatus[pUrl] exit "ulGetFormat" end switch ##set connection IP switch tPre case "http" if the httpProxy <> empty then put the httpproxy into tIPAddress replace "http://" with "" in tIPAddress ##not sure if this is possible but just in case if tPort <> empty then put tPort into tUrlPort ##save this for setting laFilename below else put ":80" into tUrlPort end if #get the proxy port put the itemdel into tSavedDel set the itemdel to ":" if the number of items of tIPAddress > 1 and item -1 of tIPAddress is a number then put ":" & item -1 of tIPAddress into tPort delete item -1 of tIPAddress #remove port for now else put ":80" into tPort end if set the itemDel to tSavedDel else if tPort <> empty then put tHost into tIPAddress else put tHost into tIPAddress put ":80" into tPort end if put tIPAddress into tTempIPAddress replace "." with empty in tTempIPAddress replace ":" with empty in tTempIPAddress if tTempIPAddress is not a number then get hostNameToAddress(tIPAddress) if the result is empty then put line 1 of it & tPort into tConnectHost else put true into tBadAddress end if else put tIPAddress & tPort into tConnectHost end if break case "ftp" put tHost into tTempHost if tPort is empty then put ":21" into tPort replace "." with empty in tTempHost replace ":" with empty in tTempHost if tTempHost is not a number then get hostnameToAddress(tHost) if the result is empty then put line 1 of it & tPort into tConnectHost else put true into tBadAddress end if else put tHost & tPort into tConnectHost end if if tUser is empty then put "anonymous" into tUser put "guest" into tPass end if break default put "invalid URL: " & quote & pUrl & quote into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "error" into laUrlLoadStatus[pUrl] exit "ulGetFormat" break end switch if tBadAddress then put "invalid host address" into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "error" into laUrlLoadStatus[pUrl] delete local laLoadingUrls[pUrl] end if ##need better clean up here exit "ulGetFormat" end if ##dc 080702 ##need to keep separate reference for ftp IPs by user ## in case we need to connect to two accounts simultaneously ##so just keep user + host ref for all urls ##so laConnectHost has format host:port|user put tConnectHost & "|" & tUser into laConnectHost[pUrl] if tUser is not empty then put urlDecode(tUser) into laUser[pUrl] if tPass is not empty then put urlDecode(tPass) into laPasswd[pUrl] put "true" into laAuth[pUrl] end if put tHost into laHost[pUrl] if tFileName is empty then put "/" into tFileName if tPre = "http" and the httpProxy <> empty then ----changed for 1.0.10 Remove username:password from url when sending request through a proxy put "http://" & tHost & tUrlPort & tFilename into laLongFileName[pUrl] ## put pUrl into laLongFileName[pUrl] ##must request full url when using http proxy else put tFileName into laLongFileName[pUrl] end if put "booked" into laUrlErrorStatus[pUrl] if tPre is "http" then ##store current state of httpHeaders ad use when request is actually processed put the httpHeaders into laCurrentHttpHeaders[pUrl] ulHttpRequest pUrl else ulFtpRequest pUrl end if end ulGetFormat #################choose http method#################### #on ulHttpRequest x on ulHttpRequest pUrl switch case laAction[pUrl] is "getData" if(laLoadReq[pUrl]) is true then ulHttpLoad pUrl else ulGetHttp pUrl end if break case laAction[pUrl] is "sendData" ulPutHttp pUrl break case laAction[pUrl] is "deleteData" ulDeleteHttp pUrl break case laAction[pUrl] is "putData" ulPutHttp pUrl break case laAction[pUrl] is "postData" ulPostHttp pUrl end switch end ulHttpRequest -------------------------------------------------- ##set up queue for http load requests on ulHttpLoad pUrl put laConnectHost[pUrl] into tIP put keys(laLoadQ) into tLoadingKeys if tIP is among the lines of tLoadingKeys then put true into tHaveConnection else put false into tHaveConnection end if put pUrl & cr after laLoadQ[tIP] put "queued" into laUrlLoadStatus[pUrl] if not tHaveConnection then ulNextHttpLoadRequest tIP end if end ulHttpLoad ------------------------------------------------ ##dispatch next load request on ulNextHttpLoadRequest pIP put line 1 of laLoadQ[pIP] into tUrl if tUrl <> empty then if tUrl = lvBlockingUrl then ##the same URL is being requested in a blocking call repeat until lvBlockingUrl <> tUrl if lvJumpOut then exit to top wait for messages end repeat end if ##in case url was "unloaded" during any wait, check that it's still in the queue if tUrl is among the lines of keys(laLoadingUrls) then delete line 1 of laLoadQ[pIP] ##added in 1.0.8r4 ulGetHttp tUrl else ##modified dc 00202 Delete current rquest if not in laLoadingUrls ----------------------------------- ## CLEAN UP POINT if user cancelled while in queue delete line 1 of laLoadQ[pIP] ##delete this item ulCleanUpHttpLocals tUrl delete local laLoadReq[tUrl] ##added dc 210702 delete local laLoadedUrls[tUrl]##added dc 210702 delete local laMessg[tUrl]##added dc 210702 delete local laUrlErrorStatus[tUrl] delete local laUrlLoadStatus[tUrl] delete local laCancelled[tUrl] if the number of lines of laLoadQ[pIP] = 0 then delete local laLoadQ[pIP] delete local laConnectID[pIP] else ##use send to ensure this thread finishes before next request send "ulNextHttpLoadRequest" && quote & pIP & quote to me in 1 milliseconds end if ------------------------------ end if end if end ulNextHttpLoadRequest ##############method GET######################### on ulGetHttp pUrl try put empty into laStatus[pUrl] ##set wait flag here put "started" into laUrlErrorStatus[pUrl] put ulWhichSocket(pUrl) into tSocket put pUrl into laUrl[tSocket] #ref the url to the used socket##KEY REFERENCE if tSocket is not among the lines of the openSockets then ulStartTickle ##safeguard routine get ulOpenSocket(tSocket) if not it then throw it ##error opening socket end if put "contacted" into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "contacted" into laUrlLoadStatus[pUrl] ulSendCallback pUrl,"contacted" ##CALLBACK FEATURE put ulBuildHttpRequest(pUrl) into tRequest ulLogit tRequest & cr ##LOG write tRequest & crlf to socket tSocket with message "ulStartRead" --------------------- if the result is not empty then throw the result #early exit end if -------------------------- ##blocking point "get url" #If we got here by "load url" then we don't block, otherwise we do if laLoadReq[pUrl] is empty then repeat while laStatus[pUrl] is empty if lvJumpOut then exit to top wait for messages end repeat end if catch pErr ##clean up point ulHttpEarlyCleanUp tSocket,pUrl,pErr exit ulGetHttp end try end ulGetHttp ---------------------------------- on ulHttpEarlyCleanUp x, pUrl, pErr put "error" && pErr into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "error" into laUrlLoadStatus[pUrl] put false into laStatus[pUrl] ##to unblock waits put laLoadReq[pUrl] into tLoadReq ##holder put laConnectHost[pUrl] into tConnectHost ulCleanUpHttp x if tLoadReq then ulSendMessage pUrl ##added 091002 ##use send to ensure this thread finishes before next request starts send "ulNextHttpLoadRequest" && quote & tConnectHost & quote to me in 1 milliseconds end if end ulHttpEarlyCleanUp ---------------------------------------------------------- on ulStartRead x,y if laUrl[x] <> empty then ##carry on ----------------------------------- ##set the httpHeaders to empty ##commented out in 1.0.8r4 put "requested" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "requested" into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"requested" ##CALLBACK FEATURE if laLoadReq[laUrl[x]] then put empty into laLoadedUrls[laUrl[x]] else put empty into laData[laUrl[x]] end if put empty into laTmpData[laUrl[x]] put empty into laTemp[laUrl[x]] read from socket x with message "ulReadmore" -------------------------------- if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait end if ---------------------------------- ##The wait in the getHttp handler allows "load" requests to pass ## we wait here for ALL requests so we can clean up --------------------------------------- repeat while laStatus[laUrl[x]] is empty if lvJumpOut then exit to top wait for messages end repeat ---------------------------------------- ## CLEAN UP POINT if laStatus[laUrl[x]] is false then close socket x ##if user unloaded else if laConn[laUrl[x]] is "close" then close socket x ##if user unloaded end if ulHttpLateCleanUp x end if end ulStartRead --------------------------------------- on ulHttpLateCleanUp x if laFile[laUrl[x]] <> empty then close file laFile[laUrl[x]] ##close here?? end if put laLoadReq[laUrl[x]] into tLoadReq ##holder put laUrl[x] into tUrlHolder #so we can delete in cleanUp put laConnectHost[laUrl[x]] into tConnectHost #holder so we can delete in clean up ulCleanUpHttp x if tLoadReq and laCancelled[tUrlHolder] then delete local laLoadedUrls[tUrlHolder] delete local laUrlLoadStatus[tUrlHolder] delete local laUrlErrorStatus[tUrlHolder] delete local laStatus[tUrlHolder] end if if not laCancelled[tUrlHolder] then ulSendMessage tUrlHolder else delete local laMessg[tUrlHolder] end if delete local laFile[tUrlHolder] delete local laCancelled[tUrlHolder] if tLoadReq then ##use send to ensure current request finishes completely send "ulNextHttpLoadRequest" && quote & tConnectHost & quote to me in 1 milliseconds end if end ulHttpLateCleanUp ------------------------------------------------------------------ on ulReadmore x,y #separate the header from body put false into laHaveHeader[laUrl[x]] put y after laTmpData[laUrl[x]] put y after laTemp[laUrl[x]] put lineOffset(crlf & crlf, laTmpData[laUrl[x]]) into tHeaderOffSet ##proper header structure ##added to catch irregularly formed headers 1.0.7b1 if tHeaderOffset is 0 then ##for irregularly formed headers put lineOffset(cr & crlf, laTmpData[laUrl[x]]) into tHeaderOffSet if tHeaderOffset is 0 then put lineOffset(cr & cr, laTmpData[laUrl[x]]) into tHeaderOffSet end if end if if tHeaderOffSet is not 0 then#1 put tHeaderOffSet into laLineNum[laUrl[x]] put line 1 to laLineNum[laUrl[x]] of laTmpData[laUrl[x]] into laRhHeader[laUrl[x]] repeat ##be sure we have a header if char 1 to 4 of laRhHeader[laUrl[x]] = "HTTP" then exit repeat delete line 1 of laRhHeader[laUrl[x]] if laRhHeader[laUrl[x]] is empty then ##we don't have a header put "error" && "No header received" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait exit "ulReadmore" end if end repeat put length (laRhHeader[laUrl[x]]) into hLen switch case word 2 of line 1 of laRhHeader[laUrl[x]] is "100" ##Is this handled right?? delete line 1 to laLineNum[laUrl[x]]+1 of laTmpData[laUrl[x]] delete line 1 to laLineNum[laUrl[x]]+1 of laTemp[laUrl[x]] get lineOffset(crlf & crlf, laTmpData[laUrl[x]]) if it is not "0" then put it into laLineNum[laUrl[x]] put line 1 to laLineNum[laUrl[x]] of laTmpData[laUrl[x]] into laRhHeader[laUrl[x]] ulDoProcess x,y else read from socket x with message "ulReadmore" end if break case word 2 of line 1 of laRhHeader[laUrl[x]] is not "100" ulDoProcess x,y end switch else#1 if laStatus[laUrl[x]] is empty then read from socket x with message "ulReadmore" ##how often should we do this reading for a header?? ------------------------------------ if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait below end if ------------------------------------ end if end if#1 end ulReadmore ------------------------------------------- on ulDoProcess x,y #handles reading data depending on whether transfer method is streamed, chunked or "until socket closes" if not laHaveHeader[laUrl[x]] then ##pick up header first time only ulLogIt laRhHeader[laUrl[x]] & cr & cr --LOG set the lastRhHeaders of me to laRhHeader[laUrl[x]] ##set property put lineOffset("Location:",laRhHeader[laUrl[x]]) into tLocLine put lineOffset("Content-Length:",laRhHeader[laUrl[x]]) into tLenLine put lineOffset("Content-Type:",laRhHeader[laUrl[x]]) into tContentLine put lineOffset("Transfer-Encoding:",laRhHeader[laUrl[x]]) into tCodeLine put lineOffset("Connection:",laRhHeader[laUrl[x]]) into tConnectionLine put lineOffset("Proxy-Connection:",laRhHeader[laUrl[x]]) into ptConnLine #get status code put word 2 of line 1 of laRhHeader[laUrl[x]] into laStatusCode[laUrl[x]] #get status message for error results put word 2 to -1 of line 1 of laRhHeader[laUrl[x]] into laStatusMessage[laUrl[x]] if laStatusCode[laUrl[x]] is not a number then ##no point hanging around put "error" && "Unable to resolve server response." into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait exit "ulDoProcess" end if if tConnectionLine is not "0" then put last word of line tConnectionLine of laRhHeader[laUrl[x]] into laConn[laUrl[x]] end if if ptConnLine is not "0" then put last word of line tConnectionLine of laRhHeader[laUrl[x]] into laConn[laUrl[x]] end if if tLenLine is not "0" and last word of (line tLenLine of laRhHeader[laUrl[x]]) is a number then put last word of (line tLenLine of laRhHeader[laUrl[x]]) into laLength[laUrl[x]] else put empty into laLength[laUrl[x]] put empty into laHttpDataDone[laUrl[x]] ##flag for detecting end of download end if if tCodeLine <> "0" then put last word of line tCodeLine of laRhHeader[laUrl[x]] into laCode[laUrl[x]] end if delete line 1 to laLineNum[laUrl[x]]+1 in laTmpData[laUrl[x]] put true into laHaveHeader[laUrl[x]] else put y after laTmpData[laUrl[x]] end if ------------------------------------- switch case laStatusCode[laUrl[x]] is among the items of "301,302" #we are redirected to a different url if tLocLine is not empty then put last word of (line tLocLine of laRhHeader[laUrl[x]]) into tNewLoc -------------------------------- put true into lvBlockBypass ##to allow another blocking call get url tNewLoc if the result is empty then ulStoreData laUrl[x],it put empty into laUrlErrorStatus[laUrl[x]] if laFile[laUrl[x]] is empty then put "cached" into tStatus else put "downloaded" into tStatus end if if laLoadReq[laUrl[x]] is "true" then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"downloaded" ##CALLBACK FEATURE else put "error" && "Redirect failed" && tNewLoc into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put "error" into laUrlLoadStatus[laUrl[x]] put empty into laLoadedUrls[laUrl[x]] else put empty into laData[laUrl[x]] end if end if put false into lvBlockBypass##to disallow another blocking call ----------------------- put true into laStatus[laUrl[x]] end if break ##normal case case laLength[laUrl[x]] is not empty put laTmpData[laUrl[x]] into tData ulStoreData laUrl[x],tData put length(tData) into laReadBytes[laUrl[x]] if laStatus[laUrl[x]] is empty then ulDoProcessLength x break #### chunked ###################################### case laCode[laUrl[x]] is "chunked" put true into laNeedChunk[laUrl[x]] put empty into laReadBytes[laUrl[x]] ulDoProcessChunked x break ##########No length header ##typically from CGI request #Handle both cases together case laLength[laUrl[x]] is empty and laConn[laUrl[x]] is "close" case laLength[laUrl[x]] is empty and laConn[laUrl[x]] is empty put laTmpData[laUrl[x]] into tData ulStoreData laUrl[x],tData put length(tData) into laReadBytes[laUrl[x]] put empty into laTmpData[laUrl[x]] ##clear buffer ulDoProcessNoLength x break end switch end ulDoProcess ------------------------------------------------------------------ on ulDoProcessLength x,y ##normal http case if y <> empty then ulStoreData laUrl[x],y add length(y) to laReadBytes[laUrl[x]] end if if laReadBytes[laUrl[x]] >= laLength[laUrl[x]] then put "true" into laStatus[laUrl[x]] if char 1 of laStatusCode[laUrl[x]] = 2 then ##in 200 range--OK if laFile[laUrl[x]] is empty then put "cached" into tStatus else put "downloaded" into tStatus end if put empty into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"downloaded" ##CALLBACK FEATURE else put "error" && laStatusMessage[laUrl[x]] into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put "error" into laUrlLoadStatus[laUrl[x]] end if end if delete local laHaveHeader[laUrl[x]] -------------------------- else ##need more data put "loading," & laReadBytes[laUrl[x]] & "," & laLength[laUrl[x]] into tStatus put tStatus into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],tStatus ##CALLBACK FEATURE if laStatus[laUrl[x]] is empty then read from socket x with message "ulDoProcessLength" --------------------- if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock waits above if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put empty into laLoadedUrls[laUrl[x]] ##empty any data here else put empty into laData[laUrl[x]] ##empty any data here end if end if exit "ulDoProcessLength" ------------------------------ end if end if end ulDoProcessLength ------------------------------------------------------------ on ulDoProcessChunked x,y if y <> empty then put y after laTmpData[laUrl[x]] end if repeat while laStatus[laUrl[x]] is empty if laNeedChunk[laUrl[x]] then get the number of chars of line 1 of laTmpData[laUrl[x]] if not ((char it of laTmpData[laUrl[x]] is numtochar(13)) and\ (char it+1 of laTmpData[laUrl[x]] is numtochar(10))) then read from socket x with message "ulDoProcessChunked" --------------------- if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait above if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put empty into laLoadedUrls[laUrl[x]] ##empty any data here else put empty into laData[laUrl[x]] ##empty any data here end if end if exit "ulDoProcessChunked" end if put offset(numtochar(13), laTmpData[laUrl[x]]) into wOffset[laUrl[x]] ----get chunk size value (store in laChunk) put char 1 to wOffset[laUrl[x]]-1 of laTmpData[laUrl[x]] into tRead[laUrl[x]] set the itemDel to ";" put item 1 of tRead[laUrl[x]] into tRead[laUrl[x]] ##remove any chunk extension set the itemdel to comma replace space with empty in tRead[laUrl[x]] put baseConvert(tRead[laUrl[x]],16,10) into laChunk[laUrl[x]] --------- delete char 1 to wOffset[laUrl[x]]+1 of laTmpData[laUrl[x]] if tRead[laUrl[x]] is "0" then ##completed delete local laNeedChunk[laUrl[x]] delete local laHaveHeader[laUrl[x]] put "true" into laStatus[laUrl[x]] ##to break out of wait if char 1 of laStatusCode[laUrl[x]] = 2 then ##in 200 range --OK if laFile[laUrl[x]] is empty then put "cached" into tStatus else put "downloaded" into tStatus end if put empty into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"downloaded" ##CALLBACK FEATURE else put "error" && laStatusMessage[laUrl[x]] into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put "error" into laUrlLoadStatus[laUrl[x]] end if end if exit "ulDoProcessChunked" end if end if switch case length(laTmpData[laUrl[x]])=laChunk[laUrl[x]] + 2 put char 1 to laChunk[laUrl[x]] of laTmpData[laUrl[x]] into tData ulStoreData laUrl[x],tData add length(tData) to laReadBytes[laUrl[x]] put "loading," & laReadBytes[laUrl[x]] & "," into tStatus put tStatus into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],tStatus ##CALLBACK FEATURE delete char 1 to laChunk[laUrl[x]] + 2 of laTmpData[laUrl[x]] put true into laNeedChunk[laUrl[x]] if laStatus[laUrl[x]] is empty then read from socket x with message "ulDoProcessChunked" --------------------- if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait above if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put empty into laLoadedUrls[laUrl[x]] ##empty any data here else put empty into laData[laUrl[x]] ##empty any data here end if end if exit "ulDoProcessChunked" ----------------------- end if break case length(laTmpData[laUrl[x]])>laChunk[laUrl[x]] + 2 put char 1 to laChunk[laUrl[x]] of laTmpData[laUrl[x]] into tData ulStoreData laUrl[x],tData add length(tData) to laReadBytes[laUrl[x]] put "loading," & laReadBytes[laUrl[x]] & "," into tStatus put tStatus into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],tStatus ##CALLBACK FEATURE delete char 1 to laChunk[laUrl[x]] + 2 of laTmpData[laUrl[x]] put true into laNeedChunk[laUrl[x]] next repeat break case length(laTmpData[laUrl[x]]) < laChunk[laUrl[x]] + 2 put false into laNeedChunk[laUrl[x]] if laStatus[laUrl[x]] is empty then read from socket x with message "ulDoProcessChunked" --------------------------- if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait above if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put empty into laLoadedUrls[laUrl[x]] ##empty any data here else put empty into laData[laUrl[x]] ##empty any data here end if end if ---------------------------- end if exit "ulDoProcessChunked" end switch end repeat end ulDoProcessChunked --------------------------------------- on ulDoProcessNoLength x,y if y <> empty then ulStoreData laUrl[x],y add length(y) to laReadBytes[laUrl[x]] end if if x is among the lines of the openSockets then ##test for closure here if laStatus[laUrl[x]] is empty and laHttpDataDone[laUrl[x]] is empty then read from socket x with message "ulDoProcessNoLength" ---------------------------------------- if the result <> empty then put the result into tResult if tResult is not "socket is not open" then put "error" && the result into laUrlErrorStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]]##not likely put empty into laLoadedUrls[laUrl[x]] ##empty any data here else put empty into laData[laUrl[x]] ##empty any data here end if else ##assume that we've got all the data ##treat as "completed" as below put "true" into laStatus[laUrl[x]] if char 1 of laStatusCode[laUrl[x]] = 2 then if laFile[laUrl[x]] is empty then put "cached" into tStatus else put "downloaded" into tStatus end if put empty into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"downloaded" ##CALLBACK FEATURE else put "error" && laStatusMessage[laUrl[x]] into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put "error" into laUrlLoadStatus[laUrl[x]] end if delete local laHaveHeader[laUrl[x]] end if end if --------------------------------------------- end if else ##completed put "true" into laStatus[laUrl[x]] if char 1 of laStatusCode[laUrl[x]] = 2 then if laFile[laUrl[x]] is empty then put "cached" into tStatus else put "downloaded" into tStatus end if put empty into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"downloaded" ##CALLBACK FEATURE else put "error" && laStatusMessage[laUrl[x]] into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] is "true" then put "error" into laUrlLoadStatus[laUrl[x]] end if delete local laHaveHeader[laUrl[x]] end if end ulDoProcessNoLength ##################HTTP DELETE############################### on ulDeleteHttp pUrl try put empty into laStatus[pUrl] put ulWhichSocket(pUrl) into tSocket put pUrl into laUrl[tSocket] #ref the url to the used socket if tSocket is not among the lines of the openSockets then ulStartTickle ##safeguard routine get ulOpenSocket(tSocket) if not it then throw it ##error opening socket end if put "contacted" into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "contacted" into laUrlLoadStatus[pUrl] ulSendCallback pUrl,"contacted" ##CALLBACK FEATURE put ulBuildHttpRequest(pUrl) into tRequest ulLogit tRequest & cr ##LOG write tRequest & crlf to socket tSocket if the result is not empty then throw the result end if put "requested" into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "requested" into laUrlLoadStatus[pUrl] ulSendCallback pUrl,"requested" ##CALLBACK FEATURE read from socket tSocket until crlf & crlf with message "ulReadMore" if the result is not empty then throw the result repeat while laStatus[pUrl] is empty if lvJumpOut then exit to top wait for messages end repeat ------------------------------------- ulHttpLateCleanUp tSocket --------------------------- catch pErr ulHttpEarlyCleanUp tSocket,pUrl,pErr exit ulDeleteHttp end try end ulDeleteHttp ########################HTTP POST######################### on ulPostHttp pUrl try put empty into laStatus[pUrl] ##set wait flag here put ulWhichSocket(pUrl) into tSocket put pUrl into laUrl[tSocket] #ref the url to the used socket if tSocket is not among the lines of the openSockets then ulStartTickle ##safeguard routine get ulOpenSocket(tSocket) if not it then throw it ##error opening socket end if put "contacted" into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "contacted" into laUrlLoadStatus[pUrl] ulSendCallback pUrl,"contacted" ##CALLBACK FEATURE put ulBuildHttpRequest(pUrl) into tRequest put empty into laData[pUrl] put empty into laTmpData[pUrl] ulLogit tRequest & cr #LOG write tRequest & crlf to socket tSocket with message "ulWriteSome" -------------------------- if the result is not empty then throw the result end if -------------------------- ## blocking point repeat while laStatus[pUrl] is empty if lvJumpOut then exit to top wait for messages end repeat ##added for 1.0.8.b4 , was previously in ulWriteSome which wasn't good ulHttpLateCleanUp tSocket catch pErr ulHttpEarlyCleanUp tSocket,pUrl,pErr exit ulPostHttp end try end ulPostHttp ----------------------------------------------------- on ulWriteSome x if laUrl[x] <> empty then ##in case an error was encountered when writing if the length of laPostData[laUrl[x]] <= 4096 then ##don't forget to get tBytes write laPostData[laUrl[x]] & crlf to socket x put "requested" into laUrlErrorStatus[laUrl[x]] read from socket x with message "ulReadmore" ---------------------------------- if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##to unblock wait above end if ---------------------------------- repeat while laStatus[laUrl[x]] is empty if lvJumpOut then exit to top wait for messages end repeat else put char 1 to 4096 of laPostData[laUrl[x]] into tChunk ##laChunk[laUrl[x]] delete char 1 to 4096 in laPostData[laUrl[x]] write tChunk to socket x with message "ulWriteSome" end if end if end ulWriteSome ###################HTTP PUT########################## on ulPutHttp pUrl try put empty into laStatus[pUrl]##flag put ulWhichSocket(pUrl) into tSocket put pUrl into laUrl[tSocket] #ref the url to the used socket if tSocket is not among the lines of the openSockets then ulStartTickle ##safeguard routine get ulOpenSocket(tSocket) if not it then throw it ##error opening socket end if put "contacted" into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "contacted" into laUrlLoadStatus[pUrl] ulSendCallback pUrl,"contacted" ##CALLBACK FEATURE put ulBuildHttpRequest(pUrl) into tRequest ulLogit tRequest & cr ##LOG ##just the same as ulPostHttp from this point write tRequest & crlf to socket tSocket with message "ulWriteSome" --------------------------- if the result is not empty then throw the result end if -------------------------- ##top blocking point repeat while laStatus[pUrl] is empty if lvJumpOut then exit to top wait for messages end repeat ##added for 1.0.8.b4 , was previously in ulWriteSome which wasn't good ulHttpLateCleanUp tSocket catch pErr ulHttpEarlyCleanUp tSocket,pUrl,pErr exit ulPutHttp end try end ulPutHttp -------------------------------------------- function ulWhichSocket pUrl ##build socket ref including Connection ID number ## re-use sockets for blocking requests if open ##load request sequences will always use same socket ##new sequence gets new socket put laConnectHost[pUrl] into tConnectHost set the itemDel to "|" if loadReq[pUrl] then if laConnectID[tConnectHost] <> empty then put laConnectID[tConnectHost] into tConnID else add 1 to lvCount put lvCount into tConnID put lvCount into laConnectID[tConnectHost] end if else ##blocking request put empty into tConnID put char 1 to 4 of pUrl is "ftp:" into tIsFtp repeat for each line i in the openSockets if tIsFtp then ##makes sure we have the same username before re-using an FTP socket if laSocketUser[i] <> laUser[pUrl] then next repeat end if end if if item 1 of tConnectHost is item 1 of i and i is not among the lines of keys(laUrl) then #OK to use put last item of i into tConnID exit repeat end if end repeat if tConnID is empty then ##need new socket ref add 1 to lvCount put lvCount into tConnID end if end if ##swap out user name for connection ID put item 1 of tConnectHost & "|" & tConnID into tSocket if laUser[pUrl] <> empty then ##for ftp sockets, we need to keep reference to user name put laUser[pUrl] into laSocketUser[tSocket] ## here or when connection is made?? end if set the itemDel to comma return tSocket end ulWhichSocket --------------------------------------------- function ulBuildHttpRequest pUrl ##build the httpRequest including ##request line and basic headers if the customHTTPHeaders of me <> empty then#a put the customHTTPHeaders of me into tRequest set the customHTTPHeaders of me to empty else ##get template put the cDefaultHeader of me into tRequest ##get method put laAction[pUrl] into tAction switch tAction case "getData" put "GET" into tMethod break case "deleteData" put "DELETE" into tMethod break case "putData" put "PUT" into tMethod break case "postData" put "POST" into tMethod break end switch replace "METHOD" with tMethod in tRequest ---------------------------- ##fill in url resource put laLongFileName[pUrl] into word 2 of line 1 of tRequest ## fill in host put laHost[pUrl] after line 2 of tRequest ## fill in User-Agent if "rev" is in the short name of me then put "Revolution" into tAgent else put "Metacard" into tAgent end if put tAgent && "(" & the platform & ")" after line 3 of tRequest if tMethod is among the items of "PUT,POST" then put cr & "Content-Length:" && length(laPostdata[pUrl]) after tRequest put cr & "Content-Type: application/x-www-form-urlencoded" after tRequest end if if laAuth[pUrl] is not empty then put base64Encode(laUser[pUrl] & ":" & laPasswd[pUrl]) into tLogin put cr & "Authorization: Basic" && tLogin after tRequest end if ##customize according to httpHeaders ## if the httpHeaders is not empty then if laCurrentHttpHeaders[pUrl] is not empty then ##repeat for each line tHeader in the httpHeaders repeat for each line tHeader in laCurrentHttpHeaders[pUrl] put lineOffset((word 1 of tHeader),tRequest) into tHeaderLine if tHeaderLine is not 0 then ##replace header value put tHeader into line tHeaderLine of tRequest else ##add new field put cr & tHeader after tRequest end if end repeat end if end if ##set the lastHTTPHeaders## set the lastHTTPHeaders of me to tRequest ##separate lines with crlf in header repeat for each line i in tRequest put i & crlf after tRequest2 end repeat return tRequest2 end ulBuildHttpRequest ################################################### ################ FTP LOGIN#################### ######################################## on ulFtpRequest pUrl if laLoadReq[pUrl] then ulFtpLoad pUrl else if laAction[pUrl] = "postdata" then ##don't handle this put "error Post command not handled for FTP" into laUrlErrorStatus[pUrl] ulCleanUpFtpLocals pUrl exit "ulFtpRequest" else ulFtpSocket pUrl end if end ulFtpRequest ----------------------------- ##set up queue for http load requests on ulFtpLoad pUrl put laConnectHost[pUrl] into tIP put keys(laLoadQ) into tLoadingKeys if tIP is among the lines of tLoadingKeys then put true into tHaveConnection else put false into tHaveConnection end if put pUrl & cr after laLoadQ[tIP] put "queued" into laUrlLoadStatus[pUrl] if not tHaveConnection then ulNextFtpLoadRequest tIP end if end ulFtpLoad ------------------------------------------------ ##dispatch next request on ulNextFtpLoadRequest pIP put line 1 of laLoadQ[pIP] into tUrl if tUrl <> empty then if tUrl = lvBlockingUrl then ##the same URL is being requested in a blocking call repeat until lvBlockingUrl <> tUrl if lvJumpOut then exit to top wait for messages end repeat end if ##in case url was "unloaded" during any wait, check that it's still in the queue if tUrl is among the lines of keys(laLoadingUrls) then delete line 1 of laLoadQ[pIP] ##delete this item ##added for 1.0.8r4 ulFtpSocket tUrl else ##Delete current rquest if not in laLoadingUrls ----------------------------------- ## CLEAN UP POINT if user cancelled while in queue delete line 1 of laLoadQ[pIP] ##delete this item ulCleanUpFtpLocals tUrl delete local laLoadReq[tUrl] ##added dc 210702 delete local laLoadedUrls[tUrl]##added dc 210702 delete local laMessg[tUrl]##added dc 210702 delete local laUrlErrorStatus[tUrl] delete local laUrlLoadStatus[tUrl] delete local laCancelled[tUrl] if the number of lines of laLoadQ[pIP] = 0 then delete local laLoadQ[pIP] delete local laConnectID[pIP] else ##use send .. in send "ulNextFtpLoadRequest" && quote & pIP & quote to me in 1 milliseconds end if ---------------------------------- end if end if end ulNextFtpLoadRequest -------ulFtpSocket------------------------------------------------------ -------Establishes connection for all ftp calls------------------- on ulFtpSocket pUrl put empty into laStatus[pUrl] ##set main wait flag here put ulWhichSocket(pUrl) into tSocket put pUrl into laUrl[tSocket] ##reference the url to the used socket put "0" into laStopUnit[tSocket] put "0" into laStopSec[tSocket] if tSocket is not among the lines of the openSockets then ulStartTickle ##safeguard routine get ulOpenSocket(tSocket) if not it then ulFtpEarlyExit tSocket,pUrl,it exit ulFtpSocket end if ------------------------get server response (220) put ulFtpWaitResponse(tSocket) into tReply if not ulFtpGoodReply(tReply, "connect") then ulFtpEarlyExit tSocket,pUrl,tReply exit "ulFtpSocket" end if --------------- put "connecting" into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "connecting" into laUrlLoadStatus[pUrl] ulSendCallback pUrl,"connecting" ##CALLBACK FEATURE --------------- put "USER " & laUser[pUrl] into tCmd put ulFtpCommand(tCmd,tSocket) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpEarlyExit tSocket,pUrl,tReply exit "ulFtpSocket" end if ---------------------- put "PASS " & laPasswd[pUrl] into tCmd put ulFtpCommand(tCmd,tSocket) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpEarlyExit tSocket,pUrl,tReply exit "ulFtpSocket" end if end if ---------------------------- write "PWD" & crlf to socket tSocket with message "ulFtpStartPoint" ##BRANCH TO ALLOW NON BLOCKING load if the result <> empty then put the result into tErr ulFtpEarlyExit tSocket,pUrl,tErr exit ulFtpSocket end if ---------------------------------------- ##let non-blocking requests exit put pUrl into tUrlHolder ##so we can delete laUrl and in ulFtpStartPoint on return if laLoadReq[tUrlHolder] is empty then repeat until laStatus[tUrlHolder] is not empty if lvJumpOut then exit to top wait for messages end repeat end if end ulFtpSocket -------------------------------------------- on ulFtpEarlyExit pSocket,pUrl,pErr #### ##clean up when exiting before first blocking point #### put laConnectHost[pUrl] into tConnectHost replace "ftpErr," with empty in pErr put "error" && pErr into laUrlErrorStatus[pUrl] if laLoadReq[pUrl] then put "error" into laUrlLoadStatus[pUrl] put false into laStatus[pUrl] close socket pSocket delete local laSocketUser[pSocket] delete local laStopUnit[pSocket] delete local laStopSec[pSocket] put laLoadReq[pUrl] into tLoadReq ##holder ulCleanUpFtp pSocket if tLoadReq then ulSendMessage pUrl ##added 091002 send "ulNextFtpLoadRequest" && quote & tConnectHost & quote to me in 1 milliseconds end if end ulFtpEarlyExit -------------------------- on ulFtpSetError x, pErr replace "ftpErr," with empty in pErr put "error " && pErr into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put false into laStatus[laUrl[x]] ##set flag to get past waits end ulFtpSetError -------ulFtpStartPoint------------------------------------------------------ -------Continues after load calls have passed on------------------- on ulFtpStartPoint x set the itemdel to "|" put item -1 of x into tNum set the itemdel to comma put ulFtpWaitResponse(x) into tReply replace "ftpErr," with empty in tReply if not ulFtpGoodReply(tReply, "PWD") then ##command sent in ftpSocket ulFtpSetError x,tReply close socket x delete local laSocketUser[x] else ##051202 next 5 lines repair bug introduced in 1.0.8a1 ## and ensure home directory is only set once per session ##otherwise CWD calls put us out of kilter if laHome[laUrl[x]] is empty then set the itemDel to quote put item 2 of tReply into laHome[laUrl[x]] set the itemDel to comma end if put "connected" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "connected" into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"connected" ##CALLBACK FEATURE switch case laAction[laUrl[x]] is "getData" ulFtpGet x,tNum break case laAction[laUrl[x]] is "putData" ulFtpSend x,tNum break case laAction[laUrl[x]] is "deleteData" ulFtpDelete x break default put false into laStatus[laUrl[x]] put "error Command not handled" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] end switch end if ##block ALL requests here until everything finished ##load requests already got past in ulFtpSocket repeat while laStatus[laUrl[x]] is empty if lvJumpOut then exit to top wait for messages end repeat ## CLEAN UP POINT ------------------------------------- ##Pass message here on return put laUrlLoadStatus[laUrl[x]] into tLoadStatus ------------------------------------- #start timer routine for closing ftp connection if laStopUnit[x] = 0 then put "1" into laStopUnit[x] send "ulFtpStopWatch " & x to me in 50 milliseconds end if ##do cleanup here ##first close file if necessary if laFile[laUrl[x]] <> empty then if laUrlByFile[laFile[laUrl[x]]] = laUrl[x] then ##hasn't been opened by new request close file laFile[laUrl[x]] ##close here?? delete local laUrlByFile[laFile[laUrl[x]]] else seek to 0 in file laFile[laUrl[x]] ##reset position for subsequent reads end if end if delete local laFile[laUrl[x]] put laLoadReq[laUrl[x]] into tLoadReq ##holder put laUrl[x] into tUrlHolder #so we can delete in cleanUp put laConnectHost[laUrl[x]] into tConnectHost #holder so we can delete in clean up ulCleanUpFtp x if tLoadReq and laCancelled[tUrlHolder] then delete local laLoadedUrls[tUrlHolder] delete local laUrlLoadStatus[tUrlHolder] delete local laUrlErrorStatus[tUrlHolder] delete local laStatus[tUrlHolder] end if if not laCancelled[tUrlHolder] then ulSendMessage tUrlHolder else delete local laMessg[tUrlHolder] end if delete local laCancelled[tUrlHolder] #change dc 210702 if tLoadReq then send "ulNextFtpLoadRequest" && quote & tConnectHost & quote to me in 1 milliseconds end if end ulFtpStartPoint #####################FTP GET################## on ulFtpGet x,z if lvFtpMode is "active" then put "active" into laMode[laUrl[x]] else put "passive" into laMode[laUrl[x]] end if put "contacted" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "contacted" into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"contacted" ##CALLBACK FEATURE -----TYPE-------------------- put "TYPE I" into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply close socket x delete local laSocketUser[x] exit "ulFtpGet" end if ---------------------- ##sort out file path if laHome[laUrl[x]] is not "/" then ##otherwise laFileName should already be OK if laHome[laUrl[x]] is not char 1 to length(laHome[laUrl[x]]) of laLongFileName[laUrl[x]] then put laHome[laUrl[x]] before laLongFileName[laUrl[x]] end if end if ##SIZE get file size or CWD if a directory put empty into laLength[laUrl[x]] ##set up if last char of laLongFileName[laUrl[x]] is not "/" then ##file not directory put "SIZE " & laLongFileName[laUrl[x]] into tCmd put false into tNeedCWDReset put ulFtpCommand(tCmd,x) into tReply ## 191002 changed following; can't use 550 response from SIZE command to assume file can't be transferred ## if item 1 of tReply is "ftpErr" or word 1 of tReply is 550 then if item 1 of tReply is "ftpErr" then ulFtpSetError x,tReply close socket x delete local laSocketUser[x] exit "ulFtpGet" end if if word 1 of tReply = 213 then ##good reply get word 2 of tReply if it is an integer then put it into laLength[laUrl[x]] end if end if else ##need directory listing so we must CWD before getting listing put laLongFileName[laUrl[x]] into tTempPath if the length of tTempPath >1 then ##remove final forward slash delete last char of tTempPath end if put "CWD " & tTempPath into tCmd put true into tNeedCWDReset put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply close socket x delete local laSocketUser[x] exit "ulFtpGet" end if end if -------------------------------------- if laMode[laUrl[x]] is "active" then ulTransferActive x else ulTransferPassive x end if if laStatus[laUrl[x]] <> empty then ##failed to set up data connection close socket x delete local laSocketUser[x] exit ulFtpGet end if ---------------------------------------------------- ##prepare for reading data put empty into laFtpDataDone[laUrl[x]] ##flag for checking transfer is over put empty into laReadBytes[laUrl[x]] if laLoadReq[laUrl[x]] then put empty into laLoadedurls[laUrl[x]] else put empty into laData[laUrl[x]] end if -----RETR or LIST------------------- if last char of laLongFileName[laUrl[x]] is not "/" then put "RETR " & laLongFileName[laUrl[x]] into tCmd else ##need directory listing if lvFtpListCommand = "NLST" then put "NLST" into tCmd else put "LIST" into tCmd end if end if put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply exit "ulFtpGet" else put "requested" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "requested" into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"requested" ##CALLBACK FEATURE end if ------------------------------------- ##blocking point ACTIVE?? if laMode[laUrl[x]] is "active" then repeat while laFtpDataDone[laUrl[x]] is empty and laStatus[laUrl[x]] is empty if lvJumpOut then exit to top wait for messages end repeat end if ##blocking point PASSIVE?? if laMode[laUrl[x]] is not "active" then read from socket laTransPasvIP[laUrl[x]] with message "ulGetData" repeat while laFtpDataDone[laUrl[x]] is empty and laStatus[laUrl[x]] is empty if lvJumpOut then exit to top wait for messages end repeat end if if laStatus[laUrl[x]] is not empty then ##error occurred if laUrlErrorStatus[laUrl[x]] is empty then put "error" into laUrlErrorStatus[laUrl[x]] end if if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] delete local laLoadedUrls[laUrl[x]] ##clear data else delete local laData[laUrl[x]] ##clear data end if close socket x delete local laSocketUser[x] else #now check for 226 completion put ulFtpWaitResponse(x) into tReply if word 1 of tReply <> 226 then replace "ftperr," with empty in tReply put "error" && tReply into laUrlErrorStatus[laUrl[x]] put empty into laData[laUrl[x]] ##clear data if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] delete local laLoadedurls[laUrl[x]] ##don't need anymore end if close socket x delete local laSocketUser[x] else ##download successful if tNeedCWDReset then ##051202 reset current directory to original put "CWD " & laHome[laUrl[x]] into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply close socket x delete local laSocketUser[x] exit "ulFtpGet" end if end if put empty into laUrlErrorStatus[laUrl[x]] if laFile[laUrl[x]] is empty then put "cached" into tStatus else put "downloaded" into tStatus end if if laLoadReq[laUrl[x]] then put tStatus into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"downloaded" ##CALLBACK FEATURE end if put true into laStatus[laUrl[x]] ##break wait end if end ulFtpGet ############get data port from ftp server-answer to PASV############## on ulTransferPassive x set the itemDel to "|" put last item of x into y set the itemDel to comma put "PASV" into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply exit "ulTransferPassive" end if if last char of tReply is "." then delete last char of tReply replace ")" with empty in tReply set the itemDel to "(" put item 2 of tReply into n1 set itemDel to "," put item 1 to 4 of n1 into transPasvIP replace "," with "." in transPasvIP put (item -2 of n1)*256 into a1 put item -1 of n1 into a2 put a1+a2 into tPort put transPasvIP & ":" & tPort & "|" & y into laTransPasvIP[laUrl[x]] get ulOpenSocket(laTransPasvIP[laUrl[x]]) if not it then put "error Couldn't open passive transfer connection" into tErr ulFtpSetError x,tErr exit "ulTransferPassive" end if put x into laControlXDataMap[laTransPasvIP[laUrl[x]]] ## end ulTransferPassive ------------------------------------------ ####################Send port to server for Active transfer and listen for data############### on ulTransferActive x if lvDataPortCount is empty or lvDataPortCount >= 65535 then ##put 49152 into lvDataPortCount put 6923 into lvDataPortCount else add 1 to lvDataPortCount end if set the itemDel to "|" put last item of x into y set the itemDel to comma put x into laControlXLocalMap[lvDataPortCount] put hostAddress(x) into thisIP replace "." with "," in thisIP put lvDataPortCount into laTransActvIP[x] if laAction[laUrl[x]] is "putData" then accept connections on port laTransActvIP[x] with message "ulPortMessageSend" else accept connections on port laTransActvIP[x] with message "ulPortMessageGet" end if if the result <> empty then put "error Couldn't open transfer port" into tErr ulFtpSetError x,tErr exit "ulTransferActive" end if put laTransActvIP[x] div 256 into i1 put laTransActvIP[x] mod 256 into i2 put "PORT " & thisIP & "," & i1&","& i2 into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply exit "ulTransferActive" end if end ulTransferActive ------------------------------------------ on ulPortMessageGet x,y ##active transfer message received put laControlXLocalMap[y] into tControlSock put tControlSock into laControlXDataMap[x] if x is among the lines of the openSockets then read from socket x with message "ulGetData" if the result <> empty then put the result into tReply ulFtpSetError tControlSock,tReply end if end if end ulPortMessageGet #################the ftp download routine################## on ulGetData x,y put laControlXDataMap[x] into mSock ulStoreData laUrl[mSock],y add length(y) to laReadBytes[laUrl[mSock]] put "loading," & laReadBytes[laUrl[mSock]] & "," & laLength[laUrl[mSock]] into tStatusString put tStatusString into laUrlErrorStatus[laUrl[mSock]] if laLoadReq[laUrl[mSock]] then put tStatusString into laUrlLoadStatus[laUrl[mSock]] ulSendCallback laUrl[mSock],tStatusString ##CALLBACK FEATURE if x is among the lines of the openSockets then read from socket x with message "ulGetData" if the result <> empty then put false into laStatus[laUrl[mSock]] end if end if end ulGetData ##############FTP PUT ######################### on ulFtpSend x,z if lvFtpMode is "active" then put "active" into laMode[laUrl[x]] else put "passive" into laMode[laUrl[x]] end if set the itemDel to "|";put last item of z into y set the itemDel to comma put "contacted" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "contacted" into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"contacted" ##CALLBACK FEATURE ---------------------------------------------------------------------- ##sort out file path if laHome[laUrl[x]] is not "/" then ##otherwise laFileName should already be OK if laHome[laUrl[x]] is not char 1 to length(laHome[laUrl[x]]) of laLongFileName[laUrl[x]] then put laHome[laUrl[x]] before laLongFileName[laUrl[x]] end if end if ## check for valid filename if last char of laLongFileName[laUrl[x]] is "/" or laLongFileName[laUrl[x]] is empty then put "File not specified" into tErr ulFtpSetError x,tErr exit "ulFtpSend" end if ### CWD to directory if it exists put false into tNeedCWDReset set the itemDel to "/" put laLongFileName[laUrl[x]] into tTempPath put empty into item -1 of tTempPath if tTempPath <> laHome[laUrl[x]] then delete char -1 of tTempPath put "CWD " & tTempPath into tCmd put true into tNeedCWDReset put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulMakeDirectory x,tTempPath,1 ##1 = first try if the result <> empty then ulFtpSetError x,the result exit "ulFtpSend" end if end if end if if tNeedCWDReset then ##RESET working directory put "CWD " & laHome[laUrl[x]] into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply close socket x delete local laSocketUser[x] exit "ulFtpSend" end if end if ---------------------------------------------------------------------- put "TYPE I" into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply exit "ulFtpSend" end if if laFile[laUrl[x]] is empty then put length(laPostData[laUrl[x]]) into laLength[laUrl[x]] else put ulFileLength(laFile[laUrl[x]]) into laLength[laUrl[x]] end if put empty into laWriteBytes[laUrl[x]] put empty into laFtpDataDone[laUrl[x]] ##used below to control exit from ulFtpSend if laMode[laUrl[x]] is "active" then ulTransferActive x else ulTransferPassive x end if if laStatus[laUrl[x]] is not empty then ##couldn't make data connection exit "ulFtpSend" end if put "STOR " & laLongFileName[laUrl[x]] into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then ulFtpSetError x,tReply exit "ulFtpSend" end if put "requested" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "requested" into laUrlLoadStatus[laUrl[x]] ulSendCallback laUrl[x],"requested" ##CALLBACK FEATURE ##Block here while sending data if laMode[laUrl[x]] is not "active" then ulSendDataP x repeat while laFtpDataDone[laUrl[x]] is empty and laStatus[laUrl[x]] is empty##waiting for write to complete if lvJumpOut then exit to top wait for messages end repeat if laStatus[laUrl[x]] <> empty then ##error occurred if laUrlErrorStatus[laUrl[x]] is empty then put "error" into laUrlErrorStatus[laUrl[x]] end if put empty into laData[laUrl[x]] ##clear data if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] delete local laData[laUrl[x]] ##clear data end if close socket x delete local laSocketUser[x] else ##look for 226 response put ulFtpWaitResponse(x) into tReply if word 1 of tReply <> 226 then replace "ftperr," with empty in tReply put "error" && tReply into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] delete local laData[laUrl[x]] ##clear data end if close socket x delete local laSocketUser[x] else put empty into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "uploaded" into laUrlLoadStatus[laUrl[x]] delete local laData[laUrl[x]] ##clear data end if ulSendCallback laUrl[x],"uploaded" ##CALLBACK FEATURE end if put true into laStatus[laUrl[x]] end if end ulFtpSend -------------------------------------------- on ulMakeDirectory x, pDir -- first we CWD to the parent directory set the itemDel to "/" put pDir into tTempPath delete item -1 of tTempPath ##parent directory if tTempPath is empty then put "/" into tTempPath ## root directory put empty into lvNeedDir put "CWD " & tTempPath into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then if tTempPath = laHome[laUrl[x]] then return "error Unable to create directory path" else ulMakeDirectory x,tTempPath if the result <> empty then return the result end if end if end if put "MKD " & pDir into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then return "error Unable to create directory path" else ##now CWD to the created directory put "CWD " & pDir into tCmd put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then return tReply else return empty end if end if end ulMakeDirectory ############ACTIVE UPLOAD############ on ulPortMessageSend x,y ##active transfer message received put laControlXLocalMap[y] into tControlSock put tControlSock into laControlXDataMap[x] put ulNextData(laUrl[tControlSock]) into nData if nData <> empty then add length(nData) to laWriteBytes[laUrl[tControlSock]] put "uploading, " & laWriteBytes[laUrl[tControlSock]] & "," & laLength[laUrl[tControlSock]] into tStatusString put tStatusString into laUrlErrorStatus[laUrl[tControlSock]] write nData to socket x with message "ulWriteMoreA" if the result <> empty then put "error" && the result into laUrlErrorStatus[laUrl[tControlSock]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[tControlSock]] put false into laStatus[laUrl[tControlSock]] end if else put false into laStatus[laUrl[tControlSock]] end if end ulPortMessageSend ------------------------------------------- on ulWriteMoreA x put laControlXDataMap[x] into tId put ulNextData(laUrl[tId]) into nData if nData <> empty then add length(nData) to laWriteBytes[laUrl[tId]] put "uploading," & laWriteBytes[laUrl[tId]] & "," & laLength[laUrl[tId]] into tStatusString put tStatusString into laUrlErrorStatus[laUrl[tId]] if laLoadReq[laUrl[tId]] then put tStatusString into laUrlLoadStatus[laUrl[tId]] ulSendCallback laUrl[tId],tStatusString ##CALLBACK FEATURE write nData to socket x with message "ulWriteMoreA" if the result <> empty then put false into laStatus[laUrl[tId]] end if else put true into laFtpDataDone[laUrl[tId]] put empty into laUrlErrorStatus[laUrl[tId]] close socket x close socket laTransActvIP[tID] ##local port delete local laControlXDataMap[x] end if end ulWriteMoreA ##########PASSIVE UPLOAD############ on ulSendDataP x put ulNextData(laUrl[x]) into nData if nData <> empty then add length(nData) to laWriteBytes[laUrl[x]] put "uploading," & laWriteBytes[laUrl[x]] & "," & laLength[laUrl[x]] into tStatusString put tStatusString into laUrlErrorStatus[laUrl[x]] write nData to socket laTransPasvIP[laUrl[x]] with message "ulWriteMoreP" if the result <> empty then put false into laStatus[laUrl[x]] end if else put false into laStatus[laUrl[x]] end if end ulSendDataP --------------------------------------------------------------------- on ulWriteMoreP x put laControlXDataMap[x] into mSock put ulNextData(laUrl[mSock]) into nData if nData <> empty then add length(nData) to laWriteBytes[laUrl[mSock]] put "uploading, " & laWriteBytes[laUrl[mSock]] & "," & laLength[laUrl[mSock]] into tStatusString put tStatusString into laUrlErrorStatus[laUrl[mSock]] if laLoadReq[laUrl[mSock]] then put tStatusString into laUrlLoadStatus[laUrl[mSock]] ulSendCallback laUrl[mSock],tStatusString ##CALLBACK FEATURE if laStatus[laUrl[mSock]] is empty then write nData to socket x with message "ulWriteMoreP" end if if the result <> empty then put false into laStatus[laUrl[mSock]] end if else close socket x ##close data socket here delete local laControlXDataMap[x] put empty into laUrlErrorStatus[laUrl[mSock]] put true into laFtpDataDone[laUrl[mSock]] #set flag before closing socket end if end ulWriteMoreP ####################FTP DELETE################ on ulFtpDelete x ###########make sure we use the full path ##sort out file path if laHome[laUrl[x]] is not "/" then ##otherwise laFileName should already be OK if laHome[laUrl[x]] is not char 1 to length(laHome[laUrl[x]]) of laLongFileName[laUrl[x]] then put laHome[laUrl[x]] before laLongFileName[laUrl[x]] end if end if if last char of laLongFileName[laUrl[x]] is "/" then #delete directory put "RMD " & laLongFileName[laUrl[x]] into tCmd put "directory" into mType else #delete file put "DELE " & laLongFileName[laUrl[x]] into tCmd put "file" into mType end if put ulFtpCommand(tCmd,x) into tReply if not ulFtpGoodReply(tReply, tCmd) then replace "ftpErr," with empty in tReply put "error" && tReply into laUrlErrorStatus[laUrl[x]] else put empty into laUrlErrorStatus[laUrl[x]] end if put true into laStatus[laUrl[x]] end ulFtpDelete ######################################################### on socketClosed x ulLogIt "CLOSED" && x & cr##LOG delete local laSocketUser[x] ##reference for allocating sockets for FTP logons ##need to check whether ftp data port or not if x is among the lines of keys(lvSocketToken) then ##trying to open a socket put "socket closed" into lvSocketToken[x] else if x is lvFtpCommandSocket then ##handling libUrlFtpCommand if x is among the lines of keys(laFTPCommandStatus) then ##may be waiting for a server reply put "socket closed" into laFTPCommandStatus[x] ##unblock waits end if else if x is among the lines of keys(laUrl) then ##http or ftp control socket ## check for two situations here ## first is a premature close on a socket when we know the data length ## second is for cases when we don't know the data length ## a normal close when we know the data length isn't handled here if laLength[laUrl[x]] > laReadBytes[laUrl[x]] then ##fixed dc 250103 put "Socket closed before end of file" into laUrlErrorStatus[laUrl[x]] if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put "false" into laStatus[laUrl[x]] ##unblock waits if x is among the lines of keys(laFTPCommandStatus) then ##may be waiting for a server reply put "socket closed" into laFTPCommandStatus[x] ##unblock waits end if else if laLength[laUrl[x]] is empty and char 1 to 4 of laUrl[x] is "http" then ##when we don't have a length if laStatus[laUrl[x]] is empty then ##assume download completed put empty into laUrlErrorStatus[laUrl[x]] end if put true into laStatus[laUrl[x]] ##unblock waits put "true" into laHttpDataDone[laUrl[x]] ##unblock waits end if else if x is among the lines of keys(laControlXDataMap)then##must be ftp remote data socket put laControlXDataMap[x] into tControlSocket put true into laFtpDataDone[laUrl[tControlSocket]] if laTransActvIP[tControlSocket] is among the lines of the openSockets then close socket laTransActvIP[tControlSocket] ##local data port during active transfers end if delete local laControlXDataMap[x] end if end socketClosed ------------------------------------------- ##SocketTimeout defaults to 10000 milliseconds. ##To change that one can set the "socketTimeoutInterval" to a different value. on socketTimeout x ulLogit "socket timeout" && x & cr ##LOG ##need to check whether data port or not if x is among the lines of keys(lvSocketToken) then ##trying to open a socket put "socket timeout" into lvSocketToken[x] delete local laSocketUser[x] else if x is lvFtpCommandSocket then ##handling libUrlFtpCommand if x is among the lines of keys(laFTPCommandStatus) then ##may be waiting for a server reply put "socket timeout" into laFTPCommandStatus[x] ##unblock waits end if else if x is among the lines of keys(laUrl) then ##http or ftp control socket if laLoadReq[laUrl[x]] then put "timeout" into laUrlLoadStatus[laUrl[x]] put "socket timeout" && x into laUrlErrorStatus[laUrl[x]] put "false" into laStatus[laUrl[x]] ##unblock waits if x is among the lines of keys(laFTPCommandStatus) then ##may be waiting for a server reply put "socket timeout" into laFTPCommandStatus[x] ##unblock waits end if close socket x delete local laSocketUser[x] else if x is among the lines of keys(laControlXDataMap)then##must be ftp remote data socket put laControlXDataMap[x] into tControlSocket put false into laStatus[laUrl[tControlSocket]] ##unblock waits put "socket timeout" into laFTPCommandStatus[tControlSocket] if laLoadReq[laUrl[x]] then put "timeout" into laUrlLoadStatus[laUrl[tControlSocket]] put "socket timeout" && x into laUrlErrorStatus[laUrl[tControlSocket]] else if x is a number then##local port for active ftp transfer put laControlXLocalMap[x] into tControlSocket if tControlSocket <> empty then put false into laStatus[laUrl[tControlSocket]] ##unblock waits put "socket timeout" into laFTPCommandStatus[tControlSocket] if laLoadReq[laUrl[tControlSocket]] then put "timeout" into laUrlLoadStatus[laUrl[tControlSocket]] put "socket timeout" && x into laUrlErrorStatus[laUrl[tControlSocket]] end if end if end socketTimeout -------------------------------------------- on socketError x, pErr ulLogit "socket error" && x & cr & pErr & cr ##LOG ##need to check whether data port or not if pErr is empty then put "unknown error" into pErr if x is among the lines of keys(lvSocketToken) then ##trying to open a socket put pErr into lvSocketToken[x] else if x is lvFtpCommandSocket then ##handling libUrlFtpCommand if x is among the lines of keys(laFTPCommandStatus) then ##may be waiting for a server reply put "socket error" into laFTPCommandStatus[x] ##unblock waits end if else if x is among the lines of keys(laUrl) then ##http or ftp control socket if laLoadReq[laUrl[x]] then put "error" into laUrlLoadStatus[laUrl[x]] put "error" && pErr into laUrlErrorStatus[laUrl[x]] put "false" into laStatus[laUrl[x]] ##unblock waits if x is among the lines of keys(laFTPCommandStatus) then ##may be waiting for a server reply put pErr into laFTPCommandStatus[x] ##unblock waits end if else if x is among the lines of keys(laControlXDataMap)then##must be ftp passive data socket put laControlXDataMap[x] into tControlSocket put false into laStatus[laUrl[tControlSocket]] ##unblock waits put pErr into laFTPCommandStatus[tControlSocket] if laLoadReq[laUrl[tControlSocket]] then put "error" into laUrlLoadStatus[laUrl[tControlSocket]] put "error" && pErr into laUrlErrorStatus[laUrl[tControlSocket]] else if x is a number then##local port for active ftp transfer put laControlXLocalMap[x] into tControlSocket if tControlSocket <> empty then put false into laStatus[laUrl[tControlSocket]] ##unblock waits put pErr into laFTPCommandStatus[tControlSocket] if laLoadReq[laUrl[tControlSocket]] then put "error" into laUrlLoadStatus[laUrl[tControlSocket]] put "error" && pErr into laUrlErrorStatus[laUrl[tControlSocket]] end if end if end socketError ---------------------------------------------- on libUrlResetAll if there is a stack "libUrl" then put empty into fld "log1" of stack "libURL" repeat for each line i in the openSockets close socket i end repeat ulDeleteLocals put true into lvJumpOut send "ulDeleteLocals" to me in 5 milliseconds end libUrlResetAll -------------------------------------------- on ulDeleteLocals repeat for each item e in line 3 of the localNames get "delete" && "local" && e do it end repeat end ulDeleteLocals ---------------------------------------------- on resetAll ## included for compatibility with previous versions ##ibUrlResetAll should be used instead libUrlResetAll end resetAll ----------------------------------------------- on ulFtpStopWatch x if x is among the lines of the OpenSockets then if lvFtpStopTime is empty or lvFtpStopTime is not a number then put 15 into lvFtpStopTime end if switch case laStopSec[x] >= lvFtpStopTime delete local laStopSec[x] delete local laStopUnit[x] put "QUIT" into tCmd get ulFtpCommand(tCmd,x) delete local laFtpCommandStatus[x] # write "QUIT" & CRLF to socket x ##tidy finish close socket x delete local laSocketUser[x] break case laStopUnit[x]=1 add laStopUnit[x] to laStopSec[x] send "ulFtpStopWatch " & x to me in 1 sec break case laStopUnit[x] = 0 break end switch else delete local laStopSec[x] delete local laStopUnit[x] end if end ulFtpStopWatch ---------------------------------------------- on libUrlFtpUpload pData,pUrl,pMessage put false into lvJumpOut put ulStripUrl(pUrl) into newUrl if char 1 to 3 of newUrl <> "ftp" then return "invalid url" end if if lvCount is empty then put "6923" into lvCount else #add 1 to lvCount end if switch case newUrl is among the lines of the keys of laLoadingUrls ##don't allow loads if the same url is waiting to load return "error URL is currently loading" with empty break default put pData into laPostData[newUrl] if pMessage <> empty then put the long id of the target &","& pMessage into laMessg[newUrl] end if put true into laLoadReq[newUrl] put 1 into laLoadingUrls[newUrl] #for tracking put "putData" into laAction[newUrl] put empty into laUrlErrorStatus[newUrl] put empty into laUrlLoadStatus[newUrl] put empty into laData[newUrl] ulGetFormat newUrl,lvCount if laUrlLoadStatus[newUrl] is "error" and not laCancelled[newUrl] then ulSendMessage newUrl ##send message now only if error occurred return "error" else if laCancelled[newUrl] then ##user cancelled after starting but before blocking point delete local laLoadedUrls[newUrl] delete local laUrlLoadStatus[newUrl] delete local laUrlErrorStatus[newUrl] delete local laStatus[newUrl] delete local laCancelled[newUrl] else return empty end if break end switch end libUrlFtpUpload ---------------------------------------------- on libUrlFtpUploadFile pFile,pUrl,pMessage put false into lvJumpOut put ulStripUrl(pUrl) into newUrl if char 1 to 3 of newUrl <> "ftp" then return "invalid url" end if open file pFile for binary read if the result is not empty then return the result end if put newUrl into laUrlByFile[pFile] if lvCount is empty then put "6923" into lvCount else #add 1 to lvCount end if switch case newUrl is among the lines of the keys of laLoadingUrls ##don't allow loads if the same url is waiting to load return "error URL is currently loading" with empty break #case newUrl is not among the lines of the keys of laLoadedUrls OR laUrlLoadStatus[newUrl] is not "cached" default if pMessage <> empty then put the long id of the target &","& pMessage into laMessg[newUrl] end if put true into laLoadReq[newUrl] put pFile into laFile[newUrl] put 1 into laLoadingUrls[newUrl] #for tracking put "putData" into laAction[newUrl] put empty into laUrlErrorStatus[newUrl] put empty into laUrlLoadStatus[newUrl] #put empty into laData[newUrl] ulGetFormat newUrl,lvCount if laUrlLoadStatus[newUrl] is "error" and not laCancelled[newUrl] then ulSendMessage newUrl ##send message now only if error occurred return "error" else if laCancelled[newUrl] then ##user cancelled after starting but before blocking point delete local laLoadedUrls[newUrl] delete local laUrlLoadStatus[newUrl] delete local laUrlErrorStatus[newUrl] delete local laStatus[newUrl] delete local laCancelled[newUrl] else return empty end if break end switch end libUrlFtpUploadFile ----------------------------------------------- on libUrlDownloadToFile pUrl,pFile,pMessage put false into lvJumpOut put ulStripUrl(pUrl) into newUrl open file pFile for binary write if the result is not empty then return the result end if if lvCount is empty then put "6923" into lvCount else #add 1 to lvCount end if switch case newUrl is among the lines of the keys of laLoadingUrls ##don't allow loads if the same url is waiting to load return "error URL is currently loading" with empty break #case newUrl is not among the lines of the keys of laLoadedUrls OR laUrlLoadStatus[newUrl] is not "cached" default if pMessage <> empty then put the long id of the target &","& pMessage into laMessg[newUrl] end if put true into laLoadReq[newUrl] put pFile into laFile[newUrl] put 1 into laLoadingUrls[newUrl] #for tracking put "getData" into laAction[newUrl] put empty into laUrlErrorStatus[newUrl] put empty into laUrlLoadStatus[newUrl] ulGetFormat newUrl,lvCount if laUrlLoadStatus[newUrl] is "error" and not laCancelled[newUrl] then ulSendMessage newUrl ##send message now only if error occurred return "error" else if laCancelled[newUrl] then ##user cancelled after starting but before blocking point delete local laLoadedUrls[newUrl] delete local laUrlLoadStatus[newUrl] delete local laUrlErrorStatus[newUrl] delete local laStatus[newUrl] delete local laCancelled[newUrl] else return empty end if break end switch end libUrlDownloadToFile ----------------------------------------------- function libUrlErrorData pUrl return laUrlErrorStatus[pUrl] end libUrlErrorData ----------------------------------------------- on libUrlSetFtpMode pMode ##default to passive if pMode is "active" or pMode is "a" then put "active" into lvFtpMode else put "passive" into lvFtpMode end if end libUrlSetFtpMode ---------------------------- on libUrlSetFtpListCommand pCommand if pCommand is "NLST" then put "NLST" into lvFtpListCommand else put "LIST" into lvFtpListCommand end if end libUrlSetFtpListCommand ----------------------------- function libUrlVersion return the cVersion of me end libUrlVersion ------------------------------ on libUrlSetLogField pField if word 1 of pField is "field" then put pField into tField else if pField is a number then put "field" && pField into tField else if word 1 of pField is "id" then put "field" && pField into tField else put "field" && quote & pField & quote into tField end if end if end if if exists(tField) then put the long ID of tField into tField##standardise put tField into lvLogField else put empty into lvLogField end if end libUrlSetLogField --------------------------- on libUrlSetStatusCallback pMessage,pObject ##pObject must be a long ID if pMessage <> empty and exists(pObject) then put pMessage & comma & pObject into lvStatusCallback else put empty into lvStatusCallback end if end libUrlSetStatusCallback --------------------------- function libUrlLastHttpHeaders return the lastHttpHeaders of me end libUrlLastHttpHeaders -------------------------- on libUrlSetCustomHttpHeaders pHeaders set the customHTTPHeaders of me to pHeaders end libUrlSetCustomHttpHeaders --------------------------- function libUrlLastRhHeaders return the lastRhHeaders of me end libUrlLastRhHeaders ---------------------------- on libUrlSetFtpStopTime pSecs if pSecs is empty or pSecs < 1 or pSecs is not a number then put 15 into lvFtpStopTime else put pSecs into lvFtpStopTime end if end libUrlSetFtpStopTime --------------------------- on ulSendMessage pUrl ##send any requested message on completion if laMessg[pUrl] is not empty then if item 2 of laMessg[pUrl] is not quote & "" & quote then put item 1 of laMessg[pUrl] into xmessg put item 2 of laMessg[pUrl] into omessg replace quote with empty in omessg send omessg && quote & pUrl & quote & "," & laUrlLoadStatus[pUrl] to xmessg in 0 milliseconds end if end if delete local laMessg[pUrl] end ulSendMessage ---------------------------- on ulSendCallback pUrl, pStatus if lvStatusCallback is empty then exit ulSendCallback put item 1 of lvStatusCallback into tMessage put item 2 of lvStatusCallback into tObject if exists(tObject) then #put laUrlErrorStatus[pUrl] into tStatus send tMessage && quote & pUrl & quote & comma & quote & pStatus & quote to tObject in 0 milliseconds end if end ulSendCallback ----------------------------- function ulFileLength pFile if there is a file pFile then put the directory into tSavedDir put pFile into tDir set the itemDel to "/" put item -1 of pFile into tFileName delete item -1 of tDir set the directory to tDir put the detailed files into tFileData set the directory to tSavedDir set the itemDel to comma split tFileData by cr and "," return item 1 of tFileData[urlEncode(tFileName)] else return "no file" end if end ulFileLength ------------------------------ on ulLogIt pMessage if exists(lvLogField) then put "put pMessage after fld" && word 2 to -1 of lvLogField into tExp do tExp end if end ulLogIt ------------------------------- on ulStartTickle ## safeguard against possible hangs in "wait for messages" loops if lvTickle is empty then put true into lvTickle send "ulTickleMe" to me in 1 seconds end if end ulStartTickle -------------------------- on ulTickleMe ## safeguard against possible hangs in "wait for messages" loops if the openSockets <> empty then send "ulTickleMe" to me in 1 seconds else put empty into lvTickle end if end ulTickleMe --------------------------- function isIPNumber pHost replace "." with empty in pHost replace ":" with empty in pHost replace "|" with empty in pHost return pHost is a number end isIPNumber ---------------------------- on ulCleanUpHttp x #x is socket put laLoadReq[laUrl[x]] into tlLoadReq ##holder put laConnectHost[laUrl[x]] into tConnectHost ulCleanUpHttpLocals laUrl[x] ## remove url referenced locals delete local laLoadReq[laUrl[x]] ##OK here?? ##delete socket referenced locals put laUrl[x] into tempUrl delete local laUrl[x] --prepare for next request if tlLoadReq then delete local laLoadingUrls[tempUrl] ## delete line 1 of laLoadQ[tConnectHost] ##commented out for 1.0.8r4 -- now done in ulNextHttpLoadRequest if the number of lines of laLoadQ[tConnectHost] = 0 then delete local laLoadQ[tConnectHost] ##important delete local laConnectID[tConnectHost] end if end if end ulCleanUpHttp ------------------------- on ulCleanUpHttpLocals pUrl ##crude clean up delete local laLength[pUrl] delete local laConnectHost[pUrl] delete local laAuth[pUrl] delete local laUser[pUrl] delete local laPasswd[pUrl] delete local laHost[pUrl] delete local laLongFileName[pUrl] delete local laLineNum[pUrl] delete local laTmpData[pUrl] delete local laTemp[pUrl] delete local laAction[pUrl] delete local laConn[pUrl] delete local laRhHeader[pUrl] delete local laNeedChunk[pUrl] delete local laStatusCode[pUrl] delete local laStatusMessage[pUrl] delete local laCode[pUrl] delete local laChunk[pUrl] delete local laHaveHeader[pUrl] delete local laHttpDataDone[pUrl] delete local laPostData[pUrl] delete local laReadBytes[pUrl] delete local laCurrentHttpHeaders[pUrl] end ulCleanUpHttpLocals ------------------------------ on ulCleanUpFtp x put laLoadReq[laUrl[x]] into tlLoadReq ##holder put laConnectHost[laUrl[x]] into tConnectHost #holder ulCleanUpFtpLocals laUrl[x] ## remove url referenced locals delete local laLoadReq[laUrl[x]] ##OK here?? ##close any data ports ##should be closed already, but if error occurred if laTransPasvIP[laUrl[x]] is among the lines of the openSockets then close socket laTransPasvIP[laUrl[x]] end if if laTransActvIP[x] is among the lines of the openSockets then ##local port close socket laTransActvIP[x] end if delete local laControlXLocalMap[laTransActvIP[x]] delete local laControlXDataMap[laTransPasvIP[laUrl[x]]] delete local laTransPasvIP[laUrl[x]] delete local laTransActvIP[x] ##delete socket referenced locals put laUrl[x] into tempUrl delete local laUrl[x] delete local laFtpCommandStatus[x] --prepare for next request if tlLoadReq then delete local laLoadingUrls[tempUrl] -- delete line 1 of laLoadQ[tConnectHost] ##commented out for 1.0.8r4 -- now done in ulNextFtpLoadRequest if the number of lines of laLoadQ[tConnectHost] = 0 then delete local laLoadQ[tConnectHost] ##important delete local laConnectID[tConnectHost] end if end if end ulCleanUpFtp ------------------------------ on ulCleanUpFtpLocals pUrl ##clean up locals delete local laConnectHost[pUrl] delete local laLength[pUrl] delete local laAuth[pUrl] delete local laUser[pUrl] delete local laPasswd[pUrl] delete local laHost[pUrl] delete local laLongFileName[pUrl] delete local laAction[pUrl] delete local laHome[pUrl] delete local laFtpDataDone[pUrl] delete local laMode[pUrl] delete local laPostData[pUrl] delete local laReadBytes[pUrl] delete local laWriteBytes[pUrl] end ulCleanUpFtpLocals ------------------------------ on ulCancelRequest pUrl put true into laCancelled[pUrl] put "error cancelled" into tError ulStopRequest pUrl,tError end ulCancelRequest ----------------------------- on ulStopRequest pUrl, pErrMessage put keys(laUrl) into tSocketKeys##test repeat for each line tKey in tSocketKeys if laUrl[tKey] = pUrl then put tKey into tItsSocket exit repeat end if end repeat if tItsSocket is among the lines of the openSockets then put false into laStatus[pUrl] ##should cause everything to wind up cleanly put pErrMessage into laUrlErrorStatus[pUrl] put empty into laData[pUrl] end if if laLoadReq[pUrl] then put "error" into laUrlLoadStatus[pUrl] delete local laData[pUrl] end if end ulStopRequest ----------------------------- on ulStoreData pUrl,@pData if laFile[pUrl] <> empty then write pData to file laFile[pUrl] if the result is not empty then put "error" && the result into tErr ulStopRequest pUrl,tErr end if else if laLoadReq[pUrl] <> empty then put pData after laLoadedUrls[pUrl] else put pData after laData[pUrl] end if end ulStoredata ----------------------------- function ulNextData pUrl if laFile[pUrl] is empty then put char 1 to 4096 of laPostdata[pUrl] into tData delete char 1 to 4096 of laPostData[pUrl] else read from file laFile[pUrl] for 4096 if the result <> empty and the result <> "eof" then put "error" && the result into tErr ulStopRequest pUrl,tErr else put it into tData end if end if return tData end ulNextData ------------------------------ function ulStripUrl pUrl ## clean out any whitespace before and after url put space & tab & cr into tString repeat while char 1 of pUrl is in tString delete char 1 of pUrl end repeat repeat while char -1 of pUrl is in tString delete char -1 of pUrl end repeat return pUrl end ulStripUrl -------------------------------- function ul_TraceLocals ##DEBUG ROUTINE, used in development repeat for each item e in line 3 of the localNames put e & cr after tRetVal put "put keys(" & e & ") & cr after tRetVal" into tDoString do tDoString end repeat return tRetVal end ul_TraceLocals -------------------------------- function ulFtpCommand pCommandString, pSocket ##executes ftp commands ##returns the response from the server (or ftpErr if error occurs) if pSocket is not among the lines of the openSockets then return "ftpErr, socket not open" end if if pCommandString is empty then return "ftpErr, no command to send" end if put empty into laFTPCommandStatus[pSocket] write pCommandString & CRLF to socket pSocket if the result <> empty then return "ftpErr," & the result read from socket pSocket for 1 line with message "ulGetFtpReply" if the result <> empty then return "ftpErr," & the result repeat while laFTPCommandStatus[pSocket] is empty if lvJumpOut then exit to top wait for messages end repeat return laFTPCommandStatus[pSocket] end ulFTPCommand ------------------------------------ function ulFtpWaitResponse pSocket ##used for collecting server responses ##that are not in response to a direct command ##for example when opening a connection to the server, and when transfers complete put empty into laFTPCommandStatus[pSocket] read from socket pSocket for 1 line with message "ulGetFtpReply" repeat while laFTPCommandStatus[pSocket] is empty if lvJumpOut then exit to top wait for messages end repeat return laFTPCommandStatus[pSocket] end ulFtpWaitResponse ------------------------------------ on ulGetFtpReply pSocket,pReply ##reads data from the command port ##generally called by ulFTPCommand, but also by ulFtpWaitResponse ulLogIt pReply##LOG put line -1 of pReply into tReply ##should only be one line get char 1 to 3 of tReply if it is an integer and it >= 100 then put it into tReplyNum if char 4 of tReply <> "-" then put tReply into laFTPCommandStatus[pSocket] else read from socket pSocket for 1 line with message "ulGetFtpReply" if the result <> empty then put "ftpErr," & the result into laFTPCommandStatus[pSocket] end if end if else read from socket pSocket for 1 line with message "ulGetFtpReply" if the result <> empty then put "ftpErr," & the result into laFTPCommandStatus[pSocket] end if end if end ulGetFtpReply --------------------------------- function ulFtpGoodReply pReply, pCommand ##compares a reply code against a predetermined list ##of "good" reply codes for a particular command if item 1 of pReply is "ftpErr" then return false put the cFtpGoodCodes[word 1 of pCommand] of me into tGoodCodes if word 1 of pReply is among the items of tGoodCodes then return true else return false end if end ulFtpGoodReply ------------------------------------- function libUrlFtpCommand pCommand, pHost, pUser, pPass local tHost,tPort put false into lvJumpOut if lvCount is empty then put "6923" into lvCount end if ##separate host and port put "([^:]*)(.*)" into tRegEx if not matchText(pHost,tRegEx,tHost,tPort) then return "error Invalid host address" put tHost into tTempHost if tPort is empty then put ":21" into tPort ##get IP address replace "." with empty in tTempHost replace ":" with empty in tTempHost if tTempHost is not a number then get hostnameToAddress(tHost) if the result is empty then put line 1 of it & tPort into tConnectHost else return "error" && the result end if else put tHost & tPort into tConnectHost end if ##set anonymous user if needed if pUser is empty then put "anonymous" into pUser put "guest" into pPass end if ##make dummy url to use other parts of libUrl put "ftp:" & pCommand into tDummyUrl ## make laUser and laPasswd entries put pUser into laUser[tDummyUrl] put pPass into laPasswd[tDummyUrl] ##make laConnectHost entry so we can use ulWhichSocket ##laConnectHost has format host:port|user put tConnectHost & "|" & pUser into laConnectHost[tDummyUrl] ##do we have an open socket for this user/host combination? put ulWhichSocket(tDummyUrl) into tSocket put tSocket into lvFtpCommandSocket ##don't need any more delete local laUser[tDummyUrl] delete local laPasswd[tDummyUrl] delete local laConnectHost[tDummyUrl] put ulFtpLogon(tSocket, pUser,pPass) into tLogonReply if tLogonReply is empty then put ulFtpCommand(pCommand, tSocket) into tFtpReply if laStopUnit[tSocket] = 0 then put "1" into laStopUnit[tSocket] send "ulFtpStopWatch " & tSocket to me in 50 milliseconds end if delete local lvFtpCommandSocket return tFtpReply else delete local lvFtpCommandSocket return tLogonReply end if end libUrlFtpCommand --------------------------- function ulFtpLogon pSocket, pUser, pPass put "0" into laStopUnit[pSocket] put "0" into laStopSec[pSocket] ulStartTickle ##safeguard routine if pSocket is not among the lines of the openSockets then get ulOpenSocket(pSocket) if not it then return it ##error opening socket ------------------------get server response (220) put ulFtpWaitResponse(pSocket) into tReply if not ulFtpGoodReply(tReply, "connect") then return tReply end if --------------- put "USER " & pUser into tCmd put ulFtpCommand(tCmd,pSocket) into tReply if not ulFtpGoodReply(tReply, tCmd) then return tReply end if ---------------------- put "PASS " & pPass into tCmd put ulFtpCommand(tCmd,pSocket) into tReply if not ulFtpGoodReply(tReply, tCmd) then return tReply end if end if return empty end ulFtpLogon ------------------------------ ########################################### ######socket opening routines################## ########################################### --------------------------------------------------------------- function ulOpenSocket x put empty into lvSocketToken[x] put the milliseconds into lvSocketOpenStart[x] open socket to x with message "ulGotSocket" if the result is not empty then return the result end if send "ulSocketTimeout" && x to me in 500 milliseconds put the result into lvSocketOpenMessageID[x] repeat until lvSocketToken[x] is not empty if lvJumpOut then exit to top wait for messages end repeat cancel lvSocketOpenMessageID[x] delete local lvSocketOpenStart[x] delete local lvSocketOpenMessageID[x] put lvSocketToken[x] into tSocketToken ##swap out so we can delete persistent local delete local lvSocketToken[x] if not tSocketToken then if x is among the lines of the openSockets then close socket x end if end if return tSocketToken end ulOpenSocket ------------------------------------------------- on ulGotSocket x put true into lvSocketToken[x] end ulGotSocket ------------------------------------------------ on ulSocketTimeout x if the milliseconds - lvSocketOpenStart[x] > the socketTimeoutInterval then put "timeout" into lvSocketToken[x] else send "ulSocketTimeout" && x to me in 500 milliseconds put the result into lvSocketOpenMessageID[x] end if end ulSocketTimeout ' U@U HelveticaU Helvetica @U W @W UArial WArialUUW@U@U@WW@UUUArialWArial U Helvetica U W U AU Uarial UarialUarial @U UGenevaUGeneva@UGeneva@WGenevaU helveticaU helveticaW helveticaU helveticaW helveticaW helveticaU helveticacFtpGoodCodesPASV227SIZE213PWD257LIST125,150MKD257PORT200CWD250transferComplete226STOR125,150NLST125,150Connect220DELE250RMD250MODE200USER230,331TYPE200QUIT221ABOR225,226RETR125,150PASS230,202 Pon resizeStack get the rect of this card add 8 to item 1 of it add 48 to item 2 of it subtract 8 from item 3 of it subtract 8 from item 4 of it set the rect of field 1 to it set the right of button 2 to item 3 of it end resizeStack %Q`a Pon preOpenCard resizeStack end preOpenCard on resizeStack get the rect of this card add 8 to item 1 of it add 8 to item 2 of it subtract 8 from item 3 of it subtract 8 from item 4 of it set the rect of field 1 to it end resizeStack %QbResetEp#on mouseUp resetAll end mouseUp  @ log1)j0  e` 1da 8`HelpEp"on mouseUp go next end mouseUp @ b p"on mouseUp go next end mouseUp A a  LibUrl "  LibUrl is the script library used by Revolution and Metacard to implement the Transcript/Metatalk commands and functions that use HTTP and FTP urls. o o y nIt is used when the following Transcript/Metatalk commands and functions are called with HTTP or FTP urls: - load url [with message ]  unload url  get url  put into url  post to url  delete url  the cachedUrls  urlStatus() ?It also recognizes and implements the following properties:  the httpheaders  the httpProxy qIn addition, the library contains a few handlers and functions that can be called directly from your scripts: 1 libUrlFtpUpload , [, ]  libUrlErrorData()  libUrlSetFtpMode  libUrlResetAll % libUrlSetFtpStopTime  libUrlSetLogField  libUrlVersion()  Notes: " +load url [with message ] $*  load downloads the url and places it into a cache. The cached data will then be used in subsequent references to that url instead of it being downloaded again. Be sure to unload the url (using unload url) when you no longer need it. %   %  The optional message parameter will cause that message to be called when the download completes (or when an error occurs). Two parameters are passed to the message: the url and its urlStatus. The message should be in the same script as the load command.  on mouseUp ; put "http://www.xx.com/images/mykids.jpg" into tUrl - load url tUrl with message "loadDone"  end mouseUp  on loadDone pUrl, pStatus # if pStatus is "cached" then - put url pUrl into image 1 of card 1 else " answer "Download failed"  end if  end loadDone  wload is a "non-blocking" command. This means the url will load in the background while the script continues to run. %  r HThis allows you to monitor downloads, for example with a progress bar. 2 2 9  on mouseUp A put "http://www.xxxxxx.com/images/mykids2.jpg" into tUrl  load url tUrl  showStatus  end mouseUp  on showStatus A put "http://www.xxxxxx.com/images/mykids2.jpg" into tUrl ) put urlStatus(tUrl) into tStatus * put tStatus ##show in message box I if tStatus is not among the items of "cached,error,timeout" then 5 send "showStatus" to me in 50 milliseconds  end if  end showStatus  3See below for more information about urlStatus. Note that because the load url command is now executed in a script, you must be careful not to include any "wait" commands in your script before the load has completed. "wait" will stop all scripts running, including libUrl. The following script will not work:  % %      %K  on mouseUp %     A put "http://www.xxxxxx.com/images/mykids2.jpg" into tUrl  load url tUrl 5 wait until urlStatus(tUrl) is "cached" ##BAD  @,  end mouseUp  unload url $  unload removes a previously loaded url from the cache and thus frees up memory. You should unload urls when you no longer need them. %   get url $  /get url downloads the url or, if the url is cached from a previous load command, retrieves it from the cache. If it completes successfully, the downloaded data will be in the variable it , and the result function will return empty. If an error occurs, the result function will return an error message. %   %   %  1 %# % %%  on mouseUp     @ put "http://www.xxxxxx.com/images/mykids.jpg" into tUrl  get url tUrl $ if the result is empty then  put it into image 1 else  answer the result  end if  end mouseUp   Typically the error message will consist of the word "error" followed by a string containing more information about the error. Where appropriate, the error string will be the string returned by the http or ftp server including the server response code. For example:  error 404 File not found Note that the variable it will not always be empty when an error occurs. Http servers typically return an "error page" for certain errors (401, 404, etc.) libUrl will try to download such data as well, and return it in the it variable. Because of this, you should always check the result function after a get url command. You can't assume that because it is not empty no error occurred.  %   %  4 %  ! %3  <( %d  f#  get url is a "blocking" command. This means that the script lines following the get command will not continue until get url completes. However, because of the nature of libUrl, it doesn't block other scripts or user actions. If the get url command is in a button, the user could feasibly click the button again before the first mouseUp has completed. Or he or she may click another button that gets another url. In cases when a url is currently downloading from a get url command, subsequent get url commands will return the error "error Previous request has not completed." Because of this, you may want to disable interface elements while a get url command is completing, or take some other action that is appropriate to your application. %  m %t  {m %  %   %   %  ] ((similar script in a series of buttons)    global gUrlBlocking  on mouseUp ? put "http://www.xxxxxx.com/images/mykids1.jpg" into tUrl # if gUrlBlocking is true then beep else # put true into gUrlBlocking  get url tUrl $ put false into gUrlBlocking $ if the result is empty then  put it into image 1 else  answer the result  end if end if  end mouseUp  The same is true for the other "blocking" commands (post, put, delete). Basically only one url can be handled at a time with any of these commands. W %W  Z< put into url $   The put command will save the data to the specified url on an ftp server. If it completes successfully, the result function will return empty. If an error occurs, the result function will return an error message. In the same way as for get url the error message will consist of the word "error" followed by a string containing more information about the error. Where appropriate, the error string will be the string returned by the ftp server including the server response code. For example: error 530 Login incorrect.  %   % Example  on mouseUp M put "ftp://dave:evad345@ftp.xxxxxx.com/images/mykids.txt" into tUrl put field 1 into tData ! put tData into url tUrl % if the result is empty then & answer "Upload successful"  else 4 answer "Upload failed" & cr & the result  end if  end mouseUp  I*See below about including user names and passwords for authorization NSee get url for information about the "blocking" behavior of this command.  %  A post to url $  The post command is used to post data to an http server process such as cgi. If it completes successfully, the result function will return empty and the response from the server will be in the variable it. If an error occurs, the result function will return an error message.  %  c %k  uU %   %  * NSee get url for information about the "blocking" behavior of this command.  %  A  on mouseUp @ put "http://www.xxxxxx.co.uk/cgi-bin/sendform" into tUrl , put "subject=Post text" into tString 2 put "&to=dave@xxxxxxx.co.uk" after tString H put "&message=This is a test message from libUrl." after tString F put "&page=http://www.xxxx.co.uk/submitted.html" after tString  put crlf after tString post tString to url tUrl # if the result is empty then  put it into field 1 else  answer the result  end if  end mouseUp  delete url $  delete url will delete the file from an ftp server. If it completes successfully, the result function will return empty. If an error occurs, the result function will return an error message. %  H %R  \1 %  * the cachedUrls $ ) $  The urlStatus function returns the status of urls that have previously been referenced with a load url command. It will return one of the following:  %  O  \ %^ g. queued %   contacted  requested A loading,x,y (where x = downloaded bytes and y = total bytes) timeout error cached  The function can be used to monitor files as they download (see load url above for an example), or to check the status of a url after the load has completed. @ %@  HX Note that if you upload data with libUrlFtpUpload (see below), instead of "loading" and "cached", urlStatus will return "uploading" and "uploaded" respectively. " %"  1r Also note that "queued" is a new possible value. This is returned when a load url request has been made, and the url is placed on a queue while previous requests to the same host are completed. L %L  Ts  Library interface "  The following library routines can be accessed directly from your scripts. More routines may be added from time to time. It's also possible that some of these routines may be incorporated into the Transcript/Metatalk language at some stage, although with different syntax. /libUrlFtpUpload , [, ] $.  This handler is basically the upload equivalent of the load url command and can be used to upload data to an ftp server. It is a "non-blocking" routine, so your script will continue to execute as the upload takes place in the background which allows the urlStatus to be monitored as the file is uploading. The optional message parameter lets you denote a message that will be called when the upload completes. 7 %7  ?] aNote that urlStatus will return "uploading,x, y" and "uploaded" in replace of "loading,x,y" and "cached" when libUrlFtpLoad is used. Also note that urlStatus will continue to return "uploaded" for this url until you unload it with the unload url command. For this reason, you are advided to unload the url when you no longer need to know its status.  %   %  N %  k on mouseUp B put "ftp://ftp.xxxxxx.com/literature/sadlife.txt" into tUrl  put field 1 into tData " libUrlFtpUpload tData, tUrl  showStatus  end mouseUp  on showStatus B put "ftp://ftp.xxxxxx.com/literature/sadlife.txt" into tUrl ' put urlStatus(tUrl) into tStatus ( put tStatus ##show in message box I if tStatus is not among the items of "uploaded,error,timeout" then 2 send "showStatus" to me in 50 milliseconds end if  end showStatus  libUrlErrorData() $  This function allows you to get further error data about a url whose urlStatus is "error". It will return the same string as the result of a get url command. Typically, this will be the response string returned by an http or ftp server. For example: "404 File not found"  %  | @ put "ftp://ftp.xxxxxx.com/literature/sadlife.txt" into tUrl ; ; ' if urlStatus(tUrl) is "error" then get libUrlErrorData(tUrl) ; put "An error occurred" & cr & it into field "error" end if  libUrlSetFtpMode $  6This command allows you to switch between passive and active FTP data transfers. can be either "active" or "passive". Actually, as passive is now the default, anything except "active" will cause the transfer to use passive mode. Any change will persist for the remainder of the session (i.e. until you application exits) or until you issue the command again. When your application starts, passive transfers will be used by default. So if you know you are going to be using active transfers, you should include this command before initiating any transfers.  If you don't know the difference between passive and active transfers, don't worry. Nine times out of ten, either will work fine. However, if you find that you are having trouble with ftp transfers, you might want to try switching to see if it makes a difference.  libUrlSetFtpMode "active"  libUrlResetAll $ Warning: Don't use this command lightly. In fact, you should never have to use it at all. It closes all open sockets and clears all variables used by libUrl, including any cached data. It's basically the "panic buton" when things go wrong, so it may be useful in development. d %d  g "libUrlSetFtpStopTime $!  This command lets you set the number of seconds that a socket used for an ftp control connection remains open after a transaction completes. must be an integer greater than 0. The default value is 15 seconds. If a new request to the same host is made while the socket is open, the connection is re-used. Note that libUrl makes no attempt to keep the connection open, so the server may close the connection first. libUrlSetLogField $  This command lets you set a field that will collect log data. The field parameter should be the long id of the field you wish to use. libUrlVersion() $ This returns the current version of the libUrl library. There is no special significnce to the numbers, but will be useful for reference when reporting any problems or difficulties. Authorization $  If an http or ftp url requires authorization with a user name and password, these can be included in the url in the following way: ://:@ Examples B http://dave:evad123@www.xxxxxx.com/secrets/thetruth.html = ftp://daphne:enhp456@ftp.xxxxxx.com/gossip/really.jpg For anonymous ftp, no name or password is required. The library will add the "anonymous" user name and a dummy password automatically. If the user name or password contains non-alphanumeric characters (specifically the ":", "@", "/" , "." or "|" characters if these are allowed), then these should be urlEncoded before being put into the url.  put "jim" into tName $ put "jsmith@abc.com" into tPass W put "ftp://" & tName & ":" & urlEncode(tPass) & "@ftp.xxx.com/title.txt" into tUrl  get url tUrl   Acknowledgements $  gDevelopment of libUrl for use with both Revolution and Metacard is sponsored by Runtime Revolution. The major credit must go to Andu Novac who put together the first versions from scratch. This project would be going nowhere without his efforts, especially in implementing the contents of the various rfc's for ftp and http. ;Thanks also to contributors Reed Martin and John Kuehne PThe library is currently maintained by Dave Cragg (dcragg@lacscentre.co.uk).  February 24, 2002  &    ` ?