<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnetslackers.com/Community/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SimoneB's Blog : Tools</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx</link><description>Tags: Tools</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 SP1 (Build: 30415.43)</generator><item><title>New SQLite provider for ELMAH</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2007/09/06/New-SQLite-provider-for-ELMAH.aspx</link><pubDate>Wed, 05 Sep 2007 22:05:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:1778</guid><dc:creator>simoneb</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=1778</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=1778</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2007/09/06/New-SQLite-provider-for-ELMAH.aspx#comments</comments><description>&lt;p&gt;I bet you know what ELMAH is, don&amp;#39;t you? ELMAH stands for Error Logging Modules and Handlers, and its main and only purpose is to log exceptions occurring in ASP.NET web applications, within which it integrates with just a couple of entries in the Web.config file. It&amp;#39;s got a lot of documentation and it&amp;#39;s open source, so for any additional information check out &lt;a href="http://code.google.com/p/elmah/"&gt;its website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Until yesterday it let you log exceptions in memory, on xml files and SQL Server, but a highly requested feature was to use &lt;a href="http://www.sqlite.org"&gt;SQLite&lt;/a&gt; as a backing store. Although I didn&amp;#39;t know SQLite much it has a cool &lt;a href="http://sourceforge.net/projects/sqlite-dotnet2/"&gt;.NET wrapper&lt;/a&gt; published on Sourceforge which exposes its features to the managed world, so I took on the &lt;a href="http://code.google.com/p/elmah/issues/detail?id=25"&gt;reported feature request&lt;/a&gt; and implemented it. SQLite doesn&amp;#39;t offer all of the features provided by SQL Server, but it&amp;#39;s almost completely SQL92 compliant so it has all that&amp;#39;s needed, and much more.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;So why to use SQLite instead of SQL Server or xml files? SQLite is a relational database engine, so it&amp;#39;s much faster than xml files, and compared with SQL Server at the moment our tests didn&amp;#39;t show any performance penalty; plus, it&amp;#39;s free! Paging through about 15.000 stored exceptions via ELMAH user interface resulted to be lightning fast!&lt;/p&gt;
&lt;p&gt;Since SQLite syntax isn&amp;#39;t widely documented, if anyone&amp;#39;s interested I will blog about it and the steps I went through to integrate it with ELMAH. Otherwise, the source code is available on &lt;a href="http://elmah.googlecode.com/svn/trunk/"&gt;ELMAH Subversion repository&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2007/09/06/New-SQLite-provider-for-ELMAH.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2007/09/06/New-SQLite-provider-for-ELMAH.aspx" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=1778" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>ASP.NET Ajax UpdatePanelNotifier Builtin Effects</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/11/20/ASP.NET-Ajax-UpdatePanelNotifier-Builtin-Effects.aspx</link><pubDate>Mon, 20 Nov 2006 02:50:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:787</guid><dc:creator>simoneb</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=787</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=787</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/11/20/ASP.NET-Ajax-UpdatePanelNotifier-Builtin-Effects.aspx#comments</comments><description>&lt;p&gt;Yesterday I wrote about a control I&amp;#39;ve written which lets you bind javascript functions to UpdatePanel&amp;#39;s partial postbacks. I&amp;#39;ve been working on it some more today and I enhanced it with some builtin effects which can be applied to the UpdatePanel which is refreshed using the combination effects of the script.aculo.us library. The behavior is similar to the UpdatePanelAnimation control extender which can be found in the AjaxControlToolkit but this is easier to use and more flexible in that only the UpdatePanel which is actually refreshed is applied the effect. Furthermore using the Animation framework available with the toolkit can be tricky.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The control API becomes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;OnBeginRequest and OnEndRequest properties: enum of type ClientAction&lt;/li&gt;&lt;li&gt;CustomBeginRequest and CustomEndRequest properties: string which accepts the name of a javascript function declared in the page&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The ClientAction enum defines the following values:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Custom&lt;/li&gt;&lt;li&gt;Appear&lt;/li&gt;&lt;li&gt;Fade&lt;/li&gt;&lt;li&gt;... [all the script.aculo.us combination effects]&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The behavior is as following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;When an effect is specified via the OnBeginRequest and OnEndRequest properties the corresponding effect is applied to the UpdatePanel which is being refreshed during the corresponding event&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When the value of one of those properties is set to Custom you can specify via the CustomBeginRequest and/or CustomEndRequest properties the name of a custom javascript function declared in your page which is called in response to the correspondng event (the function accepts as input parameter an DOM element which is the DIV element of the UpdatePanel as rendered in the browser).&lt;/li&gt;&lt;li&gt;If you don&amp;#39;t want to do anything just set OnxxxRequest to Custom and leave the corresponding CustomxxxRequest empty.&lt;/li&gt;&lt;/ul&gt;The source code is available on &lt;a href="http://sourceforge.net/svn/?group_id=159977"&gt;my main project&amp;#39;s svn repository&lt;/a&gt;.&lt;br /&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=787" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>ASP.NET Ajax UpdatePanelNotifier: get notified of partial updates</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/11/19/ASP.NET-Ajax-UpdatePanelNotifier_3A00_-get-notified-of-partial-updates.aspx</link><pubDate>Sun, 19 Nov 2006 00:26:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:779</guid><dc:creator>simoneb</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=779</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=779</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/11/19/ASP.NET-Ajax-UpdatePanelNotifier_3A00_-get-notified-of-partial-updates.aspx#comments</comments><description>&lt;p&gt;UPDATE: The control has been added new features, check it out &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/11/20/ASP.NET-Ajax-UpdatePanelNotifier-Builtin-Effects.aspx"&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Sometime ago &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/09/02/Getting-the-ID-of-the-UpdatePanel-which-triggered-an-asynchronous-postback.aspx"&gt;I wrote a post&lt;/a&gt; about how to get the ID of the UpdatePanel which triggered an asynchronous postback using the ATLAS July CTP and how to execute a custom Javascript function whenever the postback initiated and when it sent back its results. With the release of ASP.NET Ajax Extensions Beta the API has changed a lot and that code is no longer working, while he new API exposes now a whole new set of facilities which make it really easier to achieve the same functionality.&lt;/p&gt;

&lt;p&gt;I wrote the control I once called UpdateProgressSignup from scratch and changed its name to a more meaningful one: UpdatePanelNotifier. What this control does is very similar to the UpdateProgress standard control, in that it executes some client-side code whenever a partial update is triggered and when the results are returned from the server. The difference is that instead of executing a determined function (showing and hiding a &amp;lt;div&amp;gt; element by manipulating the DOM) you can bind your custom javascript functions to those events, which in turn receive as input parameter the concerned UpdatePanel DOM element so that you can directly act on it, making it blink when the beginRequest event is fired and then shake when the endRequestEvent is fired, for example.&lt;/p&gt;

&lt;p&gt;The control exposes the same properties as the standard UpdateProgress control beyond two new properties which let you enter the name of the functions you want to execute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OnBeginRequest&lt;/li&gt;

&lt;li&gt;OnEndRequest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each function executed in response to those events will be passed the DOM element of the UpdatePanel concerned in the partial update, so that if you set the OnBeginRequest property to &amp;quot;alertPanelId&amp;quot;, you&amp;#39;ll have to write a javascript function called &amp;quot;alertPanelId&amp;quot; in you page which will have the following signature and will eventually do something like this:&lt;/p&gt;


