#!/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 "$@" Managing Web Downlads## Load URL stack ## By Eric Chatonet ## 7/10/05 ## http://www.sosmartsoftware.com/ on preOpenStack set the style of this stack to modeless set the loc of this stack to the screenLoc end preOpenStack ------------------------------ on preOpenCard if the short name of me <> the short name of this stack then exit preOpenCard put empty into fld "UserInfo" put empty into fld "UserInfo2" set the thumbPos of sb "Progress" to 0 end preOpenCard ------------------------------ on closeStack if the short name of me <> the short name of this stack then exit closeStack CloseSubstacks -- UnloadAllUrls -- end closeStack ------------------------------ on CloseSubstacks repeat for each line tSubStack in the substacks of this stack close stack tSubStack end repeat end CloseSubstacks ------------------------------ on UnloadAllUrls local tUrl ----- repeat for each line tUrl in the cachedURLs unload URL tUrl end repeat end UnloadAllUrls FXuCancelMessagefalse uPaypalURLChttps%3A%2F%2Fwww.paypal.com%2Fcgi-bin%2Fwebscr%3Fcmd%3D_xclick%26business%3Deric%252echatonet%2540sosmartsoftware%252ecom%26item_name%3DEric%2520Chatonet%26item_number%3DDev%2520Support%26no_shipping%3D0%26no_note%3D1%26tax%3D0%26currency_code%3DEUR%26return%3Dhttp%3A%2F%2Fwww.sosmartsoftware.com%2F%26charset%3DUTF%252d8"Retrieving Data from the Internet ULucida Grande UGeorgiaUGeorgia ULucida Grande WLucida Grande WVerdana UVerdana @UVerdana ULucida Grande UCourier @ULucida Grande @WLucida Grande WLucida GrandecREVGeometryCachestackID1047 cREVGeneralscriptChecksum\z>n u debugObjects bookmarks handlerList@preOpenStack preOpenCard closeStack CloseSubstacks UnloadAllUrls tempScript prevHandler closeStackscriptSelectionchar 395 to 394script

## Load URL stack

## By Eric Chatonet

## 7/10/05

## http://www.sosmartsoftware.com/

on preOpenStack

set the style of this stack to modeless

set the loc of this stack to the screenLoc

end preOpenStack

------------------------------

on preOpenCard

if the short name of me <> the short name of this stack then exit preOpenCard

put empty into fld "UserInfo"

put empty into fld "UserInfo2"

set the thumbPos of sb "Progress" to 0

end preOpenCard

------------------------------

on closeStack

if the short name of me <> the short name of this stack then exit closeStack

CloseSubstacks -- 

UnloadAllUrls -- 

end closeStack

------------------------------

on CloseSubstacks

repeat for each line tSubStack in the substacks of this stack

close stack tSubStack

end repeat

end CloseSubstacks

------------------------------

on UnloadAllUrls

local tUrl

-----

repeat for each line tUrl in the cachedURLs

unload URL tUrl

end repeat

