The 3.0 framework is basically .NET 2.0 with the following additions:\nWinFX: \n*Windows Communication Foundation (WCF) \n*Windows Presentation Foundation (WPF) \n*Windows Workflow Foundation (WWF) \nInfoCard: \n*Renamed to Windows CardSpace (WCS) \n
[[ADO.NET vNext|http://www.ftponline.com/vsm/2006_10/magazine/features/rjennings/]] is Microsoft's generic term for new ADO.NET enhancments including ORM and LINQ technologies.
There are a number of ways to add AJAX functionality to ASP.NET\n!!MicrosoftAJAXLibrary for ASP.NET\nOf course Microsoft offers their own library, formerly called ATLAS.\n!!West Wind Technologies\nRick Strahl offers these [[free tools|http://www.west-wind.com/tools/wwhoverpanel/]] to create hover panels and perform callbacks between Javascript and ASP.NET. The library can perform serialization of server side objects into JSON.\n!!Anthem.NET\n[[This library|http://anthemdotnet.com/default.aspx]] was created after AJAX.Net and provides more integration with server-side visual controls. An [[introductory article|http://www.codeproject.com/Ajax/AnthemNET.asp]] is also available.\n!!AJAX.Net\n[[This library|http://www.ajaxpro.info/default.aspx]] works for ASP.NET 1.1 and provides the ability to serialize .NET objects into JSON and vice versa. It was one of the first for ASP.NET.\n\n
ASP.NET Stuff\n\nWe have links about [[Learning ASP.NET]] information about ASP.NET FrameWorks and even links on RegularExpressions and DotNetComponents
There are a number of ways to access the name of the current script, current server. Request.ApplicationPath is commonly use. Here is a [[Making sense of ASP.Net Paths|http://west-wind.com/weblog/posts/269.aspx]] has lots more info.
There are a number of ways in which ASP.NET 2.0 applications can be deployed. [[This article|http://www.code-magazine.com/Article.aspx?quickid=060013]] by Rick Strahl discusses some of the differences. He has also written a [[GUI tool|http://www.west-wind.com/tools/aspnetcompiler.asp]] to aid in trying out some of the different deployment options.\n\n!Web Deployment Projects\nMicrosoft has come up with an additional too, [[Web Deployment Projects|http://msdn2.microsoft.com/en-us/asp.net/aa336619.aspx]], to address some of the issues mentioned above. It can create a single assembly for the project and retain consistent names for each of the assemblies.\n
You can build .NET 1.1 apps under VS.NET 2005 by using [[MSBEE|http://msdn.microsoft.com/vstudio/downloads/tools/msbee/default.aspx]].\n
Scott Mitchell has written some excellent [[data access tutorials|http://www.asp.net/learn/dataaccess/default.aspx?tabid=63]]\n
!~SubSonic\nA RubyOnRails like framework for ASP.NET 2.0. The [[code|http://www.codeplex.com/Wiki/View.aspx?ProjectName=actionpack]] and [[user forums|http://actionpack.wekeroad.com/]] are on 2 different sites.\n\n!~NHibernate\n[[NHibernate|http://www.hibernate.org]] is based on the Java Hibernate project. It is used for ORM (Object Relational Mapping).\n\n!The case against ORM\nThis blog post [[discusses|http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx]] some of the reasons why ORM might not be a good thing. Considering it to be the Vietnam of Computer Science is probably an overstatement though.
[[Welcome]]\n
Lots of free components are available.\n\n!ASP.NET Components\n*Rick Strahl has many free components including a tab strip control on [[his tools page|http://west-wind.com/DotNetTools.asp]]. There are also components to wrap the HTTP client, provide runtime hosting of ASP.NET in a windows app, and emit code dynamically at runtime.\n
Editing [[help|http://www.blogjones.com/TiddlyWikiTutorial.html#EasyToEdit]]
Here are some notes from [[Rob Connery's blog|http://www.wekeroad.com/blogs/PermaLink,guid,524336d3-dc3f-4c96-bb94-c8779345b3aa.aspx]]\n\nI recently started to use FCKEditor and it's the Dog's Bollocks I must say. The editor is peaches but the additional file manager is rockin! Solves a lot of issues for sure. I would say this thing is head and shoulders better than FreeTextBox (which is still having issues with IE7) and TinyMCE (can't handle code and HTML).\n\nBut as with all things, there are some hurdles to making this thing work. It took me a bit of doing to get it rolling, but here's what you need to do:\n\n 1. Download the FCKEditor, unzip, and store somewhere on your drive.\n 2. Download the FCKEditor ASP.NET Custom Control.\n 3. Add the entire FCKEditor folder to your web app, and reference the FCKEditor dll.\n 4. Create a folder in your web app where you want the uploaded resources and images to go. By default, this is "UserFiles" and is hard-referenced to the root: "/UserFIles/". You can set this in the web.config to be whatever you want:<add key="FCKeditor:UserFilesPath" value="MyFolder" />\n 5. Notice that there's no "~" denoting the app root - this reference is passed literally to all the FCK scripters and utilities so this reference should be either root-relative or absolute. IF YOU CHOOSE ABSOLUTE - the editor will look to your Web Site's root first, then look for a folder within that root; it does NOT honor virtual directories. So, if you set your user file path to "/MySite/MyFiles/" FCK Editor will look to "Inetpub/wwwroot/MySite/MyFiles". So your choice is to live with this, or rearrange your web app to fit. Also, make sure ASPNET has write privvies to this folder.\n 6. Open up the FCKEditor folder in your web app, and then open up fckconfig.js. In here are some basic config settings for your editor. Make sure to scroll down to line 142/143 and set the FileBrowser/QuickUpload to "aspx".\n 7. Next, open up FCKEditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx (that's a long way down!) and add "<head runat="server"></head>" to line 2. This will allow the file manager to run on your ASP.NET 2.0 sites.\n 8. Do the same for FCKEditor/editor/filemanager/upload/aspx/upload.aspx\n\nTo use the editor on a page, put this reference at the top:\n\n<%@ Register TagPrefix="FCKeditorV2" Namespace="FredCK.FCKeditorV2"\nAssembly="FredCK.FCKeditorV2" %>\n\nTo use the control, pop this out on your page:\n\n<FCKeditorV2:FCKeditor id="Body" BasePath="~/FCKeditor/" runat="server" Height="500" Width="700"/>\n\nNotice that the BasePath is wired to look for the FCKEditor folder in the root. You can change this but I've had issues with that so your best bet is to leave like this.\n\nHappy editing! \n\n
Rick Strahl has a good blog post on using GZipStream in combination with Response.Filter to zip HTML content on the fly. The article can be found on [[Rick Strahl's blog|http://west-wind.com/weblog/posts/10564.aspx]]\n
!Bound Fields\nThis [[post|http://west-wind.com/weblog/posts/8524.aspx]] provides insight on how to properly get custom date formats to appear with bound controls. There is a trick involving the specification of HtmlEncode="false" as an attribute for the bound field.
.NET has a WebClient object that lets you send GET or POST requests to another machine. You can use the WebClient object to do this, but it won't work if you need to POST both form values and a file upload in the same request. You can do this with the HTTPRequest object however it's a bit tedious to work with because it's a fairly low-level object. A solution was written by Rick Strahl in his [[Retrieving HTTP content in .NET|http://www.west-wind.com/presentations/dotnetWebRequest/dotnetWebRequest.htm]] article. Some enhancements are [[at this URL|http://distribucon.com/blog/archive/2006/05/30/989.aspx]]\n\n
ASP.NET provides the ability to write custom HTTP Handlers and HTTP Modules. Both can be used to perform things like URL rewriting.\n\n!URL Rewriting in ASP.NET\nScott Mitchell has a good article on [[MSDN|http://msdn2.microsoft.com/en-us/library/ms972974.aspx]] on how to perform URL rewriting in ASP.NET 1.1 and 2.0. This technique is similar to using MOD_REWRITE in Apache.\n
!Official Microsoft Links\nOfficial site for [[ASP.NET learning|http://www.asp.net/learn]]. Many [[videos|http://www.asp.net/learn/videos/default.aspx?tabid=63]] are also available. You can also watch [[webcasts|http://www.asp.net/learn/videos/webcasts.aspx?tabid=63]]
.NET provides localization support through resource files. These can be tricky to us when trying to access them in HTML markup. [[Rick Strahl's blog|http://west-wind.com/weblog/posts/8524.aspx]] post provides some code to make this easier.\n\n
[[Welcome]]\n[[XML]]\n[[ASP.NET]]\nAJAXSolutions\n[[Build Process]]\n[[Test Tools]]\n[[Easy Edit|http://www.blogjones.com/TiddlyWikiTutorial.html#EasyToEdit]]
The Microsoft AJAX library (formerly ATLAS) allows you to write AJAX application without having to produce much in the way of Javascript. \n\n!Update Panel Techniques\nThis is for techniques involving the update panel\n!Client Side Javascript techniques\nHowever sometimes you want to write client side code that invokes a server component to return data. [[This article by Scott Gu|http://weblogs.asp.net/scottgu/archive/2006/10/22/Tip_2F00_Trick_3A00_-Cool-UI-Templating-Technique-to-use-with-ASP.NET-AJAX-for-non_2D00_UpdatePanel-scenarios.aspx]] shows how to build a pretty cool templating solution on the server to allow a web service to retrieve data, format it as HTML and return it to the client for insertion into a web page via Javascript.\n
!Regulazy and Regulator\nWritten by Roy Osherove both of these tools can be downloaded from [[Roy's tools site.|http://tools.osherove.com/]]\n\n!Expresso\nAnother good tool for developing regular expressions is [[Expresso|http://www.ultrapico.com/Expresso.htm]]\n
!!Cookieless Sessions\nThis [[MSDN article|http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/cookieless.asp]] provides good background on how cookieless sessions work. The main problem with them is that the session ID travels in the clear as part of the URL and therefore other people can hijack your session by intercepting the URL. Another issue is that ASP.NET does not automatically rewrite absolute URL references. You can force them to be re-written with Response.ApplyAppPathModifier();\n!!Profiles\nASP.NET 2.0 offers another way to do session management via the use of a profile provider. By default only a SQL Server profile provider is included. However the [[Microsoft .NET Pet Shop 4.0|http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp]] runs on the Oracle platform and a partial implementation has been provided for Oracle. This [[article|http://aspalliance.com/739]] provides further info. on writing custom providers. There is also more info in Chapter 4 of Fritz Onion's [[Essential ASP.NET 2.0 book|\n\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'MMM DD YYYY'>><<saveChanges>><<upload>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
a tiddlywiki of .NET related information
Microsoft .NET Info
/***\n!Colors Used\n*@@bgcolor(#8cf): #8cf - Background blue@@\n*@@bgcolor(#18f): #18f - Top blue@@\n*@@bgcolor(#04b): #04b - Mid blue@@\n*@@bgcolor(#014):color(#fff): #014 - Bottom blue@@\n*@@bgcolor(#ffc): #ffc - Bright yellow@@\n*@@bgcolor(#fe8): #fe8 - Highlight yellow@@\n*@@bgcolor(#db4): #db4 - Background yellow@@\n*@@bgcolor(#841): #841 - Border yellow@@\n*@@bgcolor(#703):color(#fff): #703 - Title red@@\n*@@bgcolor(#866): #866 - Subtitle grey@@\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n background: #fff;\n color: #000;\n}\n\na{\n color: #04b;\n}\n\na:hover{\n background: #04b;\n color: #fff;\n}\n\na img{\n border: 0;\n}\n\nh1,h2,h3,h4,h5 {\n color: #703;\n background: #fff;\n}\n\n.button {\n color: #014;\n border: 1px solid #fff;\n}\n\n.button:hover {\n color: #014;\n background: #fe8;\n border-color: #db4;\n}\n\n.button:active {\n color: #fff;\n background: #db4;\n border: 1px solid #841;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n.header {\n background: #fff;\n}\n\n.headerShadow {\n color: #000;\n}\n\n.headerShadow a {\n font-weight: normal;\n color: #000;\n}\n\n.headerForeground {\n color: #fff;\n}\n\n.headerForeground a {\n font-weight: normal;\n color: #8cf;\n}\n\n/*}}}*/\n/***\n!General tabs /%=================================================%/\n***/\n/*{{{*/\n\n.tabSelected{\n color: #014;\n background: #eee;\n border-left: 1px solid #ccc;\n border-top: 1px solid #ccc;\n border-right: 1px solid #ccc;\n}\n\n.tabUnselected {\n color: #fff;\n background: #999;\n}\n\n.tabContents {\n color: #014;\n background: #eee;\n border: 1px solid #ccc;\n}\n\n.tabContents .button {\n border: 0;}\n\n/*}}}*/\n/***\n!Sidebar options /%=================================================%/\n~TiddlyLinks and buttons are treated identically in the sidebar and slider panel\n***/\n/*{{{*/\n#sidebar {\n}\n\n#sidebarOptions input {\n border: 1px solid #04b;\n}\n\n#sidebarOptions .sliderPanel {\n background: #8cf;\n}\n\n#sidebarOptions .sliderPanel a {\n border: none;\n color: #04b;\n}\n\n#sidebarOptions .sliderPanel a:hover {\n color: #fff;\n background: #04b;\n}\n\n#sidebarOptions .sliderPanel a:active {\n color: #04b;\n background: #fff;\n}\n/*}}}*/\n/***\n!Message Area /%=================================================%/\n***/\n/*{{{*/\n#messageArea {\n border: 1px solid #841;\n background: #db4;\n color: #014;\n}\n\n#messageArea .button {\n padding: 0.2em 0.2em 0.2em 0.2em;\n color: #014;\n background: #fff;\n}\n\n/*}}}*/\n/***\n!Popup /%=================================================%/\n***/\n/*{{{*/\n.popup {\n background: #18f;\n border: 1px solid #04b;\n}\n\n.popup hr {\n color: #014;\n background: #014;\n border-bottom: 1px;\n}\n\n.popup li.disabled {\n color: #04b;\n}\n\n.popup li a, .popup li a:visited {\n color: #eee;\n border: none;\n}\n\n.popup li a:hover {\n background: #014;\n color: #fff;\n border: none;\n}\n/*}}}*/\n/***\n!Tiddler Display /%=================================================%/\n***/\n/*{{{*/\n.tiddler .defaultCommand {\n font-weight: bold;\n}\n\n.shadow .title {\n color: #866;\n}\n\n.title {\n color: #18f; font-weight:bold;\n}\n\n.subtitle {\n color: #866;\n}\n\n.toolbar {\n color: #04b;\n}\n\n.tagging, .tagged {\n border: 1px solid #eee;\n background-color: #eee;\n}\n\n.selected .tagging, .selected .tagged {\n background-color: #ddd;\n border: 1px solid #bbb;\n}\n\n.tagging .listTitle, .tagged .listTitle {\n color: #014;\n}\n\n.tagging .button, .tagged .button {\n border: none;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selected .footer {\n color: #888;\n}\n\n.sparkline {\n background: #8cf;\n border: 0;\n}\n\n.sparktick {\n background: #014;\n}\n\n.errorButton {\n color: #ff0;\n background: #f00;\n}\n\n.cascade {\n background: #eef;\n color: #aac;\n border: 1px solid #aac;\n}\n\n.imageLink, #displayArea .imageLink {\n background: transparent;\n}\n\n/*}}}*/\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n\n.viewer .listTitle {list-style-type: none; margin-left: -2em;}\n\n.viewer .button {\n border: 1px solid #db4;\n}\n\n.viewer blockquote {\n border-left: 3px solid #666;\n}\n\n.viewer table {\n border: 2px solid #333;\n}\n\n.viewer th, thead td {\n background: #db4;\n border: 1px solid #666;\n color: #fff;\n}\n\n.viewer td, .viewer tr {\n border: 1px solid #666;\n}\n\n.viewer pre {\n border: 1px solid #fe8;\n background: #ffc;\n}\n\n.viewer code {\n color: #703;\n}\n\n.viewer hr {\n border: 0;\n border-top: dashed 1px #666;\n color: #666;\n}\n\n.highlight, .marked {\n background: #fe8;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor input {\n border: 1px solid #04b;\n}\n\n.editor textarea {\n border: 1px solid #04b;\n width: 100%;\n}\n\n.editorFooter {\n color: #aaa;\n}\n\n/*}}}*/
/***\n!Sections in this Tiddler:\n*Generic rules\n**Links styles\n**Link Exceptions\n*Header\n*Main menu\n*Sidebar\n**Sidebar options\n**Sidebar tabs\n*Message area\n*Popup\n*Tabs\n*Tiddler display\n**Viewer\n**Editor\n*Misc. rules\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n position: relative;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: -0.1em;\n margin-bottom: 0px;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\nul { padding: 0; margin:0}\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n/*}}}*/\n/***\n''General Link Styles'' /%-----------------------------------------------------------------------------%/\n***/\n/*{{{*/\n.externalLink {\n text-decoration: underline;\n}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n/*}}}*/\n/***\n''Exceptions to common link styles'' /%------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 1em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 1em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n/*}}}*/\n/***\n!Main menu /%==================================================%/\n***/\n/*{{{*/\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n/*}}}*/\n/***\n!Sidebar rules /%==================================================%/\n***/\n/*{{{*/\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n/*}}}*/\n/***\n''Sidebar options'' /%----------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n/*}}}*/\n/***\n''Sidebar tabs'' /%-------------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n/*}}}*/\n/***\n!Message area /%==================================================%/\n***/\n/*{{{*/\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n/*}}}*/\n/***\n!Popup /%==================================================%/\n***/\n/*{{{*/\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n/*}}}*/\n/***\n!Tabs /%==================================================%/\n***/\n/*{{{*/\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n/*}}}*/\n/***\n!Tiddler display rules /%==================================================%/\n***/\n/*{{{*/\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 2.0em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n/* I'm not a fan of how button looks in tiddlers... */\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n/*}}}*/\n/***\n!Misc rules /%==================================================%/\n***/\n/*{{{*/\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
For testing web sites in Javascript use [[Selenium|http://www.openqa.org/selenium]].\n
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 24/9/2006 0:54:4 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 25/9/2006 11:43:31 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 25/9/2006 11:47:0 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 25/9/2006 11:49:16 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 25/9/2006 11:51:20 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 26/9/2006 10:1:22 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 26/9/2006 11:44:32 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 2/10/2006 17:48:47 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 13/10/2006 12:1:44 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 13/10/2006 12:6:34 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 14/10/2006 18:53:36 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 14/10/2006 22:15:1 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 15/10/2006 23:51:43 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 16/10/2006 9:33:58 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 16/10/2006 9:36:50 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 16/10/2006 14:1:39 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | |\n| 16/10/2006 14:2:39 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 16/10/2006 21:2:23 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 16/10/2006 21:8:11 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 22/10/2006 21:5:14 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 22/10/2006 21:6:42 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 22/10/2006 22:23:11 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 27/10/2006 13:11:5 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 27/10/2006 13:24:15 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 27/10/2006 13:25:1 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 27/10/2006 13:26:53 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 31/10/2006 0:33:56 | Pete | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 1/11/2006 11:11:54 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 1/11/2006 13:12:41 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 1/11/2006 16:55:31 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 2/11/2006 16:26:38 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 2/11/2006 16:27:14 | YourName | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup | Ok |\n| 2/11/2006 16:30:51 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 6/11/2006 15:28:45 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 8/11/2006 10:20:0 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 8/11/2006 10:24:15 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 8/11/2006 10:26:13 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 15/12/2006 15:48:35 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |\n| 7/2/2007 13:53:40 | PeteTraeg | [[dot-net.html|http://s87575986.onlinehome.us/tw/dot-net.html]] | [[store.php|http://s87575986.onlinehome.us/tw/store.php]] | | dot-net.html | backup |
!Options used by UploadPlugin\nUsername: <<option txtUploadUserName>>\nPassword: <<option pasUploadPassword>>\n\nUrl of the UploadService script^^(1)^^: <<option txtUploadStoreUrl 50>>\nRelative Directory where to store the file^^(2)^^: <<option txtUploadDir 50>>\nFilename of the uploaded file^^(3)^^: <<option txtUploadFilename 40>>\nDirectory to backup file on webserver^^(4)^^: <<option txtUploadBackupDir>>\n\n^^(1)^^Mandatory either in UploadOptions or in macro parameter\n^^(2)^^If empty stores in the script directory\n^^(3)^^If empty takes the actual filename\n^^(4)^^If empty existing file with same name on webserver will be overwritten\n\n<<upload>> with these options.\n\n!Upload Macro parameters\n{{{\n<<upload [storeUrl [toFilename [backupDir [uploadDir [username]]]]]>>\n Optional positional parameters can be passed to overwrite \n UploadOptions. \n}}}\n\n
/***\n|''Name:''|UploadPlugin|\n|''Description:''|To save to web a TiddlyWiki|\n|''Version:''|3.4.1|\n|''Date:''|Aug 19, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 1, \n date: new Date(2006,7,19),\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n var size = 15;\n if (params[1])\n size = params[1];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.dirname(storeUrl)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) {}\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir;\n // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n try {\n request.open("POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n try {\n request.open("GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\sn"; \n\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n
Here are my links / notes for .NET\n\nTest
This is the programatic interface to Avalon - the new UI in Windows Vista. \n*A WPF [[overview|http://www.ftponline.com/channels/net/reports/tech-ed/2006/bholliswpf]]\n\n
WWF - Window Workflow Foundation\n\nAn [[overview|http://www.ftponline.com/special/esb2/pvarholwwf/]] of WWF.\n\nA book is available on WWF. A [[sample chapter|http://www.ftponline.com/books/chapters/default.asp?isbn=0321399838]] is available on managing transactions with WWF.
Stuff for XML - XML links will appear here. Another edit\nThis is in ''bold'' this is __underlined__ and this is plain\n\n[[Visit Kodak|http://www.kodak.com]]