#<X*f ]=GenevaӣӣLANDmac Aggregator preferences Enable the aggregator? <%radio.prefs.checkboxPref ("Check this box to enable the aggregator. If it's enabled, NewsRiver will automatically scan the feeds you're subscribed to each hour, adding new or changed items to the News page.", @aggregatorData.prefs.enabled)%> Remote access and security You can access NewsRiver through any Web browser whether it's running on the same computer as the OPML Editor, or over the Internet. The settings on this page allow you to secure remote access by requiring a username and password.

<%radio.prefs.checkboxPref ("Check this box to enable access to NewsRiver over the Internet. Leave it unchecked if you want to allow access only from the same computer that's running the OPML Editor.", @aggregatorData.newsRiver.security.allowRemoteViewing)%> <%radio.prefs.checkboxPref ("Check this box if you want to allow posting of forms over the Internet.", @aggregatorData.newsRiver.security.allowRemotePost)%> <%radio.prefs.checkboxPref ("Check this box to require user authentication when accessing NewsRiver over the Internet. If this box is checked, remote users will receive a username/password dialog box when they access your site from another computer. Enter the username and password below.", @aggregatorData.newsRiver.security.requireRemoteLogin)%>
<%radio.prefs.stringPref ("Username", @aggregatorData.prefs.security.username)%> <%if html.getpagetableaddress ()^.method != "POST" {system.temp.newsRiver.repeatedPassword = aggregatorData.prefs.security.password}; ""%> <%radio.prefs.stringPref ("Password", @system.temp.newsRiver.repeatedPassword, type:"password")%> <%radio.prefs.stringPref ("Repeat Password", @aggregatorData.prefs.security.password, type:"password")%> <%try {delete (@system.temp.newsRiver.repeatedPassword)}; ""%>

Note: If you enable access to your Web server over the Internet, the NewsRiver home page can be reached via its IP address, <%newsRiverSuite.getHomePageAddress ()%>, or via its domain name if it has one. When and how the aggregator runs If the aggregator is enabled it runs once per hour. The next preference says at what minute in each hour the scan will run. For example, if you enter 0, it will scan at the top of the hour; if you enter 59, it will scan at one minute before the top of the hour.

<%radio.prefs.numberPref ("Minute to scan", @aggregatorData.prefs.minuteToRead, upperbound:59)%>
The aggregator is multi-threaded. This means it can read read several feeds at the same time. The larger this number the quicker it will finish each scan, but it may make your machine slower while the scan is running. <%radio.prefs.numberPref ("Number of threads", @aggregatorData.prefs.maxThreads, lowerbound:1, upperbound:10)%> How many items? How many items do you want to display on the News page? The more items you ask for the longer it will take to display the page. If you subscribe to a lot of channels and have a fast computer, make the number large. If you don't find yourself scrolling to the bottom of the page very often, or if you find the News Aggregator page loads slowly, you can make it smaller.

<%radio.prefs.numberPref ("Number of items on the News page", @aggregatorData.newsRiver.ctStoriesOnNewsPage, upperbound:1000)%> Checkboxes on or off? <%radio.prefs.checkboxPref ("Check this box if you want the checkboxes next to each news item to be checked by default. This makes it easier to delete news items, only keeping those that you want to refer to later.", @aggregatorData.newsRiver.flNewsPageDeleteCheckboxesDefault)%> Podcasting NewsRiver has a podcasting client built-in, or a podcatcher. As it's scanning for changes, NewsRiver saves information about enclosures so it can download them later. This page allows you to determine when it downloads enclosures and where it stores them.