end UnloadAllUrls

 P>on linkClicked pLink set the linkText of the clickChunk to empty switch pLink case "sosmartsoftware.com" revGoUrl "http://www.sosmartsoftware.com" break default lock screen repeat 2 find string pLink in target end repeat find empty unlock screen end switch end linkClicked XcREVGeometryCacheIDs1120920444330102211158245459961032111833323459210151120920450292102611209709968831030111832732178710041120974866267103411183288908231010111832826570210081121071103439104611210002364141035112092042454710241121000236415103611210002364161037111832737393310061121000236420104111183289376851012112097186984616001121000221140104511210002364211043112100023642210441120920585665102711209203304551019112092037961210211120918553789101711210711934781047cREVGeometrycachetotal26order1115824545996 1121071193478  cREVGeneralscriptChecksum~/>[ bookmarks handlerList linkClicked breakPointsscriptSelection char 53 to 52 prevHandler preOpenCard tempScriptscript?

on linkClicked pLink

set the linkText of the clickChunk to empty

switch pLink

case "sosmartsoftware.com"

revGoUrl "http://www.sosmartsoftware.com"

break

default

lock screen

repeat 2

find string pLink in target

end repeat

find empty

unlock screen

end switch

end linkClicked

@ SSS.png  Hon mouseDown revGoUrl "http://www.sosmartsoftware.com" end mouseDown 0"-PNG  IHDR". pHYs.#.#x?v 9iCCPPhotoshop ICC profilexڝwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yzgAMA|Q cHRMz%u0`:o_F"IDATxbax& O?"?z$<@,X< dz,,2{H?Hk4^B˧̌<4i_rD@,hgaӊb:޾zo]ǷDr8 4y6{5ݕ]WMż#٩ƧoZQqm8$Iyon0w 3+ `8 K d+ ,?ۏҟ]xۥW/~g33+?@S_B9.3_823J{;kc :e'HfCqΈ#{x#Sxs`]Ϛ[^>Y5c+?8r2,FF zh(~(M Ѱ狻v%?d|\>}aeE,^%oΦU{ǃ_Tdگ?w>ytfo <"JYղC"%.686lq-dG &pK\j{H@FeoFWwnAςDE|Փg{Y8~#%̅~f^U8]#50Ln>n^>~f[v6&߰ d cvF>H?~ߟ郹,",Z9}WX%ëXDHĄŠ 9J02qrrﳃ_+yop6E[?;3R.QYy844>?ǛGW50s[s|DYޜs%fq-9_KLu~W=\j^n+!a&lgǯ^ӏ]m rB#ǻ? hV.n6%Lz<х ;'￿ ?g{3蟿~/,r6 ~rOmsy9<9'x9 s-RXxծ|:,>̲ܿ?R= w3< 0 C_>;%'o3_?*imcރ?"2BqN.z6UI/"N~|zʲ/Ho_8AII[9Ԟ|d/O^0Q-$*ۻ= ?:Ű̢*'c*fy_ο> ^Q0si.c``_̒NL l [{p H),x]^ F o1ٍ-w}R0XxkqF_bh6^ . f6F Y. M;S.!IΞz+ *rO3߿z:;;El9%5<{{ˣa!0F6q!qNq M ߿,Oمye-d~82ċsɫ }?R\]WɫJEYDMI\XBV^]$L\ҺJj\6_d x }#ǩB__=r{ 73昳ps0+hڙ7}T~˻oya!!#v</^#.+YXUGN?FSHERTYQHXVDWߞ\RP&-<*e|o:ԹDZO\C7VUAqc㗶ɔ2SRS^!ѕ򊼡r2\vont@W޳2.>eͩ\Pvw׾zY-NݛoM7+Iq+Z( V2{sW/~PvKꙟ(wnZ_V!_xDľTbƯ@I]u &vnn:aAJJ}0-{aQf_>\~A>/x a|x]=҆'?X=ۜ\VqIe̩>[g$\be4 KkabEXOH9 ϟqɍO^-V`ʇ{<~y1I 2sps2 }g,,j2 UWUgWĿ630~}go |mĦ#".$"oϸd⃥>_v>AFN~A&HFLOhpIY PW&У O7., ٲ;|e  ,(|w(㷕 ~ մ6岛6mcC  ŋ"Ogw^z`)PK(B ]SLhُn gyf quc|xw铦-Wfh9Ӌn?zzȅ<U6t5J{ʜ&'O;/?_SģNZƯƐ1D#Ey8rD9*{2hl8zi{᧖UqP$(M[QWc 'Ӆn@ȏ>ov7V9:V Ɇ12 QWB`"EkyщYeWާӝwZ\i+7M4+' 6 7J7tAcV3! abF$Lup!5ӭ4ՠn es=>zZ$g?./}<9YS8RGJRpVܩ-M/)=PXT<_1CWMr!lqy[KIE 1A fzY-3W‘W]d7ۑRVͿ h(Tb 69|yfʖ V&%a&'Jt^c N@JXJԎ0yof6>0S'_!à-c0_cFˮ ¶ 2.5 XjS%-X%ԑ0ꀣÝz]m?^8%g*@̶2)x+[V,$p59'>qdI@%˟x/Ⱥ)e9RJ)sRCbN+$ %\w7[:·mwhMNl'bIг܂:m֐kuF]i.w/_ߞo]e3 p ؂_.b,&kWLZSϯ_nlvӓ~K@LTKT]PRV }xuc&G%+v6FQIUVPqyV<<>~z';;0v..Vf&fv6VfV`A痏RQJEME&X@w2(9XW.wLrjɲ&(A[հxUe||RZ*)b< D.N`Q+,'ۤ ԳQxɗ<~}i]`b'lg54`g|}ƉOOE.FB XKl ɻuVGDTT`}yBXvRbgW1P燔vx4v  _vM{Dun` `C73\&vU+_R^;LJן_]>[DLk~5+RigvYJQˏ[̎ZN32;?߿???ٝ;?>|sbҒڞR?>~x!*h/|&xwoJDX̎[cƒ+_ X'*fZ+k”WCּs Ý _=l>$ٹ#WTOGOGp[`0W'=?Ǡw\"zi+'Z{7Μ r7/_ZAˋfeTxoW@Ps&on?MM(WT ֥y E 6!ßon7?ҿ?>zr[ Ƿ7?y򆘦<^\۽bꅅ Wuov>ZBݩ>SV'_]:2@W_?6Zd~|t󯰲S_:w5w~O_7;GL7H^츹kfamo>xtv!޳+O=`F`]7^\9xɉ-o8ee~¯oo iWԿ=4!MU3A~1?@KOa}`~H/7737?>o(2A_?{u'>7 `==Wpi}dϧ'v.Ⱦ2Y^<ӇXyy~~{'6~u+h ë >q^!eV w2{*wξ ?pf/+po?>+a%,-G!xs{ UziN:Lȉj?bFbFZ`X!C_5 lfUHv#H{ y*ϊa-Xc \|(:mJ[}pwwK\ӻ^7#`@jE f{&0HaOeR^b:"8r G#Rτ%P>-Z[XhWCC VAGL[X _DGY36ؘs`AX@z?6e_4B+LI=88hY X"=G1"978H3X˄ ۦ { nfh !l8t~C)yyޞoՙoo-Hu,k-Te5ʈfFK\{Hpehu?" GDÆGZK'h?D⡕B>,,7ug'H= `ı} /Q@60,lk1'!l"F?M!H \2nha?h"?͈+#Ă'?[BX?Z'$V} e@)ii@:TZVJ@, \͌o'zM[{@D}3<bhT``4Ӥ(IENDB` cREVGeneralscriptChecksum`}^.e bookmarks revUniqueID 1118333234592 handlerList mouseDownscriptSelection char 13 to 12 prevHandler tempScriptscript

on mouseDown

revGoUrl "http://www.sosmartsoftware.com"

end mouseDown

Tabs}on menuPick pNew,pOld hide grp pOld show grp pNew if the menuhistory of me = 2 then select text of fld "Url1" else if the menuhistory of me = 3 then select text of fld "Url2" unlock screen with visual effect dissolve very fast end menuPick General Load URL Get URL cREVGeneralscriptChecksumd zq[1=,˻ bookmarks revUniqueID 1120918553789 handlerListmenuPickscriptSelectionchar 238 to 237 prevHandlermenuPick tempScriptscript

on menuPick pNew,pOld

hide grp pOld

show grp pNew

if the menuhistory of me = 2 then select text of fld "Url1"

else if the menuhistory of me = 3 then select text of fld "Url2"

unlock screen with visual effect dissolve very fast

end menuPick

 Load URL a(6 cREVGeneral revUniqueID 1120920379612 Url1)`,f cREVGeneral revUniqueID 1118327321787  http://www.runrev.com Load UrlEp## LOAD URL METHOD SCRIPT ---------------------------------------- on mouseUp local tUrl,tFldName ----- put fld "Url1" into tUrl -- the url we want to load if tUrl = empty or not IsAValidUrl(tUrl) then answer error "The url does not seem a valid url." with "Sorry" -- -- see the IsAValidUrl function below else put the short name of fld 2 into tFldName -- the field which displays information when downloading LoadUrlWithMessage tUrl,tFldName -- -- see below end if end mouseUp ---------------------------------------- function IsAValidUrl pUrl return matchText(pUrl,"^((ht|f)tp(s?))\://([0-9a-zA-Z" \ & "\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(/\S*)?$") -- regex expression which return true or false end IsAValidUrl ---------------------------------------- on LoadUrlWithMessage pUrl,pFldName -- 2 parameters: the url and the short name of the field which displays information set the uCancelMessage of this stack to false -- this custom property is used to trigger when the user clicks on the Cancel button unload url pUrl -- cleanup for demo: you will not use this line in real scripts load url pUrl -- main command ShowInfo pUrl,pFldName -- -- ShowInfo (see below) is a pending message which monitors download status every 10 milliseconds end LoadUrlWithMessage ---------------------------------------- on ShowInfo pUrl,pFldName local tStatus,tResult ----- put URLStatus(pUrl) into tStatus -- see the URLStatus function in the docs switch case the uCancelMessage of this stack -- means the uCancelMessage of this stack = true set the thumbPos of sb "Progress" to 0 put "Download canceled" into fld pFldName disable btn "Cancel" unload url pUrl -- cleanup: the user canceled then you clear the cache exit to top case word 1 of tStatus = "queued" set the thumbPos of sb "Progress" to 0 put "Queued to" && UrlDomain(pUrl) into fld pFldName -- see this function below break case word 1 of tStatus = "contacted" case word 1 of tStatus = "requested" set the thumbPos of sb "Progress" to 0 put "Contacting" && UrlDomain(pUrl) into fld pFldName -- see this function below enable btn "Cancel" break case word 1 of tStatus = "error" set the thumbPos of sb "Progress" to 0 put "Sorry: invalid URL or no connection" into fld pFldName disable btn "Cancel" exit to top case tStatus = empty set the thumbPos of sb "Progress" to 0 put "Sorry: invalid URL" into fld pFldName disable btn "Cancel" exit to top case word 1 of tStatus = "timeout" set the thumbPos of sb "Progress" to 0 put "Sorry: time out" into fld pFldName disable btn "Cancel" exit to top case word 1 of tStatus = "cached" set the thumbPos of sb "Progress" to the endValue of sb "Progress" put "Download complete" into fld pFldName disable btn "Cancel" DisplayData pUrl -- -- see this handler below exit ShowInfo case item 1 of tStatus = "loading" if the number of items of tStatus > 2 then -- last item of urlStatus (total bytes to download) can be empty set the endValue of sb "Progress" to item -1 of tStatus set the thumbPos of sb "Progress" to item -2 of tStatus end if put "Downloading" && UrlFile(pUrl) into fld pFldName -- see this function below break end switch send "ShowInfo" && pUrl & comma & pFldName to me in 10 milliseconds -- message sent every 10 milliseconds end ShowInfo ---------------------------------------- on DisplayData pUrl switch UrlExtension(pUrl,1) -- : see this function below case "gz" switch UrlExtension(pUrl,2) -- case "rev" -- compressed rev stack case "mc" -- compressed metacard stack go decompress(url pUrl) break default -- other compressed file type answer info "File not supported." with "Sorry" as sheet end switch break case "rev" -- compressed rev stack case "mc" -- metacard stack go url pUrl break default -- assumes it's html set the htmlText of fld "Display" of stack "LCDisplay" to url pUrl -- LCDisplay is a substack set the label of stack "LCDisplay" to pUrl -- for demo purposes put the result into tResult -- error management if tResult <> empty then close stack "LCDisplay" -- LCDisplay is a substack answer error "Error:" && tResult as sheet else modeless stack "LCDisplay" -- LCDisplay is a substack end if end switch end DisplayData ---------------------------------------- function UrlExtension pUrl,pItem set the itemDel to "." return item - pItem of pUrl end UrlExtension ---------------------------------------- function UrlDomain pUrl -- additional cosmetic function :-) set the itemDel to slash return item 3 of pUrl end UrlDomain ---------------------------------------- function UrlFile pUrl -- additional cosmetic function :-) set the itemDel to slash return item -1 of pUrl end UrlFile R;Click here to load and display the currently specified url cREVGeneral scriptChecksumYwX`&GaZR breakPoints handlerListZmouseUp IsAValidUrl LoadUrlWithMessage ShowInfo DisplayData UrlExtension UrlDomain UrlFilescriptSelection char 29 to 28 revUniqueID 1118327373933 bookmarks tempScript prevHandlerShowInfoscript2

## LOAD URL METHOD SCRIPT

----------------------------------------

on mouseUp

local tUrl,tFldName

-----

put fld "Url1" into tUrl -- the url we want to load

if tUrl = empty or not IsAValidUrl(tUrl) then

answer error "The url does not seem a valid url." with "Sorry" -- 

-- see the IsAValidUrl function below

else

put the short name of fld 2 into tFldName

-- the field which displays information when downloading

LoadUrlWithMessage tUrl,tFldName -- 

-- see below

end if

end mouseUp

----------------------------------------

function IsAValidUrl pUrl

return matchText(pUrl,"^((ht|f)tp(s?))\://([0-9a-zA-Z" \

& "\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(/\S*)?$")

-- regex expression which return true or false

end IsAValidUrl

----------------------------------------

on LoadUrlWithMessage pUrl,pFldName

-- 2 parameters: the url and the short name of the field which displays information

set the uCancelMessage of this stack to false

-- this custom property is used to trigger when the user clicks on the Cancel button

unload url pUrl -- cleanup for demo: you will not use this line in real scripts

load url pUrl -- main command

ShowInfo pUrl,pFldName -- 

-- ShowInfo (see below) is a pending message which monitors download status every 10 milliseconds

end LoadUrlWithMessage

----------------------------------------

on ShowInfo pUrl,pFldName

local tStatus,tResult

-----

put URLStatus(pUrl) into tStatus -- see the URLStatus function in the docs

switch

case the uCancelMessage of this stack -- means the uCancelMessage of this stack = true

set the thumbPos of sb "Progress" to 0

put "Download canceled" into fld pFldName

disable btn "Cancel"

unload url pUrl -- cleanup: the user canceled then you clear the cache

exit to top

case word 1 of tStatus = "queued"

set the thumbPos of sb "Progress" to 0

put "Queued to" && UrlDomain(pUrl) into fld pFldName -- see this function below

break

case word 1 of tStatus = "contacted"

case word 1 of tStatus = "requested"

set the thumbPos of sb "Progress" to 0

put "Contacting" && UrlDomain(pUrl) into fld pFldName -- see this function below

enable btn "Cancel"

break

case word 1 of tStatus = "error"

set the thumbPos of sb "Progress" to 0

put "Sorry: invalid URL or no connection" into fld pFldName

disable btn "Cancel"

exit to top

case tStatus = empty

set the thumbPos of sb "Progress" to 0

put "Sorry: invalid URL" into fld pFldName

disable btn "Cancel"

exit to top

case word 1 of tStatus = "timeout"

set the thumbPos of sb "Progress" to 0

put "Sorry: time out" into fld pFldName

disable btn "Cancel"

exit to top

case word 1 of tStatus = "cached"

set the thumbPos of sb "Progress" to the endValue of sb "Progress"

put "Download complete" into fld pFldName

disable btn "Cancel"

DisplayData pUrl -- 

-- see this handler below

exit ShowInfo

case item 1 of tStatus = "loading"

if the number of items of tStatus > 2 then

-- last item of urlStatus (total bytes to download) can be empty

set the endValue of sb "Progress" to item -1 of tStatus

set the thumbPos of sb "Progress" to item -2 of tStatus

end if

put "Downloading" && UrlFile(pUrl) into fld pFldName -- see this function below

break

end switch

send "ShowInfo" && pUrl & comma & pFldName to me in 10 milliseconds

-- message sent every 10 milliseconds

end ShowInfo

----------------------------------------

on DisplayData pUrl

switch UrlExtension(pUrl,1) --  : see this function below

case "gz"

switch UrlExtension(pUrl,2) -- 

case "rev" -- compressed rev stack

case "mc" -- compressed metacard stack

go decompress(url pUrl)

break

default -- other compressed file type

answer info "File not supported." with "Sorry" as sheet

end switch

break

case "rev" -- compressed rev stack

case "mc" -- metacard stack

go url pUrl

break

default -- assumes it's html

set the htmlText of fld "Display" of stack "LCDisplay" to url pUrl

-- LCDisplay is a substack

set the label of stack "LCDisplay" to pUrl -- for demo purposes

put the result into tResult

-- error management

if tResult <> empty then

close stack "LCDisplay"

-- LCDisplay is a substack

answer error "Error:" && tResult as sheet

else

modeless stack "LCDisplay"

-- LCDisplay is a substack

end if

end switch

end DisplayData

----------------------------------------

function UrlExtension pUrl,pItem

set the itemDel to "."

return item - pItem of pUrl

end UrlExtension

----------------------------------------

function UrlDomain pUrl

-- additional cosmetic function :-)