&lt;pre class="csharpcode"&gt;function alertPanelId(panelElement)&lt;br /&gt;{&lt;br /&gt;    alert(panelElement.id);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;
Note that the bound functions will be called only when the partial refresh is triggered by a control inside the UpdatePanel and not when it&amp;#39;s an external trigger doing it, since in this case it&amp;#39;s not yet possible to retrieve the Id(s) of the UpdatePanel(s) which will be refreshed in response to that action. Anyhow it seems that the ASP.NET Ajax Team is working on it and will eventually provide this facility in the final release.&lt;/p&gt;
&lt;p&gt;You can watch a short &lt;a href="http://busyboxdotnet.qsh.eu/ScreenCasts/UpdatePanelNotifier/UpdatePanelNotifier.html"&gt;screencast&lt;/a&gt; to get started fast. The source code is available on &lt;a href="http://sourceforge.net/svn/?group_id=159977"&gt;my main project&amp;#39;s svn repository&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/11/19/ASP.NET-Ajax-UpdatePanelNotifier_3A00_-get-notified-of-partial-updates.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/11/19/ASP.NET-Ajax-UpdatePanelNotifier_3A00_-get-notified-of-partial-updates.aspx" /&gt;&lt;/a&gt;

&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=779" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>ASP.NET Ajax EnhancedUpdateProgress - choose the position of your UpdateProgress!</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/11/14/ASP.NET-Ajax-EnhancedUpdateProgress-_2D00_-choose-the-position-of-your-UpdateProgress_2100_.aspx</link><pubDate>Tue, 14 Nov 2006 00:00:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:765</guid><dc:creator>simoneb</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=765</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=765</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/11/14/ASP.NET-Ajax-EnhancedUpdateProgress-_2D00_-choose-the-position-of-your-UpdateProgress_2100_.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been playing with the new bits of the ASP.NET Ajax framework lately; I like the enhancements pretty much, a much cleaner code and a very richer API to have fun with. &lt;/p&gt;
&lt;p&gt;Since with the Beta 2 the UpdateProgress control is bundled into the main assembly I chose to enhance it a bit so that I can choose where to show it in my page. I inherited from the UpdateProgress control and exposed an additional property called Position, which accepts the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Center (default)&lt;/li&gt;
&lt;li&gt;TopLeft&lt;/li&gt;
&lt;li&gt;TopRight&lt;/li&gt;
&lt;li&gt;BottomLeft&lt;/li&gt;
&lt;li&gt;BottomRight&lt;/li&gt;
&lt;li&gt;None (same position as in the standard UpdateProgress, that is, where placed in the page)&lt;/li&gt;
&lt;/ul&gt;
I&amp;#39;ve recorded a short &lt;a href="http://blip.tv/file/get/Simone_b-EhnacedUpdateProgress657.wmv"&gt;screencast&lt;/a&gt; to show how it works, and the source code is available on &lt;a href="http://sourceforge.net/svn/?group_id=159977"&gt;my main project&amp;#39;s svn repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/11/14/ASP.NET-Ajax-EnhancedUpdateProgress-_2D00_-choose-the-position-of-your-UpdateProgress_2100_.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/11/14/ASP.NET-Ajax-EnhancedUpdateProgress-_2D00_-choose-the-position-of-your-UpdateProgress_2100_.aspx" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=765" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>Getting the ID of the UpdatePanel which triggered an asynchronous postback</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/09/02/Getting-the-ID-of-the-UpdatePanel-which-triggered-an-asynchronous-postback.aspx</link><pubDate>Sat, 02 Sep 2006 18:44:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:481</guid><dc:creator>simoneb</dc:creator><slash:comments>16</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=481</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=481</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/09/02/Getting-the-ID-of-the-UpdatePanel-which-triggered-an-asynchronous-postback.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;UPDATE 19/11/2006: An updated version of the component compatible with ASP.NET Ajax Extensions Beta 2 has been released, details in &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/11/19/ASP.NET-Ajax-UpdatePanelNotifier_3A00_-get-notified-of-partial-updates.aspx"&gt;this post&lt;/a&gt;.&lt;/strong&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPDATE 11/11/2006: With the release of ASP.NET Ajax Extensions Beta this post is outdated, and the attached code is no longer working. I&amp;#39;ll be posting a new version of the component soon.&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/04/144.aspx"&gt;Some time ago I wrote&lt;/a&gt; about a web control I created which let you bind two javascript functions to the postback and callback events of Atlas UpdatePanels, thus giving you the choice of executing custom code whenever any of the UpdatePanels of the page posted and called back. &lt;br /&gt;I called it &lt;span style="font-style:italic;"&gt;UpdateProgressSignup &lt;/span&gt;since its job is similar in some ways to the &lt;span style="font-style:italic;"&gt;UpdateProgress&lt;/span&gt; built-in control&amp;#39;s, in that it performs an action when the asynchronous request begins and another one when the response calls back.&lt;br /&gt;More precisely, the component in charge of raising these events in Atlas is the &lt;span style="font-style:italic;"&gt;Sys.WebForms.PageRequestManager&lt;/span&gt;, a client-side sealed singleton class which performs the asynchronous requests to the server and returns the results of the response (as well as much more).&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;How to intercept Atlas postbacks and callbacks&lt;/strong&gt;&lt;br /&gt;In the first implementation my control was based simply on two members exposed by the PageRequestManager class:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;propertyChanged &lt;/em&gt;event&lt;/li&gt;&lt;li&gt;&lt;em&gt;inPostBack &lt;/em&gt;boolean property&lt;/li&gt;&lt;/ul&gt;Thus, using an event handler to hookup the &lt;em&gt;propertyChanged &lt;/em&gt;event we got notified whenever the PageRequestManager performed an action:


&lt;pre class="csharpcode"&gt;Sys.WebForms.PageRequestManager.propertyChanged.add(onPropertyChanged);&lt;br /&gt;&lt;br /&gt;function onPropertyChanged(sender, args)&lt;br /&gt;{ &lt;br /&gt;   [...] &lt;br /&gt;}&lt;/pre&gt;

The args parameter which is passed to our event handler is an object containing, among others, the name of the property which has changed, and the one which concerns us is the &lt;em&gt;inPostBack&lt;/em&gt; property of the PageRequestManager class. &lt;br /&gt;If this is the property which has changed it means that either a postback has been initiated or a callback has been received.&lt;br /&gt;To identify in which of the two situations we find ourselves we need to retrieve the actual value of that property, and for this we use the sender parameter, which is actually the singleton instance of the PageRequestManager class. If this property is true, then we are in postback mode, otherwise we are in callback mode. The body of the above function thus becomes:


&lt;pre class="csharpcode"&gt;function onPropertyChanged(sender, args)&lt;br /&gt;{&lt;br /&gt;    if(args.get_propertyName() == &amp;quot;inPostBack&amp;quot;) &lt;br /&gt;    {&lt;br /&gt;        if(sender.get_inPostBack()) &lt;br /&gt;        {&lt;br /&gt;            // postback mode&lt;br /&gt;        } &lt;br /&gt;        else &lt;br /&gt;        {&lt;br /&gt;            // callback mode&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

All I did in my control is to make this if/else statement call the javascript functions provided by the user via the control&amp;#39;s properties.&lt;br /&gt;Credits for (part of) this solution to the &lt;a href="http://forums.asp.net/thread/1263917.aspx"&gt;ASP.NET forums&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How to retrieve the ID of the UpdatePanel which triggered the postback&lt;/strong&gt;&lt;br /&gt;So far so good. Now, a potential problem is: &amp;quot;Ok, I know when any of the UpdatePanels of my page post and call back, but how do I know which one did that?&amp;quot;. That&amp;#39;s legitimate, but there&amp;#39;s no easy answer. The PageRequestManager keeps a list of the UpdatePanels which are on the page, as you can see from the xml-script generated whenever an Atlas ScriptManager control is on the page, which may look like the following fragment:


&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/xml-script&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;page xmlns:script=&lt;span class="str"&gt;&amp;quot;http://schemas.microsoft.com/xml-script/2005&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;components&amp;gt;&lt;br /&gt;    &amp;lt;pageRequestManager id=&lt;span class="str"&gt;&amp;quot;_PageRequestManager&amp;quot;&lt;/span&gt;&lt;br /&gt;                        updatePanelIDs=&lt;span class="str"&gt;&amp;quot;UpdatePanel1,UpdatePanel2&amp;quot;&lt;/span&gt;&lt;br /&gt;                        asyncPostbackControlIDs=&lt;span class="str"&gt;&amp;quot;Button3&amp;quot;&lt;/span&gt;&lt;br /&gt;                        scriptManagerID=&lt;span class="str"&gt;&amp;quot;ScriptManager1&amp;quot;&lt;/span&gt; &lt;br /&gt;                        form=&lt;span class="str"&gt;&amp;quot;form1&amp;quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;/components&amp;gt;&lt;br /&gt;&amp;lt;/page&amp;gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;There you can notice one more thing, the &lt;em&gt;asyncPostBackControlIDs &lt;/em&gt;attribute. This is the list of controls which work as triggers for the UpdatePanels of the page, and which are thereby placed outside of the UpdatePanels themselves. We&amp;#39;ll talk about this later, since it introduces some limits to what we are trying to achieve.&lt;br /&gt;Back to our reasoning, I was gonna tell you that the PageRequestManager object doesn&amp;#39;t expose the ID of the UpdatePanel which triggered the postback, so in the start I struggled about how the beneath mechanism got to know which was the UpdatePanel to be actually updated (let alone UpdatePanels whith mode=Always).&lt;br /&gt;Using some tracing tools (&lt;a href="http://www.joehewitt.com/software/firebug/"&gt;FireBug&lt;/a&gt; for Firefox and &lt;a href="https://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/a&gt;) I found out what an Atlas postback looks like when triggered by an UpdatePanel. As even children know already, it is a POST request performed exploiting an object called XMLHttpRequest, whose body look like this:


&lt;pre class="csharpcode"&gt;ScriptManager1=UpdatePanel1&amp;amp;__VIEWSTATE=[...]&amp;amp;__EVENTVALIDATION=[...]&amp;amp;Button1=Get%20Date!&lt;/pre&gt;

As you can see, and as I had imagined, the ID of the UpdatePanel which triggered the postback is actually sent to the server, along with the actual state of the controls in the panel itself; so I though there should be a way to retrieve the ID of that panel myself, thus being able to pass it to the two custom javascript function in order to give the developer more control and some more information about what was happening.&lt;br /&gt;So I started reading the very very long Atlas.js file, which contains all the required code needed to run Atlas, as well as the code of the PageRequestManager class.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;My reasoning was that since the PageRequestManager object doesn&amp;#39;t expose the ID of the UpdatePanel - while actually finding it out in order to supply it to the component which builds the request - there should at least be one way to reproduce the same steps that Atlas did to retrieve that coveted ID. And finally I got it!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;What the PageRequestManager does in order to retrieve it is - in brief - listening to clicks on the page&amp;#39;s form element, and then retrieving the element which was clicked.&lt;br /&gt;With that element, it then navigates backwars all the DOM tree until it finds and UpdatePanel (the PageRequestManager keeps a list of all UpdatePanels of the page, as said before) or doesn&amp;#39;t find any. After another bunch of checks, it is then able to know if that UpdatePanel needs to trigger the post back, and in this case, actually perform the task.&lt;br /&gt;As easy as this!&lt;br /&gt;&lt;br /&gt;Since the PageRequestManager object doesn&amp;#39;t expose such functionality to the public, the only way is to reproduce it, thus listening to the clicks on the form element, and then navigating backwards the parents of that element until we find an UpdatePanel using the array which the PageRequestManager supplies (if one is ever found). &lt;br /&gt;Omitting some minor details, the final step is then to pass the ID of that UpdatePanel to our two javascript functions as a parameter, so that whenever they are invoked we know exactly which UpdatePanel triggered the rountrip. The following functions do the lookup and retrieve that information:


&lt;pre class="csharpcode"&gt;for (var j = _updatePanelIDs.length - 1; j &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;= 0; j--) &lt;br /&gt;{&lt;br /&gt;    var updatePanel = document.getElementById(uniqueIDToClientID(_updatePanelIDs[j]));&lt;br /&gt;    &lt;br /&gt;    if (updatePanel &amp;amp;&amp;amp; updatePanel.contains(element)) {&lt;br /&gt;        return createPostbackSettings(true, uniqueIDToClientID(_updatePanelIDs[j]));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function createPostbackSettings(async, panelID) &lt;br /&gt;{&lt;br /&gt;    return  { async:async, panelID:panelID };&lt;br /&gt;}&lt;/pre&gt;

Using this new functionality I updated the code of the original control so that it supplies this information to the custom javascript functions. The dowload links are at the bottom of the post.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What if a trigger initiated the postback?&lt;/strong&gt;&lt;br /&gt;As you should know, there&amp;#39;s at least one more way an UpdatePanel can be updated, and it&amp;#39;s by using triggers, which are controls placed outside the UpdatePanel. When these controls fire events or change the values of their properties the UpdatePanel/s bound to them can be updated. Under the point of view of the need of retrieving the ID of the panel which triggered the postback this represents a major issue, since in this case the asynchronous request sent to the server takes this form:


&lt;pre class="csharpcode"&gt;ScriptManager1=ScriptManager1&amp;amp;__VIEWSTATE=[...]&amp;amp;__EVENTVALIDATION=[...]Button3=I%20am%20a%20trigger%20for%20UpdatePanel2&lt;/pre&gt;

As you can see there&amp;#39;s no trace of the UpdatePanel bound to the trigger, and it&amp;#39;s bad news since we are not able to retrieve its ID in this case. &lt;br /&gt;The PageRequestManager mechanism, in this case, returns as the panelID property the ID of the ScriptManager object of the page, which furthermore is not an DOM element of the page, unlike the UpdatePanels which are rendered as DIVs, so it&amp;#39;s completely useless.&lt;br /&gt;&lt;br /&gt;In this situation, that is, when it&amp;#39;s a trigger which performs the postback, we are still notified of the event, but we get no ID of any UpdatePanels, on which we could act since they are elements of the DOM, but instead the ID of the ScriptManager, which 99% is ScriptManager1 and most important not an element of the page. Thus, whatever action we want to perform on the parameter supplied to our javascript functions, we must first ensure if we are working on the ID of a page element or on a simple string, whch is the ID of nothing!&lt;br /&gt;&lt;br /&gt;Ok, now that I&amp;#39;ve explained what the underlying framework is doing, I will just teach you how to use the control.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How to use the UpdateProgressSignup control&lt;/strong&gt;&lt;br /&gt;First, the control comes in two flavours, just like Atlas does. A client -side control and a server-side one. It&amp;#39;s a matter of choice, but of course the server-side control is faster to set up. Here&amp;#39;s the procedure to set up the server-side control:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Write your javascript functions&lt;br /&gt;Remember what I told you before, the parameter passed to the functions is a string which can contain either the ID of the UpdatePanel in case the postback has been fired from inside the panel itself - which corresponds to the ID of the DIV element that the panel is rendered as - OR the ID of the ScriptManager, which doesn&amp;#39;t correspond to any element of the page. Thus, in order to distinguish the two situations, a simple check using the dollar function is needed. &lt;br /&gt;The code below shows a sample function I used in the demo supplied with the download, which uses &lt;a href="http://www.mochikit.com/"&gt;MochiKit&lt;/a&gt; to apply a nice effect to the UpdatePanel:


&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;   &lt;br /&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; shake(elementID)&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;($(elementID))&lt;br /&gt;        &lt;span class="rem"&gt;// UpdatePanel ID&lt;/span&gt;&lt;br /&gt;        MochiKit.Visual.shake($(elementID));&lt;br /&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// ScriptManager ID&lt;/span&gt;&lt;br /&gt;        alert(&lt;span class="str"&gt;&amp;quot;I am a ScriptManager with ID &amp;quot;&lt;/span&gt; + elementID);&lt;br /&gt;}  &lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;/li&gt;&lt;li&gt;Drag and drop the UpdateProgressSignup control from the toolbox or register it manually into the webform.&lt;/li&gt;&lt;li&gt;Set its two properties, OnPostback and OnCallback, to the name of the javascript functions you want the control to call on the respective events.&lt;/li&gt;&lt;/ol&gt;In case you want to use the client-side version of the control, there are the steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;As before, create your javascript functions.&lt;/li&gt;&lt;li&gt;Make the UpdateProgressSignup.js file available to the page by importing it. It must be placed below the Atlas scripts, so the optimal place to include it is the bottom of the page, between the closing form and body tags:


&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Scripts/UpdateProgressSignup.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/li&gt;&lt;li&gt;Create an instance of the control by calling the contructor and supplying some parameters. You can put this right below the previous script include. Note that for coherence the instance of the control is given that long name, but any other name goes:


&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    Sys.WebForms.UpdateProgressSignup = &lt;span class="kwrd"&gt;&lt;br /&gt;      new&lt;/span&gt; Sys.WebForms._UpdateProgressSignup({ postback: shake, callback: pulsate });&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/li&gt;&lt;/ol&gt;

That&amp;#39;s all, you&amp;#39;re ready to go.&lt;br /&gt;&lt;br /&gt;Just one final note and some Atlas background. Atlas can perform one request at a time, it won&amp;#39;t accept two simultaneous asynchronous request. So if one request is being processed, you cannot trigger another UpdatePanel postback even if you click on a button inside it. &lt;br /&gt;This brings to what I wanted to tell you. Downloading the code you may notice that there&amp;#39;s an additional boolean property called &lt;em&gt;Exclusive&lt;/em&gt; that can be used both in the client and server side implementations&lt;em&gt;&lt;/em&gt;. It is true by default and 99% of times you&amp;#39;ll leave it as is. It&amp;#39;s hard for me to explain what it does since my English is not so perfect, so I&amp;#39;ll give you an example, supposing that on postback we apply a shake effect and on callback a pulsating effect to the UpdatePanels. Ok, we have two UpdatePanels on the page which contain each a button, which in turn, on the server, sleep the thread for some seconds; you&amp;#39;ll understand why in a sec.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Exclusive = true (default)&lt;br /&gt;Click on button inside UpdatePanel1 -&amp;gt; UpdatePanel1 shakes.&lt;br /&gt;While the thread is sleeping on the server click button inside UpdatePanel2.&lt;br /&gt;When the thread wakes up, it returns the response and UpdatePanel1 pulses.&lt;/li&gt;&lt;li&gt;Exclusive = false&lt;br /&gt;Click on button inside UpdatePanel1 -&amp;gt; UpdatePanel1 shakes.&lt;br /&gt;While the thread is sleeping on the server click button inside UpdatePanel2.&lt;br /&gt;When the thread wakes up, it returns the response and this time is the UpdatePanel2 which pulses.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Notice that it&amp;#39;s always the UpdatePanel1 which gets the updated content, even in the second case. The only reason why in the second case it&amp;#39;s the UpdatePanel2 which pulses is because the UpdateProgressSignup control registered that when the request triggered by the UpdatePanel1 was executing, we tried triggering the UpdatePanel2 too, and lets us know it by pulsing it instead of the UpdatePanel1.&lt;br /&gt;I don&amp;#39;t know if this may become useful, but well, it wasn&amp;#39;t difficult to implement so I left it as a choice.&lt;br /&gt;&lt;br /&gt;The download links can be found on my website &lt;a href="http://busyboxdotnet.qsh.eu/Projects.aspx"&gt;at this page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/09/02/481.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/09/02/481.aspx" /&gt;&lt;/a&gt;

&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=481" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>Cascading autocomplete made easy</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/28/Cascading-autocomplete-made-easy.aspx</link><pubDate>Mon, 28 Aug 2006 00:20:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:460</guid><dc:creator>simoneb</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=460</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=460</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/28/Cascading-autocomplete-made-easy.aspx#comments</comments><description>Over the last few days the API of the &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/03/142.aspx"&gt;ScriptAculoUs.Net AutocompleteTextBox&lt;/a&gt; control has changed pretty much, since I&amp;#39;ve switched from a custom implementation based on reflection to the ASP.NET built-in callback mechanism.&lt;br /&gt;&lt;br /&gt;I chose to do the switch because the former implementation, despite being much more flexible, lacked in that it didn&amp;#39;t let you exploit the ASP.NET Page intrinsic objects like Session, ViewState, and web controls values inside the body of the method which supplied the suggestions, since that instance of the Page was instantiated via Reflection and didn&amp;#39;t run through the pipeline at all.&lt;br /&gt;&lt;br /&gt;Today I&amp;#39;m lazy about updating the original post - which has become a &amp;quot;patched post&amp;quot; - with the new details, and I chose instead to create a quick screencast to illustrate how easy and straightforward is to implement a cascading autocomplete pattern using the control.&lt;br /&gt;&lt;br /&gt;I haven&amp;#39;t released the binaries of the new version yet, because I want to do some more testing before, but the source can be found on the SVN repository by the &lt;a href="http://sourceforge.net/projects/busybox"&gt;project homepage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Take a look at the &lt;a href="http://busyboxdotnet.qsh.eu/ScreenCasts/CascadingAutocomplete/CascadingAutocomplete.html"&gt;screencast&lt;/a&gt;, and please forgive a little mistake I did. When I populate the Cars collection I check for IsPostBack, but it made much more sense if I simply checked for nullness.&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/28/460.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/28/460.aspx" /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=460" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>ImageReflection with the Atlas Control Toolkit</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/16/348.aspx</link><pubDate>Wed, 16 Aug 2006 16:01:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:348</guid><dc:creator>simoneb</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=348</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=348</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/16/348.aspx#comments</comments><description>A few days ago I &lt;a href="/community/blogs/simoneb/archive/2006/07/30/255.aspx"&gt;blogged&lt;/a&gt; about an ASP.NET control I wrote to apply a neat effect to the images of a web form. In the meanwhile I found &lt;a href="http://cow.neondragon.net/stuff/reflection/"&gt;another implementation&lt;/a&gt; of the same effect which is much lighter in the means of both kBytes and cpu work and does exactly the same, so I decided to write another control using this one instead of the &lt;a href="http://mir.aculo.us/articles/2006/04/27/like-reflections-try-the-reflector"&gt;script.aculo.us&lt;/a&gt; version. &lt;br&gt;&lt;br&gt;Even I still don't like the Atlas Control Toolkit that much (suffice to say that it doesn't run in medium trust), I chose to try writing this new control using the MS framework. What I like about it is the way it extends the design mode representation of other controls, so that you don't need to create one extender for each of the controls you want to extend, but simply place one extender on the page and then hookup its properties via the wannabe-extended control's properties pane.&lt;br&gt;&lt;br&gt;Let me tell you that writing an extender with the Atlas Control Toolkit isn't that easy in the starting - and mostly if you are just trying to port and existing script behavior - because you first have to know what the Atlas framework is going to do with your script, and I'm not sure I understand everything is going on behind the scenes yet. &lt;br&gt;That said, realizing the right way of doing it wasn't much difficult in this case and after some refactorings of the original script I came up with an extender called &lt;i&gt;ImageReflectionExtender&lt;/i&gt;, which is built with the latest Atlas and Atlas Control Toolkit releases.&lt;br&gt;&lt;br&gt;&lt;a href="http://busyboxdotnet.qsh.eu/Downloads/qa.ashx?ImageReflection.bin.zip"&gt;Binaries&lt;/a&gt;, &lt;a href="http://busyboxdotnet.qsh.eu/Downloads/qa.ashx?ImageReflection.src.zip"&gt;source&lt;/a&gt; and a &lt;a href="http://busyboxdotnet.qsh.eu/ScreenCasts/ImageReflection/ImageReflection.html"&gt;screencast&lt;/a&gt; are available.&lt;br&gt;&lt;br&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/16/348.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/16/348.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;

&lt;br&gt;&lt;br&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=348" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>LiteBox meets Flickr: LiteBoxFlickrAlbum</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/10/LiteBox-meets-Flickr_3A00_-LiteBoxFlickrAlbum.aspx</link><pubDate>Wed, 09 Aug 2006 23:17:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:315</guid><dc:creator>simoneb</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=315</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=315</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/10/LiteBox-meets-Flickr_3A00_-LiteBoxFlickrAlbum.aspx#comments</comments><description>Yesterday I got a link on my news aggregator pointing to a &lt;a href="http://msdn.microsoft.com/coding4fun/webcoder/flickr/default.aspx"&gt;new article&lt;/a&gt; by &lt;a href="http://flickrdotnet.wdevs.com/"&gt;Sam Judson&lt;/a&gt; on &lt;a href="http://msdn.microsoft.com/coding4fun/"&gt;Coding4Fun&lt;/a&gt;, which talks about a .NET version of the API for the &lt;a href="http://www.flickr.com/services/"&gt;Flickr services&lt;/a&gt;.&lt;br /&gt;A nice idea immediately came to my mind, why not extending the &lt;em&gt;&lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/04/278.aspx"&gt;LiteBoxAlbum&lt;/a&gt;&lt;/em&gt; control to display photos retrieved via Flickr? This way I can have a LiteBox-like photo album which displays photos got from Flickr without writing a single line of code and by setting only a couple of properties, in order to tell the control which photos to look for.&lt;br /&gt;&lt;br /&gt;So I wrote a new control derived from &lt;em&gt;LiteBoxAlbum &lt;/em&gt;and called &lt;em&gt;LiteBoxFlickrAlbum&lt;/em&gt;. They differ in that while the former displays photos placed in the same folder as the page in which the control is added, the other looks for photos on Flickr. It exposes some new properties which are pretty self-descriptive. The only thing to notice is that Flickr lets you use the service only via a Flickr API Key, which it uses for tracking purposes. You&amp;#39;ll need to get one in order to use the control, and you can do it at &lt;a href="http://www.flickr.com/services/"&gt;this url&lt;/a&gt;. Once you have one, you can take a look at the screencast I recorded.&lt;br /&gt;&lt;br /&gt;Watch the &lt;a href="http://busyboxdotnet.qsh.eu/ScreenCasts/LiteBoxFlickrAlbum/LiteBoxFlickrAlbum.html"&gt;screencast&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Source available on the &lt;a href="http://sourceforge.net/svn/?group_id=159977"&gt;SVN repository&lt;/a&gt; (quickstart &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/05/293.aspx"&gt;here&lt;/a&gt;) and binary available along with my &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/03/142.aspx"&gt;Script.Aculo.Us.Net library&lt;/a&gt; (bottom of the post).&lt;br /&gt;&lt;br /&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/10/315.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/10/315.aspx" /&gt;&lt;/a&gt;

&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=315" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>ScriptAculoUs.Net on Sourceforge Project Hosting</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/05/ScriptAculoUs.Net-on-Google-Project-Hosting.aspx</link><pubDate>Sat, 05 Aug 2006 16:55:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:293</guid><dc:creator>simoneb</dc:creator><slash:comments>29</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=293</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=293</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/05/ScriptAculoUs.Net-on-Google-Project-Hosting.aspx#comments</comments><description>&lt;p&gt;All my projects are grouped under one main repository located on &lt;a href="http://sourceforge.net"&gt;Sourceforge&lt;/a&gt;, together with my main project, &lt;a href="http://sourceforge.net/projects/busybox"&gt;BusyBoxDotNet&lt;/a&gt;. The source code can be accessed via Subversion.&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;&lt;/strike&gt; Here are the links:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Project homepage: &lt;a href="http://sourceforge.net/projects/busybox"&gt;http://sourceforge.net/projects/busybox&lt;/a&gt;&lt;a href="http://code.google.com/p/scriptaculousdotnet/"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SVN Trunk: &lt;a href="http://busybox.svn.sourceforge.net/svnroot/busybox/trunk"&gt;http://busybox.svn.sourceforge.net/svnroot/busybox/trunk&lt;/a&gt;&lt;a href="http://scriptaculousdotnet.googlecode.com/svn/trunk/"&gt;&lt;br /&gt;&lt;/a&gt; (to be used for browsing the repository with a browser or with a SVN client)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SVN client: On Windows I suggest &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;QuickStart Guide to SVN&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Getting (checking out) the source&lt;/u&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install &lt;a href="http://tortoisesvn.net/downloads"&gt;TortoiseSVN&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Create a new folder - preferably in the same directory where you keep your Visual Studio projects - called ScriptAculoUs.Net - or whathever&lt;/li&gt;&lt;li&gt;Right click on the folder just created&lt;/li&gt;&lt;li&gt;Click on &amp;quot;SVN Checkout&amp;quot;&lt;/li&gt;&lt;li&gt;Type &amp;quot;http://busybox.svn.sourceforge.net/svnroot/busybox/trunk&amp;quot; in the textbox &amp;quot;URL of repository&amp;quot;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click OK. You should have all the source ready to be compiled&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;u&gt;Staying up to date with code changes&lt;/u&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Right click on the folder where you checked the sources out&lt;/li&gt;&lt;li&gt;Click on &amp;quot;SVN Update&amp;quot;&lt;/li&gt;&lt;/ol&gt;&lt;u&gt;How do I submit a change I think you may find useful?&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;In version control jargon, this is called &lt;em&gt;submitting a patch&lt;/em&gt;, that is, a small file containing only the changes made to the original code, so that it becomes easy and fast for the project members to review, evaluate and test them, and eventually include them in the code base.&lt;br /&gt;&lt;br /&gt;These are the steps to create a patch using TortoiseSVN:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get the latest version of the source code - important in order not to make changes which may already have been done&lt;/li&gt;&lt;li&gt;Make your changes to the code&lt;/li&gt;&lt;li&gt;Right click on the folder where you checked out the source&lt;/li&gt;&lt;li&gt;On the TortoiseSVN context menu click on &amp;quot;Create Patch...&amp;quot;&lt;/li&gt;&lt;li&gt;Select the files where you have made changes and continue&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You are asked to save the file containing the patch, so save it and give it a meaningful name&lt;/li&gt;&lt;li&gt;Contact me and I&amp;#39;ll be glad to review your patch!&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://www.hanselman.com"&gt;Scott Hanselman&lt;/a&gt; furthermore wrote &lt;a href="http://www.hanselman.com/blog/ExampleHowToContributeAPatchToAnOpenSourceProjectLikeDasBlog.aspx"&gt;a more detailed post&lt;/a&gt; about creating a patches.&lt;br /&gt;&lt;br /&gt;If you&amp;#39;re interested in contributing the project or just give feedback or suggestions for future improvements you can even contact me via &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/contact.aspx"&gt;this link&lt;/a&gt;.&lt;br /&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=293" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/BusyBoxDotNet/default.aspx">BusyBoxDotNet</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Web+Design/default.aspx">Web Design</category></item><item><title>LiteBoxAlbum: Autogenerate LightBox-like photo albums</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/04/278.aspx</link><pubDate>Fri, 04 Aug 2006 13:28:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:278</guid><dc:creator>simoneb</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=278</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=278</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/04/278.aspx#comments</comments><description>UPDATE 10/08/06: A couple new features, read the bottom of the post for details.&lt;br&gt;&lt;br&gt;&lt;a href="/community/blogs/simoneb/archive/2006/08/04/276.aspx"&gt;Yesterday I posted&lt;/a&gt; about how I created a couple ASP.NET web controls to make it easy to generate a photo gallery using the &lt;a href="http://www.doknowevil.net/litebox/"&gt;LiteBox&lt;/a&gt; library. Ok now I have to make a confession, that was only a step to achieve something much more useful, an automated LighBox-like image slideshow!&lt;br&gt;&lt;br&gt;Some time ago I downloaded the very nice &lt;a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=1eceb66c-3bd0-4cdd-87d5-3fa0f4742032"&gt;PhotoHandler&lt;/a&gt; by &lt;a href="http://weblogs.asp.net/bleroy"&gt;Bertrand Le Roy&lt;/a&gt;, a control/handler which is very versatile and allows you to autogenerate image galleries on the fly, so I thought I would create something similar but instead using the functionality that LiteBox already gives us.&lt;br&gt;&lt;br&gt;The concept is simple. The control I created is called &lt;i&gt;LiteBoxAlbum&lt;/i&gt;, and when you drag it on a web form it automatically searches for images in the same folder of the page itself, and for each of them creates a &lt;i&gt;LiteBoxImageLink&lt;/i&gt; and renders it on the page in a hidden fashion, associating each link the same Group (so that you can navigate through them). When you run the page, it simulates a click of the mouse on the first link and starts the slideshow. Now you can navigate through all the images of the folder using the LiteBox interface. That's cool, isn't it? &lt;br&gt;I recorded a short screencast to show how to use it, even if it's very very simple. It required some black magic to start the slideshow automatically, since the Gecko DOM doesn't allow calling the click method on anchors, so I had to find a workaround which I'm reporting here in case you're interested in the trick:


&lt;pre class="csharpcode"&gt;function simulateClick(elementID) &lt;br&gt;{&lt;br&gt;    var el = $(elementID);&lt;br&gt;&lt;br&gt;    if(!document.all)&lt;br&gt;    {&lt;br&gt;        var evt = document.createEvent('MouseEvents');&lt;br&gt;        evt.initMouseEvent('click', true, true, window, 0, 0, &lt;br&gt;                           0, 0, 0, false, false, false, false, 0, null);&lt;br&gt;&lt;br&gt;        el.dispatchEvent(evt);&lt;br&gt;    }&lt;br&gt;    else&lt;br&gt;        el.click(); &lt;br&gt;}&lt;/pre&gt;

UPDATE 10/08/06: By the way, now you can also call the function which starts the album manually. A property called &lt;i&gt;ShowOnLoad&lt;/i&gt; lets you choose whether to show it automatically or not. To call the function manually the control exposes a property called &lt;i&gt;StartFunction &lt;/i&gt;which returns the Javascript statement to execute in order to start the album. This statement can be triggered, for instance, by an Html input button (the control which triggers it mustn't perform a postback or the album, of course, won't be shown).&lt;br&gt;Suppose you have placed an Html Input Button called &lt;i&gt;Button1&lt;/i&gt; on your webform, set its runat="server" attribute so that you can retrieve and assign its properties on the server-side.&lt;br&gt;On The Page_Load event handler you can write the following:


&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br&gt;{&lt;br&gt;    Button1.Attributes[&lt;span class="str"&gt;"onclick"&lt;/span&gt;] = LiteBoxAlbum1.StartFunction;&lt;br&gt;}&lt;/pre&gt;Now whenever the button is clicked the album is started.&lt;br&gt;&lt;br&gt;The screencast can be watched &lt;a href="http://busyboxdotnet.qsh.eu/ScreenCasts/LiteBoxAlbum/LiteBoxAlbum.html"&gt;here&lt;/a&gt;, while sources and binaries can be downloaded along with my &lt;a href="/community/blogs/simoneb/archive/2006/07/03/142.aspx"&gt;Script.Aculo.Us.Net&lt;/a&gt; bundle (bottom of the post).&lt;br&gt;&lt;br&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/04/278.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/04/278.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;

&lt;br&gt;&lt;br&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=278" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Web+Design/default.aspx">Web Design</category></item><item><title>LightBox with ASP.NET</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/04/LightBox-with-ASP.NET.aspx</link><pubDate>Fri, 04 Aug 2006 04:06:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:276</guid><dc:creator>simoneb</dc:creator><slash:comments>61</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=276</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=276</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/04/LightBox-with-ASP.NET.aspx#comments</comments><description>If you don&amp;#39;t know what LightBoxes are check out the list at &lt;a href="http://www.blinklist.com/tag/lightbox/"&gt;blinklist&lt;/a&gt;. Among them two implementantions caught my attention, the original &lt;a href="http://www.huddletogether.com/projects/lightbox2/"&gt;LightBox JS 2.0&lt;/a&gt; by Lokesh Dhakar and the lighter &lt;a href="http://www.doknowevil.net/litebox/"&gt;LiteBox&lt;/a&gt; by Tyler Mulligan.&lt;br /&gt;&lt;br /&gt;The final result is exactly the same, they are able to show images in a really nice fashion, as well as create a slideshow out of them. They differ in some aspects by the way:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LightBox JS is based on &lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt; and &lt;a href="http://prototype.conio.net/"&gt;prototype&lt;/a&gt; while LiteBox is based on &lt;a href="http://moofx.mad4milk.net/"&gt;moo.fx and prototype.lite&lt;/a&gt;, which are pratically a subset of the original libraries.&lt;/li&gt;&lt;li&gt;LightBox JS is heavy since its weight is about 100k, while LiteBox is much lighter, about 30k.&lt;/li&gt;&lt;/ul&gt;You might be wondering why the effect is exacly the same; well, script.aculo.us and prototype espose a great amount of functionality which LightBox JS doesn&amp;#39;t exploit, so there&amp;#39;s no need for such heavy libraries. That&amp;#39;s why I chose LiteBox for my own port to ASP.NET.&lt;br /&gt;&lt;br /&gt;Ok, so we want to get that effect with our images. In order to set LiteBox up you need to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;include the scripts into your page&lt;/li&gt;&lt;li&gt;import a stylesheet&lt;/li&gt;&lt;li&gt;make LiteBox images available in some folder of your website in order for it to be able to retrieve them (I mean the images which show up in the LiteBox to perform navigation and close the box)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;place your anchors pointing to your images on the page&lt;br /&gt;&lt;/li&gt;&lt;li&gt;set the &lt;em&gt;rel&lt;/em&gt; attribute of your anchor elements to &amp;quot;lightbox&amp;quot;&lt;/li&gt;&lt;li&gt;[optional] or set the &lt;em&gt;rel&lt;/em&gt; attribute to &amp;quot;lightbox[&lt;em&gt;group&lt;/em&gt;]&amp;quot; in order to group together a set of images so that you can surf through them&lt;/li&gt;&lt;li&gt;[optional] set the &lt;em&gt;title&lt;/em&gt; attribute of the anchors to show a caption for the image.&lt;/li&gt;&lt;/ul&gt;Ok, too much to do in my opinion. Not very reusable. Let alone that if you want to show thumbnails of the images you have to wrap your anchors around &lt;em&gt;img&lt;/em&gt; tags! (ASP.NET HyperLink controls instead expose a property called ImageUrl which does just the same, and it&amp;#39;s what I&amp;#39;ve used for my implementation).&lt;br /&gt;&lt;br /&gt;So here comes my wrapper. &lt;em&gt;Nothing to read here the control LiteBoxExtender is obsolete, read on.&lt;/em&gt; &lt;font color="#d3d3d3"&gt;I created a webcontrol called &lt;em&gt;LiteBoxExtender&lt;/em&gt; which includes the scripts and the stylesheet for you, and which will come even more useful later. This control is a non visual control, and works together with another control called &lt;em&gt;LiteBoxImageLink &lt;/em&gt;which is wired up automatically to the &lt;em&gt;LiteBoxExtender&lt;/em&gt; once dragged on the webform and which represents a link to an image.&lt;/font&gt; &lt;br /&gt;The &lt;em&gt;LiteBoxImageLink&lt;/em&gt; is derived from &lt;em&gt;HyperLink&lt;/em&gt; and behaves the same it does. It only exposes one more property called Group.&lt;br /&gt;So in order to set it up all you have to do is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Drag on the page as many &lt;em&gt;LiteBoxImageLinks&lt;/em&gt; as you want. Each one will represent an image which will show up in the LiteBox.&lt;/li&gt;&lt;li&gt;Set the properties of the &lt;em&gt;LiteBoxImageLink&lt;/em&gt; controls:&lt;/li&gt;&lt;/ol&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;NavigateUrl: the url of the image which will show up in the LiteBox&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[optional] Text: the text to show in the link to the image&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[optional] ImageUrl: the url of the preview image (to be used instead of Text)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;[optional] Group: a group name, in order to group images together and be able to surf through them.&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;p&gt;It&amp;#39;s that easy, no more scripts and styles to deal with, no images to copy in your website folders, and no manual editing of your anchors to wire up the LiteBox, the controls will do that by themselves. Of course it will work with normal HyperLink controls too as well as with anything that renders on the page as an html anchor tag, but in that case you&amp;#39;ll have to follow the manual procedure and set the &lt;em&gt;rel&lt;/em&gt; attributes yourself.&lt;br /&gt;&lt;br /&gt;The control is available inside my &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/03/142.aspx"&gt;Script.Aculo.Us.Net&lt;/a&gt; library. &lt;/p&gt;&lt;p&gt;UPDATE: sources are now only available via the SVN repository. Read &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/05/293.aspx"&gt;here&lt;/a&gt; for details. If you download the library you&amp;#39;ll find another control called &lt;em&gt;LiteBoxAlbum&lt;/em&gt;. I&amp;#39;m not talking about it here since it deserves another post, but it is much cooler than the controls I&amp;#39;ve described in this post, so you may want to check it out. One advice only, create a blank webform, drag a LiteBox album control in it and place some images (.jpg or .gif) in the same directory as the webform. Then just browse to the page and enjoy!&lt;br /&gt;UPDATE: The follow-up has been posted and is available &lt;a href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/04/278.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/04/276.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/04/276.aspx" /&gt;&lt;/a&gt;

&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=276" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Web+Design/default.aspx">Web Design</category></item><item><title>SweetTitles - fading tooltips (and my extender)</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/31/261.aspx</link><pubDate>Mon, 31 Jul 2006 01:12:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:261</guid><dc:creator>simoneb</dc:creator><slash:comments>20</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=261</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=261</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/31/261.aspx#comments</comments><description>&lt;a href="http://www.dustindiaz.com"&gt;Dustin Diaz&lt;/a&gt;, among other cool things, has written a nice Javascript library called &lt;a href="http://www.dustindiaz.com/sweet-titles"&gt;SweetTitles&lt;/a&gt; to convert hyperlink's Title attribute (Tooltip property in ASP.NET HyperLink web controls) - those yellow popups appearing when you hover the mouse over them - into nice fading boxes.&lt;br&gt;&lt;br&gt;The picture below shows the effect change when using it:&lt;br&gt;&lt;br&gt;

&lt;img src="http://busyboxdotnet.qsh.eu/images/sweettitles1.jpg"&gt;

&lt;br&gt;&lt;br&gt;You should know I'm becoming the wrapper man so I thought I would ease its integration with ASP.NET into a draggable web control - as well as enhance it a bit. The control I created is a simple extender control and all you have to do is drag it onto your webform to see everything happen magically. All the HyperLinks and &amp;lt;a&amp;gt; tags on your page receive that nice effect for free.


&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:hyperlink&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="HyperLink1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;navigateurl&lt;/span&gt;&lt;span class="kwrd"&gt;="~/SomePage.aspx"&lt;br&gt;&lt;/span&gt;&amp;nbsp;&lt;span class="attr"&gt;tooltip&lt;/span&gt;&lt;span class="kwrd"&gt;="I link to SomePage.aspx"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;SomePage&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:hyperlink&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt; &lt;span class="attr"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;="I link somewhere else"&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;="/SomeWhereElse"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;SomeWhereElse&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;


The control is called &lt;font face="Courier New"&gt;SweetTitlesExtender&lt;/font&gt;, has no runtime appearance and exposes a single enum property called &lt;font face="Courier New"&gt;EmbeddedStyleSheet&lt;/font&gt; with 5 values:&lt;br&gt;&lt;ul&gt;&lt;li&gt;None - no stylesheet will be embedded, you'll have to write your own&lt;br&gt;&lt;/li&gt;&lt;li&gt;Classic - the one shipped by Dustin Diaz with the library&lt;/li&gt;&lt;li&gt;Dustin - the one Dustin Diaz uses on his own website&lt;br&gt;&lt;/li&gt;&lt;li&gt;Blueish&lt;/li&gt;&lt;li&gt;Greenish&lt;/li&gt;&lt;li&gt;Reddish&lt;/li&gt;&lt;/ul&gt;That property allows to choose among some some stylesheets I have embedded into the assembly to provide some ready to use style options, which look like in the following picture (I'll let you guess which one corresponds to each enum value):&lt;br&gt;&lt;br&gt;

&lt;img src="http://busyboxdotnet.qsh.eu/images/sweettitles2.jpg"&gt;

&lt;br&gt;&lt;br&gt;In case you want to provide your own style, set the property to None and create a stylesheet with the following structure:


&lt;pre class="csharpcode"&gt;body div#toolTip { position:absolute;z-index:1000; [...] }&lt;br&gt;body div#toolTip p { [...] }&lt;br&gt;body div#toolTip p em { [...] }&lt;br&gt;body div#toolTip p em span { [...] }&lt;/pre&gt;


Since the original library is licensed under a &lt;a href="http://creativecommons.org/licenses/by-sa/2.5/"&gt;Creative Commons Attribution Share Alike (by-sa)&lt;/a&gt; license, my control is under the same license.&lt;br&gt;&lt;br&gt;&lt;a href="http://busyboxdotnet.qsh.eu/downloads/qa.ashx?SweetTitles.bin.zip"&gt;Binary&lt;/a&gt; and &lt;a href="http://busyboxdotnet.qsh.eu/downloads/qa.ashx?SweetTitles.src.zip"&gt;source&lt;/a&gt; available.&lt;br&gt;&lt;br&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/31/261.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/31/261.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;

&lt;br&gt;&lt;br&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=261" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Web+Design/default.aspx">Web Design</category></item><item><title>Reflection for images... not *that* Reflection!</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/30/255.aspx</link><pubDate>Sun, 30 Jul 2006 01:38:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:255</guid><dc:creator>simoneb</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=255</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=255</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/30/255.aspx#comments</comments><description>First just relax, I'm not talking about *that* &lt;span&gt;Reflection&lt;/span&gt;, instead about reflecting images.&lt;br&gt;Yes I said that. Thomas Fuchs, the inventor of &lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt;, whom you may have guessed I like pretty much, has an exciting post on his blog where he shows how he reflects images as if&amp;nbsp; they were in front of a mirror. You should definitely check it out &lt;a href="http://mir.aculo.us/stuff/reflector/reflector.html"&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;

&lt;img src="http://busyboxdotnet.qsh.eu/images/ninfeereflected.jpg"&gt;

&lt;br&gt;&lt;br&gt;He says it's not production code, in fact you will experience high load on the cpu and on the memory while the script is running (especially on IE), but the effect is incredibly nice.&lt;br&gt;&lt;br&gt;Of course I couldn't restrain myself from writing an extender control for ASP.NET which lets you apply that effect to classic &lt;font face="Courier New"&gt;Image&lt;/font&gt; controls. I've bundled it into my &lt;a href="/community/blogs/simoneb/archive/2006/07/03/142.aspx"&gt;Script.Aculo.Us.Net&lt;/a&gt; library, so that you can get the nice features all together. Oh, did you check out the new features? Now it can run side-by-side with Atlas...&lt;br&gt;&lt;br&gt;By the way, I've called this control &lt;font face="Courier New"&gt;ImageReflectorExtender&lt;/font&gt;, and it exposes three properties, which make using it a cakewalk.&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;font face="Courier New"&gt;Image&lt;/font&gt;: a reference to an ASP.NET Image control on the page&lt;/li&gt;&lt;li&gt;&lt;font face="Courier New"&gt;Amount&lt;/font&gt;: the size of the reflected area&lt;/li&gt;&lt;li&gt;&lt;font face="Courier New"&gt;Opacity&lt;/font&gt;: the opacity of the reflected area&lt;/li&gt;&lt;/ul&gt;My advice is not to increase too much the values of &lt;font face="Courier New"&gt;Opacity &lt;/font&gt;and &lt;font face="Courier New"&gt;Amount &lt;/font&gt;because they lead to cpu and memory load as well as not to place more than one reflected image on a page and not much big too, for the same reason.&lt;br&gt;&lt;br&gt;Download links can be found at the bottom of &lt;a href="/community/blogs/simoneb/archive/2006/07/03/142.aspx"&gt;this post&lt;/a&gt;, all the controls working with script.aculo.us are bundled in a single assembly.&lt;br&gt;&lt;br&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/30/255.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/30/255.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;

&lt;br&gt;&lt;br&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=255" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Web+Design/default.aspx">Web Design</category></item><item><title>Registering scripts into the page header with ASP.NET 2.0</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/29/Registering-scripts-into-the-page-header-with-ASP.NET-2.0.aspx</link><pubDate>Fri, 28 Jul 2006 19:09:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:247</guid><dc:creator>simoneb</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=247</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=247</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/29/Registering-scripts-into-the-page-header-with-ASP.NET-2.0.aspx#comments</comments><description>&lt;font color="#ff0000"&gt;UPDATE 19/08/2006&lt;/font&gt;: changed the API, no more public constructor but static property to access the instance of the &lt;em&gt;HeadScriptManager&lt;/em&gt;.&lt;br /&gt;UPDATE 03/08/2006: now the library allows to register stylesheets too. See class diagram below for details.&lt;br /&gt;&lt;br /&gt;ASP.NET 2.0 pages expose a new property called &lt;font face="Courier New"&gt;ClientScript &lt;/font&gt;of type &lt;font face="Courier New"&gt;ClientScriptManager&lt;/font&gt;, which allows to manage client-side scripts, usually Javascript but not just that. Its public methods allow to render scripts in different parts of the page, as well as to register some client-side events.&lt;br /&gt;In particular, scripts can be rendered just below the opening of the form tag or just before its closing, but it&amp;#39;s not directly possible to include scripts into the head tag. &lt;br /&gt;With ASP.NET 2.0 you may have noticed that web forms created with Visual Studio 2005 and family products automatically place the &lt;font face="Courier New"&gt;runat=&amp;quot;server&amp;quot;&lt;/font&gt; attribute in the head tag of each page. That&amp;#39;s why the Page class exposes a new property called Header, of type &lt;font face="Courier New"&gt;HtmlHead&lt;/font&gt;, which allows to interact with the page header and do something like including an external script:


&lt;pre class="csharpcode"&gt;HtmlGenericControl Include = &lt;span class="kwrd"&gt;new&lt;/span&gt; HtmlGenericControl(&lt;span class="str"&gt;&amp;quot;script&amp;quot;&lt;/span&gt;);&lt;br /&gt;Include.Attributes.Add(&lt;span class="str"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;);&lt;br /&gt;Include.Attributes.Add(&lt;span class="str"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;http://dev.virtualearth.net/mapcontrol/v3/mapcontrol.js&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Page.Header.Controls.Add(Include);&lt;/pre&gt;

or like injecting code manually:


&lt;pre class="csharpcode"&gt;HtmlGenericControl Include2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; HtmlGenericControl(&lt;span class="str"&gt;&amp;quot;script&amp;quot;&lt;/span&gt;);&lt;br /&gt;Include2.Attributes.Add(&lt;span class="str"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;);&lt;br /&gt;Include2.InnerHtml = &lt;span class="str"&gt;&amp;quot;alert(&amp;#39;JavaScript in Page Header&amp;#39;);&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Page.Header.Controls.Add(Include2);&lt;/pre&gt;

Looking at this &lt;a href="http://pietschsoft.com/Blog/Post.aspx?PostID=1304"&gt;post by Christopher Pietschmann&lt;/a&gt; (where I shamelessly got the above code) I had the idea of creating a library to extend the features of the &lt;font face="Courier New"&gt;ClientScriptManager &lt;/font&gt;class to the header of the page. Unluckily that class is sealed, it would have been nice to create a partial class to extend it... I always wonder why the guys at Microsoft don&amp;#39;t let us exploit the power of the framework exposing some more of their internal, private, and sealed stuff. However what I came up with - thanks to &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Reflector&lt;/a&gt; to keep the API close to that exposed by the framework as well as to save time - is a simple class which can be used in the same way, and lets you render script blocks, script includes and embedded resources in the page header. To be more user-friendly it keeps the member names of its &amp;quot;parent&amp;quot; class. Here is the diagram:&lt;br /&gt;&lt;br /&gt;

&lt;img src="http://busyboxdotnet.qsh.eu/images/headscriptmanager.jpg" /&gt;

&lt;br /&gt;&lt;br /&gt;UPDATE 03/08/2006: the class exposes a new set of methods with a similar signature which allow to inject stylesheets. The usage is the same, but they render the content inside &amp;lt;style&amp;gt; tags in case of embedded styles (&lt;font face="Courier New"&gt;RegisterHeadStyleBlock&lt;/font&gt;) or inside &amp;lt;link&amp;gt; tags in case of linked styles (&lt;font face="Courier New"&gt;RegisterHeadStyleInclude&lt;/font&gt; and &lt;font face="Courier New"&gt;RegisterHeadStyleResource&lt;/font&gt;). It comes useful mostly to control developers, so that you can inject embedded assembly resources.&lt;br /&gt;&lt;font color="#ff0000"&gt;UPDATE 19/08/2006&lt;/font&gt;: the API has changed and the constructor is not directly accessible. The instance of the &lt;em&gt;HeadScriptManager &lt;/em&gt;can be accessed using the &lt;em&gt;Current &lt;/em&gt;static property. The example below has been updated to reflect this change.&lt;br /&gt;&lt;br /&gt;Now it can be used referencing the assembly in the project, creating an instance and calling its methods:


&lt;pre class="csharpcode"&gt;HeadScriptManager manager = &lt;span class="kwrd"&gt;&lt;/span&gt;HeadScriptManager&lt;span class="kwrd"&gt;&lt;/span&gt;.Current;&lt;br /&gt;&lt;br /&gt;manager.RegisterHeadScriptBlock(&lt;span class="kwrd"&gt;this&lt;/span&gt;.GetType(), &lt;span class="str"&gt;&amp;quot;scriptKey&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;alert(&amp;#39;hello&amp;#39;);&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;Source and binaries are available along with my main project, &lt;a href="http://sourceforge.net/projects/busybox"&gt;BusyBoxDotNet&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/29/247.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/29/247.aspx" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=247" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item><item><title>Debugging tools and tips for ASP.NET applications</title><link>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/24/Debugging-tools-and-tips-for-ASP.NET-applications.aspx</link><pubDate>Mon, 24 Jul 2006 16:13:00 GMT</pubDate><guid isPermaLink="false">6afe0437-14b4-41d5-bc66-6d54a24dbd48:216</guid><dc:creator>simoneb</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/rsscomments.aspx?PostID=216</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetslackers.com/Community/blogs/simoneb/commentapi.aspx?PostID=216</wfw:comment><comments>http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/07/24/Debugging-tools-and-tips-for-ASP.NET-applications.aspx#comments</comments><description>When I develop ASP.NET applications or test my controls I make use of some tools which I thought would be useful listing, along with some tips.&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.pocketsoap.com/"&gt;PocketSOAP&lt;/a&gt; &lt;a href="http://www.pocketsoap.com/tcptrace/"&gt;TcpTrace&lt;/a&gt; and &lt;a href="http://www.pocketsoap.com/tcptrace/pt.aspx"&gt;ProxyTrace&lt;/a&gt; are very simple tools which let you see the traffic flowing between you and a server (a local server too) in a raw fashion. They're almost identical in that they show what's passing through them, but when ProxyTrace acts as a proxy server (you choose a port to listen on and configure your browser to point to it), TcpTrace lets you choose both the port to listen on and the destination server:port pair; then it will redirect all the traffic coming from localhost:SourcePort to DestinationServer:DestinationPort.&lt;br&gt;&lt;br&gt;I mostly use TcpTrace because it's faster to set up since you don't have to change the browser settings to make use of a proxy server. Suppose you are developing a web application with ASP.NET and want to see what's flowing between your browser and the ASP.NET Developement Server which comes with Visual Web Developer (asynchronous traffic too). As you know the VWD server starts on a dinamically chosen port, in order not to collide with other instances eventually running already. So you hold CTRL + F5 to start the all the stuff and you'll see that the browser points to &lt;font face="Courier New"&gt;http://localhost:SomePort/VirtualDirectory/PageName.aspx&lt;/font&gt; , where SomePort is the port it is listening on (in my case, at the moment, 3862). Now, in order to analyze the traffic, start TcpTrace and you are prompted to insert at least three parameters that you can set as follows:&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;Listen on Port #: set it to an arbitrary number, this is the port you will point to with your browser. For example, 8080, but anything goes.&lt;br&gt;
&lt;/li&gt;&lt;li&gt;Destination Server: set it to localhost.&lt;br&gt;
&lt;/li&gt;&lt;li&gt;Destination Port #: set it to the value SomePort we saw before. It is the port the VWD server is listening on, in my example, 3862.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;blockquote&gt;Click OK and you'll have TcpTrace listening on port 8080 and redirecting to port 3862 (and vice-versa). All that's left to do is set your browser to point to the new port, so you'll change only the port of the url from SomePort (3862) to 8080. Hit Enter and you'll be able to see all the Request/Response pairs in the TcpTrace GUI.&lt;br&gt;These are very simple tools, and will let you see only the raw data, but they are as simple as useful.&lt;br&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.fiddlertool.com/"&gt;Fiddler&lt;/a&gt; is a more advanced tool for debugging HTTP traffic. It acts in the same way as ProxyTrace does, except that when started it automatically configures Internet Explorer to make the traffic flow through the port it listens to (by default, 8888). In case you want to use it with another browser then you'll have to set its proxy settings to point to that port. Fiddler even installs itself as an IE plugin, so that you can start it directly from there.&lt;br&gt;Fiddler has many more features than the PocketSOAP suite, and the one I use most is its ability to show much more data about the Request/Response pair. In fact, it can show Request data as Headers, Text, Forms, Hex, Raw and Xml, and Response data as Headers, Text, Image, Hex, Caching, Privacy, Raw, Xml. It can even edit the response data, for example applying compression.&lt;br&gt;Another nice feature is the SyntaxView format, which is achieved installing a plugin which is available on its website and which shows Response data in the same fashion as you see it in the VWD editor. Very cool.&lt;br&gt;If you need advanced features Fiddler is absolutely the choice.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;amp;DisplayLang=en"&gt;Internet Explorer Developer Toolbar&lt;/a&gt; and &lt;a href="https://addons.mozilla.org/firefox/60/"&gt;Firefox Web Developer Toolbar&lt;/a&gt; are two toolbars with so many features that would take a book to describe them all. They are a must have for web developers. Among hundreds features, validation of markup, CSS, accesibility and so on as well as partial page source view (remember Ajax?). Just check them out and you'll see how useful they are.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.bayden.com/other/"&gt;TamperIE&lt;/a&gt; and &lt;a href="http://tamperdata.mozdev.org/"&gt;Tamped Data&lt;/a&gt; are two addins respectively for Internet Explorer and Firefox which allows editing the data submitted to the server either by GET or POST request. While GET requests can be easilly edited by hand since the name/value pairs are appended to the url, POST requests require such tools to be edited. Ok, maybe you thought you didn't need to validate POST data on the server because there was no way of tampering with it?...&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.blunck.info/iehttpheaders.html"&gt;ieHTTPHeaders&lt;/a&gt; is an Explorer Bar for Microsoft Internet Explorer that will display the HTTP Headers sent and received by Internet Explorer as you surf the web. It can be useful in debugging various web-development problems related to cookies, caching, etc.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.thundermain.com/FullSource.html"&gt;Full Source&lt;/a&gt; is an Internet Explorer menu extension which displays the source Internet Explorer is displaying, directly from the Internet Explorer object model. This is useful wherever javascript is dynamically writing HTML into the DOM, or where XSLT has been used to generate HTML.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; is a javascript code verifier. It's written by a JS guru, Douglas Crockford. When you write Javascript, you should use this online tool to verify its correctness. Besides checking the code for errors, it suggests best practices and common subtleties and supplies a lot other infos on the code.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://projects.nikhilk.net/Projects/WebDevHelper.aspx"&gt;Web Developement Helper&lt;/a&gt; by Nikhil Kotari is an Internet Explorer plugin that provides a set of useful tools to
both Ajax/JavaScript developers as well as ASP.NET page and control
developers.&lt;/li&gt;&lt;/ul&gt;Finally, just a couple of tips for debugging Javascript with VWD or Visual Studio 2005. When you start in debug mode (F5), you can see a window called Script Explorer (if not, you can show it up with Debug -&amp;gt; Windows -&amp;gt; Script Explorer). In that window you can see all the client-side code you can break into with breakpoints. As far as I've experimented it's a bit buggy, but sometimes it comes useful.&lt;br&gt;Another way of debugging Javascript is to write the keyword "debugger" in your script files. When you then enter the debug mode, the execution breaks exactly where you placed the keyword, so that you can debug your script starting from there.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/24/216.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/community/blogs/simoneb/archive/2006/07/24/216.aspx" border="0"&gt;&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;img src="http://dotnetslackers.com/Community/aggbug.aspx?PostID=216" width="1" height="1"&gt;</description><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://dotnetslackers.com/Community/blogs/simoneb/archive/tags/Tools/default.aspx">Tools</category></item></channel></rss>