<%radio.prefs.checkboxPref ("Check this box to automatically download enclosures included in feeds you subscribe to. ", @aggregatorData.newsRiver.podcatcher.prefs.enabled)%>
<%radio.prefs.stringPref ("Save enclosures in this folder"-VOXXzMW~ER=4?`\$0˨0˨  linetext Subscriptionspathsubscriptions.wsffVR$//  linetext Preferencespath prefs.wsfVVQ$VFVF  linetext Lifehackerpath index.wsffVc$wB  ctbackups lastFeedUrl!http://scienceblogs.com/main/rss/x.xmlsg/rss.xml/recent.rss-VXXzMW~ER=4?4W( 4  60DtՀvj"lO index.wsf3FwW!  * 4@ O[ eq    -9 ?K T` fr {       0< GS ^j t     backgroundtbackup{ callbacksdecodeEntitiesP doScanNowS getDateStringY`getHomePageAddress\ getStringFimportDefaultSubscriptions importOpmlinit`menub menuCommandsnotesoldstuff/pagesDplaylist{ podcatcher ] readingList responderlstatusCenterMessageYtranslateToEntitiesfuntaintmupdateAfterScanqP updateCodeq updateToolz utilitiesviewLog viewNewsItemsOviewSubscriptionswsfMasterControl%1VGenevaSOXJ3)(* N downloadVGeneva|=V  Geneva * N* NzTLANDmac on download (url, folder) Changes 2/28/06; 5:08:26 AM by DW Created. Reads a special kind of RSS feed, one that doesn't change. It's got a bunch of podcasts or songs, download them all, and that's it. local (xmltext = tcp.httpreadurl (url)) xml.compile (xmltext, @xstruct) scratchpad.xstruct = xstruct local (adrrss = xml.getaddress (@xstruct, "rss")) local (adrchannel = xml.getaddress (adrrss, "channel")) for adr in adrchannel if nameof (adr^) contains "item" local (adrtitle = xml.getaddress (adr, "title")) local (adrenclosure = xml.getaddress (adr, "enclosure")) local (url = adrenclosure^.["/atts"].url) local (extension = string.nthfield (url, ".", string.countfields (url, "."))) local (fname = adrtitle^, maxsize = 32 - sizeof (extension) - 1) if sizeof (fname) > maxsize fname = string.mid (fname, 1, maxsize) local (f = folder + fname + "." + extension) file.surefilepath (f) if not file.exists (f) //don't download again local (content = tcp.httpreadurl (url)) file.writewholefile (f, content) bundle //test code local (folder =frontier.pathstring + "Carnival Cast" + file.getpathchar ()) file.surefilepath (folder + "xxx") file.openfolder (folder) download ("http://pod-serve.com/podcasts/feed/carnvial-cast", folder) WdatatablG)E)E createdTue, 28 Feb 2006 13:08:21 GMTWdatatablG)H)H createdTue, 28 Feb 2006 13:08:24 GMTWdatatablG)J)J createdTue, 28 Feb 2006 13:08:26 GMTWdatatablG)) createdTue, 28 Feb 2006 13:14:11 GMTWdatatablG)) createdTue, 28 Feb 2006 13:14:43 GMTWdatatablG)) createdTue, 28 Feb 2006 13:14:50 GMTWdatatablG)) createdTue, 28 Feb 2006 13:15:13 GMTWdatatablG)) createdTue, 28 Feb 2006 13:15:34 GMTWdatatablG)) createdTue, 28 Feb 2006 13:15:47 GMTWdatatablG) ) createdTue, 28 Feb 2006 13:15:54 GMTWdatatablG)) createdTue, 28 Feb 2006 13:16:05 GMTWdatatablG)) createdTue, 28 Feb 2006 13:16:05 GMTWdatatablG);); createdTue, 28 Feb 2006 13:16:43 GMTWdatatablG)<)< createdTue, 28 Feb 2006 13:25:16 GMTWdatatablG)) createdTue, 28 Feb 2006 13:26:36 GMTWdatatablG)) createdTue, 28 Feb 2006 13:26:47 GMTWdatatablG)) createdTue, 28 Feb 2006 13:27:00 GMTWdatatablG)) createdTue, 28 Feb 2006 13:20:07 GMTWdatatablG).). createdTue, 28 Feb 2006 13:20:46 GMTWdatatablG)) createdTue, 28 Feb 2006 13:33:18 GMTWdatatablG)) createdTue, 28 Feb 2006 13:19:13 GMTWdatatablG)) createdTue, 28 Feb 2006 13:19:40 GMTWdatatablG)n)n createdTue, 28 Feb 2006 13:09:02 GMTWdatatablG)e)e createdTue, 28 Feb 2006 13:13:09 GMTWdatatablG)) createdTue, 28 Feb 2006 13:52:50 GMTWdatatablG)) createdTue, 28 Feb 2006 13:52:58 GMTWdatatablG)s)s createdTue, 28 Feb 2006 13:09:07 GMTV9FFFF000000060001001777AA000000000063000000001001710000001-77FB6FBE18000004800480618200-10618222FFFF0103000010000002D000000010408406186048E00061860000400000009000000020121000500000008000000020200006000000650000000210920FFFF0A00000 20 10E310FFFF0E00000 10 0007000000190000000102012000080000014D0000000240,Arial40,10407D104E440001400400080101040,Geneva40,4030 100009000000150000000237C22E37C22E000A0000001500000002618222618222000B00000005000000020000C0000001200000001011167D0000F0000005200000000400 10 4,77A4,12:14,4,4,J4,I4,I00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AA!/z]9xFFFF000000060001001777AA000000000063000000001001710000001-7FFF6FBE18000004800480618200-10618222FFFF0103000010000002D000000010408406186048E00061860000400000009000000020121000500000008000000020200006000000630000000210A210FFFF0A00000 10 E310FFFF0E00000 10 000700000019000000010201800008000000970000000140,Geneva40,4030 100009000000150000000239A23A39A23A000A0000001500000002618222618222000B00000005000000020000C00000009000000010000F0000005200000000400 10 4,77A4,17:44,r4,emNa4,ke.4,k\4,g00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AAxy38x ~'.C  )- @D KU fr |   !checkBoxesOffIntrocheckBoxesOnIntroclickThePostButtondeleteDeletehowToUnsubscribe(v noStories*There are no stories to list at this time.oneChannelMessage-standardMessage subsFileNamemySubscriptions.opmltitleHomeunsubscribeButton UnsubscribeVArial |9I9 (L(T  F QY dl r eventHeaderEventintro'This page lists the most recent events. secsHeaderSecs timeHeaderTimetitle Events LogwhatHappenedHeaderWhatSO8%l<~G @ Y clickToCommentOnThisPage#Click here to comment on this page.clickToCommentOnThisPost#Click here to comment on this post.helpLinkToolTip6Click here to get more information about this feature. xmlToolTip:Click to view the current XML source text for the channel.S`FFFF000000060001001777AA000000000063000000001001710000001-77FF6FBE1800000480048064E200-1064E222FFFF01030000100000036000000010F94084064E222D7048C0003C64EEA00002000000FE00000000F9,Can't subscribe to the channel. The most likely cure is to check the URL in a web browser and see if you can get it to read the feed. The following message probably won't help you figure out what went wrong, but we include it here because it might. 00040000000A0000000201FB1000500000009000000020FB0000600000063000000020920FFFF0A00000 20 10E310FFFF0E00000 10 0007000000190000000102012000080000014F0000000240,Arial40,10407D104E44000321400400080101040,Geneva40,4030 100009000000150000000235E22D35E22D000A000000150000000264E22264E222000B00000005000000020000C0000001C00000002030F903E40000F0000005200000000400 10 4,4,4,!4,!4,77A4,Jake4,00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AA7:SE`4?000000060001001777AA000000000071000000001001710000001-77FB6FBE1800000480048063C200-14B4F4B4F063C222FFFF01034A0000100000036000000010B34084063C2229B048C0002A63CC700002000000B800000000B3,Congratulations, you have successfully subscribed to "[[channeltitle]]". It now appears in your subscriptions list below; new items will appear on the News page every hour.00040000000A0000000201B51000500000009000000020B500006000000650000000210920FFFF0A00000 10 10E310FFFF0E00000 10 0007000000190000000102011000080000015D0000000240,Arial40,10407D104E44000321400400080101040,Geneva40,1040304E401010000900000015000000023F72F93F72F9000A000000150000000263C22263C222000B00000005000000020000C00000018000000014A4B4F1DF02000000F0000005200000000400 10 4,pV4,77A4,(K;4,4,4 4,4,00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AA7^CG 0<4FFFF000000060001001777AA000000000071000000001001710000001-77FF6FBE1800000480048062A200-1131A131A062A222FFFF01031700001000000370000000106B4084062A22246048C0001862A1090000200000070000000006B,Enter the URL of an XML news feed you want to subscribe to in the box below, then click on the Add button. 00040000000A00000002016D10005000000090000000206D0000600000063000000020920FFFF0A00000 20 10E310FFFF0E00000 10 0007000000190000000102012000080000014D0000000240,Arial40,10407D104E440001400400080101040,Geneva40,4030 10000900000015000000023512CD3512CD000A000000150000000262A22262A222000B00000005000000020000C0000002100000002012D6D06B011030000F0000005200000000400 10 4,77A4,49:54,4, 4,4,4, 00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AAvOSk3`*FFFF000000060001001777AA00000000006F000000001001710000001-77FF6FBE18000004800480660200-1222A222A0660222FFFF0103000010000003900000001016C4084066022212C048C0004E6601CD00002000001720000000016C,The following table lists the XML news feeds you've subscribed to. Included is the name of the source, linked to its Web page, the time or day it last changed, the number of times it has changed since you subscribed, and a link to the XML file for the channel. To delete a subscription, check it and then click on the Unsubscribe button at the bottom of the page. 00040000000B000000020216E200050000000A00000002016E00006000000970000000310920FFFF0A00000 10 10A210FFFF0A00000 10 10E310FFFF0E00000 10 0007000000190000000102011000080000015D0000000240,Arial40,10407D104E44000321400400080101040,Geneva40,1040304E401010000900000015000000023AF2773AF277000A0000001500000002660222660222000B00000005000000020000C0000001F000000020B3016C041C70000F0000005200000000400 10 4,77A4,77A4,Cـ4,4,4,5{4,00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AAxS l&*pVj'.F  &2 FR am x addButtonAddcantSubscribeBecause6confirmSubscription@subscribeIntroC] tableIntroIMtitle SubscriptionsunsubscribeButton UnsubscribeVArial lI_Cp8xW'.D  !- 2> L aggregator2? eventsLog?misc5R subscriptionsPU$x'.K  ! prefsOutline}stringsQVGeneva|=@8S$~F  ! cellBgColorFFFFFF frameColorDCDCDCVGeneva|=@8gif GIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3wUD"wUD"wUD"ݻwwwUUUDDD"""!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!$,I$`dCV #lСĄ+Z(0cC'NJI\GVbZi/aƤ@75ICϟF983O@lh%QV9L4jϩ^: 3؞K*gZ-mv}(ԧҔ%+2K$€;Q000000060001001777AA00000000005B0000000010017101-77FF6FFE180000060006003900200-10390021FFFFF010000100000077000000020907840336A21F8B202CE00035D336A193090716DE84036A390021FDD7028E0008F339003000020000090D00000000907, Public Domain Icons

Public Domain Icons

These icons were originally made for Mosaic for X and have been included in the NCSA httpd and Apache server distributions in the past. They are in the public domain and may be freely included in any application. The original icons were done by Kevin Hughes (kevinh@eit.com).

Many thanks to Andy Polyakov for tuning the icon colors and adding a few new images. If you'd like to contribute additions or ideas to this set, please let me know.


Suggested Uses

The following are a few suggestions, to serve as a starting point for ideas. Please feel free to tweak and rename the icons as you like.

a.gif
This might be used to represent PostScript or text layout languages.

alert.black.gif, alert.red.gif
These can be used to highlight any important items, such as a README file in a directory.

|"ZW  y t     3? KW am       $ /; JV bn       /; IU `l v   "j["Macintosh HD:Applications:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblogsxl["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.logzu["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblog;About Agnosticism/AtheismmAsk MetaFilter!BBC News | Education | UK Edition#i Boing Boingt@+ButterfliesandWheels.com Notes and Commentsr EirePreneurt Event logGuardian UnlimitedlHome$Internet Infidels News wirepJoystiqx Lifehacker,News Aggregator Newsome.Orgٝ Pharyngulan5plasticbag.orgغ PreferencesRed State Rabbleo Salon.com׏ Samizdata.netf#Scobleizer - Microsoft Geek Blogger#Scripting NewsqSlashdotofStupid Evil Bastardr Subscriptions$Y TechCrunchs Test page[Thoughts from KansasmWordpress Plugins DBnVArial QXT$VV  linetext Samizdata.netpath index.wsfXoFV  y t     ) 3? DP lx       ! 2> HT bn       )5 JV k "j["Macintosh HD:Applications:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblogsxl["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.logzu["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblog;About Agnosticism/AtheismmAsk MetaFilter Boing Boingt@+ButterfliesandWheels.com Notes and CommentsZklp2YfZoYm1q X5-VXfXzM:~ER=4?4W( 4  60DtՀvj"lOVPp2$VV . 3linetext!BBC News | Education | UK Editionpath index.wsflp2$VvVv . 3linetext!BBC News | Education | UK Editionpath index.wsfl`\$VV  linetext Subscriptionspathsubscriptions.wsf]Y$VڠVڠ  $linetextGuardian Unlimitedpath index.wsf]d`$VV & +linetextAbout Agnosticism/Atheismpath index.wsfd1q YqjX5#-VXf1_[$VV ! &linetextThoughts from Kansaspath index.wsf_UQ$VAVA  linetext Pharyngulapath index.wsfU_[$VV ! &linetextWordpress Plugins DBpath index.wsf_Ym$V/V/  linetextHomepath index.wsf index.wsfYYO$VV  linetextSlashdotpath index.wsfx.wsffY[W$VV  "linetextRed State Rabblepath index.wsf[Yf$VgVg  linetextHomepath index.wsf index.wsfYfb$V%V% ( -linetextInternet Infidels News wirepath index.wsff X5$V)V)  '؀/=]Y$V6V6  $linetextGuardian Unlimitedpath index.wsfYU$VV  linetextScripting Newspath index.wsf vr$V^V^ 8 =linetext+ButterfliesandWheels.com Notes and Commentspath index.wsfv^Z$VV %linetextStupid Evil Bastardpath index.wsf^` Q$VV  linetext TechCrunchpath index.wsfiptions.wsf`$CD CD w |linetextj["Macintosh HD:Applications:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblogpathpostToWeblog.wsfYR$VV  linetext Boing Boingpath index.wsfwsfYVR$V}V}  linetext EirePreneurpath index.wsfV.gif GIF89a ̙3ff33̙3f3ffffffff3fUUU3333ff33f!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!, !dihlp,tmx|pH,Ȥrl:ШtJ6 ֹuu _SXgyfpy.E]-:}vǾvk3dW@Ey$t^l|*j=z?(D8naZ{Lr`p~[rujpxµkeǙշlq͍¼~WѲ6{KУg܎ʬS烙AyƐCs n"HFP-x#Cf(O_ȥ1&"хhJ(62g J XCxdM$M$L8ɣ?NDf79X%_}UfJXl"ᦚpxNPRbV|Y9mJ'rH8A>[(*a%=RڨT¨櫴šfZ+} )_U`[Ȗ"ʾ0'+-m2Ot"w A nZImh7NEµ/tꩿ|,P0L܂< 1 1o/~|2<\F @˝_\@Q»-ˬ 30|&Z2jt bց%IonmQ_Lj,RK10(-wobymcل DvwuƆ`O0Q۹n ]qt8xϮVC 9r{4ͺ/ӥw$gF촓8ƹ[OH??F\zң ^ɓ#}B!1Q:P_5Ip!͏Z NvQw` (,-jQ5lxw@E Xڋ4Psk &Є:ݝBU.T " ز QV@lEFIT"zg5)>[Y:2ЊS|v0:S}A$gd`(GI Л%AQ#&Y.ND%MLke[z4IMF"xA!Ax"EY̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:v@fu`X&&ӜJD3QdS"ꚇT/|e0j~ԡcюJQ:Y6 -2w((iT t0O$@™o5(q BD1k?y>ӛ=%_g#vN:Hft!ndUq75θ[;N:C])p[y0@Rt٪Gx}\/U^~YQ6纎E}z$`/6b9ɮz?[ҟ7~QOj=\ؿ< {MmGcw+W(тML{z w/s#iCB&ss~Xc30kW*'wgV9EJp{p.C-ַ}1G=GkQĀivd0}`90{|sjJ/&xzAm3HJh5*W#"rIXFZ%\4: x'yVȄetUrisg"u]8Z7m( JtJz86mIx@z(c9J$}bKfKxDB`x+/"%8Xx؊8Xx؋8XxȘzOZpABPCYyF]8^sEdR$(Y-Qݘ/eCTU:gEVU xvST4%^ Muz7Ca6UU0 xK5c5T\@Xe]5[ZZ0Z[PV_e[uG Y!E5,p7)4)\-QHEQ=|>>'+]ۅ\t9V͵·XtZ\QuvRxQÕbv} Y#I_uU_[U鑱qSVfZZx_zEN~ m+8t{@Ȅ'w*+oȴwUK`lh4B]7s)}Kh[q[8[b*Z1|kiS6[%K {Q汙< $wЉX6/ӋˋStJ_dʞ껾۾;[{ۿ<\| XbYڈP T#5_@`؜vu#LTK(É  Ux8 U P;Zw%UA>ii3I\]Y ŝyMl&U&HSUW5U1U0Ĥ~LY ^XX}嘉_|ls\SuY[TSlW@Tr%#E:ZUSuaɛ3YWjip ŕ,LU3Y5ˀ\Y-ZA&E_9`Y\ʣUlʀ(̿%ּQ˘<ɽ|\΂9lZz,P)]ERϾyƮyW y]\К1 - A=ϓPy_1\7CA =L7XK;*,,0XjT3m䘝 @B=D]F}HJ4bN?P?Y""/cGYK`b=0Kߴa͜!a]m_-vMedhdn%reZv}s{ ءpFh"q}}ؽc،M:f ʲv"B؞ iϒӵ/ZLeُ'"J?0 { jfiڵگMzҵMZC@ ]nJ=-ܑG`Z`þb\ 6g=/0ꨃڬ=K;-oܓۈDSd-{ͬFݤJ42 nP* =-;[l3Z9 PذfBB^bG=]+LN~EPGФ6^{qhCn{QNik>Em>B*CWMTkR_1&9n-1p~_8+X|Tƣ$1Qr[MK}h>GKZVjjqqCGN^mwJN>25^w2>cNuN.~Q=v{ΤJp7~~gM"#>.KX>9.'^EZ>g9f ӻ$!o~>!M35$RxDQx"IZ-Ã{unJJ-"j HLnpr?t_vxz|~?_?T& Ol};~ˤ__LPLë8(Ǡo?0L`Sk&i_xT)ė9WOuE)Fu~b? H~2+!Ĉ'Rh"ƌ7r#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:w'РB-j(R42mӨKJuJӤN6Ÿ+؁ fXڴjVxV-\n,ݵvy^敋/}x"庒1C|#pn8pԪS83dˏ qtq=޹C0o  ]x 7 O`,}+N/4ΙF|ugi7Ak$ lL`` *`yIȠDh]H!G;ه~=BVB`X >h`vbqt_(l k:xGa圉 UVe8NVhUfFRיe)kJ"l_lb^] Yo|z~-`t- ۙi2m ʙ)W1Yy@R|bŧZ=٩z#> H"Ydw g^XV-e {aZ b$P jj0X",(: } 3 VĂ6b71DuڨM"2'| Dm \. _9u2Kr&2#l)>mվLyGP5_ "]r~cpjX${,$^L7tɡ.u^]_~{7ن*uGoMHCuJo4 j@z(]n>dK7+T\`K36zŷ;*G<ovV~=߳)Wo*_sO+' {֮垿?gN2Eq[g>9b $){ , %^O<' Z|&$ ?"FpnK@^q?B ؜#,J_|D%2w%[=HacX.,Qǘ9ұv#=~# )A<$"E2|$$#)IR$&3Mr$(C)Q<%*SU|%,c)YҲ%.s]Σr,0<(Ld&=90Nf)A0!%fCY x2ٸs$ǜɋkPFRqh'49uȆ7 j&m,>abBh0+рb,E K f( qƀt; Dl2Ja1OWjy3OoX Wlq*Rk 1s:}jKͫ5T|bU?*Tzu /]NSjղUrnJM4H[Wݫ%jf3e,8 {3?)늪գ,f%:ꂫQT]-@Zc(}mkLN ]̒ڀ d4.KQzc!B&wеn;{]^r.x+񒷼=/zӫ}x~_ǼI}L6ca<#6p}/8Qta WQ8cq^f߉q7̥xr-V t`jCe\ %6͐}Ci{oMdyA7Fk99Y fAft`(J0OWr\*@].<||L a7βf4SyonH~3IqӏB-jQ33cYh:;ZV-MFO_9s6oggԢթ6}MҸX?|=Tq;Vfyw m]zݘ'iZƯl|{pVnu[{𦓼k=k &uLln;ߐ8pt[nw?r:^1lQ9~ncҦaPoO*7 sqXOfGrj9 n螓Ni<]W:< i4V7qǙۓvY/%=3;Tt]#V8n>)a<599˕\jo+hx?xLIyӃ~=c/Ӿ=s=/?>3>/Sֿ>{>ufq4ijO[_#D6'4gˋڢ|na?%W]C`WZ]h=FAVD 4* -^fr'(d}  j}$l` z Im &^a`90J%VQ Jidݠ#!DS Ug[9oQ.\a!U[i>PZ &I%dkAB3" "f)Ve9!- u}0.r V82ġHveV4Ɩ0:D袐}#88#99#::#;Xȗ[c;] >M#>nA飁Ouc<`d@@$? ( ~ՆT%mؒWEBEjBVaFCjLȈMc)dFfPbCd%t-JE]xUXT&eP^KfVLƢKS^VǍ^Ul@aDYy\qxWVMȉuȑq `XR =eW^$fX`F ,։Snf^%c6fH=KkO%ff ] R Y]^h~Hf4^jz[Fl $Aɩ٦lnm^ږpE؜ޜmga8tb x5EکduJe$\i):őzN[%y6z9geB'J&!{',Iy6xj*VxgrܣEXP%%70`0~YhO]tB ]vZgUKцr~gdKhI(gTϓy}2|أ(f~.%P5\b hzFhti{iZRfgޱ)qc\֩橌z\̚ھEs9⩉br(ihrzjYX@^ H`SjB(䅆F~#6>+FN+V^+fn+v~++++r!cz`;_&ao]!WC+1j1 ]`Ńz2_0C&D8C@̉El2N.A.ઘBbi;~_J# ^l V̺+ʶ j`ϊ,-2&,aT/l2"~dl"Z?b8I-2]-ZyҲlqTVbVm8 Vm#pJ}-,JC$86m2mU.6 nB`!V"b]IQ9mIS-޾J"2-ᚠN4OY6b!,>3/nV .-&g--6fTBkjC. BRb/rop9o..J:#I\I5INc/zQo1j,/0p|a)<WTY?d٧M#ГU0WFADvedPdۤ) ?X W @jCvw(y؄Y0pƃW aq qSk IJdHN:$ȅԴ s1 : @tc> Oުu!!grfÙ0 1W81?r {=2|\K~&ejL+i X1p26 xrI ¦,fo>9dg,ђL r.n~bJ0&m@++kZ15s3;+XJ:&GB6r%sjVxlv 33&ހ)DHt<F>>6 YY/#JuO$tꀙA#+燎^=t $EM>MPFs4?@(yl@Bt8s3"ТtntNkFwt~*&I7'T7Xks %5gU/U7&[DN < ^Ku4W#]@tH@8u-ک(ڵ}XdE˨Pgs?w JP u"4bb\t64\w6?65`(%6&+_̳s dч uBS1\cP}.7$)v*3T6r~WG`oQ.@t{puV;Zp@ (/ z{p]+p^綗yetE8)a6~?*kĵjKvkojur%vv[WeCK8 j]8pgT餆x[x}P:"Oˌsx޸bCQx{7ڋ**Ҳ&!9)"O9W_9go9w9999yoբ84//N :aDV *:% gbj.[,;}lтll V"vaUW%lz m6N-"{v !֖m+,!~: !䲕 _m?nn&n(($._-Sa#Kz){.8::'a:z6[>-y~}oF`g$A~۽~;,1R5C[Es]5<_?`=d'Y_GU>?Npkcw?KQ?LEa扦V /L2zJ \*W|:( xLM{T_{:| ][D1w6$$E%uv6I zGZJ*SRXt85 {{uV j\[s{dH *9V|p Wl:= (+qG"u'q`4}AV&By+7!ƌp8G~IJ* FMfj´3g:rwR_ț:gD)2^L12 J,58DxܖψZ?Ti(,ɑ*@cߖ+*cׯ`/Jkl܈f28i_XY!ߙeBϟ7ЭiZ(nykTRA?3W1;8 Wؽ̋Jy WV; K#){wś?>ۻ?B;.UU:0B᷏ y~        K S!6!>"#"/##$ $+% %%&&&'/'6(s(z))**++,,00#1$1*2%2'33"4%4)5*5/5566778e8j93989:::;;P>V?i?o@#@*A4A;BJBQCKCRDRDYE>EFFkFsGGHjHnIqIvJcJlKfKnLkLnMMN N OO OPPPagif GIF89a333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,i80 @#i;U"(|<ڮ:W!UJ:<<>,;IkX݂ {mhڭuO[?>28V ; alert.blackgif GIF89a333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,e80 @#i;W$֕xB.Qת5e>PHQfaQv5Aݒ\̴2`Iutz08<< ; alert.redgif GIF89a33f333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,jhp@&i;WdB{^HaظjpnHP*V MW':Z+nek]G%1h~gNmg)c P7AK ;backgif GIF89afff333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,K#j3Si7Nvt7*EnXm/5FPxƤl(N ڌ:@VUϋ; ball.graygif GIF89a̻fffUUU333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,D0I8ͻI| a#WBaiVH|&"9 _NgI % &*T&xx,;ball.redgif GIF89a33f!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,@80I]%[ adyO!%aN7/<NCbQBU IeLsZجV;binarygif GIF89a̙333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,iH0@$Y ]!q^ k굮jAvQh)n%Ӗ*ԂZU)􄧴9!_8s; JI;CS ;binhexgif GIF89afff333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,iH0@$YjU^+`Qߛ<[@`((&hLb.]|@ s;"".Ͷ<ҝh,DC6;M ;blankgif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,ڋ޼I;bomb8gif GIF89a3̻fffUUU333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,0IX$Ivm^I v$}ئIvDpH %r[@-45oJV1z=b@X`8o,@ۅy_,UIJghABxCJepf% UTBLW;box1gif GIF89a̙3333f3!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,n0#;D\iS1cuqk'@׆iXp~%0BCՊ9m1M:/<>n'W[2LL ;box2gif GIF89a̙3333f3!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,H0@$i;U"a,14``H~`x8(|F˦U^ SDs(e]+m<=O~qzZ,d|=|`c{ KD1; ;brokengif GIF89a333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,j80 @#i;U"(1RDmL K:K |hJ$Y '.fľ'wV@ٛ6*[uiR7 =HS;indexgif GIF89af333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,H0@$i;U"hAREmr%F~2K0^#ChZ VyR2VkX(pIgÕ7VnEMOrZR9DQAG<9 s/yy ;layoutgif GIF89a333f3f333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,oIxGvm^IYq$l4aLr@kW HPh6=(Aa9(UBo\5&2Wv-/s8GM/;xpukt}{[RQ?pH;leftgif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,+IXAo}N(JdDjh:)!yt]~md; leftArrowzGIFfGIF89a f3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3wUD"wUD"wUD"ݻwwwUUUDDD"""!, G2̘!DCNƌqZ@ #>xp!A 'ʹ1I1. !clip2gif 0.7.2 by Yves Piguet;linkgif GIF89a33f333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,lXP@%i;U"QRFmL K:KDz_sDV@T N6#m a^k +Ǻ}NzBD=4X q(fHi.2^7W6w-2: Q;pie4gif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,@4X q(fHi.2^7]r LI䒩D1rROI0 ;pie5gif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,<4X q(fHi.2^7rf< -(t1F;pie6gif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,94X q(fHi.2.TE%a<"0 ;pie7gif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,84X qxpzȶHBjx~<2~(;pie8gif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,,4hm*aTl+ Hmߵ~c;portalgif GIF89a3̙3333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,qhP@&i;U"rAeᾇ'eGy npx|7B@x `Hy%$\N\[ ^2֦=[-oGzp7FF2|: ;psgif GIF89a333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,g80 @#IjUhV&L wU'eH{ ;eAJ^X*zլrYDb8^7\(7>F85 ;quillgif GIF89afff3333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,~h0@&i;WGxp]BqHR/!:,Cb V%H@@d)6<1EY!~˺A=v,ipgZp[ys" ;rightgif GIF89a!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,+⚀QMZy}R؅eHjf^lt=ݸ^;screw1gif GIF89a̙333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,u0BlhaB( ]@JTK/9?[\A@3$V(؉rR!v`Uʩ3u|iVf*{ǧ O~}(vp_?7 O ;screw2 gif GIF89a̙333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,zH0@$i;U"@TAW6,Aa@,N>H}J{v,{  ;sound2gif GIF89a̙fff333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,PH-tYC$!zP( WɝEzU[4J쯀1T/g O9T7A3n}7њaʌp^$;sphere1!gif GIF89a33̙f333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,xpI8:@ AjtnECw-T2VTʬWh5awE_=}L~$y{~VSz_qwm?|H5j&;sphere2 gif GIF89a33f333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,{hp@&i;U"aRGmru|O!@|c*{Grp,@G|F {Bxyj:63#JH=/7@ ;targif GIF89aVVU777!DThis icon is in the public domain. 1995 Kevin Hughes, kevinh@eit.com,`(0y;A|ș,#ж!؄FZ)Fb!FqN= 94ydԙ];䌛Uz<^L=u{4҄TM ;texgif GIF89a333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,n80 @#i)!Ega5ny*u_; `y–x$$QD RRE'Ԗp38Zn׀x#~/}i{eGF:oZ ;textgif GIF89a333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,X80 @#i;U"qDR' n Jn(<:{PټVEnY2~Oڍ ;transfergif GIF89a33f333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,e(*ս0-2J]}JXq뒝!|C>_@9BUCI`3"tJ]Fة♥Ox,~!-O軻1it-)44 ;unknowngif GIF89a333!NThis art is in the public domain. Kevin Hughes, kevinh@eit.com, September 1995!,h80 @#i;a"Qyʵ.J 70֧#$ @*,K|'"-K<%$`[˓j%xYq8Fn{=~q_K<4L#~x= ;VArial iV22Ugif GIF87aMlιܥخӗдʗՇԗɉʈ׳ҴǷԨʤƩŸȭƘɑɕŗ븪̶긕紉媆ӴƧקʤᝑϖƚsdylxStlY:}vF|ntNu,o1k:gvlpyפzˣxѦjr֚xǗvƍt֗kȔiҋkʼngWؤVѤO^ćXɒLspwwtujgfgvvjYPIT˖988SLDE !T",‹>|J-dA`S!+֜Eh]A!Ƞ!B0Ԁ2lqYhRxQ+qđ7܀!d"ĔCmls6` z6lF/̐C 8å"Cʹ g21DLaH&' 8lCqF 81AZnQҌUQLqŁ rf T\ !<SH 5#*"R<Ӹv>LB K-aC2:qÅL#ƘSN%am.p>LS8(pō(!(s-$̧@4N5#$0;c:Q#cU @$l*L J,hhWBC0D)՜:c (Gp ,s=@?8!L&rtd4t7%|PH!* ^+ Ca$#pGBLQXb1`J+JE4v|>d?` 4>> -L=,12I ~E@.b'4CȄ~QXhgeXF0XĢ.lAr ePBI:%&Ր ag/AkHB<6A9CLB * ce(w+0 (A*#SxQdTb:@c搄*"fxEڴ5-x3h tJ@. rm!n< %*2 B>t ml;衑C \E0D91 Eh4CbOb3qgt3kЁ ހ aP8UHBVX E,ph[PQg9"!"-tqx!0 JPa(HWrc 2!&$C<Њ'BhbeS$8A<!9ɂa5Y#%ǨG}$^ >&T4#!Q@D h8LQ wL?0qMi= *ձ5UF1 |'? Xc=a $}D! [;$x,b@,|xq"!0zC!w3 OHAdE?j#G"5ap%l#AR891r P8@؋^ * lX.qU B@:AJM||& zj P!WL#r [ 3L y0!=&A)D LX;gSa f}L[Nnd5`l` r6t!1ܠoxЇ3k9ȕO6#Ӡԫ l0ܐhNwAd I 3pQ<<1B0.A]A:>!hDw@+@s G^[c #cP**50d:pH"y] @81f $0 =rLK@@ -v ruypfd* @G# pS ذ~'Sg u1dB 3Wd ~0 U1Z(1PWoWp #@@ W@ hR`ȇ+cTp0 >>D e eyxB Ј p =PZp 0 TxJ c Ac R0DPP}0[E(^ n<؎3fQ0 !nP$ a  H c3pp4! vǰ 9e0 p 0UHɐ 1 p0p:tgpZPZ@"{ Y@@/C Ġ İ 05 YRP Sb0{$p 2L @!9p5@0b p^  w/ q %\ 4 T ~ lD`T!a)`R>`, &@di [0>` 0 cPR@P ~ P ZP pS f B^P po~P8Ep QS$!`ve hyY``Q;*XW%  # ^719 e,P 1dh@ۖ€h/_:X PҠj7 @ j @ 6Y`,g GZ@pSf _dX0^ D p^( UT j T@Djΐ`аO` d( p v =^#0eHP7d?s: Ho v@p P1Q=={;g@+&'.@#0@LP~F@N& jِ @zZ^V ϳ ZEaP|` cT8*EF?0 RoJ z @,p ` @ @RF0`i0>̐ ʠ ~3*Ү;@0YHq =@@ 0 2^p` \p q 71Yf?NO @ װ|b 0 VЖ9 3w( pM?SO@T@A`M -6i k1$i P@ba@3TPZ#  0% v 0P>0 0 Ć0@ P 0 d q0>0 ah~O PsH ͔PP Yu0 P \)E QpT# TB't @]/ sV@5TcP<p#s  * \{'@   5 XX z =fopxP P YvV`Ԁ* ™ D p;p_ . .E_7 `# uE  Ub 0`  !3Z y X0bofN`xL ސ, @ sb l 9A`  0 uB"Ҥxs v ۰ c]Q` '"^C]Yx"N* Pڰ aK"%Saopo+2P,pYg0 _`qܐ n$5Ε'"P]K^!-..Hkpk`$0'x.P[`Ac =a2I 60%l۠ ]ל:"'yr"!gQ-d@\',H-ip:p/|-޷jI1H4ސ7r1 h`*O}п*aGl d77wuxpqP'[.@i y$ XO* '0(qpwi jP[)O DW mP20 ]E#h1ˑp-ϐOM4O#M bq2M}ema~(!ݠf0Rg*uRJ  _ y^R1Noc!@ $2R.8] ]/j:"p<. tN 6X` bZ"&ob< NB0 Ŝb@Q`Ɉ @ *#0 M 2V 㐋,` 01@ 03bnň.s6.rdwԼ* > )@epj|P m܈` 1ՎJP W`P Up `1ފ.Q@#D: ^ pC` J`k pe ``Qg pW@M* @ YJ @R ?)@ mH М 7 B@d A P '+S /`  ڢ2p ; Rgif GIF89a5+~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!  ! ADOBE:IR1.0!,5+H0T1IJ29: ŋ *G)]LqЪ()Jc^2I ?jdRA4N}Jι_ d*đ-b(YafZ8@X,SYh.5e>& @ gQ6x8C6 ؑHkgW2@(<[`0Ak2$C$?rC&_\6 4ٓ$0&XRrUB` \"Gb@XZB N DnJX( -'cOTЅ(BO*V%DCBF|(Rq H@K,~ [A;P t r0 P!'lPl/!0P I&;b.Xe"H $<$C>WH)"ASpI:@0P(V``J$A9PB̘}"cfE?tD @з8hR@U( C9 t@ \@~ 2C Ap̠!0@A1ޭ@m|-)Ft2Ё  4r2@9L"#\qx42޽A\ P U/0R"$J#b PK"%\H73@lQ4 D\/IGd`G <"P}C  R@,/+0H7 vQ +$g@53@ nD' B @2ՏrO-xI]@Z3@@TK0ӎ:JΰB5bO7"ppQ %-@[I?h" (OPDS $J081P@޴bae 4!F:2ld/|c  `^<50{@FFPY4CG Hx>D@TH}B?% hD90F?.X BD€ZY$!(F%f$ &P`8ތ6N6\b).`a?jY1^ 13a>:pbi`'@%@ ~Rɖ ڀp F8gV5DKq"3# z `E#hl`MBJ -E@+bق9 ыFlL``GHb(%Xq / D$@+/L0aa/- Q! 7P)P BB6aW'+  &ah,-,c 4HuCo); R gif GIF89aH<!!!)))111999BBBJJJRRRZZZccckkksss{{{νƽƽƵZRRssB99911έkJBƭkcΜ樓!ޥ{k֔{Z1ƵΥ֜Δ{ƌsքccB{JsBsBk9c1Z)Z)J!c)R!Z!Z!ƵkZRΜ{ZJ籠֌ksZ9)ksRcބZRkBsBk9s9R)k1J!c)RZZ{kcνέεƭבֿ祄֔sƄc{cB1skքZZZ9R{J{JJ{Bs9s9Z)k1s1k)k)Z!c!c!ZZcR!BJJk)Zﵔ{c֜{ޔksR֌cބR{Bc1c!cZ{1ֽεΥΜ{פּ֔ksJR1ƭsB!Z)ƥkRƽ{sƵkcZ֜!,H<@ HA.Px4pAB(`8ȱG Tࡤɓ$Sz% @>rt挧|t"ԉ','`@+=*'4g@)`@ ,TdtT>dCϡQ{ҥ3h~j(ϠgUqJ9 YF"XਓrNi $*x:0`*Lp!Æ sXn "x 2E=7)Dy&>hyF յ?,MvJp9'PR%`"e4 kQ Kpl tD DH$1aK$ RF!~de>ȑRi`KV VQu,ExCqQ  FQ fa` y, eũ0R` }}!?4KXՙP H aTdT6@ODU|ׇ^9 @8X\o*G9z I)nEUgtApVTNPŗfUkLy)]`K*pS.ŲA),KAVpyDHxhݙ`[RK@|xTp$cƀ)9u1g)OltȱyTzQ@`KٙQv:oDA{OV[1CcNX>paaۯAJ`FD4LZO| B@p@}$!`  Ȗ%dp#6ʅ|˃0a3)cf(@(WZ@>Q H@$†x@8>$[E``)I<0G:K!$ A~%1?zЀ!=F h'AOx,P X ef 0 Z" rт^+&0a@@R,% B) 6i$[\p TXx).vIFAeNOQgg@it5n,$9dR|9S>{ X"8#0A S pЄLM QsB&0~630 l Dja P(-]cRQLMI`B&xP/dvQBP<q)U^cɬ*UIL82)JA P4" H&.Ju _೉dPUYJNu KH :‹% -\ h?ϠuC wH>5ѓxA %)AdRq_ ?C33t@~>,j>"?4f>qbVT>A0UA@1` L,!aU.!V`$4`5 $ :P6(W6}@'0)~5*cJ>A@ F H| ]+aIW> @fH)z" ?">Ԑ P!#Pc.B:C0X N.acAt3{@0vA ^:Yhk8= hX vuaG`; GIFfGIF87a f̙f3f3f33̙f̙̙̙f̙3ffff33f3fff3f333wfffff3f33f3fUDDDD33333333""""wfUD3", B5.447755B5B?>>=<=0  " #"@<99::<6 +?<8:гB4 1?϶:B1  @>4MLz(X`p!BzBK@m.xP0\Pp@vz3G@F $4hjq54BvDSGCD/FwAً#F0 jSU,ܰ*b+dz.D`X1 `p X`TU!&`d 0w)Ja,@ 6XFPBA.t@H&~͈Q eOm^`:t10pϵ2|B Tg&` SD2 PO{ ` P`U5 `pA 7@-0 7/Lu  PB9  30C I`Oi#X1 5iA#hP<3 ?$+qŖ`v3$<@*RCa$ >8x%T _B*ܩ<ݘLN 28BC @@QT H,=z  @p-`rY-֠ 4]/#+*-~kB ," 'T ĻEQBp !G, ;igif GIF89aZ̷ɷɩݼܵ֗ӭҚ~́ę}pcdi{{{tttax`v^uNtSlfffJlJkIiSeyHc:`XXX;^1Rx4PqIII,Hi-D^;;;$pJi/0L! p .ж |/L#T@0ℋ32.0BiSMp@!*)b%Lr &Gp DP `Co&O"?c yo? BЊ|0@pA( | M1c{!8` d` C94` (΅I" %9b@EnA:G"/6K0H=@ sQ/_Av@DC e.5Lkl 8L&. Db"igGl@hc@'uB=~Q9!B| +P ,*IHN "AvX@ 7POdB% CM Jk E@D%9ΨHi mtoz߈Œsl*iN ګn,{ k+ĠG+4.:P*.%8Go8]*誼>: l(R <#F){ 0K\1 ֌#b/ngL?R(Ӓ 0Ƃ߭N >.GNgc8Kwnsm#;igif GIF87aZɼ߷ɵݩ֚ā~~}||||{{{tttss~sssqpjjjiiuhfffd}dddcdgaxan|`v\\\XXXWWWSlSeyOavNtLLLKdJlJkJfIiIZmIIIHcHXkBBB>Qe;^;;;:`7Pc7776J`-D^,Hi,Fc,,,'N0qu\)oHt|[c]W<`CY=P @ CO ptet:`N ,!ϕ1Ԑ4D0$Q@JָhW u ôJ BRE ĸ ,!eB3(c5L0 -70h @72 cfF-;) c/B'!]Z@n!Zܙp%C`M_9j1q |ZAql(t`T*ać^-Gʿ3" b19ZcѸg1˗6v7@Y(s:x0.A4Ip$m>B.Ù |RYq+|.iXIW$-$HB-S#ƽy#cw' >pp5Vǐ@FbR%I"Iv;WPHR#)}),X\Q8@̪ _s\r3(h"xi>hdDa1»| o  C_H ³6FM0Xaz #Z2-30 ODE3̄Olj?*^+:.'%..C):.% ""# % &' 04G--C))4SJ,<&-~) fB!ء<<ȐqNN!'Mt!"(8 ")4xTS-zD "è"< p .T!&rcy=.8qp"É:N!@%;hTXoM)(Q!;@ |8F0)q#V 8x` 0v!2ĉ 0tlPD:J"CE?@ "iA  8A%4HL$2ˆ`!2 1H0pR.6|P) =|q/b ! D*$*/N A0E! $Q5(b_.%d60P T3 $lDӰ C .$@A.P * @tр@x_:+0-@  IĕD8@B<@i(Htj%| Z ЕD@QV6*i`8G L@. 6P z0 ;\6PB%@D R! ,$ Q/`C8D\CE(H0A* A,$xE>5@1y h`TI2FP 5Ьz " @ ;@0 < @,\/2pAsEPO2 K`WBRTIO`aBtA ZN Ā<`, @ C! 8,C @ 40'Q:P5* P&P &XT  'h.BE ( h]#@L=\K&wph K8."DHAၾC N`a -tw5%<LF8L+0I\08`tN qX hxr/IX HL*bxRPX P0 TNJx)dCe` Q Xz`@ p"S# W0  !tGDv t@`|F%pb41ޣ@/h-+ܦSO2*PI:| 5fT mH4p$$?,cen/Dq@N%  p\Y xAtxH@HH .6@`j (@6OJ(dUh(@5'XXU%;Az&@D@t$. "[B!xLQ1 `P pIP AC@[kIt)pOM ]i٠E@>಻.X f H /I bE;Ar05=fK]8X!#yd,,ِ D`0P @D Z,Ta>@ESk9Jmn u (01PXȌ5a( QDV8!pZ6#-T`\R P,p`H,8{+H肥g`Un0 1#xZC=FR젆)%O  P ` j@ĜY8; RBC标A] 2L!(`6a np2sy@ ;ACP3tppzdt܊[wܲ3~H )x : `@ $< P 2d@:A Z>X(\ *`(Zb3`k.0@+Zh ihQ:"4 -sܠA!PK:T$` VЂhh 0ˆܵhP_XY``AXx@.y0!>(aG3NGoV90~'K Tzg`A{EuP )XDH( 1] PA'!6J`885N:P^1qAN($H-0/@P0@ pRSp?*pr=*D @5M) #`3!BS*&m  'g%xD0;@I Q_f+#yb( C2nx5b!rš`ِeJ.WP.u Ir٧gYP.Np @"UB.xA2B$2VF@ b6.O~b @|C0['`O7gORWK1,>p$tD$DI(W @A0P(58FIp4@UȐ+2G0.6&b=P,5& E`&.~5R#b$1$`?#1r 4!0|}P8 qN$`2tI@,PhI8!)KCVT@`Vg@pՀϠ0@eG@yɧ2RI1CW*C_ȸ6Crcf {H%'W )$51G!BBRPncBUUQp8%P+wBKW JW K2SB%Ir_&0J yuyZ@ UDOF2!FK߁ &S6F@2# D@)O + 'CŊ&Z#.eH~+a!$9p,8  !UI_Z5u%' XA| `W!0"*e/pT(Q G錻2:63P[OB0q5&.4nW37Ig$P"a_E6#Jp~7CJ Mr[R00-ଌMEP3 h3&$[CMY ./PwKx1;."1`~DkUA16 1;/"Q3d+BA00dR/@@3 J0p!`i 0PH`ecUG*fjOI@aJ6[ #@W Yv'^[Peb# X`v3m; sj @(0f@B3`Z͋v0x`?v pt kvm[r `0.<&oSc0T;MF&]; o9{9q0mmyeUpj3`eZBgpPw`l@@tm33&[8xkly u<9fAM0QP @K@n&jzt t3&mcR@=F8 O<<s߻ɜB[2 =@8>ɝ*[Ծ/10U ݠ> &<` )$ũ*SD xLJ K Q5 V0*dg\{P2 % =p 50`~`j) :J0 <A^,Ee NТ[,|8P@X0O0"GlqK2K`KP1.  A#Hk`K pND3kBokZ!(S0pRB#.{G[[v#8!4pIb 8ng80"8@ SV\ &+EydW C 8uM:`ء#@K jDJ0sQf H@oȲHE,Qq~!GLBp-@O`G#`>PgJ: \D6*9Ot5a+(1 8@Z*O6:-B#^`NGM SGX+6Bp~U  '8QQ2ǁsF[1C( y(xL)T`2Zu({1-Je< )[9[*Jix0Y-8NЕJP)P2zt1tA0CMű4o P3) Ҁ051Uk5G,0"@.5$ P@RE^P/e]7a|U]/Pb=CNw#0 / 9CMH32PBP*0L404 Ә@V2@TK$P:+@ * .pr D/q [w9_+a4@pb8xz%I(W n& SW2u2[n]1`pP^: ;> ;>&%9++%,$%&'%<&%DG)D 1(7/:A4KD-|1.:=<W.+.$.<1024D$T 0+ر :6D  P(v Y1DB :#.%0!HŐ{ L䂆!9n}("C]zxE AI,8H6h@C8TTJ^tEHj&`愈pP%eA}78C:a ;t '/HPENCq!^A&Hp yB?bP!xN·ËDDxؖ.X ,0tiЂH@bLMtpuqd!dR;8Qx2  @g‘%p>.B& A PW3tpPQ"vhEׂ!Ȑu)p ` 5€ pDDC $it+T% vJL 0 `{%pD a$K >,|À`pV1i0rDdA /$x7S@쀠#U46]-qE D|B0h@DTzO 1Pip 3B;\%Rpz3p!ӽjXTK)@5Hp50 GnXB{h KG2@N8  By!|d@!D{DHB @}p \BnA iD~E9< q /Cg#,TтM41 hP: 1Rd =x0m'gy`/ pU'^`O-xl9` +B\DUGz>01{rQ)_ |L G )X P:c p"D d;Ђ%,D `@8J#CBݢ=2.Tu&٠:I nphpĀ\™8`b@.c@A1٘(=4`7(w¥?T`YnP3AHhP Iyԑ!h\ M+An7P90A~;e8#4vh1JA,Rhd9d,B <ڑB`y)uJ W&|= P`m^'kK z`%`@ @P  Ԕ P܀X4v, @8a+0xӨ `8laBx炤NP+8 C, lȖfi 0l q @K0P"0 ; {FM փm0 +`A^g=[pP@b;j  \m)O۲>@. !X`I!jG`f!Pxyt{TD 0PEy=@=h.yB< d%,0^@]890$ PEc>o|%呆)[V!b||![J*@+Z +G`OK RB:9¥@U< iNaa8A0ȁ ~@?#[AI|d!B\2VB+ 5,X/ ZAhTHz a;xR48A`}ڡbw ڵՇ*xB oާ#!= f0< (;8 ܁g@: ( 6z;8  <px0l BB~qAcC(ǁ @|GC7?s(:񛟇2p4`á2 ސ?A u`0:] C 3ܡs`]wyyz`|q{ xzb[`}wv0Gu0ePW/|0z0paGw @w`vgpe1^@^ HZpfTju@wg,hpqH*`r*m~ vhˇh|z0p}{r]Os:x{u#>yHpظx2;"RGIFfGIF89a$$\BPt@~dy1@@@ήqc5DT!X\2l@e!̙fd'Ȥ&/Pfbk9Ηrffff)Ehc2OI< Êd~{1,,,`罡Qy)s/{@9?s9SeDLLL~rǃU[ɱR3ΦUjূr3u!c I$ѿMdTDмrL33LQYh*afl ߒ_Řz4ҵXXX):I;N^rrr[}W糑e uYb 5Zߞrn%fffp!,$$dHʘӡÇ#Jċ)ZlD.(…ɉjf8!9aOn5jla9afhu5JL  ;postgif GIF89a vvv111UUU!!!߻EEEfff!, wPSf$2O(I%psxb?湘x(L;thisIsAManilaSiteGIFfGIF89a|yyroohdd^ZZTPPJFF! ADOBE:IR1.0!,!dihlp,@mx|pH,DƤrl:ȧtJZހ[~qӫ . ûO<   8?M F @5 e\gM;6x ~<xFwx?g\N:   cՃ7  7  6 j =s1O k9w۠1t8َNڹ*Td n@`#UAB /daԫȡ ٩a1R8S V">L:HM={Za 0/o@XLe&TF(DJِdɘLŅ F&1RO!Ls i n%/ۮ(ۮT hҞzS0B԰nH‡юeQ]F𥍂&-GpzD!ӑa@VT0a+z!AƐxEU\WI@P,4h ł!bژ>Ta%-TdVD,כZȟOxchH}Cl88H^TQ2 ਣdPzXǓ=6rrbf1YJXO,i١F5ٟ%WDSZ@jpvEj>@c=(h#D3*%nP*rigz&JI<2:u Lu֧H{+09wf[#Pi9Om2u0 [*'oqxmlGIFfGIF89a$X]rূ^dɱcߞrsr3罡џAC4Ug#糑諂alw.n$|${3¡S!ѲD}3WP?Ȥf!,$ lH,ȣ%k:Ш4bNXو 2U,BXb&YUh( db9A1.bRqO" 11 .f+g1[N%g.2ft$ZQb1Mf gPN1#t.O)g.++*O2](N1& N2M..2N2 2eHE‹*\p ; xmlCoffeeCup`eVArial V2   GIFfGIF89a&!!!)))111999BBBJJJRRRZZZccckkksss{{{{{B)!RB9{cR{ZB{sR9sRckJZΔc{RcBB91cRBB1!skcRJB޽kέ1)!sZkR֭kR9kJZcB{RƔcsJZ{Z9ΜccsJZRkB{ZsZ9kR1{kccZBB9c!!1c1cc!,&@H*\ȰÇ#>܂%K-`ȱǏ\9r#-R\ ._Tr8ɳM@1(!Л h09P#O JӪ+5"ydW\"Ikװ^vݱe- lz`3l|oX68$l#@ RNB`"Zzӧ1n1ujj_X,찫D){o>\ BL\@u *_Iׇp$t+p|E@.}f=~nUJ$ [0 @F @pFxQI[x6%d@T ja:"FTLeŎ1eUXe#4IM Ӑ3H#6]MIeLeY4pYel`Q lasm 0@5i@ I 曅@nn[`0I@!tɛZ$VZ͇j/~_ ; X" 78 /e mm6:_;B 9k8 z`nkr˗|XcF&ky[} @P> Ay,uB/M A1K(\ A/ D/@J0J.00%mƟɥ8=Әzx@KAhh@ d(Tt5n"W赁 39V!ғ@͑H$ "R4.隒ARudUn[vSHW8Up#xKKFi?b>hS t>Tꊅ֓9VWEJo LeN|lq@ $:s% GPP@[D`p fEcFYyT$0n~[R0ŀAU+qm &P4ͫvefBv5!WZfc͇%< ? (HZ@aE0~)L(Bt *0p c ?B $AG_7ťf\aaRw#ǐ" .`A++@ FÄ1k  ,+.!a D8e 0Rt!d,f-ϻt$Gn 0 i0hlAM[@ FDH$ hH #cJmL[ʹ MH 6mɆp.< "P#"h$͡Fbv a 1%b邗ABW0!xQ Y V@r HD RN%@L %~:YOO| ; GIFfGIF89a&!!!)))111999BBBJJJRRRZZZccckkksss{{{{{B)!RB9{cR{ZB{sR9sRckJZΔc{RcBB91cRBB1!skcRJB޽kέ1)!sZkR֭kR9kJZcB{RƔcsJZ{Z9ΜccsJZRkB{ZsZ9kR1{kccZBB9c!!1c1cc!,&@H*\ȰÇ#>܂%K-`ȱǏ\9r#-R\ ._Tr8ɳM@1(!Л h09P#O JӪ+5"ydW\"Ikװ^vݱe- lz`3l|oX68$l#@ RNB`"Zzӧ1n1ujj_X,찫D){o>\ BL\@u *_Iׇp$t+p|E@.}f=~nUJ$ [0 @F @pFxQI[x6%d@T ja:"FTLeŎ1eUXe#4IM Ӑ3H#6]MIeLeY4pYel`Q lasm 0@5i@ I 曅@nn[`0I@!tɛZ$VZ͇j/~_ ; X" 78 /e mm6:_;B 9k8 z`nkr˗|XcF&ky[} @P> Ay,uB/M A1K(\ A/ D/@J0J.00%mƟɥ8=Әzx@KAhh@ d(Tt5n"W赁 39V!ғ@͑H$ "R4.隒ARudUn[vSHW8Up#xKKFi?b>hS t>Tꊅ֓9VWEJo LeN|lq@ $:s% GPP@[D`p fEcFYyT$0n~[R0ŀAU+qm &P4ͫvefBv5!WZfc͇%< ? (HZ@aE0~)L(Bt *0p c ?B $AG_7ťf\aaRw#ǐ" .`A++@ FÄ1k  ,+.!a D8e 0Rt!d,f-ϻt$Gn 0 i0hlAM[@ FDH$ hH #cJmL[ʹ MH 6mɆp.< "P#"h$͡Fbv a 1%b邗ABW0!xQ Y V@r HD RN%@L %~:YOO| ; GIFfGIF89a&!!!)))111999BBBJJJRRRZZZccckkksss{{{{{B)!RB9{cR{ZB{sR9sRckJZΔc{RcBB91cRBB1!skcRJB޽kέ1)!sZkR֭kR9kJZcB{RƔcsJZ{Z9ΜccsJZRkB{ZsZ9kR1{kccZBB9c!!1c1cc!,&@H*\ȰÇ#>܂%K-`ȱǏ\9r#-R\ ._Tr8ɳM@1(!Л h09P#O JӪ+5"ydW\"Ikװ^vݱe- lz`3l|oX68$l#@ RNB`"Zzӧ1n1ujj_X,찫D){o>\ BL\@u *_Iׇp$t+p|E@.}f=~nUJ$ [0 @F @pFxQI[x6%d@T ja:"FTLeŎ1eUXe#4IM Ӑ3H#6]MIeLeY4pYel`Q lasm 0@5i@ I 曅@nn[`0I@!tɛZ$VZ͇j/~_ ; X" 78 /e mm6:_;B 9k8 z`nkr˗|XcF&ky[} @P> Ay,uB/M A1K(\ A/ D/@J0J.00%mƟɥ8=Әzx@KAhh@ d(Tt5n"W赁 39V!ғ@͑H$ "R4.隒ARudUn[vSHW8Up#xKKFi?b>hS t>Tꊅ֓9VWEJo LeN|lq@ $:s% GPP@[D`p fEcFYyT$0n~[R0ŀAU+qm &P4ͫvefBv5!WZfc͇%< ? (HZ@aE0~)L(Bt *0p c ?B $AG_7ťf\aaRw#ǐ" .`A++@ FÄ1k  ,+.!a D8e 0Rt!d,f-ϻt$Gn 0 i0hlAM[@ FDH$ hH #cJmL[ʹ MH 6mɆp.< "P#"h$͡Fbv a 1%b邗ABW0!xQ Y V@r HD RN%@L %~:YOO| ; ngif GIF89atTT3!TʵڶHT۳NܜCѪ/ڊH;9ՂFw5l f~;u?~|pt-}}}y~wfafsyvnrvtttgkp{\l*eitfffsbQH\`jkZI\\\QmNsWZdk[MTXaNRZfL2I]hHHKR>]DGNPC;f< PC.ACJPC'AAAo9llEx~8 8ޏʨnGq < 7O,` p|,ΰ緸(|D{< G?}WP`&5w+6м<LPP Oz^36x@W2 $젂"P+ 0?m:B{:a YaL >$|Dawp G_mbPBn 7 uXa =#_W,cm@,b&VA.:a c la _Ȥ&7iܤ(0P8!, @9/tR%Nxs[0\Sn 27ܐs Ȍ X+m z} sa>j8KiS5), `*P ӣ.}K-hCR{X#U]9j0%9wQU*V=XXTg-g]iSxJ?#GQG01d.QY] R1b%ĆXlnRF0̜#H1~!1͌}Fýu3gB@ ]wT c&4t27I'%Aq |ؙ&D  JqRLsYRhL2lD&;k2!Pe3(*Ӡwa Kp>ġ5'E63mN>|ww95NW0&vCc1  Ajyh?O#/­uV eJ0yO.'ه9:˰~{܆BGC@Nx`  P`wҔJCO'\!lA׽^q.!~ &V5C P8œ <.X<ջ$7yJ\C yOJa5ONЊܯ;Ip“6{v!8}ωmO輭zQ^MXڅtJ%+ 7W|0T~t%bpzuNe(4df_5|epZJgbNc_RT~5'Vi0TLj~[Q>"hmgSRm/A"8") ''` QF iejMyEV0jd>łe O4xNszN]5%NR`5c7SwzFp#^(t``(i#XH`'-&j/ 5h`RZЎ}~Cks#gcwx^`CU{X pxxHFeوNiPW-vI-6h)JX= VufNZ;Gc Im_kyJ_5mNUymXxJ)r*1'[NXshZ樓[5`ZO6h6Хy%HUF)KMwvi_5j_ _i}3@"B)5{`j{O{f5Z4ZNxW$j_ڣj5Ⱥeh:||pMp"؎kNʟ#۰TiSg_>ЬԊ4Me*g"0vU}fzpt@/8 ȥ7H'8[@TI)gxPwII>_G^ҙe6zh;q`r)f"iɲ&R.{N*nD;=vBI({.۸N3b'pDB9mU{(҅a4wkN%djW;ɶK5PRt%٤_VZ[W0 %nHX_0PeKX;Skp6>@QgPN+2t^5j:SJG|^m 0Լu;g0P /Ż<[ۛgS{tj O%XäjB HԵ0Tpm$v+yqzujZlz[܀6|;{m~kx5~n*_kN!5U-*+/;KkPSbk qQmGS| 1'# ,dƿ|< [*Y [|(Iyn OqY8]0k0 "5pq@kP’L[[9>@` wۼsf&}oܲ*2͈Ȍ :awell-m;\i܌ xǨ_.0ulޕ9GM6 f痻NlZ#PH0u4) oPn}'8f2]&^p(0|z-VuK7qkn׽#ț;{,+C>e]a`BZd:@h}݂@@F`'qNi1) W Rsŷ0 ^^\ƹ^,>>YWx>"Pn (_G0nؾ<qm_WԼ#*)K1"ek_;K@=Q~ݓ}VN{}u<ֺt&(\N}2}0Nr(PT?0XXB/*QIZe Y'e2gN?%a, 9*N_Ҁ#eq)_3,CUn_{焫sK`Z0B,AouZyV(coO"{NzO(K[0O6`&dWhX(tx(22BXxg2&%tVbS֧YȗRbwZ%T""r Z"uӲ[[Fח&8Ң#`@.>NNmݽ|ȇ")I‰fq>0Hć4 !0ƍDCH!=BfÇJ6trdIi#G%^1ɓ-RrDKĹCA/^< Eј"gP<B{,aG-jHITm4WHر-iҪM;"J2p<򫥃񪽳oIi_0@ʹ'{.8k|:\ZH /@%g:iD X0XQbɩ"vϸ]z'QoaIwҫNJ__F%^|B :,X W# 2_ %W ``qg 2U i %U\4V(6 Pc碉'ڐ}!D֍[7Ֆni% F  ߊ!r.-.~Y)t)Rؐ hn( )Zb(fȧUZ BKHa1OsjFAVƖEAvZ* ]"I9JnŒBহ oKoB Bګ+,N[XlecHh ZlQI+413_W"Lr&ǻ JA[Ljp}dɨ""|ۨv| N8MuV_*# b3yBesr6,F,.m!}HMrs$z,K{Nx%H, cKRyjBWцFhĆԷ!z iN{*U!㠿pB6@wkoѰ-D5tI1-}ıD ^AH:7?{$e?3܏K|k@=sIl p`;5h5:Ȉ/3ײիXɵׯ`enQ4JCԈH"D "*bڴH$G:m8/߿s KÈ9V6DH-p ε9HKN MtS^z`fX!DF=5pqg5MU+_|bM͘NyI-7wLjz_XPOd;a JCyHGI9\D wށނ 6X]|[!d`a Aǔ5N'9%⊶0 :a2 mYx_6x!hp)PJcVB%CYnNp:I:Ub)T )`]lCPx&f6`Df22yMgJ8I8tǎnF詥-説*7Q-xP[v* bj&ث*_gԆ_Z&&I+n>*k_1+) 4 R+o){eTD.+3mPHЀuZr)fIȐGs:v 0 )dVow:8df_h8JcK8> \p&R|"xE7Io+CJСo#)HKGF8 Hj 8>b Xw8P +^ X P&#b)Q<8mA>ʈ'9E,?܇+aINdyK-N 8p@8e^7JWjHA4S%sRFq{ZxZ(;% G{DiDL?kG0V*00/~k%n;t8Qp|~n rew4PvnȄ}PC0PE#=?? !c]c)P}))LH6%Ӈ/xUUV- ‚^\'xdJh~pKX~|.Јɗ8b!bX0}KM-$>Pې A<`]"2n%dŏЃQ vp=|=` |`)x'{a ɑ3`B_X$0/_M<GI$e`q]$臓Ɠ~@9Bi8IF)I(fpOPsJiw@Ш8`Y$0p(0D8 0PI]^%MYM v b!i| TKKʁʹt:zcQF9Nل}nQ:K 6b=Q9~%P'UP]0VPm6a- ) zX2%ɡҙ760CL;yPPWYwEgF D7#Ibj_U o rk0_@)B`)Reت[N2Qd꫿3fDpYq*j8Ge@{`vڱ}U:*PYz"  BM*HyMP}3:p-2 WiX Qv 3@i!JY1Д`28# FcЩc0 d@+"K:ʮ-b?Ur1EbL괪#S3fGtY d8Ե_ a}KLqjnC_Ыd@s_a+G .`)jнB%= ¼ @4HmFAVFP2 : +c[ S״8 Üӛ$8 ;"{n:R&A,'  5 +;4:KvvAsvr:)? qD `@E `w S@6:0JW2tM^rL0C--ӻf*}0MQ)GGQ? ݕ_@̼Z͹i@ @g"pap20]ކ=_@`*Щ?@iYcpY$2ąxYEBW@tt$:*Pq=ôJg`)H? }:@`m8cЄ.s2'UN C.I.ݩ=TjKbԝbd.ߝJ d^ Ӧ\NY)K_T8N[p bm"_@N CTmK2{\]_@`cZNgeй<޽.˿Nr2=N00 vzƴF}fLQWL@-_pc`ia_aA@⺳  M~>zcއ `pZMG 6gתki;>."ݩ}3KB@rkDo,pPs,:Bb}邠CBp6?XM?]/ ?mY[lx;;׫pVOF g3" tm(h#&'hu* j+k8bjBlMEJ>̍%c\u.p~h%81(J%*8?^~aq$227撣EӺAhÍD1v|D=J;\uFb<" e`p-bUfBso%7" 3! ^fҗ√.xQ]b,oWe0gegWndH0L;*0%Rn5SzpgAs !)"`݄ƇbI;!_D#)1}|T)j(ivN9o`~p@Ӟ[N裗.5)r\ ʍ?Rf1.+TH4=Q16=q˛rƽ]pzC WBi`.P('?O=@Gec c1Nت>?\mB@โ ѫE)VFZ\H"&`kD{QXHdx:O;a#lAP=QIBT|S0$$iD52BEI.!$Sx-"@"Is" L m.w)Av.7 HO)H  *3\`"CoXFX!4-B&q"')DR]Nd&="yMBtreSD )DC-6A ib^8pf (V?04?TH:8bz/, 55@$#ԧd60D 0p frd*Ux#rL ԕ.ZbV` it 1K^T!` J}iLt1kBPZTnB<9E hG+YT7Fֶv\3FX/gшĐ>T (ou[ ݂4Znu+eiR%.ˍruKj ٝQ4{(T wF"K&K_/@ f?VB#d_"F`iAQp)L ) 6_W*ql #j@ 054LcӂZSdl^(HN27a,At3mJLf2N~P*yq P-ozá 2πt1YVN68H !؈0dl(p~Zlحd :PcC  nTB@a6l! R7Vj/\@^u*hXp2kRϠC}@SN}Btbw9۸sͻh ̷ĉ-YμdУKNukν;b-helpgif GIF89a?þ{{{tttfffTTT.\:::333)))!!,?@pH,Ȥ)8ШtJZ `zx͒49hۆ|Nj\Y Ys xx~} ƫ Y Y    e@t  >Xȱc( ޻@ 6lA0p!W||ž&ݘ .l@)ӦPFMRK<Y̡I 2q)Xu'O*v v-jʵׯ`KذhX˶OpʝKݸ˷߿;b-servergif GIF89a7þ{{{tttfffYYXRRRHHH:::333)))!",7@pH,Ȥrl:ШtJXجvz8k( znԃ\>۷|`p zk  j y z!  zN!!    M Ϸ  8x`MA :D`B sBn]HnÆ6XG5xtiXOЕ.XfZ`RsaihꂀO$ !pgx|矀 Рj衈&袌ģF*iTj饘f馜vi*ꨤjꩨꪩ;b-toolsgif GIF89a.̺{{{tttfffRRRHHHDDD:::333)))!,.&dihlp,`x| F,ȤRlaZجVxL."]|N{~zQquoo^  Q.      . ں1 p t@MpA]JbjPSly@`D_P"FR ThKbf$fgw J !`E* PuիXj*ׯ`r Kh^Z˶۷p^@ݻx+ ;b-webloggif GIF89a6û{{{tttfffWXWRRRHIH@@@:::333)))!#,6@p8Ȥrl*ЄAEvzY8@.znm~ned  w  v d eWW"""!§ bb P !O!!O " RR ! "  " "K`[)Ad.hUA DxI!\ -B)ApUއ BPpB>p 1" h@ŃMV)% "C ,@I9X0VmwDTO)D ! D-$ &… pp8qr9F!K8Y8+z1C墧K[,6 ^kMl_( (_΅[ (@سxP*kO* ZF𩤟O~tϿr(g5 2F(Vhdv ;header4kHeaderBGDgif GIF89a.\!,ڋ޼;VArial z2DD Mgif GIF89a csR!k1{{ZZZck:R{!)11:c))ZBssscskkތ)11!B{{JZ111RŜ:J{ŽJJJ!Jskν֭ZksR{scc:kքJccZc!Zcc)1:kkcJJŭ!{){:!ε:RZcc֌ZRB1RŜc{ֽŭ!BcRRZkk!ޥ1{ֵ{k:ń:s1浌Z)JkkBsνŌc:ssk:Jc!!!B)1ֽ1Rc):ssJB֜ﭵŭŵss!!{{{{css)))BB:ZέJBŭֽ楥RRZRZZ!1{))!)c!)1BBBŽZZ1sR{Rkk!!!!s){ss))!RRR!1! NETSCAPE2.0!GifBuilder 0.3.2 by Yves Piguet!-, \1|H~ DHL`aÇE!HB Ɠ(;*DR% c\)DMA |M.+N bpD!-, XH &H01BŋC3eTqH[#IrhH(Kv1DL LE(T濣H_!E !-, `H !1*\d\HB CddG\|81(SD#bK>i# c'H9KLr%͗0eƔ鿧A!-, wdEP \p1N[` |`5CV38&qc$|@;w本sI?|Q#E :ѤJg6%pf&FYLZip?!-, xжV\(PUa\BCG"D Gbx*`` \pϙ2SF`&VD"'G"A#a.D(aETf[8! B !-, f('AC: iϔ &G /p"$ 52Nax "K LQА$\0fD<4(M 9 ƁJ!-, \ HP *\ !BzPq dh` \TP(G>q+ "1&hb 25rt ʌ}3 [&5QS!-, sQ(\ *UB P 1J" *>2 LLQ!nf Xȉ<%攰 He$QYj(2aA 5DX0 !-, ^ࢠ.oZA-QP!C\hƄ $Ab‚R~4L"@Ǝ jHҤ͐[tA>-!-, bGAGz 4HQ tN,g8В(hiE?YT\(dFY(QŸ y<$--UP=0fHa@!-, >HaİB9"Jtx8p"y8\dcC8 #22YdI29`@!-, L HXȐA 6|x j.^Ə8ZCHJ~<EA/.dfGN,<!-, b H" 'Çu$(Sŋuǎ "N@F(R#60Gd)r#IV@YrǏ!%L@hьa\*1>=x@@!-, GTkU h"PS„H! '8aȑ&vPi 2*"ʌLSn@@!-, :g)Р96Ć"64'# eؐKň}@Yp˗0!-, aHf*İ̬7 &(L(c1"c"UifBHUA%ʗ+9C̒1,hV) 2Xj%@iRB>Zq"i: D;ftpdirgif GIF89a {{{_`a]Y__NB@D>36;26;/38-39,29+29!*3 !##'",!)&6!, Hbm=JE "i6IK  wl* 9HʅVUd,X2#;helpgif GIF87a ɹveQw7iӹwi9S$, =#cN,1܍%~Aؒ*dYh#dedLDΑ;listgif GIF87a d݄Fd,V:q@@@Dzz, -`%h*P*=eSP\-d!qg"hD;mailtodgif GIF87a }~IJ, -h0q ("\HgqhekɩeFaH,;moviegif GIF87a d݄Fd,V:q@@@x ]T%@CCC, ;UPi%R+E Y4Ӝ%Tz.iX"{BGy;newgif GIF89a}}nn\\FF))!,T527 0ZX[)M$]WHpI |HB BP4Dv\f8Z U$QiP֝];newsjgif GIF89a T%z.M!, +jܮIL ŰaB8r'41\m;notegif GIF89a d݄Fd,V:q@@@zTTTL8!, *$(j

`&dl+=$tztRT>p¤8r1B9.xFht;private|gif GIF89a 撵^,Z!, %2@--FHxa&j0lbYڑSE_;qbulletsJremote@gif GIF89a 5Z1Rc:T|{y{{yzyyyxwvrvtoZ1Tc"Op"Gb9H,))*((%#%"$ -?%+((!% )  $1 # )   + !, X@@AR DP@0(,l`;0\fx5L춭jy(#e !6/K '1, BA;script^gif GIF89a _t!, JB'`ՒM}IzXJ;scrolldo\gif GIF89a u0s5!, AȰM,i5%Zio&;scrollup]gif GIF89a u0s5!, N0 u@I}f B`,/ ;search3gif GIF89a ⵈлŭܸ÷ѩ]̛Ϛҗѐ`:~zwvytwuolhjbfqr`YiiWWWVQUjjR^_J``/33/("*.*!, L@:$I`N$beaD&BH $MZP‘+D٠% %% 2 2!;vrgif GIF89a ™QV\-03f!, IHC%3 1i@8懦q 4M5r(C#>BH E@,Fd|* OHÒ3:;gif GIF89a"2{{{{{{{!,"2@I8ͻ`(dif&kRi[AfGA 70 6 첊ZVZ5 h($M%H3izk^# O;WqxjU7@EU2MQ3EX*O‚Xȭ͑bʼ׋l݂0SvzjF A|(Jxb!Ç B"-Ȝ%&P2.'h2haБ%p`:~qS[ώ<q 3C!J%Vt5M@UR òeJ-ZhTSd4`(15LW1e<I.]ȜDVMBW&eV2TeUhͮr )j~,lWONV"X:PlaX5dzv>{C%;O}Ǻ]XgG+Y<D ͲvOg˖$!Cw|,V_ǭ߁-F(b c%!e]WxeFLd}3WQi}WCYjh}[߉Q[* S~6t<7#ل]V.8/Vb/36V#~:hፕӘ哐6٢Z,z)sVaiBrk&ld^d) H% (4♟$ fQՔl!$=*.j"*무iZ*~TdXY˶EE(m^)"$l4.diZfc ?l6Y2(ɤPDY^i'l|0Vk/  /l!ˁ^w@`^70fma20 7K/" v(6Q`+]鮕R0Xn3[M֖mX _[/\k)/Ͱ_-BJvԖ,SIE<piASAlncZ@+7 Wny6\o9|y_Nz[髳zꯧz쒟:Z.WOU%h`-?f#~Fg^#[-|7=K<74Z Ip(Y2̷7T]rTdQGLty,4a9԰k4^v))Qrb6 _LfROTcFWx]b^CLS, 3i쏅AsmK_2n|$b 9JX[[EG}LBLBGA@A=9 ;U9$=NRFbvWG&/!%AGOёaФ VR4;html Text Color
 ]*]̱ ko@GLXY_HNlz backcolorgif GIF87a",O0ن6^!7@Y"{\,s]4"q`ŞGBB5$zxI;boldIgif GIF87a,$T*ѐa%V:iJL;colors}copymgif GIF87a,B.|H"5[}@M X@2b^jĚ+$(C [jkj;cut\gif GIF87a,1đpj(UHYdBlcB,@v}N=b(; forecolorcgif GIF87a,8\CƧmVS+!ZsP 4"з(;indentVgif GIF87a,+˭ba`t Xlm6P! x !qֲ۬bnw= ; orderedlistQgif GIF87a,&/фV:TTٹ~g|[;outdentVgif GIF87a,+˭`霢Ii ZӍd:];undoQgif GIF87a,&4 \8m\ 9#xG:S; unorderedlistOgif GIF87a,$.[Qsr&Uhrɶb;VVerdana 2RG U$ӽ`T  ! htmlEditor mozillaEditor`>:VArial z6m> Vgif GIF89ap0ӿܽżֵֶսijЭӮЬ͵ĥ̦ǬTťͤIQ9ŋy#5|o~{Fu}~frtbkujk1o d{{{b}h|f[byf8ZybvXvVf3YrSrQnZmPkWfffLiJfJgJIdFbZZZB[CYL*aSJDI%;SpC%7M|JJJ: PD=~2BBB5NH<5f3p-333(;###!!},p0TRJEJTRJE XlB9ˑ ԄŇ([M4/)V-Yr>6@+08e&.<Ѥ&W(_μs1}W~]Զ /x UCa:O=t`X.Z4߂#m<>4 6>7jF!uewiFaMИ41f(4h7B8h}!o\qh҆hPB 'P1!0H )_~ 713XF㜨Yal 5@ 1԰B!H` @@0椔V/hR'm0gZ 1@Fj鬴& M0i jq¥$" ]V *i @ώ@4ᦉ::}(dLz 1Ī`ͺ*+ @N /ĸ&wbyw'P CF,@ʥj[ǀwj n=t.ĐbL t˹*t+7طaFq=+.p5VjQ@@G/c=k}4 O F2pb$xo@HpV0=iP8%"c)9ͅ|,WZr:@*x;{t9.}<+tۤ0LLޖ2F&%hHX(6͑9"J_ 9X Jf0ɡ d6=xTyGE bYS LV>#L}[RP0D! V8`@X;؁ e4Xl@CW$fGpIDPS]PVkP3W-;amngQ8x[gl+'Qt+ t͢w*+Z&RpP["UAo>ؗ{Zj(AOjh%Y(OCD[ȻIc{m 'punI,\gdjM_)'#V!OVі0o8xp{7R01Z守P֫pֺK4mފ`EP';aRonU+W?C ; Vgif GIF89a0޿߼غݷֳܷڳԮ׮Ѫ̥ӥΜΜƖ̖ɔ˒ĎǐŌÁ{{sz{ttvonqtjkfnfj~b`|bz\zXvVuXsYrSqPmRmViLiKfHcKaE`D^G\AZDW@V;S;Q}7M|4Kz1Gu!W,0@ڃ86822/'$$! H*\H7ΕSN=}"<؀ $@`@ ˗0cʜI͛8o2ɓ׏mHl 9~\0d,sJJիXʵׯ`KVsuЧǐP Jݻx WHؿL7s/ːAGqK˘i g\?ÕK.װ/sN?;CR$ LMt(_μ-6pBËO^jӣξrԹZgv$d!l[I|Y@ 柀曄(}O8 SK j饘Ħnħ**S:UZ]L8 *e뮼į6Îj짦r_88@QJHh% ⨣2Ԛ[t;䮰 Bk.Z;'û`+GaOd4 (İK*l¹!4ꐼ0pH@M 0 00$,)ܲ=U#?4 >@<-v), G l+Knծ"58/A+0 (`9-{L^2ǚz 6o'  /Kn/}{&: Hkǧ's;A􋓀F~ۏG'BǸ\@u+ʦSjGAxE,Ѐɀ Rp+(`F pBn 8f&@ 8HU \)Xa )h Wg\h j0.zцˡi& A? &<%p]P:N1~l@ vh]PAR؏FbJs@@;M"P 8hA #4Q@VR) fIY|'w@X!/؀f:PHjIE&r Lbn(Ir$5Ӧl d7Hķ>=suʌ`^X>P&9ꤦ艃$lF7 L`XGd }MJ-$ pA&G4 ]Nw* |rx`MeHMyxCX@2ԪZ8- h'+ծ'; gif GIF89ap4IT*FS4սʭ޻I˵Tŭ޲KΨ*ȤJ(B.1ҍt t|z)f%bjpr|~g~fyyzx/bgx`zsss`a klnk*\}hVfffh V\[[\MrhZ"OiBYbTIK_P8^O1PQShRAaJJJhFh@ 3SH9TBBBQ9::;1H333,85/+++-# -! !,p499| Ab ;H+hhjd Jc:|$IÅJYWb5-b݂;]5)j9W?75ulId֬ys3 plĉ %VPƂ7RpF3}VRXč.0@`MBh@ԭ`gw;tVHxKxavvU^}1|~=_XVg4:B =dHwyHXy>0 8]ч{u +6(c} eE,t "J8{VGNWCe2J4܀$DUaG?p[n dH0Gng7w}t@Z_*("ФRZtiԨpqNs|!"tF XAFe`rWcfD Tp@F[i oqEuk0MZh"h+ `5,o)*i$œwZ -j͋2E;aĬN4H2L'(WqGY\:fn,6:O {@Z@tJg ǞJDyZ'.`CqAVc GD|K-\PV%:պE+$`Vh /q*F{vXAGA #͚1%7o6ڍV$/?-o@|`~ЁBBb^# h `hSן,A HU=Ё|?geF)B؁ pvk@*v pNm 4"bBz?=@܃?ؠ|s\p"XF9  CJ$B\_J`  6 R< lǣ u@@%ꀐd XT,JdFXG"z% 4 uC ɰdJ|$*jdzgAP_PS {>/.c=^cM"ܤ2`frJFnx )l67P> xIN0ʨ Iz%@3IML|AD>\@eDr@BE)#p$3?` G)SʁKO F`Q< Ff`5(OX ZT MP4^5gXiF0*#nnjd>4x]BWaG@ˤQaXޕ.gdPW,4լ^%r-i(3gm-9e[ֵPZ5.h \4`FSӢhȉ,\֥ם+"`t(;^ӰeU :GNǐ^PYhT5 ^d7%<Nq3$p@Bբ2pADI0a$3K^pedCuV2؊{c ?;IS8\3_LJF "dws9ʟSDy n~-VT\feFb 74/')$P|"T Õ@hr& p` Q.9I '^\fcˇj5)T$nGV Lucida Grande2f Verdana x)Jx)J'?LANDmac apacheIcons icons logos mountainBanner qbullet disk form ftpdir help list mailto movie new news note picture private qbullets remote script scrolldo scrollup search sidesmil smiley smileybl sound telnet text updated vr toolbars weblogDefault (((((((((((((((((((((((((((((((((j$&j&j  linetextHomepath index.wsf`lO jL~GD'.C Y ^ 6 <defaultSubscriptions@http://hosting.opml.org/dave/newsRiver/defaultSubscriptions.opmlnews http://127.0.0.1:5337/newsRiver/ postToWeblog,http://127.0.0.1:5337/newsRiver/postToWeblog preferences%http://127.0.0.1:5337/newsRiver/prefssubscriptionList-http://127.0.0.1:5337/newsRiver/subscriptionsunsub%http://127.0.0.1:5337/newsRiver/unsubVGenevaZ$7Bw޿~GH  + 2> DP [englishR htmlColorsS^imagesoWprefs systemUrlsv=9Vw'.K  !9 Ez s author Dave Winer authorEmaildave.winer@gmail.com description1A river of news aggregator for OPML Editor users. homePageUrl'http://support.opml.org/2005/12/29#a423name NewsRiver releaseDateversion0.42= w޿w Mc>Genevaw޿ \ALANDmac on any (pta) return (newsRiverSuite.responder.handler (pta)) WdatatablG createdSun, 22 Jan 2006 14:22:21 GMT2.w޿w anyzրW.w޿ 3; C condition%newsRiverSuite.responder.condition ()enabledmethods{V Lucida Grandea2xGeneva_cLANDmac condition enabled methods any SASASASPM w޿w w޿w E:\Geneva ˿ LANDmac Changes 1/19/06; 6:34:03 AM by DW Start downloading podcasts according to hourToStartDownloads pref. local (adrdata = newsRiverSuite.init ()) if adrdata^.newsRiver.podcatcher.prefs.enabled if date.hour () == adrdata^.newsRiver.podcatcher.prefs.hourToStartDownloads newsRiverSuite.doScanNow () newsRiverSuite.podcatcher.downloadQueue (true) WdatatablGWW createdThu, 19 Jan 2006 14:33:59 GMTWdatatablGZZ createdThu, 19 Jan 2006 14:34:02 GMTWdatatablG\\ createdThu, 19 Jan 2006 14:34:04 GMTWdatatablG㐿 createdThu, 19 Jan 2006 14:34:56 GMTWdatatablGOO createdThu, 19 Jan 2006 04:01:33 GMTWdatatablGO"O" createdThu, 19 Jan 2006 04:01:38 GMTGenevaLANDmac Changes 1/22/06; 7:11:33 AM by DW Be sure that the init routine is called at least once every minute. 10/16/05; 7:21:21 PM by DW Created. newsRiverSuite.init () WdatatablGि createdSun, 22 Jan 2006 15:11:32 GMTWdatatablGॿ createdSun, 22 Jan 2006 15:11:33 GMTWdatatablGxXxX createdMon, 17 Oct 2005 02:21:19 GMTWdatatablGxXxX createdMon, 17 Oct 2005 02:21:22 GMTGenevaw߿w'?LANDmac This script runs every night. {w.w'.J  ". 9 everyHourI everyMinuteN everyNightL{:=GenevaA 3& LANDmac ct = newsRiverData.prefs.ctbackups++ f = "backup:newsriver backups:newsRiver." + string.padwithzeros (ct,4) + ".root" file.surefilepath (f) target.set (this) filemenu.savecopy (f) target.set (@aggregatordata) f = "backup:newsriver backups:aggregatordata." + string.padwithzeros (ct,4) + ".root" filemenu.savecopy (f) WdatatablGῇ createdFri, 28 Oct 2005 17:50:09 GMTWdatatablG createdFri, 28 Oct 2005 17:49:22 GMTWdatatablG** createdFri, 28 Oct 2005 17:51:22 GMTWdatatablG## createdFri, 28 Oct 2005 17:51:15 GMTWdatatablGAA createdFri, 11 Nov 2005 20:40:00 GMTWdatatablG createdFri, 28 Oct 2005 17:49:22 GMT w߿w w߿w w߿w nj.w߿w  ' ,fileMenu vradio user nNArial ٠٠aLANDmac on decodeEntities (s, flUntaint=true, flNeuterJavaScript=true) Changes 1/22/02; 2:06:00 PM by DW New optional param, flNeuterJavaScript. 12/12/01; 2:56:19 AM by JES Pass in flSkipMalformedEntities as true to the call to xml.entityDecode. Prevents unwanted macro errors when decoding numerical entities which are malformed. 12/1/01; 3:20:31 PM by JES Created. s = string.replaceAll (s, "'", "\'") s = xml.entityDecode (s, true, true) if flUntaint s = newsRiverSuite.untaint (s, flNeuterJavaScript) return (s) ݀ t=GenevaTTYLANDmac Changes 1/14/06; 6:03:38 PM by DW Reading list support. Before we do a scan, check all the reading list, subscribe and unsubscribe from feeds as needed. bundle //if there are no services, load the default subscriptions local (adrdata = xml.aggregator.init ()) if sizeof (adrdata^.services) == 0 newsRiverSuite.importDefaultSubscriptions () window.about () newsRiverSuite.readingList.beforeScan () //1/14/06 by DW local (startticks = clock.ticks ()) xml.aggregator.readAllServices () log.addtooutline ("Scan: " + "Hourly news aggregator scan", startticks:startticks) WdatatablGtt createdSun, 15 Jan 2006 02:03:32 GMTWdatatablGxx createdSun, 15 Jan 2006 02:03:36 GMTWdatatablG|| createdSun, 15 Jan 2006 02:03:40 GMTWdatatablGpοp createdThu, 29 Dec 2005 18:54:06 GMTWdatatablGqq createdThu, 29 Dec 2005 18:57:03 GMTWdatatablGbb createdTue, 08 Nov 2005 03:59:10 GMTWdatatablG createdSun, 15 Jan 2006 02:04:21 GMTWdatatablG﯆﯆ createdSun, 15 Jan 2006 15:51:34 GMTGtNArial IILANDmac on getDateString (when, flIncludeSeconds=true) Changes 1/15/01; 11:00:50 AM by DW Return the time string if it's today, return the date string if it's earlier. local (day, month, year, hour, minute, second, nowday, nowmonth, nowyear) date.get (when, @day, @month, @year, @hour, @minute, @second) date.get (clock.now (), @nowday, @nowmonth, @nowyear, @hour, @minute, @second) if (day == nowday) and (month == nowmonth) and (year == nowyear) return (date.timestring (when, flIncludeSeconds)) return (date.shortstring (when)) bundle //test code dialog.alert (getdatestring (date (0))) dialog.alert (getdatestring (clock.now ())) 4GenevaQLANDmac Changes 1/24/06; 10:48:00 AM by DW Created. Return a bit of HTML text that links to the NewsRiver home page. It's used in the security prefs page. local (url = "http://" + tcp.dns.getMyDottedId () + ":" + 5337 + "/newsRiver/") return ("" + url + "") WdatatablG^^ createdTue, 24 Jan 2006 18:47:58 GMTWdatatablGbb createdTue, 24 Jan 2006 18:48:02 GMTWdatatablG createdTue, 24 Jan 2006 18:52:48 GMTWdatatablG createdTue, 24 Jan 2006 18:53:03 GMTWdatatablG77 createdTue, 24 Jan 2006 18:51:35 GMTWdatatablG|| createdTue, 24 Jan 2006 18:48:28 GMT Genevaxӿx{ /}\LANDmac on getString (stringId, replacementTableAddress = nil, adrLanguageTable = nil, pta = nil) Changes 6/24/02; 6:54:50 PM by JES Respect user.prefs.language, if defined. 11/13/01; 8:58:39 PM by JES Uncommented the declaration of this script. Somehow the top summit had been commented out, which resulted in macro error messages in the home page for cloud links, status center and support center. 11/13/01; 3:19:29 PM by DW Created. if adrLanguageTable == nil if defined (user.prefs.language) adrLanguageTable = @radio.data.localization.languages.[user.prefs.language] else adrLanguageTable = @newsRiverData.english return (Frontier.getString (stringId, adrLanguageTable, replacementTableAddress)) bundle //test code dialog.alert (getstring ("aggregator.title")) WdatatablGx߿x createdMon, 17 Oct 2005 13:57:35 GMTWdatatablGxx createdMon, 17 Oct 2005 13:57:41 GMT d1 Genevaqs8PLANDmac Changes 12/29/05; 10:59:01 AM by DW Created. local (adrdata = xml.aggregator.init ()) local (xmltext = tcp.httpreadurl (newsRiverData.systemUrls.defaultSubscriptions), xstruct) xml.compile (xmltext, @xstruct) local (adropml = xml.getAddress (@xstruct, "opml")) local (adrbody = xml.getAddress (adropml, "body"), adr) for adr in adrbody if nameof (adr^) contains "outline" local (xmlurl = xml.getAttributeValue (adr, "xmlUrl")) msg (xmlurl) local (adrservice = @adrdata^.services.[xmlurl]) if not defined (adrservice^) new (tabletype, adrservice) WdatatablGqq createdThu, 29 Dec 2005 18:58:59 GMTWdatatablGqq createdThu, 29 Dec 2005 18:59:02 GMTWdatatablGqq createdThu, 29 Dec 2005 18:59:11 GMTWdatatablGrSrS createdThu, 29 Dec 2005 19:00:35 GMTWdatatablGrYrY createdThu, 29 Dec 2005 19:00:41 GMTWdatatablGrԿr createdThu, 29 Dec 2005 19:02:44 GMT Genevaw1=LANDmac if xml.aggregator.menuCommands.importSubscriptions () if dialog.confirm ("Scan is complete, would you like to view the new items?") webbrowser.openurl (newsRiverData.systemUrls.news) WdatatablGبب createdThu, 29 Dec 2005 04:37:43 GMTWdatatablGب6ب6 createdThu, 29 Dec 2005 04:38:14 GMT:~#.a Genevaӣӣj @LANDmac Changes 1/25/06; 8:14:30 AM by DW Hook into wsf responder with callback. 1/24/06; 10:40:45 AM by DW Security prefs. 1/22/06; 6:53:24 AM by DW Install an inetd for port 5335. 1/18/06; 2:21:36 PM by DW Initialize podcatcher. 1/11/06; 7:06:01 AM by DW Create system.temp.newsRiver. 1/3/06; 3:29:24 PM by DW Change the appSignatureUrl to "http://www.newsriver.org/". 12/29/05; 7:52:00 PM by DW Install a post-scan callback that updates newsRiver.root. local (adrdata = xml.aggregator.init ()) bundle //appSignatureUrl if adrdata^.prefs.appSignatureUrl == "http://frontier.userland.com/xmlAggregator" adrdata^.prefs.appSignatureUrl = "http://www.newsriver.org/" if adrdata^.prefs.appSignatureUrl == "http://support.opml.org/newsRiver" adrdata^.prefs.appSignatureUrl = "http://www.newsriver.org/" if adrdata^.prefs.appSignatureUrl == "http://support.opml.org/whatIsNewsRiver" adrdata^.prefs.appSignatureUrl = "http://www.newsriver.org/" bundle //newsRiver prefs if not defined (adrdata^.newsRiver) new (tabletype, @adrdata^.newsRiver) if not defined (adrdata^.newsRiver.ctStoriesOnNewsPage) adrdata^.newsRiver.ctStoriesOnNewsPage = 250 if not defined (adrdata^.newsRiverflCacheNewsItemsPage) adrdata^.newsRiver.flCacheNewsItemsPage = true if not defined (adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault) adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault = false if not defined (adrdata^.newsRiver.flNewsPageReturnAfterPost) adrdata^.newsRiver.flNewsPageReturnAfterPost = true if not defined (adrdata^.newsRiver.flItemCheckboxes) adrdata^.newsRiver.flItemCheckboxes = true if not defined (adrdata^.newsRiver.readingLists) new (tabletype, @adrdata^.newsRiver.readingLists) bundle //podcatcher if not defined (adrdata^.newsRiver.podcatcher) new (tabletype, @adrdata^.newsRiver.podcatcher) if not defined (adrdata^.newsRiver.podcatcher.prefs) new (tabletype, @adrdata^.newsRiver.podcatcher.prefs) if not defined (adrdata^.newsRiver.podcatcher.prefs.enabled) adrdata^.newsRiver.podcatcher.prefs.enabled = false if not defined (adrdata^.callbacks.storyArrived.podcatcher) adrdata^.callbacks.storyArrived.podcatcher = @newsRiverSuite.podcatcher.storyArrivedCallback if not defined (adrdata^.newsRiver.podcatcher.queue) new (tabletype, @adrdata^.newsRiver.podcatcher.queue) if not defined (adrdata^.newsRiver.podcatcher.downloads) new (tabletype, @adrdata^.newsRiver.podcatcher.downloads) if not defined (adrdata^.newsRiver.podcatcher.prefs.queueSerialNum) adrdata^.newsRiver.podcatcher.prefs.queueSerialNum = 1 if not defined (adrdata^.newsRiver.podcatcher.prefs.folder) adrdata^.newsRiver.podcatcher.prefs.folder = frontier.pathstring + "Enclosures" + file.getpathchar () if not defined (adrdata^.newsRiver.podcatcher.prefs.flReclaimBytes) adrdata^.newsRiver.podcatcher.prefs.flReclaimBytes = false if not defined (adrdata^.newsRiver.podcatcher.prefs.ctBytesForEnclosures) adrdata^.newsRiver.podcatcher.prefs.ctBytesForEnclosures = 1024 * 1024 * 1024 //1GB if not defined (adrdata^.newsRiver.podcatcher.prefs.hourToStartDownloads) adrdata^.newsRiver.podcatcher.prefs.hourToStartDownloads = 1 if not defined (adrdata^.newsRiver.podcatcher.prefs.hourToStopDownloads) adrdata^.newsRiver.podcatcher.prefs.hourToStopDownloads = 5 if not defined (adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures) adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures = true if not defined (adrdata^.newsRiver.podcatcher.log) new (outlinetype, @adrdata^.newsRiver.podcatcher.log) bundle //security if not defined (adrdata^.newsRiver.security) new (tabletype, @adrdata^.newsRiver.security) if not defined (adrdata^.newsRiver.security.allowRemoteViewing) adrdata^.newsRiver.security.allowRemoteViewing = false if not defined (adrdata^.newsRiver.security.allowRemotePost) adrdata^.newsRiver.security.allowRemotePost = false if not defined (adrdata^.newsRiver.security.requireRemoteLogin) adrdata^.newsRiver.security.requireRemoteLogin = true bundle //callbacks if not defined (adrdata^.newsRiver.callbacks) new (tabletype, @adrdata^.newsRiver.callbacks) if not defined (adrdata^.newsRiver.callbacks.afterEnclosureDownload) new (tabletype, @adrdata^.newsRiver.callbacks.afterEnclosureDownload) bundle //inetd handler if not defined (user.inetd.http5335) local (adrd = @user.inetd.config.http5335) new (tabletype, adrd) adrd^.count = 30 adrd^.daemon = @system.verbs.builtins.webserver.server adrd^.noWait = true adrd^.port = 5335 adrd^.startup = true adrd^.timeout = 30 inetd.startOne (adrd) bundle //hook into wsf responder local (adrtable = @user.webserver.callbacks.wsfMasterControl) if not defined (adrtable^) new (tabletype, adrtable) if not defined (adrtable^.newsRiver) adrtable^.newsRiver = @newsRiverSuite.wsfMasterControl if not defined (dotOpmlSuite.mdiWindow.images.newsRiver) dotOpmlSuite.mdiWindow.images.newsRiver = @newsRiverData.images if not defined (dotOpmlSuite.mdiWindow.pages.newsRiver) dotOpmlSuite.mdiWindow.pages.newsRiver = @newsRiverSuite.pages bundle //Install a post-scan callback that updates newsRiver.root. if not defined (adrdata^.callbacks.postScan.updateNewsRiverRoot) adrdata^.callbacks.postScan.updateNewsRiverRoot = @newsRiverSuite.updateAfterScan bundle //system.temp.newsRiver if not defined (system.temp.newsRiver) new (tabletype, @system.temp.newsRiver) return (adrdata) WdatatablGۿ createdFri, 30 Dec 2005 03:51:55 GMTWdatatablG createdWed, 25 Jan 2006 16:14:29 GMTWdatatablG createdWed, 25 Jan 2006 16:14:30 GMTWdatatablG createdTue, 24 Jan 2006 18:40:45 GMTWdatatablG createdTue, 24 Jan 2006 18:40:46 GMTWdatatablGdd createdSun, 22 Jan 2006 14:53:24 GMTWdatatablGee createdSun, 22 Jan 2006 14:53:25 GMTWdatatablGpp createdWed, 18 Jan 2006 22:21:36 GMTWdatatablGqq createdWed, 18 Jan 2006 22:21:37 GMTWdatatablG^ٿ^ createdWed, 11 Jan 2006 15:06:01 GMTWdatatablG^ڿ^ createdWed, 11 Jan 2006 15:06:02 GMTWdatatablGHԿH createdTue, 03 Jan 2006 20:29:24 GMTWdatatablGHտH createdTue, 03 Jan 2006 20:29:25 GMTWdatatablGݿ createdFri, 30 Dec 2005 03:51:57 GMTWdatatablG createdFri, 30 Dec 2005 03:52:01 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:05:37 GMTWdatatablG~BS~BS createdFri, 21 Oct 2005 13:59:31 GMTWdatatablGD=D= createdTue, 03 Jan 2006 20:09:49 GMTWdatatablGD7D7 createdTue, 03 Jan 2006 20:09:43 GMTWdatatablGD=D= createdTue, 03 Jan 2006 20:09:49 GMTWdatatablGD7D7 createdTue, 03 Jan 2006 20:09:43 GMTWdatatablGD=D= createdTue, 03 Jan 2006 20:09:49 GMTWdatatablGx2x2 createdMon, 17 Oct 2005 13:03:30 GMTWdatatablGx:x: createdMon, 17 Oct 2005 13:03:38 GMTWdatatablGxGxG createdMon, 17 Oct 2005 13:03:51 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG createdWed, 18 Jan 2006 22:22:42 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG66 createdWed, 18 Jan 2006 22:24:54 GMTWdatatablG__ createdWed, 18 Jan 2006 22:25:35 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG$$ createdTue, 24 Jan 2006 18:34:12 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG createdSat, 21 Jan 2006 19:43:54 GMTWdatatablGx:x: createdMon, 17 Oct 2005 13:03:38 GMTWdatatablGxGxG createdMon, 17 Oct 2005 13:03:51 GMTWdatatablGx:x: createdMon, 17 Oct 2005 13:03:38 GMTWdatatablGxGxG createdMon, 17 Oct 2005 13:03:51 GMTWdatatablG}} createdSun, 22 Jan 2006 14:53:49 GMTWdatatablG܂܂ createdSun, 22 Jan 2006 14:53:54 GMTWdatatablGܿ createdSun, 22 Jan 2006 14:55:24 GMTWdatatablGܒܒ createdSun, 22 Jan 2006 14:54:10 GMTWdatatablGܣܣ createdSun, 22 Jan 2006 14:54:27 GMTWdatatablGܧܧ createdSun, 22 Jan 2006 14:54:31 GMTWdatatablGܮܮ createdSun, 22 Jan 2006 14:54:38 GMTWdatatablGܳܳ createdSun, 22 Jan 2006 14:54:43 GMTWdatatablGܹܹ createdSun, 22 Jan 2006 14:54:49 GMTWdatatablGܾܾ createdSun, 22 Jan 2006 14:54:54 GMTWdatatablGʿ createdSun, 22 Jan 2006 14:55:06 GMTWdatatablG㑿 createdWed, 25 Jan 2006 16:13:05 GMTWdatatablG㣿 createdWed, 25 Jan 2006 16:13:23 GMTWdatatablG㮿 createdWed, 25 Jan 2006 16:13:34 GMTWdatatablG㴿 createdWed, 25 Jan 2006 16:13:40 GMTWdatatablGee createdWed, 25 Jan 2006 16:12:21 GMTWdatatablGii createdWed, 25 Jan 2006 16:12:25 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:01:39 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:02:07 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:01:39 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:02:07 GMTWdatatablG createdFri, 30 Dec 2005 03:52:29 GMTWdatatablG createdFri, 30 Dec 2005 03:52:32 GMTWdatatablG<< createdFri, 30 Dec 2005 03:53:32 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:06:19 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:06:25 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:06:30 GMTWdatatablGx)ѿx) createdSun, 16 Oct 2005 23:01:21 GMT9~Genevaw߿w)'?LANDmac newsRiverSuite.doScanNow () 3GenevaTOͿP_cLANDmac xml.aggregator.menuCommands.importSubscriptions () W*GenevaTL5L:'?:FFFF000000060001001777AA000000000065000000001001710000001-77FE6FFE180000048004806846200-106846222FFFF01030000100000077000000020907840632A2228B202CE00031E632A17C090716DE84032A6846222DD7028E00083A68466000020000090D00000000907, Public Domain Icons

Public Domain Icons

These icons were originally made for Mosaic for X and have been included in the NCSA httpd and Apache server distributions in the past. They are in the public domain and may be freely included in any application. The original icons were done by Kevin Hughes (kevinh@eit.com).

Many thanks to Andy Polyakov for tuning the icon colors and adding a few new images. If you'd like to contribute additions or ideas to this set, please let me know.


Suggested Uses

The following are a few suggestions, to serve as a starting point for ideas. Please feel free to tweak and rename the icons as you like.

a.gif
This might be used to represent PostScript or text layout languages.

alert.black.gif, alert.red.gif
These can be used to highlight any important items, such as a README file in a directory.

back.gif, forward.gif
These can be used as links to go to previous and next areas.

ball.gray.gif, ball.red.gif
These might be used as bullets.

binary.gif
This can be used to represent binary files.

binhex.gif
This can represent BinHex-encoded data.

blank.gif
This can be used as a placeholder or a spacing element.

bomb.gif
This can be used to repreesnt core files.

box1.gif, box2.gif
These icons can be used to represent generic 3D applications and related files. 000200000DDD00000907DD7,

broken.gif
This can represent corrupted data.

burst.gif
This can call attention to new and important items.

c.gif
This might represent C source code.

comp.blue.gif, comp.red.gif
These little computer icons can stand for telnet or FTP sessions.

compressed.gif
This may represent compressed data.

continued.gif
This can be a link to a continued listing of a directory.

down.gif, up.gif
These can be used to scroll up, down, left, and right in a listing or can be used to denote items in an outline.

dvi.gif
This can represent DVI files.

f.gif
This might represent FORTRAN or Forth source code.

folder.gif, folder.open.gif, folder.sec.gif
The folder can represent directories. There is also a version that can represent secure directories or directories that cannot be viewed.

generic.gif, generic.sec.gif, generic.red.gif
These can represent generic files, secure files, and important files, respectively.

hand.right.gif, hand.up.gif
These can point out important items (pun intended).

image1.gif, image2.gif, image3.gif
These can represent image formats of various types.

index.gif
This might represent a WAIS index or search facility.

layout.gif
This might represent files and formats that contain graphics as well as text layout, such as HTML and PDF files.

link.gif
This might represent files that are symbolic links.

movie.gif
This can represent various movie formats.

p.gif
This may stand for Perl or Python source code.

pie0.gif ... pie8.gif
These icons can be used in applications where a list of documents is returned from a search. The little pie chart images can denote how relevant the documents may be to your search query.

patch.gif
This may stand for patches and diff files.

portal.gif
This might be a link to an online service or a 3D world.

ps.gif, quill.gif
These may represent PostScript files.

screw1.gif, screw2.gif
These may represent CAD or engineering data and formats.

script.gif
This can represent any of various interpreted languages, such as Perl, python, TCL, and shell scripts, as well as server configuration files.

sound1.gif, sound2.gif
These can represent sound files.

sphere1.gif, sphere2.gif
These can represent 3D worlds or rendering applications and formats.

tex.gif
This can represent TeX files.

text.gif
This can represent generic (plain) text files.

transfer.gif
This can represent FTP transfers or uploads/downloads.

unknown.gif
This may represent a file of an unknown type.

uuencoded.gif
This can stand for uuencoded data.

world1.gif, world2.gif
These can represent 3D worlds or other 3D formats.

All contents Copyright © 1996 EIT.
Send questions and comments to webmaster@eit.com. 00040000000C000000020116E0100050000000B00000002016E000006000000640000000210920FFFF0A00000 10 10A20FFFF0900000 10 000700000019000000010201100008000001690000000240,Arial40,10407D104E44000321400400080101040, MS Sans Serif40,10004E440001210400010130009000000170000000231821D231821D2000A000000170000000268462226846222000B00000005000000020000C000000290000000243D4A91C27D170441017100000F0000005200000000400 10 4,4,094,A04,3B4,4,4,00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AAB4=a,4O3Geneva؛9ج;LANDmac webbrowser.openurl (newsRiverData.systemUrls.news) ?Genevaجح 9LANDmac webbrowser.openurl (newsRiverData.systemUrls.subscriptionList) _!V؛-'.G  ". :F Vb lx addRssAtts@ exportOpml preferences/setMinuteToScan subscribeviewNewsviewSubscriptionsvVGeneva|=XJ_i m Genevaw̿ZLANDmac 10/21/05; 7:27:20 AM by DW dotOpmlSuite.mdiWindow.viewMainPage Added code to handle redirects. 10/16/05; 3:56:07 PM by DW dotOpmlSuite.mdiWindow.imageRef New routine. dotOpmlSuite.mdiWindow.imageWalk New routine. dotOpmlSuite.mdiWindow.pages.viewImage Enhanced to do the walk. 10/16/05; 11:16:08 AM by DW webBrowser.supportedBrowsers Added code for Firefox on Max OS X. file.type ("macintosh hd:users:davewiner:desktop:opml:search.html") null file.getSpecialFolderPath Hacked it up so that it gets my name right and posted a request for help to the frontierkernel list. 10/15/05; 10:31:40 PM by DW dotOpmlSuite.mdiWindow.data.htmltext.main Change the src of the second frame to viewNews (it was ""). Changed scrolling attribute to yes from no. dotOpmlSuite.mdiWindow.pages .viewNews New. images folder Copied this folder from the Radio UserLand folder. This clearly can't be the permanent location of this folder. Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:www:system:images: 10/15/05; 8:57:51 PM by DW xml.aggregator.init Change the default number of threads to 5. WdatatablG~Hտ~H createdFri, 21 Oct 2005 14:27:17 GMTWdatatablG~[~[ createdFri, 21 Oct 2005 15:45:14 GMTWdatatablG~[~[ createdFri, 21 Oct 2005 15:45:16 GMTWdatatablGx(x( createdSun, 16 Oct 2005 22:56:05 GMTWdatatablGx(x( createdSun, 16 Oct 2005 22:56:08 GMTWdatatablGx(x( createdSun, 16 Oct 2005 22:56:13 GMTWdatatablGx(x( createdSun, 16 Oct 2005 22:56:08 GMTWdatatablGx(x( createdSun, 16 Oct 2005 22:56:13 GMTWdatatablGx/ x/ createdSun, 16 Oct 2005 23:23:38 GMTWdatatablGx/ x/ createdSun, 16 Oct 2005 23:23:40 GMTWdatatablGww createdSun, 16 Oct 2005 18:16:06 GMTWdatatablGwӿw createdSun, 16 Oct 2005 18:32:35 GMTWdatatablGwۿw createdSun, 16 Oct 2005 18:32:43 GMTWdatatablGw몿w createdSun, 16 Oct 2005 18:36:10 GMTWdatatablGww createdSun, 16 Oct 2005 18:16:08 GMTWdatatablGww createdSun, 16 Oct 2005 18:16:16 GMTWdatatablGw3˿w3 createdSun, 16 Oct 2005 05:31:39 GMTWdatatablGw3οw3 createdSun, 16 Oct 2005 05:31:42 GMTWdatatablGw46w46 createdSun, 16 Oct 2005 05:33:26 GMTWdatatablGw8w8 createdSun, 16 Oct 2005 05:49:39 GMTWdatatablGw5'w5' createdSun, 16 Oct 2005 05:37:27 GMTWdatatablGw7}w7} createdSun, 16 Oct 2005 05:47:25 GMTWdatatablGw7w7 createdSun, 16 Oct 2005 05:47:45 GMTWdatatablGw7w7 createdSun, 16 Oct 2005 05:47:30 GMTWdatatablGwҿw createdSun, 16 Oct 2005 03:57:54 GMTWdatatablGww createdSun, 16 Oct 2005 03:58:29 GMTijGenevaD]ELANDmac newsRiverSuite.viewNewsItems 1/23/03; 11:45:46 AM by DW If the item has a permalink display it under the POST button. 11/10/02; 1:02:01 PM by DW The element we were adding spanned the text in each item. This would, in some browsers, make the text be displayed hotted-up. Not good. Now we place the element right after the element. 10/18/02; 12:52:52 PM by JES Reduced the vertical space between the Post button and the comment icon. Added valign="top" to the table cells containing the item text. 10/17/02; 5:20:53 PM by JES Comment links are now displayed as an icon below the Post button for items which have a comments link. Localized comment link tool-tip text. 10/12/02; 4:07:09 AM by JES Localized the message saying there are no stories to list. 6/29/02; 5:54:49 PM by JES Generate the globe icon in a try block. Prevents the news page from failing completely if a service doesn't have a channellink or channeldescription. 5/13/02; 1:09:13 PM by JES Don't decode HTML entities when adding story text to the page. Entities have already been decoded when the aggregator did its scan. 1/28/02; 6:27:56 PM by JES Convert line endings in news items to CR line endings, so auto-paragraph expansion will work as expected. 1/25/02; 10:37:48 AM by DW Another optimization for the News Aggregator page. In the local "add" procedure, we parenthesize the text we're adding to htmltext, this triggers an ancient optimization in the kernel that doesn't do any handle copying on string assignments of the form x = x + s. Before parenthesizing average time was 104 ticks, after -- 45! More than double the speed. Worth doing. 1/24/02; 6:19:18 PM by DW Tweak for performance. Uncached news page went from approx 220 ticks to approx 40 ticks. Thanks to Duncan Smeed for the trick to get add () to be so much faster. We'll surely use this in other places. 1/9/02; 12:34:03 AM by JES Fixed a bug where the class="dwsTableCellHeader" was mistakenly added to the 's for the headers, instead of being added to the 's. 1/6/02; 4:00:15 AM by JES Added table css classes. 12/19/01; 11:04:58 AM by JES If user.radio.prefs.flNewsPageReturnAfterPost is true, add the referer to the searchArgs on the link for the Post button. This causes the weblog post form to redirect back to the News page after posting an item. 12/18/01; 3:43:14 PM by JES Don't add the referer to the searchArgs on the link for the Post button. This prevents you from being redirected back to the News page after posting an item. 12/8/01; 11:56:49 AM by DW Intro text says "uncheck those you want to keep" if the preference is set to have checkboxes turned on by default. 12/1/01; 3:00:09 PM by JES Fixed a macro error when the user has hit the Back button after deleting a story, and tries to delete the story again. Added a Delete button to the bottom of the page. Decode entities and untaint channel titles and news items' text. 11/24/01; 3:31:11 PM by DW Linked into help system. 11/23/01; 4:41:15 PM by JES Changed user.radio.prefs.newsPageDeleteCheckboxesDefault to user.radio.prefs.flNewsPageDeleteCheckboxesDefault. 11/21/01; 3:31:33 PM by JES Fixed macro error: "[Macro error: Can't find a sub-table named "system.verbs.builtins.radio.html.viewNewsItems".]", when deleting items while a scan is in progress. if defined (adrcache^) ...references to adrincache^ are ok 11/3/01; 10:51:00 PM by JES Fixed the url on the redirect searchArg, so that the page will load to the last-posted news item. 10/22/01; 1:55:35 PM by JES Fixed a bug where news items could not be deleted because an address was improperly dereferenced. 10/20/01; 12:38:03 AM by JES Added the menu searcharg to the mag-glass links, and to the redirect url for the Unsubscribe button, which appears on single-channel pages. 8/14/01; 11:50:02 PM by JES If storyText is not defined for a given story, skip it. This averts "storyText hasn't been defined" errors. 8/14/01; 1:58:42 AM by JES Add the post number to the path-part of the referer searchArg, so the page will reload to the same news item after posting. Archive: 1/8/01; 8:53:17 AM by DW Added support for the viewStories cache. 1/8/01; 10:55:56 AM by DW Factored calls to myUserLandSuite.images.imageRef. 1/11/01; 4:40:45 PM by PBS If displaying a category page, add the attributes at the top. The title and description of the category can be edited. This is actually handled in another script: radio.html.editCategory Commented out some debugging code (a scratchpad reference) that had been left in place. If displaying a category page, use the displayName for the category. Make sure the title of the page changes when the category name has changed. 1/12/01; 1:48:52 PM by PBS When editing a category, title and description appear at the end. 1/13/01; 6:08:33 PM by DW Only show items with enclosures after the enclosure has been downloaded. 1/19/01; 5:03:23 PM by DW Undo the last change, items with enclosures are visible. Items with enclosures have a media icon, if it's been downloaded, the icon points into the local file system, otherwise it points onto the Web. 1/21/01; 3:47:55 PM by DW Link the EDIT button to myBlog.wsf, instead of addRemove.wsf. 1/24/01; 4:29:55 PM by DW Show a checkmark if the item has an adrBlogPost in its table. 1/27/01; 5:01:03 PM by DW Change the EDIT button to POST. 2/12/01; 4:21:06 PM by PBS Link title for the magnifying glass: "View all stories in the [channel title] channel." 2/12/01; 4:34:35 PM by PBS Fixed bug where quotes and carets in a channel description would mess up rendering -- an example was Dave Winer: Two-Way Web, which has a description of You're soaking in it! ";->" 2/12/01; 5:25:25 PM by PBS Terminology fix -- when viewing one channel, refer to it as a channel, not as a service. Also, use different text at the top of the page when viewing one channel, since the page is *not* showing you the recent stories from all the channels you're subscribed to. Skip empty stories. 2/15/01; 2:49:58 PM by PBS Cleaned up. Mostly removed single-category stuff that was no longer used. Stories that are just images get displayed again. 2/23/01; 10:55:23 AM by PBS Terminology: weblog, not blog. 2/23/01; 4:04:47 PM by PBS Slight change to punctuation in the description at the top of the page. 2/23/01; 10:53:19 PM by JES Linked the Post button to weblog.wsf, instead of myBlog.wsf. 2/24/01; 9:40:04 PM by PBS Help link. 2/24/01; 11:35:08 PM by JES Bug fix: the default cache was not deleted when deleting stories while viewing a single channel. 2/24/01; 11:52:11 PM by JES Fixed cache deletion logic: When deleting an item via either the home page or a service page, delete both the default cache, and the service's cache. 2/25/01; 1:31:32 PM by PBS Set up a second cache for when it's not the same machine. 2/25/01; 2:26:50 PM by JES Separate cache for viewing single channels when it's not the same machine. 3/4/01; 6:11:10 PM by JES Reality check: Don't add the magnifying glass if the service's table is not defined. 3/5/01; 2:14:08 AM by JES Fixed bug where "default" is undefined when deleting a story while accessing the home page remotely. 2:D changesVGeneva|=XJt,GenevaIIpLANDmac on postToWeblog (adrargs) Changes 12/29/05; 7:58:20 PM by DW Add a "created" attribute to the posts, so permalinks work properly. Tom Morris caught this one. scratchpad.ptwargs = adrargs^ edit (@scratchpad.ptwargs) local (adrdata = newsRiverSuite.init ()) local (adrstory = @adrdata^.stories.[string.padwithzeros (number (adrargs^.idStory), 8)]) local (adrsource = @adrdata^.services.[adrstory^.url]) local (viatext = " [" + adrstory^.channeltitle + "]") local (initialtext = adrstory^.storytext + viatext) wp.newtextobject (initialtext, @scratchpad.initialtext) edit (@scratchpad.initialtext) dotOpmlSuite.blog.openTodaysOutline () op.firstsummit () op.insert (initialtext, up) op.attributes.setOne ("created", date.netStandardString (clock.now ())) //12/29/05; 7:58:20 PM by DW frontier .bringtofront () if adrdata^.newsRiver.flNewsPageReturnAfterPost if defined (adrargs^.referer) adrargs^.redirect = adrargs^.referer if defined (args.idstory) local (adrstory = radio.aggregator.getStoryAddress (args.idstory)) local (adrsource = @adraggregatordata^.services.[adrstory^.url]) bundle //link the globe to the HTML rendering of the channel with adrsource^.compilation msg (adrsource) globe = "" + globeimg + "" add (globe + " Source: " + adrstory^.channeltitle + "; " + adrstory^.time + ".

") add (adrstory^.storytext + "

") add ("") add ("") add ("") add ("") add ("") edit (adrstory) return ("") bundle //test code postToWeblog (@scratchpad.ptwargs) WdatatablGXX createdFri, 30 Dec 2005 03:58:16 GMTWdatatablGZZ createdFri, 30 Dec 2005 03:58:18 GMTWdatatablG]] createdFri, 30 Dec 2005 03:58:21 GMTWdatatablG~L~L createdFri, 21 Oct 2005 14:45:02 GMTWdatatablG~M~M createdFri, 21 Oct 2005 14:45:26 GMTWdatatablG~O~O createdFri, 21 Oct 2005 14:56:20 GMTWdatatablG~O~O createdFri, 21 Oct 2005 14:56:20 GMTWdatatablG~Pm~Pm createdFri, 21 Oct 2005 14:59:41 GMTWdatatablG~Rҿ~R createdFri, 21 Oct 2005 15:09:54 GMTWdatatablG~R~R createdFri, 21 Oct 2005 15:10:08 GMTWdatatablG~S7~S7 createdFri, 21 Oct 2005 15:11:35 GMTWdatatablG~[w~[w createdFri, 21 Oct 2005 15:46:47 GMTWdatatablG~[;~[; createdFri, 21 Oct 2005 15:45:47 GMTWdatatablG~[B~[B createdFri, 21 Oct 2005 15:45:54 GMTWdatatablG~O~O createdFri, 21 Oct 2005 14:56:21 GMTWdatatablG~ND~ND createdFri, 21 Oct 2005 14:50:28 GMTWdatatablG~\2~\2 createdFri, 21 Oct 2005 15:49:54 GMTWdatatablG~\7~\7 createdFri, 21 Oct 2005 15:49:59 GMTGeneva~ƿ~ LANDmac on unsub (adrargs) scratchpad.unsubargs = adrargs^ edit (@scratchpad.unsubargs) local (adrdata = newsRiverSuite.init ()) xml.aggregator.unsubscribeService (adrargs^.xmlUrl, adrdata) adrargs^.redirect = newsRiverData.systemUrls.news return ("") WdatatablG~~ createdFri, 21 Oct 2005 18:39:50 GMTWdatatablG~D~D createdFri, 21 Oct 2005 18:40:52 GMTWdatatablG~~ createdFri, 21 Oct 2005 18:42:35 GMTWdatatablG~~ createdFri, 21 Oct 2005 18:42:42 GMT _GenevaxT~ '?LANDmac on viewNews (adrargs) adrargs^.returnedvalue = newsRiverSuite.viewNewsItems (adrargs:adrargs)  TGenevaQӿRLANDmac on viewSubs (adrargs) adrargs^.returnedvalue = newsRiverSuite.viewSubscriptions () 8m'.C  + 4@ I postToWeblog?unsub@viewNewsC viewSubsCVGeneva|=@8I=tGeneva P3P3NqLANDmac on cleanFilename (fname) Changes 9/19/05; 5:45:19 PM by DW Legal characters for DOS file names include the following: Upper case letters A-Z Numbers 0-9 Space (though trailing spaces are considered to be padding and not a part of the file name) ! # $ % & ( ) - @ ^ _ ` { } ~ ' Values 128-255 if system.environment.isWindows local (i, ch, fllegal, s="") for i = 1 to sizeof (fname) ch = fname [i] fllegal = true if not string.isalpha (ch) if not string.isnumeric (ch) if (number (char (ch)) < 128) if not ({' ', '!', '#', '%', '.', ',', '&', '(', ')', '-', '@', '_', '`', '{', '}', '~', "'"} contains ch) fllegal = false if fllegal s = s + ch return (s) else fname = string.replaceall (fname, ":", "-") fname = string.replaceall (fname, "!", "") fname = string.replaceall (fname, "|", "") return (fname) "@E & 5 Genevax<pLANDmac on downloadEnclosure (adrq) Changes 1/21/06; 11:45:30 AM by DW Callbacks, after download. 1/19/06; 5:29:55 AM by DW Respect flOutlineEnclosures pref. 1/18/06; 4:56:45 PM by DW Adapted for newsRiver.root. 9/19/05; 10:50:03 AM by DW If the feed doesn't have a title, store its podcasts in a folder named "Untitled feed." http://archive.scripting.com/2005/09/19#When:1:41:22PM local (adrdata = newsRiverSuite.init (), feedtitle, foldername) try feedtitle = adrq^.adrservice^.compilation.channeltitle foldername = newsRiverSuite.podcatcher.cleanFilename (feedtitle) else feedtitle = "Untitled feed" foldername = "Untitled feeds" adrq^.feedtitle = feedtitle //for the log outline local (folder = adrdata^.newsRiver.podcatcher.prefs.folder + foldername + file.getpathchar ()) bundle //see if we can access the folder try file.surefilepath (folder + "xxx") else //nope if system.environment.isMac if sizeof (foldername) >= 32 //too long! foldername = string.mid (foldername, 1, 31) folder = adrdata^.newsRiver.podcatcher.prefs.folder + foldername + file.getpathchar () local (url = adrq^.url) local (fname = string.nthfield (url, "/", string.countfields (url, "/"))) fname = string.nthfield (fname, "?", 1) fname = string.urlDecode (fname) fname = newsRiverSuite.podcatcher.cleanFilename (fname) local (f = folder + fname) bundle //do some checking on the filename local (extension = string.nthfield (fname, ".", string.countfields (fname, "."))) local (fnamedefault = "podcast" + nameof (adrq^) + "." + extension) if system.environment.isMac if sizeof (fname) > 32 //too long! fname = fnamedefault f = folder + fname if file.exists (f) //don't overwrite existing file fname = fnamedefault f = folder + fname adrq^.f = f file.surefilepath (f) local (s) bundle //read the url local (urllist = string.urlsplit (url)) s = string.httpResultSplit (tcp.httpClient (server:urllist [2], path:urllist [3], ctFollowRedirects:5)) file.writewholefile (f, s) bundle //if we have a pubdate, set the file dates to that try if adrq^.pubdate != date (0) file.setcreated (f, adrq^.pubdate) file.setmodified (f, adrq^.pubdate) adrq^.whenDownload = clock.now () if adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures newsRiverSuite.podcatcher.logDownload (adrq) bundle //callbacks, 1/21/06 by DW local (adrscript) for adrscript in @adrdata^.newsRiver.callbacks.afterEnclosureDownload try adrscript^ (adrq) bundle //test code downloadEnclosure (@aggregatorData.newsRiver.podcatcher.queue.["00066"]) WdatatablGYY createdSat, 21 Jan 2006 19:45:29 GMTWdatatablG[[ createdSat, 21 Jan 2006 19:45:31 GMTWdatatablGSS createdThu, 19 Jan 2006 13:29:55 GMTWdatatablGTT createdThu, 19 Jan 2006 13:29:56 GMTWdatatablG#̿# createdThu, 19 Jan 2006 00:56:44 GMTWdatatablG#ο# createdThu, 19 Jan 2006 00:56:46 GMTWdatatablG% % createdThu, 19 Jan 2006 01:02:03 GMTWdatatablG% % createdThu, 19 Jan 2006 01:02:04 GMTWdatatablG%+%+ createdThu, 19 Jan 2006 01:02:35 GMTWdatatablG11 createdThu, 19 Jan 2006 01:55:39 GMTWdatatablG%% createdThu, 19 Jan 2006 01:05:58 GMTWdatatablGpp createdMon, 28 Nov 2005 21:57:20 GMTWdatatablGzz createdMon, 28 Nov 2005 21:57:30 GMTWdatatablG}} createdMon, 28 Nov 2005 21:57:33 GMTWdatatablG燿 createdMon, 28 Nov 2005 21:57:43 GMTWdatatablG狿 createdMon, 28 Nov 2005 21:57:47 GMTWdatatablG穿 createdMon, 28 Nov 2005 21:58:17 GMTWdatatablG緿 createdMon, 28 Nov 2005 21:58:31 GMTWdatatablGmm createdMon, 28 Nov 2005 21:57:17 GMTWdatatablGMM createdMon, 28 Nov 2005 22:01:01 GMTWdatatablG createdMon, 28 Nov 2005 22:02:56 GMTWdatatablG￰ createdMon, 28 Nov 2005 22:03:43 GMTWdatatablG狿 createdMon, 28 Nov 2005 21:57:47 GMTWdatatablG穿 createdMon, 28 Nov 2005 21:58:17 GMTWdatatablGxx createdMon, 28 Nov 2005 22:01:44 GMTWdatatablGBB createdMon, 28 Nov 2005 22:05:06 GMTWdatatablGxx createdMon, 28 Nov 2005 22:01:44 GMTWdatatablG&& createdThu, 19 Jan 2006 01:08:36 GMTWdatatablGDD createdThu, 19 Jan 2006 13:29:40 GMTWdatatablGmm createdSat, 21 Jan 2006 19:45:49 GMTWdatatablGtt createdSat, 21 Jan 2006 19:45:56 GMTWdatatablGρρ createdSat, 21 Jan 2006 19:46:09 GMTWdatatablGϠϠ createdSat, 21 Jan 2006 19:46:40 GMTWdatatablGϤϤ createdSat, 21 Jan 2006 19:46:44 GMTӀ aE+Geneva uLANDmac on downloadQueue (flOvernightDownload) Changes 1/19/06; 5:31:34 AM by DW Add parameter, flOvernightDownload, if true, we don't start a download after the stop time. 1/18/06; 7:19:21 PM by DW Updated for newsRiver.root. 9/19/05; 10:09:50 AM by DW If there's an error, record it and move to the next element. Don't try to read items with errors. To clear the error to try again, delete the error sub-table. 12/2/04; 7:30:21 AM by DW Created. local (adrdata = newsRiverSuite.init (), i, adrq) for i = sizeof (adrdata^.newsRiver.podcatcher.queue) downto 1 adrq = @adrdata^.newsRiver.podcatcher.queue [i] try if not defined (adrq^.error) if flOvernightDownload if date.hour () >= adrdata^.newsRiver.podcatcher.prefs.hourToStopDownloads break newsRiverSuite.podcatcher.downloadEnclosure (adrq) adrdata^.newsRiver.podcatcher.downloads.[nameof (adrq^)] = adrq^ delete (adrq) else new (tabletype, @adrq^.error) adrq^.error.message = tryerror adrq^.error.when = clock.now () if flOvernightDownload if adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures newsRiverSuite.podcatcher.openLogOutline () bundle //test code downloadQueue (false) WdatatablGԞԞ createdThu, 19 Jan 2006 13:31:10 GMTWdatatablGԶԶ createdThu, 19 Jan 2006 13:31:34 GMTWdatatablGԷԷ createdThu, 19 Jan 2006 13:31:35 GMTWdatatablGE9E9 createdThu, 19 Jan 2006 03:19:21 GMTWdatatablGE:E: createdThu, 19 Jan 2006 03:19:22 GMTWdatatablG createdThu, 19 Jan 2006 13:32:16 GMTWdatatablGFF createdThu, 19 Jan 2006 13:33:58 GMTWdatatablG createdThu, 19 Jan 2006 13:36:50 GMTWdatatablG createdThu, 19 Jan 2006 13:41:05 GMTWdatatablG createdThu, 19 Jan 2006 13:41:08 GMTWdatatablGDD createdThu, 19 Jan 2006 13:42:28 GMTWdatatablG createdSun, 05 Feb 2006 18:44:49 GMTWdatatablG createdSun, 05 Feb 2006 18:44:52 GMT&VGenevaP3P3xsLANDmac local (adrdata = newsRiverSuite.init (), f, ct = 0) fileloop (f in adrdata^.newsRiver.podcatcher.prefs.folder, infinity) ct = ct + file.size (f) msg (string.megabytestring (ct)) return (ct) (<EiGenevaP3P3LANDmac on logDownload (adrq) Changes 9/19/05; 10:18:24 AM by DW Strip markup from stuff we insert into the outline. on stripmarkup (s) if typeof (s) == tabletype table.assign (@s, xml.decompile (@s)) s = searchengine.stripmarkup (s) s = string.replaceall (s, "]]>", "") s = xml.entitydecode (s, flAlphaEntities:true) return (s) local (adrdata = newsRiverSuite.init ()) local (oldtarget = target.set (@adrdata^.newsRiver.podcatcher.log)) op.firstsummit () op.insert (clock.now (), up) op.insert (stripmarkup (adrq^.feedtitle), right) op.insert (stripmarkup (adrq^.description), right) bundle //link to the podcast local (atts) new (tabletype, @atts) atts.type = "link" atts.url = html.getFileURL (adrq^.f) op.attributes.addgroup (@atts) op.firstsummit () target.set (oldtarget) bundle //test code logDownload (@iPodderData.queue.["01138"]) WdatatablGNN createdMon, 28 Nov 2005 21:09:50 GMTWdatatablGVV createdMon, 28 Nov 2005 21:09:58 GMTWdatatablGyy createdMon, 28 Nov 2005 21:19:05 GMTVErGenevaP3P3pfLANDmac local (adrdata = newsRiverSuite.init ()) if adrdata^.newsRiver.podcatcher.prefs.flReclaimBytes local (ctbytes = newsRiverSuite.podcatcher.howMuchSpaceUsed ()) if ctbytes > adrdata^.prefs.ctBytesForEnclosures //we're going to delete some stuff! local (f, sorttable) new (tabletype, @sorttable) fileloop (f in adrdata^.prefs.folder, infinity) sorttable.[f] = file.created (f) local (oldtarget = target.set (@sorttable)) table.sortby ("Value") target.set (oldtarget) scratchpad.sorttable = sorttable while ctbytes > adrdata^.prefs.ctBytesForEnclosures local (f = nameof (sorttable [1])) delete (@sorttable [1]) ctbytes = ctbytes - file.size (f) file.delete (f) if sizeof (sorttable) < 1 break ĀEiGeneva̿&nLANDmac if dialog.confirm ("Download enclosures now?") newsRiverSuite.podcatcher.openLogOutline () newsRiverSuite.podcatcher.downloadQueue (false) WdatatablGDD createdThu, 19 Jan 2006 13:42:28 GMTnE Geneva%%&LANDmac Changes 1/19/06; 8:51:19 AM by DW If the folder doesn't exist, create it. local (adrdata = newsRiverSuite.init ()) local (folder = adrdata^.newsRiver.podcatcher.prefs.folder) if not file.exists (folder) file.surefilepath (folder + "xxx") file.openfolder (folder) WdatatablG createdThu, 19 Jan 2006 16:51:15 GMTWdatatablG createdThu, 19 Jan 2006 16:51:17 GMTWdatatablG createdThu, 19 Jan 2006 16:51:19 GMTWdatatablG^^ createdThu, 19 Jan 2006 16:50:38 GMTWdatatablGcc createdThu, 19 Jan 2006 16:50:43 GMTWdatatablGii createdThu, 19 Jan 2006 16:50:49 GMTWdatatablGee createdThu, 19 Jan 2006 14:42:45 GMT =$I% " 7downloadEnclosuresNowwopenEnclosuresFolderxVGeneva|=XJŀ =:Geneva˿tLANDmac on openLogOutline () Changes 1/19/06; 5:42:09 AM by DW Created. local (adrdata = newsRiverSuite.init ()) edit (@adrdata^.newsRiver.podcatcher.log, windowTitle:"Podcatcher") bundle //test code openLogOutline () WdatatablG-- createdThu, 19 Jan 2006 13:42:05 GMTWdatatablG// createdThu, 19 Jan 2006 13:42:07 GMTWdatatablG11 createdThu, 19 Jan 2006 13:42:09 GMTWdatatablGww createdThu, 19 Jan 2006 13:43:19 GMTWdatatablG{{ createdThu, 19 Jan 2006 13:43:23 GMTWdatatablG createdThu, 19 Jan 2006 13:43:27 GMT =Geneva P3P3tLANDmac on storyArrivedCallback (adrservice, adrItem) Changes 1/18/06; 2:15:03 PM by DW Created. edit (@aggregatorData.services.["http://www.morningcoffeenotes.com/rss.xml"].compilation.items.["00022"]) true local (adrdata = newsRiverSuite.init ()) if adrdata^.newsRiver.podcatcher.prefs.enabled if defined (adritem^.enclosure) local (serialnum = adrdata^.newsRiver.podcatcher.prefs.queueSerialNum++) local (adrq = @adrdata^.newsRiver.podcatcher.queue.[string.padwithzeros (serialnum, 5)]) new (tabletype, adrq) adrq^.url = adritem^.enclosure.url adrq^.length = adritem^.enclosure.length adrq^.type = adritem^.enclosure.type adrq^.description = adritem^.title adrq^.adrservice = adrservice try adrq^.pubDate = adritem^.data.pubDate else adrq^.pubDate = date (0) return (true) bundle //test code storyArrivedCallback (@aggregatorData.services.["http://www.morningcoffeenotes.com/rss.xml"], @aggregatorData.services.["http://www.morningcoffeenotes.com/rss.xml"].compilation.items.["00022"]) WdatatablG createdWed, 18 Jan 2006 22:14:59 GMTWdatatablG createdWed, 18 Jan 2006 22:15:02 GMTWdatatablG createdWed, 18 Jan 2006 22:15:03 GMTWdatatablGxx createdWed, 18 Jan 2006 22:17:28 GMTWdatatablG createdWed, 18 Jan 2006 22:27:09 GMTWdatatablGTT createdWed, 18 Jan 2006 22:16:52 GMTWdatatablG-- createdThu, 19 Jan 2006 01:39:06 GMTWdatatablG-- createdThu, 19 Jan 2006 01:40:08 GMTWdatatablG.. createdThu, 19 Jan 2006 01:40:18 GMTWdatatablG-- createdThu, 19 Jan 2006 01:40:08 GMTWdatatablG createdWed, 18 Jan 2006 22:45:34 GMTWdatatablG`` createdWed, 18 Jan 2006 22:34:08 GMTWdatatablGcc createdWed, 18 Jan 2006 22:34:11 GMTE2N?jſ  ,8 FR co { cleanFilenameEdownloadEnclosureJp downloadQueuebOhowMuchSpaceUsedl logDownloadnmakeSpaceOnDisks menuCommands}openLogOutline}storyArrivedCallbackVGeneva|=XJLH?"'GenevaULANDmac Changes 1/15/06; 1:54:58 PM by DW Get title from head, maintain list-level stats for Subscriptions page. 1/14/06; 12:21:50 PM by DW Detailed code review and testing. Using PT's reading list as a guinea pig. http://downloads.oreilly.com/make/philliptorrone.opml 11/8/05; 1:42:07 PM by DW Created. This is what we do before a scan. We read each of the reading lists and make sure we're subscribed IJ)Q0srGenevann'.FWG%,mhLANDmac on viewSubscriptions () Changes: 1/17/06; 7:03:36 PM by DW More defensive driving around missing channeltitles. 3/20/02; 9:43:09 AM by DW Don't try to work with channels that don't have channelTitles. In theory this is never supposed to happen. But enough users are getting broken by this, I felt it was time to work around the problem. 3/19/02; 5:27:30 PM by DW Support for partnerFeed attribute on GET request. 1/24/02; 7:26:51 PM by DW Minor tweaks and reworks to make the page work better. Moved the Unsubscribe button to the bottom of the page. 1/13/02; 11:18:05 PM by JES If a searchArg named url is present, use its value for the value of the URL-entry box. This makes it possible to create a link on your website, which allows people to subscribe their copy of Radio to your RSS feed. 1/9/02; 12:52:03 AM by JES Decode entities in the channel name in the success message, which appears after subscribing to a new channel. 1/9/02; 12:47:39 AM by JES Moved the Delete button to a similar location to where it is on the News page -- it's no longer on its own, to the right of the subscriptions table. Added tags to the date field in the subscriptions table, so that the dates won't wrap to multiple lines. 1/6/02; 4:25:04 AM by JES Added table css classes. 1/4/02; 3:32:20 PM by JES Commented out some debugging code. 12/12/01; 11:16:32 AM by DW Workaround crashing bug in kernel. 12/10/01; 1:38:16 AM by JES Decode entities in the channel title -- no more ' in the page. 12/8/01; 12:50:36 PM by DW Adding a new subscription should provide feedback. "You are now subscribed to the blah blah feed." Improved the error message when a subscription doesn't work. 11/24/01; 3:55:33 PM by DW Added help link. 11/14/01; 10:00:27 AM by DW Localized. 1/23/01; 3:12:53 PM by DW Created. 2/12/01; 10:00:38 AM by DW Clean up and debug. Add headers to columns. Fixed a major bug in unsubscribing. If you unsubscribed from more than one channel, it would change the indexing and believe it or not it would unsubscribe from the wrong channels. Oy. Now we scan in reverse order and pad the checkbox names with 0's so things get deleted in the correct order. 2/12/01; 4:40:42 PM by PBS Channels with quotes and angle brackets in the description would message up the rendering. Fixed. Link title for the XML button, so it's consistent with other pages. 2/24/01; 6:16:29 PM by PBS Help links. 3/4/01; 5:05:00 PM by JES Toss the HotList cache when subscribing or unsubscribing to/from a channel. 3/4/01; 6:13:06 PM by JES Toss the homepage cache when unsubscribing from a channel. 3/5/01; 8:47:23 PM by PBS Fixed a typo when tossing the hot list cache. 7/26/01; 4:04:24 PM by JES Don't error if a channel's channeldescription or channellink aren't defined. local (pta = html.getpagetableaddress ()) scratchpad.vsparams = pta^ pta^.title = newsRiverSuite.getString ("subscriptions.title") local (adrdata = xml.aggregator.init ()) local (xmlImg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/xml")) local (htmltext = "", indentlevel = 0) on add (s) htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r\n" local (errorstring = "", initialurl = "http://", adrnewservice = nil, flopmlsub = false, opmltitle = "") if pta^.method == "POST" local (args) new (tabletype, @args) webserver.parseargs (pta^.requestbody, @args) if defined (args.subscribe) if sizeof (args.url) > sizeof (initialurl) bundle //set flopmlsub local (xmltext = tcp.httpreadurl (args.url), xstruct) xml.compile (xmltext, @xstruct) try xml.getaddress (@xstruct, "opml") opmltitle = string.nthfield (args.url, "/", string.countfields (args.url, "/")) flopmlsub = true if flopmlsub try local (adrlist = @adrdata^.newsRiver.readingLists.[args.url]) if defined (adrlist^) errorstring = "Can't subscribe because you are already subscribed to the list." else new (tabletype, adrlist) newsRiverSuite.readingList.beforeScan () adrnewservice = adrlist else errorstring = tryerror else if not xml.aggregator.subscribeService (args.url, @errorstring, @adrnewservice) initialurl = args.url if defined (args.unsubscribe) delete (@args.unsubscribe) try {delete (@args.url)} local (i, adr, ix) for i = sizeof (args) downto 1 adr = @args [i] ix = number (nameof (adr^)) if ix > 100000 //it's a reading list local (adrlist = @adrdata^.newsriver.readinglists [ix - 100000]) newsRiverSuite.readingList.unsubscribe (nameof (adrlist^)) else //it's a feed local (adrservice = @adrdata^.services [ix]) xml.aggregator.unsubscribeService (nameof (adrservice^)) local (sortedtable) bundle //fill sorted table local (adrsort) new (tabletype, @sortedtable) for adr in @adrdata^.services bundle //don't show feeds that come from reading lists if defined (adr^.flManualSub) if not adr^.flManualSub continue if defined (adr^.compilation) if sizeof (adr^.compilation) > 0 try //missing channeltitle doesn't stop us -- 3/20/02 DW local (channeltitle = adr^.compilation.channeltitle) if sizeof (channeltitle) > 0 adrsort = @sortedtable.[adr^.compilation.channeltitle] if defined (adrsort^) //collision local (ct = 1) loop adrsort = @sortedtable.[adr^.compilation.channeltitle + "." + ct++] if not defined (adrsort^) break adrsort^ = nameof (adr^) local (oldtarget = target.set (@sortedtable)) table.sortby ("Value") target.set (oldtarget) scratchpad.sortedtable = sortedtable; edit (@scratchpad.sortedtable) add ("
"); indentlevel++ bundle //add the URL entry box if pta^.method == "GET" //1/13/02 JES: try to set initialurl if defined (pta^.radioResponder.getArgs.url) initialurl = pta^.radioResponder.getArgs.url if defined (pta^.radioResponder.getArgs.partnerFeed) //something like "nyt.arts" local (feed = pta^.radioResponder.getArgs.partnerFeed) local (part1 = string.nthfield (feed, ".", 1)) local (part2 = string.nthfield (feed, ".", 2)) local (adrurl = @radio.data.partnerUrls.[part1].[part2]) if defined (adrurl^) initialurl = adrurl^ add ("

" + newsRiverSuite.getString ("subscriptions.subscribeIntro") + "

") add ("
"); indentlevel++ add (""); indentlevel++ add (""); indentlevel++ add ("") add ("") add ("") add (""); indentlevel-- add ("") add ("
" + "URL" + ":" + "
" + radio.userInterface.helpLink ("addChannel") + "
"); indentlevel-- add ("
"); indentlevel-- if errorstring != "" add ("" + newsRiverSuite.getString ("subscriptions.cantSubscribeBecause") + "\"" + errorstring + "\"
") if adrnewservice != nil 12/12/01; 11:16:51 AM by DW Site of a crashing bug in Radio 7.1b36. Workaround provided by Lawrence Lee. (Good work!!) local (t) new (tabletype, @t) if flopmlsub t.channeltitle = opmltitle else //1/17/06 by DW, do it in a try try t.channeltitle = newsRiverSuite.decodeEntities (adrnewservice^.compilation.channeltitle) else t.channeltitle = "Untitled feed" add (newsRiverSuite.getString ("subscriptions.confirmSubscription", @t)) add ("
") add ("

") bundle //add unsubscribe button add ("
  
") bundle //add the text at the top of the page add (newsRiverSuite.getString ("subscriptions.tableIntro")) add (newsRiverSuite.getString ("subscriptions.tableIntro") + " " + radio.userInterface.helpLink ("The Subscriptions page")) add ("

") add ("
"); indentlevel++ add (""); indentlevel++ add (""); indentlevel-- add ("
"); indentlevel++ bundle //add subscription table add ("
"); indentlevel++ add (""); indentlevel++ local (i, adrsort, adr, adrsource, ct = 0) bundle //add header add ("") on addrow (idForCheckbox, title, channeldescription, channellink, timeLastChange, ctChanges, xmlUrl) local (link) add (""); indentlevel++ bundle //add checkbox local (name = nameof (adr^)) local (checkboxval = "xxx ") if false checkboxval = checkboxval + "checked" add ("") if sizeof (title) > 50 title = string.mid (title, 1, 50) + ".." bundle //set link if sizeof (channellink) > 0 3/4/06; 18:42:49 by TM Added 'spyglass' option. See opml-newbies for full details link = "" + newsRiverSuite.decodeEntities (title) + "" else link = newsRiverSuite.decodeEntities (title) add ("") add ("") add ("") add ("") add (""); indentlevel-- bundle //add reading list subscriptions if sizeof (adrdata^.newsriver.readinglists) > 0 local (adrlist) add ("") for adrlist in @adrdata^.newsriver.readinglists addrow (indexOf (adrlist^) + 100000, adrlist^.title, "", "", adrlist^.stats.timeLastChange, adrlist^.stats.ctChanges, nameof (adrlist^)) add ("") for adrsort in @sortedtable adr = @adrdata^.services.[adrsort^] if defined (adr^.compilation) if sizeof (adr^.compilation) > 0 local (title = "Untitled feed") if defined (adr^.compilation.channeltitle) title = adr^.compilation.channeltitle local (channeldescription = "", channellink = "") if defined (adr^.compilation.channeldescription) channeldescription = newsRiverSuite.decodeEntities (adr^.compilation.channeldescription) if defined (adr^.compilation.channellink) channellink = adr^.compilation.channellink addrow (indexOf (adr^), title, channeldescription, channellink, adr^.timeLastChange, adr^.ctChanges, nameof (adr^)) add ("
 NameUpdatedCt 
" + link + "" + newsRiverSuite.getDateString (timeLastChange, false) + "" + ctChanges + "" + xmlimg + "
R E A D I N G   L I S T S
F E E D S
"); indentlevel-- add ("
"); indentlevel-- add ("
"); indentlevel-- add ("
"); indentlevel-- add ("
") add ("
"); indentlevel-- return (htmltext) bundle //test code html.setpagetableaddress (@scratchpad.vsparams) viewSubscriptions () WdatatablG createdWed, 18 Jan 2006 03:03:36 GMTWdatatablG createdWed, 18 Jan 2006 03:03:37 GMT$datatabl77WdatatablG@G@G createdMon, 16 Jan 2006 02:09:11 GMTWdatatablG@K@K createdMon, 16 Jan 2006 02:09:15 GMTWdatatablG@k@k createdMon, 16 Jan 2006 02:09:47 GMTWdatatablG@z@z createdMon, 16 Jan 2006 02:10:02 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:07 GMTWdatatablGBB createdMon, 16 Jan 2006 02:19:35 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:20 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:42 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:44 GMTWdatatablGVV createdTue, 08 Nov 2005 21:20:01 GMTWdatatablGWjWj createdTue, 08 Nov 2005 21:23:54 GMTWdatatablGWoWo createdTue, 08 Nov 2005 21:23:59 GMTWdatatablGWW createdTue, 08 Nov 2005 21:24:23 GMTWdatatablGWW createdTue, 08 Nov 2005 21:24:25 GMTWdatatablGDlDl createdMon, 16 Jan 2006 02:26:52 GMTWdatatablGB\B\ createdMon, 16 Jan 2006 02:18:04 GMTWdatatablGDbDb createdMon, 16 Jan 2006 02:26:42 GMTWdatatablGDdDd createdMon, 16 Jan 2006 02:26:44 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:46 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:11 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:19 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:33 GMTWdatatablG;?;? createdMon, 16 Jan 2006 01:47:43 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:35 GMTWdatatablG== createdMon, 16 Jan 2006 01:57:33 GMTWdatatablG== createdMon, 16 Jan 2006 01:57:45 GMTWdatatablG=Ŀ= createdMon, 16 Jan 2006 01:58:28 GMTWdatatablG=ѿ= createdMon, 16 Jan 2006 01:58:41 GMT$datatabl<<$datatabl<<WdatatablGBsBs createdMon, 16 Jan 2006 02:18:27 GMTWdatatablGBxBx createdMon, 16 Jan 2006 02:18:32 GMTWdatatablGB{B{ createdMon, 16 Jan 2006 02:18:35 GMTWdatatablG createdWed, 18 Jan 2006 03:01:52 GMT$datatabl<<WdatatablG createdWed, 18 Jan 2006 03:01:54 GMTWdatatablG錄 createdWed, 18 Jan 2006 03:01:56 GMT$datatabl<<WdatatablG00 createdMon, 16 Jan 2006 01:02:11 GMTWdatatablG<"<" createdMon, 16 Jan 2006 01:51:30 GMTWdatatablG<< createdMon, 16 Jan 2006 01:51:24 GMTWdatatablG<.<. createdMon, 16 Jan 2006 01:51:42 GMTWdatatablGW'W' createdMon, 03 Apr 2006 17:42:47 GMTWdatatablGW)W) createdMon, 03 Apr 2006 17:42:49 GMTWdatatablG<8<8 createdMon, 16 Jan 2006 01:51:52 GMTWdatatablG  * 5 conditionhandler subscriberVGeneva|=XJX }Genevaw߿w'?LANDmac This script returns a string which appears in the Status Center on the Radio UserLand home page. return ("I'm a cool Tool!") C0Geneva[;a2LANDmac on translateToEntities (s) Before putting some text in an input field or textarea, translating certain entities will ensure that the HTML on the page won't get messed up. 01/10/01; 4:49:47 PM by PBS s = string.replaceAll (s, "&", "&") s = string.replaceAll (s, "<", "<") s = string.replaceAll (s, "\"", """) s = string.replaceAll (s, "{", "{") //no macros in these locations return (s) CՀvZArial ٠٠{mLANDmac on untaint (s, flNeuterJavaScript=true, macroStartChars="<%") Changes: 11/8/01; 9:32:26 PM by JES Changed default startMacroChars from "{" to "<%". 8/14/01; 4:31:29 PM by JES New optional parameter, macroStartChars, used to specify which macro characters to neuter. The first character is converted to a numerical HTML entity. 2/20/01; 4:05:30 PM by PBS Neuter JavaScript if flNeuterJavaScript is true. 2/15/01; 3:11:35 PM by PBS Created. Prevent macros and JavaScript from being executed. local (replaceWith = "&#" + number (macroStartChars[1]) + ";" + string.delete (macroStartChars, 1, 1)) s = string.replaceAll (s, macroStartChars, replaceWith) if flNeuterJavaScript s = html.neuterJavaScript (s) return (s) GenevaIIgLANDmac newsRiverSuite.updateTool () \ d&IGeneva&&Z3toLANDmac Changes 1/11/06; 5:11:30 PM by DW Ooops, can't set it true, it's called whenever we do a scan. 1/11/06; 4:35:46 PM by DW Set dialogs to true, 12/29/05; 1:59:46 PM by DW Created. local (adrtable = @user.rootUpdates.servers.newsRiver) if not defined (adrtable^) new (tabletype, adrtable) if not defined (adrtable^.autobackup) adrtable^.autobackup = false if not defined (adrtable^.dbName) adrtable^.dbName = "newsRiver.root" if not defined (adrtable^.dialogs) adrtable^.dialogs = true if not defined (adrtable^.lastupdate) adrtable^.lastupdate = date (0) if not defined (adrtable^.method) adrtable^.method = "nirvanaServer.subscriptions.update" if not defined (adrtable^.port) adrtable^.port = 80 if not defined (adrtable^.serialnum) adrtable^.serialnum = 0 if not defined (adrtable^.server) adrtable^.server = "communityserverhome.opml.org" if not defined (adrtable^.url) adrtable^.url = "" local (ctnewparts) adrtable^.dialogs = false //1/11/06 by DW rootUpdates.update (@newsRiverSuite, adrCtNewParts:@ctnewparts) msg (ctnewparts + " new part(s) installed in newsRiver.root.") WdatatablGٜNٜN createdThu, 29 Dec 2005 21:59:42 GMTWdatatablG¿ createdThu, 12 Jan 2006 01:11:30 GMTWdatatablGÿ createdThu, 12 Jan 2006 01:11:31 GMTWdatatablGaa createdThu, 12 Jan 2006 00:35:45 GMTWdatatablGcc createdThu, 12 Jan 2006 00:35:47 GMTWdatatablGٜPٜP createdThu, 29 Dec 2005 21:59:44 GMTWdatatablGٜRٜR createdThu, 29 Dec 2005 21:59:46 GMTWdatatablGͿ createdMon, 14 Nov 2005 16:22:37 GMTWdatatablGW^W^ createdWed, 04 Jan 2006 15:43:42 GMTWdatatablGWgWg createdWed, 04 Jan 2006 15:43:51 GMTq(GenevaVbLANDmac Changes 1/4/06; 10:38:28 AM by DW Created. Copy it into the system.temp table and then run from there, so we can update all the parts here, including the update script itself. system.temp.newsRiverUpdateCode = newsRiverSuite.updateCode thread.callscript (@system.temp.newsRiverUpdateCode, {}) WdatatablGVV createdWed, 04 Jan 2006 15:38:22 GMTWdatatablGV#V# createdWed, 04 Jan 2006 15:38:27 GMTWdatatablGV%V% createdWed, 04 Jan 2006 15:38:29 GMTWdatatablGVPVP createdWed, 04 Jan 2006 15:39:12 GMTWdatatablGVtVt createdWed, 04 Jan 2006 15:39:48 GMT̀7àsGeneva?#?S?ALANDmac for adrservice in @aggregatorData.services if defined (adrservice^.flmanualsub) adrservice^.flmanualsub = false WdatatablG?2?2 createdMon, 16 Jan 2006 02:04:34 GMTWdatatablG?"); indentlevel++ add (""); indentlevel++ bundle //add header add ("") local (xstruct) xml.compile (op.outlinetoxml (adroutline), @xstruct) scratchpad.xstruct = xstruct local (adropml = xml.getaddress (@xstruct, "opml")) local (adrbody = xml.getaddress (adropml, "body"), adrhour, adritem, adratts) for adrhour in adrbody if nameof (adrhour^) contains "outline" for adritem in adrhour if nameof (adritem^) contains "outline" adratts = @adritem^.["/atts"] local (text = adratts^.text) local (eventType = string.nthfield (text, ":", 1)) text = string.delete (text, 1, sizeof (eventType + 2)) local (what) bundle //set what local (ix = string.patternmatch (" at ", text)) what = string.mid (text, 1, ix) text = string.delete (text, 1, ix + 3) if string.trimwhitespace (what) endswith ")" //remove substring " (xxx)" for ix = sizeof (what) downto 1 if what [ix] == "(" what = string.mid (what, 1, ix-1) if defined (adratts^.url) what = "" + what + "" local (when = string.nthfield (text, ",", 1)) local (secs = string.nthfield (text, ",", 2) - " secs.") local (s) s = s + "" s = s + "" s = s + "" s = s + "" s = s + "" s = s + "" add (s) add ("
" + newsRiverSuite.getString ("eventsLog.eventHeader") + "" + newsRiverSuite.getString ("eventsLog.whatHappenedHeader") + "" + newsRiverSuite.getString ("eventsLog.timeHeader") + "" + newsRiverSuite.getString ("eventsLog.secsHeader") + "
" + eventType + "" + what + "" + when + "" + secs + "
"); indentlevel-- add (""); indentlevel-- bundle //cache if not defined (system.temp.newsRiver.logHtmlCache) new (tabletype, @system.temp.newsRiver.logHtmlCache) system.temp.newsRiver.logHtmlCache.htmltext = htmltext system.temp.newsRiver.logHtmlCache.when = clock.now () return (htmltext) bundle //test code local (pt) new (tabletype, @pt) html.setpagetableaddress (@pt) webbrowser.displaytext (viewLog ()) WdatatablG createdSun, 15 Jan 2006 15:48:50 GMTWdatatablG createdSun, 15 Jan 2006 15:48:51 GMTWdatatablG createdSun, 15 Jan 2006 15:48:53 GMTWdatatablGﮍﮍ createdSun, 15 Jan 2006 15:47:25 GMTWdatatablGss createdSun, 15 Jan 2006 14:55:47 GMTWdatatablG|| createdSun, 15 Jan 2006 14:55:56 GMTWdatatablG&& createdSun, 15 Jan 2006 15:45:42 GMTWdatatablG createdSun, 15 Jan 2006 15:45:14 GMTWdatatablGrr createdSun, 15 Jan 2006 15:46:58 GMTWdatatablG|| createdSun, 15 Jan 2006 15:47:08 GMTWdatatablG createdSun, 15 Jan 2006 14:57:04 GMTWdatatablG createdSun, 15 Jan 2006 14:56:22 GMTWdatatablGſ createdSun, 15 Jan 2006 14:57:09 GMTWdatatablG createdSun, 15 Jan 2006 14:58:15 GMTWdatatablG createdSun, 15 Jan 2006 14:58:31 GMTWdatatablG%% createdSun, 15 Jan 2006 14:58:45 GMTWdatatablG,, createdSun, 15 Jan 2006 14:58:52 GMTWdatatablG44 createdSun, 15 Jan 2006 14:59:00 GMTWdatatablG99 createdSun, 15 Jan 2006 14:59:05 GMTWdatatablGEE createdSun, 15 Jan 2006 14:59:17 GMTWdatatablGii createdSun, 15 Jan 2006 15:16:57 GMTWdatatablG createdSun, 15 Jan 2006 15:15:33 GMTWdatatablG~~ createdSun, 15 Jan 2006 15:17:18 GMTWdatatablG履履 createdSun, 15 Jan 2006 15:17:51 GMTWdatatablG藺藺 createdSun, 15 Jan 2006 15:18:08 GMTWdatatablG麟麟 createdSun, 15 Jan 2006 15:18:11 GMTWdatatablGѿ createdSun, 15 Jan 2006 15:18:41 GMTWdatatablG߿ createdSun, 15 Jan 2006 15:18:55 GMTWdatatablG createdSun, 15 Jan 2006 15:23:20 GMTWdatatablG createdSun, 15 Jan 2006 15:24:06 GMTWdatatablG$$ createdSun, 15 Jan 2006 15:24:20 GMTWdatatablG,, createdSun, 15 Jan 2006 15:24:28 GMTWdatatablGff createdSun, 15 Jan 2006 15:25:26 GMTWdatatablG祈祈 createdSun, 15 Jan 2006 15:26:06 GMTWdatatablG createdSun, 15 Jan 2006 15:19:13 GMTWdatatablG createdSun, 15 Jan 2006 15:19:13 GMTWdatatablG&& createdSun, 15 Jan 2006 15:45:42 GMTWdatatablG createdSun, 15 Jan 2006 15:45:14 GMTWdatatablG createdSun, 15 Jan 2006 15:45:30 GMTWdatatablG11 createdSun, 15 Jan 2006 15:45:53 GMTWdatatablGGG createdSun, 15 Jan 2006 15:46:15 GMTWdatatablGUU createdSun, 15 Jan 2006 14:55:17 GMTWdatatablGYY createdSun, 15 Jan 2006 14:55:21 GMTWdatatablGԿ createdSun, 15 Jan 2006 14:57:24 GMTWdatatablG׿ createdSun, 15 Jan 2006 14:57:27 GMTWdatatablGݿ createdSun, 15 Jan 2006 14:57:33 GMTWdatatablG]] createdSun, 15 Jan 2006 14:55:25 GMT&=0D '0gYGenevaKJJ LANDmac on viewNewsItems (adrargs=nil, ctStoriesToList=nil) Changes: 10/16/05; 10:58:30 AM by DW Began work on this code after a long hiatus. Make it work inside the OPML Editor. local (pta = html.getpagetableaddress ()) scratchpad.newsparams = pta^ pta^.title = newsRiverSuite.getString ("aggregator.title") local (uri = pta^.uri) local (adrdata = newsRiverSuite.init ()) if ctStoriesToList == nil ctStoriesToList = adrdata^.newsRiver.ctStoriesOnNewsPage local (htmltext = "", indentlevel = 0) on add (s) htmltext = htmltext + (string.filledstring ("\t", indentlevel) + s + "\r\n"); on decodeEntities (s) s = string.replaceAll (s, "\r\n", "\r") s = string.replaceAll (s, "\n", "\r") return (newsRiverSuite.decodeEntities (s, flNeuterJavaScript:false)) local (flOneService = false, xmlUrl = "", adrservice) bundle //parse args local (args) new (tabletype, @args) webserver.parseArgs (pta^.searchArgs, @args) if defined (args.xmlUrl) flOneService = true xmlurl = args.xmlUrl adrservice = @adrdata^.services.[xmlurl] if defined (adrservice^.compilation.channeltitle) //avoid errors for non-compliant channels add ("Channel: " + decodeEntities (adrservice^.compilation.channeltitle) + "

") pta^.title = "Channel: " + decodeEntities (adrservice^.compilation.channeltitle) local (adrcache = @adrdata^.cache.[this], adrincache, defaultcachename = "default") if not defined (adrcache^) //make sure the cache table is defined new (tabletype, adrcache) bundle //set adrincache if adrdata^.newsRiver.flCacheNewsItemsPage local (cachename = defaultcachename) if sizeof (xmlUrl) > 0 cachename = xmlUrl adrincache = @adrcache^.[cachename] bundle //catch post if pta^.method == "POST" local (args) new (tabletype, @args) webserver.parseArgs (pta^.requestBody, @args) scratchpad.args = args; edit (@scratchpad.args) if defined (args.formName) if string.lower (args.formName) == "editstories" delete (@args.formName) if defined (args.unsubscribe) local (args) new (tabletype, @args) args.xmlUrl = xmlUrl if defined (adrdata^.services.[xmlUrl]) adrargs^.redirect = newsRiverData.systemUrls.unsub + "?" + webserver.encodeargs (@args) return ("") local (adrdefaultcache = @adrcache^.[defaultcachename]) for adrarg in @args try local (name = string.padwithzeros (number (nameof (adrarg^)), 8)) local (adrstory = @adrdata^.stories.[name]) if defined (adrstory^) adrdata^.trash.[name] = adrstory^ delete (adrstory) if adrdata^.newsRiver.flCacheNewsItemsPage if defined (adrcache^) if defined (adrincache^) //posting invalidates the cache delete (adrincache) if adrdefaultcache == adrincache //02/24/2001 JES: delete the cache for the service if defined (adrstory^) local (adrservicecache = @adrcache^.["xmlUrl=" + string.urlEncode (adrstory^.url)]) if defined (adrservicecache^) delete (adrservicecache) else //02/24/2001 JES: we're on the service page -- delete the default cache if defined (adrdefaultcache^) delete (adrdefaultcache) bundle //see if we can serve from the cache if defined (adrcache^) if defined (adrincache^) return (adrincache^) local (globeimg, xmlimg, searchimg, checkmarkimg, mediaimg, commentimg, postbuttonimg, permalinkimg) bundle //precalc img refs globeimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/remote") xmlimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/xml") searchimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/search") checkmarkimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/checkmark") postbuttonimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/post") mediaimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/sound") commentimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/pencil") permalinkimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/itemPermalink") add ("

"); indentlevel++ add ("") //PBS 01/11/01: name the form, so the script doesn't try to process some other script's form add ("
  
") bundle //message at the top of the page if flOneService local (t) new (tabletype, @t) t.channeltitle = decodeEntities (adrservice^.compilation.channeltitle) add (newsRiverSuite.getString ("aggregator.oneChannelMessage", @t)) pta^.title = t.channeltitle else local (t) new (tabletype, @t) t.subscriptionurl = newsRiverData.systemUrls.subscriptionList add (newsRiverSuite.getString ("aggregator.standardMessage", @t)) add (newsRiverSuite.getString ("aggregator.clickThePostButton")) if adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault add (newsRiverSuite.getString ("aggregator.checkBoxesOnIntro")) else add (newsRiverSuite.getString ("aggregator.checkBoxesOffIntro")) if flOneService add (newsRiverSuite.getString ("aggregator.howToUnsubscribe")) local (adrtable = @adrdata^.stories, sizetable = sizeof (adrtable^), i) add ("
"); indentlevel++ add (""); indentlevel++ local (lastchanneltitle = "", ctstories = 0) bundle //loop over the news items for i = sizetable downto 1 local (adritem = @adrdata^.stories [i]) bundle //skip missing or empty stories if not defined (adritem^.storyText) //skip this story -- this can happen if the scan is interrupted continue if (string.trimWhiteSpace (searchEngine.stripMarkup (adrItem^.storyText)) == "") and (not (string.lower (adrItem^.storyText) contains " ctStoriesToList break if adritem^.channeltitle != lastchanneltitle //display channel title local (globe = "") try //link the globe to the HTML rendering of the channel with adrservice^.compilation local (desc = searchengine.stripmarkup (channeldescription)) globe = "" + globeimg + "" //PBS 02/12/01: fix bug where quotes and carets in a channel description would mess up rendering -- an example was Dave Winer: Two-Way Web, which has a description of You're soaking in it! ";->" local (xmllink) bundle //link the XML icon to the source XML file for the channel xmllink = "
" + xmlimg + "
" local (magglass = "") bundle //load up the magnifying glass with some HTML if not flOneService local (url, args) new (tabletype, @args) args.xmlUrl = adritem^.url url = "?" + webserver.encodeArgs (@args) magglass = " " + searchimg + "" add ("") lastchanneltitle = adritem^.channeltitle bundle //add story add (""); indentlevel++ bundle //add checkbox local (checkboxtext = " ") if adrdata^.newsRiver.flItemCheckboxes local (name = number (nameof (adritem^))) local (checkboxval = "xxx ") if adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault checkboxval = checkboxval + "checked" checkboxtext = "" add ("") add ("") bundle //add POST button, checkmark local (url) bundle //set url local (args); new (tabletype, @args) if adrdata^.newsRiver.flNewsPageReturnAfterPost //add referer arg to redirect back to this item after posting it to your weblog if pta^.searchargs != "" args.referer = uri + "?" + pta^.searchargs + "#" + i else args.referer = uri + "#" + i args.idStory = number (nameof (adritem^)) url = newsRiverData.systemUrls.postToWeblog + "?" + webserver.encodeArgs (@args) local (checkmark = "", enclosure = "", comments = "", permalink = "") bundle //an item has a checkmark if it's been blogged if defined (adritem^.adrBlogPost) checkmark = " " + checkmarkimg + "" bundle //if it has an enclosure add a media link if defined (adritem^.enclosure) if not defined (adritem^.enclosure.error) local (url) if defined (adritem^.enclosure.f) url = html.getfileurl (adritem^.enclosure.f) else url = adritem^.enclosure.url enclosure = " " + mediaimg + "" bundle //if it has comments add a comment link if defined (adritem^.comments) local (onclick = "window.open (this.href, \'comments\', \'width=515, height=480, location=0, resizable=1, scrollbars=1, status=0, toolbar=0, directories=0\'); return(false);") local (tooltip = newsRiverSuite.getString ("misc.clickToCommentOnThisPost")) comments = "
" + commentimg + "
" bundle //if it has permalink add a permalink link if defined (adritem^.permalink) permalink = "" + permalinkimg + "" local (icons = "") bundle //set icons if (sizeof (checkmark) > 0) or (sizeof (enclosure) > 0) or (sizeof (permalink) > 0) or (sizeof (comments) > 0) icons = "

" + comments + checkmark + enclosure + permalink + "

" add ("") add (""); indentlevel-- if ctstories == 0 add ("") add ("
 " + globe + " " + decodeEntities (adrItem^.channelTitle) + ", " + adritem^.time + "." + magglass + "" + xmllink + "
" + checkboxtext + "
  " + adritem^.storytext + "
" + postbuttonimg + "" + icons + "
" + newsRiverSuite.getString ("aggregator.noStories") + "
"); indentlevel-- add ("
"); indentlevel-- local (flDeleteButtonAdded = false) if flOneService if defined (adrservice^) add ("

  

") flDeleteButtonAdded = true if not flDeleteButtonAdded add ("

") add ("
"); indentlevel-- if adrdata^.newsRiver.flCacheNewsItemsPage adrincache^ = htmltext return (htmltext) bundle //test code html.setpagetableaddress (@scratchpad.newsparams) webbrowser.displaytext (viewNewsItems ()) webbrowser.bringtofront () WdatatablGwԿw createdSun, 16 Oct 2005 17:58:28 GMTWdatatablGw׿w createdSun, 16 Oct 2005 17:58:31 GMTWdatatablGww createdSun, 16 Oct 2005 17:58:58 GMTWdatatablGxx createdMon, 17 Oct 2005 13:06:32 GMTWdatatablGxx createdMon, 17 Oct 2005 13:06:37 GMTWdatatablGzz createdTue, 18 Oct 2005 19:36:01 GMTWdatatablGzz createdTue, 18 Oct 2005 18:35:54 GMTWdatatablG~~ createdFri, 21 Oct 2005 18:25:32 GMTWdatatablG createdFri, 30 Dec 2005 22:03:37 GMTWdatatablGuu createdTue, 08 Nov 2005 17:03:49 GMTWdatatablG<< createdTue, 08 Nov 2005 01:14:59 GMTWdatatablGyKyK createdMon, 17 Oct 2005 16:07:23 GMTWdatatablGyUyU createdMon, 17 Oct 2005 16:07:33 GMTWdatatablGyXyX createdMon, 17 Oct 2005 16:07:36 GMTWdatatablGyLyL createdMon, 17 Oct 2005 16:07:24 GMTWdatatablGwgwg createdSun, 16 Oct 2005 18:00:55 GMTWdatatablGxx createdSun, 16 Oct 2005 20:27:04 GMTWdatatablGwkwk createdSun, 16 Oct 2005 18:00:59 GMTWdatatablGxrxr createdSun, 16 Oct 2005 20:21:54 GMTrH83/GenevaQzLANDmac on viewSubscriptions () Changes: 1/17/06; 7:03:36 PM by DW More defensive driving around missing channeltitles. 3/20/02; 9:43:09 AM by DW Don't try to work with channels that don't have channelTitles. In theory this is never supposed to happen. But enough users are getting broken by this, I felt it was time to work around the problem. 3/19/02; 5:27:30 PM by DW Support for partnerFeed attribute on GET request. 1/24/02; 7:26:51 PM by DW Minor tweaks and reworks to make the page work better. Moved the Unsubscribe button to the bottom of the page. 1/13/02; 11:18:05 PM by JES If a searchArg named url is present, use its value for the value of the URL-entry box. This makes it possible to create a link on your website, which allows people to subscribe their copy of Radio to your RSS feed. 1/9/02; 12:52:03 AM by JES Decode entities in the channel name in the success message, which appears after subscribing to a new channel. 1/9/02; 12:47:39 AM by JES Moved the Delete button to a similar location to where it is on the News page -- it's no longer on its own, to the right of the subscriptions table. Added
tags to the date field in the subscriptions table, so that the dates won't wrap to multiple lines. 1/6/02; 4:25:04 AM by JES Added table css classes. 1/4/02; 3:32:20 PM by JES Commented out some debugging code. 12/12/01; 11:16:32 AM by DW Workaround crashing bug in kernel. 12/10/01; 1:38:16 AM by JES Decode entities in the channel title -- no more ' in the page. 12/8/01; 12:50:36 PM by DW Adding a new subscription should provide feedback. "You are now subscribed to the blah blah feed." Improved the error message when a subscription doesn't work. 11/24/01; 3:55:33 PM by DW Added help link. 11/14/01; 10:00:27 AM by DW Localized. 1/23/01; 3:12:53 PM by DW Created. 2/12/01; 10:00:38 AM by DW Clean up and debug. Add headers to columns. Fixed a major bug in unsubscribing. If you unsubscribed from more than one channel, it would change the indexing and believe it or not it would unsubscribe from the wrong channels. Oy. Now we scan in reverse order and pad the checkbox names with 0's so things get deleted in the correct order. 2/12/01; 4:40:42 PM by PBS Channels with quotes and angle brackets in the description would message up the rendering. Fixed. Link title for the XML button, so it's consistent with other pages. 2/24/01; 6:16:29 PM by PBS Help links. 3/4/01; 5:05:00 PM by JES Toss the HotList cache when subscribing or unsubscribing to/from a channel. 3/4/01; 6:13:06 PM by JES Toss the homepage cache when unsubscribing from a channel. 3/5/01; 8:47:23 PM by PBS Fixed a typo when tossing the hot list cache. 7/26/01; 4:04:24 PM by JES Don't error if a channel's channeldescription or channellink aren't defined. local (pta = html.getpagetableaddress ()) scratchpad.vsparams = pta^ pta^.title = newsRiverSuite.getString ("subscriptions.title") local (adrdata = xml.aggregator.init ()) local (xmlImg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/xml")) local (htmltext = "", indentlevel = 0) on add (s) htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r\n" local (errorstring = "", initialurl = "http://", adrnewservice = nil, flopmlsub = false, opmltitle = "") if pta^.method == "POST" local (args) new (tabletype, @args) webserver.parseargs (pta^.requestbody, @args) if defined (args.subscribe) if sizeof (args.url) > sizeof (initialurl) bundle //set flopmlsub local (xmltext = tcp.httpreadurl (args.url), xstruct) xml.compile (xmltext, @xstruct) try xml.getaddress (@xstruct, "opml") opmltitle = string.nthfield (args.url, "/", string.countfields (args.url, "/")) flopmlsub = true if flopmlsub try local (adrlist = @adrdata^.newsRiver.readingLists.[args.url]) if defined (adrlist^) errorstring = "Can't subscribe because you are already subscribed to the list." else new (tabletype, adrlist) newsRiverSuite.readingList.beforeScan () adrnewservice = adrlist else errorstring = tryerror else if not xml.aggregator.subscribeService (args.url, @errorstring, @adrnewservice) initialurl = args.url if defined (args.unsubscribe) delete (@args.unsubscribe) try {delete (@args.url)} local (i, adr, ix) for i = sizeof (args) downto 1 adr = @args [i] ix = number (nameof (adr^)) if ix > 100000 //it's a reading list local (adrlist = @adrdata^.newsriver.readinglists [ix - 100000]) newsRiverSuite.readingList.unsubscribe (nameof (adrlist^)) else //it's a feed local (adrservice = @adrdata^.services [ix]) xml.aggregator.unsubscribeService (nameof (adrservice^)) local (sortedtable) bundle //fill sorted table local (adrsort) new (tabletype, @sortedtable) for adr in @adrdata^.services bundle //don't show feeds that come from reading lists if defined (adr^.flManualSub) if not adr^.flManualSub continue if defined (adr^.compilation) if sizeof (adr^.compilation) > 0 try //missing channeltitle doesn't stop us -- 3/20/02 DW local (channeltitle = adr^.compilation.channeltitle) if sizeof (channeltitle) > 0 adrsort = @sortedtable.[adr^.compilation.channeltitle] if defined (adrsort^) //collision local (ct = 1) loop adrsort = @sortedtable.[adr^.compilation.channeltitle + "." + ct++] if not defined (adrsort^) break adrsort^ = nameof (adr^) local (oldtarget = target.set (@sortedtable)) table.sortby ("Value") target.set (oldtarget) scratchpad.sortedtable = sortedtable; edit (@scratchpad.sortedtable) add ("
"); indentlevel++ bundle //add the URL entry box if pta^.method == "GET" //1/13/02 JES: try to set initialurl if defined (pta^.radioResponder.getArgs.url) initialurl = pta^.radioResponder.getArgs.url if defined (pta^.radioResponder.getArgs.partnerFeed) //something like "nyt.arts" local (feed = pta^.radioResponder.getArgs.partnerFeed) local (part1 = string.nthfield (feed, ".", 1)) local (part2 = string.nthfield (feed, ".", 2)) local (adrurl = @radio.data.partnerUrls.[part1].[part2]) if defined (adrurl^) initialurl = adrurl^ add ("

" + newsRiverSuite.getString ("subscriptions.subscribeIntro") + "

") add ("
"); indentlevel++ add (""); indentlevel++ add (""); indentlevel++ add ("") add ("") add ("") add (""); indentlevel-- add ("") add ("
" + "URL" + ":" + "
" + radio.userInterface.helpLink ("addChannel") + "
"); indentlevel-- add ("
"); indentlevel-- if errorstring != "" add ("" + newsRiverSuite.getString ("subscriptions.cantSubscribeBecause") + "\"" + errorstring + "\"
") if adrnewservice != nil 12/12/01; 11:16:51 AM by DW Site of a crashing bug in Radio 7.1b36. Workaround provided by Lawrence Lee. (Good work!!) local (t) new (tabletype, @t) if flopmlsub t.channeltitle = opmltitle else //1/17/06 by DW, do it in a try try t.channeltitle = newsRiverSuite.decodeEntities (adrnewservice^.compilation.channeltitle) else t.channeltitle = "Untitled feed" add (newsRiverSuite.getString ("subscriptions.confirmSubscription", @t)) add ("
") add ("

") bundle //add unsubscribe button add ("
  
") bundle //add the text at the top of the page add (newsRiverSuite.getString ("subscriptions.tableIntro")) add (newsRiverSuite.getString ("subscriptions.tableIntro") + " " + radio.userInterface.helpLink ("The Subscriptions page")) add ("

") add ("
"); indentlevel++ add (""); indentlevel++ add (""); indentlevel-- add ("
"); indentlevel++ bundle //add subscription table add ("
"); indentlevel++ add (""); indentlevel++ local (i, adrsort, adr, adrsource, ct = 0) bundle //add header add ("") on addrow (idForCheckbox, title, channeldescription, channellink, timeLastChange, ctChanges, xmlUrl) local (link) add (""); indentlevel++ bundle //add checkbox local (name = nameof (adr^)) local (checkboxval = "xxx ") if false checkboxval = checkboxval + "checked" add ("") if sizeof (title) > 50 title = string.mid (title, 1, 50) + ".." bundle //set link if sizeof (channellink) > 0 link = "" + newsRiverSuite.decodeEntities (title) + "" else link = newsRiverSuite.decodeEntities (title) add ("") add ("") add ("") add ("") add (""); indentlevel-- bundle //add reading list subscriptions if sizeof (adrdata^.newsriver.readinglists) > 0 local (adrlist) add ("") for adrlist in @adrdata^.newsriver.readinglists addrow (indexOf (adrlist^) + 100000, adrlist^.title, "", "", adrlist^.stats.timeLastChange, adrlist^.stats.ctChanges, nameof (adrlist^)) add ("") for adrsort in @sortedtable adr = @adrdata^.services.[adrsort^] if defined (adr^.compilation) if sizeof (adr^.compilation) > 0 local (title = "Untitled feed") if defined (adr^.compilation.channeltitle) title = adr^.compilation.channeltitle local (channeldescription = "", channellink = "") if defined (adr^.compilation.channeldescription) channeldescription = newsRiverSuite.decodeEntities (adr^.compilation.channeldescription) if defined (adr^.compilation.channellink) channellink = adr^.compilation.channellink addrow (indexOf (adr^), title, channeldescription, channellink, adr^.timeLastChange, adr^.ctChanges, nameof (adr^)) add ("
 NameUpdatedCt 
" + link + "" + newsRiverSuite.getDateString (timeLastChange, false) + "" + ctChanges + "" + xmlimg + "
R E A D I N G   L I S T S
F E E D S
"); indentlevel-- add ("
"); indentlevel-- add ("
"); indentlevel-- add ("
"); indentlevel-- add ("
") add ("
"); indentlevel-- return (htmltext) bundle //test code html.setpagetableaddress (@scratchpad.vsparams) viewSubscriptions () WdatatablG createdWed, 18 Jan 2006 03:03:36 GMTWdatatablG createdWed, 18 Jan 2006 03:03:37 GMT$datatabl77WdatatablG@G@G createdMon, 16 Jan 2006 02:09:11 GMTWdatatablG@K@K createdMon, 16 Jan 2006 02:09:15 GMTWdatatablG@k@k createdMon, 16 Jan 2006 02:09:47 GMTWdatatablG@z@z createdMon, 16 Jan 2006 02:10:02 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:07 GMTWdatatablGBB createdMon, 16 Jan 2006 02:19:35 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:20 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:42 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:44 GMTWdatatablGVV createdTue, 08 Nov 2005 21:20:01 GMTWdatatablGWjWj createdTue, 08 Nov 2005 21:23:54 GMTWdatatablGWoWo createdTue, 08 Nov 2005 21:23:59 GMTWdatatablGWW createdTue, 08 Nov 2005 21:24:23 GMTWdatatablGWW createdTue, 08 Nov 2005 21:24:25 GMTWdatatablGDlDl createdMon, 16 Jan 2006 02:26:52 GMTWdatatablGB\B\ createdMon, 16 Jan 2006 02:18:04 GMTWdatatablGDbDb createdMon, 16 Jan 2006 02:26:42 GMTWdatatablGDdDd createdMon, 16 Jan 2006 02:26:44 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:46 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:11 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:19 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:33 GMTWdatatablG;?;? createdMon, 16 Jan 2006 01:47:43 GMTWdatatablG:: createdMon, 16 Jan 2006 01:46:35 GMTWdatatablG== createdMon, 16 Jan 2006 01:57:33 GMTWdatatablG== createdMon, 16 Jan 2006 01:57:45 GMTWdatatablG=Ŀ= createdMon, 16 Jan 2006 01:58:28 GMTWdatatablG=ѿ= createdMon, 16 Jan 2006 01:58:41 GMT$datatabl<<$datatabl<<WdatatablGBsBs createdMon, 16 Jan 2006 02:18:27 GMTWdatatablGBxBx createdMon, 16 Jan 2006 02:18:32 GMTWdatatablGB{B{ createdMon, 16 Jan 2006 02:18:35 GMTWdatatablG createdWed, 18 Jan 2006 03:01:52 GMT$datatabl<<WdatatablG createdWed, 18 Jan 2006 03:01:54 GMTWdatatablG錄 createdWed, 18 Jan 2006 03:01:56 GMT$datatabl<<WdatatablG00 createdMon, 16 Jan 2006 01:02:11 GMTWdatatablG<"<" createdMon, 16 Jan 2006 01:51:30 GMTWdatatablG<< createdMon, 16 Jan 2006 01:51:24 GMTWdatatablG<.<. createdMon, 16 Jan 2006 01:51:42 GMTWdatatablG<8<8 createdMon, 16 Jan 2006 01:51:52 GMTWdatatablG= 0 and x <= 31 return (true) if myIp beginsWith "192.168." //192.168.x.x is ok. (Class C) return (true) scriptError ("Access denied.") else pta^.responseBody = webserver.util.buildErrorPage ("403 Forbidden", "Access denied.") pta^.code = 403 return (true) //we handled the wsf request WdatatablG)) createdWed, 25 Jan 2006 16:15:37 GMTWdatatablGJJ createdWed, 25 Jan 2006 16:33:14 GMTWdatatablG;; createdWed, 25 Jan 2006 16:15:55 GMTWdatatablG縿 createdWed, 25 Jan 2006 16:30:48 GMT$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablssWdatatablG createdWed, 25 Jan 2006 16:31:54 GMT$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablssWdatatablG뻿 createdWed, 25 Jan 2006 16:47:55 GMT$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablssWdatatablG createdWed, 25 Jan 2006 16:30:57 GMT$datatablss$datatablssWdatatablGҿ createdWed, 25 Jan 2006 16:31:14 GMTn<w'.K  * 4@ O[ eq    -9 ?K T` fr }      ' 2> IU _k s    backgroundbackup{ callbacksdecodeEntitiesP doScanNowS getDateStringY`getHomePageAddress\ getStringFimportDefaultSubscriptions importOpmlinit`menuD menuCommands?notesoldstuff/pagesD podcatcher ] readingList responderlstatusCenterMessageYtranslateToEntitiesfuntaintmupdateAfterScanqP updateCodeq updateToolz utilitiesviewLog viewNewsItemsviewSubscriptionswsfMasterControl%1VGenevaSOXJՀGenevaw߿w'?LANDmac This script runs in its own thread. loop //loop until the application quits Add your code here. thread.sleepFor (10) //sleep for ten seconds TP.w߿z ctenabledscript`ATtGeneva F 2 LANDmac on finalFilter (pta) pta^.renderedText = string.replace (pta^.renderedText, "[[title]]", "") return (true) ����������������������������� ���-����Geneva���������������������������� ��������������Eu �������2 LAND������mac ������������on firstFilter (adrPageTable) return (true) �����������������������*��[����Geneva���������������������������� ��������������Eu ���r���}�2'LAND������mac ������������on pageFilter (pta) if typeOf (pta^.template) == outlineType or typeOf (pta^.template) == wpTextType table.assign (@pta^.template, string (pta^.template)) if typeOf (pta^.template) == stringType and not pta^.indirectTemplate pta^.template = string.replace (pta^.template, "<title>", "[[title]]") html.addPageToGlossary (pta) return (true) �����������������������������������������������y���.���E7�������� ���� ��� ����$���0 ����; finalFilter���� � firstFilter���� � pagefilter���� �Г��VGeneva���������������������������� �����������G�N��)�����������������������������������A������7w�������� ����url���http://127.0.0.1/newsRiver/��VGeneva���������������������������� ������������A��'����������������������������L�������H���$���>*>*�������� ���� ��� ����linetext��� path��� prefs.wsf���L�������������$���ll�������� ���� ���y ����~linetext���l["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.logpath���log.wsf����������������$���؜q؜q�������� ���� ��� ����linetext���u["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblogpath���postToWeblog.wsf������R�������N���$����������� ���� ��� ����linetext��� Event logpath���log.wsf���R��O��������$���>>�������� ���� ��� ����linetext���Homepath��� index.wsf��O���Z�������V���$����������� ���� ��� ����!linetext���News Aggregatorpath��� index.wsf���Z��V�������X���$���00�������� ���� ��� ����linetext���Homepath��� index.wsf���������V���T�������P���$����������� ���� ��� ����linetext��� Salon.compath��� index.wsf���T��"�����l���$���&i&i�������� ���� ��"���2�������.������w޿w�������� ����any������F���2���S�������O���$���꪿�������� ���� ��� ����linetext��� Test pagepath���test.wsf���S���]������U���$���VV�������� ���� ��� ���� linetext���plasticbag.orgpath��� index.wsf������]���n�������j���$���VV�������� ���� ���0 ����5linetext���#Scobleizer - Microsoft Geek Bloggerpath��� index.wsf���n���j������R���$���VV�������� ���� ��� ����linetext��� Newsome.Orgpath��� index.wsfloggerpath��� index���j���Y�������U���$���VV�������� ���� ��� ���� linetext���Ask MetaFilterpath��� index.wsf���Y���R�������N���$���VV�������� ���� ��� ����linetext���Joystiqpath��� index.wsf���R���`������U���$���W;W;�������� ���� ��� ���� linetext���Scripting Newspath��� index.wsfons.wsf���`����������W����������������������space���/GIFfGIF89a�������!����,�������D�;��VArial����������������������������� ������������������������������������������������� 6������������Geneva������������������������������������������JJ�������LAND������mac ������������Changes 1/7/06; 10:17:21 PM by DW This is where we try to work around the problem with Firefox on Windows, explained in #2 of this post. http://support.opml.org/2006/01/05#a539 If the object wasn't found (that's how we got here) see if there is something that matches the path supplied with one extra character. If so, redirect there. bundle //workaround for Firefox on Windows local (pta = html.getpagetableaddress ()) local (path = pta^.path, adr, s, newuri) local (name = string.lower (string.nthfield (path, "/", string.countfields (path, "/")))) for adr in @newsRiverWebsite s = nameof (adr^) if string.lower (string.delete (s, sizeof (s), 1)) == name newuri = string.delete (pta^.uri, sizeof (pta^.uri) - sizeof (name) + 1, sizeof (name)) + s scratchpad.onfparams = pta^ pta^.code = 302 //non-permanent redirect pta^.responseBody = webserver.util.buildErrorPage ("302 FOUND", "Found the page.") pta^.responseHeaders.location = newuri pta^.responseHeaders.URI = newuri ���������Wdatatabl����G������::�������� ����created���Fri, 06 Jan 2006 15:17:30 GMT����Wdatatabl����G������>>�������� ����created���Fri, 06 Jan 2006 15:17:34 GMT����Wdatatabl����G������YY�������� ����created���Fri, 06 Jan 2006 15:18:01 GMT����Wdatatabl����G������[[�������� ����created���Fri, 06 Jan 2006 15:18:03 GMT����Wdatatabl����G�������������� ����created���Fri, 06 Jan 2006 15:19:11 GMT����Wdatatabl����G�������������� ����created���Fri, 06 Jan 2006 15:19:33 GMT����Wdatatabl����G������vv�������� ����created���Sun, 08 Jan 2006 03:08:54 GMT����Wdatatabl����G������PP�������� ����created���Sun, 08 Jan 2006 03:08:16 GMT����Wdatatabl����G������쌿�������� ����created���Sun, 08 Jan 2006 03:09:16 GMT����Wdatatabl����G�������������� ����created���Sun, 08 Jan 2006 03:10:47 GMT����Wdatatabl����G������왿�������� ����created���Sun, 08 Jan 2006 03:09:29 GMT����Wdatatabl����G������BB�������� ����created���Sun, 08 Jan 2006 03:12:18 GMT����Wdatatabl����G������Ϳ�������� ����created���Fri, 06 Jan 2006 15:19:57 GMT��������������������� 6��g������ ���j�������'.C�������� ������� �������"�������+ ����0���: ����M���S ����h���n ����w��� ������� ����alink���008000bgcolor���FFFFFFflRenderlink���0000FFmacroEndCharacters���%>macroStartCharacters���<%spaceGif���spacetext���000000vlink���800080��VArial����������������������������� �����������������������������������������������g������0D��������Geneva������������������������������������������JJ������m�LAND������mac ������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>NewsRiver: <%title%> <%metaTags ()%> <%bodyTag ()%>

NewsRiver: <%title%>

<%bodytext%> WdatatablGoo createdTue, 08 Nov 2005 16:59:27 GMTn8>VArial nGeneva俕<'?<LANDmac local (htmltext, args) new (tabletype, @args) htmltext = newsRiverSuite.viewNewsItems (@args) if defined (args.redirect) dialog.alert ("Redirect" + args.redirect) return (htmltext) WdatatablGww createdTue, 01 Nov 2005 14:28:07 GMTWdatatablG~~ createdTue, 01 Nov 2005 14:28:14 GMTWdatatablG createdTue, 01 Nov 2005 14:28:21 GMTWdatatablG createdTue, 01 Nov 2005 14:28:36 GMTWdatatablG createdTue, 01 Nov 2005 14:29:13 GMT4W]#GenevaTT LANDmac return (newsRiverSuite.viewLog ()) WdatatablG createdTue, 01 Nov 2005 14:29:13 GMTXGeneva؛؜`:LANDmac local (pta = html.getpagetableaddress ()) new (tabletype, @args) webserver.parseargs (pta^.searchargs, @args) newsRiverSuite.pages.postToWeblog (@args) if defined (args.redirect) //redirect to the url indicated local (url = string (args.redirect)) dialog.alert (url) pta^.code = 302 //non-permanent redirect pta^.responseBody = webserver.util.buildErrorPage ("302 FOUND", "Found the page.") pta^.responseHeaders.location = url pta^.responseHeaders.URI = url try {delete (@pta^.responseHeaders.["Content-Type"])} return ("") WdatatablG؜ ؜ createdThu, 29 Dec 2005 03:46:21 GMTWdatatablG؜؜ createdThu, 29 Dec 2005 03:46:34 GMTWdatatablG؜(؜( createdThu, 29 Dec 2005 03:46:48 GMTWdatatablG~Z~Z createdFri, 21 Oct 2005 15:42:44 GMTWdatatablG~[~[ createdFri, 21 Oct 2005 15:44:48 GMTWdatatablG~[Կ~[ createdFri, 21 Oct 2005 15:48:20 GMT DGenevaJJs6LANDmac on prefs () Changes 1/11/06; 6:56:52 AM by DW Init the aggregator, for the case where viewing Prefs is the first thing the user does (I did it). 1/5/06; 3:11:18 PM by DW For POST requests, parse the args into pta^.postArgs. 1/3/06; 2:45:14 PM by DW Created. local (pta = html.getpagetableaddress ()) scratchpad.prefsparams = pta^ new (tabletype, @pta^.searchArgTable) webserver.parseargs (pta^.searchargs, @pta^.searchArgTable) if pta^.method == "POST" new (tabletype, @pta^.postArgs) webserver.parseArgs (pta^.requestBody, @pta^.postArgs) newsRiverSuite.init () //1/11/06 by DW local (htmltext = radio.prefs.browser (@newsRiverData.english.prefsOutline)) pta^.title = "Preferences" return (htmltext) bundle //test code html.setpagetableaddress (@scratchpad.prefsparams) webbrowser.displaytext (prefs ()) WdatatablG<< createdTue, 03 Jan 2006 19:34:57 GMTWdatatablG>x>x createdTue, 03 Jan 2006 19:45:12 GMTWdatatablG\\ createdWed, 11 Jan 2006 14:56:52 GMTWdatatablG\\ createdWed, 11 Jan 2006 14:56:53 GMTWdatatablG甿 createdThu, 05 Jan 2006 20:11:16 GMTWdatatablG痿 createdThu, 05 Jan 2006 20:11:19 GMTWdatatablG>y>y createdTue, 03 Jan 2006 19:45:13 GMTWdatatablG>{>{ createdTue, 03 Jan 2006 19:45:15 GMTWdatatablG<< createdTue, 03 Jan 2006 19:37:05 GMTWdatatablG;; createdTue, 03 Jan 2006 19:34:22 GMTWdatatablG<< createdTue, 03 Jan 2006 19:37:13 GMTWdatatablG<< createdTue, 03 Jan 2006 19:37:29 GMTWdatatablG˿ createdThu, 05 Jan 2006 20:07:55 GMTWdatatablG\\ createdWed, 11 Jan 2006 14:56:31 GMTWdatatablG== createdTue, 03 Jan 2006 19:42:04 GMTWdatatablG>W>W createdTue, 03 Jan 2006 19:44:39 GMTWdatatablG<< createdTue, 03 Jan 2006 19:35:02 GMTWdatatablG<< createdTue, 03 Jan 2006 19:35:06 GMTWdatatablG<6<6 createdTue, 03 Jan 2006 19:35:34 GMT RGeneva󿌿 '?LANDmac local (htmltext) htmltext = newsRiverSuite.viewSubscriptions () return (htmltext) WdatatablGww createdTue, 01 Nov 2005 14:28:07 GMTWdatatablG createdTue, 01 Nov 2005 14:29:13 GMTYGeneva #_rLANDmac local (pta = html.getpagetableaddress ()) pta^.title = "Test page" return (clock.now ()) WdatatablG createdWed, 25 Jan 2006 15:24:07 GMTWdatatablG createdWed, 25 Jan 2006 15:24:13 GMT%7'.D  * 4@ HT kw ~   #filtersҜ#ftpSite{ #glossary#imagesB#objectNotFoundHandler;#prefsA #templateE$#toolsindex.logG$ postToWeblogCprefsH( subscriptionstestVGeneva vOx?+% w޿w =~w'.J  +7 EQ dp  & ;#webeditserver podmonster newsRiverDatax newsRiverInfoyanewsRiverNodeTypesznewsRiverResponderGnewsRiverRpcHandlers~/newsRiverSoapHandlers~[newsRiverSuitenewsRiverThreadlnewsRiverWebsite(newsRiverWindowTypesYV Lucida GrandeA &(Geneva 8'wBε\'?LANDmac #webeditserver newsRiverData english prefsOutline strings htmlColors images prefs systemUrls defaultSubscriptions news postToWeblog preferences subscriptionList unsub newsRiverInfo author authorEmail description homePageUrl name releaseDate version newsRiverNodeTypes newsRiverResponder newsRiverRpcHandlers newsRiverSoapHandlers newsRiverSuite background backup callbacks decodeEntities doScanNow getDateString getHomePageAddress getString importDefaultSubscriptions importOpml init menu menuCommands notes oldstuff pages postToWeblog unsub viewNews viewSubs playlist podcatcher readingList responder statusCenterMessage translateToEntities untaint updateAfterScan updateCode updateTool utilities viewLog viewNewsItems viewSubscriptions wsfMasterControl newsRiverThread newsRiverWebsite #filters finalFilter firstFilter pagefilter #ftpSite #glossary #images #objectNotFoundHandler #prefs #template #tools index log postToWeblog prefs subscriptions test newsRiverWindowTypes èèèè,è,èèèèè8è8è8è8è8è8èè(è(è(è(è(è(è(èèèèèèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬè➤è➤è➤è➤èĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèĬèèè è,è,è,è è è è è è è è è è è è è è/X=@8 Lucida Grande  Lucida Grande TGeneva ^= Lucida Grande m. Lucida Grande Lucida Grande  `\$&_&_  linetext Subscriptionspathsubscriptions.wsfEv$'+'+  linetext Preferencespath prefs.wsfptions.wsf`v$&\k&\k  linetext Preferencespath prefs.wsfVw g$w-=  ctbackups lastFeedUrl%http://www.valleywag.com/excerpts.xmlog/index.rdf( ]=Geneva'.K'.K ,LANDmac Aggregator preferences Enable the aggregator? <%radio.prefs.checkboxPref ("Check this box to enable the aggregator. If it's enabled, NewsRiver will automatically scan the feeds you're subscribed to each hour, adding new or changed items to the News page.", @aggregatorData.prefs.enabled)%> Remote access and security You can access NewsRiver through any Web browser whether it's running on the same computer as the OPML Editor, or over the Internet. The settings on this page allow you to secure remote access by requiring a username and password.

<%radio.prefs.checkboxPref ("Check this box to enable access to NewsRiver over the Internet. Leave it unchecked if you want to allow access only from the same computer that's running the OPML Editor.", @aggregatorData.newsRiver.security.allowRemoteViewing)%> <%radio.prefs.checkboxPref ("Check this box if you want to allow posting of forms over the Internet.", @aggregatorData.newsRiver.security.allowRemotePost)%> <%radio.prefs.checkboxPref ("Check this box to require user authentication when accessing NewsRiver over the Internet. If this box is checked, remote users will receive a username/password dialog box when they access your site from another computer. Enter the username and password below.", @aggregatorData.newsRiver.security.requireRemoteLogin)%>
<%radio.prefs.stringPref ("Username", @aggregatorData.prefs.security.username)%> <%if html.getpagetableaddress ()^.method != "POST" {system.temp.newsRiver.repeatedPassword = aggregatorData.prefs.security.password}; ""%> <%radio.prefs.stringPref ("Password", @system.temp.newsRiver.repeatedPassword, type:"password")%> <%radio.prefs.stringPref ("Repeat Password", @aggregatorData.prefs.security.password, type:"password")%> <%try {delete (@system.temp.newsRiver.repeatedPassword)}; ""%>

Note: If you enable access to your Web server over the Internet, the NewsRiver home page can be reached via its IP address, <%newsRiverSuite.getHomePageAddress ()%>, or via its domain name if it has one. When and how the aggregator runs If the aggregator is enabled it runs once per hour. The next preference says at what minute in each hour the scan will run. For example, if you enter 0, it will scan at the top of the hour; if you enter 59, it will scan at one minute before the top of the hour.

<%radio.prefs.numberPref ("Minute to scan", @aggregatorData.prefs.minuteToRead, upperbound:59)%>
The aggregator is multi-threaded. This means it can read read several feeds at the same time. The larger this number the quicker it will finish each scan, but it may make your machine slower while the scan is running. <%radio.prefs.numberPref ("Number of threads", @aggregatorData.prefs.maxThreads, lowerbound:1, upperbound:10)%> How many items? How many items do you want to display on the News page? The more items you ask for the longer it will take to display the page. If you subscribe to a lot of channels and have a fast computer, make the number large. If you don't find yourself scrolling to the bottom of the page very often, or if you find the News Aggregator page loads slowly, you can make it smaller.

<%radio.prefs.numberPref ("Number of items on the News page", @aggregatorData.newsRiver.ctStoriesOnNewsPage, upperbound:1000)%> Checkboxes on or off? <%radio.prefs.checkboxPref ("Check this box if you want the checkboxes next to each news item to be checked by default. This makes it easier to delete news items, only keeping those that you want to refer to later.", @aggregatorData.newsRiver.flNewsPageDeleteCheckboxesDefault)%> Podcasting NewsRiver has a podcasting client built-in, or a podcatcher. As it's scanning for changes, NewsRiver saves information about enclosures so it can download them later. This page allows you to determine when it downloads enclosures and where it stores them.

<%radio.prefs.checkboxPref ("Check this box to automatically download enclosures included in feeds you subscribe to. ", @aggregatorData.newsRiver.podcatcher.prefs.enabled)%>
<%radio.prefs.stringPref ("Save enclosures in this folder", @aggregatorData.newsRiver.podcatcher.prefs.folder, maxlength:400)%>
The downloads happen at night, when Internet traffic is low, and when you're not likely to be using your computer. It's a way of time-shifting large downloads.
<%radio.prefs.numberPref ("Start downloading at", @aggregatorData.newsRiver.podcatcher.prefs.hourToStartDownloads, lowerbound:0, upperbound:23, textToRight:" hours after midnight.")%> <%radio.prefs.numberPref ("Stop downloading at", @aggregatorData.newsRiver.podcatcher.prefs.hourToStopDownloads, lowerbound:aggregatorData.newsRiver.podcatcher.prefs.hourToStartDownloads, upperbound:23, textToRight:" hours after midnight.")%>
<%radio.prefs.checkboxPref ("Check this box to automatically create an outline which contains links to downloaded enclosures.", @aggregatorData.newsRiver.podcatcher.prefs.flOutlineEnclosures)%> How the aggregator handles errors Like all web services, RSS feeds can disappear. Rather than delaying the hourly scans, and wasting network bandwidth, after a certain number of errors NewsRiver will automatically unsubscribe from the errant feed. This preference says how many errors NewsRiver will accept before unsubscribing.

<%radio.prefs.numberPref ("Number of errors before automatic unsubscribe", @aggregatorData.prefs.maxErrorsBeforeAutoUnsubscribe)%> Archiving options Once an hour the aggregator deletes old items and archives them (if you want it to).

<%radio.prefs.checkboxPref ("Check this box to automatically delete old news items once an hour. Only items that have not been routed to your weblog are deleted. We recommend that you enable this option.", @aggregatorData.prefs.flArchive)%>
How old must an item be (in hours) in order to be deleted? <%radio.prefs.numberPref ("Hours before archive", @aggregatorData.prefs.hoursBeforeArchive, lowerbound:1, upperbound:100)%>
At what minute in each hour would you like old items to be deleted? (If it's 0, it happens at the top of the hour; if it's 15, it runs at 15 minutes into each hour.) <%radio.prefs.numberPref ("Minute to archive", @aggregatorData.prefs.minuteToArchive, upperbound:59)%>
<%radio.prefs.checkboxPref ("Check this box if you want deleted news items to be saved in XML in the backups sub-folder of the OPML Editor folder. Unless you have a specialized application for news items, or are an XML geek (as we are), you probably want to leave this option off. Otherwise your local disk will get cluttered with XML files that you probably don't really care about.", @aggregatorData.prefs.flSaveArchiveXmlFiles)%> Aggregator API The Aggregator API makes it possible for developers to build new user interfaces for the aggregator in languages and environments such as Javascript or Flash; basically any environment that supports XML-RPC. By default, the API is not turned on. From this page you can choose to turn it on, and set your username and password.

<%radio.prefs.checkboxPref ("Check this box to enable the Aggregator API.", @aggregatorData.prefs.security.flRpcInterfaceEnabled)%>
<%radio.prefs.stringPref ("Username", @aggregatorData.prefs.security.username)%> <%if html.getpagetableaddress ()^.method != "POST" {system.temp.newsRiver.repeatedPassword = aggregatorData.prefs.security.password}; ""%> <%radio.prefs.stringPref ("Password", @system.temp.newsRiver.repeatedPassword, type:"password")%> <%radio.prefs.stringPref ("Repeat Password", @aggregatorData.prefs.security.password, type:"password")%> <%try {delete (@system.temp.newsRiver.repeatedPassword)}; ""%> WdatatablGMM createdTue, 03 Jan 2006 20:49:35 GMT$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+lWdatatablGϥϥ createdThu, 19 Jan 2006 13:09:57 GMTWdatatablGϨϨ createdThu, 19 Jan 2006 13:10:00 GMT$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+lWdatatablG]g]g createdWed, 11 Jan 2006 14:59:51 GMTWdatatablGcſc createdWed, 11 Jan 2006 15:27:01 GMT$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l$datatabl(+l(+l(L('.D  F QY dl r eventHeaderEventintro'This page lists the most recent events. secsHeaderSecs timeHeaderTimetitle Events LogwhatHappenedHeaderWhat4FFFF000000060001001777AA000000000071000000001001710000001-77FB6FBE1800000480048063C200-14B4F4B4F063C222FFFF01034A0000100000036000000010B34084063C2229B048C0002A63CC700002000000B800000000B3,Congratulations, you have successfully subscribed to "[[channeltitle]]". It now appears in your subscriptions list below; new items will appear on the News page every hour.00040000000A0000000201B51000500000009000000020B500006000000650000000210920FFFF0A00000 10 10E310FFFF0E00000 10 0007000000190000000102011000080000015D0000000240,Arial40,10407D104E44000321400400080101040,Geneva40,1040304E401010000900000015000000023F72F93F72F9000A000000150000000263C22263C222000B00000005000000020000C00000018000000014A4B4F1DF02000000F0000005200000000400 10 4,pV4,77A4,(K;4,4,4 4,4,00130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AA7^CG 0<4c>Genevaw޿ \ALANDmac on any (pta) return (newsRiverSuite.responder.handler (pta)) WdatatablG createdSun, 22 Jan 2006 14:22:21 GMT.w޿ 3; C condition%newsRiverSuite.responder.condition ()enabledmethodsV Lucida Grandea2xGeneva_cLANDmac condition enabled methods any SASASASP:\Geneva '.I'.I LANDmac Changes 1/19/06; 6:34:03 AM by DW Start downloading podcasts according to hourToStartDownloads pref. local (adrdata = newsRiverSuite.init ()) if adrdata^.newsRiver.podcatcher.prefs.enabled if date.hour () == adrdata^.newsRiver.podcatcher.prefs.hourToStartDownloads newsRiverSuite.doScanNow () newsRiverSuite.podcatcher.downloadQueue (true) WdatatablGWW createdThu, 19 Jan 2006 14:33:59 GMTWdatatablGZZ createdThu, 19 Jan 2006 14:34:02 GMTWdatatablG\\ createdThu, 19 Jan 2006 14:34:04 GMTWdatatablG㐿 createdThu, 19 Jan 2006 14:34:56 GMTWdatatablGOO createdThu, 19 Jan 2006 04:01:33 GMTWdatatablGO"O" createdThu, 19 Jan 2006 04:01:38 GMTGeneva'.J'.JLANDmac Changes 1/22/06; 7:11:33 AM by DW Be sure that the init routine is called at least once every minute. 10/16/05; 7:21:21 PM by DW Created. newsRiverSuite.init () WdatatablGि createdSun, 22 Jan 2006 15:11:32 GMTWdatatablGॿ createdSun, 22 Jan 2006 15:11:33 GMTWdatatablGxXxX createdMon, 17 Oct 2005 02:21:19 GMTWdatatablGxXxX createdMon, 17 Oct 2005 02:21:22 GMTNArial '.C'.C{LANDmac on decodeEntities (s, flUntaint=true, flNeuterJavaScript=true) Changes 1/22/02; 2:06:00 PM by DW New optional param, flNeuterJavaScript. 12/12/01; 2:56:19 AM by JES Pass in flSkipMalformedEntities as true to the call to xml.entityDecode. Prevents unwanted macro errors when decoding numerical entities which are malformed. 12/1/01; 3:20:31 PM by JES Created. s = string.replaceAll (s, "'", "\'") s = xml.entityDecode (s, true, true) if flUntaint s = newsRiverSuite.untaint (s, flNeuterJavaScript) return (s) =Geneva'.D'.DYLANDmac Changes 1/14/06; 6:03:38 PM by DW Reading list support. Before we do a scan, check all the reading list, subscribe and unsubscribe from feeds as needed. bundle //if there are no services, load the default subscriptions local (adrdata = xml.aggregator.init ()) if sizeof (adrdata^.services) == 0 newsRiverSuite.importDefaultSubscriptions () window.about () newsRiverSuite.readingList.beforeScan () //1/14/06 by DW local (startticks = clock.ticks ()) xml.aggregator.readAllServices () log.addtooutline ("Scan: " + "Hourly news aggregator scan", startticks:startticks) WdatatablGtt createdSun, 15 Jan 2006 02:03:32 GMTWdatatablGxx createdSun, 15 Jan 2006 02:03:36 GMTWdatatablG|| createdSun, 15 Jan 2006 02:03:40 GMTWdatatablGpοp createdThu, 29 Dec 2005 18:54:06 GMTWdatatablGqq createdThu, 29 Dec 2005 18:57:03 GMTWdatatablGbb createdTue, 08 Nov 2005 03:59:10 GMTWdatatablG createdSun, 15 Jan 2006 02:04:21 GMTWdatatablG﯆﯆ createdSun, 15 Jan 2006 15:51:34 GMTGNArial '.C'.CLANDmac on getDateString (when, flIncludeSeconds=true) Changes 1/15/01; 11:00:50 AM by DW Return the time string if it's today, return the date string if it's earlier. local (day, month, year, hour, minute, second, nowday, nowmonth, nowyear) date.get (when, @day, @month, @year, @hour, @minute, @second) date.get (clock.now (), @nowday, @nowmonth, @nowyear, @hour, @minute, @second) if (day == nowday) and (month == nowmonth) and (year == nowyear) return (date.timestring (when, flIncludeSeconds)) return (date.shortstring (when)) bundle //test code dialog.alert (getdatestring (date (0))) dialog.alert (getdatestring (clock.now ())) G4Geneva'.J'.JQLANDmac Changes 1/24/06; 10:48:00 AM by DW Created. Return a bit of HTML text that links to the NewsRiver home page. It's used in the security prefs page. local (url = "http://" + tcp.dns.getMyDottedId () + ":" + 5337 + "/newsRiver/") return ("" + url + "") WdatatablG^^ createdTue, 24 Jan 2006 18:47:58 GMTWdatatablGbb createdTue, 24 Jan 2006 18:48:02 GMTWdatatablG createdTue, 24 Jan 2006 18:52:48 GMTWdatatablG createdTue, 24 Jan 2006 18:53:03 GMTWdatatablG77 createdTue, 24 Jan 2006 18:51:35 GMTWdatatablG|| createdTue, 24 Jan 2006 18:48:28 GMT9#.a Geneva'.K'.Kj @LANDmac Changes 1/25/06; 8:14:30 AM by DW Hook into wsf responder with callback. 1/24/06; 10:40:45 AM by DW Security prefs. 1/22/06; 6:53:24 AM by DW Install an inetd for port 5335. 1/18/06; 2:21:36 PM by DW Initialize podcatcher. 1/11/06; 7:06:01 AM by DW Create system.temp.newsRiver. 1/3/06; 3:29:24 PM by DW Change the appSignatureUrl to "http://www.newsriver.org/". 12/29/05; 7:52:00 PM by DW Install a post-scan callback that updates newsRiver.root. local (adrdata = xml.aggregator.init ()) bundle //appSignatureUrl if adrdata^.prefs.appSignatureUrl == "http://frontier.userland.com/xmlAggregator" adrdata^.prefs.appSignatureUrl = "http://www.newsriver.org/" if adrdata^.prefs.appSignatureUrl == "http://support.opml.org/newsRiver" adrdata^.prefs.appSignatureUrl = "http://www.newsriver.org/" if adrdata^.prefs.appSignatureUrl == "http://support.opml.org/whatIsNewsRiver" adrdata^.prefs.appSignatureUrl = "http://www.newsriver.org/" bundle //newsRiver prefs if not defined (adrdata^.newsRiver) new (tabletype, @adrdata^.newsRiver) if not defined (adrdata^.newsRiver.ctStoriesOnNewsPage) adrdata^.newsRiver.ctStoriesOnNewsPage = 250 if not defined (adrdata^.newsRiverflCacheNewsItemsPage) adrdata^.newsRiver.flCacheNewsItemsPage = true if not defined (adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault) adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault = false if not defined (adrdata^.newsRiver.flNewsPageReturnAfterPost) adrdata^.newsRiver.flNewsPageReturnAfterPost = true if not defined (adrdata^.newsRiver.flItemCheckboxes) adrdata^.newsRiver.flItemCheckboxes = true if not defined (adrdata^.newsRiver.readingLists) new (tabletype, @adrdata^.newsRiver.readingLists) bundle //podcatcher if not defined (adrdata^.newsRiver.podcatcher) new (tabletype, @adrdata^.newsRiver.podcatcher) if not defined (adrdata^.newsRiver.podcatcher.prefs) new (tabletype, @adrdata^.newsRiver.podcatcher.prefs) if not defined (adrdata^.newsRiver.podcatcher.prefs.enabled) adrdata^.newsRiver.podcatcher.prefs.enabled = false if not defined (adrdata^.callbacks.storyArrived.podcatcher) adrdata^.callbacks.storyArrived.podcatcher = @newsRiverSuite.podcatcher.storyArrivedCallback if not defined (adrdata^.newsRiver.podcatcher.queue) new (tabletype, @adrdata^.newsRiver.podcatcher.queue) if not defined (adrdata^.newsRiver.podcatcher.downloads) new (tabletype, @adrdata^.newsRiver.podcatcher.downloads) if not defined (adrdata^.newsRiver.podcatcher.prefs.queueSerialNum) adrdata^.newsRiver.podcatcher.prefs.queueSerialNum = 1 if not defined (adrdata^.newsRiver.podcatcher.prefs.folder) adrdata^.newsRiver.podcatcher.prefs.folder = frontier.pathstring + "Enclosures" + file.getpathchar () if not defined (adrdata^.newsRiver.podcatcher.prefs.flReclaimBytes) adrdata^.newsRiver.podcatcher.prefs.flReclaimBytes = false if not defined (adrdata^.newsRiver.podcatcher.prefs.ctBytesForEnclosures) adrdata^.newsRiver.podcatcher.prefs.ctBytesForEnclosures = 1024 * 1024 * 1024 //1GB if not defined (adrdata^.newsRiver.podcatcher.prefs.hourToStartDownloads) adrdata^.newsRiver.podcatcher.prefs.hourToStartDownloads = 1 if not defined (adrdata^.newsRiver.podcatcher.prefs.hourToStopDownloads) adrdata^.newsRiver.podcatcher.prefs.hourToStopDownloads = 5 if not defined (adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures) adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures = true if not defined (adrdata^.newsRiver.podcatcher.log) new (outlinetype, @adrdata^.newsRiver.podcatcher.log) bundle //security if not defined (adrdata^.newsRiver.security) new (tabletype, @adrdata^.newsRiver.security) if not defined (adrdata^.newsRiver.security.allowRemoteViewing) adrdata^.newsRiver.security.allowRemoteViewing = false if not defined (adrdata^.newsRiver.security.allowRemotePost) adrdata^.newsRiver.security.allowRemotePost = false if not defined (adrdata^.newsRiver.security.requireRemoteLogin) adrdata^.newsRiver.security.requireRemoteLogin = true bundle //callbacks if not defined (adrdata^.newsRiver.callbacks) new (tabletype, @adrdata^.newsRiver.callbacks) if not defined (adrdata^.newsRiver.callbacks.afterEnclosureDownload) new (tabletype, @adrdata^.newsRiver.callbacks.afterEnclosureDownload) bundle //inetd handler if not defined (user.inetd.http5335) local (adrd = @user.inetd.config.http5335) new (tabletype, adrd) adrd^.count = 30 adrd^.daemon = @system.verbs.builtins.webserver.server adrd^.noWait = true adrd^.port = 5335 adrd^.startup = true adrd^.timeout = 30 inetd.startOne (adrd) bundle //hook into wsf responder local (adrtable = @user.webserver.callbacks.wsfMasterControl) if not defined (adrtable^) new (tabletype, adrtable) if not defined (adrtable^.newsRiver) adrtable^.newsRiver = @newsRiverSuite.wsfMasterControl if not defined (dotOpmlSuite.mdiWindow.images.newsRiver) dotOpmlSuite.mdiWindow.images.newsRiver = @newsRiverData.images if not defined (dotOpmlSuite.mdiWindow.pages.newsRiver) dotOpmlSuite.mdiWindow.pages.newsRiver = @newsRiverSuite.pages bundle //Install a post-scan callback that updates newsRiver.root. if not defined (adrdata^.callbacks.postScan.updateNewsRiverRoot) adrdata^.callbacks.postScan.updateNewsRiverRoot = @newsRiverSuite.updateAfterScan bundle //system.temp.newsRiver if not defined (system.temp.newsRiver) new (tabletype, @system.temp.newsRiver) return (adrdata) WdatatablGۿ createdFri, 30 Dec 2005 03:51:55 GMTWdatatablG createdWed, 25 Jan 2006 16:14:29 GMTWdatatablG createdWed, 25 Jan 2006 16:14:30 GMTWdatatablG createdTue, 24 Jan 2006 18:40:45 GMTWdatatablG createdTue, 24 Jan 2006 18:40:46 GMTWdatatablGdd createdSun, 22 Jan 2006 14:53:24 GMTWdatatablGee createdSun, 22 Jan 2006 14:53:25 GMTWdatatablGpp createdWed, 18 Jan 2006 22:21:36 GMTWdatatablGqq createdWed, 18 Jan 2006 22:21:37 GMTWdatatablG^ٿ^ createdWed, 11 Jan 2006 15:06:01 GMTWdatatablG^ڿ^ createdWed, 11 Jan 2006 15:06:02 GMTWdatatablGHԿH createdTue, 03 Jan 2006 20:29:24 GMTWdatatablGHտH createdTue, 03 Jan 2006 20:29:25 GMTWdatatablGݿ createdFri, 30 Dec 2005 03:51:57 GMTWdatatablG createdFri, 30 Dec 2005 03:52:01 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:05:37 GMTWdatatablG~BS~BS createdFri, 21 Oct 2005 13:59:31 GMTWdatatablGD=D= createdTue, 03 Jan 2006 20:09:49 GMTWdatatablGD7D7 createdTue, 03 Jan 2006 20:09:43 GMTWdatatablGD=D= createdTue, 03 Jan 2006 20:09:49 GMTWdatatablGD7D7 createdTue, 03 Jan 2006 20:09:43 GMTWdatatablGD=D= createdTue, 03 Jan 2006 20:09:49 GMTWdatatablGx2x2 createdMon, 17 Oct 2005 13:03:30 GMTWdatatablGx:x: createdMon, 17 Oct 2005 13:03:38 GMTWdatatablGxGxG createdMon, 17 Oct 2005 13:03:51 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG createdWed, 18 Jan 2006 22:22:42 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG66 createdWed, 18 Jan 2006 22:24:54 GMTWdatatablG__ createdWed, 18 Jan 2006 22:25:35 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG$$ createdTue, 24 Jan 2006 18:34:12 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablGxx createdMon, 17 Oct 2005 13:04:53 GMTWdatatablGxx createdMon, 17 Oct 2005 13:05:03 GMTWdatatablG createdSat, 21 Jan 2006 19:43:54 GMTWdatatablGx:x: createdMon, 17 Oct 2005 13:03:38 GMTWdatatablGxGxG createdMon, 17 Oct 2005 13:03:51 GMTWdatatablGx:x: createdMon, 17 Oct 2005 13:03:38 GMTWdatatablGxGxG createdMon, 17 Oct 2005 13:03:51 GMTWdatatablG}} createdSun, 22 Jan 2006 14:53:49 GMTWdatatablG܂܂ createdSun, 22 Jan 2006 14:53:54 GMTWdatatablGܿ createdSun, 22 Jan 2006 14:55:24 GMTWdatatablGܒܒ createdSun, 22 Jan 2006 14:54:10 GMTWdatatablGܣܣ createdSun, 22 Jan 2006 14:54:27 GMTWdatatablGܧܧ createdSun, 22 Jan 2006 14:54:31 GMTWdatatablGܮܮ createdSun, 22 Jan 2006 14:54:38 GMTWdatatablGܳܳ createdSun, 22 Jan 2006 14:54:43 GMTWdatatablGܹܹ createdSun, 22 Jan 2006 14:54:49 GMTWdatatablGܾܾ createdSun, 22 Jan 2006 14:54:54 GMTWdatatablGʿ createdSun, 22 Jan 2006 14:55:06 GMTWdatatablG㑿 createdWed, 25 Jan 2006 16:13:05 GMTWdatatablG㣿 createdWed, 25 Jan 2006 16:13:23 GMTWdatatablG㮿 createdWed, 25 Jan 2006 16:13:34 GMTWdatatablG㴿 createdWed, 25 Jan 2006 16:13:40 GMTWdatatablGee createdWed, 25 Jan 2006 16:12:21 GMTWdatatablGii createdWed, 25 Jan 2006 16:12:25 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:01:39 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:02:07 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:01:39 GMTWdatatablGx)x) createdSun, 16 Oct 2005 23:02:07 GMTWdatatablG createdFri, 30 Dec 2005 03:52:29 GMTWdatatablG createdFri, 30 Dec 2005 03:52:32 GMTWdatatablG<< createdFri, 30 Dec 2005 03:53:32 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:06:19 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:06:25 GMTWdatatablG^^ createdWed, 11 Jan 2006 15:06:30 GMTWdatatablGx)ѿx) createdSun, 16 Oct 2005 23:01:21 GMT9 ?Genevaw߿w)'?LANDmac newsRiverSuite.doScanNow () 3GenevaTOͿP_cLANDmac xml.aggregator.menuCommands.importSubscriptions () W*GenevaTL5L:'?LANDmac newsRiverSuite.menuCommands.exportOpml ()  (GenevaT؛g؛y_cLANDmac newsRiverSuite.menuCommands.viewNews () GGenevaج¿!_cLANDmac thread.callscript (@newsRiverSuite.menuCommands.viewSubscriptions, {}) AGenevaTÓ'?LANDmac thread.callscript (@newsRiverSuite.menuCommands.preferences, {}) Y)GenevaT_p_cLANDmac newsRiverSuite.menuCommands.subscribe ()  ?GenevaT儿_cLANDmac newsRiverSuite.podcatcher.menuCommands.openEnclosuresFolder () @GenevaT˿_cLANDmac newsRiverSuite.podcatcher.menuCommands.downloadEnclosuresNow () *GenevagXN`_cLANDmac newsRiverSuite.menuCommands.addRssAtts () SjGeneva٣2N_cLANDmac if dialog.confirm ("Get the latest News River code?") thread.callscript (@newsRiverSuite.updateTool, {}) datataW:Genevaw߿'?LANDmac NewsRiver Do scan now... - Import OPML... Export OPML... - View News... View Subscriptions... Preferences... - Subscribe... - Open enclosures folder Downlo #l ?_!RcD'p2YfoYm1q  X5Q-VXfXzM:~EI=4?4W( 4  60DtՀvj"lOfb$W%W% ( -linetextAbout Agnosticism / Atheismpath index.wsff=%Geneva'.F'.FLANDmac if typeof (window.frontmost ()^) != outlinetype scripterror ("Can't Add a feed to an outline because the frontmot window doesn't contain an outline.") if dialog.ask ("URL for feed:", @newsRiverData.prefs.lastFeedUrl) local (adrdata = xml.aggregator.init ()) local (url = newsRiverData.prefs.lastFeedUrl) local (adrservice = @adrdata^.services.[url], atts) local (servicestable) if not defined (adrservice^) new (tabletype, @servicestable) xml.aggregator.readService (url, @servicestable) //10/14/02 DW adrservice = @servicestable.[url] op.insert (adrservice^.compilation.channeltitle, down) new (tabletype, @atts) atts.type = "rss" atts.xmlUrl = url atts.title = adrservice^.compilation.channeltitle atts.htmlUrl = adrservice^.compilation.channellink op.attributes.addgroup (@atts) WdatatablG createdMon, 16 Jan 2006 13:00:34 GMTWdatatablG createdMon, 16 Jan 2006 13:01:12 GMT datata datataWdatatablGG1G1 createdSun, 15 Jan 2006 08:26:25 GMTWdatatablGGQGQ createdSun, 15 Jan 2006 08:26:57 GMTWdatatablGG1G1 createdSun, 15 Jan 2006 08:26:25 GMTWdatatablGG[G[ createdSun, 15 Jan 2006 08:27:07 GMT datataWdatatablGG1G1 createdSun, 15 Jan 2006 08:26:25 GMT datata datata datata datata datata datata datata}iGeneva'.C'.C} LANDmac local (f = newsRiverData.english.strings.aggregator.subsFileName) if file.putfiledialog ("Save subscriptions file", @f) xml.aggregator.saveServicesXml (f) WdatatablGJJ createdTue, 03 Jan 2006 20:36:52 GMT}:Geneva'.C'.CjeLANDmac webbrowser.openurl (newsRiverData.systemUrls.preferences) Geneva'.C'.CLANDmac local (adrdata = newsRiverSuite.init ()) if dialog.ask ("Scan at what minute each hour?", @adrdata^.prefs.minuteToRead) adrdata^.prefs.minuteToRead = number (adrdata^.prefs.minuteToRead) WdatatablGEE createdFri, 30 Dec 2005 01:28:37 GMTWdatatablG^^ createdFri, 30 Dec 2005 01:29:02 GMT@" Geneva'.G'.GwLANDmac Changes 1/17/06; 7:20:08 PM by DW Made reading-list-aware. local (adrdata = newsRiverSuite.init ()) if dialog.ask ("URL of feed:", @adrdata^.newsRiver.lastFeedSubUrl) local (url = adrdata^.newsRiver.lastFeedSubUrl, errorstring = "", adrservice) if newsRiverSuite.readingList.opmlSubscribe (url, @title, @adrservice, @errorstring) if sizeof (errorstring) == 0 dialog.notify ("Subscribed to reading list \"" + adrservice^.title + ".\"") else scripterror (errorstring) else if xml.aggregator.subscribeService (url, @errorstring, @adrservice) dialog.notify ("Subscribed to \"" + adrservice^.compilation.channeltitle + ".\"") else scriptError (errorstring) WdatatablG createdWed, 18 Jan 2006 03:20:05 GMTWdatatablG createdWed, 18 Jan 2006 03:20:07 GMTWdatatablG createdWed, 18 Jan 2006 03:20:08 GMTWdatatablGةة createdThu, 29 Dec 2005 04:41:56 GMTWdatatablGةDةD createdThu, 29 Dec 2005 04:42:44 GMTWdatatablG createdWed, 18 Jan 2006 03:20:55 GMTWdatatablGǿ createdWed, 18 Jan 2006 03:23:51 GMTWdatatablGةJةJ createdThu, 29 Dec 2005 04:42:50 GMTWdatatablGտ createdWed, 18 Jan 2006 03:24:05 GMTWdatatablGֿ createdWed, 18 Jan 2006 03:24:06 GMTWdatatablG55 createdWed, 18 Jan 2006 03:21:25 GMTWdatatablGةJةJ createdThu, 29 Dec 2005 04:42:50 GMTWdatatablGةة createdThu, 29 Dec 2005 04:45:32 GMTWdatatablGةة createdThu, 29 Dec 2005 04:45:34 GMT@, Geneva'.C'.C,LLANDmac on postToWeblog (adrargs) Changes 12/29/05; 7:58:20 PM by DW Add a "created" attribute to the posts, so permalinks work properly. Tom Morris caught this one. scratchpad.ptwargs = adrargs^ edit (@scratchpad.ptwargs) local (adrdata = newsRiverSuite.init ()) local (adrstory = @adrdata^.stories.[string.padwithzeros (number (adrargs^.idStory), 8)]) local (adrsource = @adrdata^.services.[adrstory^.url]) local (viatext = " [" + adrstory^.channeltitle + "]") local (initialtext = adrstory^.storytext + viatext) wp.newtextobject (initialtext, @scratchpad.initialtext) edit (@scratchpad.initialtext) dotOpmlSuite.blog.openTodaysOutline () op.firstsummit () op.insert (initialtext, up) op.attributes.setOne ("created", date.netStandardString (clock.now ())) //12/29/05; 7:58:20 PM by DW frontier .bringtofront () if adrdata^.newsRiver.flNewsPageReturnAfterPost if defined (adrargs^.referer) adrargs^.redirect = adrargs^.referer if defined (args.idstory) local (adrstory = radio.aggregator.getStoryAddress (args.idstory)) local (adrsource = @adraggregatordata^.services.[adrstory^.url]) bundle //link the globe to the HTML rendering of the channel with adrsource^.compilation msg (adrsource) globe = "" + globeimg + "" add (globe + " Source: " + adrstory^.channeltitle + "; " + adrstory^.time + ".

") add (adrstory^.storytext + "

") add ("") add ("") add ("") add ("") add ("") edit (adrstory) return ("") bundle //test code postToWeblog (@scratchpad.ptwargs) WdatatablGXX createdFri, 30 Dec 2005 03:58:16 GMTWdatatablGZZ createdFri, 30 Dec 2005 03:58:18 GMTWdatatablG]] createdFri, 30 Dec 2005 03:58:21 GMTWdatatablG~L~L createdFri, 21 Oct 2005 14:45:02 GMTWdatatablG~M~M createdFri, 21 Oct 2005 14:45:26 GMTWdatatablG~O~O createdFri, 21 Oct 2005 14:56:20 GMTWdatatablG~O~O createdFri, 21 Oct 2005 14:56:20 GMTWdatatablG~Pm~Pm createdFri, 21 Oct 2005 14:59:41 GMTWdatatablG~Rҿ~R createdFri, 21 Oct 2005 15:09:54 GMTWdatatablG~R~R createdFri, 21 Oct 2005 15:10:08 GMTWdatatablG~S7~S7 createdFri, 21 Oct 2005 15:11:35 GMTWdatatablG~[w~[w createdFri, 21 Oct 2005 15:46:47 GMTWdatatablG~[;~[; createdFri, 21 Oct 2005 15:45:47 GMTWdatatablG~[B~[B createdFri, 21 Oct 2005 15:45:54 GMTWdatatablG~O~O createdFri, 21 Oct 2005 14:56:21 GMTWdatatablG~ND~ND createdFri, 21 Oct 2005 14:50:28 GMTWdatatablG~\2~\2 createdFri, 21 Oct 2005 15:49:54 GMTWdatatablG~\7~\7 createdFri, 21 Oct 2005 15:49:59 GMTtGeneva '.H'.HNqLANDmac on cleanFilename (fname) Changes 9/19/05; 5:45:19 PM by DW Legal characters for DOS file names include the following: Upper case letters A-Z Numbers 0-9 Space (though trailing spaces are considered to be padding and not a part of the file name) ! # $ % & ( ) - @ ^ _ ` { } ~ ' Values 128-255 if system.environment.isWindows local (i, ch, fllegal, s="") for i = 1 to sizeof (fname) ch = fname [i] fllegal = true if not string.isalpha (ch) if not string.isnumeric (ch) if (number (char (ch)) < 128) if not ({' ', '!', '#', '%', '.', ',', '&', '(', ')', '-', '@', '_', '`', '{', '}', '~', "'"} contains ch) fllegal = false if fllegal s = s + ch return (s) else fname = string.replaceall (fname, ":", "-") fname = string.replaceall (fname, "!", "") fname = string.replaceall (fname, "|", "") return (fname)  & 5 Geneva'.I'.Ix<pLANDmac on downloadEnclosure (adrq) Changes 1/21/06; 11:45:30 AM by DW Callbacks, after download. 1/19/06; 5:29:55 AM by DW Respect flOutlineEnclosures pref. 1/18/06; 4:56:45 PM by DW Adapted for newsRiver.root. 9/19/05; 10:50:03 AM by DW If the feed doesn't have a title, store its podcasts in a folder named "Untitled feed." http://archive.scripting.com/2005/09/19#When:1:41:22PM local (adrdata = newsRiverSuite.init (), feedtitle, foldername) try feedtitle = adrq^.adrservice^.compilation.channeltitle foldername = newsRiverSuite.podcatcher.cleanFilename (feedtitle) else feedtitle = "Untitled feed" foldername = "Untitled feeds" adrq^.feedtitle = feedtitle //for the log outline local (folder = adrdata^.newsRiver.podcatcher.prefs.folder + foldername + file.getpathchar ()) bundle //see if we can access the folder try file.surefilepath (folder + "xxx") else //nope if system.environment.isMac if sizeof (foldername) >= 32 //too long! foldername = string.mid (foldername, 1, 31) folder = adrdata^.newsRiver.podcatcher.prefs.folder + foldername + file.getpathchar () local (url = adrq^.url) local (fname = string.nthfield (url, "/", string.countfields (url, "/"))) fname = string.nthfield (fname, "?", 1) fname = string.urlDecode (fname) fname = newsRiverSuite.podcatcher.cleanFilename (fname) local (f = folder + fname) bundle //do some checking on the filename local (extension = string.nthfield (fname, ".", string.countfields (fname, "."))) local (fnamedefault = "podcast" + nameof (adrq^) + "." + extension) if system.environment.isMac if sizeof (fname) > 32 //too long! fname = fnamedefault f = folder + fname if file.exists (f) //don't overwrite existing file fname = fnamedefault f = folder + fname adrq^.f = f file.surefilepath (f) local (s) bundle //read the url local (urllist = string.urlsplit (url)) s = string.httpResultSplit (tcp.httpClient (server:urllist [2], path:urllist [3], ctFollowRedirects:5)) file.writewholefile (f, s) bundle //if we have a pubdate, set the file dates to that try if adrq^.pubdate != date (0) file.setcreated (f, adrq^.pubdate) file.setmodified (f, adrq^.pubdate) adrq^.whenDownload = clock.now () if adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures newsRiverSuite.podcatcher.logDownload (adrq) bundle //callbacks, 1/21/06 by DW local (adrscript) for adrscript in @adrdata^.newsRiver.callbacks.afterEnclosureDownload try adrscript^ (adrq) bundle //test code downloadEnclosure (@aggregatorData.newsRiver.podcatcher.queue.["00066"]) WdatatablGYY createdSat, 21 Jan 2006 19:45:29 GMTWdatatablG[[ createdSat, 21 Jan 2006 19:45:31 GMTWdatatablGSS createdThu, 19 Jan 2006 13:29:55 GMTWdatatablGTT createdThu, 19 Jan 2006 13:29:56 GMTWdatatablG#̿# createdThu, 19 Jan 2006 00:56:44 GMTWdatatablG#ο# createdThu, 19 Jan 2006 00:56:46 GMTWdatatablG% % createdThu, 19 Jan 2006 01:02:03 GMTWdatatablG% % createdThu, 19 Jan 2006 01:02:04 GMTWdatatablG%+%+ createdThu, 19 Jan 2006 01:02:35 GMTWdatatablG11 createdThu, 19 Jan 2006 01:55:39 GMTWdatatablG%% createdThu, 19 Jan 2006 01:05:58 GMTWdatatablGpp createdMon, 28 Nov 2005 21:57:20 GMTWdatatablGzz createdMon, 28 Nov 2005 21:57:30 GMTWdatatablG}} createdMon, 28 Nov 2005 21:57:33 GMTWdatatablG燿 createdMon, 28 Nov 2005 21:57:43 GMTWdatatablG狿 createdMon, 28 Nov 2005 21:57:47 GMTWdatatablG穿 createdMon, 28 Nov 2005 21:58:17 GMTWdatatablG緿 createdMon, 28 Nov 2005 21:58:31 GMTWdatatablGmm createdMon, 28 Nov 2005 21:57:17 GMTWdatatablGMM createdMon, 28 Nov 2005 22:01:01 GMTWdatatablG createdMon, 28 Nov 2005 22:02:56 GMTWdatatablG￰ createdMon, 28 Nov 2005 22:03:43 GMTWdatatablG狿 createdMon, 28 Nov 2005 21:57:47 GMTWdatatablG穿 createdMon, 28 Nov 2005 21:58:17 GMTWdatatablGxx createdMon, 28 Nov 2005 22:01:44 GMTWdatatablGBB createdMon, 28 Nov 2005 22:05:06 GMTWdatatablGxx createdMon, 28 Nov 2005 22:01:44 GMTWdatatablG&& createdThu, 19 Jan 2006 01:08:36 GMTWdatatablGDD createdThu, 19 Jan 2006 13:29:40 GMTWdatatablGmm createdSat, 21 Jan 2006 19:45:49 GMTWdatatablGtt createdSat, 21 Jan 2006 19:45:56 GMTWdatatablGρρ createdSat, 21 Jan 2006 19:46:09 GMTWdatatablGϠϠ createdSat, 21 Jan 2006 19:46:40 GMTWdatatablGϤϤ createdSat, 21 Jan 2006 19:46:44 GMT }qGeneva'.I'.IuLANDmac on downloadQueue (flOvernightDownload) Changes 1/19/06; 5:31:34 AM by DW Add parameter, flOvernightDownload, if true, we don't start a download after the stop time. 1/18/06; 7:19:21 PM by DW Updated for newsRiver.root. 9/19/05; 10:09:50 AM by DW If there's an error, record it and move to the next element. Don't try to read items with errors. To clear the error to try again, delete the error sub-table. 12/2/04; 7:30:21 AM by DW Created. local (adrdata = newsRiverSuite.init (), i, adrq) for i = sizeof (adrdata^.newsRiver.podcatcher.queue) downto 1 adrq = @adrdata^.newsRiver.podcatcher.queue [i] try if not defined (adrq^.error) if flOvernightDownload if date.hour () >= adrdata^.newsRiver.podcatcher.prefs.hourToStopDownloads break newsRiverSuite.podcatcher.downloadEnclosure (adrq) adrdata^.newsRiver.podcatcher.downloads.[nameof (adrq^)] = adrq^ delete (adrq) else new (tabletype, @adrq^.error) adrq^.error.message = tryerror adrq^.error.when = clock.now () if flOvernightDownload if adrdata^.newsRiver.podcatcher.prefs.flOutlineEnclosures newsRiverSuite.podcatcher.openLogOutline () WdatatablGԞԞ createdThu, 19 Jan 2006 13:31:10 GMTWdatatablGԶԶ createdThu, 19 Jan 2006 13:31:34 GMTWdatatablGԷԷ createdThu, 19 Jan 2006 13:31:35 GMTWdatatablGE9E9 createdThu, 19 Jan 2006 03:19:21 GMTWdatatablGE:E: createdThu, 19 Jan 2006 03:19:22 GMTWdatatablG createdThu, 19 Jan 2006 13:32:16 GMTWdatatablGFF createdThu, 19 Jan 2006 13:33:58 GMTWdatatablG createdThu, 19 Jan 2006 13:36:50 GMTWdatatablG createdThu, 19 Jan 2006 13:41:05 GMTWdatatablG createdThu, 19 Jan 2006 13:41:08 GMTWdatatablGDD createdThu, 19 Jan 2006 13:42:28 GMT }VGeneva'.H'.HxsLANDmac local (adrdata = newsRiverSuite.init (), f, ct = 0) fileloop (f in adrdata^.newsRiver.podcatcher.prefs.folder, infinity) ct = ct + file.size (f) msg (string.megabytestring (ct)) return (ct) ViGeneva'.H'.HLANDmac on logDownload (adrq) Changes 9/19/05; 10:18:24 AM by DW Strip markup from stuff we insert into the outline. on stripmarkup (s) if typeof (s) == tabletype table.assign (@s, xml.decompile (@s)) s = searchengine.stripmarkup (s) s = string.replaceall (s, "]]>", "") s = xml.entitydecode (s, flAlphaEntities:true) return (s) local (adrdata = newsRiverSuite.init ()) local (oldtarget = target.set (@adrdata^.newsRiver.podcatcher.log)) op.firstsummit () op.insert (clock.now (), up) op.insert (stripmarkup (adrq^.feedtitle), right) op.insert (stripmarkup (adrq^.description), right) bundle //link to the podcast local (atts) new (tabletype, @atts) atts.type = "link" atts.url = html.getFileURL (adrq^.f) op.attributes.addgroup (@atts) op.firstsummit () target.set (oldtarget) bundle //test code logDownload (@iPodderData.queue.["01138"]) WdatatablGNN createdMon, 28 Nov 2005 21:09:50 GMTWdatatablGVV createdMon, 28 Nov 2005 21:09:58 GMTWdatatablGyy createdMon, 28 Nov 2005 21:19:05 GMTrGeneva'.H'.HpfLANDmac local (adrdata = newsRiverSuite.init ()) if adrdata^.newsRiver.podcatcher.prefs.flReclaimBytes local (ctbytes = newsRiverSuite.podcatcher.howMuchSpaceUsed ()) if ctbytes > adrdata^.prefs.ctBytesForEnclosures //we're going to delete some stuff! local (f, sorttable) new (tabletype, @sorttable) fileloop (f in adrdata^.prefs.folder, infinity) sorttable.[f] = file.created (f) local (oldtarget = target.set (@sorttable)) table.sortby ("Value") target.set (oldtarget) scratchpad.sorttable = sorttable while ctbytes > adrdata^.prefs.ctBytesForEnclosures local (f = nameof (sorttable [1])) delete (@sorttable [1]) ctbytes = ctbytes - file.size (f) file.delete (f) if sizeof (sorttable) < 1 break niGeneva'.I'.I&nLANDmac if dialog.confirm ("Download enclosures now?") newsRiverSuite.podcatcher.openLogOutline () newsRiverSuite.podcatcher.downloadQueue (false) WdatatablGDD createdThu, 19 Jan 2006 13:42:28 GMTn Geneva'.I'.I&LANDmac Changes 1/19/06; 8:51:19 AM by DW If the folder doesn't exist, create it. local (adrdata = newsRiverSuite.init ()) local (folder = adrdata^.newsRiver.podcatcher.prefs.folder) if not file.exists (folder) file.surefilepath (folder + "xxx") file.openfolder (folder) WdatatablG createdThu, 19 Jan 2006 16:51:15 GMTWdatatablG createdThu, 19 Jan 2006 16:51:17 GMTWdatatablG createdThu, 19 Jan 2006 16:51:19 GMTWdatatablG^^ createdThu, 19 Jan 2006 16:50:38 GMTWdatatablGcc createdThu, 19 Jan 2006 16:50:43 GMTWdatatablGii createdThu, 19 Jan 2006 16:50:49 GMTWdatatablGee createdThu, 19 Jan 2006 14:42:45 GMTk$I'.I " 7downloadEnclosuresNowopenEnclosuresFolderEVGeneva|=XJ:Geneva'.H'.HtLANDmac on openLogOutline () Changes 1/19/06; 5:42:09 AM by DW Created. local (adrdata = newsRiverSuite.init ()) edit (@adrdata^.newsRiver.podcatcher.log, windowTitle:"Podcatcher") bundle //test code openLogOutline () WdatatablG-- createdThu, 19 Jan 2006 13:42:05 GMTWdatatablG// createdThu, 19 Jan 2006 13:42:07 GMTWdatatablG11 createdThu, 19 Jan 2006 13:42:09 GMTWdatatablGww createdThu, 19 Jan 2006 13:43:19 GMTWdatatablG{{ createdThu, 19 Jan 2006 13:43:23 GMTWdatatablG createdThu, 19 Jan 2006 13:43:27 GMT Geneva '.H'.HtLANDmac on storyArrivedCallback (adrservice, adrItem) Changes 1/18/06; 2:15:03 PM by DW Created. edit (@aggregatorData.services.["http://www.morningcoffeenotes.com/rss.xml"].compilation.items.["00022"]) true local (adrdata = newsRiverSuite.init ()) if adrdata^.newsRiver.podcatcher.prefs.enabled if defined (adritem^.enclosure) local (serialnum = adrdata^.newsRiver.podcatcher.prefs.queueSerialNum++) local (adrq = @adrdata^.newsRiver.podcatcher.queue.[string.padwithzeros (serialnum, 5)]) new (tabletype, adrq) adrq^.url = adritem^.enclosure.url adrq^.length = adritem^.enclosure.length adrq^.type = adritem^.enclosure.type adrq^.description = adritem^.title adrq^.adrservice = adrservice try adrq^.pubDate = adritem^.data.pubDate else adrq^.pubDate = date (0) return (true) bundle //test code storyArrivedCallback (@aggregatorData.services.["http://www.morningcoffeenotes.com/rss.xml"], @aggregatorData.services.["http://www.morningcoffeenotes.com/rss.xml"].compilation.items.["00022"]) WdatatablG createdWed, 18 Jan 2006 22:14:59 GMTWdatatablG createdWed, 18 Jan 2006 22:15:02 GMTWdatatablG createdWed, 18 Jan 2006 22:15:03 GMTWdatatablGxx createdWed, 18 Jan 2006 22:17:28 GMTWdatatablG createdWed, 18 Jan 2006 22:27:09 GMTWdatatablGTT createdWed, 18 Jan 2006 22:16:52 GMTWdatatablG-- createdThu, 19 Jan 2006 01:39:06 GMTWdatatablG-- createdThu, 19 Jan 2006 01:40:08 GMTWdatatablG.. createdThu, 19 Jan 2006 01:40:18 GMTWdatatablG-- createdThu, 19 Jan 2006 01:40:08 GMTWdatatablG createdWed, 18 Jan 2006 22:45:34 GMTWdatatablG`` createdWed, 18 Jan 2006 22:34:08 GMTWdatatablGcc createdWed, 18 Jan 2006 22:34:11 GMT fj'.I  ,8 FR co { cleanFilenamedownloadEnclosure̝ downloadQueue|howMuchSpaceUsed logDownloadgmakeSpaceOnDisk menuCommandseopenLogOutline6storyArrivedCallbackVGeneva|=XJ6"'Geneva'.G'.GULANDmac Changes 1/15/06; 1:54:58 PM by DW Get title from head, maintain list-level stats for Subscriptions page. 1/14/06; 12:21:50 PM by DW Detailed code review and testing. Using PT's reading list as a guinea pig. http://downloads.oreilly.com/make/philliptorrone.opml 11/8/05; 1:42:07 PM by DW Created. This is what we do before a scan. We read each of the reading lists and make sure we're subscribed to all the feeds in each of the lists, and unsub from any of the feeds that came from a reading list that are no longer in reading lists. Step-by-step, how we go about this... Every service that we subscribe to through a reading list has a readingList sub-table. It may appear in more than one reading list. Each of the lists that it comes from is pointed to by an element of this table. If we were subscribed to a feed before it showed up in a reading list, it has a boolean, flManualSub, set to true. We never sweep up (delete) a table with flManualSub set true. It will be possible to "protect" a feed that came from a reading list by setting is flManualSub to true. Every service table now has a readingList sub-table (if it was subscribed to by a reading list) and in that table is an element for each reading list. At the beginning of this routine we set each of these false. Any that are still false at the end of the scan are deleted. If the readingList sub-table is empty and it was not manually subscribed-to, the service is deleted. local (adrdata = newsRiverSuite.init ()) bundle //set the elements of each service's readingList table to false local (adrlist, adrservice) for adrlist in @adrdata^.newsRiver.readingLists local (opmlurl = nameof (adrlist^)) if defined (adrlist^.feeds) local (adr) for adr in @adrlist^.feeds local (xmlurl = nameof (adr^)) local (adrservice = @adrdata^.services.[xmlurl]) if defined (adrservice^) if defined (adrservice^.readingList) //it was subscribed to by a reading list local (adropml = @adrservice^.readingList.[opmlurl]) adropml^ = false //if it's still false at the end of the scan, delete it else new (tabletype, @adrlist^.feeds) for adrservice in @adrdata^.services It's conceivable some of the readingList tables contain elements that have not been set false, so we quickly sweep over the whole table and set any that aren't false to false. if defined (adrservice^.readingList) local (adritem) for adritem in @adrservice^.readingList adritem^ = false bundle //read each OPML reading list, make sure we're subscribed to the feeds they contain local (adrlist) for adrlist in @adrdata^.newsRiver.readingLists try local (adr, opmlurl = nameof (adrlist^), flchange = false) newsRiverSuite.readingList.initList (adrlist) xml.compile (tcp.httpreadurl (opmlurl), @xstruct) scratchpad.xstruct = xstruct local (adropml = xml.getaddress (@xstruct, "opml")) bundle //get elements from head local (adrhead = xml.getaddress (adropml, "head")) try adrlist^.title = xml.getvalue (adrhead, "title") else adrlist^.title = string.nthfield (opmlurl, "/", string.countfields (opmlurl, "/")) local (adrbody = xml.getaddress (adropml, "body")) for adr in adrbody if nameof (adr^) contains "outline" local (xmlurl = adr^.["/atts"].xmlUrl, startticks = clock.ticks ()) adrlist^.feeds.[xmlurl] = clock.now () local (adrservice = @adrdata^.services.[xmlurl]) msg (xmlurl) if defined (adrservice^) if not defined (adrservice^.readingList) new (tabletype, @adrservice^.readingList) adrservice^.flManualSub = true flchange = true else local (name = "Untitled feed") if xml.aggregator.subscribeService (xmlurl, adradrservice: @adrservice) new (tabletype, @adrservice^.readingList) adrservice^.flManualSub = false try {name = adrservice^.compilation.channeltitle} log.addtooutline ("Subscribe: " + name, outlineUrl:xmlurl, startticks:startticks) flchange = true try {adrservice^.readingList.[opmlurl] = true} if flchange adrlist^.stats.timeLastChange = clock.now () adrlist^.stats.ctChanges++ else log.addtooutline ("Error: " + tryerror, outlineUrl:xmlurl, startticks:startticks) bundle //sweep up all old subs local (adrservice) for adrservice in @adrdata^.services local (flautomaticsub = false) if defined (adrservice^.readingList) flautomaticsub = true if defined (adrservice^.flManualSub) if adrservice^.flManualSub flautomaticsub = false if flautomaticsub local (flunsub = true, adritem) for adritem in @adrservice^.readingList if adritem^ //it's still an active item flunsub = false break if flunsub local (xmlurl = nameof (adrservice^), name = "Untitled feed", startticks = clock.ticks ()) try {name = adrservice^.compilation.channeltitle} xml.aggregator.unsubscribeService (xmlurl) log.addtooutline ("Unsub: " + name, outlineUrl:xmlurl, startticks:startticks) WdatatablG createdSun, 15 Jan 2006 21:54:58 GMTWdatatablG createdSun, 15 Jan 2006 21:54:59 GMTWdatatablG^^ createdSat, 14 Jan 2006 20:21:50 GMTWdatatablG__ createdSat, 14 Jan 2006 20:21:51 GMTWdatatablGEE createdSat, 14 Jan 2006 20:25:41 GMTWdatatablGQQ createdSat, 14 Jan 2006 20:25:53 GMTWdatatablG[[ createdTue, 08 Nov 2005 21:42:05 GMTWdatatablG[[ createdTue, 08 Nov 2005 21:42:07 GMTWdatatablG{{ createdSat, 14 Jan 2006 20:13:47 GMTWdatatablGҿ createdSat, 14 Jan 2006 20:15:14 GMTWdatatablGcmcm createdTue, 08 Nov 2005 22:15:09 GMTWdatatablG createdSat, 14 Jan 2006 20:15:45 GMTWdatatablGcc createdTue, 08 Nov 2005 22:15:48 GMTWdatatablG$$ createdSat, 14 Jan 2006 20:16:36 GMTWdatatablG createdFri, 11 Nov 2005 15:29:55 GMTWdatatablGV V createdTue, 08 Nov 2005 21:18:03 GMTWdatatablGuu createdFri, 11 Nov 2005 15:32:05 GMTWdatatablGտ createdFri, 11 Nov 2005 15:33:41 GMTWdatatablG\ \ createdTue, 08 Nov 2005 21:43:40 GMTWdatatablG\\ createdTue, 08 Nov 2005 21:43:53 GMTWdatatablG\ʿ\ createdTue, 08 Nov 2005 21:46:50 GMTWdatatablG^^^^ createdTue, 08 Nov 2005 21:53:34 GMTWdatatablG^a^a createdTue, 08 Nov 2005 21:53:37 GMTWdatatablG createdFri, 11 Nov 2005 15:28:23 GMTWdatatablG^^ createdTue, 08 Nov 2005 21:52:17 GMTWdatatablG__ createdTue, 08 Nov 2005 21:59:22 GMTWdatatablG^^ createdTue, 08 Nov 2005 21:54:40 GMTWdatatablG^^ createdTue, 08 Nov 2005 21:55:09 GMTWdatatablG__ createdTue, 08 Nov 2005 21:58:31 GMTWdatatablG^ ^ createdTue, 08 Nov 2005 21:52:11 GMTWdatatablG\ӿ\ createdTue, 08 Nov 2005 21:46:59 GMTWdatatablGɿ createdFri, 11 Nov 2005 15:33:29 GMTWdatatablG濙 createdFri, 11 Nov 2005 15:33:58 GMTWdatatablG createdFri, 11 Nov 2005 15:34:46 GMTWdatatablG** createdFri, 11 Nov 2005 15:35:06 GMTWdatatablGGG createdFri, 11 Nov 2005 15:35:35 GMTWdatatablGQQ createdFri, 11 Nov 2005 15:35:45 GMTWdatatablG翙 createdFri, 11 Nov 2005 15:38:15 GMTWdatatablGտ createdFri, 11 Nov 2005 15:33:41 GMTWdatatablG createdFri, 11 Nov 2005 15:38:48 GMTWdatatablG\V\V createdTue, 08 Nov 2005 21:44:54 GMTWdatatablG createdFri, 11 Nov 2005 15:37:04 GMTWdatatablG createdSun, 15 Jan 2006 22:07:13 GMTWdatatablG\W\W createdTue, 08 Nov 2005 21:44:55 GMTWdatatablG\v\v createdTue, 08 Nov 2005 21:45:26 GMTWdatatablG\翖\ createdTue, 08 Nov 2005 21:47:19 GMTWdatatablG createdSun, 15 Jan 2006 21:55:44 GMTWdatatablG\\ createdTue, 08 Nov 2005 21:47:35 GMTWdatatablG"" createdSun, 15 Jan 2006 21:56:50 GMTWdatatablG createdSun, 15 Jan 2006 21:55:58 GMTWdatatablG== createdSun, 15 Jan 2006 21:57:17 GMTWdatatablG>> createdSun, 15 Jan 2006 21:57:18 GMTWdatatablG\\ createdTue, 08 Nov 2005 21:47:35 GMTWdatatablG]] createdTue, 08 Nov 2005 21:47:48 GMTWdatatablG] ] createdTue, 08 Nov 2005 21:47:54 GMTWdatatablG]d]d createdTue, 08 Nov 2005 21:49:24 GMTWdatatablG]] createdTue, 08 Nov 2005 21:50:32 GMTWdatatablG`` createdTue, 08 Nov 2005 22:04:45 GMTWdatatablGEE createdFri, 11 Nov 2005 20:57:18 GMTWdatatablGaVaV createdTue, 08 Nov 2005 22:06:14 GMTWdatatablGa⿖a createdTue, 08 Nov 2005 22:08:34 GMTWdatatablGaa createdTue, 08 Nov 2005 22:08:53 GMTWdatatablGd6d6 createdTue, 08 Nov 2005 22:18:30 GMTWdatatablG  createdSun, 15 Jan 2006 22:09:16 GMTWdatatablGdd createdTue, 08 Nov 2005 22:17:54 GMTWdatatablG : : createdFri, 11 Nov 2005 16:39:22 GMTWdatatablG`U`U createdTue, 08 Nov 2005 22:01:57 GMTWdatatablGaa createdTue, 08 Nov 2005 22:08:53 GMTWdatatablGd6d6 createdTue, 08 Nov 2005 22:18:30 GMTWdatatablG@w@w createdFri, 11 Nov 2005 20:35:03 GMTWdatatablG  createdSun, 15 Jan 2006 22:09:16 GMTWdatatablGbb createdTue, 08 Nov 2005 22:09:06 GMTWdatatablGMM createdSun, 15 Jan 2006 22:10:21 GMTWdatatablGPP createdSun, 15 Jan 2006 22:10:24 GMTWdatatablG createdSun, 15 Jan 2006 22:04:40 GMTWdatatablGEE createdFri, 11 Nov 2005 20:54:52 GMTWdatatablG忙 createdFri, 11 Nov 2005 15:59:33 GMTWdatatablG￙ createdFri, 11 Nov 2005 15:59:43 GMTWdatatablGɿ createdFri, 11 Nov 2005 15:33:29 GMTWdatatablG createdFri, 11 Nov 2005 16:00:15 GMTWdatatablG createdFri, 11 Nov 2005 15:34:46 GMTWdatatablG== createdFri, 11 Nov 2005 16:01:01 GMTWdatatablG createdFri, 11 Nov 2005 16:04:39 GMTWdatatablG"" createdFri, 11 Nov 2005 16:04:50 GMTWdatatablG%% createdFri, 11 Nov 2005 16:04:53 GMTWdatatablG createdFri, 11 Nov 2005 16:33:00 GMTWdatatablG createdFri, 11 Nov 2005 16:33:03 GMTWdatatablGԿ createdFri, 11 Nov 2005 16:33:24 GMTWdatatablG濚 createdFri, 11 Nov 2005 16:33:42 GMTWdatatablG createdFri, 11 Nov 2005 16:33:55 GMTWdatatablG createdFri, 11 Nov 2005 16:34:00 GMTWdatatablG createdFri, 11 Nov 2005 16:34:02 GMTWdatatablG : : createdFri, 11 Nov 2005 16:39:22 GMTWdatatablG@w@w createdFri, 11 Nov 2005 20:35:03 GMTWdatatablG createdFri, 11 Nov 2005 16:34:08 GMT6,Geneva'.D'.DLANDmac on initList (adrlist) Changes 1/15/06; 2:02:38 PM by DW Created. if not defined (adrlist^.stats) new (tabletype, @adrlist^.stats) if not defined (adrlist^.stats.timeLastChange) adrlist^.stats.timeLastChange = date (0) if not defined (adrlist^.stats.ctChanges) adrlist^.stats.ctChanges = 0 bundle //test code initlist (@aggregatorData.newsRiver.readingLists.["http://hosting.opml.org/dave/demos/newsPodcasts.opml"]) WdatatablGzz createdSun, 15 Jan 2006 22:02:34 GMTWdatatablG|| createdSun, 15 Jan 2006 22:02:36 GMTWdatatablG~~ createdSun, 15 Jan 2006 22:02:38 GMTWdatatablG createdSun, 15 Jan 2006 22:03:16 GMTWdatatablG createdSun, 15 Jan 2006 22:03:27 GMTWdatatablG createdSun, 15 Jan 2006 22:04:21 GMTWdatatablG createdSun, 15 Jan 2006 22:04:40 GMTWdatatablG createdSun, 15 Jan 2006 22:04:21 GMTWdatatablG createdSun, 15 Jan 2006 22:04:40 GMTWdatatablG createdSun, 15 Jan 2006 22:02:44 GMTWdatatablG createdSun, 15 Jan 2006 22:02:51 GMT,P CGeneva'.G'.G_,LANDmac on opmlSubscribe (url, adrtitle, adradrnewservice, adrerrorstring) Changes 1/17/06; 6:50:57 PM by DW Created. Code factored from newsRiverSuite.viewSubscriptions. Return true if it was an OPML subscription. local (flopmlsub = false) bundle //set flopmlsub local (xmltext = tcp.httpreadurl (url), xstruct) xml.compile (xmltext, @xstruct) try xml.getaddress (@xstruct, "opml") adrtitle^ = string.nthfield (url, "/", string.countfields (url, "/")) flopmlsub = true if flopmlsub try local (adrdata = xml.aggregator.init ()) local (adrlist = @adrdata^.newsRiver.readingLists.[url]) if defined (adrlist^) adrerrorstring^ = "Can't subscribe because you are already subscribed to the list." else new (tabletype, adrlist) newsRiverSuite.readingList.beforeScan () adradrnewservice^ = adrlist else adrerrorstring^ = tryerror return (true) return (false) bundle //test code local (title, adrnewservice, errorstring) opmlSubscribe ("http://homepage.mac.com/ptorrone/philliptorrone_gadgets.opml", @title, @adrnewservice, @errorstring) WdatatablGkk createdWed, 18 Jan 2006 02:52:27 GMTWdatatablG createdWed, 18 Jan 2006 02:50:56 GMTWdatatablG createdWed, 18 Jan 2006 02:50:58 GMTWdatatablG createdWed, 18 Jan 2006 02:51:08 GMTWdatatablG** createdWed, 18 Jan 2006 02:51:22 GMTWdatatablGWW createdWed, 18 Jan 2006 02:52:07 GMTWdatatablG@G@G createdMon, 16 Jan 2006 02:09:11 GMTWdatatablG@K@K createdMon, 16 Jan 2006 02:09:15 GMTWdatatablG@k@k createdMon, 16 Jan 2006 02:09:47 GMTWdatatablG@z@z createdMon, 16 Jan 2006 02:10:02 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:07 GMTWdatatablGBB createdMon, 16 Jan 2006 02:19:35 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:20 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:42 GMTWdatatablG@@ createdMon, 16 Jan 2006 02:10:44 GMTWdatatablGVV createdTue, 08 Nov 2005 21:20:01 GMTWdatatablGWjWj createdTue, 08 Nov 2005 21:23:54 GMTWdatatablGWoWo createdTue, 08 Nov 2005 21:23:59 GMTWdatatablGWW createdTue, 08 Nov 2005 21:24:23 GMTWdatatablGWW createdTue, 08 Nov 2005 21:24:25 GMTWdatatablGDlDl createdMon, 16 Jan 2006 02:26:52 GMTWdatatablGB\B\ createdMon, 16 Jan 2006 02:18:04 GMTWdatatablGDbDb createdMon, 16 Jan 2006 02:26:42 GMTWdatatablGDdDd createdMon, 16 Jan 2006 02:26:44 GMTWdatatablG'' createdWed, 18 Jan 2006 02:55:35 GMTWdatatablG-- createdWed, 18 Jan 2006 02:55:41 GMTWdatatablGGG createdWed, 18 Jan 2006 02:56:07 GMTWdatatablGWW createdWed, 18 Jan 2006 02:56:23 GMTWdatatablGKK createdWed, 18 Jan 2006 02:56:11 GMTP Geneva'.C'.C(P'LANDmac on unsubscribe (urlReadingList) Changes 1/14/06; 5:45:52 PM by DW Created. This is what happens when you unsubscribe from a reading list. local (adrdata = newsRiverSuite.init ()) local (adrlist = @adrdata^.newsRiver.readingLists.[urlReadingList], adr) for adr in @adrlist^.feeds local (xmlurl = nameof (adr^)) local (adrservice = @adrdata^.services.[xmlurl]) if defined (adrservice^) try {delete (@adrservice^.readingList.[urlReadingList])} try if (sizeof (adrservice^.readingList) == 0) and (not adrservice^.flManualSub) local (name = "Untitled service", startticks = clock.ticks ()) try {name = adrservice^.compilation.channeltitle} xml.aggregator.unsubscribeservice (xmlurl) log.addtooutline ("Unsubscribe: " + name, outlineUrl:xmlurl, startticks:startticks) delete (adrlist) bundle //test code unsubscribe ("http://downloads.oreilly.com/make/philliptorrone.opml") WdatatablGjj createdSun, 15 Jan 2006 01:46:18 GMTWdatatablGNN createdSun, 15 Jan 2006 01:45:50 GMTWdatatablGQQ createdSun, 15 Jan 2006 01:45:53 GMTWdatatablGV V createdTue, 08 Nov 2005 21:18:03 GMTWdatatablG醿 createdSun, 15 Jan 2006 01:46:46 GMTWdatatablG^a^a createdTue, 08 Nov 2005 21:53:37 GMTWdatatablG createdFri, 11 Nov 2005 15:28:23 GMTWdatatablG^^ createdTue, 08 Nov 2005 21:52:17 GMTWdatatablG__ createdTue, 08 Nov 2005 21:59:22 GMTWdatatablG^^ createdTue, 08 Nov 2005 21:55:09 GMTWdatatablG createdSun, 15 Jan 2006 01:53:10 GMTWdatatablGOO createdSun, 15 Jan 2006 01:50:07 GMTWdatatablG : : createdFri, 11 Nov 2005 16:39:22 GMTWdatatablG@w@w createdFri, 11 Nov 2005 20:35:03 GMTWdatatablGUU createdSun, 15 Jan 2006 01:50:13 GMTWdatatablGſ createdSun, 15 Jan 2006 02:39:01 GMTWdatatablG** createdSun, 15 Jan 2006 01:53:46 GMTWdatatablG.. createdSun, 15 Jan 2006 01:53:50 GMT YGeneva*fLANDmac if port == 5335 if path == "/system/pages/subscriptions" return (true) return (false) WdatatablGԋԋ createdSun, 22 Jan 2006 14:19:55 GMTWdatatablGnn createdSun, 22 Jan 2006 14:19:26 GMTWdatatablGrr createdSun, 22 Jan 2006 14:19:30 GMTGeneva'.J'.JQLANDmac on handler (pta) local (args) new (tabletype, @args) webserver.parseargs (pta^.searchargs, @args) thread.callscript (@newsRiverSuite.responder.subscriber, {args.url}) pta^.code = 302 pta^.responseBody = webserver.util.buildErrorPage ("302 FOUND", "Found the page.") pta^.responseHeaders.location = pta^.requestHeaders.Referer pta^.responseHeaders.URI = pta^.requestHeaders.Referer try {delete (@pta^.responseHeaders.["Content-Type"])} return (true) WdatatablG createdSun, 22 Jan 2006 14:21:37 GMTWdatatablG createdSun, 22 Jan 2006 14:21:39 GMTWdatatablGՅՅ createdSun, 22 Jan 2006 14:24:05 GMTWdatatablGٝٝ createdSun, 22 Jan 2006 14:41:33 GMTuGenevaً٧wzLANDmac on subscriber (url) local (adrdata = newsRiverSuite.init ()) adrdata^.newsRiver.lastFeedSubUrl = url frontier.bringtofront () newsRiverSuite.menuCommands.subscribe () WdatatablGff createdSun, 22 Jan 2006 14:32:06 GMTs.>'.J  * 5 conditione+handlerg% subscriberkVGeneva|=XJZArial '.B'.B{mLANDmac on untaint (s, flNeuterJavaScript=true, macroStartChars="<%") Changes: 11/8/01; 9:32:26 PM by JES Changed default startMacroChars from "{" to "<%". 8/14/01; 4:31:29 PM by JES New optional parameter, macroStartChars, used to specify which macro characters to neuter. The first character is converted to a numerical HTML entity. 2/20/01; 4:05:30 PM by PBS Neuter JavaScript if flNeuterJavaScript is true. 2/15/01; 3:11:35 PM by PBS Created. Prevent macros and JavaScript from being executed. local (replaceWith = "&#" + number (macroStartChars[1]) + ";" + string.delete (macroStartChars, 1, 1)) s = string.replaceAll (s, macroStartChars, replaceWith) if flNeuterJavaScript s = html.neuterJavaScript (s) return (s) Geneva'.C'.CgLANDmac newsRiverSuite.updateTool () &IGeneva'.C'.CZ3toLANDmac Changes 1/11/06; 5:11:30 PM by DW Ooops, can't set it true, it's called whenever we do a scan. 1/11/06; 4:35:46 PM by DW Set dialogs to true, 12/29/05; 1:59:46 PM by DW Created. local (adrtable = @user.rootUpdates.servers.newsRiver) if not defined (adrtable^) new (tabletype, adrtable) if not defined (adrtable^.autobackup) adrtable^.autobackup = false if not defined (adrtable^.dbName) adrtable^.dbName = "newsRiver.root" if not defined (adrtable^.dialogs) adrtable^.dialogs = true if not defined (adrtable^.lastupdate) adrtable^.lastupdate = date (0) if not defined (adrtable^.method) adrtable^.method = "nirvanaServer.subscriptions.update" if not defined (adrtable^.port) adrtable^.port = 80 if not defined (adrtable^.serialnum) adrtable^.serialnum = 0 if not defined (adrtable^.server) adrtable^.server = "communityserverhome.opml.org" if not defined (adrtable^.url) adrtable^.url = "" local (ctnewparts) adrtable^.dialogs = false //1/11/06 by DW rootUpdates.update (@newsRiverSuite, adrCtNewParts:@ctnewparts) msg (ctnewparts + " new part(s) installed in newsRiver.root.") WdatatablGٜNٜN createdThu, 29 Dec 2005 21:59:42 GMTWdatatablG¿ createdThu, 12 Jan 2006 01:11:30 GMTWdatatablGÿ createdThu, 12 Jan 2006 01:11:31 GMTWdatatablGaa createdThu, 12 Jan 2006 00:35:45 GMTWdatatablGcc createdThu, 12 Jan 2006 00:35:47 GMTWdatatablGٜPٜP createdThu, 29 Dec 2005 21:59:44 GMTWdatatablGٜRٜR createdThu, 29 Dec 2005 21:59:46 GMTWdatatablGͿ createdMon, 14 Nov 2005 16:22:37 GMTWdatatablGW^W^ createdWed, 04 Jan 2006 15:43:42 GMTWdatatablGWgWg createdWed, 04 Jan 2006 15:43:51 GMT[Geneva'.C'.CLANDmac Changes 1/4/06; 10:38:28 AM by DW Created. Copy it into the system.temp table and then run from there, so we can update all the parts here, including the update script itself. system.temp.newsRiverUpdateCode = newsRiverSuite.updateCode system.temp.newsRiverUpdateCode () WdatatablGVV createdWed, 04 Jan 2006 15:38:22 GMTWdatatablGV#V# createdWed, 04 Jan 2006 15:38:27 GMTWdatatablGV%V% createdWed, 04 Jan 2006 15:38:29 GMTWdatatablGVPVP createdWed, 04 Jan 2006 15:39:12 GMTWdatatablGVtVt createdWed, 04 Jan 2006 15:39:48 GMT[sGeneva?#?S?ALANDmac for adrservice in @aggregatorData.services if defined (adrservice^.flmanualsub) adrservice^.flmanualsub = false WdatatablG?2?2 createdMon, 16 Jan 2006 02:04:34 GMTWdatatablG?"); indentlevel++ add (""); indentlevel++ bundle //add header add ("") local (xstruct) xml.compile (op.outlinetoxml (adroutline), @xstruct) scratchpad.xstruct = xstruct local (adropml = xml.getaddress (@xstruct, "opml")) local (adrbody = xml.getaddress (adropml, "body"), adrhour, adritem, adratts) for adrhour in adrbody if nameof (adrhour^) contains "outline" for adritem in adrhour if nameof (adritem^) contains "outline" adratts = @adritem^.["/atts"] local (text = adratts^.text) local (eventType = string.nthfield (text, ":", 1)) text = string.delete (text, 1, sizeof (eventType + 2)) local (what) bundle //set what local (ix = string.patternmatch (" at ", text)) what = string.mid (text, 1, ix) text = string.delete (text, 1, ix + 3) if string.trimwhitespace (what) endswith ")" //remove substring " (xxx)" for ix = sizeof (what) downto 1 if what [ix] == "(" what = string.mid (what, 1, ix-1) if defined (adratts^.url) what = "" + what + "" local (when = string.nthfield (text, ",", 1)) local (secs = string.nthfield (text, ",", 2) - " secs.") local (s) s = s + "" s = s + "" s = s + "" s = s + "" s = s + "" s = s + "" add (s) add ("
" + newsRiverSuite.getString ("eventsLog.eventHeader") + "" + newsRiverSuite.getString ("eventsLog.whatHappenedHeader") + "" + newsRiverSuite.getString ("eventsLog.timeHeader") + "" + newsRiverSuite.getString ("eventsLog.secsHeader") + "
" + eventType + "" + what + "" + when + "" + secs + "
"); indentlevel-- add (""); indentlevel-- bundle //cache if not defined (system.temp.newsRiver.logHtmlCache) new (tabletype, @system.temp.newsRiver.logHtmlCache) system.temp.newsRiver.logHtmlCache.htmltext = htmltext system.temp.newsRiver.logHtmlCache.when = clock.now () return (htmltext) bundle //test code local (pt) new (tabletype, @pt) html.setpagetableaddress (@pt) webbrowser.displaytext (viewLog ()) WdatatablG createdSun, 15 Jan 2006 15:48:50 GMTWdatatablG createdSun, 15 Jan 2006 15:48:51 GMTWdatatablG createdSun, 15 Jan 2006 15:48:53 GMTWdatatablGﮍﮍ createdSun, 15 Jan 2006 15:47:25 GMTWdatatablGss createdSun, 15 Jan 2006 14:55:47 GMTWdatatablG|| createdSun, 15 Jan 2006 14:55:56 GMTWdatatablG&& createdSun, 15 Jan 2006 15:45:42 GMTWdatatablG createdSun, 15 Jan 2006 15:45:14 GMTWdatatablGrr createdSun, 15 Jan 2006 15:46:58 GMTWdatatablG|| createdSun, 15 Jan 2006 15:47:08 GMTWdatatablG createdSun, 15 Jan 2006 14:57:04 GMTWdatatablG createdSun, 15 Jan 2006 14:56:22 GMTWdatatablGſ createdSun, 15 Jan 2006 14:57:09 GMTWdatatablG createdSun, 15 Jan 2006 14:58:15 GMTWdatatablG createdSun, 15 Jan 2006 14:58:31 GMTWdatatablG%% createdSun, 15 Jan 2006 14:58:45 GMTWdatatablG,, createdSun, 15 Jan 2006 14:58:52 GMTWdatatablG44 createdSun, 15 Jan 2006 14:59:00 GMTWdatatablG99 createdSun, 15 Jan 2006 14:59:05 GMTWdatatablGEE createdSun, 15 Jan 2006 14:59:17 GMTWdatatablGii createdSun, 15 Jan 2006 15:16:57 GMTWdatatablG createdSun, 15 Jan 2006 15:15:33 GMTWdatatablG~~ createdSun, 15 Jan 2006 15:17:18 GMTWdatatablG履履 createdSun, 15 Jan 2006 15:17:51 GMTWdatatablG藺藺 createdSun, 15 Jan 2006 15:18:08 GMTWdatatablG麟麟 createdSun, 15 Jan 2006 15:18:11 GMTWdatatablGѿ createdSun, 15 Jan 2006 15:18:41 GMTWdatatablG߿ createdSun, 15 Jan 2006 15:18:55 GMTWdatatablG createdSun, 15 Jan 2006 15:23:20 GMTWdatatablG createdSun, 15 Jan 2006 15:24:06 GMTWdatatablG$$ createdSun, 15 Jan 2006 15:24:20 GMTWdatatablG,, createdSun, 15 Jan 2006 15:24:28 GMTWdatatablGff createdSun, 15 Jan 2006 15:25:26 GMTWdatatablG祈祈 createdSun, 15 Jan 2006 15:26:06 GMTWdatatablG createdSun, 15 Jan 2006 15:19:13 GMTWdatatablG createdSun, 15 Jan 2006 15:19:13 GMTWdatatablG&& createdSun, 15 Jan 2006 15:45:42 GMTWdatatablG createdSun, 15 Jan 2006 15:45:14 GMTWdatatablG createdSun, 15 Jan 2006 15:45:30 GMTWdatatablG11 createdSun, 15 Jan 2006 15:45:53 GMTWdatatablGGG createdSun, 15 Jan 2006 15:46:15 GMTWdatatablGUU createdSun, 15 Jan 2006 14:55:17 GMTWdatatablGYY createdSun, 15 Jan 2006 14:55:21 GMTWdatatablGԿ createdSun, 15 Jan 2006 14:57:24 GMTWdatatablG׿ createdSun, 15 Jan 2006 14:57:27 GMTWdatatablGݿ createdSun, 15 Jan 2006 14:57:33 GMTWdatatablG]] createdSun, 15 Jan 2006 14:55:25 GMT&'p2 '0gGeneva'.CW4LANDmac on viewNewsItems (adrargs=nil, ctStoriesToList=nil) Changes: 10/16/05; 10:58:30 AM by DW Began work on this code after a long hiatus. Make it work inside the OPML Editor. local (pta = html.getpagetableaddress ()) scratchpad.newsparams = pta^ pta^.title = newsRiverSuite.getString ("aggregator.title") local (uri = pta^.uri) local (adrdata = newsRiverSuite.init ()) if ctStoriesToList == nil ctStoriesToList = adrdata^.newsRiver.ctStoriesOnNewsPage local (htmltext = "", indentlevel = 0) on add (s) htmltext = htmltext + (string.filledstring ("\t", indentlevel) + s + "\r\n"); on decodeEntities (s) s = string.replaceAll (s, "\r\n", "\r") s = string.replaceAll (s, "\n", "\r") return (newsRiverSuite.decodeEntities (s, flNeuterJavaScript:false)) local (flOneService = false, xmlUrl = "", adrservice) bundle //parse args local (args) new (tabletype, @args) webserver.parseArgs (pta^.searchArgs, @args) if defined (args.xmlUrl) flOneService = true xmlurl = args.xmlUrl adrservice = @adrdata^.services.[xmlurl] if defined (adrservice^.compilation.channeltitle) //avoid errors for non-compliant channels add ("Channel: " + decodeEntities (adrservice^.compilation.channeltitle) + "

") pta^.title = "Channel: " + decodeEntities (adrservice^.compilation.channeltitle) local (adrcache = @adrdata^.cache.[this], adrincache, defaultcachename = "default") if not defined (adrcache^) //make sure the cache table is defined new (tabletype, adrcache) bundle //set adrincache if adrdata^.newsRiver.flCacheNewsItemsPage local (cachename = defaultcachename) if sizeof (xmlUrl) > 0 cachename = xmlUrl adrincache = @adrcache^.[cachename] bundle //catch post if pta^.method == "POST" local (args) new (tabletype, @args) webserver.parseArgs (pta^.requestBody, @args) scratchpad.args = args; edit (@scratchpad.args) if defined (args.formName) if string.lower (args.formName) == "editstories" delete (@args.formName) if defined (args.unsubscribe) local (args) new (tabletype, @args) args.xmlUrl = xmlUrl if defined (adrdata^.services.[xmlUrl]) adrargs^.redirect = newsRiverData.systemUrls.unsub + "?" + webserver.encodeargs (@args) return ("") local (adrdefaultcache = @adrcache^.[defaultcachename]) for adrarg in @args try local (name = string.padwithzeros (number (nameof (adrarg^)), 8)) local (adrstory = @adrdata^.stories.[name]) if defined (adrstory^) adrdata^.trash.[name] = adrstory^ delete (adrstory) if adrdata^.newsRiver.flCacheNewsItemsPage if defined (adrcache^) if defined (adrincache^) //posting invalidates the cache delete (adrincache) if adrdefaultcache == adrincache //02/24/2001 JES: delete the cache for the service if defined (adrstory^) local (adrservicecache = @adrcache^.["xmlUrl=" + string.urlEncode (adrstory^.url)]) if defined (adrservicecache^) delete (adrservicecache) else //02/24/2001 JES: we're on the service page -- delete the default cache if defined (adrdefaultcache^) delete (adrdefaultcache) bundle //see if we can serve from the cache if defined (adrcache^) if defined (adrincache^) return (adrincache^) local (globeimg, xmlimg, searchimg, checkmarkimg, mediaimg, commentimg, postbuttonimg, permalinkimg) bundle //precalc img refs globeimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/remote") xmlimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/xml") searchimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/search") checkmarkimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/checkmark") postbuttonimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/post") mediaimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/sound") commentimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/pencil") permalinkimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/itemPermalink") add ("

"); indentlevel++ add ("") //PBS 01/11/01: name the form, so the script doesn't try to process some other script's form add ("
  
") bundle //message at the top of the page if flOneService local (t) new (tabletype, @t) t.channeltitle = decodeEntities (adrservice^.compilation.channeltitle) add (newsRiverSuite.getString ("aggregator.oneChannelMessage", @t)) pta^.title = t.channeltitle else local (t) new (tabletype, @t) t.subscriptionurl = newsRiverData.systemUrls.subscriptionList add (newsRiverSuite.getString ("aggregator.standardMessage", @t)) add (newsRiverSuite.getString ("aggregator.clickThePostButton")) if adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault add (newsRiverSuite.getString ("aggregator.checkBoxesOnIntro")) else add (newsRiverSuite.getString ("aggregator.checkBoxesOffIntro")) if flOneService add (newsRiverSuite.getString ("aggregator.howToUnsubscribe")) local (adrtable = @adrdata^.stories, sizetable = sizeof (adrtable^), i) add ("
"); indentlevel++ add (""); indentlevel++ local (lastchanneltitle = "", ctstories = 0) bundle //loop over the news items for i = sizetable downto 1 local (adritem = @adrdata^.stories [i]) bundle //skip missing or empty stories if not defined (adritem^.storyText) //skip this story -- this can happen if the scan is interrupted continue if (string.trimWhiteSpace (searchEngine.stripMarkup (adrItem^.storyText)) == "") and (not (string.lower (adrItem^.storyText) contains " ctStoriesToList break if adritem^.channeltitle != lastchanneltitle //display channel title local (globe = "") try //link the globe to the HTML rendering of the channel with adrservice^.compilation local (desc = searchengine.stripmarkup (channeldescription)) globe = "" + globeimg + "" //PBS 02/12/01: fix bug where quotes and carets in a channel description would mess up rendering -- an example was Dave Winer: Two-Way Web, which has a description of You're soaking in it! ";->" local (xmllink) bundle //link the XML icon to the source XML file for the channel xmllink = "
" + xmlimg + "
" local (magglass = "") bundle //load up the magnifying glass with some HTML if not flOneService local (url, args) new (tabletype, @args) args.xmlUrl = adritem^.url url = "?" + webserver.encodeArgs (@args) magglass = " " + searchimg + "" add ("") lastchanneltitle = adritem^.channeltitle bundle //add story add (""); indentlevel++ bundle //add checkbox local (checkboxtext = " ") if adrdata^.newsRiver.flItemCheckboxes local (name = number (nameof (adritem^))) local (checkboxval = "xxx ") if adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault checkboxval = checkboxval + "checked" checkboxtext = "" add ("") add ("") bundle //add POST button, checkmark local (url) bundle //set url local (args); new (tabletype, @args) if adrdata^.newsRiver.flNewsPageReturnAfterPost //add referer arg to redirect back to this item after posting it to your weblog if pta^.searchargs != "" args.referer = uri + "?" + pta^.searchargs + "#" + i else args.referer = uri + "#" + i args.idStory = number (nameof (adritem^)) url = newsRiverData.systemUrls.postToWeblog + "?" + webserver.encodeArgs (@args) local (checkmark = "", enclosure = "", comments = "", permalink = "") bundle //an item has a checkmark if it's been blogged if defined (adritem^.adrBlogPost) checkmark = " " + checkmarkimg + "" bundle //if it has an enclosure add a media link if defined (adritem^.enclosure) if not defined (adritem^.enclosure.error) local (url) if defined (adritem'-`؛-W!  ". :F Vb lx addRssAtts exportOpml preferences/setMinuteToScan subscribeviewNewsviewSubscriptionsvviewThisEnclosuretVGeneva|=XJGenevaW!W!mLANDmac Changes 4/3/06; 10:13:30 AM by DW Created. Assume the outline cursor is on a node representing an enclosure that's been downloaded to the local hard drive. Open the folder containing the enclosure. try local (atts) op.attributes.getall (@atts) file.openfolder (file.folderfrompath (string.getfileurl (atts.url))) else scriptError ("Can't view the enclosure because the outline element doesn't have an enclosure stored on the local hard drive.") WdatatablGVV createdMon, 03 Apr 2006 18:13:23 GMTWdatatablGVV createdMon, 03 Apr 2006 18:13:26 GMTWdatatablGVV createdMon, 03 Apr 2006 18:13:30 GMTWdatatablGVV createdMon, 03 Apr 2006 18:13:47 GMTWdatatablGVMVM createdMon, 03 Apr 2006 18:15:41 GMTWdatatablGVV createdMon, 03 Apr 2006 18:09:56 GMTWdatatablGVV createdMon, 03 Apr 2006 18:09:42 GMTWdatatablGVV createdMon, 03 Apr 2006 18:12:23 GMTWdatatablGVbVb createdMon, 03 Apr 2006 18:16:02 GMTWdatatablGVV createdMon, 03 Apr 2006 18:14:28 GMTp,c GenevakEp_ GenevawVF'?LANDmac NewsRiver Do scan now... - Import OPML... Export OPML... - View News... View Subscriptions... Preferences... - Subscribe... - Open enclosures folder View this enclosure Download enclosures - Add feed to outline... - Get Latest Code... "  h   1 f  Ն   7M I_jGeneva٣2N _cLANDmac if dialog.confirm ("Get the latest News River code?") thread.callscript (@newsRiverSuite.updateTool, {}) datata*GenevagXN`_cLANDmac newsRiverSuite.menuCommands.addRssAtts () @GenevaT˿ _cLANDmac newsRiverSuite.podcatcher.menuCommands.downloadEnclosuresNow () 1GenevaTVVLANDmac newsRiverSuite.menuCommands.viewThisEnclosure () ?GenevaT儿 _cLANDmac newsRiverSuite.podcatcher.menuCommands.openEnclosuresFolder () >- 0Geneva'.CW 4LANDmac on viewNewsItems (adrargs=nil, ctStoriesToList=nil) Changes: 10/16/05; 10:58:30 AM by DW Began work on this code after a long hiatus. Make it work inside the OPML Editor. local (pta = html.getpagetableaddress ()) scratchpad.newsparams = pta^ pta^.title = newsRiverSuite.getString ("aggregator.title") local (uri = pta^.uri) local (adrdata = newsRiverSuite.init ()) if ctStoriesToList == nil ctStoriesToList = adrdata^.newsRiver.ctStoriesOnNewsPage local (htmltext = "", indentlevel = 0) on add (s) htmltext = htmltext + (string.filledstring ("\t", indentlevel) + s + "\r\n"); on decodeEntities (s) s = string.replaceAll (s, "\r\n", "\r") s = string.replaceAll (s, "\n", "\r") return (newsRiverSuite.decodeEntities (s, flNeuterJavaScript:false)) local (flOneService = false, xmlUrl = "", adrservice) bundle //parse args local (args) new (tabletype, @args) webserver.parseArgs (pta^.searchArgs, @args) if defined (args.xmlUrl) flOneService = true xmlurl = args.xmlUrl adrservice = @adrdata^.services.[xmlurl] if defined (adrservice^.compilation.channeltitle) //avoid errors for non-compliant channels add ("Channel: " + decodeEntities (adrservice^.compilation.channeltitle) + "

") pta^.title = "Channel: " + decodeEntities (adrservice^.compilation.channeltitle) local (adrcache = @adrdata^.cache.[this], adrincache, defaultcachename = "default") if not defined (adrcache^) //make sure the cache table is defined new (tabletype, adrcache) bundle //set adrincache if adrdata^.newsRiver.flCacheNewsItemsPage local (cachename = defaultcachename) if sizeof (xmlUrl) > 0 cachename = xmlUrl adrincache = @adrcache^.[cachename] bundle //catch post if pta^.method == "POST" local (args) new (tabletype, @args) webserver.parseArgs (pta^.requestBody, @args) scratchpad.args = args; edit (@scratchpad.args) if defined (args.formName) if string.lower (args.formName) == "editstories" delete (@args.formName) if defined (args.unsubscribe) local (args) new (tabletype, @args) args.xmlUrl = xmlUrl if defined (adrdata^.services.[xmlUrl]) adrargs^.redirect = newsRiverData.systemUrls.unsub + "?" + webserver.encodeargs (@args) return ("") local (adrdefaultcache = @adrcache^.[defaultcachename]) for adrarg in @args try local (name = string.padwithzeros (number (nameof (adrarg^)), 8)) local (adrstory = @adrdata^.stories.[name]) if defined (adrstory^) adrdata^.trash.[name] = adrstory^ delete (adrstory) if adrdata^.newsRiver.flCacheNewsItemsPage if defined (adrcache^) if defined (adrincache^) //posting invalidates the cache delete (adrincache) if adrdefaultcache == adrincache //02/24/2001 JES: delete the cache for the service if defined (adrstory^) local (adrservicecache = @adrcache^.["xmlUrl=" + string.urlEncode (adrstory^.url)]) if defined (adrservicecache^) delete (adrservicecache) else //02/24/2001 JES: we're on the service page -- delete the default cache if defined (adrdefaultcache^) delete (adrdefaultcache) bundle //see if we can serve from the cache if defined (adrcache^) if defined (adrincache^) return (adrincache^) local (globeimg, xmlimg, searchimg, checkmarkimg, mediaimg, commentimg, postbuttonimg, permalinkimg) bundle //precalc img refs globeimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/remote") xmlimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/xml") searchimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/search") checkmarkimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/checkmark") postbuttonimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/post") mediaimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/qbullet/sound") commentimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/pencil") permalinkimg = dotOpmlSuite.mdiWindow.imageRef ("newsRiver/icons/itemPermalink") add (""); indentlevel++ add ("") //PBS 01/11/01: name the form, so the script doesn't try to process some other script's form add ("

 " + globe + " " + decodeEntities (adrItem^.channelTitle) + ", " + adritem^.time + "." + magglass + "" + xmllink + "
" + checkboxtext + "
  " + adritem^.storytext + "
  
") bundle //message at the top of the page if flOneService local (t) new (tabletype, @t) t.channeltitle = decodeEntities (adrservice^.compilation.channeltitle) add (newsRiverSuite.getString ("aggregator.oneChannelMessage", @t)) pta^.title = t.channeltitle else local (t) new (tabletype, @t) t.subscriptionurl = newsRiverData.systemUrls.subscriptionList add (newsRiverSuite.getString ("aggregator.standardMessage", @t)) add (newsRiverSuite.getString ("aggregator.clickThePostButton")) if adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault add (newsRiverSuite.getString ("aggregator.checkBoxesOnIntro")) else add (newsRiverSuite.getString ("aggregator.checkBoxesOffIntro")) if flOneService add (newsRiverSuite.getString ("aggregator.howToUnsubscribe")) local (adrtable = @adrdata^.stories, sizetable = sizeof (adrtable^), i) add ("
"); indentlevel++ add (""); indentlevel++ local (lastchanneltitle = "", ctstories = 0) bundle //loop over the news items for i = sizetable downto 1 local (adritem = @adrdata^.stories [i]) bundle //skip missing or empty stories if not defined (adritem^.storyText) //skip this story -- this can happen if the scan is interrupted continue if (string.trimWhiteSpace (searchEngine.stripMarkup (adrItem^.storyText)) == "") and (not (string.lower (adrItem^.storyText) contains " ctStoriesToList break if adritem^.channeltitle != lastchanneltitle //display channel title local (globe = "") try //link the globe to the HTML rendering of the channel with adrservice^.compilation local (desc = searchengine.stripmarkup (channeldescription)) globe = "" + globeimg + "" //PBS 02/12/01: fix bug where quotes and carets in a channel description would mess up rendering -- an example was Dave Winer: Two-Way Web, which has a description of You're soaking in it! ";->" local (xmllink) bundle //link the XML icon to the source XML file for the channel xmllink = "
" + xmlimg + "
" local (magglass = "") bundle //load up the magnifying glass with some HTML if not flOneService local (url, args) new (tabletype, @args) args.xmlUrl = adritem^.url url = "?" + webserver.encodeArgs (@args) magglass = " " + searchimg + "" add ("") lastchanneltitle = adritem^.channeltitle bundle //add story add (""); indentlevel++ bundle //add checkbox local (checkboxtext = " ") if adrdata^.newsRiver.flItemCheckboxes local (name = number (nameof (adritem^))) local (checkboxval = "xxx ") if adrdata^.newsRiver.flNewsPageDeleteCheckboxesDefault checkboxval = checkboxval + "checked" checkboxtext = "" add ("") add ("") bundle //add POST button, checkmark local (url) bundle //set url local (args); new (tabletype, @args) if adrdata^.newsRiver.flNewsPageReturnAfterPost //add referer arg to redirect back to this item after posting it to your weblog if pta^.searchargs != "" args.referer = uri + "?" + pta^.searchargs + "#" + i else args.referer = uri + "#" + i args.idStory = number (nameof (adritem^)) url = newsRiverData.systemUrls.postToWeblog + "?" + webserver.encodeArgs (@args) local (checkmark = "", enclosure = "", comments = "", permalink = "") bundle //an item has a checkmark if it's been blogged if defined (adritem^.adrBlogPost) checkmark = " " + checkmarkimg + "" bundle //if it has an enclosure add a media link if defined (adritem^.enclosure) if not defined (adritem^.enclosure.error) local (url) if defined (adritem^.enclosure.f) url = html.getfileurl (adritem^.enclosure.f) else url = adritem^.enclosure.url enclosure = " " + mediaimg + "" bundle //if it has comments add a comment link if defined (adritem^.comments) local (onclick = "window.open (this.href, \'comments\', \'width=515, height=480, location=0, resizable=1, scrollbars=1, status=0, toolbar=0, directories=0\'); return(false);") local (tooltip = newsRiverSuite.getString ("misc.clickToCommentOnThisPost")) comments = "
" + commentimg + "
" bundle //if it has permalink add a permalink link if defined (adritem^.permalink) permalink = "" + permalinkimg + "" local (icons = "") bundle //set icons if (sizeof (checkmark) > 0) or (sizeof (enclosure) > 0) or (sizeof (permalink) > 0) or (sizeof (comments) > 0) icons = "

" + comments + checkmark + enclosure + permalink + "

" add ("") add (""); indentlevel-- if ctstories == 0 add ("") add ("
 " + globe + " " + decodeEntities (adrItem^.channelTitle) + ", " + adritem^.time + "." + magglass + "" + xmllink + "
" + checkboxtext + "
  " + adritem^.storytext + "
" + postbuttonimg + "" + icons + "
" + newsRiverSuite.getString ("aggregator.noStories") + "
"); indentlevel-- add ("
"); indentlevel-- local (flDeleteButtonAdded = false) if flOneService if defined (adrservice^) 3/4/06; 18:42:18 by TM On the following line, I've switched the two around to fix enter bug in Safari add ("

  

") flDeleteButtonAdded = true if not flDeleteButtonAdded add ("

") add (""); indentlevel-- if adrdata^.newsRiver.flCacheNewsItemsPage adrincache^ = htmltext return (htmltext) bundle //test code html.setpagetableaddress (@scratchpad.newsparams) webbrowser.displaytext (viewNewsItems ()) webbrowser.bringtofront () WdatatablGwԿw createdSun, 16 Oct 2005 17:58:28 GMTWdatatablGw׿w createdSun, 16 Oct 2005 17:58:31 GMTWdatatablGww createdSun, 16 Oct 2005 17:58:58 GMTWdatatablGxx createdMon, 17 Oct 2005 13:06:32 GMTWdatatablGxx createdMon, 17 Oct 2005 13:06:37 GMTWdatatablGzz createdTue, 18 Oct 2005 19:36:01 GMTWdatatablGzz createdTue, 18 Oct 2005 18:35:54 GMTWdatatablG~~ createdFri, 21 Oct 2005 18:25:32 GMTWdatatablG createdFri, 30 Dec 2005 22:03:37 GMTWdatatablGuu createdTue, 08 Nov 2005 17:03:49 GMTWdatatablG<< createdTue, 08 Nov 2005 01:14:59 GMTWdatatablGyKyK createdMon, 17 Oct 2005 16:07:23 GMTWdatatablGyUyU createdMon, 17 Oct 2005 16:07:33 GMTWdatatablGyXyX createdMon, 17 Oct 2005 16:07:36 GMTWdatatablGyLyL createdMon, 17 Oct 2005 16:07:24 GMTWdatatablGWW createdMon, 03 Apr 2006 17:41:59 GMTWdatatablGWW createdMon, 03 Apr 2006 17:41:18 GMTWdatatablGwgwg createdSun, 16 Oct 2005 18:00:55 GMTWdatatablGxx createdSun, 16 Oct 2005 20:27:04 GMTWdatatablGwkwk createdSun, 16 Oct 2005 18:00:59 GMTWdatatablGxrxr createdSun, 16 Oct 2005 20:21:54 GMT>-OW%  '         8D P\       ". 9E O[ kw       & JV eq z      8D Y " 3quarksdaily$Yj["Macintosh HD:Applications:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblogsxl["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.logzu["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:newsRiver.root"].newsRiverWebsite.postToWeblog;About Agnosticism / AtheismNAbout Agnosticism/AtheismmAsk MetaFilterAtheism!!BBC News | Education | UK Edition#i Boing Boingt@+ButterfliesandWheels.com Notes and Commentsr EirePreneurt Event logGuardian UnlimitedlHome!%Internet Infidels News wirepJoystiqx Lifehacker, Londonist"<News Aggregator Newsome.Orgٝ Pharyngulan5plasticbag.orgغ PreferencesRed State Rabbleo Salon.com׏ Samizdata.netf#Scobleizer - Microsoft Geek Blogger#Scripting NewsSlashdotofStupid Evil Bastardr Subscriptions$ TechCrunchs Test page[Thoughts from Kansasm)Weblog - David Aaronovitch - Times OnlineWordpress Plugins DBnVArial Otp$W 2W 2 6 ;linetext)Weblog - David Aaronovitch - Times Onlinepath index.wsftD$W :W :  linetextHomepathD)GenevaT_p_cLANDmac newsRiverSuite.menuCommands.subscribe () AGenevaTÓ'?LANDmac thread.callscript (@newsRiverSuite.menuCommands.preferences, {}) GGenevaج¿$_cLANDmac thread.callscript (@newsRiverSuite.menuCommands.viewSubscriptions, {}) (GenevaT؛g؛y!_cLANDmac newsRiverSuite.menuCommands.viewNews () *GenevaTL5L:'?LANDmac newsRiverSuite.menuCommands.exportOpml () 3GenevaTOͿP _cLANDmac xml.aggregator.menuCommands.importSubscriptions () OK$WuWu  linetextHomepath index.wsfORN$W~W~  linetextAtheismpath index.wsfRRc$W W  linetextAtheismpath index.wsfRTP$W tW t  linetext Londonistpath index.wsfT'Genevaw߿w)!'?LANDmac newsRiverSuite.doScanNow () Agnosticism / Atheismpath index.wsflh$WW . 3linetext!BBC News | Education | UK Editionpath index.wsfll$W% W% ( -linetextAbout Agnosticism / Atheismpath index.wsfex.wsfl` S$WW  linetext 3quarksdailypath index.wsftions.wsf``\$W#$W#$  linetext Subscriptionspathsubscriptions.wsf` ~ Geneva'.J'.JyLANDmac on wsfMasterControl (pta) Changes 1/25/06; 7:43:00 AM by DW Where do you want to go today? Called from webserver.responders.websiteFramework.methods.any We return true if we handled the request, false to let it pass through. local (adrdata = newsRiverSuite.init ()) bundle //set pta^.flSameMachine pta^.flSameMachine = false if string.lower (pta^.client) == "localhost" pta^.flSameMachine = true else if pta^.client == "127.0.0.1" pta^.flSameMachine = true else try {pta^.flSameMachine = tcp.equalNames (pta^.client, tcp.myDottedID ())} scratchpad.wsfmasterparams = pta^ try on getHostFromReferer (referer) local (urllist, host) try urllist = string.urlsplit (pta^.requestHeaders.referer) else urllist = string.urlsplit (pta^.requestHeaders.referer + "/") host = urllist [2] if host contains ":" host = string.nthField (host, ":", 1) return (host) if pta^.flSameMachine if pta^.method == "POST" //hole closed, 1/18/02 DW local (refererhost = getHostFromReferer (pta^.requestHeaders.referer)) if refererhost != "127.0.0.1" if string.lower (refererhost) != "localhost" scriptError ("Access denied.") return (false) //process the request without security if not adrdata^.newsRiver.security.allowRemoteViewing scriptError ("Access denied.") if pta^.method == "POST" if not adrdata^.newsRiver.security.allowRemotePost scriptError ("Access denied.") if adrdata^.newsRiver.security.requireRemoteLogin or (pta^.method == "POST") local (flsecure = false) if webserver.util.parseAuth (pta) //get username and password if string.lower (pta^.username) == string.lower (adrdata^.prefs.security.username) if string (pta^.password) == string (adrdata^.prefs.security.password) return (false) //go ahead and handle the request if not flsecure //send challenge pta^.responseBody = webserver.util.buildErrorPage ("401 Unauthorized", "A valid username and password are required to access this page.") pta^.responseHeaders.["WWW-Authenticate"] = "Basic realm=\"Admin\"" pta^.code = 401 return (true) if pta^.method == "POST" //1/23/02 JES: check non-local referers try //some users behind proxy servers can't do DNS lookups -- don't do a 500 Server Error local (refererhost = getHostFromReferer (pta^.requestHeaders.referer)) if refererhost != tcp.dns.getMyDottedId () if not tcp.equalNames (refererhost, tcp.dns.getMyDottedId ()) scriptError ("Access denied.") else //check for local NAT IP addresses, as defined by ICANN Reference: http://www.riverstonenet.com/technology/nat.shtml local (myIp = tcp.dns.getMyDottedId ()) if myIp beginsWith "10." //10.x.x.x is ok. (Class A) return (true) if myIp beginsWith "172." //172.31.0.0 to 172.31.255.255 are ok. (Class B) local (x = number (string.nthField (myIp, ".", 2))) if x >= 0 and x <= 31 return (true) if myIp beginsWith "192.168." //192.168.x.x is ok. (Class C) return (true) scriptError ("Access denied.") else pta^.responseBody = webserver.util.buildErrorPage ("403 Forbidden", "Access denied.") pta^.code = 403 return (true) //we handled the wsf request WdatatablG)) createdWed, 25 Jan 2006 16:15:37 GMTWdatatablGJJ createdWed, 25 Jan 2006 16:33:14 GMTWdatatablG;; createdWed, 25 Jan 2006 16:15:55 GMTWdatatablG縿 createdWed, 25 Jan 2006 16:30:48 GMT$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablssWdatatablG createdWed, 25 Jan 2006 16:31:54 GMT$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablssWdatatablG뻿 createdWed, 25 Jan 2006 16:47:55 GMT$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablss$datatablssWdatatablG createdWed, 25 Jan 2006 16:30:57 GMT$datatablss$datatablssWdatatablGҿ createdWed, 25 Jan 2006 16:31:14 GMT 6Geneva'.C'.CLANDmac Changes 1/7/06; 10:17:21 PM by DW This is where we try to work around the problem with Firefox on Windows, explained in #2 of this post. http://support.opml.org/2006/01/05#a539 If the object wasn't found (that's how we got here) see if there is something that matches the path supplied with one extra character. If so, redirect there. bundle //workaround for Firefox on Windows local (pta = html.getpagetableaddress ()) local (path = pta^.path, adr, s, newuri) local (name = string.lower (string.nthfield (path, "/", string.countfields (path, "/")))) for adr in @newsRiverWebsite s = nameof (adr^) if string.lower (string.delete (s, sizeof (s), 1)) == name newuri = string.delete (pta^.uri, sizeof (pta^.uri) - sizeof (name) + 1, sizeof (name)) + s scratchpad.onfparams = pta^ pta^.code = 302 //non-permanent redirect pta^.responseBody = webserver.util.buildErrorPage ("302 FOUND", "Found the page.") pta^.responseHeaders.location = newuri pta^.responseHeaders.URI = newuri WdatatablG:: createdFri, 06 Jan 2006 15:17:30 GMTWdatatablG>> createdFri, 06 Jan 2006 15:17:34 GMTWdatatablGYY createdFri, 06 Jan 2006 15:18:01 GMTWdatatablG[[ createdFri, 06 Jan 2006 15:18:03 GMTWdatatablG createdFri, 06 Jan 2006 15:19:11 GMTWdatatablG createdFri, 06 Jan 2006 15:19:33 GMTWdatatablGvv createdSun, 08 Jan 2006 03:08:54 GMTWdatatablGPP createdSun, 08 Jan 2006 03:08:16 GMTWdatatablG쌿 createdSun, 08 Jan 2006 03:09:16 GMTWdatatablG createdSun, 08 Jan 2006 03:10:47 GMTWdatatablG왿 createdSun, 08 Jan 2006 03:09:29 GMTWdatatablGBB createdSun, 08 Jan 2006 03:12:18 GMTWdatatablGͿ createdFri, 06 Jan 2006 15:19:57 GMT 6Geneva'.C'.CmLANDmac NewsRiver: <%title%> <%metaTags ()%> <%bodyTag ()%>

NewsRiver: <%title%>

<%bodytext%> WdatatablGoo createdTue, 08 Nov 2005 16:59:27 GMT]#Geneva'.D'.D LANDmac return (newsRiverSuite.viewLog ()) WdatatablG createdTue, 01 Nov 2005 14:29:13 GMT DGeneva'.C'.CMLANDmac on prefs () Changes 1/11/06; 6:56:52 AM by DW Init the aggregator, for the case where viewing Prefs is the first thing the user does (I did it). 1/5/06; 3:11:18 PM by DW For POST requests, parse the args into pta^.postArgs. 1/3/06; 2:45:14 PM by DW Created. local (pta = html.getpagetableaddress ()) scratchpad.prefsparams = pta^ new (tabletype, @pta^.searchArgTable) webserver.parseargs (pta^.searchargs, @pta^.searchArgTable) if pta^.method == "POST" new (tabletype, @pta^.postArgs) webserver.parseArgs (pta^.requestBody, @pta^.postArgs) newsRiverSuite.init () //1/11/06 by DW local (htmltext = radio.prefs.browser (@newsRiverData.english.prefsOutline)) pta^.title = "Preferences" return (htmltext) bundle //test code html.setpagetableaddress (@scratchpad.prefsparams) webbrowser.displaytext (prefs ()) WdatatablG<< createdTue, 03 Jan 2006 19:34:57 GMTWdatatablG>x>x createdTue, 03 Jan 2006 19:45:12 GMTWdatatablG\\ createdWed, 11 Jan 2006 14:56:52 GMTWdatatablG\\ createdWed, 11 Jan 2006 14:56:53 GMTWdatatablG甿 createdThu, 05 Jan 2006 20:11:16 GMTWdatatablG痿 createdThu, 05 Jan 2006 20:11:19 GMTWdatatablG>y>y createdTue, 03 Jan 2006 19:45:13 GMTWdatatablG>{>{ createdTue, 03 Jan 2006 19:45:15 GMTWdatatablG<< createdTue, 03 Jan 2006 19:37:05 GMTWdatatablG;; createdTue, 03 Jan 2006 19:34:22 GMTWdatatablG<< createdTue, 03 Jan 2006 19:37:13 GMTWdatatablG<< createdTue, 03 Jan 2006 19:37:29 GMTWdatatablG˿ createdThu, 05 Jan 2006 20:07:55 GMTWdatatablG\\ createdWed, 11 Jan 2006 14:56:31 GMTWdatatablG== createdTue, 03 Jan 2006 19:42:04 GMTWdatatablG>W>W createdTue, 03 Jan 2006 19:44:39 GMTWdatatablG<< createdTue, 03 Jan 2006 19:35:02 GMTWdatatablG<< createdTue, 03 Jan 2006 19:35:06 GMTWdatatablG<6<6 createdTue, 03 Jan 2006 19:35:34 GMT