set the itemDel to slash

return item 3 of pUrl

end UrlDomain

----------------------------------------

function UrlFile pUrl

-- additional cosmetic function :-)

set the itemDel to slash

return item -1 of pUrl

end UrlFile

 Progressia3 7P73860 cREVGeneral revUniqueID 1118328265702CancelEpGon mouseUp set the uCancelMessage of this stack to true end mouseUp fR cREVGeneralscriptChecksumI3RHyc" bookmarks revUniqueID 1118328890823 handlerListmouseUpscriptSelection char 1 to 69 prevHandlermouseUp tempScriptscript

on mouseUp

set the uCancelMessage of this stack to true

end mouseUp

 UserInfo@, cREVGeneral revUniqueID 1118328937685   Load URL)`@,/ cREVGeneralscriptChecksumُ B~ revUniqueID 1120920330455 bookmarks handlerList tempScript prevHandlerscriptSelection char 1 to 0script

 Load URL Method  5This second section explores the following features: @4 $ Advantages of the Load Url method @1600   !  Disadvantages @1600     Refering to an Url @1600     The Loadcommand @1600    ) Monitoringthe load command by oneself @1600   & 5 Allowing the user to cancel a download in progress @1600   2  Using the libURL commands @1600    0 Displaying the contents of the downloaded Url @1600   -  Clearing the cache @1600    " Vocabulary used in this section @1600     glossary/command.xml  #Advantages of the Load Url method: " The load command is non-blocking, so it does not stop the current handler or the user actions while the download is completed. @1600   glossary/command.xml   glossary/nondashblocking.xml "" glossary/handler.xmlD K glossary/download.xmlj r >In fact the load command downloads the URL in the background. dictionary/load_command.xml   glossary/command.xml  dictionary/URL_keyword.xml' * j In addition, this method allows to monitor the download by checking the URLStatus function (see below). @1600  H "dictionary/URLStatus_function.xmlJ S *dictionary/function_control_structure.xmlT IThen the process is much more reliable than by using the get URL method. *dictionary/function_control_structure.xmlH *dictionary/function_control_structure.xml Disadvantages *dictionary/function_control_structure.xml *dictionary/function_control_structure.xml T To take all advantages of download monitoring a lot of scripting is necessary :-) @1600  *dictionary/function_control_structure.xmlQ Refering to an url  When your scripts refer to any url, the engine fisrt has a look to the contents of the cachedUrls (the urls that have been downloaded and copied to the cache using the load command). The cachedUrls function returns all cached urls, one per line. @1600  { glossary/download.xml}  glossary/cache.xml dictionary/load_command.xml  glossary/command.xmlH If the url is already cached, Rev uses it otherwise Rev downloads it. (see Displayingthe contents of the downloaded Url below). @1600 G H M- z glossary/command.xml glossary/command.xml The Loadcommand glossary/command.xml glossary/command.xml 6See the docs for a complete overview of this command. glossary/command.xml5 #But here are some tips and tricks: glossary/command.xml" glossary/command.xml  The command allows to specify a call back message: it seems to be its strong point. But in fact, you will prefer to send a message repeatedly by yourself (a pending message) to check the download process since the callback message is only sent when download is completed: @1600 C D load url tUrl -- main command  @  @hh""  ShowInfo tUrl --  @hh"" B -- ShowInfo is a pending message which monitors download status  @hh""?  -- see below @hh"" 'Monitoringthe load command by oneself glossary/command.xml& And there is a built-in function named UrlStatus (see in the docs), which is much more efficient than the callback message you can send with the load command. MHere are listed all the different status returned by the urlStatus function: on ShowInfo pUrl @   local tStatus  @   -----  @hh"" # put URLStatus(pUrl) into tStatus  @  @  switch  @ $ case word 1 of tStatus = "queued"  @   break  @ ' case word 1 of tStatus = "contacted"  @   break  @ ' case word 1 of tStatus = "requested"  @   break  @ % case item 1 of tStatus = "loading"  @   break  @ # case word 1 of tStatus = "error"  @   break  @  case tStatus = empty  @   break  @ % case word 1 of tStatus = "timeout"  @   break  @ ; case word 1 of tStatus = "cached" -- the job is done :-)  @  @hh""$  end switch  @  @  -----  @hh"" 3 send "ShowInfo" && pUrl to me in 10 milliseconds  @  @  @& 4 -- the message will be sent every 10 milliseconds  @hh""1 end ShowInfo @  Note that a switch structure is used here to check the first word returned by the UrlStatus function (it's more "confortable" than a "if/then/else" conditional structure in this case :-) @1600   Note also that the UrlStatus function returns other information (not taken in account here): mainly the bites which are yet dowlaoded and the total bytes to download (params 2 and 3). @1600   DThere are used in the example script to set the scrollbar progress. C  f The time delay used is up to you - I propose 10 milliseconds - but for very fast downloads (light files with a broadband connection) you could miss the download ending with longer delays... Advanced users might prefer to send a callback message which will override the pending message (I will not detail this process here since it's complicated enough :-) @1600 D E 3Allowing the user to cancel a download in progress 2 \ As the load process is non-blocking, you can provide a Cancel button the user can click. @1600  Y { The method uses a custom property the status of which is checked each time the download status is monitored (see above). @1600  x X Here, we use a stack custom property named uCancelMessage which can be true or false. @1600 ; < C At the beginning of the download, this property is set to false: @1600 A $on LoadUrlWithMessage pUrl,pFldName @ ! 0 set the uCancelMessage of this stack to false  @ *  load url pUrl  @   ShowInfo pUrl,pFldName end LoadUrlWithMessage @  3 In the script of the Cancel button, you'll find: @1600 1  on mouseUp @  / set the uCancelMessage of this stack to true  @ ( end mouseUp @   < And in the handler that monitors permanently the dowload: @1600 :  on ShowInfo pUrl,pFldName @   local tStatus,tResult  @   -----  @hh"" # put URLStatus(pUrl) into tStatus  @  @  switch  @ ( case the uCancelMessage of this stack  @   @hh""' 5 -- means the uCancelMessage of this stack = true @hh""4 + set the thumbPos of sb "Progress" to 0  @  @   . put "Download canceled" into fld pFldName  @ &  disable btn "Cancel"  @  unload url pUrl  @  exit to top  @  @   ...   Note that the url in unloaded, some cleanup is made and and then exit to top: the ShowInfo message will not longer be sent. The process has been canceled. A A LN   Using the libURL commands   XlibUrl, the internet library of Revolution provides a command which do the job as well.  Q If it's easier to understand the job with a complete scripted method as above, you will not have to send a pending message by yourself when using the handlers* provided by the Revolution team :-) * libUrl is a set of Transcript handlers and functions: to see this internet library, select the back scripts pane in the message box and double-click on the "button revLibURL" line to open its script.   load url pURL  @  7 libURLSetStatusCallback "ShowInfo",the long ID of me / -- replace the previous "ShowInfo pUrl" line @hh"". 3Ans the ShowInfo handler will be a bit simplified: on ShowInfo pUrl,pStatus @  switch  @ $ case word 1 of pStatus = "queued"  @   break  @ ' case word 1 of pStatus = "contacted"  @   break  @ ' case word 1 of pStatus = "requested"  @   break  @ % case item 1 of pStatus = "loading"  @   break  @ # case word 1 of pStatus = "error"  @   break  @  case pStatus = empty  @   break  @ % case word 1 of pStatus = "timeout"  @   break  @ ; case word 1 of pStatus = "cached" -- the job is done :-)  @  @hh""$  end switch  @  @ end ShowInfo @  Note that the Rev built-in handler takes care of sending the message repeatedly and passes automatically 2 parameters: the Url and the result of UrlStatus function. :See libURLSetStatusCallback in the docs for more details. .Displaying the contents of the downloaded Url - gGeneral considerations (valid for both methods) about this feature are at the end of the General pane. f  As the engine fisrt has a look to the contents of the cachedUrls, you can use the same formulation as the one you used for download:   As Rev will find the url you request in the cachedUrls, it will not attempt to download then another time but will use the data stored in the cache. on DisplayData pUrl @  9 switch UrlExtension(pUrl,1) -- see this function below  @ @ @hh"" case "gz" @ @  % switch UrlExtension(pUrl,2) --  @ @ @hh""  ' case "rev" -- compressed rev stack @hh"" @ @  @hh"" + case "mc" -- compressed metacard stack @  @hh""  go decompress(url pUrl)  @ @ @  @ break @ * default -- other compressed file type @ @hh""  > answer info "File not supported." with "Sorry" as sheet @hh"" @  @( -  end switch @ @hh"" @ break  @ % case "rev" -- compressed rev stack @ @  @hh""   case "mc" -- metacard stack  @  @hh""   go url pUrl  @ @  break  @  default -- assumes it's html @ @ @hh""  G set the htmlText of fld "Display" of stack "LCDisplay" to url pUrl @  @  @  2  -- LCDisplay is a substack  @hh"" DarkOrchid4 put the result into tResult @blue  @ darkorange    -- error management @  @hh""  if tResult <> empty then @  @  close stack "LCDisplay" @ @  ! -- LCDisplay is a substack  @hh"" DarkOrchid4 0 answer error "Error:" && tResult as sheet @blue  @blue* else @ @ ! modeless stack "LCDisplay" @ @blue @  ! -- LCDisplay is a substack  @hh"" DarkOrchid4 end if  @  @ end switch @ @ @ end DisplayData @  )---------------------------------------- @hh""( !function UrlExtension pUrl,pItem @  @ ( -- function used by the above handler  @hh"" DarkOrchid4%  set the itemDel to "."  @  @    return item - pItem of pUrl  @  end UrlExtension @  Note that the version above is a simplified one which takes only into account Revolution or MetaCatd stacks (compressed or not), rejects other compressed files and displays all others as HTML in a substack field.  `To display another kinds of data (images for instance) you will have to write a proper handler. _ Clearing the cache  When you have finished with an url which has been cached, it's a good idea to clear it since loaded urls can take up a lot of memory... .To unload an Url, you use the unload command: unload URL @blue  And to make a complete cleanup: on UnloadAllUrls @brown  local tUrl  ----- @hh"" DarkOrchid4 . repeat for each line tUrl in the cachedURLs  @brown  @brown   @ darkorange#  unload URL tUrl  @blue end repeat  @brown  @brown end UnloadAllUrls @brown  Vocabulary used in this section  PYou might be interested in checking the following entries in the Documentation:  URL keyword @1600    Load and Unload commands @1600   URLStatus function @1600   " libURLSetStatusCallback command @1600    `-i(D cREVGeneral revUniqueID 1120920424547 Show ScriptEp8on mouseUp edit script of btn "Load Url" end mouseUp d cREVGeneral scriptChecksum ݫX handlerListmouseUp breakPointsscriptSelection char 42 to 41 bookmarks revUniqueID 1120920585665 prevHandlerLoadUrl tempScriptscript=

on mouseUp

edit script of btn "Load Url"

end mouseUp

 Option Menu u8on menuPick pItem put pItem into fld 1 end menuPick ,HGChoose an url example in this menu or type your own in the field belowhttp://www.runrev.comhttp://www.runrev.com http://www.google.com/ http://www.sosmartsoftware.com/?r=revolution_index&l=en http://www.sosmartsoftware.com/downloads/AnswerPatch26.rev cREVGeneralscriptChecksumR}b$ revUniqueID 1120974866267 bookmarks handlerListmenuPick tempScript prevHandlerscriptSelection char 41 to 40script

on menuPick pItem

put pItem into fld 1

end menuPick

Generali(D cREVGeneral revUniqueID 1120920450292 General)`@,H cREVGeneralscriptChecksumُ B~ revUniqueID 1120920444330 bookmarks handlerList tempScript prevHandler linkClickedscriptSelection char 1 to 0script

 #How-To Stack #018 by Eric Chatonet @" @ 7/12/05 Initial release @ 37/23/05 Added libURLSetStatusCallback description @ @ # 712/3/05 Added explanations about canceling a download  @/ ) in progress with the Load URL method. @ @% @ oThis stack shows how to retrieve data from the internet and discuss 2 different methods: load url and get url. @n CNote that this tutorial does not explore any method using sockets. @B Enjoy! @ @ 4This first section explores the following features: @3 @ < Why would you choose to use Load Url rather than Get Url? @1600   9 ( Checking the user internet connection @1600   %  Checking an url validity @1600    $ Displaying the contents of an url @1600   ! " Vocabulary used in this section @1600    @ @ :Why would you choose to use Load Url rather than Get Url? 9  ]Advantages and disadvantages of both methods are discussed further in their repective panes. \ sBut keep in mind first that you might prefer to use Load Url method for long downloads anf Get Url for short ones: r This means that to download a web page (usually from 1 to 10 KB) you might prefer the Get Url method but for downloading a 500 KB file, the Load Url seems preferable.  5Of course, this depends on the connection speed too. 4   &Checking the user internet connection % j Before downloading any data from the web, the first thing to do is to check if the user is connected:-) @1600  g As Rev does not provide any function to check this, the easiest way to achieve it is to try to download a well known url like http://www.google.com/ or an url from your own web server. @1600   ~There are other methods that don't rely that specific web sites are on line but they appear less reliable in practical terms. } 7You can use a very simple function like the following: function IsInternetConnected @blue  / return url "http://www.google.com/" <> empty  @blue & end IsInternetConnected @brown  The function will return the html source of the page or empty if there is no connection *to the specified page*. It's the reason why you will prefer to use a very reliable url the contents of which is light in order to be fast... @1600   0  EAnd you will use a conditional structure to check user's connection: if IsInternetConnected() then @brown  @brown  else @brown  end if @brown  @brown  AYou will find such a function in the script of the button below. Another way you can use if you have a web-site is to upload a simple text file which will contain the single word "true" and check the corresponding url: function IsInternetConnected @blue  return url  @blue  end IsInternetConnected @brown  This last method provides another interesting information if you have to download files from your web-site: it's really your server which is tested :-) Checking an url validity  If the user may specify an url, it appears better to check if it is a valid one before attempting to download its contents :-) @1600 G H8 {In order to check any internet url validity, the best way is to use a regular expression in a function like the following: function IsAValidUrl pUrl @  ; return matchText(pUrl,"^((ht|f)tp(s?))\://([0-9a-zA-Z" \  @  @ @% 7 0 & "\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(/\S*)?$") end IsAValidUrl @  MatchText Rev built-in function returns true or false according to the regular expression evaluation. This one identifies correct ftp, http and https urls. else @brown  end if @brown  @brown  TSee the scripts in the other sections of this tutorial where this function is used. "Displaying the contents of an url ! @ An url can point a web page or a file (sometimes compressed). @1600 > In order to know what kind of data you are downloading, the easiest way is to check which extension is used at the end of the url: @1600 = >F - .rev: a stack. - .jpg: a JPEG image etc. .gz extension means a compressed file; Then you will have to check the last but one extension to know the file type and, of course, begin with decompressing the file. @1600   With the .zip extension, most platforms automatically identify it, download the file and decompress it in the folder the user specified as his default folder for downloads. @1600   As it's very difficult to check if the url is pointing a simple web page, the best way is to check the file(s) type(s) you are interested in and consider others as web pages. @1600 E Fj The method used for displaying retrieved data depends on the one you used to get them. So you will find a specific DisplayData handler for each method in the next panes. s s ~+ Well... VIf you swallowed all this, you are ready to go to the other panes without any pain... Vocabulary used in this section  PYou might be interested in checking the following entries in the Documentation:  URL keyword @1600    MatchText function @1600   P Regular Expressions Syntax Reference in the Help/Quick Reference Guides menu. @1600 8 9  `ICheck Internet ConnectionEp;on mouseUp if IsInternetConnected() then answer info "You are connected to the internet." as sheet else answer error "You are not connected to the internet." as sheet end mouseUp ------------------------------ function IsInternetConnected return url "http://www.google.com/" <> empty end IsInternetConnected 4Click here to check your internet connection status cREVGeneral scriptChecksum$1re? handlerListmouseUp IsInternetConnected breakPointsscriptSelectionchar 314 to 313 bookmarks revUniqueID 1120970996883 prevHandlerLoadUrl tempScript

on mouseUp

if IsInternetConnected() then answer info "You are connected to the internet." as sheet

else answer error "You are not connected to the internet." as sheet

end mouseUp

------------------------------

function IsInternetConnected

return url "http://www.google.com/" <> empty

end IsInternetConnected

script

on mouseUp

if IsInternetConnected() then answer info "You are connected to the internet." as sheet

else answer error "You are not connected to the internet." as sheet

end mouseUp

------------------------------

function IsInternetConnected

return url "http://www.google.com/" <> empty

end IsInternetConnected

@ Flche2.png PNG  IHDR Kpl_ pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?,Xv$ϯ.?~~e'P#@11 @?~23_k_?V@p /÷>|()%ţ,%-F2\@ *n w JU牓/_ o_ū(II` b`AM]Nk5 _ ,?d+@021~K?@fӬ ~W XXY};w<||| ߿}Kw^W@koǑ74;Gڷo_߿uLL7qe`&Fqϟ_sPuFFfbA8`(10r=zk~ TxNP`=l|,IENDB` cREVGeneral revUniqueID 1120971869846 Print...EpXon mouseUp revPrintField the name of field (the hilitedText of btn tabs) end mouseUp v3R*Click here to print current pane contents cREVGeometry Master,expectedRect320,586,420,609Master,scalebottomDistanceMaster,movevDistance-26Master,moveVObjectSidebottomMaster,movehDistancefalseMastertrueMaster,scalerightDistanceMaster,moveVObjectRefcardMaster,moveVAbsolutetrueMaster,cardRanking1 Master,moveVtrueMaster,scaleleftDistanceMaster,scaletopDistance cREVGeneralscriptChecksum] 5Xt+( bookmarks revUniqueID 1115824545996 handlerListmouseUpscriptSelection char 91 to 90 prevHandlermouseUp tempScriptscript

on mouseUp

revPrintField the name of field (the hilitedText of btn tabs)

end mouseUp

 Get URL a(6 cREVGeneral revUniqueID 1121000236414  Url2)`,f cREVGeneral revUniqueID 1121000236415  http://www.runrev.com Get URLEp## GET URL METHOD SCRIPT ---------------------------------------- on mouseUp local tUrl,tFldName ----- put fld "url2" into tUrl -- the url we want to load if tUrl = empty or not IsAValidUrl(tUrl) then answer error "The url does not seem a valid url." with "Sorry" -- -- see the IsAValidUrl function below else set the cursor to watch put "Downloading" into fld "UserInfo2" -- information when downloading put url tUrl into tPage if " empty then close stack "LCDisplay" -- LCDisplay is a substack answer error "Error:" && tResult as sheet else modeless stack "LCDisplay" -- LCDisplay is a substack end if end switch end DisplayData ---------------------------------------- function UrlExtension pUrl,pItem set the itemDel to "." return item - pItem of pUrl end UrlExtension R:Click here to get and display the currently specified url cREVGeneral scriptChecksumf[<[1RLL= handlerListMmouseUp IsAValidUrl BuildHTMLFromFrames ExtractLinks DisplayData UrlExtension breakPointsscriptSelectionchar 2947 to 2946 bookmarks revUniqueID 1121000236416 prevHandler DisplayData tempScriptscript*}

## GET URL METHOD SCRIPT

----------------------------------------

on mouseUp

local tUrl,tFldName

-----

put fld "url2" into tUrl -- the url we want to load

if tUrl = empty or not IsAValidUrl(tUrl) then

answer error "The url does not seem a valid url." with "Sorry" -- 

-- see the IsAValidUrl function below

else

set the cursor to watch

put "Downloading" into fld "UserInfo2"

-- information when downloading

put url tUrl into tPage

if "<frameset" is in tPage then

put BuildHTMLFromFrames(tPage) into tPage -- 

-- then put the right html text into the variable

-- see this function below

end if

-----

put "Download complete" into fld "UserInfo2"

DisplayData tUrl,tPage -- 

-- see this handler below

end if

end mouseUp

----------------------------------------

function IsAValidUrl pUrl

return matchText(pUrl,"^((ht|f)tp(s?))\://([0-9a-zA-Z" \

& "\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(/\S*)?$")

-- regex expression which return true or false

end IsAValidUrl

----------------------------------------

function BuildHTMLFromFrames pUrl

local tPage,tPageLinks,tUrl,tText,tUrlSource

-----

set the itemDel to slash

put url pUrl into tPage

put ExtractLinks(tPage) into tPageLinks -- 

-- see this function below

-----

repeat for each line tUrl in tPageLinks

if "http" is in tUrl then

-- absolute path

put url tUrl & cr after tText

else

-- relative path converted to absolute path

put pUrl into tUrlSource

put tUrl into last item of tUrlSource

put url tUrlSource & cr after tText

end if

end repeat

-----

return char 1 to -2 of tText

end BuildHTMLFromFrames

---------------------------------

function ExtractLinks pSource

local tLine,tItem,tUrlList

-----

-- Ken Ray provided a regex to do this but it appeared 2 times slower and not as well reliable :-)

-- so I prefered to keep the following one I have wrotten

set the itemDel to numToChar(29)

-- arbitrary but reliable item delimiter: can't be typed by the user

repeat for each line tLine in pSource

if (".htm" is in tLine) or ("http:" is in tLine) or ("https:" is in tLine) then

-- here are some urls

replace quote with numToChar(29) in tLine

repeat for each item tItem in tLine

if ((".htm" is in tItem) or ("http:" is in tItem) or \

("https:" is in tLine)) and not (("microsoft" is in tItem) \

or ("netscape" is in tItem) or ("apple" is in tItem)) \

then put tItem & cr after tUrlList

end repeat

end if

end repeat

return char 1 to -2 of tUrlList

end ExtractLinks

----------------------------------------

on DisplayData pUrl,pData

switch UrlExtension(pUrl,1) --  see this function below

case "gz"

switch UrlExtension(pUrl,2) -- 

case "rev" -- compressed rev stack

case "mc" -- compressed metacard stack

go decompress(pData)

break

default -- other compressed file type

answer info "File not supported." with "Sorry" as sheet

end switch

break

case "rev" -- compressed rev stack

case "mc" -- metacard stack

go stack pData

break

default -- assumes it's html

set the htmlText of fld "Display" of stack "LCDisplay" to pData

-- LCDisplay is a substack

set the label of stack "LCDisplay" to pUrl -- for demo purposes

put the result into tResult

-- error management

if tResult <> empty then

close stack "LCDisplay"

-- LCDisplay is a substack

answer error "Error:" && tResult as sheet

else

modeless stack "LCDisplay"

-- LCDisplay is a substack

end if

end switch

end DisplayData

----------------------------------------

function UrlExtension pUrl,pItem

set the itemDel to "."

return item - pItem of pUrl

end UrlExtension

Get URL)`@,/ cREVGeneral revUniqueID 1121000236420  Get URL Method  4This third section explores the following features: @3 # Advantages of the Get Url method @1600     Disadvantages @1600     The Get Url command @1600     Parsing framed pages @1600     Displaying Url contents @1600    " Vocabulary used in this section @1600      !Advantages of the Get Url method  Quick scripting. This method is enough to retrieve the HTML text from a web page but, from a ergonomic point of view, might appear a bit light for downloading large files or usual downloads without a broadband connection. @1600 B C *dictionary/function_control_structure.xml *dictionary/function_control_structure.xml Disadvantages *dictionary/function_control_structure.xml *dictionary/function_control_structure.xml The get Url command is blocking, so it stops the current handler or the user actions while the download is completed. With a broadband connection and for most of web pages, it's not a real problem. @1600   glossary/command.xml  glossary/nondashblocking.xml ! glossary/handler.xml; B glossary/download.xmla i^ h By way of consequence you are unable to follow download steps and to indicate these ones to the user. @1600 ? @' S Mastering the process is less reliable but can appear sufficient for most cases. @1600 F G The Get url command  F In fact what I call the Get Url method can be used in various ways: @1600 D get url @blue  @black  $-- put the Url into the it variable @hh"" DarkOrchid4# #put url into @blue  %-- put the Url into another variable @hh"" DarkOrchid4$ go url @blue  @black C-- assumes that the url points at a stack and then open this stack @hh"" DarkOrchid4B Parsing framed pages  CIn fact framed pages are a problem whatever the method you choose. B But as the load method is often used for files and the get url method to retrieve web pages contents, I prefered to offer a solution to this problem within this section.  If you desire to get back the HTML text of a web page, it can happens that this page has been built with the old frames method. @1600   In such a case, the contents returned by the url will be erroneous since frames point at other urls which are the effective contents of the page.  A A framed page contains always tags indicating frames presence. @1600  > So you can write: put url ) into tPage @  3-- put the html text of a web page into a variable @hh""2 if " answer info "File not supported." with "Sorry" as sheet @hh"" @  @( - @8  end switch @ @hh"" @ break  @ % case "rev" -- compressed rev stack @ @  @hh""   case "mc" -- metacard stack  @  @hh""   go stack pData  @ @  break  @  default -- assumes it's html @ @ @hh""  D set the htmlText of fld "Display" of stack "LCDisplay" to pData @  @  @  /  -- LCDisplay is a substack  @hh"" D set the label of stack "LCDisplay" to pUrl -- for demo purposes @hh"" @  @   @hh""/ put the result into tResult @  @    -- error management @  @hh""  if tResult <> empty then @  @  close stack "LCDisplay" @ @  ! -- LCDisplay is a substack  @hh"" 0 answer error "Error:" && tResult as sheet @  @* else @ @ ! modeless stack "LCDisplay" @  ! -- LCDisplay is a substack  @hh"" end if  @  @ end switch @ @ @ end DisplayData @  )---------------------------------------- @hh""( !function UrlExtension pUrl,pItem @  @  set the itemDel to "."  @  @    return item - pItem of pUrl  @  end UrlExtension @  Vocabulary used in this section  PYou might be interested in checking the following entries in the Documentation:  URL keyword @1600    Get, Put and Go commands @1600   `-i(D cREVGeneral revUniqueID 1121000236421 Show ScriptEp7on mouseUp edit script of btn "Get Url" end mouseUp d cREVGeneral scriptChecksum5yGOQZ*~W>8 breakPoints handlerListmouseUpscriptSelection char 41 to 40 revUniqueID 1121000236422 bookmarks tempScript prevHandlerLoadUrlscript<

on mouseUp

edit script of btn "Get Url"

end mouseUp

 Option Menu uon menuPick pItem

put pItem into fld "Url2"

end menuPick

 UserInfo2@, cREVGeneral revUniqueID 1121071103439  PaypalepKon mouseUp revGoUrl UrlDecode(the uPaypalURL of this stack) end mouseUp ,3RCClick here to support development by making a donation with Paypal Donate... cREVGeometry Master,movevDistance-26Master,scalebottomDistanceMaster,expectedRect320,586,420,609Master,moveVObjectSidebottomMaster,movehDistancefalseMastertrueMaster,moveVObjectRefcardMaster,scalerightDistanceMaster,cardRanking1Master,moveVAbsolutetrue Master,moveVtrueMaster,scaletopDistanceMaster,scaleleftDistance cREVGeneralscriptChecksum:|vDm8  revUniqueID 1121071193478 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelection char 74 to 73script

on mouseUp

revGoUrl UrlDecode(the uPaypalURL of this stack)

end mouseUp

 LCDisplay3^LEihttp://www.runrev.com ULucida Grande WLucida Grande @ULucida Grande @WLucida Grande @WLucida Grande ULucida Grande ULucida Grande @ULucida Grande @ULucida Grande WLucida Grande ULucida GrandecREVGeometryCachestackID1005 @EicREVGeometryCacheIDs11209663532111004cREVGeometrycachetotal1order1120966353211  Display)`E[ cREVGeometryMaster,scaleBottomObjectSideBottomMaster,movehDistancefalseMastertrueMaster,scaleBottomObjectRefcardMaster,scaleBottomAbsolutetrueMaster,scaleBottomtrueMaster,movevDistancefalseMaster,scalebottomDistance-15Master,expectedRect 0,-1,400,385Master,scaleRightAbsolutetrueMaster,scaleRighttrueMaster,scalerightDistance0Master,scaleRightObjectSideRightMaster,scaleRightObjectRefcardMaster,cardRanking2Master,scaletopDistanceMaster,scaleleftDistance cREVGeneral revUniqueID 1120966353211  `4Y