<?xml version="1.0"?>
<rss version="2.0"><channel><title>Structured Solutions Blog</title><link>http://structured-solutions.net/Blog</link><description>We make software to help you build a better store.</description><copyright>2010 by Structured Solutions</copyright><generator>RSS Feed Generator by Structured Solutions</generator><managingEditor>support@structured-solutions.net</managingEditor><webMaster>support@structured-solutions.net</webMaster><lastBuildDate>Sat, 19 Mar 2011 17:57:00 GMT</lastBuildDate><image><url>http://structured-solutions.net/images/logo.gif</url><title>Structured Solutions</title><link>http://structured-solutions.net/blog</link></image><item><title>Shipper 3 Support</title><pubDate>Sat, 19 Mar 2011 17:57:00 GMT</pubDate><description>&lt;a href="http://www.web2market.com/Shipper3-C25.aspx" target="_self"&gt;Web 2 Market&lt;/a&gt; is now developing and supporting Shipper3.&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Shipper3Support</guid></item><item><title>Shipping Rate Rule Providers for BVC 5.7</title><pubDate>Sat, 22 May 2010 19:06:00 GMT</pubDate><description>&lt;p&gt;The &lt;a href="ProductInfo.aspx?productid=RULEPROV-BV5" target="_self"&gt;Shipping Rate Rule Providers for BVC5&lt;/a&gt; are now available for BVC 5.7. This is a free upgrade if you already have a license to Shipping Rate Rule Providers for BVC5.&lt;/p&gt;
&lt;p&gt;If you are upgrading from&amp;nbsp;a previous release*, just copy the new files over the old ones. You&amp;nbsp;existing rules will continue to work.&lt;/p&gt;
&lt;p&gt;&lt;a href="Downloads/" target="_self"&gt;download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;* Please see the &lt;a href="ShippingRateProvidersReleaseNotes" target="_self"&gt;Release Notes&lt;/a&gt; if you are upgrading from a very old release.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/RuleProvidersSP7</guid></item><item><title>Using Windows 7 for Development</title><pubDate>Sun, 04 Oct 2009 18:52:00 GMT</pubDate><description>&lt;p&gt;Upgraded dev machine from Vista Ultimate 74-bit to Windows 7 Ultimate 64-bit. So far, so good. Some notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio 2008 could not start Shipper 3 in a debugger. Had to register dte80.dll, dte80a.dll, dte90.dll, and dte90a.dll (search web for "regsvr32 dte80.dll" for details). 
&lt;li&gt;Visual Studio 2008 would not build deployment project (setup) until I registered mergemod.dll (search web for "regsvr32 mergemod.dll" for details). 
&lt;li&gt;Virtual PC 2007 is not supported. Had to convert all of my virtual machines to Windows Virtual PC. Not hard, but tedious. Uninstalled Virtual Machine Additions and installed Integration Features on each VM. Shutdown no longer asks if I want to merge undo disk. I miss that.
&lt;li&gt;IE8 would crash when I visited any of several different pages (techmeme, msdn, etc). I suspect something in the cache from Vista was causing the crash. After &lt;a href="http://support.microsoft.com/kb/923737" target="_self"&gt;resettings IE&lt;/a&gt; and restarting Windows, the crashes went away.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Now testing Shipper 3.5 on Windows XP SP3 (32-bit only), Vista (32-bit only), and Windows 7 (32-bit and 64-bit).&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Windows7Dev</guid></item><item><title>Shipper 3.5 Beta 2</title><pubDate>Sun, 04 Oct 2009 18:44:00 GMT</pubDate><description>&lt;p&gt;Shipper 3.5 beta refresh is now available. See original post for links,&lt;/p&gt;
&lt;p&gt;&lt;a href="ShipperProducts/Shipper3/Shipper35Beta" target="_self"&gt;Shipper 3.5 Beta&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Shipper35Beta2</guid></item><item><title>Shipping Rate Rule Providers for BVC 5.6</title><pubDate>Sat, 03 Oct 2009 00:55:00 GMT</pubDate><description>&lt;p&gt;Shipper Rate Rule Providers 2.9 are now available. This version is compatible with BVC 5.6 on either IIS6 or IIS7.&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads" target="_self"&gt;download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you purchased Shipping Rate Rule Providers before October 2009, you will need to download and install a fresh copy of your license file. Your old license file will not work with version 2.9.&lt;/p&gt;
&lt;p&gt;To download a fresh copy of your license file, open the original &lt;a href="YourAccount/" target="_self"&gt;online order details&lt;/a&gt; and click on the Download button.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingRateRuleProviders29</guid></item><item><title>Shipping Rate Rule Providers for BVC5 Service Pack 5</title><pubDate>Thu, 14 May 2009 22:45:00 GMT</pubDate><description>&lt;p&gt;The Shipping Rate Rule Providers for BVC5 Service Pack 4 are compatible with Service Pack 5. There are no special instructions for upgrading BVC5 related to the Shipping Rate Rule Providers.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/RuleProvidersForBVC55</guid></item><item><title>ShipRush 6.2.3226 Available for Download</title><pubDate>Fri, 08 May 2009 02:26:00 GMT</pubDate><description>&lt;p&gt;ShipRush 6.2.3226 is compatible with Shipper 3.3 and is now available for &lt;a href="downloads.aspx" target="_self"&gt;download&lt;/a&gt;.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShipRush623226</guid></item><item><title>Shipper 1 Enters Limited Maintenance Mode</title><pubDate>Tue, 23 Dec 2008 18:37:00 GMT</pubDate><description>&lt;p&gt;&lt;strong&gt;Update October 6, 2009&lt;/strong&gt;: &lt;/p&gt;
&lt;p&gt;Shipper 1 is no longer being updated or supported. For ongoing support, please upgrade to Shipper 3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Original post from December, 2008&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Now that &lt;a href="ShowCategory.aspx?CategoryID=4" target="_self"&gt;Shipper 3&lt;/a&gt; is available, Shipper 1 is in limited maintenance mode. Specifically,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can download the Shipper 1.4&amp;nbsp;and Shipper Service 1.4&amp;nbsp;installers from the &lt;a href="downloads.aspx" target="_self"&gt;downloads&lt;/a&gt; page if you need to re-install the software. 
&lt;li&gt;Your current&amp;nbsp;license files will continue to work. 
&lt;li&gt;New Shipper 1 and Shipper Service 1 licenses can&amp;nbsp;not be purchased. 
&lt;li&gt;Shipper 1 and Shipper Service 1 will no longer be updated. For example, if a carrier changes their software in a way that makes it incompatible with Shipper 1, Shipper 1 will not be updated to accomodate the carrier changes. Similarly, if your e-commerce vendor changes to their software that makes it incompatible with Shipper Service 1, Shipper Service 1 will not be updated to accomodate the e-commerce changes. 
&lt;li&gt;You will still receive free email support, but problems due to incompatibility&amp;nbsp;may no longer be resolvable. 
&lt;li&gt;You can still transfer your license to someone else, but we will insist on contacting the potential license owner to make sure they understand the current support status.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Shipper 1 will reach end-of-life on October 5, 2009. After that, you will no longer be able to download the software; and support will no longer be available.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Shipper1Support</guid></item><item><title>Google Base Feed Products Updated</title><pubDate>Thu, 13 Nov 2008 21:28:00 GMT</pubDate><description>&lt;p&gt;New versions of Froogle Feed for StoreFront 6 and Google Feed for StoreFront 7 are available to follow the new policy for double quotes in the body of the text.&lt;/p&gt;
&lt;p&gt;Froogle Feed for StoreFront 6 customers can download the new version from their online order details.&lt;/p&gt;
&lt;p&gt;Google Feed for StoreFront 7 customers can download the new version from the downloads page.&lt;/p&gt;
&lt;p&gt;These are free updates.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/GoogleBaseFeedProducts1108</guid></item><item><title>Shipping Rate Rule Providers Updated for BVC5 SP4</title><pubDate>Thu, 13 Nov 2008 20:08:00 GMT</pubDate><description>&lt;p&gt;Shipping Rate Rule Providers are now available for BV Commerce 5 SP4. Version 2.8 includes support for kits. This is a free update for current license holders.&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads/bvc5/RuleProvidersSP4.exe" target="_self"&gt;download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are updating BVC5 to SP4, you should follow these steps to update your Shipping Rate Rule Providers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Visit the BV Admin &amp;gt; Plug-ins page.&lt;/li&gt;
&lt;li&gt;Select the Shipping Rate Provider Suite plugin.&lt;/li&gt;
&lt;li&gt;Select Install or Remove shipping rate providers.&lt;/li&gt;
&lt;li&gt;Remove all of the old providers.&lt;/li&gt;
&lt;li&gt;Update BVC5 to SP4 and complete your update testing (note that none of the shipping methods using my Shipping Rate Rule Providers will work yet).&lt;/li&gt;
&lt;li&gt;Download and install version 2.8 of the Shipping Rate Rule Providers.&lt;/li&gt;
&lt;li&gt;Repeat steps 1-4, but install the new providers.&lt;/li&gt;
&lt;li&gt;Repeat your testing from step 5 and verify that the shipping methods now work.&lt;/li&gt;&lt;/ol&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/RuleProviders28</guid></item><item><title>Support for DHL Shipping Rate Rule Providers ends January 2009</title><pubDate>Tue, 11 Nov 2008 00:20:00 GMT</pubDate><description>&lt;p&gt;Because Deutsche Post has &lt;a href="http://www.dhl-usa.com/about/pr/PRDetail.asp?nav=PressRoom/PressReleases&amp;amp;year=2008&amp;amp;seq=1246" target="_self"&gt;decided &lt;/a&gt;to exit the domestic US market, support for the &lt;a href="ProductInfo.aspx?productid=DHLPROV-5" target="_self"&gt;DHL Shipping Rate Rule Providers&lt;/a&gt; will end January 31, 2009.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/DomesticDHLRateProviderSupportEnds</guid></item><item><title>BV Commerce version 5.4 is now available</title><pubDate>Mon, 03 Nov 2008 21:00:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://forums.bvcommerce.com/default.aspx?f=27&amp;amp;m=59535" target="_self"&gt;BV Commerce version 5.4 is now available&lt;/a&gt;. You may be wondering if your current add-ons are compatible. Here's the scoop:&lt;/p&gt;
&lt;p&gt;&lt;a href="ProductInfo.aspx?productid=RULEPROV-BV5" target="_self"&gt;Shipping Rate Rule Providers&lt;/a&gt;&lt;br /&gt;Version 2.8 (released 11/13/2008)&amp;nbsp;is compatible with 5.4.&lt;/p&gt;
&lt;p&gt;&lt;a href="ProductInfo.aspx?productid=DHLPROV-5" target="_self"&gt;DHL Shipping Rate Providers for BVC5&lt;/a&gt;&lt;br /&gt;The current build is not compatible with 5.4. Send an email to support if you plan on updating your store to 5.4.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="ProductInfo.aspx?productid=CPPROV-BV5" target="_self"&gt;Canada Post Shipping Rate Provider for BVC5&lt;/a&gt;&lt;br /&gt;The current build is not compatible with 5.4. Send an email to support if you plan on updating your store to 5.4.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="ProductInfo.aspx?productid=SHIPPER-SERVICE" target="_self"&gt;Shipper&amp;nbsp;Service for BVC5&lt;/a&gt;&amp;nbsp;(part of the Shipper 1 solution)&lt;br /&gt;The current build of Shipper Service for BVC5 SP2&amp;nbsp;appears to be&amp;nbsp;compatible with 5.4, but does not recognize kits. Very little testing was done on the final release of SP4, so there may be other features that are not supported. No update is planned. Please consider upgrading to Shipper 3.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeplex.com/ShippingAgent" target="_self"&gt;Shipping Agent for BVC5&lt;/a&gt;&amp;nbsp;(part of the Shipper 3 solution)&lt;br /&gt;The current release is compatible with 5.4, but does not recognize kits. Version 3.1 will support 5.4 and is currently scheduled for release by Dec. 1, 2008.&lt;br /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/BVC5SP4</guid></item><item><title>Shipping Rate Rule Providers 2.7.2</title><pubDate>Tue, 20 May 2008 18:50:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="ProductInfo.aspx?productid=RULEPROV-BV5" target="_self"&gt;Shipping Rate Rule Providers&lt;/a&gt; version 2.7.2&amp;nbsp;are now available for BVC5 SP3.2 and above. This new build includes 2 rule enhancements:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support for Customer Inputs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can now check customer inputs. For example put all of the items that require&amp;nbsp;a monogram into a separate package using a rule like,&amp;nbsp;"When Items Inputs&amp;nbsp;is greater than&amp;nbsp;'Monogram='". &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support for all Type Properties including Multiple Choice&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Earlier versions only&amp;nbsp;examined Text and Currency Type Properties. This build supports all Type Properties, including Multiple Choice. For example you can select all the items with Choice A using a rule like, "When Items Custom Property 'My Choice' equals 'Choice A', ...".&lt;/p&gt;
&lt;p&gt;The new builds are available on the &lt;a href="downloads.aspx" target="_self"&gt;downloads&lt;/a&gt; page. The DHL Providers for BVC5 SP3.2 and above have also been updated to include the new features.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/RuleProviders272</guid></item><item><title>Shipper 1.4.9 with support for Galaxy Ship 5.3</title><pubDate>Tue, 13 May 2008 00:03:00 GMT</pubDate><description>&lt;p&gt;Shipper 1.4.9 is now &lt;a href="downloads/shipper/Shipper.msi" target="_self"&gt;available to download&lt;/a&gt;. This version includes support for Endicia Galaxy Ship 5.3, which supports the USPS changes that went into effect today (May 12, 2008).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do I install the update?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads/shipper/Shipper.msi" target="_self"&gt;Download the installer&lt;/a&gt; and run it. The installer will update your copy of Shipper to version 1.4.9.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do I import shipments into Galaxy Ship?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Select the Shipper profile, then enter the order number or shipment ID (whichever one you selected in Shipper), and then click on Retrieve Order.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will I loose my configuration?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No. The installer will migrate your configuration to the new version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do I need to update Shipper Service on my website?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your website has Shipper Service 1.4.7 or earlier, then you will also need to update Shipper Service. Please see the &lt;a href="downloads/" target="_self"&gt;downloads&lt;/a&gt; page to download the most recent version of Shipper Service for your website.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is there are charge for this update?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No. But this is the last free update for Shipper. After this there will be a charge.&lt;/p&gt;
&lt;p&gt;If you have any other questions, please send them to &lt;a href="mailto:support@structured-solutions.net"&gt;support@structured-solutions.net&lt;/a&gt;.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Shipper149</guid></item><item><title>Zuckerberg is no Ballmer</title><pubDate>Mon, 10 Mar 2008 08:36:00 GMT</pubDate><description>&lt;p&gt;Last week Guy Kawaski &lt;a href="http://sessions.visitmix.com/?selectedSearch=ballmer" target="_self"&gt;interviewed&lt;/a&gt; Steve Ballmer (Microsoft) at Mix08. On Saturday, Sarah Lacy&lt;a href="http://www.austin360.com/news/mplayer/sxsw/73367" target="_self"&gt; interviewed&lt;/a&gt; Mark Zuckerberg (Facebook) at SXSW.&lt;/p&gt;
&lt;p&gt;In both interviews the interviewer was chatty, spoke about their own relationship with the interviewee, rambled a few times, asked some easy questions, asked some hard questions, and generally did a good job. Both interviews were about 60 minutes long and both ended with a short Q&amp;amp;A from the audience.&lt;/p&gt;
&lt;p&gt;Sarah was &lt;a href="http://www.news.com/8301-13772_3-9889528-52.html" target="_self"&gt;vilified&lt;/a&gt;&amp;nbsp;(and &lt;a href="http://www.allfacebook.com/2008/03/mark-zuckerberg-sarah-lacey-interview-disaster/" target="_self"&gt;here&lt;/a&gt;, &lt;a href="http://500hats.typepad.com/500blogs/2008/03/the-problem-wit.html" target="_self"&gt;here&lt;/a&gt;, and &lt;a href="http://www.allfacebook.com/2008/03/mark-zuckerberg-sarah-lacey-interview-disaster/" target="_self"&gt;here&lt;/a&gt;). Guy was &lt;a href="http://www.boston.com/business/articles/2008/03/07/microsoft_ceo_says_catching_google_is_goal" target="_self"&gt;praised&lt;/a&gt;&amp;nbsp;(and &lt;a href="http://scobleizer.com/2008/03/07/yesterday/" target="_self"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Was the reaction to Sarah unfair? Undoubtably. &lt;a href="http://blog.wired.com/underwire/2008/03/sxsw-mark-zucke.html" target="_self"&gt;Was it sexist&lt;/a&gt;? Probably...at least a bit.&amp;nbsp; But&amp;nbsp;it mostly&amp;nbsp;comes&amp;nbsp;from imaturity...Mark's.&lt;/p&gt;
&lt;p&gt;Mark Zuckerberg did not treat it as an interview. He&amp;nbsp;was the guest, but he was disrepectful to his host the entire time. He kept looking away from Sarah to address the audience directly for long periods of time (often spouting inane platitudes). Steve spoke to Guy answering&amp;nbsp;his questions without sounding like he was giving a speach.&lt;/p&gt;
&lt;p&gt;Mark gave Sarah blank stares and repeatedly made comments to undermine Sarah's role. Steve stayed 100% engaged and never said anything to undermine Guy.&lt;/p&gt;
&lt;p&gt;After the show Sarah was supportive of Mark, and wrote off the audience reaction to an impedence mismatch between the technical nature of the SXSW conference and the high level nature of interviewing a CEO. That's kind of her, but the Guy/Ballmer interview was in exactly the same conditions.&lt;/p&gt;
&lt;p&gt;I have 2 pieces of advice for Sarah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Interview an adult next time. 
&lt;li&gt;Take a play from Guy's playbook and establish the host/guest relationship right away (about 2 minutes into the interview Guy tells Steve that if the interview goes well he will invite Steve back to the next Mix conference).&lt;/li&gt;&lt;/ol&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ZuckerbergVsBallmer</guid></item><item><title>How to log errors to FogBugz using log4net</title><pubDate>Sun, 09 Mar 2008 09:20:00 GMT</pubDate><description>&lt;p&gt;Here's how I using log4net and BugzScout to send logging events to FogBugz.&lt;/p&gt;
&lt;p&gt;&lt;a href="BugzScoutAppender" target="_self"&gt;BugzScoutAppender for log4net&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/log4net2fogbugz</guid></item><item><title>I wish I could think of bon mots like this</title><pubDate>Thu, 28 Feb 2008 04:50:00 GMT</pubDate><description>&lt;p&gt;"Which also means when you're using Rails and OS X, you're using the platform of choice for douchebags."&lt;/p&gt;
&lt;p&gt;- &lt;a href="http://www.codinghorror.com/blog/archives/001065.html" target="_self"&gt;Jeff Atwood on Coding Horror&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/DouchebagPlatform</guid></item><item><title>Jakob Nielsen: Amazon No Longer the Role Model for E-Commerce Design</title><pubDate>Tue, 26 Feb 2008 19:35:00 GMT</pubDate><description>&lt;p&gt;Because my products work with a variety of platforms, I participate in several e-commerce forums. Inevitably a post appears every few months with a lament that package X does not have some feature that Amazon has.&lt;/p&gt;
&lt;p&gt;Since&amp;nbsp;July 2005, well known researcher Jakob Nielsen has been advising against copying Amazon. Here's why...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.useit.com/alertbox/20050725.html" target="_self"&gt;Amazon: No Longer the Role Model for E-Commerce Design&lt;/a&gt;&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;Many design elements work for Amazon.com mainly because of its status as the world's largest and most established e-commerce site. Normal sites should not copy Amazon's design.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;If you read the piece, you'll see that Mr. Nielsen does not through out the baby with the bath water. There are several Amazon features worth emulating, ranging from the easily used login system to their excellent fulfillment process.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/AmazonAsRoleModel</guid></item><item><title>CSI: .NET</title><pubDate>Mon, 04 Feb 2008 16:03:00 GMT</pubDate><description>&lt;p&gt;Tess Ferrandez is an Escalation Engieer at Microsoft. Her &lt;a href="http://blogs.msdn.com/tess/default.aspx" target="_self"&gt;blog&lt;/a&gt; is essentially CSI: .NET. If you enjoy the &lt;a href="http://en.wikipedia.org/wiki/Jerry_Bruckheimer" target="_self"&gt;Jerry Bruckheimer&lt;/a&gt; &lt;a href="http://www.cbs.com/primetime/csi/" target="_self"&gt;series&lt;/a&gt;, you may like Tess' blog.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/CSIdotNET</guid></item><item><title>Is Test Driven Development Effective</title><pubDate>Wed, 23 Jan 2008 08:42:00 GMT</pubDate><description>&lt;p&gt;Yesterday &lt;a href="http://haacked.com/archive/2008/01/22/research-supports-the-effectiveness-of-tdd.aspx" target="_self"&gt;Phil Haack&lt;/a&gt; and&amp;nbsp;&lt;a href="http://theruntime.com/blogs/jacob/archive/2008/01/22/tdd-proven-effective-or-is-it.aspx" target="_self"&gt;Jacob Proffitt&lt;/a&gt; reviewed "&lt;a href="http://iit-iti.nrc-cnrc.gc.ca/publications/nrc-47445_e.html" target="_self"&gt;On the Effectivenes of Test-first Approach to Programming&lt;/a&gt;" by National Research Canada and published in the Proceedings of the IEEE Transactions on Software Engineering, 31(1), January 2005.&lt;/p&gt;
&lt;p&gt;The test-first approach is often called Test Driven Development, in that the tests are written first and then "drive" the development. This approach is often encouraged in agile programming environments.&lt;/p&gt;
&lt;p&gt;Phil posted first. After explaining his own intuition that TDD is a beneficial approach, Pill cited various sections of the report, including the abstract, that support the benefits of the test-first or TDD method.&lt;/p&gt;
&lt;p&gt;Jacob posted after reading Phil's analysis. After explaining his own scepticism with reports like this (including his&amp;nbsp;suspicion of confirmation bias), Jacob cited several sections of the report that seemed to show the opposite of what Phil and even the report abtract claimed.&lt;/p&gt;
&lt;p&gt;Jacob made some interesting observations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The control group (non-TDD or "Test Last") had higher quality in every dimension—they had higher floor, ceiling, mean, and median quality. 
&lt;li&gt;The control group produced higher quality with consistently fewer tests. 
&lt;li&gt;Quality was better correlated to number of tests for the TDD group (an interesting point of differentiation that I'm not sure the authors caught). 
&lt;li&gt;The control group's productivity was highly predictable as a function of number of tests and had a stronger correlation than the TDD group.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I have experimented with "test first", but found it frustrating. I always ended up just "faking" some tests so I could get on with the programming (Git 'Er Done). Then writing tests after to confirm that I met the requirements. This seems to correlate with Jacob's experience.&lt;/p&gt;
&lt;p&gt;Both Jacob and Phil end their analyses with a call for more research. Me too.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/IsTDDEffective</guid></item><item><title>What Can You Do With FedEx Shipping?</title><pubDate>Fri, 21 Dec 2007 08:48:00 GMT</pubDate><description>&lt;p&gt;&lt;strong&gt;What can you do with FedEx Shipper?&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;See a list of all the pending shipments in your store and create FedEx shipping labels for any one of them with 2 clicks. &lt;/li&gt;
&lt;li&gt;Create a&amp;nbsp;FedEx shipping label for a Christmas present unrelated to your store.&lt;/li&gt;
&lt;li&gt;Create pre-filled customs forms for international and APO shipments. &lt;/li&gt;
&lt;li&gt;Create and use a list of common box sizes. &lt;/li&gt;
&lt;li&gt;Pick a future shipping date. &lt;/li&gt;
&lt;li&gt;See a list of all the packages you have sent (including the Christmas presents). &lt;/li&gt;
&lt;li&gt;Search the history using just about anything you remember--the order number, the recipient's name, street address, city name... &lt;/li&gt;
&lt;li&gt;Display the tracking information with 1 click. &lt;/li&gt;
&lt;li&gt;Reprint the label with 1 click. &lt;/li&gt;
&lt;li&gt;Void the package with 1 click. &lt;/li&gt;
&lt;li&gt;Print the End-Of-Day report with 1 click.&lt;/li&gt;
&lt;li&gt;Display the label in your browser, or print it directly on your Windows printer, or both. &lt;/li&gt;
&lt;li&gt;Print directly to your Zebra compatible label printer. &lt;/li&gt;
&lt;li&gt;Give your customer service people view permission so they can see the shipped and unshipped packages, but cannot change them. &lt;/li&gt;
&lt;li&gt;Give your shipping people edit permission so they can ship and void packages, but cannot access other parts of store's administration. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;You can do all of this and more with just 2 simple web pages.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/FedExShippingFeatures</guid></item><item><title>What Can You Do With USPS Shipping?</title><pubDate>Fri, 21 Dec 2007 08:21:00 GMT</pubDate><description>&lt;p&gt;&lt;strong&gt;What can&amp;nbsp;you do with USPS Shipper?&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;See a list of all the pending shipments in your store&amp;nbsp;and&amp;nbsp;create USPS mailing labels with postage for any one of them with 2 clicks. 
&lt;li&gt;Create a USPS mailing label with postage for a Christmas present unrelated to your store. 
&lt;li&gt;Create pre-filled customs forms for international and APO shipments. 
&lt;li&gt;Create and use a list of common box sizes. 
&lt;li&gt;Pick a future postmark date up to 90 days ahead. 
&lt;li&gt;See a list of all the packages you have sent (including the Christmas presents). 
&lt;li&gt;Search the history using just about anything you remember--the order number, the recipient's name, street address, city name... 
&lt;li&gt;Display the tracking information with 1 click. 
&lt;li&gt;Reprint the label with 1 click. 
&lt;li&gt;Void the package with 1 click (you will need to submit a refund form for the postage separately). 
&lt;li&gt;Display the label in your browser, or print it directly on your Windows printer, or both. 
&lt;li&gt;Print directly to your Zebra compatible label printer. 
&lt;li&gt;Give your customer service people view permission so they can see the shipped and unshipped packages, but cannot change them. 
&lt;li&gt;Give your shipping&amp;nbsp;people&amp;nbsp;edit permission so they can ship and void packages, but cannot access other parts of store's administration.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;You can do all of this and more with just 2 simple web pages.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/USPSShippingFeatures</guid></item><item><title>So what are USPS Shipping and FedEx Shipping? </title><pubDate>Fri, 21 Dec 2007 04:20:00 GMT</pubDate><description>&lt;p&gt;&lt;strong&gt;So what are USPS Shipping and FedEx Shipping?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boring names for 2 very useful products. 
&lt;li&gt;USPS Shipping creates&amp;nbsp;USPS mailing labels with postage. 
&lt;li&gt;FedEx Shipping creates FedEx shipping labels. 
&lt;li&gt;Both&amp;nbsp;are tightly integrated with your&amp;nbsp;store data. 
&lt;li&gt;They are web-based. 
&lt;li&gt;You&amp;nbsp;install them by copying some files to your website.&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;That's it! I swear...no files to backup, edit, or anything.&lt;/p&gt;
&lt;p&gt;Just copy the files to your web site. &lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;They are easy to use with all the shiny stuff you expect. 
&lt;li&gt;You can create a label&amp;nbsp;with &lt;a href="content/binary/USPS%20Shipping%20Beta%201/USPS%20Shipping%20Beta%201.html" target="_self"&gt;2 clicks&lt;/a&gt;...don't blink!&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/USPSandFedExShippingAnswers</guid></item><item><title>USPS and FedEx Shipping Update</title><pubDate>Fri, 21 Dec 2007 04:02:00 GMT</pubDate><description>&lt;p&gt;I completed a few more features this week for the integrated USPS and FedEx Shipping products. Both products now support ad hoc labels so you can ship packages that are not related to any order. The standalone packages and labels are tracked in the History in case you need to reprint a label or answer a customer service question.&lt;/p&gt;
&lt;p&gt;A new label printer program for Windows is also complete. This is primarily so you can print your labels on Zebra compatible printers. But there are a few nice features for "normal" labels too. For example, you can tell it to print labels in landscape and make 2 copies.&lt;/p&gt;
&lt;p&gt;The last big change (from my perspective) is the removal of the ShipOrders.aspx page. This page replaced the page with the same name written by BV Software. Even though I spent a lot of time on that page, I was always uneasy about including it. It was the only piece that could potentially break your website (if you removed my software from the site without replacing ShipOrder.aspx, the page would break and you would not be able to process any shipments in BVC5). By removing it from the package, I have a very clean&amp;nbsp;line between my product and BVC5.&lt;/p&gt;
&lt;p&gt;Besides...who needs it? The two pages that come with USPS and FedEx Shipping are more powerful and easier to use anyway!&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/USPSShippingBeta3</guid></item><item><title>USPS Shipping Beta 2</title><pubDate>Tue, 11 Dec 2007 20:13:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="BVCommerceComponents/BVCommerce5/USPSShippingBeta" target="_self"&gt;USPS Shipping for BVC5&lt;/a&gt; has been updated to include history and a box editor, both of which you can see in the &lt;a href="FedExShippingBeta" target="_self"&gt;FedEx Shipping Beta&lt;/a&gt; screencasts.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/USPSShippingBeta2</guid></item><item><title>FedEx Shipping Beta</title><pubDate>Tue, 11 Dec 2007 19:30:00 GMT</pubDate><description>&lt;p&gt;This first public release of FedEx Shipping for BVC5 is now available. You can download it from &lt;a href="downloads/bvc5/fedexshipping.exe" target="_self"&gt;here&lt;/a&gt;. If you don't want to install beta software (and who could blame you), here are some videos:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Walkthrough&lt;/strong&gt;&lt;br /&gt;&lt;a href="content/video/fedexshipping/beta2/beta2.html" target="video"&gt;&lt;img src="content/video/fedexshipping/beta2/beta2.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Box Editor&lt;/strong&gt;&lt;br /&gt;&lt;a href="content/video/fedexshipping/boxes/boxes.html" target="video"&gt;&lt;img src="content/video/fedexshipping/boxes/boxes.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features Included&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Completely integrated with the BVC5 order system. 
&lt;li&gt;History view with easy search. 
&lt;li&gt;Box editor so you can create and use a list of custom dimensions.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;To be done&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add better security so History can be used by customer service reps without exposing shipping or account details 
&lt;li&gt;Add end-of-day 
&lt;li&gt;Incorporate feedback&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Release Notes&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This build only connects to the FedEx test servers (using my test account), so you can not use the resulting labels on actual packages. 
&lt;li&gt;This software will replace the ShipOrder page supplied by BV Software. Please make a backup copy before you install this software as described in the installation instructions. 
&lt;li&gt;This is beta software. 
&lt;li&gt;Do not install it on a production site.&lt;/li&gt;&lt;/ol&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/FedExShippingBeta</guid></item><item><title>SignIn Control for StoreFront 7 is now available</title><pubDate>Tue, 11 Dec 2007 16:03:00 GMT</pubDate><description>&lt;p&gt;I just posted the new SignIn Control for StoreFront 7,&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href="ProductInfo.aspx?productid=SIGNIN-SF7" target="_self"&gt;Product page&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;In addition to adding support for merchant bundles in the offline cart, I rewrote the 3 samples to integrate better with the new StoreFront 7 templates. &lt;br /&gt;&lt;br /&gt;You can download the software from here (it will run in trial mode for 45 days or until you copy a license file to the web site), &lt;br /&gt;&lt;br /&gt;&lt;a href="downloads/storefront7/signincontrolsetup.exe" target="_self"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A copy of the documentation is online here,&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href="help/storefront7/SignInControl/webframe.html" target="_self"&gt;Documentation&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/SignInControl2</guid></item><item><title>USPS Shipping Screencasts</title><pubDate>Wed, 28 Nov 2007 06:18:00 GMT</pubDate><description>&lt;p&gt;I plan on making a few or more screencasts demonstrating various USPS Shipping features. They will be collected here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="content/binary/USPS%20Shipping%20Beta%201/USPS%20Shipping%20Beta%201.html" target="_self"&gt;Print and ship 2 packages&lt;/a&gt; 
&lt;li&gt;&lt;a href="content/binary/USPS%20Shipping%20Beta%201/Check%20Rates/Check%20Rates.html" target="_self"&gt;Check rates&lt;/a&gt; 
&lt;li&gt;&lt;a href="content/binary/USPS%20Shipping%20Beta%201/Future%20Date/Future%20Date.html" target="_self"&gt;Select a future ship date&lt;/a&gt;
&lt;li&gt;&lt;a href="content/binary/USPS%20Shipping%20Beta%201/Partial%20Shipment/Partial%20Shipment.html" target="_self"&gt;Mailing a partial shipment&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/USPSShippingScreencasts</guid></item><item><title>USPS Shipping for BVC5 Beta 1</title><pubDate>Wed, 28 Nov 2007 02:04:00 GMT</pubDate><description>&lt;p&gt;USPS Shipping adds integrated USPS postage printing to BVC5 SP2 or higher (works with SP3). Although this beta version should not break any existing BVC5 features, I do not recommend installing it on a production site.&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads/bvc5/USPSShipping.exe" target="_self"&gt;Download&lt;/a&gt;&amp;nbsp;| &lt;a href="USPSShippingScreencasts" target="_self"&gt;Screencasts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installation Notes&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you have a backup copy of BVAdmin\Orders\ShipOrder.aspx and ShipOrder.aspx.vb before you copy the USPS Shipping files to your web site. 
&lt;li&gt;Do not store the backup copies of ShipOrder.aspx and ShipOrder.aspx.vb on your web site...this will seriously confuse the server and you will not be able to ship any orders. 
&lt;li&gt;Copy the USPS Shipping files&amp;nbsp;to your web site as described in the installation instructions in the download. 
&lt;li&gt;Load the USPS Shipping Plug-in page to enter your Account Number and Pass Phrase (see the Beta Release Notes below).&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Beta Release Notes&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;During the beta test, you can use any 6 digit number as your account number and anything you like as your pass phrase. 
&lt;li&gt;During the beta test, you are connected to test postage server. You&amp;nbsp;cannot use the postage to mail real stuff. 
&lt;li&gt;USPS Shipping will try to store label images and files in the /images/USPS/ directory of your site. Make sure that the identity running your web site has permission to create this directory (or create it yourself), and permission to Modify the files in the directory. 
&lt;li&gt;Only image formats are useful in this release. Although you can request the label printer formats (EPL2, etc), and they are saved correctly on the server, they are not sent to your label printer.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;USPS Shipping basically consists of 2 pages. You should start on the USPS Shipping Plug-in page:&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/USPSShippingPlugin.png" rel="lightbox"&gt;&lt;img alt="" src="content/binary/USPSShippingPluginThumb.png" align="left"&gt;&lt;/a&gt; BV Admin &amp;gt; Plug-ins &amp;gt; USPS Shipping displays a list of all the pending shipments in your store. Use the filters to fine tune the list. Click on the box icon to display the Print Postage page for a shipment.&lt;/p&gt;
&lt;p style="CLEAR: left"&gt;&lt;a href="content/binary/USPSShippingPrintPostage.png" rel="lightbox"&gt;&lt;img alt="" src="content/binary/USPSShippingPrintPostageThumb.png" align="left"&gt;&lt;/a&gt;Print Postage does what it says and marks the package shipped. You can also reach the Print Postage page from BV Admin &amp;gt; Orders &amp;gt; Order &amp;gt; Shipping by selecting US Postal Service and then clicking on the Ship By Carrier button.&lt;/p&gt;
&lt;p style="CLEAR: left"&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I would especially like feedback on the following areas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How useful was the list of pending shipments on the plug-in page? Did you use it to process shipments? Did it include the information you need? 
&lt;li&gt;Is the Print Postage page organized in a useful way? Did you need to visit the From / To or Customs tabs very often? 
&lt;li&gt;I rewrote the BV Admin &amp;gt; Orders &amp;gt; Order page so support USPS Shipping (and FedEx Shipping soon). Was the new format easier or harder to use?&lt;/li&gt;&lt;/ol&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/USPSShippingBeta</guid></item><item><title>Amazon's &amp;quot;One-Click&amp;quot; Patent Rejected</title><pubDate>Thu, 18 Oct 2007 08:21:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://igdmlgd.blogspot.com/" target="_self"&gt;igdmlgd&lt;/a&gt;'s &lt;a href="http://igdmlgd.blogspot.com/2007/10/amazon-one-click-patent-rejected-by-us.html" target="_self"&gt;request&lt;/a&gt; to re-examine Amazon's "One-Click" patent resulted in USPTO rejecting most of the claims.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/AmazonOneClickRejected</guid></item><item><title>Shipping Rate Provider Suite 2.6 RTW</title><pubDate>Tue, 16 Oct 2007 00:01:00 GMT</pubDate><description>&lt;p&gt;The Shipping Rate Provider Suite 2.6 has been released for download. The product called "Shipping Rate Provider Suite" is now called "Shipping Rate Rule Providers" (because that is what it was). From now on I will use the word sutie to refer to all the shipping rate provider products that share common features like packaging rules and Google Checkout support.&lt;/p&gt;
&lt;p&gt;All of these products are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ProductInfo.aspx?productid=CPPROV-BV5" target="_self"&gt;Canada Post Shipping Rate Provider&lt;/a&gt; 
&lt;li&gt;&lt;a href="ProductInfo.aspx?productid=DHLPROV-5" target="_self"&gt;DHL Shipping Rate Providers&lt;/a&gt; 
&lt;li&gt;&lt;a href="ProductInfo.aspx?productid=RULEPROV-BV5" target="_self"&gt;Shipping Rate Rule Providers&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I am also making a &lt;a href="ProductInfo.aspx?productid=SHIPMETH-BV5" target="_self"&gt;new service available&lt;/a&gt; if you would like me to create shipping method for you using the providers in the suite. Please send an email to &lt;a href="mailto:support@structured-solutions.net"&gt;support@structured-solutions.net&lt;/a&gt; before you buy to make sure what you have in mind is possible.&lt;/p&gt;
&lt;h4&gt;New Canada Post Shipping Rate Provider&lt;/h4&gt;
&lt;p&gt;The new Canada Post provider supports every Canada Post Sell Online feature, including optimized packaging. If you choose to, you can let Canada Post determine the optimum way to pack the items in each order to minimum empty space in your boxes. The packages that Canada Post calculates are pulled back into BVC5 as suggested packages, for use by your shipping department.&lt;/p&gt;
&lt;p&gt;To use the Canada Post provider, you will need a Retailer ID, which you can obtain from the Canada Post Sell Online group as described in, "&lt;a href="CanadaPostSetupBVC5" target="_self"&gt;How to setup a Canada Post shipping method for BVC5&lt;/a&gt;".&lt;/p&gt;
&lt;h4&gt;Rule Provider Enhancements&lt;/h4&gt;
&lt;p&gt;Both the Order Rule and Package Rule providers now have the ability to compare anything-to-anything. This means you can compare any property to any other property, including rates from other shipping methods. For example, you can create a shipping cost rule that picks the least expensive rate for an order like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the rate from "USPS Priority Mail" is less than the rate from "USPS Parcel Post", cost = the rate from "USPS Priority Mail". 
&lt;li&gt;For all other orders, cost = the rate from "USPS Parcel Post".&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;&lt;a href="ProductInfo.aspx?productid=RULEPROV-BV5" target="_self"&gt;Try it free for 45 days!&lt;/a&gt;&lt;/h4&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders26Final</guid></item><item><title>.NET Google Checkout API updated to support carrier calculated shipping</title><pubDate>Fri, 05 Oct 2007 18:42:00 GMT</pubDate><description>&lt;p&gt;Today &lt;a href="http://groups.google.com/group/google-checkout-api-dotnet/browse_thread/thread/a1dedadd274c64a5?hl=en" target="_self"&gt;Google announced&lt;/a&gt; that all the features in the September 7, 2007 and September 20, 2007 schemas are now supported in the .NET Google Checkout API. One of the imported new features is carrier calculated shipping.&lt;/p&gt;
&lt;p&gt;With carrier calculated shipping, Google will contact FedEx, UPS, and/or USPS directly instead of calling back to your store to retrieve those rates. You will need to change your code to use the new elements in the checkout request. The &lt;a href="http://google-checkout-dotnet-sample-code.googlecode.com/svn/trunk/examples/post_cart/simple.aspx" target="_self"&gt;simple.aspx&lt;/a&gt; (use View Source to see the code) and &lt;a href="http://google-checkout-dotnet-sample-code.googlecode.com/svn/trunk/examples/post_cart/private-data.aspx" target="_self"&gt;private-data.aspx&lt;/a&gt; samples show how to use the new elements.&lt;/p&gt;
&lt;p&gt;I noticed that their &lt;a href="http://google-checkout-dotnet-sample-code.googlecode.com/svn/trunk/lib/Checkout/ShippingType.cs" target="_self"&gt;USPS support &lt;/a&gt;does not include international rates, so you will still need to callback to your store for those.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/GoogleCheckout104</guid></item><item><title>Shipping Rate Providers 2.6 Release Candidate 2</title><pubDate>Thu, 04 Oct 2007 15:50:00 GMT</pubDate><description>&lt;p&gt;The Shipping Rate Provider Suite is changing. The plug-in part, including postal codes support, is now &lt;em&gt;free&lt;/em&gt;. The old suite is now called Rule Providers. Here are the new products for BVC5:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free Shipping Rate Provider Plug-in (&lt;a href="downloads/bvc5/ShippingProvidersPlugin.exe" target="_self"&gt;download&lt;/a&gt;) 
&lt;li&gt;Rule Providers (&lt;a href="downloads/bvc5/RuleProviders.exe" target="_self"&gt;download&lt;/a&gt;) 
&lt;li&gt;DHL Providers (&lt;a href="downloads/bvc5/DhlProviders.exe" target="_self"&gt;download&lt;/a&gt;) 
&lt;li&gt;Canada Post Provider (&lt;a href="downloads/bvc5/CanadaPostProvider.exe" target="_self"&gt;download&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If all you want is the postal code support, download the free plug-in. All&amp;nbsp;of the add-on provider packages include the plug-in. The article, "&lt;a href="PostalCodeValidator" target="_self"&gt;Postal Code Validator for BVC5&lt;/a&gt;" demonstrates one way to use the postal code support.&lt;/p&gt;
&lt;p&gt;A Release Candidate is nearly ready for production use. I am not aware of any bugs, but I might change wording or make minor tweaks before final release.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders26RC2</guid></item><item><title>SpamBayes failed me but Cloudmark is working great</title><pubDate>Wed, 19 Sep 2007 18:46:00 GMT</pubDate><description>&lt;p&gt;About 2 months ago I started using &lt;a href="http://www.cloudmark.com/?rc=ndp77" target="_self"&gt;Cloudmark&lt;/a&gt; to control the amount of email spam I see. Before that I used &lt;a href="http://spambayes.sourceforge.net/windows.html" target="_self"&gt;SpamBayes&lt;/a&gt;&amp;nbsp;(because it was free), but even after 2 years of training, I was still seeing about 200 spam messages every...single...day. I felt like I was loosing a battle.&lt;/p&gt;
&lt;p&gt;Since I started using Cloudmark, I only see about 2-10 spam messages each day...yippee! I'm sure it is partly due to better algorithms, but the coolest feature is that when I flag those 2-10 messages as spam, the whole Cloudmark community benefits. We all help each other make Cloudmark better and better each day. I like that.&lt;/p&gt;
&lt;p&gt;Here are my statistics for the last 2 months. I've only had to identify 323 emails as spam/phishing (a lot of the spam was actually phishing...but I was lazy and just clicked the Block button which defaults to spam).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cloudmark.com/?rc=ndp77" target="_self"&gt;&lt;img class="Image" alt="" src="i/c/3_cloudmark.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All of the &lt;a href="http://www.cloudmark.com/?rc=ndp77" target="_self"&gt;Cloudmark&lt;/a&gt; links include my referral code. I hope you don't mind...I really do like Cloudmark, and I would also like the free month of service if you like Cloudmark too. Thanks!&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/MyEmailSpam</guid></item><item><title>Shipping Rate Provider Suite 2.6 Release Candidate 1</title><pubDate>Fri, 31 Aug 2007 15:28:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="ProductInfo.aspx?ProductID=PROVSTE-5" target="_self"&gt;Shipping Rate Provider Suite&lt;/a&gt; version 2.6 is now available for testing. Although I am not aware of any problems, I do not recommend using this on a production site. This version works with BVC5 SP2.&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads/bvc5/ShippingProviders2beta.exe" target="_self"&gt;Download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are&amp;nbsp;3 new features in this version: better support for Google Checkout, additional properties you can test, and the ability to compare properties.&lt;/p&gt;
&lt;h4&gt;Better Support for Google Checkout&lt;/h4&gt;
&lt;p&gt;If you have used Google Checkout, you have probably been bit by the 3 second rule. During checkout, Google will ask your web site how much to charge for shipping. If your site does not respond within 3 seconds, Google will use the default values. Unfortunately, some carriers frequently take 1 or 2 seconds, so if your store supports more than one carrier or more than one service level from a single carrier, your site will consistently fail to respond within 3 seconds.&lt;/p&gt;
&lt;p&gt;One way to work around this problem is to offer Google Checkout customers&amp;nbsp;different, and faster, shipping options. This version of the Shipping Rate Provider Suite adds&amp;nbsp;two new checkboxes called "Visible to BVC5 Checkout" and "Visible to Google Checkout" to each shipping method that you define. If you check "Visible to BVC5 Checkout", the shipping method will appear to customers that use any one of the BVC5 checkout themes. If you check "Visible to Google Checkout", the shipping method will appear to customers that use Google Checkout. If you uncheck either option, the shipping method will not appear during the corresponding checkout.&lt;/p&gt;
&lt;p&gt;For example,&amp;nbsp;if you define&amp;nbsp;two shipping methods called "USPS Priority Mail" and "USPS Parcel Post", you can both appear during BVC5 checkout, but only offer "USPS Priority Mail" during Google Checkout. By fine tuning the methods that appear during Google Checkout, you can ensure that you are not hit by the 3 second rule.&lt;/p&gt;
&lt;h4&gt;Additional Properties You Can Test&lt;/h4&gt;
&lt;p&gt;Joe Arbogast (&lt;a href="http://www.birdsafestore.com/"&gt;www.birdsafestore.com&lt;/a&gt;) asked if he could using the packaging rules to create separate packages for items that are backordered. So version 2.6 now includes 3 new item properties that you can include in your tests:&lt;/p&gt;
&lt;dl class="properties"&gt;
&lt;dt&gt;Inventory Available 
&lt;dd&gt;If inventory is enabled, this is the number of items available. 
&lt;dt&gt;Inventory Enabled 
&lt;dd&gt;If inventory is enabled, this is 1, otherwise this is 0. 
&lt;dt&gt;Inventory Low Point 
&lt;dd&gt;If inventory is enabled, this is the inventory low point for the item.&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;Using these new properties, you can separate backordered items into there own packages using a rule like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;While Items Inventory Enabled = 1 and Items Inventory Available&amp;nbsp;= 0.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I also added 2 new order properties that you test:&lt;/p&gt;
&lt;dl class="properties"&gt;
&lt;dt&gt;Distance in Miles 
&lt;dd&gt;If you have loaded the postal codes for both your store and the shipping address, this is the distance in miles from your store to the shipping address. 
&lt;dt&gt;Hour of Day 
&lt;dd&gt;This is the hour (including partial hour) that the order is placed. For example, if the order is placed at 1:30pm, this property is 13.5.&lt;/dd&gt;&lt;/dl&gt;
&lt;h4&gt;Ability to Compare Properties&lt;/h4&gt;
&lt;p&gt;Prior to version 2.6, rules could test a property value against a fixed limit. For example,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If Rate From "USPS Priority Mail"&amp;nbsp;&amp;gt; 8.25, Cost = 8.25.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Starting with version 2.6, rules can compare properties. For example, USPS Priority Mail is sometimes lower than Parcel Post. If you only want to display the lower cost service, you can use shipping cost rules like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When&amp;nbsp;Rate From "USPS Priority Mail" &amp;lt; Rate From "USPS Parcel Post", Cost = Rate From "USPS Priority Mail". 
&lt;li&gt;For all other packages, Cost = Rate From "USPS Parcel Post".&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;You can still build your rules using a smooth point-and-click interface. For example, &lt;a href="http://screencast.com/t/A3aZbs4PS2K" target="_self"&gt;this video&lt;/a&gt; shows how easily the two rules above are created.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders26Beta</guid></item><item><title>Shipping Rate Provider Suite 2.5.3 Released</title><pubDate>Tue, 24 Jul 2007 18:33:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="ProductInfo.aspx?ProductID=PROVSTE-5" target="_self"&gt;Shipping Rate Provider Suite&lt;/a&gt; version 2.5.3 is now available. This release includes the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logical "and" comparisons are&amp;nbsp;made before "or" comparisons.&lt;/li&gt;
&lt;li&gt;Suggested packages for wrapped providers (i.e. US Postal Service) will have the correct weight.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a href="downloads/bvc5/ShippingProviders2.exe" target="_self"&gt;download&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders253</guid></item><item><title>Shipping Rate Provider Suite 2.5.2 Released</title><pubDate>Wed, 11 Jul 2007 19:05:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="ProductInfo.aspx?productid=PROVSTE-5" target="_self"&gt;Shipping Rate Provider Suite&lt;/a&gt; version 2.5.2 is now available. This update includes support for both "and" and "or" conditions within Packaging and Shipping Cost rules. For example,&lt;/p&gt;
&lt;p&gt;&lt;img alt="Sample packaging rule" src="content/binary/AndOrSample.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads.aspx"&gt;Download&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders252</guid></item><item><title>Shipping Rate Provider Suite 2.5 Released</title><pubDate>Thu, 28 Jun 2007 17:41:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="ProductInfo.aspx?ProductID=PROVSTE-5" target="_self"&gt;Shipping Rate Provider Suite 2.5&lt;/a&gt; is now avilable for production use. The big changes from version 2.0 include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The number of calculators has been reduced from 6 down to 2: Order Rules and Package Rules without loosing any features. This makes it much easier to create sophisticated cost calculations without custom programming. As their names imply, use Order Rules when you want to calculate the shipping cost based on an order property (such as sub total). Use Package Rules for everything else. Of course you can still combine them for more complicated calculations. 
&lt;li&gt;All of the providers now include&amp;nbsp;packaging rules so that you can implement packaging based on your own business practices. The packaging is carried all the way through the checkout to order processing as Suggested Packages so your shipping department knows exactly how to package the order. 
&lt;li&gt;A standalone Postal Code Support library is now included which you can use to load and manage postal code lists. The Shipping Rate Provider Suite uses this library to calculate the shipping distance between any two addresses on earth (if you load the appropriate postal code data). The Shipping Rate Provider Suite includes over 42000 US postal codes. 
&lt;li&gt;InstallSuite.aspx is no longer used to finish the installation. Installation and other management tasks are now performed using the "Shipping Rate Provider Suite" plugiin (BV Admin &amp;gt; Plug-Ins).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Please see&amp;nbsp;the updated &lt;a href="SearchResults.aspx?search=PROVSTE-5%20Sample" target="_self"&gt;Samples&lt;/a&gt; for ideas on how to implement your own cost calculations.&lt;/p&gt;
&lt;h2&gt;Migrating from Earlier Versions&lt;/h2&gt;
&lt;p&gt;Complete the following steps before you update to version 2.5:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The shipping methods that you created with version 2.0&amp;nbsp;and earlier are not compatible with version 2.5. I recommend that you take a screen shot of each shipping method so that you can re-produce quickly&amp;nbsp;using version 2.5. 
&lt;li&gt;Use the InstallSuite.aspx page from your current version to Remove the current providers. If you skip this step, send me your Taskloader.Custom.vb file so that I can manually remove the code that is no longer needed.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;After installing version 2.5, you can delete the unused editors by deleting the following directories: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BVModules\Shipping\Item Router\ 
&lt;li&gt;BVModules\Shipping\Item Rules\ 
&lt;li&gt;BVModules\Shipping\Package Router\ 
&lt;li&gt;BVModules\Shipping\Order Router\ &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;You can also delete BVModules\Shipping\InstallSuite.aspx.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="ShippingRateProvidersReleaseNotes" target="_self"&gt;Release Notes&lt;/a&gt; for details about breaking changes.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders25</guid></item><item><title>Web Development Tools</title><pubDate>Mon, 25 Jun 2007 17:56:00 GMT</pubDate><description>&lt;p&gt;John Hrvatin (MS Program Manager for Internet Explorer) &lt;a href="http://blogs.msdn.com/ie/archive/2007/06/22/from-microsoft-teched-2007-web-development-tools-for-internet-explorer.aspx" target="_self"&gt;posted a list &lt;/a&gt;of lightweight web development tools for Internet Explorer. He missed &lt;a href="http://www.getfirebug.com/lite.html" target="_self"&gt;Firebug Lite&lt;/a&gt;, but otherwise caught the ones I use plus many more.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/WebTools</guid></item><item><title>Shipping Rate Provider Suite Version 2.5 Beta 2</title><pubDate>Mon, 18 Jun 2007 21:28:00 GMT</pubDate><description>&lt;p&gt;The second beta of Version 2.5 is now available for testing. The big changes from version 2.0 include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The number of calculators has been reduced from 6 down to 2: Order Rules and Package Rules. As their names imply, use Order Rules when you want to calculate the shipping cost based on the entire order (such as subtotal). Use Package Rules for everything else. Of course you can still combine them for more complicated calculations.&lt;/li&gt;
&lt;li&gt;Package Rules (and the DHL providers) now include a much more flexible packaging scheme so you can break up your order into exactly the right packages.&lt;/li&gt;
&lt;li&gt;A standalone Postal Code Support library is now included which you can use to load and manage postal code lists. The Shipping Rate Provider Suite uses this library to calculate the distance between points.&lt;/li&gt;
&lt;li&gt;InstallSuite.aspx is no longer used to finish the installation. Installation and other management tasks are now performed using the "Shipping Rate Provider Suite" plugin (BV Admin &amp;gt; Plug-Ins).&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;If you have version 2.0 (or eariler) installed, please use the InstallSuite.aspx page from your current version to Remove the current providers before you install version 2.5. If you skip this step, send me your Taskloader.Custom.vb file so that I can manually remove the code that is no longer needed.&lt;/p&gt;
&lt;p&gt;Also if you have version 2.0 (or earlier) installed, you can delete the unused editors by deleting the following directories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BVModules\Shipping\Item Router\&lt;/li&gt;
&lt;li&gt;BVModules\Shipping\Item Rules\&lt;/li&gt;
&lt;li&gt;BVModules\Shipping\Package Router\&lt;/li&gt;
&lt;li&gt;BVModules\Shipping\Order Router\&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;You can also delete BVModules\Shipping\InstallSuite.aspx.&lt;/p&gt;
&lt;p&gt;You can download the beta version from here, &lt;br /&gt;&lt;br /&gt;&lt;a href="downloads/bvc5/ShippingProviders25.exe" target="_self"&gt;Shipping Rate Provider Suite 2.5 &lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Please let me know what you think. I plan on making a few minor changes before final release, so there is still time to lobby for your pet feature. &lt;br /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders25Beta2</guid></item><item><title>Sample ShippingProvider for BVC5</title><pubDate>Fri, 15 Jun 2007 18:53:00 GMT</pubDate><description>&lt;p&gt;The "&lt;a href="TrackingOnlyShippingProvider" target="_self"&gt;How to Create a BVC5 Shipping Provider&lt;/a&gt;" article includes a sample ShippingProvider that only supports tracking.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviderSample</guid></item><item><title>Shipping Rate Provider Suite Version 2.5 Beta</title><pubDate>Fri, 01 Jun 2007 21:43:00 GMT</pubDate><description>&lt;p&gt;I am very excited to make version 2.5 available for testing. There are 3 big changes in this version:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The number of calculators has been reduced from&amp;nbsp;6 down to 2: Order Rules and&amp;nbsp;Package Rules. As their names imply, use Order Rules when you want to calculate the shipping cost based on the entire order (such as subtotal). Use Package Rules for everything else. Of course you can still combine them for more complicated calculations. 
&lt;li&gt;Package Rules (and the DHL providers) now include a much more flexible packaging scheme so you can break up your order into exactly the right packages. 
&lt;li&gt;A standalone Postal Code Support library is now included which you can use to load and manage postal code lists. The Shipping Rate Provider Suite uses this library to calculate the distance between points.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;If you have version 2.0 (or eariler) installed, please use the InstallSuite.aspx page from your current version to Remove the current providers before you install version 2.5. If you skip this step, send me your Taskloader.Custom.vb file so that I can manually remove the code that is no longer needed.&lt;/p&gt;
&lt;p&gt;You can download the beta version from here,&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads/bvc5/ShippingProviders25.exe" target="_self"&gt;Shipping Rate Provider Suite 2.5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please let me know what you think. I plan on making a few minor changes before final release, so there is still time to lobby for your pet feature.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders25Beta</guid></item><item><title>Testing Google Checkout in BVC5</title><pubDate>Tue, 01 May 2007 15:00:00 GMT</pubDate><description>&lt;p&gt;I do all of my development and testing on computers here in the shop. Recently I wanted to make sure that the &lt;a href="http://www.bvsoftware.com/Solutions/Shopping-Cart-Software/BV-Commerce-5/Default.aspx" target="_self"&gt;BVC5&lt;/a&gt; implementation of Google Checkout and my &lt;a href="ProductInfo.aspx?productid=PROVSTE-5" target="_self"&gt;Shipping Rate Provider Suite&lt;/a&gt; played well together. The tricky part was that Google Checkout makes several callbacks to BVC5 web site during the checkout process (and after), so I had to make my workstation available over the internet to Google. These are the steps I used to enable Google Checkout test mode on my local workstation.&lt;/p&gt;&lt;img class="Image" alt="" src="i/c/3_network.jpg" border="0"&gt; 
&lt;p&gt;The first step is to find the internet address and hostname of your internet connection. This will used to form the callback URL. As you can see in the diagram above I connect to the internet through a router which is connected to a broadband modem (comcast). To find the internet IP address I used the router's configuration web page. To find the hostname I used&amp;nbsp;nslookup:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;C:\&amp;gt;nslookup 24.22.112.211&lt;br /&gt;Name: c-24-22-112-211.hsd1.or.comcast.net&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Now we need the IP address of the computer running BVC5. I used the ipconfig command:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;C:\&amp;gt;ipconfig &lt;br /&gt;Windows IP Configuration &lt;br /&gt;&lt;br /&gt;Ethernet adapter Local Area Connection: &lt;br /&gt;&lt;br /&gt;Connection-specific DNS Suffix . : &lt;br /&gt;IP Address. . . . . . . . . . . . : &lt;font style="BACKGROUND-COLOR: #ffcc00"&gt;172.16.0.4&lt;/font&gt; &lt;br /&gt;Subnet Mask . . . . . . . . . . . : 255.255.255.0 &lt;br /&gt;Default Gateway . . . . . . . . . : 172.16.0.1&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Next we need to tell the router to forward HTTP traffic to this computer. In my router, this is called port forwarding:&lt;/p&gt;
&lt;p&gt;&lt;img class="Image" alt="" src="i/c/3_portforwarding.jpg" border="0"&gt;&lt;/p&gt;
&lt;p&gt;Now a request from Google to http://c-24-22-112-211.hsd1.or.comcast.net/store/googlenotify.aspx will be forwarded to my computer. Unfortunately a request from my own computer to this same URL will fail because my router does not support internal routing. To fix that I added a host record to the c:\windows\system32\drivers\etc\hosts file so local requests to the same URL are&amp;nbsp;sent to the loopback adapter:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;127.0.0.1 localhost&lt;br /&gt;&lt;font style="BACKGROUND-COLOR: #ffcc00"&gt;127.0.0.1 c-24-22-112-211.hsd1.or.comcast.net&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;OK...the networking changes are done. It's time to configure &lt;a href="http://code.google.com/apis/checkout/developer/google_checkout_html_api.html#integration_overview" target="_self"&gt;Google Checkout&lt;/a&gt;. First create two test accounts; one for your &lt;a href="http://sandbox.google.com/checkout" target="_self"&gt;test customer&lt;/a&gt; and one for the &lt;a href="http://sandbox.google.com/checkout/sell/" target="_self"&gt;test merchant&lt;/a&gt;. This will be a little easier if you use two different browsers such as&amp;nbsp;Internet Explorer&amp;nbsp;for the customer and FireFox for the merchant.&lt;/p&gt;
&lt;p&gt;On the merchant Integration page enter the callback URL (ie. http://c-24-22-112-211.hsd1.or.comcast.net/store/googlenotify.aspx), select XML as the callback method, and uncheck the option to digitally sign the XML. Click on the Save button but leave the Integration page open so you can copy the vendor ID and merchant key.&lt;/p&gt;
&lt;p&gt;Now open the admin pages of your local BVC5 site. On the Options &amp;gt; Site Settings &amp;gt; Security page enter the external URL as the Secure Site Root, check Use SSL and click on the Save Changes button. For example,&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;Secure Site Root: http://c-24-22-112-211.hsd1.or.comcast.net/store/&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;On the Options &amp;gt; Site Settings &amp;gt; Payment page check Google Checkout and then click on the Save Changes button. Now click on the Edit button next to Google Checkout, enter the Merchant ID (Google calls this the Vendor ID on the Merchant Integration Page), the Merchant Key and select the Test Google Checkout Environment. After filling out the remaining items on this page, click on the Save Changes button.&lt;/p&gt;
&lt;p&gt;That's it. To use Google Checkout click on the Google Checkout button when you reach the shopping cart page, sign in as the test customer and place the order. To manage the orders, sign in as the test merchant and visit the order Inbox. I find it easier to use two different browsers: Internet Explorer when I place an order as the test customer, and FireFox when I manage the orders as the test merchant.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/TestingGoogleCheckout</guid></item><item><title>Froogle Feed Version 1.7</title><pubDate>Fri, 27 Apr 2007 20:48:00 GMT</pubDate><description>&lt;p&gt;Froogle Feed version 1.7 is now available. This new version includes support for multiple custom fields and&amp;nbsp;optional feed compression.&lt;/p&gt;
&lt;p&gt;Current owners can download this free update from the original order details page on this site. Login to &lt;a href="YourAccount" target="_self"&gt;Your Account&lt;/a&gt; to&amp;nbsp;reach the order details.&lt;/p&gt;
&lt;p&gt;You can also download the &lt;a href="downloads/storefront/FroogleFeedSetup.exe" target="_self"&gt;free trial version&lt;/a&gt; from the Downloads page.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Froogle17</guid></item><item><title>Shipping Rate Provider Suite Version 2</title><pubDate>Thu, 26 Apr 2007 20:42:00 GMT</pubDate><description>&lt;div style="FLOAT: right; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 5px; WIDTH: 172px; TEXT-ALIGN: center"&gt;&lt;a href="i/c/3_supersaver.jpg" rel="lightbox"&gt;&lt;img class="Image" alt="" src="i/c/3_packagingthumb.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;click for full image&lt;/div&gt;
&lt;p&gt;I am very pleased to announce that Version 2 of the &lt;a href="ProductInfo.aspx?productid=PROVSTE-5" target="_self"&gt;Shipping Rate Provider Suite&lt;/a&gt; is now available. Although this version is compatible with &lt;span title="BV Commerce 5"&gt;BVC5&lt;/span&gt; SP2, that is not the big news. The best new feature in Version 2 is a flexible packaging system that splits your order into&amp;nbsp;suggested packages you&amp;nbsp;can ship. You can even&amp;nbsp;assign the packaging weight and box dimensions. And the packaging is carried all the way through the checkout process so your shipping deparment will see exactly how to pack the order.&lt;/p&gt;
&lt;p&gt;The &lt;a href="ProductInfo.aspx?productid=PROVSTE-5" target="_self"&gt;Shipping Rate Provider Suite&lt;/a&gt; calculates custom shipping costs &lt;em&gt;without&lt;/em&gt; custom programming. This is the most complete real-time shipping cost calculation feature available anywhere for any ecommerce package.&amp;nbsp;&lt;a href="downloads/bvc5/ShippingProviders2.exe" target="_self"&gt;Download the free trial now.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here are some of the new features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Split the order into packages based on any package or product property (i.e. weight, count, product type, etc.) 
&lt;li&gt;Assign packaging weight to packages. For example, add 1 pound to every package to account for the box and packaging. 
&lt;li&gt;Assign box dimensions to packages. This means you can "pre-pack" the shipment into common box sizes. The box dimensions are displayed on the Shipping page so your shipping department knows exactly how to pack the order. 
&lt;li&gt;Use the new order Day of Week property to customize your shipping offers on certain days of the week. For example, you could offer Saturday Delivery on Thursday and Friday. 
&lt;li&gt;Use the new package Length + Girth property to avoid carrier surcharges for oversized packages.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;There are also two new &lt;/strong&gt;&lt;a href="SearchResults.aspx?search=PROVSTE-5%20Sample" target="_self"&gt;&lt;strong&gt;samples&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; showing how to use the new features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ShippingProvidersAmazonSample" target="_self"&gt;&lt;strong&gt;Amazon Shipping Sample&lt;/strong&gt;&lt;/a&gt; - Create 4 shipping methods to emulate Amazon.com's shipping options. 
&lt;li&gt;&lt;a href="ShippingProvidersWineSample" target="_self"&gt;&lt;strong&gt;Wine Cellar Sample&lt;/strong&gt;&lt;/a&gt; - Combines wine into 6 bottles per case before retrieving 2 separate carrier rates.&lt;/li&gt;&lt;/ul&gt;
&lt;div style="FLOAT: left; MARGIN-RIGHT: 5px"&gt;&lt;a href="downloads/bvc5/ShippingProviders2.exe" target="_self"&gt;&lt;img title="Download Free Trial" alt="" src="i/t/a/buttons/downloadtrial.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Version 2 is a free update for all current license owners. You can download the new version using the trial download link or from the &lt;a href="downloads.aspx" target="_self"&gt;downloads&lt;/a&gt; page.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders20</guid></item><item><title>YUI AutoComplete + Anthem = AutoSearch</title><pubDate>Fri, 13 Apr 2007 01:10:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://sourceforge.net/projects/anthem-dot-net/" target="_self"&gt;Anthem.NET&lt;/a&gt; is an Ajax library for ASP.NET applications. &lt;a href="http://developer.yahoo.com/yui/autocomplete/" target="_self"&gt;AutoComplete&lt;/a&gt; is part of the &lt;a href="http://developer.yahoo.com/yui/" target="_self"&gt;Yahoo User Interface&lt;/a&gt; library for creating sophisticated DHTML and Ajax applications. What happens if you mash them together? How about &lt;a href="http://anthem.talloaksoftware.com/Extensions/AutoComplete.aspx" target="_self"&gt;YuiAutoComplete&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;YuiAutoComplete is an ASP.NET server control that generates the HTML and javascript necessary to create a YUI&amp;nbsp;AutoComplete control. This short article describes how I used YuiAutoComplete to create an auto search widget for an ecommerce site.&amp;nbsp;As the customer starts typing in the box YuiAutoComplete will display matching products. If the customer selects one of the products from the list, YuiAutoComplete will redirect the browser to the product detail page.&lt;/p&gt;
&lt;p&gt;&lt;iframe name="I1" marginwidth="1" marginheight="1" src="content/binary/AutoSearch/AutoSearchStill.html" frameborder="0" width="320" scrolling="no" height="251"&gt;
Your browser does not support inline frames or is currently configured not to display inline frames.
&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;First I added the Anthem and AnthemExtensions assemblies to my web site. Anthem and AnthemExtensions&amp;nbsp;are the two assemblies that you get when you build Anthem.NET solution.&lt;/p&gt;
&lt;p&gt;Then I created a user control to encapsulate the widget.&lt;/p&gt;&lt;pre&gt;&amp;lt;div class="container"&amp;gt;
    &amp;lt;asp:TextBox ID="AutoSearchField" runat="server" CssClass="textbox" /&amp;gt;
    &amp;lt;AnthemExtensions:YuiAutoComplete id="AutoSearchWidget" runat="server" 
        AutoCallBack="true"
        CssClass="results" 
        FormatResult="formatResult" 
        OnSearch="AutoSearch_Search" 
        OnSelectedItemChanged="AutoSearch_SelectedItemChanged"
        TextBox="AutoSearchField"&amp;gt;
    &amp;lt;/AnthemExtensions:YuiAutoComplete&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;Next I&amp;nbsp;wrote 3 functions: formatResult, AutoSearch_Search, and AutoSearch_SelectedItemChanged.&lt;/p&gt;
&lt;p&gt;YUI AutoComplete will use the OnSearch event handler on the server to retrieve search results. The actual call is made using an Anthem callback. In this example AutoSearch_Search performs a catalog search for the search term and returns the SKU, Product Name, and product detail page URL.&lt;/p&gt;&lt;pre&gt;    [Anthem.Method]
    public string[][] AutoSearch_Search(string query)
    {
        ProductSearchCriteria criteria = new ProductSearchCriteria();
        criteria.Keyword = query;

        Collection&amp;lt;ProductSearchResultGroup&amp;gt; groups = InternalProduct.SearchByComplexPhrase(criteria,
            SessionManager.GetCurrentUserId(), false, this.AutoSearchWidget.MaxResultsDisplayed);

        ArrayList result = new ArrayList();
        if (groups.Count &amp;gt; 0)
        {
            foreach (ProductSearchResultGroup group in groups)
            {
                foreach (Product product in group.Products)
                {
                    string url = BVSoftware.Bvc5.Core.Utilities.UrlRewriter.BuildUrlForProduct(product, 
                        Request);
                    result.Add(new string[] { product.Sku, product.ProductName, url });
                }
            }
        }

        return (string[][])result.ToArray(typeof(string[]));
    }
&lt;/pre&gt;
&lt;p&gt;YUI AutoComplete will use the client side FormatResult function to format the search results. In this example formatResult displays the SKU and Product Name in the search results list. Note that even though I don't show the product URL, YUI AutoComplete keep track of it.&lt;/p&gt;&lt;pre&gt;    function formatResult(item, query) {
        return item[0] + ' (' + item[1] + ')';
    }
&lt;/pre&gt;
&lt;p&gt;AutoSearch_SelectedItemChanged is another server side method that is called (via Anthem callback) when the customer selects one of the results. In this&amp;nbsp;example the method redirects the browser to the product detail page URL.&lt;/p&gt;&lt;pre&gt;    protected void AutoSearch_SelectedItemChanged(object sender, EventArgs e)
    {
        string url = this.AutoSearchWidget.SelectedItem.Split(',')[2];
        Response.Redirect(url);
    }
&lt;/pre&gt;
&lt;p&gt;Source: &lt;a href="content/binary/AutoSearch.zip"&gt;AutoSearch.zip&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/AutoSearchMashup</guid></item><item><title>CSO List of Top 5 Data Breaches of 2005</title><pubDate>Thu, 01 Mar 2007 20:03:00 GMT</pubDate><description>&lt;p&gt;In &lt;a href="http://www.csoonline.com/read/020107/brf_data_breach.html" target="_self"&gt;Data Drains&lt;/a&gt;, &lt;a href="http://www.csoonline.com/index.html" target="_self"&gt;CSO&lt;/a&gt; lists the top 5 data breaches in 2006. Together they could affect over 35 million people. &lt;/p&gt;
&lt;p&gt;A lot of online merchants that talk to me want to store credit card numbers and sometimes even the security code. My advice is always the same...don't do it!&lt;/p&gt;
&lt;p&gt;No matter what technology you put in place, the weakest link&amp;nbsp;will always be people. The largest breach, at the Veterans Affairs Department, occurred when a laptop was stolen from an employee's home. No software can stop that.&lt;/p&gt;
&lt;p&gt;For up to date information, keep an eye on the &lt;a href="http://attrition.org/dataloss/" target="_self"&gt;Attrition.org Data Loss Archive and Database&lt;/a&gt;.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/2006Breaches</guid></item><item><title>Froogle Feed 1.6 Released</title><pubDate>Thu, 22 Feb 2007 16:51:00 GMT</pubDate><description>&lt;p&gt;Froogle Feed 1.6 is now available. This version includes support for the &lt;a href="http://base.google.com/base/products.html" target="_self"&gt;required attributes for all products&lt;/a&gt; announced by Google Base in February 2007.&lt;/p&gt;
&lt;p&gt;Current owners can download a copy of Froogle Feed 1.6 from &lt;a href="YourAccount" target="_self"&gt;your account&lt;/a&gt;. Select &lt;a href="YourAccount/Default.aspx" target="_self"&gt;View Past Orders&lt;/a&gt;, then display the order details and click on the downloads link. If the downloads link does not appear, please send an email to &lt;a href="mailto:support@structured-solutions.net"&gt;support@structured-solutions.net&lt;/a&gt;&amp;nbsp;with the order number.&lt;/p&gt;
&lt;p&gt;If you were testing this release, you do not need to install this build...it is the same one you were testing. Thank you!&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Froogle16</guid></item><item><title>Froogle Feed Support for New Product Upload Requirements</title><pubDate>Wed, 31 Jan 2007 18:14:00 GMT</pubDate><description>&lt;p&gt;The &lt;a href="http://base.google.com/base" target="_self"&gt;Google Base&lt;/a&gt; &lt;a href="mailto:googlebase-support@google.com" target="_self"&gt;Team&lt;/a&gt; have announced new product upload requirements for Froogle Merchants.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://base.google.com/base/products.html" target="_self"&gt;Google's Attribute Requirement Page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google will no longer list items that do not meet the minimal number of attributes by the end of February 2007. I will release an update to &lt;a href="ProductInfo.aspx?productid=FROOGLE-SF" target="_self"&gt;Froogle Feed&lt;/a&gt; that includes the required attributes for all products before the end of February. The update will not include support for item type specific attributes.&lt;/p&gt;
&lt;p&gt;Please see Google's &lt;a href="http://base.google.com/base/products.html" target="_self"&gt;Attribute Requirement Page&lt;/a&gt; for a list of the required attributes for all products and the item type specific attributes.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/NewFroogleRequirements</guid></item><item><title>Shipping Rate Provider Suite for BVC5 Updated</title><pubDate>Wed, 24 Jan 2007 21:22:00 GMT</pubDate><description>&lt;p&gt;The Package Router and Package Rule calculators in the &lt;a href="ProductInfo.aspx?productid=PROVSTE-5" target="_self"&gt;Shipper Rate Provider Suite for BVC5&lt;/a&gt; now include access to all the combined properties of the items in the package. For example, you can have a rule such as "When the combined product categories contain the string 'laser', the cost =...". This rule would apply when any of the items in the package contain the string 'laser'.&lt;/p&gt;
&lt;p&gt;You can reference any item property including custom product properties that you define in BVC5. Numeric properties are added together. For example, Combined Item Value would calculate the total value of all items in the package.&lt;/p&gt;
&lt;p&gt;This free update is available on the &lt;a href="downloads.aspx" target="_self"&gt;downloads&lt;/a&gt; page.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ShippingProviders11</guid></item><item><title>A New Way to Move Your Database</title><pubDate>Thu, 18 Jan 2007 16:43:00 GMT</pubDate><description>&lt;p&gt;Sometimes you need to move your database:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You created your store locally, now you are ready to show the world 
&lt;li&gt;You run your store on webhost4life, and now you are ready for a "real" host &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Whatever your reason, the options you had were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You or your old host detach the database and send the files to your new host, then have your new host attach the database. 
&lt;li&gt;You or your old host take a full backup and send the backup to your new host, then have your new host restore the backup. 
&lt;li&gt;You write a complicated DTS job to copy the data from one database to another.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;All of these options require a lot of coordination between hosts or some pretty sophisticated database work when the DTS job fails.&lt;/p&gt;
&lt;p&gt;Now there is a new option: &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=29b4ffd8-ac3a-4481-b352-9b185619a901&amp;amp;displaylang=en&amp;amp;tm" target="_self"&gt;Microsoft SQL Server Database Publishing Wizard 1.0&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This free product will produce a script that completely recreates the database. Just take a snapshot of the current database, then run the script on the new server. Boom...you got your database. There is even a &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=b8133957-c210-4c24-9e05-308280f2c98d&amp;amp;displaylang=en&amp;amp;tm/" target="_self"&gt;web service &lt;/a&gt;that shared hosts (Resposio, Applied Innovation, StoreFront Hosting, ...) can&amp;nbsp;install that eliminates the second step. &lt;br /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/DatabasePublishingWizard</guid></item><item><title>Domain transfer part II: sfaddons.com</title><pubDate>Sat, 23 Dec 2006 22:56:00 GMT</pubDate><description>&lt;p&gt;I have been operating 3 domains for several months: sfaddons.com with components for StoreFront 6 by LaGarde, Inc.; bvcaddons.com with components for BV Commerce 2004 by BV Software, LLC, and structured-solutions.net with everything. &lt;br /&gt;&lt;br /&gt;All three domains are now consolidated into structured-solutions.net. All of the accounts and orders from sfaddons.com have been transferred to structured-solutions.net and sfaddons.com is now just an alias. &lt;/p&gt;
&lt;p&gt;Order numbers overlapped between sfaddons and the existing orders in structured-solutions.net, so I shifted the order numbers into an unused range by adding 4000. For example, if the order number was 1001 on sfaddons.com, it is now 5001 on structured-solutions.net.&lt;br /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/sfaddons</guid></item><item><title>Domain transfer part I: bvcaddons.com</title><pubDate>Sat, 23 Dec 2006 22:49:00 GMT</pubDate><description>&lt;p&gt;I have been operating 3 domains for several months: sfaddons.com with components for StoreFront 6 by LaGarde, Inc.; bvcaddons.com with components for BV Commerce 2004 by BV Software, LLC, and structured-solutions.net with everything.&lt;/p&gt;
&lt;p&gt;All three domains are now consolidated into structured-solutions.net.&amp;nbsp;All of the accounts and orders from bvcaddons.com have been transferred to structured-solutions.net and bvcaddons.com is now just an alias.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/bvcaddons</guid></item><item><title>Making the case for a shared (EV) SSL certificate</title><pubDate>Thu, 21 Dec 2006 22:10:00 GMT</pubDate><description>&lt;p&gt;Although shared SSL certificates have often been poo-pooed, a shared EV SSL certficate may be the only option for many small businesses. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2006/12/21/extended-validation-ev-ssl-and-small-businesses.aspx" target="_self"&gt;http://blogs.msdn.com/ie/archive/2006/12/21/extended-validation-ev-ssl-and-small-businesses.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/SharedEVSSL</guid></item><item><title>Reduce ViewState Size In ASP.NET 2.0</title><pubDate>Wed, 20 Dec 2006 18:01:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://aspadvice.com/blogs/robertb/archive/2005/11/16/13835.aspx" target="_self"&gt;Robert Boedigheimer&lt;/a&gt; showed how to move most of ViewState out of the __VIEWSTATE hidden input field and into Session using a PageAdapter. &lt;a href="http://szokelizer.blogsome.com/2006/11/09/how-to-put-controlstate-into-viewstate-and-how-to-put-viewstate-into-session/" target="_self"&gt;Peter Smulovics&lt;/a&gt; showed how to move the rest of ViewState (namely the ControlState) into Session using a base Page class and web.config. Here is how to do both with the PageAdapter.&lt;/p&gt;
&lt;p&gt;Create a new class in the App_Code folder:&lt;/p&gt;&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Inconsolata;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs24 \cf1 using\cf0  System.Web.UI;\par ??\cf1 using\cf0  System.Web.UI.Adapters;\par ??\par ??\cf1 public\cf0  \cf1 class\cf0  \cf4 PageStateAdapter\cf0  : \cf4 PageAdapter\par ??\cf0 \{\par ??    \cf1 public\cf0  \cf1 override\cf0  \cf4 PageStatePersister\cf0  GetStatePersister()\par ??    \{\par ??        \cf1 return\cf0  \cf1 new\cf0  \cf4 SessionPageStatePersister\cf0 (\cf1 this\cf0 .Page);\par ??    \}\par ??\}\par ??}
--&gt;
&lt;div style="FONT-SIZE: 12pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Inconsolata"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Web.UI;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Web.UI.Adapters;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;PageStateAdapter&lt;/span&gt; : &lt;span style="COLOR: #2b91af"&gt;PageAdapter&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;override&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;PageStatePersister&lt;/span&gt; GetStatePersister()&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;SessionPageStatePersister&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Page);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Create a new .browser file in the App_Browsers folder:&lt;/p&gt;&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Inconsolata;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red163\green21\blue21;\red255\green0\blue0;\red0\green0\blue0;}??\fs24 \cf1 &amp;lt;\cf3 browsers\cf1 &amp;gt;\par ??  &amp;lt;\cf3 browser\cf1  \cf4 refID\cf1 =\cf0 "\cf1 Default\cf0 "\cf1 &amp;gt;\par ??    &amp;lt;\cf3 controlAdapters\cf1 &amp;gt;\par ??      &amp;lt;\cf3 adapter\cf1  \cf4 controlType\cf1 =\cf0 "\cf1 System.Web.UI.Page\cf0 "\cf1  \cf4 adapterType\cf1 =\cf0 "\cf1 PageStateAdapter\cf0 "\cf1  /&amp;gt;\par ??    &amp;lt;/\cf3 controlAdapters\cf1 &amp;gt;\par ??    &amp;lt;\cf3 capabilities\cf1 &amp;gt;\par ??      &amp;lt;\cf3 capability\cf1  \cf4 name\cf1 =\cf0 "\cf1 requiresControlStateInSession\cf0 "\cf1  \cf4 value\cf1 =\cf0 "\cf1 true\cf0 "\cf1  /&amp;gt;\par ??    &amp;lt;/\cf3 capabilities\cf1 &amp;gt;\par ??  &amp;lt;/\cf3 browser\cf1 &amp;gt;\par ??&amp;lt;/\cf3 browsers\cf1 &amp;gt;\par ??}
--&gt;
&lt;div style="FONT-SIZE: 12pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Inconsolata"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;browsers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;browser&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;refID&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;Default&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;controlAdapters&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;adapter&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;controlType&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;System.Web.UI.Page&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;adapterType&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;PageStateAdapter&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;controlAdapters&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;capabilities&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;capability&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;name&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;requiresControlStateInSession&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;capabilities&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;browser&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;browsers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Done.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ReduceViewStateSizeinASPNET20</guid></item><item><title>Anthem validation changes coming soon</title><pubDate>Mon, 13 Nov 2006 22:15:00 GMT</pubDate><description>&lt;p&gt;If you have used Anthem on a complicated page with client side validation, you have probably run into some problems. This weekend I reworked validation support in Anthem and I think I fixed all of the reported bugs. The changes I made will probably break some pages. In keeping with Anthem project convention, that means the next release of Anthem will be 1.4.&lt;/p&gt;
&lt;p&gt;I'm going to spend the next week reviewing the &lt;a href="http://sourceforge.net/tracker/?atid=782467&amp;amp;group_id=151897" target=""&gt;feature requests in SourceForge&lt;/a&gt; and incorporating some of the best. If you have have something you really, really need in the base library then please post it soon or post a comment on one of the existing requests.&lt;/p&gt;
&lt;p&gt;I will not be touching the AnthemExtensions namespace, just the base library. I'll post another note when Anthem 1.4 is in the snapshot.&lt;br /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/AnthemValidation</guid></item><item><title>Excellent law article regarding online pricing errors</title><pubDate>Sat, 11 Nov 2006 01:25:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://www.lctjournal.washington.edu/vol1/a002Groebner.html" target="_self"&gt;http://www.lctjournal.washington.edu/vol1/a002Groebner.html&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/PricingErrors</guid></item><item><title>Microsoft .NET Framework 3.0</title><pubDate>Tue, 07 Nov 2006 03:36:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=10cc340b-f857-4a14-83f5-25634c3bf043&amp;amp;displaylang=en" target="_self"&gt;Microsoft .NET Framework 3.0&lt;/a&gt; is out.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/NET30</guid></item><item><title>How to Create a BVC5 Order Workflow Task</title><pubDate>Fri, 03 Nov 2006 22:26:00 GMT</pubDate><description>&lt;p&gt;Several workflow tasks are included in BVC5 to perform work such as sending an email or marking the order complete. When I test &lt;a href="ProductInfo.aspx?productid=SHIPPER-SERVICE" target="_self"&gt;Shipper Service for BVC5&lt;/a&gt; I want to make sure that the appropriate workflows&amp;nbsp;are run. Setting breakpoints in a debugger&amp;nbsp;works but is very tedious. So I created the "Add Order Note" task and put it at the beginning of each workflow I was tracking. After processing&amp;nbsp;a shipment, I&amp;nbsp;can display the order details and see at a glance which workflows were run and in what order. This article describes how to create the "Add Order Note" workflow task.&lt;/p&gt;
&lt;p&gt;The "Add Order Note" task has two parts:&amp;nbsp;the task processor and the task editor. Some tasks such as "Update Order"&amp;nbsp;have&amp;nbsp;no settings and no need for an editor. Tasks like "Add Order Note" can be customized and therefore have an editor.&lt;/p&gt;
&lt;h4&gt;Creating the Task Processor&lt;/h4&gt;
&lt;p&gt;An order task is pretty straightforward. Create a new class in your web site's App_Code directory that inherits from BVSoftware.Bvc5.Core.BusinessRules.OrderTask. At the very least the task must override the Clone, Execute, Rollback, TaskId, and TaskName methods. The "Add Order Note" task also overrides the StepName method so that we can give the step a unique name within a workflow.&lt;/p&gt;
&lt;h5&gt;Figure 1. AddOrderNote.vb&lt;/h5&gt;
&lt;style type="text/css"&gt;.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; border:1px solid #000; padding: 1em; }.cl { margin: 0px; }.cb1 { color: blue; }.cb2 { color: maroon; }&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Imports&lt;/span&gt; BVSoftware.Bvc5.Core&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Imports&lt;/span&gt; BVSoftware.Bvc5.Core.BusinessRules&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Imports&lt;/span&gt; BVSoftware.Bvc5.Core.Orders&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Class&lt;/span&gt; AddOrderNote&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Inherits&lt;/span&gt; OrderTask&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; Clone() _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;As&lt;/span&gt; BVSoftware.Bvc5.Core.BusinessRules.Task&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb1"&gt;New&lt;/span&gt; AddOrderNote&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overloads&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; Execute( _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;ByVal&lt;/span&gt; context &lt;span class="cb1"&gt;As&lt;/span&gt; OrderTaskContext) _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Boolean&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Dim&lt;/span&gt; note &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;New&lt;/span&gt; OrderNote()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;If&lt;/span&gt; &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.GetBooleanSetting(&lt;span class="cb2"&gt;"Private"&lt;/span&gt;, &lt;span class="cb1"&gt;True&lt;/span&gt;) &lt;span class="cb1"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; note.NoteType = OrderNoteType.Private&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Else&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; note.NoteType = OrderNoteType.Public&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; note.Note = &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.GetSetting(&lt;span class="cb2"&gt;"Note"&lt;/span&gt;, &lt;span class="cb2"&gt;"&amp;lt;empty&amp;gt;"&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;If&lt;/span&gt; context.Order.AddNote(note) &lt;span class="cb1"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb1"&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Else&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; context.Errors.Add( _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;New&lt;/span&gt; WorkflowMessage(&lt;span class="cb2"&gt;"Add Note Failed"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Add note failed for order "&lt;/span&gt; &amp;amp; context.Order.OrderNumber, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;False&lt;/span&gt;))&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb1"&gt;False&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Catch&lt;/span&gt; ex &lt;span class="cb1"&gt;As&lt;/span&gt; Exception&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; context.Errors.Add( _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;New&lt;/span&gt; WorkflowMessage(&lt;span class="cb2"&gt;"Add Note Failed"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Add note failed for order "&lt;/span&gt; _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; context.Order.OrderNumber _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; &lt;span class="cb2"&gt;". "&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ex.Message, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;False&lt;/span&gt;))&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb1"&gt;False&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overloads&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; Rollback( _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;ByVal&lt;/span&gt; context &lt;span class="cb1"&gt;As&lt;/span&gt; OrderTaskContext) _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Boolean&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb1"&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; TaskId() &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb2"&gt;"26AE4A5B-F20A-4B96-AA45-95A546E62BA3"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; TaskName() &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb2"&gt;"Add Order Note"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; StepName() &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.GetSetting(&lt;span class="cb2"&gt;"StepName"&lt;/span&gt;, &lt;span class="cb1"&gt;Me&lt;/span&gt;.TaskName)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Creating the Task Editor&lt;/h4&gt;
&lt;p&gt;As you can see in Figure 1,&amp;nbsp;the "Add Order Note" task has&amp;nbsp;three settings: "Note", "Private", and "StepName". The Task Editor is used to edit those settings. To create the editor, first make a new folder in BVModules/OrderTasks with the same name as the task ("Add Order Note"). Next create a new Web User Control called Edit.ascx that inherits from BVSoftware.Bvc5.Core.Content.BVModule. The editor should be coded to display and save the "Note", "Private", and "StepName" settings and then call the NotifyFinishedEditing() when done.&lt;/p&gt;
&lt;h5&gt;Figure 2. Edit.ascx&lt;/h5&gt;
&lt;style type="text/css"&gt;.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; border:1px solid #000; padding: 1em; }.cl { margin: 0px; }.cb1 { color: blue }.cb2 { color: blue; }.cb3 { color: maroon; }.cb4 { color: red; }&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="cb2"&gt;@&lt;/span&gt; &lt;span class="cb3"&gt;Control&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;AutoEventWireup&lt;/span&gt;&lt;span class="cb2"&gt;="false"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;CodeFile&lt;/span&gt;&lt;span class="cb2"&gt;="Edit.ascx.vb"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;Inherits&lt;/span&gt;&lt;span class="cb2"&gt;="BVModules_OrderTasks_Add_Order_Note_Edit"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;Language&lt;/span&gt;&lt;span class="cb2"&gt;="VB"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;table&lt;/span&gt; &lt;span class="cb4"&gt;border&lt;/span&gt;&lt;span class="cb2"&gt;="0"&lt;/span&gt; &lt;span class="cb4"&gt;cellspacing&lt;/span&gt;&lt;span class="cb2"&gt;="0"&lt;/span&gt; &lt;span class="cb4"&gt;cellpadding&lt;/span&gt;&lt;span class="cb2"&gt;="3"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formlabel"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Label&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="StepNameLabel"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;AssociatedControlID&lt;/span&gt;&lt;span class="cb2"&gt;="StepNameField"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;Text&lt;/span&gt;&lt;span class="cb2"&gt;="Step Name:"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formfield"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;TextBox&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="StepNameField"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formlabel"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Label&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="PrivateFieldLabel"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;AssociatedControlID&lt;/span&gt;&lt;span class="cb2"&gt;="PrivateField"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;Text&lt;/span&gt;&lt;span class="cb2"&gt;="Private:"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formfield"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;CheckBox&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="PrivateField"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formlabel"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;Label&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="NoteLabel"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;AssociatedControlID&lt;/span&gt;&lt;span class="cb2"&gt;="NoteField"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;Text&lt;/span&gt;&lt;span class="cb2"&gt;="Note:"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formfield"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;TextBox&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="NoteField"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;TextMode&lt;/span&gt;&lt;span class="cb2"&gt;="MultiLine"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formlabel"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;ImageButton&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="btnCancel"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;CausesValidation&lt;/span&gt;&lt;span class="cb2"&gt;="false"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;ImageUrl&lt;/span&gt;&lt;span class="cb2"&gt;="~/BVAdmin/Images/Buttons/Cancel.png"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt; &lt;span class="cb4"&gt;class&lt;/span&gt;&lt;span class="cb2"&gt;="formfield"&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb3"&gt;asp&lt;/span&gt;&lt;span class="cb2"&gt;:&lt;/span&gt;&lt;span class="cb3"&gt;ImageButton&lt;/span&gt; &lt;span class="cb4"&gt;ID&lt;/span&gt;&lt;span class="cb2"&gt;="btnSave"&lt;/span&gt; &lt;span class="cb4"&gt;runat&lt;/span&gt;&lt;span class="cb2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb4"&gt;ImageUrl&lt;/span&gt;&lt;span class="cb2"&gt;="~/BVAdmin/Images/Buttons/SaveChanges.png"&lt;/span&gt; &lt;span class="cb2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;td&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;tr&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb3"&gt;table&lt;/span&gt;&lt;span class="cb2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h5&gt;Figure 3. Edit.ascx.vb&lt;/h5&gt;
&lt;style type="text/css"&gt;.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; border:1px solid #000; padding: 1em; }.cl { margin: 0px; }.cb1 { color: blue; }.cb2 { color: maroon; }&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Imports&lt;/span&gt; BVSoftware.Bvc5.Core&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Imports&lt;/span&gt; BVSoftware.Bvc5.Core.Content&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Partial&lt;/span&gt; &lt;span class="cb1"&gt;Class&lt;/span&gt; BVModules_OrderTasks_Add_Order_Note_Edit&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Inherits&lt;/span&gt; BVModule&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Protected&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt; Page_Load(&lt;span class="cb1"&gt;ByVal&lt;/span&gt; sender &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Object&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;ByVal&lt;/span&gt; e &lt;span class="cb1"&gt;As&lt;/span&gt; System.EventArgs) _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Handles&lt;/span&gt; &lt;span class="cb1"&gt;Me&lt;/span&gt;.Load&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;If&lt;/span&gt; &lt;span class="cb1"&gt;Not&lt;/span&gt; Page.IsPostBack &lt;span class="cb1"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DataBind()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Protected&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt; btnCancel_Click(&lt;span class="cb1"&gt;ByVal&lt;/span&gt; sender &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Object&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;ByVal&lt;/span&gt; e &lt;span class="cb1"&gt;As&lt;/span&gt; System.Web.UI.ImageClickEventArgs) _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Handles&lt;/span&gt; btnCancel.Click&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;MyBase&lt;/span&gt;.NotifyFinishedEditing()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Protected&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt; btnSave_Click(&lt;span class="cb1"&gt;ByVal&lt;/span&gt; sender &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Object&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;ByVal&lt;/span&gt; e &lt;span class="cb1"&gt;As&lt;/span&gt; System.Web.UI.ImageClickEventArgs) _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Handles&lt;/span&gt; btnSave.Click&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SaveData()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.NotifyFinishedEditing()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt; DataBind()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;MyBase&lt;/span&gt;.DataBind()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.StepNameField.Text = &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.GetSetting(&lt;span class="cb2"&gt;"StepName"&lt;/span&gt;, &lt;span class="cb1"&gt;String&lt;/span&gt;.Empty)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.PrivateField.Checked = &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.GetBooleanSetting(&lt;span class="cb2"&gt;"Private"&lt;/span&gt;, &lt;span class="cb1"&gt;True&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.NoteField.Text = &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.GetSetting(&lt;span class="cb2"&gt;"Note"&lt;/span&gt;, &lt;span class="cb1"&gt;String&lt;/span&gt;.Empty)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Private&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt; SaveData()&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.SaveSetting(&lt;span class="cb2"&gt;"StepName"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.StepNameField.Text.Trim, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Structured Solutions"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Order Tasks"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Add Order Note"&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.SaveBooleanSetting(&lt;span class="cb2"&gt;"Private"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.PrivateField.Checked, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Structured Solutions"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Order Tasks"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Add Order Note"&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.SettingsManager.SaveSetting(&lt;span class="cb2"&gt;"Note"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Me&lt;/span&gt;.NoteField.Text.Trim, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Structured Solutions"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Order Tasks"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;"Add Order Note"&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Add the Task to TaskLoader&lt;/h4&gt;
&lt;p&gt;The last step is to add the task to TaskLoader.vb.&lt;/p&gt;
&lt;h5&gt;Figure 4. Partial TaskLoader.vb&lt;/h5&gt;
&lt;style type="text/css"&gt;.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; border:1px solid #000; padding: 1em; }.cl { margin: 0px; }.cb1 { color: blue; }&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Shared&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; LoadOrderTasks() &lt;span class="cb1"&gt;As&lt;/span&gt; Collection(&lt;span class="cb1"&gt;Of&lt;/span&gt; BusinessRules.OrderTask)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Dim&lt;/span&gt; result &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;New&lt;/span&gt; Collection(&lt;span class="cb1"&gt;Of&lt;/span&gt; BusinessRules.OrderTask)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(&lt;span class="cb1"&gt;New&lt;/span&gt; AddOrderNote)&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Using the Task&lt;/h4&gt;
&lt;p&gt;Follow these steps to&amp;nbsp;add the new "Add Order Note" task to a workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select Options &amp;gt; Workflow from the BV Admin menu 
&lt;li&gt;Click on the Edit link next to a workflow. 
&lt;li&gt;Select "Add Order Note" and then click on the New button. 
&lt;li&gt;Click on the Edit button next to the new "Add Order Note" task. 
&lt;li&gt;Enter a task name. 
&lt;li&gt;Check Private if you want a private note or leave it unchecked if you want a public note. 
&lt;li&gt;Enter the text of the Note. 
&lt;li&gt;Click on the Save Changes button. 
&lt;li&gt;Click on the OK button.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Now every time the workflow is run,&amp;nbsp;your note will be added to the order.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Bvc5OrderWorkflowTask</guid></item><item><title>Anthem is one of Scott's Favorites</title><pubDate>Fri, 03 Nov 2006 18:17:00 GMT</pubDate><description>&lt;p&gt;Anthem.NET is on Scott Watermasysk's list of &lt;a href="http://scottwater.com/blog/archive/top-five-developer-api-s.aspx" target="_self"&gt;Top Five Developer API's&lt;/a&gt;.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/AnthemIsAFavorite</guid></item><item><title>How to Create a BVC5 Offer Plugin</title><pubDate>Mon, 30 Oct 2006 00:14:00 GMT</pubDate><description>&lt;p&gt;BV Commerce 5 includes support for plugins to provide custom order processing (workflow), product workflow, payment methods, shipping rate methods, discounts, and more. This article walks through the steps to create a custom offer with the following rule: if the customer purchases at least X amount, then up to Y quantity of products Z are free.&lt;/p&gt;
&lt;h4&gt;Step 1 - Pick a Name&lt;/h4&gt;
&lt;p&gt;This offer is going to have an editor so you can set X, Y, and Z in the rule shown above. For BVC5 to find the editor,&amp;nbsp;you need to create a subdirectory with the same name as&amp;nbsp;the offer. This offer is called "Sample Offer", so create a directory in the BVModules/Offers directory called "Sample Offer".&lt;/p&gt;
&lt;h4&gt;Step 2 - Create the Offer Code&lt;/h4&gt;
&lt;p&gt;To create&amp;nbsp;a custom offer, you just need to implement a new public class that inherits from BVSoftware.Bvc5.Core.Marketing.OfferTaskProcessorBase, then override Execute, GetSettings, and GetPriority. To create the Sample Offer, copy the attached copy of SampleOffer.vb to the App_Code directory of your web site.&lt;/p&gt;
&lt;p&gt;GetPriority is called by BVC5 to determine the order in which multiple offers are processed. Lower values are processed first. There are several "standard" values that you can use include: Shipping (20), Product (40), BuyOneGetOne (60), and OrderTotal (80). Since Sample Offer affects the order totals, GetPriority returns OrderTotal.&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; GetPriority() &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Byte&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; PriorityLevels.OrderTotal&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;GetSettings is called by BVC5 before Execute and is used to retrieve the specific settings for the custom offer. The Sample Offer has 3 specific settings: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The minimum order amount which must be greater than $0. This offer will not apply if the order amount is less than the minimum order amount. 
&lt;li&gt;The list of products that are being offered for free. 
&lt;li&gt;The maximum quantity which must be greater than 0. This is the maximum number of each free product that will be offered in each order. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;These are retrieved using the following code:&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: maroon; }
&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt; GetSettings(&lt;span class="cb1"&gt;ByVal&lt;/span&gt; context &lt;span class="cb1"&gt;As&lt;/span&gt; OrderTaskContext)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _maximumQuantity = SettingsManager.GetIntegerSetting(&lt;span class="cb2"&gt;"MaximumQuantity"&lt;/span&gt;, 1)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _minimumAmount = SettingsManager.GetDecimalSetting(&lt;span class="cb2"&gt;"MinimumAmount"&lt;/span&gt;, 0)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _products = SettingsManager.GetSettingList(&lt;span class="cb2"&gt;"FreeProducts"&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Execute is called by BVC5 to calculate the actual discount. Execute is responsible for figuring out if the order meets the specific requirements of the offer and then calculating the discount:&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: green; }
.cb3 { color: maroon; }
&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Public&lt;/span&gt; &lt;span class="cb1"&gt;Overrides&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt; Execute(&lt;span class="cb1"&gt;ByVal&lt;/span&gt; context &lt;span class="cb1"&gt;As&lt;/span&gt; OrderTaskContext) &lt;span class="cb1"&gt;As&lt;/span&gt; DiscountQueue&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Dim&lt;/span&gt; discounts &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;New&lt;/span&gt; DiscountQueue&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;' This offer is only good if the order total is equal to or above&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;' a set amount. This code calculates the order amount, not including&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;' the free products.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Dim&lt;/span&gt; subtotal &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Decimal&lt;/span&gt; = context.Order.SubTotal&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;For&lt;/span&gt; &lt;span class="cb1"&gt;Each&lt;/span&gt; lineitem &lt;span class="cb1"&gt;As&lt;/span&gt; LineItem &lt;span class="cb1"&gt;In&lt;/span&gt; context.Order.Items&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;For&lt;/span&gt; &lt;span class="cb1"&gt;Each&lt;/span&gt; setting &lt;span class="cb1"&gt;As&lt;/span&gt; ComponentSettingListItem &lt;span class="cb1"&gt;In&lt;/span&gt; _products&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;If&lt;/span&gt; &lt;span class="cb1"&gt;String&lt;/span&gt;.Compare(setting.Setting1, lineitem.ProductId, &lt;span class="cb1"&gt;True&lt;/span&gt;) = 0 &lt;span class="cb1"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; subtotal -= lineitem.BasePrice&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;' If the minimum order amount is met, then mark each free item&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb2"&gt;' in the order by adding a discount up to the maximum quantity.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;If&lt;/span&gt; subtotal &amp;gt;= _minimumAmount &lt;span class="cb1"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;For&lt;/span&gt; &lt;span class="cb1"&gt;Each&lt;/span&gt; lineitem &lt;span class="cb1"&gt;As&lt;/span&gt; LineItem &lt;span class="cb1"&gt;In&lt;/span&gt; context.Order.Items&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;For&lt;/span&gt; &lt;span class="cb1"&gt;Each&lt;/span&gt; setting &lt;span class="cb1"&gt;As&lt;/span&gt; ComponentSettingListItem &lt;span class="cb1"&gt;In&lt;/span&gt; _products&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;If&lt;/span&gt; &lt;span class="cb1"&gt;String&lt;/span&gt;.Compare(setting.Setting1, lineitem.ProductId, &lt;span class="cb1"&gt;True&lt;/span&gt;) = 0 &lt;span class="cb1"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Dim&lt;/span&gt; quantity &lt;span class="cb1"&gt;As&lt;/span&gt; &lt;span class="cb1"&gt;Decimal&lt;/span&gt; = 0&lt;/pre&gt;&lt;pre class="cl"&gt;                        quantity = Math.Min(lineitem.Quantity, _maximumQuantity)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; discounts.AddDiscount(&lt;span class="cb3"&gt;"OrderDiscounts"&lt;/span&gt;, _&lt;/pre&gt;&lt;pre class="cl"&gt;                          lineitem.BasePrice * quantity, _&lt;/pre&gt;&lt;pre class="cl"&gt;                          DiscountQueueItemType.Order)&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;Return&lt;/span&gt; discounts&lt;/pre&gt;&lt;pre class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;End&lt;/span&gt; &lt;span class="cb1"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you add a discount you can use&amp;nbsp;a lineitem bvin if you want the discount to apply to a specific line item (but it will apply to every occurrence of the line item), "OrderDiscounts" if you want the discount to apply to the order subtotal, or "ShippingDiscounts" if you want the discount to apply to the shipping amount. Our Sample Offer applies to the order subtotal (not the lineitem since there is a maximum quantity that is discounted).&lt;/p&gt;
&lt;h4&gt;Step 3 - Tell BVC5 to Load the Custom Offer Code&lt;/h4&gt;
&lt;p&gt;Edit App_Code/TaskLoader.vb, find the LoadOrderTaskProcessors method and add the custom offer:&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: maroon; }
&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;result.Add(&lt;span class="cb1"&gt;New&lt;/span&gt; ProcessorComponentPair(&lt;span class="cb2"&gt;"Sample Offer"&lt;/span&gt;, &lt;span class="cb1"&gt;GetType&lt;/span&gt;(SampleOffer)))&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Step&amp;nbsp;4 - Create&amp;nbsp;the Offer&amp;nbsp;Editor Code&lt;/h4&gt;
&lt;p&gt;The editor is&amp;nbsp;used by BVC5 to edit the settings of the offer. Every offer has some common settings such as the effective dates, and some specific settings. The Special Offer editor only needs to edit the specific settings.&lt;/p&gt;
&lt;p&gt;To create the Sample Offer editor, copy the attached files called Edit.ascx and Edit.ascx.vb into the directory called BVModules/Offers. Edit.ascx has 3 fields called MinimumAmountField, MaximumQuantityField, and FreeProducts. To build the list of FreeProducts, Edit.ascx includes the ProductPicker user control that is included with BVC5.&lt;/p&gt;
&lt;p&gt;Edit.ascx.vb has the code used to read and save the specific settings for our offer. To be recognized by BVC5, the offer editor must inherit from OfferTemplate and then override&amp;nbsp;three methods: Initialize, Save, and Cancel. Initialize is called before the editor is displayed and is used to read the settings. Save is called when the merchant clicks on the Save Settings button and is used to save the settings. Cancel is callled when the merchant clicks on the Cancel button and can be used to reset values. The Sample Offer editor code also overrides the DataBind method to display the list of free products.&lt;/p&gt;
&lt;h4&gt;Step 5 - Create a Custom Offer&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Select the Marketing tab from the BVAdmin page. 
&lt;li&gt;Select Offers from the Marketing menu. 
&lt;li&gt;Select Sample Offer and then click on the New button. 
&lt;li&gt;Enter the minimum order amount and maximum free quantity, then pick the free products. 
&lt;li&gt;Click on the Save Changes button to create the offer.&lt;/li&gt;&lt;/ol&gt;
&lt;h4&gt;Step 6 - Test the Custom Offer&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Go to the store and start a new order that includes the free products and not free products. 
&lt;li&gt;Adjust the quantity of the not free products until the order total meets the minimum order amount.&lt;/li&gt;&lt;/ol&gt;
&lt;h4&gt;Attachments&lt;/h4&gt;
&lt;p&gt;&lt;a href="content/binary/SampleOffer.zip" target="_self"&gt;SampleOffer.zip&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Bvc5OfferPlugin</guid></item><item><title>Running BVC5 with Medium-like Trust</title><pubDate>Sat, 30 Sep 2006 02:35:00 GMT</pubDate><description>&lt;p&gt;The policy file below is for running BVC5 in a surgically modified Medium Trust environment. Each change is documented. Three assemblies that need special treatment are singled out to limit your exposure.&lt;/p&gt;
&lt;p&gt;Policy file: &lt;a href="downloads/bvc5/web_mediumbvc5.zip" target="_self"&gt;web_mediumbvc5.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/BVC5MediumTrust</guid></item><item><title>DHL Shipping Rate Provider for BVC5 RC2</title><pubDate>Sat, 30 Sep 2006 02:08:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="ProductInfo.aspx?productid=DHLPROV-5" target="_self"&gt;DHL US Shipping Rate Provider for BV Commerce 5&lt;/a&gt; has been updated to work in a modified Medium Trust web site. The policy file below has been surgically modified to add just the specific changes required to run BVC5 and DHL US Shipping Rate Provider. To use the policy file add the following to the web.config file in the same directory:&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: maroon; }
.cb3 { color: red; }
&lt;/style&gt;

&lt;div class="cf"&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;securityPolicy&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;trustLevel&lt;/span&gt;&lt;span class="cb1"&gt; &lt;/span&gt;&lt;span class="cb3"&gt;name&lt;/span&gt;&lt;span class="cb1"&gt;=&lt;/span&gt;"&lt;span class="cb1"&gt;Bvc5&lt;/span&gt;"&lt;span class="cb1"&gt; &lt;/span&gt;&lt;span class="cb3"&gt;policyFile&lt;/span&gt;&lt;span class="cb1"&gt;=&lt;/span&gt;"&lt;span class="cb1"&gt;web_mediumbvc5.config&lt;/span&gt;"&lt;span class="cb1"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;securityPolicy&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="cl"&gt;&lt;span class="cb1"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;trust&lt;/span&gt;&lt;span class="cb1"&gt; &lt;/span&gt;&lt;span class="cb3"&gt;level&lt;/span&gt;&lt;span class="cb1"&gt;=&lt;/span&gt;"&lt;span class="cb1"&gt;Bvc5&lt;/span&gt;"&lt;span class="cb1"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Of course DHL US Shipping Rate Provider also works in a Full Trust environment.&lt;/p&gt;
&lt;p&gt;Policy file: &lt;a href="downloads/bvc5/web_mediumbvc5.zip" target="_self"&gt;web_mediumbvc5.zip&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/DHLProviderRC2</guid></item><item><title>ANN: SignIn Control version 1.4.0.5</title><pubDate>Mon, 17 Jul 2006 20:14:00 GMT</pubDate><description>&lt;p&gt;SignIn Control version 1.4.0.5 is now available. This free maintenance release has a workaround for an intermittent issue that may crop up if you have both StoreFront 6.8 and PENDX Streamlined Checkout installed.&lt;/p&gt;
&lt;p&gt;&lt;a href="downloads/storefront/SignInControl.exe" target="_self"&gt;download&lt;/a&gt; |&amp;nbsp;&lt;a href="ProductInfo.aspx?productid=SIGNIN-SF" target="_self"&gt;purchase&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Signin1405</guid></item><item><title>ANN: Froogle Feed Maintenance Release 1.5.3</title><pubDate>Sat, 01 Jul 2006 01:36:00 GMT</pubDate><description>&lt;p&gt;Froogle Feed release 1.5.3.1 is now available. This is a free update for all current license owners. The most significant change is a new FTP library, which works much better with Google's new FTP server at uploads.google.com.&lt;/p&gt;
&lt;p&gt;If you are updating an existing copy of Froogle Feed on your site, please copy all the files from both the bin and ssaddons directories to your web site (see the documentation for details). Several files changed in both directories. After you install this update, you can remove FTPLibrary.dll. It is no longer used.&lt;/p&gt;
&lt;p&gt;As always, you can download the latest release from the original order in your account. Sign on at &lt;a href="http://www.sfaddons.com/CustProfileMain.aspx"&gt;http://www.sfaddons.com/CustProfileMain.aspx&lt;/a&gt;, select Order History, then view the Order Details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated 7/11/2006&lt;/strong&gt;: New build has a minor fix to handle a change in the way inventory is reported in StoreFront 6.8. This will affect you if you track inventory at the attribute level. Note that Froogle Feed does not report variations as separate products.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Froogle153</guid></item><item><title>Rash of Froogle Feed Connecton Problems</title><pubDate>Wed, 28 Jun 2006 19:57:00 GMT</pubDate><description>&lt;p&gt;There has been rash of reports lately of the error "No connection could be made because the target machine actively refused it" when sending a Froogle Feed. I have been getting the same error for the last few days. Today I tried sending the&amp;nbsp;feed manually 5 times and it went through once (the other&amp;nbsp;4 failed with the same error).&lt;/p&gt;
&lt;p&gt;I've contacted Google to see if this is a known problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update #1&lt;/strong&gt;: Ray Hall sent me some information that helps explain some of the odd behavior. First this thread in Google Groups describes at least some of the problem:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/base-help-bulk/browse_frm/thread/5e845b6b07763afb/"&gt;http://groups.google.com/group/base-help-bulk/browse_frm/thread/5e845b6b07763afb/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Second, Ray recommends creating a new FTP username and password instead of using the old Froogle username and password.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update #2&lt;/strong&gt;: Ray also reminded me that Google now recommends that you use the server name uploads.google.com instead of hedwig.google.com.&lt;/p&gt;
&lt;p&gt;I should point out that changing the server name and creating a new FTP username and password did not solve the "No connection could be made..." error for me. I get about the same success rate using either the new or old server name and either the new or old username and password.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update #3&lt;/strong&gt;: &lt;a href="Froogle153" target="_self"&gt;Froogle Feed 1.5.3&lt;/a&gt; uses a new FTP library which seems to work much better with Google's new FTP server at uploads.google.com. I strongly encourage you to install the new release.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ActivelyRefused</guid></item><item><title>ANN: Froogle Feed Maintenance Release 1.5.2</title><pubDate>Wed, 21 Jun 2006 21:39:00 GMT</pubDate><description>&lt;p&gt;This free maintenance release includes a fix for the bug that caused the Trial message to remain visible after installing the licensed version. If you have already installed version Froogle Feed 1.5, then you only need to replace SSFroogle.dll in the bin directory (or directories) with the new one in the latest build.&lt;/p&gt;
&lt;p&gt;If you currently own a license for Froogle Feed, you can always download the latest release from the original order details page. To reach the order details page, sign on to your account, select Order History, and then click on the Details button for the order.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Froogle152</guid></item><item><title>Adding an image to FogBugz email reply</title><pubDate>Mon, 12 Jun 2006 19:10:00 GMT</pubDate><description>&lt;p&gt;My &lt;a href="FogBugzandSnagItMashup" target="_self"&gt;SnagIt based screenshot utiltiy for FogBugz&lt;/a&gt; has the option of attaching your image to an email reply. This is not supported by the FogBugz screenshot utiltity and requires a small change to screenshot.asp on your server shown here for FogBugz 5:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make a backup copy of screenshot.asp.&lt;/li&gt;
&lt;li&gt;Find this line:&lt;br /&gt;&lt;br /&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;pre style="MARGIN: 0px"&gt;EditBugPage &lt;span style="COLOR: maroon"&gt;"edit"&lt;/span&gt;, ixBugEventLatest, &lt;span style="COLOR: maroon"&gt;""&lt;/span&gt;, False, False, ixScreenshot&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Replace it with these lines:&lt;br /&gt;&lt;br /&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;pre style="MARGIN: 0px"&gt;If IntRequest(&lt;span style="COLOR: maroon"&gt;"fReply"&lt;/span&gt;) = &lt;span style="COLOR: maroon"&gt;"1"&lt;/span&gt; Then&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;  EditBugPage &lt;span style="COLOR: maroon"&gt;"reply"&lt;/span&gt;, ixBugEventLatest, &lt;span style="COLOR: maroon"&gt;""&lt;/span&gt;, False, False, ixScreenshot&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;Else&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;  EditBugPage &lt;span style="COLOR: maroon"&gt;"edit"&lt;/span&gt;, ixBugEventLatest, &lt;span style="COLOR: maroon"&gt;""&lt;/span&gt;, False, False, ixScreenshot&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;End If&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;I don't have the PHP version of FogBugz, but I imagine the change is very similar. Readers have told me that my screenshot utility works with both the ASP and PHP versions of FogBugz.&lt;/p&gt;
&lt;p&gt;If you do not make the change shown above, selecting "Reply to existing case" will give you the same effect as "Attach to existing case".&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/FogBugz5Reply</guid></item><item><title>ANN: Froogle Feed Maintenance Release 1.5</title><pubDate>Wed, 07 Jun 2006 19:22:00 GMT</pubDate><description>&lt;p&gt;This free maintenance replaces the Froogle feed field names with the new &lt;a href="http://base.google.com/support/bin/answer.py?answer=40449" target="_self"&gt;Google Base attributes&lt;/a&gt;. If you already own a license to Froogle Feed, you can download the new build from the order details page. You can grab a copy of the trial version from the &lt;a href="downloads.aspx" target="_self"&gt;downloads&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;Note that Google changed the name of their upload server from hedwig.google.com to uploads.google.com. Although the old name still works for now, you should probably change the FTP Server name on the Froogle Feed Account/Feed Control tab.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Froogle15</guid></item><item><title>ANN: Customer Pickup Control Maintenance Release 1.1.0.8</title><pubDate>Wed, 24 May 2006 18:55:00 GMT</pubDate><description>&lt;p&gt;This free maintenance release includes a minor change to support pickup addresses without a state or region. This is implemented by treating the "N/A" region as equivalent to an empty region. For example, if your pickup address previously specified State="N/A", you can now specify State="" or even leave out the State.&lt;/p&gt;
&lt;p&gt;Existing customers can download the new build from the link in the original order details page. You will need to sign on to your account&amp;nbsp;to display the order history.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/CustomerPickup118</guid></item><item><title>Unit Testing Anthem with Selenium </title><pubDate>Tue, 16 May 2006 08:24:00 GMT</pubDate><description>&lt;p&gt;Saw &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/05/14/144666.aspx" target="_self"&gt;this post&lt;/a&gt; today, so I installed &lt;a href="http://www.openqa.org/selenium-rc/" target="_self"&gt;Selenium Remote Control&lt;/a&gt; and wrote these unit tests in about an hour. Nice!&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 11pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt; }
.cl { margin: 0px; }
.cb1 { color: blue; }
&lt;/style&gt;

&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;using&lt;/span&gt; System;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;using&lt;/span&gt; System.Configuration;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;using&lt;/span&gt; NUnit.Framework;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;using&lt;/span&gt; Selenium;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;namespace&lt;/span&gt; Anthem_Tests&lt;/p&gt;
&lt;p class="cl"&gt;{&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestFixture]&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;class&lt;/span&gt; ButtonsAndLabels&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultSelenium selenium;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [SetUp]&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;void&lt;/span&gt; SetUp()&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium = &lt;span class="cb1"&gt;new&lt;/span&gt; DefaultSelenium(&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ConfigurationManager.AppSettings["selenium.serverHost"],&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;int&lt;/span&gt;.Parse(ConfigurationManager.AppSettings["selenium.serverPort"]),&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ConfigurationManager.AppSettings["selenium.browserString"],&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ConfigurationManager.AppSettings["selenium.browserURL"]&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium.Start();&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [TearDown]&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;void&lt;/span&gt; TearDown()&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium.Stop();&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [Test]&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;void&lt;/span&gt; CheckTheTitle()&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium.Open("/Anthem-Examples-2005/ButtonsAndLabels.aspx");&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.AreEqual(&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "ButtonsAndLabels", &lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium.GetTitle(), &lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Check the title of the browser"&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [Test]&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;void&lt;/span&gt; ClickButtonAndCheckResponse()&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium.Open("/Anthem-Examples-2005/ButtonsAndLabels.aspx");&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.AreEqual(&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;string&lt;/span&gt;.Empty, &lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium.GetText("label"), &lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Verify that the label is empty."&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;string&lt;/span&gt; now1 = DateTime.Now.ToString();&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; selenium.Click("button");&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;string&lt;/span&gt; now2 = selenium.GetText("label");&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.AreEqual(&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; now1.Substring(0, 10), &lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; now2.Substring(0, 10), &lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Check that the date matches."&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p class="cl"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/UnitTestingAnthemWithSelenium</guid></item><item><title>Anthem Tip#1: Use BaseUri</title><pubDate>Sun, 07 May 2006 20:17:00 GMT</pubDate><description>&lt;p&gt;If you are using Anthem with an ASP.NET 1.1 application, then you have probably noticed that the Anthem javascript is added to every page. This adds about 20K to every response. Anthem will use an external source file instead if you define the Anthem.BaseUri appSetting. For example,&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 11pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: maroon; }
.cb3 { color: fuchsia; }
.cb4 { color: red; }
&lt;/style&gt;

&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="cb2"&gt;xml&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;version&lt;/span&gt;&lt;span class="cb1"&gt;="1.0"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;encoding&lt;/span&gt;&lt;span class="cb1"&gt;="utf-8"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb1"&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;configuration&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp; &lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;appSettings&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;add&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;key&lt;/span&gt;&lt;span class="cb1"&gt;="Anthem.BaseUri"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;value&lt;/span&gt;&lt;span class="cb1"&gt;="http://localhost/Anthem-Examples-2003/"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb1"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp; &lt;span class="cb1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;appSettings&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;configuration&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;This will cause Anthem to generate this external &amp;lt;script&amp;gt; tag instead of including the javascript in the page.&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;script type='text/javascript' src='http://localhost/Anthem-Examples-2003/Anthem.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;You can also use the tilde character (~) to reference the application root. For example,&lt;/p&gt;
&lt;style type="text/css"&gt;
.cf { font-family: Courier New; font-size: 11pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: maroon; }
.cb3 { color: fuchsia; }
.cb4 { color: red; }
&lt;/style&gt;

&lt;div class="cf"&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="cb2"&gt;xml&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;version&lt;/span&gt;&lt;span class="cb1"&gt;="1.0"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;encoding&lt;/span&gt;&lt;span class="cb1"&gt;="utf-8"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb1"&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;configuration&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp; &lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;appSettings&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;add&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;key&lt;/span&gt;&lt;span class="cb1"&gt;="Anthem.BaseUri"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb4"&gt;value&lt;/span&gt;&lt;span class="cb1"&gt;="~/"&lt;/span&gt;&lt;span class="cb3"&gt; &lt;/span&gt;&lt;span class="cb1"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&amp;nbsp; &lt;span class="cb1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;appSettings&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="cl"&gt;&lt;span class="cb1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;configuration&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Note that you should&amp;nbsp;add a copy of Anthem.js to your web site so that your browser can find it. If you are using Anthem in an ASP.NET 2.0 application, it will do something similar automatically. You do not need to include the Anthem.BaseUri appSetting.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/AnthemTip1</guid></item><item><title>ANN: SignIn Control Maintenance Release for StoreFront SP8</title><pubDate>Wed, 12 Apr 2006 15:05:01 GMT</pubDate><description>&lt;p&gt;SignIn Control version 1.4.0.4 is now available. This free maintenance release is compatible with StoreFront SP8.&lt;/p&gt;
&lt;p style="MARGIN-LEFT: 3em"&gt;&lt;a href="downloads/storefront/signincontrolsetup.exe"&gt;&lt;font color="#881100"&gt;download&lt;/font&gt;&lt;/a&gt; |&amp;nbsp;&lt;a href="ProductInfo.aspx?ProductID=SIGNIN-SF"&gt;&lt;font color="#881100"&gt;purchase&lt;/font&gt;&lt;/a&gt; | &lt;a href="help/storefront/SignInControl/webframe.html"&gt;&lt;font color="#881100"&gt;help&lt;/font&gt;&lt;/a&gt; | &lt;a href="help/storefront/SignInControl/Release%20Notes.html"&gt;&lt;font color="#881100"&gt;release notes&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNSignInControlMaintenanceReleaseforStoreFrontSP8</guid></item><item><title>Using Anthem and MetaBuilder's DefaultButtons together</title><pubDate>Mon, 10 Apr 2006 04:34:58 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://metabuilders.com/Tools/DefaultButtons.aspx"&gt;MetaBuilders DefaultButtons&lt;/a&gt; hooks into the Page onsubmit event to submit the appropriate event. Unfortunately, &lt;a href="http://anthem-dot-net.sourceforge.net/"&gt;Anthem &lt;/a&gt;(and presumably all callback libraries) do not invoke the onsubmit event. That means that if you have a Page with DefaultButtons and an Anthem control, DefaultButtons is ignored.&lt;/p&gt;
&lt;p&gt;Luckily, the fix is pretty simple. If you define a function called Anthem_PreCallBack, Anthem will call it before starting the actual callback. If you return false, the callback is never issued. So add this script to any page that uses DefaultButtons + Anthem.&lt;/p&gt;&lt;pre&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;nbsp; function Anthem_PreCallBack() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var src = DefaultButton_GetSrcElement(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (DefaultButton_RequireOwnPostback(src.form) )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { return false; };&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;This will invoke the postback for the default button if it exists.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/UsingAnthemandMetaBuildersDefaultButtonstogether</guid></item><item><title>FogBugz SnagIt Screenshot 1.0.1</title><pubDate>Wed, 22 Mar 2006 14:16:00 GMT</pubDate><description>&lt;p&gt;&lt;img alt="FSMenu" src="content/binary/FSMenu.png" align="right" border="0"&gt;This version of the &lt;a href="FogBugzandSnagItMashup" target="_self"&gt;FogBugz and SnagIt Mashup&lt;/a&gt; was rewritten in C# so that I could use&amp;nbsp;&lt;a href="http://www.aurigma.com/"&gt;Aurigma&lt;/a&gt;’s &lt;a href="http://www.aurigma.com/Products/COMtoNET/"&gt;COM to .NET&lt;/a&gt; tool to create a source code version of SNAGITLib and include it in the project. Now all you need is the exe.&lt;/p&gt;
&lt;p&gt;There are also more capture options. Also fixed a couple of bugs. I can’t figure out how to capture the Active window though. When I click on the notification icon in the system tray, it becomes the active window. Does anyone know how to reject the focus?&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/FogBugzSnagIt.exe"&gt;File Attachment: FogBugzSnagIt.exe (260 KB)&lt;/a&gt;&amp;nbsp;(save the program on your computer and run it from there)&lt;/p&gt;
&lt;p&gt;Here is the source code.&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/FogBugzSnagIt.zip"&gt;File Attachment: FogBugzSnagIt.zip (120 KB)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update #1: Removed "default.asp" from URL so this will hopefully work with both ASP and PHP versions of FogBugz (thank you Jim).&lt;br /&gt;Update #2: Wrapped SnagIt COM object creation in a try/catch to display a nice message if the object can not be created.&lt;/p&gt;
&lt;p&gt;&lt;!--Creative Commons License--&gt;&lt;a href="http://creativecommons.org/licenses/by/2.5/" rel="license"&gt;&lt;img alt="Creative Commons License" src="http://creativecommons.org/images/public/somerights20.png" border="0"&gt;&lt;/a&gt;&lt;br /&gt;This work is licensed under a &lt;a href="http://creativecommons.org/licenses/by/2.5/" rel="license"&gt;Creative Commons Attribution2.5 License&lt;/a&gt;.&lt;!--/Creative Commons License--&gt;&lt;!-- &lt;rdf:rdf xmlns="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&gt;
		&lt;work rdf:about=""&gt;
			&lt;license rdf:resource="http://creativecommons.org/licenses/by/2.5/" /&gt;
		&lt;/work&gt;
		&lt;license rdf:about="http://creativecommons.org/licenses/by/2.5/"&gt;&lt;permits rdf:resource="http://web.resource.org/cc/Reproduction"/&gt;&lt;permits rdf:resource="http://web.resource.org/cc/Distribution"/&gt;&lt;requires rdf:resource="http://web.resource.org/cc/Notice"/&gt;&lt;requires rdf:resource="http://web.resource.org/cc/Attribution"/&gt;&lt;permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/&gt;&lt;/license&gt;&lt;/rdf:rdf&gt; --&gt;&lt;/p&gt;
&lt;div style="CLEAR: both"&gt;&lt;/div&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/FogBugzSnagItScreenshot101</guid></item><item><title>FogBugz and SnagIt Mashup</title><pubDate>Fri, 10 Mar 2006 14:56:00 GMT</pubDate><description>&lt;p&gt;Update #1: I made a &lt;a href="http://www.structured-solutions.net/FogBugzSnagItVideo.aspx"&gt;short video&lt;/a&gt; to show how it works.&lt;br /&gt;Update #2: New &lt;a href="http://www.structured-solutions.net/FogBugzSnagItScreenshot101.aspx"&gt;version &lt;/a&gt;with more options.&lt;br /&gt;Update #3: I posted the &lt;a href="http://www.structured-solutions.net/FogBugzSnagItScreenshot101.aspx"&gt;source code&lt;/a&gt;.&lt;br /&gt;Update #4: Removed ASP-specific URL.&lt;br /&gt;Update #5: Michael Pryor added code to handle logging in to FogBugz and to add a page to the post URL (without the page, the post fails on IIS5).&lt;/p&gt;
&lt;p&gt;If you use &lt;a href="http://www.fogcreek.com/"&gt;FogCreek&lt;/a&gt;’s &lt;a href="http://www.fogcreek.com/FogBugz/index.html"&gt;FogBugz&lt;/a&gt; 4.0 or higher, you probably have the cute little screenshot tool in your system tray&amp;nbsp;&lt;a href="http://www.fogcreek.com/FogBugz/docs/40/Articles/Screenshots.html"&gt;&lt;img alt="Spider Icon" src="content/binary/spider.png" border="0"&gt;&lt;/a&gt;. I use it from time to time when a picture highlights a problem better than words. At the same time, I’ve always been a little disappointed with the image editing features.&lt;/p&gt;
&lt;p&gt;Sometimes I want to add arrows or highlight an area. When that happens, I take the snapshot with &lt;a href="http://www.techsmith.com/"&gt;TechSmith&lt;/a&gt;’s &lt;a href="http://www.techsmith.com/snagit.asp"&gt;SnagIt&lt;/a&gt;, add circles and arrows, then take a screenshot of the SnagIt screen with the FogBugz widget, crop it to remove the SnagIt window and then post that to FogBugz. Whew!&lt;/p&gt;
&lt;p&gt;So the other day I got to wondering how hard it would be to use SnagIt to post directly to FogBugz. I knew TechSmith had documentation on how to use &lt;a href="http://www.techsmith.com/snagit/accessories/comserver.asp"&gt;SnagIt as a COM server&lt;/a&gt;. So I wrote to FogBugz asking about their “API”. Michael wrote back with some hints and a suggestion to look at screenshop.asp. Although that got me most of the way, I ended up using &lt;a href="http://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/a&gt; to watch the conversation between FogBugz Screenshot and the FogBugz server. That was all I needed.&lt;/p&gt;
&lt;p&gt;This is the end result…&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/FogBugzSnagIt.png"&gt;&lt;img alt="FogBugzSnagIt" src="content/binary/FogBugzSnagIt_thumb.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It probably looks rather familar. That’s because I kept most of the features from the original version so that I could use it without re-learning. There are some new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can set the choices from the context menu of the icon in the System Tray. One advantage of this is that if you pick “Submit As New Case”, and turn off “Show Preview”, then all you have to do is click the shutter button (the icon) and the image is sent directly to FogBugz. 
&lt;li&gt;The actual image capture is done by SnagIt. I’ve added Selected Region to the list of choices, but it could be any of the inputs that SnagIt supports. I will probably add Scrolling Page (which captures an entire web page for example) to the list. 
&lt;li&gt;If you pick Preview in SnagIt, then the image that you capture makes a stop in the SnagIt editor. There you can to all kinds of tricks including adding circles and arrows. 
&lt;li&gt;I added a “Reply to Case” option. This is similar to “Attach to Case” but it starts up the email reply form instead of the edit case form. I’m thinking I may switch from SmarterTicket to FogBugz to tracking support issues and this was a requirement (every day I could use the ability to reply with an image…”Is this what you mean?”).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If you have FogBugz and SnagIt, you are welcome to try this out. It does require .NET 1.1 or higher. I plan on posting the code soon if you want to customize it for yourself.&lt;/p&gt;
&lt;p&gt;download: &lt;a href="content/binary/FogBugzSnagIt.exe" target="_self"&gt;exe&lt;/a&gt; | &lt;a href="content/binary/FogBugzSnagIt.zip" target="_self"&gt;source&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/FogBugzandSnagItMashup</guid></item><item><title>ANN: CartList Control for StoreFront Maintenance Release 1.5.2.2</title><pubDate>Thu, 09 Mar 2006 17:16:03 GMT</pubDate><description>&lt;p&gt;&lt;a href="ProductInfo.aspx?ProductID=CARTLIST-SF"&gt;CartList Control&lt;/a&gt; version 1.5.2.2 is now available. This free update includes the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New: Link to SSCartList.js includes the full path to the copy in the root directory of your store. This means you only need one copy of SSCartList.js on your site even if you have pages in multiple subdirectories.&lt;/li&gt;
&lt;li&gt;Fixed: An error was displayed if ShowLinks=&amp;rdquo;True&amp;rdquo; and the product details were set to &amp;ldquo;Other&amp;rdquo; and the URL in the Other Details started with a backslash characters (&amp;ldquo;\&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Fixed: An error was displayed if the CartList Control was inserted within a server control that did not have a CSS class attribute assigned.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;To download the latest version of the &lt;a href="ProductInfo.aspx?ProductID=CARTLIST-SF"&gt;CartList Control&lt;/a&gt;, please visit your account page at &lt;a title="After you login, you will be redirected to your account page." href="http://www.sfaddons.com/CustProfileMain.aspx"&gt;www.sfaddons.com&lt;/a&gt;, use Order History to locate the original order, and then download the installer from the Order Details page. If you are upgrading, you only need to install the new SSCartList.dll file to the the bin directory on your web site.&lt;/p&gt;
&lt;p style="MARGIN-LEFT: 3em"&gt;&lt;a title="Direct link to free trial version of the CartList Control" href="http://www.sfaddons.com/TrialDownload/CartListControlSetup.exe"&gt;download free trial&lt;/a&gt; | &lt;a title="Product page for the CartList Control" href="ProductInfo.aspx?ProductID=CARTLIST-SF"&gt;purchase&lt;/a&gt; | &lt;a title="Online help for the CartList Control" href="http://www.sfaddons.com/Help/CartList.htm"&gt;online help&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNCartListControlforStoreFrontMaintenanceRelease1</guid></item><item><title>Posting screenshots as FogBugz replies</title><pubDate>Mon, 27 Feb 2006 16:49:19 GMT</pubDate><description>&lt;p&gt;The normal FogBugz Screenshot tool lets you post an image as an attachment to an existing case. The &lt;a href="FogBugzSnagItScreenshot101.aspx"&gt;FogBugz SnagIt Screenshot &lt;/a&gt;tool also let&amp;rsquo;s you post an attachment as an email reply to an existing case. This is more natural when the conversion follows a pattern like:&lt;/p&gt;
&lt;p&gt;He said, &amp;ldquo;It does this.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;She replied, &amp;ldquo;You mean like this?&amp;rdquo; (screenshot attached)&lt;/p&gt;
&lt;p&gt;To add this extra option I made a small modification to FogBugz&amp;rsquo;s screenshot.asp to accept a new querystring parameter called fReply. If this is set to &amp;ldquo;1&amp;rdquo; then EditBugPage is launched in &amp;ldquo;reply&amp;rdquo; mode, otherwise EditBugPage is launched in &amp;ldquo;edit&amp;rdquo; mode. The extra parameter is ignored by unmodified versions of screenshot.asp, in which case you will always see the &amp;ldquo;edit&amp;rdquo; version.&lt;/p&gt;
&lt;p&gt;This is the change,&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;'Add support for sending an email reply with attached image
If IntRequest("fReply") = "1" Then
  EditBugPage IntRequest("ixBug"), "reply", ixBugEventLatest, "", False, False, False, ixScreenshot
Else
  ' This is the original line
  EditBugPage IntRequest("ixBug"), "edit", ixBugEventLatest, "", False, False, False, ixScreenshot
End If
'End change
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/PostingscreenshotsasFogBugzreplies</guid></item><item><title>FogBugz SnagIt Screenshot source code</title><pubDate>Mon, 27 Feb 2006 16:31:53 GMT</pubDate><description>&lt;a href="FogBugzSnagItScreenshot101.aspx"&gt;I posted the source code for FogBugz SnagIt Screenshot 1.0.1&lt;/a&gt;.&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/FogBugzSnagItScreenshotsourcecode</guid></item><item><title>FogBugz SnagIt Video</title><pubDate>Sat, 25 Feb 2006 06:35:00 GMT</pubDate><description>&lt;p&gt;Here’s a short video showing how the &lt;a href="FogBugzandSnagItMashup" target="_self"&gt;FogBugz SnagIt&lt;/a&gt; mashup looks.&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/FogBugzSnagItMashup/FogBugz%20SnagIt%20Mashup.html"&gt;&lt;img alt="MashUp" src="content/binary/MashUp.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://www.techsmith.com/camtasia.asp" target="_blank"&gt;&lt;img alt="Find out more about Camtasia Studio and the power of desktop recording" src="http://www.techsmith.com/img/community/logo/cs_scrncstwk.gif" border="0"&gt;&lt;/a&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/FogBugzSnagItVideo</guid></item><item><title>Checking that cookies are enabled in ASP.NET</title><pubDate>Tue, 14 Feb 2006 16:58:00 GMT</pubDate><description>&lt;p&gt;Create a file called CheckCookie.ascx on your site. Copy and paste this text into the file:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;&amp;lt;%@ Control Language="vb" AutoEventWireup="false" %&amp;gt;&lt;br /&gt;&amp;lt;script runat="server"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If (Me.IsPostBack) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Me.Request.Cookies.Item(Me.UniqueID) Is Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Me.FindControl("message") Is Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.FindControl("message").Visible = True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Cookies.Add(New HttpCookie(Me.UniqueID))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div id="message" runat="server" visible="false"&amp;gt;&lt;br /&gt;&amp;nbsp; You do not have cookies enabled.&lt;br /&gt;&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is called an ASP.NET&amp;nbsp;user control. It is sort of like an HTML include file + script. Each time there is a postback (clicking Add to Cart for example) it will check for a cookie. If this cookie does not exist it will display the message.&lt;/p&gt;
&lt;p&gt;Now add this user control to the pages&amp;nbsp;where you want the message to appear when they do not have cookies enabled. To add the control, add this line to the top of the file:&lt;/p&gt;
&lt;div&gt;
&lt;div class="code"&gt;&lt;pre&gt;&amp;lt;%@ Register TagPrefix="ss" TagName="CheckCookie" Src="CheckCookie.ascx" %&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And add this line where you want the message to appear:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;&amp;lt;ss:CheckCookie id="cc" runat="server" /&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To test this I used FireFox and disabled all cookies.&amp;nbsp;&amp;nbsp;You can disable all cookies in IE, but this only disables &lt;em&gt;new&lt;/em&gt; cookies. To test this in IE you would have to disable all cookies &lt;strong&gt;and&lt;/strong&gt; delete all cookies.&lt;/p&gt;&lt;/div&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/CheckingthatcookiesareenabledinASPNET</guid></item><item><title>Adding the Tracking Number to the Order Tracking Page in StoreFront</title><pubDate>Mon, 13 Feb 2006 21:14:00 GMT</pubDate><description>&lt;p&gt;There is a new article in the knowledgbase that shows how to add the tracking number to the order tracking page (OrderTracking.aspx) in StoreFront.&lt;/p&gt;
&lt;p&gt;&lt;a class="kbcategoryarticlelink" href="http://support.structured-solutions.net/Customer/KBArticle.aspx?articleid=57"&gt;HOWTO: Add the Tracking Number to the StoreFront Order Tracking Page&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;It looks like this,&lt;/p&gt;
&lt;p&gt;&lt;img alt="TrackingNumber" src="content/binary/TrackingNumber.png" border="0"&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/AddTracking</guid></item><item><title>Sending persistent cookies in a WebRequest</title><pubDate>Thu, 09 Feb 2006 19:45:09 GMT</pubDate><description>&lt;p&gt;As I wrote &lt;a href="PostingToAWebPageFromAWinFormsApp.aspx"&gt;here&lt;/a&gt;, I use a WebRequest to post the initial image data to FogBugz rather than control IE using COM automation. The main advantage of using a WebRequest instead of automating IE is that I am not tied to IE. The main disadvantage is that a WebRequest will not naturally send any cookies. FogBugz uses a persistent cookie to automatically log you in.&lt;/p&gt;
&lt;p&gt;There is a field in the WebRequest called CookieContainer. But it will not load your persistent cookies for you. You have to do this with your own code. Unfortunately there is no managed API for doing this. There is a Windows API in wininet.dll for doing this called &lt;a href="http://search.microsoft.com/search/results.aspx?qu=InternetGetCookie"&gt;InternetGetCookie&lt;/a&gt;. First I looked at &lt;a href="http://www.pinvoke.net/default.aspx/wininet/InternetGetCookie.html"&gt;pinvoke.net&lt;/a&gt; to see if there was a good example. I did not find one, but Google turned up &lt;a href="http://www.rendelmann.info/blog/PermaLink.aspx?guid=bd99bcd5-7088-4d46-801e-c0fe622dc2e5"&gt;this one on torsten&amp;rsquo;s blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I tried using the CookieContainer.SetCookies method just like torsten did, but it choked on one of the cookies (InternetGetCookie found 3 for my FogBugz url&amp;hellip;some are probably for other apps on the same site). So I added code to parse the cookies my self and add them to CookieContainer as a collection.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre&gt;
    private static System.Net.CookieCollection RetrieveIECookiesForUrl(Uri url) 
    { 
      System.Net.CookieCollection cookies = new System.Net.CookieCollection(); 
      System.Text.StringBuilder cookieHeader = new System.Text.StringBuilder(new string(' ', 256), 256); 
      int datasize = cookieHeader.Length; 
      try 
      { 
        if (!(wininet.InternetGetCookie(url.ToString(), null, cookieHeader, ref datasize))) 
        { 
          if (0 &gt;= datasize) 
          { 
            return cookies; 
          } 
          else 
          { 
            cookieHeader = new System.Text.StringBuilder(datasize); 
            wininet.InternetGetCookie(url.ToString(), null, cookieHeader, ref datasize); 
          } 
        } 
        foreach (string cookiestring in cookieHeader.ToString().Split(' ')) 
        { 
          string cookieName = cookiestring.Split('=')[0]; 
          string cookieValue = cookiestring.Split('=')[1]; 
          if (cookieValue.EndsWith(";")) 
          { 
            cookieValue = cookieValue.Substring(0, cookieValue.Length - 1); 
          } 
          System.Net.Cookie cookie = new System.Net.Cookie(cookieName, cookieValue); 
          cookies.Add(cookie); 
        } 
      } 
      catch (Exception ex) 
      { 
        MessageBox.Show("RetrieveIECookiesForUrl failed: " + ex.ToString()); 
      } 
      return cookies; 
    } 
&lt;/pre&gt;
&lt;/div&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/SendingpersistentcookiesinaWebRequest</guid></item><item><title>Posting to a web page from a WinForms app</title><pubDate>Tue, 07 Feb 2006 06:52:44 GMT</pubDate><description>&lt;p&gt;Sending an image to FogBugz is a two-step dance. First you send the image and FogBugz sends back the image index. Then you launch the FogBugz page you want to see, passing the image index in the querystring.&lt;/p&gt;
&lt;p&gt;To send the image to FogBugz, you encode the image in a base64 string and then POST it to screenshot.asp (or to default.asp with the querystring parameter pg=pgSubmitScreenshot&amp;hellip;this is what I did and what the FogBugz Screenshot tool does). I tried two different ways of posting the data COM automation and&amp;nbsp;a .NET WebRequest.&lt;/p&gt;
&lt;p&gt;The advantage of COM automation was that it was relatively few lines of code and the IE COM object would parse the results for me. Basically the code was something like this (with all the messy parts removed):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;ie.Navigate(thePage)
index = ie.getElementById("ixscreenshot").InnerText 
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The disadvantage was the it requierd Internet Explorer, I had to add code to wait while the response was being read, and it used a bunch of late binding. I&amp;rsquo;m sure I could find the class definitions somewhere so that I could get the methods to show up in Intellisense, but it would still feel clumsy.&lt;/p&gt;
&lt;p&gt;The advantage of the .NET WebRequest object is that it does not use IE and there is no waiting around in the code. Just build the request, get the response and ReadToEnd. Then scan the results for the index. Another advantage of using the WebRequest is reduced network traffic&amp;hellip;albeit trivial. With COM automation, IE will dutifully download all the images and javascript that are on the page even though I only want the text. With the WebRequest, I just get the text and go. Here&amp;rsquo;s the full&amp;nbsp; code:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;    private static int GetImageIndex(System.Drawing.Image image) 
    { 
      if (null == image) throw new ArgumentNullException("image");

      string tagstart = "&lt;SPAN id='\"ixscreenshot\"'&gt;"; 
      string tagend = "&lt;/SPAN&gt;"; 
      int index = -1; 
      System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
      image.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
      string base64 = Convert.ToBase64String(stream.ToArray()); 
      string postdata = "pg=pgSubmitScreenshot&amp;amp;fSaveOnly=1&amp;amp;cImageFragments=1&amp;amp;base64png1="; 
      postdata += System.Web.HttpUtility.UrlEncode(base64); 

      StreamWriter requestWriter = null;
      HttpWebResponse response = null;
      Stream responseStream = null;
      StreamReader responseReader = null;
      try 
      { 
        HttpWebRequest request; 
        Uri requestUri = new Uri(Config.ServerURL + "default.asp"); 
        request = ((HttpWebRequest)(WebRequest.Create(requestUri))); 
        request.Method = "POST"; 
        request.ContentType = "application/x-www-form-urlencoded"; 
        request.ContentLength = postdata.Length; 
        request.CookieContainer = new CookieContainer(); 
        request.CookieContainer.Add(request.Address, RetrieveIECookiesForUrl(request.Address)); 
        request.Proxy = WebProxy.GetDefaultProxy(); 
        Stream requestStream = request.GetRequestStream(); 
        requestWriter = new StreamWriter(request.GetRequestStream()); 
        requestWriter.Write(postdata); 
        requestWriter.Close(); 
        response = ((HttpWebResponse)(request.GetResponse())); 
        if (response.StatusCode == HttpStatusCode.OK) 
        { 
          responseStream = response.GetResponseStream(); 
          responseReader = new StreamReader(responseStream); 
          string responseString = responseReader.ReadToEnd().ToLower(); 
          if (responseString.IndexOf(tagstart) &amp;gt; -1) 
          { 
            int startIndex = responseString.IndexOf(tagstart) + tagstart.Length; 
            int stopIndex = responseString.IndexOf(tagend, startIndex); 
            index = Convert.ToInt32(responseString.Substring(startIndex, stopIndex - startIndex)); 
          } 
        } 
      } 
      catch (System.UriFormatException ex)
      {
        MessageBox.Show("The FogBugz server URL is giving .NET fits (the url is '"
        + Config.ServerURL + "' and .NET says '" + ex.Message 
        + "') . You can edit the server URL from the Preview. Select Show Preview as an option and then click on the URL.");
      }
      catch (Exception ex) 
      { 
        MessageBox.Show("GetImageIndex failed: " + ex.ToString()); 
      } 
      finally 
      { 
        if (null != responseReader) responseReader.Close(); 
        if (null != responseStream) responseStream.Close(); 
        if (null != response) response.Close(); 
        if (null != requestWriter) requestWriter.Close(); 
      } 
      return index; 
    } 

&lt;/pre&gt;&lt;/div&gt;
&lt;div style="BORDER-RIGHT: #666 1px solid; PADDING-RIGHT: 1em; BORDER-TOP: #666 1px solid; MARGIN-TOP: 2em; PADDING-LEFT: 1em; FLOAT: right; PADDING-BOTTOM: 1em; BORDER-LEFT: #666 1px solid; WIDTH: 40%; PADDING-TOP: 1em; BORDER-BOTTOM: #666 1px solid"&gt;You might think CookieContainer should load the cookies for you, but it will not. The CookieContainer is a way to manipulate&amp;nbsp;the cookies that the site sends back. It will not load persistent cookies for the initial request.&lt;/div&gt;
&lt;p&gt;The huge disadvantage of using WebRequest is that it does not send any cookies unless you add them. Without the cookies, FogBugz does not know who you are and redirects the WebRequest to the Login page. Which is kind of pointless since the page is being parsed by code. The trick is to load the cookies for the web site into the WebRequest. Unfortunately there is no .NET method to do this.&lt;/p&gt;
&lt;div style="CLEAR: both"&gt;
&lt;p&gt;That's what RetrieveIECookiesForUrl does, and that is what I'll write about next time.&lt;/p&gt;&lt;/div&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/PostingtoawebpagefromaWinFormsapp</guid></item><item><title>Joel On Software Effect</title><pubDate>Tue, 07 Feb 2006 06:50:57 GMT</pubDate><description>&lt;p&gt;&lt;img alt="Graph showing Visits and Pageviews" src="content/binary/JOSEffect.png" border="0" /&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/JoelOnSoftwareEffect</guid></item><item><title>Creating an SSL Certificate for development</title><pubDate>Fri, 20 Jan 2006 16:03:37 GMT</pubDate><description>&lt;p&gt;I had a whole procedure written down for creating a self-issued web server certificate for development and testing. Then I saw someone mention a tool called SelfSSL in the &lt;a href="http://www.microsoft.com/windowsserver2003/iisdownload/default.mspx"&gt;IIS Resource Kit Tools&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SelfSSL /T&lt;/p&gt;
&lt;p&gt;That's it! It will even ask if you want the certificate installed on web site 1! Works with IIS5 and IIS6.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/CreatinganSSLCertificatefordevelopment</guid></item><item><title>Configuring StoreFront to use PayPal Express Checkout on a development box</title><pubDate>Tue, 17 Jan 2006 21:41:00 GMT</pubDate><description>&lt;p&gt;A customer recently reported that if his customer used PayPal Express Checkout then Shipper did not include the ShipToEmail address. As I mentioned &lt;a title="Blog Post: Missing BillToEmail and ShipToEmail addresses when using PayPal Express checkout" href="MissingBillToEmailAndShipToEmailAddressesWhenUsingPayPalExpressCheckout.aspx"&gt;here&lt;/a&gt;, this turned out to be a small bug or oversight in StoreFront 6.7.0. To reach that point I needed to enable PayPal Express Checkout on my development/debugging site. This post explains what I did. I frequently refer to an article called "&lt;a href="https://www.paypal.com/integrationcenter/ic_certificate.html"&gt;API Certificate&lt;/a&gt;" on the PayPal &lt;a href="https://www.paypal.com/IntegrationCenter/ic_home.html"&gt;Integration Center&lt;/a&gt;. The article covers many of the same steps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Get a PayPal API Certificate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/PayPalTestAccounts.png"&gt;&lt;/a&gt;&lt;a href="content/binary/PayPalTestAccounts.png"&gt;&lt;/a&gt;&lt;a href="content/binary/PayPalTestAccounts.png"&gt;&lt;img alt="PayPalTestAccounts" src="content/binary/PayPalTestAccounts_thumb.jpg" align="right" border="0"&gt;&lt;/a&gt;I did not want to use a "real" PayPal account for testing, so I decided to get a "sandbox" account. First I signed up for an account at &lt;a href="https://developer.paypal.com/"&gt;PayPal Developer Central&lt;/a&gt;. Then I created two Test Accounts. One to be the customer and one to be the merchant (which must be a&amp;nbsp;Business or Premier Account). I also funded both with some funny money.&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/PayPalTestCertificate.png"&gt;&lt;img alt="PayPalTestCertificate" src="content/binary/PayPalTestCertificate_thumb.jpg" align="left" border="0"&gt;&lt;/a&gt;Next I requested an API Certificate from the test merchant account. Then I downloaded the Test Certificate that was generated (it shows up in Developer Central).&lt;/p&gt;
&lt;p&gt;Please see &lt;a href="https://www.paypal.com/IntegrationCenter/ic_certificate.html#step1"&gt;Step 1&lt;/a&gt; of the &lt;a href="https://www.paypal.com/IntegrationCenter/ic_certificate.html"&gt;API Certificate&lt;/a&gt; article for details.&lt;/p&gt;
&lt;p style="CLEAR: both"&gt;&lt;strong&gt;2. Encrypt the Certificate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After downloading the API certificate, I visited http://paypaltech.com/tools/pem2p12.php&amp;nbsp;to encrypt the certificate into PKCS12 format. I did not follow &lt;a href="https://www.paypal.com/IntegrationCenter/ic_certificate.html#step3"&gt;Step 3&lt;/a&gt; of the &lt;a href="https://www.paypal.com/IntegrationCenter/ic_certificate.html"&gt;API Certificate&lt;/a&gt; article. They accomplish the same thing, but the web page is much easier to use. &lt;strong&gt;Note&lt;/strong&gt;: if you use the web page, do not include spaces in your security phrase. I saved the encrypted certificate on my computer as sandbox_cert.p12.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Install the Certificate on my Server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In my testing, StoreFront will be running on my development box as an IIS5 application. Therefore, when a test "customer" uses&amp;nbsp;PayPal Express Checkout, my copy of IIS will be the "client" to PayPal. That means I need to install the certificate where IIS can find it. To do this, I used WinHttpCertCfg.exe to install the encrypted certificate for the ASPNET user:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;WinHttpCertCfg -i sandbox_cert.p12 -p&amp;nbsp;&lt;em&gt;securityphrase&lt;/em&gt; -c LOCAL_MACHINE\My -a ASPNET&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;I used the&amp;nbsp;same security phrase that I used in step 2 to encrypt the certificate.&lt;/p&gt;
&lt;p&gt;Please see &lt;a href="https://www.paypal.com/IntegrationCenter/ic_certificate.html#step4"&gt;Step 4&lt;/a&gt; of the &lt;a href="https://www.paypal.com/IntegrationCenter/ic_certificate.html"&gt;API Certificate &lt;/a&gt;article for details and a link to download WinHttpCertCfg.exe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Configure StoreFront to Use the Sandbox Server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Open the StoreFront database and the PaymentProcessors table. Find the PayPal record and change TestMode from 0 to 1.&lt;/p&gt;
&lt;p&gt;StoreFront will now correctly contact the sandbox server to&amp;nbsp;start the Express Checkout transaction, but it will send the test customer to the live checkout pages. This will not work since the live and sandbox servers do not work together. So I made one small change to CPayPalExpress.vb. &lt;strong&gt;Note&lt;/strong&gt;: this is &lt;em&gt;only&lt;/em&gt; required if you are using the sandbox to test PayPal Express Checkout.&lt;/p&gt;&lt;pre&gt;        Public Sub New()
            MyBase.New()
            MyBase.fillProcessorInfo("PayPal")
            'AFM - Fill in test server URI if in testmode
            If Me.Proc_live = 0 Then
                Me.URI = "https://www.sandbox.paypal.com/cgi-bin/webscr"
            End If
            'AFM - End
        End Sub
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. Finally, Configure StoreFront to Use PayPal Express Checkout&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the easiest part now that everything is in place,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Selected Merchant Tools &amp;gt; Payments 
&lt;li&gt;Selected PayPal and entered, 
&lt;ul&gt;
&lt;li&gt;Accept PayPal as a Payment Method: Checked&lt;br /&gt;&lt;em&gt;this is optional&lt;/em&gt; 
&lt;li&gt;Accept PayPal Express Checkout: Checked 
&lt;li&gt;Certificate Type: First Party 
&lt;li&gt;PayPal Merchant ID: merchant_api1.structured-solutions.net&lt;br /&gt;&lt;em&gt;this is the API Username not the merchant sandbox account name&lt;/em&gt; 
&lt;li&gt;PayPal Merchant Password: *******&lt;br /&gt;&lt;em&gt;this is the merchant sandbox account password&lt;/em&gt;&lt;em&gt;&lt;/em&gt; 
&lt;li&gt;Private-Key Password: ******&lt;br /&gt;this is the security phrase used in steps 2 and 3 above 
&lt;li&gt;Payment Type: Authorize&lt;br /&gt;&lt;em&gt;you can choose Authorize or Sale for testing&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;Clicked on Save&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;That's it. PayPal Express Checkout worked and I was able to duplicate the error my customer reported.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ConfiguringStoreFronttousePayPalExpressCheckoutona</guid></item><item><title>What's the best nails for balsa wood</title><pubDate>Fri, 16 Dec 2005 21:33:14 GMT</pubDate><description>&lt;p&gt;I participate in different forums that cater to my customers. Very often I can&amp;rsquo;t quite make out the meaning of a question. Usually (I assume) because the person writing the question does not really know what is actually happening. Kind of like when when the Connecticut Yankee goes back to King Arthur's Court and &amp;ldquo;causes&amp;rdquo; the sun to disappear. To the observers it sure seems like the Yankee can cause the sun to disappear, so they understandably might ask each other &amp;ldquo;What did we do to offend the Yankee?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I can answer that question, but it would be the wrong answer. Because it was the wrong question. The Yankee did not make the sun disappear. The browser did not make the error &amp;ldquo;the page contains potentially dangerous&amp;hellip;&amp;rdquo; appear.&lt;/p&gt;
&lt;p&gt;In my email support I often see a related type of question along the lines of &amp;ldquo;&lt;a href="http://blogs.msdn.com/rflaming/archive/2005/10/01/476154.aspx"&gt;what&amp;rsquo;s the best nails for balsa wood?&lt;/a&gt;&amp;rdquo; I don&amp;rsquo;t know why I don&amp;rsquo;t see these as much&amp;nbsp;in the forums. As &lt;a href="http://blogs.msdn.com/rflaming/default.aspx"&gt;Robert Flaming&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/oldnewthing"&gt;Raymond Chen&lt;/a&gt; describe, I spend a lot of time resetting. Once we both agree on what the question really is, then it usually only takes a sentence or two to answer. Unfortunately, reaching that point can sometimes stretch on and on&amp;hellip;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/Whatsthebestnailsforbalsawood</guid></item><item><title>ANN: Shipping Cost Estimator for StoreFront Maintenance Release 1.4.4</title><pubDate>Fri, 16 Dec 2005 17:17:00 GMT</pubDate><description>&lt;p&gt;&lt;a title="Product page for the Shipping Cost Estimator Control" href="ProductInfo.aspx?ProductID=SHIPCOST-SF"&gt;Shipping Cost Estimator&lt;/a&gt; version 1.4.4 is now available. This free update includes the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There are no more hard coded messages. All of the text messages that are displayed by the Shipping Cost Estimator can be customised, localised, or removed. Three new properties were added to make this happen: EstimatorInstructions, NoItemsMessage, and NoShippableItemsMessage. Also the prompt for zip code that initially appears when the estimator is first displayed and you are using carrier-based shipping, now takes it’s text from the ZipCodeRequired validator that is in ShippingCost.ascx. The bottom line is that there are no more hard coded text messages inside of the code. 
&lt;li&gt;The &amp;lt;RateMessage&amp;gt; tag has a minor change to make it more readable. Previously the tag looked like this:&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;RateMessage Value=”UPS” Text=”Disclaimer for UPS” /&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Now the tag should look like this:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;RateMessage CarrierCode=”UPS” Message=”Disclaimer for UPS” /&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;You can actually use either format, but the examples and the documentation now use the new format.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Please see the &lt;a title="Online help for the Shipping Cost Estimator Control" href="help/storefront/SSShippingCost.htm" target="_self"&gt;online help&lt;/a&gt; for details regarding the new properties and changes. To download the latest version of the &lt;a title="Product page for the Shipping Cost Estimator Control" href="ProductInfo.aspx?ProductID=SHIPCOST-SF"&gt;Shipping Cost Estimator&lt;/a&gt;, please sign on to your account, use Order History to locate the original order, and then download the installer from the Order Details.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNShippingCostEstimatorforStoreFrontMaintenanceRe</guid></item><item><title>The Elements of Typographic Style Applied to the Web</title><pubDate>Wed, 14 Dec 2005 19:20:25 GMT</pubDate><description>&lt;p&gt;When I was young I used to spend some of my money buying letter stencils. At the time they came in many beautiful styles with both serif and sans-serif fonts. It was a lot of fun to experiment with different styles to label my various pee-chees for math, history, etc.&lt;/p&gt;
&lt;p&gt;When I got to college and minored in architecture, it was a wonderful excuse to buy rub-on letters. They came in even more beautiful styles. There were even posters showing all the fonts that were available. I hung one in my cubicle like it was art. Choosing a font for an architectural presentation was more serious than labelling a pee-chee, but it was still fun to experiment.&lt;/p&gt;
&lt;p&gt;Nowadays&amp;nbsp;there are so many fonts I am overwhelmed. I literally can get dizzy trying to pick a font from among the hundreds that are freely available&amp;hellip;so I don&amp;rsquo;t. It&amp;rsquo;s not fun anymore so I mostly just use the default without any thought what so ever.&lt;/p&gt;
&lt;p&gt;Today I ran across a site called &lt;a href="http://webtypography.net/"&gt;The Elements of Typographic Style Applied to the Web&lt;/a&gt;.This work in progress by Richard Rutter is taking each principal in Robert Bringhurst&amp;rsquo;s book &lt;em&gt;The Elements of Typographic Style&lt;/em&gt; and explaining how it applies to material published on the web. So far I love it. Each principal is just the right size to be interesting and easy to read. In a real way it helped be remember the good feelings I had when I was younger and it was fun to experiment with letters.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/TheElementsofTypographicStyleAppliedtotheWeb</guid></item><item><title>ANN: Froogle Feed Maintenance Release 1.4.6</title><pubDate>Fri, 02 Dec 2005 17:23:35 GMT</pubDate><description>&lt;P&gt;Froogle Feed for StoreFront version 1.4.6&amp;nbsp;is&amp;nbsp;now available. This is a free update for all current Froogle Feed license owners (download the new version from your &lt;A href="http://www.sfaddons.com/custprofilemain.aspx"&gt;order details page&lt;/A&gt;). This maintenance release include the following change:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class=""&gt;NEW: A copy of the feed file is now saved on the computer in the directory where Froogle Feed is installed. The complete path to the file is recorded in the Froogle Feed Log. The identity running the web site (typically NETWORK SERVICE or ASPNET) must have permission to write to the directory where Froogle Feed is installed.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;A title="Download a free trial version" href="http://www.sfaddons.com/TrialDownload/FroogleFeedSetup.exe"&gt;trial download&lt;/A&gt; | &lt;A title="After signing on to your account, use Order History &gt; Order Details for the download link" href="http://www.sfaddons.com/custprofilemain.aspx"&gt;licensed download&lt;/A&gt; | &lt;A href="ProductInfo.aspx?ProductID=FROOGLE-SF"&gt;purchase&lt;/A&gt; | &lt;A href="help/storefront/FroogleFeed.htm"&gt;online help&lt;/A&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNFroogleFeedMaintenanceRelease146</guid></item><item><title>ANN: SignIn Control Maintenance Release 1.4.0</title><pubDate>Mon, 28 Nov 2005 03:41:59 GMT</pubDate><description>&lt;p&gt;SignIn Control version 1.4.0 is now available. This is a free maintenance release that includes the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class=""&gt;NEW: New SignInRequired and SignInUrl properties. If SignInRequired is On and the customer is not signed in they are redirected to the SignInUrl page. This can be used to force the customer to sign in before they can access your site. See the Admin page for a detailed description of the properties.&lt;/div&gt;
&lt;li&gt;
&lt;div class=""&gt;FIX: NullReferenceException if SignIn Control is visible on the Confirm.aspx page and customer uses the SignIn Control to sign out.&lt;/div&gt;
&lt;li&gt;
&lt;div class=""&gt;CHANGE: &lt;a href="http://www.infragistics.com/products/NetAdvantage/WebForms/Default.aspx"&gt;Infragistics web controls&lt;/a&gt; updated to same level in Shipping Cost Estimator 1.4.3, SignIn Control 1.4.0, and Shipper Service for StoreFront 1.3.0. After installing the updates, you can safely remove older Infragistics.* DLL&amp;rsquo;s from your sites bin folder unless you have a 3rd party control that uses the same libraries. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p style="MARGIN-LEFT: 3em"&gt;&lt;a href="downloads/storefront/signincontrolsetup.exe"&gt;&lt;font color="#881100"&gt;download&lt;/font&gt;&lt;/a&gt; |&amp;nbsp;&lt;a href="ProductInfo.aspx?ProductID=SIGNIN-SF"&gt;&lt;font color="#881100"&gt;purchase&lt;/font&gt;&lt;/a&gt; | &lt;a href="help/storefront/SignInControl/webframe.html"&gt;&lt;font color="#881100"&gt;help&lt;/font&gt;&lt;/a&gt; | &lt;a href="help/storefront/SignInControl/Release%20Notes.html"&gt;&lt;font color="#881100"&gt;release notes&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNSignInControlMaintenanceRelease140</guid></item><item><title>Last chance for Shipping Cost Estimator/Select Carrier Control bundle</title><pubDate>Tue, 22 Nov 2005 18:12:54 GMT</pubDate><description>&lt;p&gt;Effective November 20, 2005 the &lt;a href="ProductInfo.aspx?ProductID=CARRIER-SF"&gt;Select Carrier Control&lt;/a&gt; will no longer be included with the &lt;a href="ProductInfo.aspx?ProductID=SHIPCOST-SF"&gt;Shipping Cost Estimator&lt;/a&gt; product. If you want to add both products to your store and save a few bucks, then purchase the Shipping Cost Estimator by midnight on November 19, 2005.&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/LastchanceforShippingCostEstimatorSelectCarrierCon</guid></item><item><title>ANN: Navigator Control Maintenance Release 1.3.3</title><pubDate>Fri, 11 Nov 2005 17:53:00 GMT</pubDate><description>&lt;p&gt;Navigator Control version 1.3.3 is now available. This free update includes the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FIXED: Navigator Control does not recognize custom catalog pages that have the "%20" character in the URL.&lt;/li&gt;&lt;/ul&gt;
&lt;p style="MARGIN-LEFT: 3em"&gt;&lt;a href="http://www.sfaddons.com/CustProfileMain.aspx"&gt;download&lt;/a&gt; | &lt;a href="ProductInfo.aspx?ProductID=NAVIGATOR-SF"&gt;purchase&lt;/a&gt; | &lt;a href="http://www.sfaddons.com/trialdownload/NavigatorControlSetup.exe"&gt;free trial&lt;/a&gt; | &lt;a href="help/storefront/navigator/webframe.html"&gt;help&lt;/a&gt; | &lt;a href="help/storefront/navigator/Release%20Notes.html"&gt;release notes&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNNavigatorControlMaintenanceRelease133</guid></item><item><title>ANN: Froogle Feed Maintenance Release 1.4.5</title><pubDate>Sun, 30 Oct 2005 18:34:53 GMT</pubDate><description>&lt;P&gt;Froogle Feed for StoreFront version 1.4.5&amp;nbsp;is&amp;nbsp;now available. This is a free update for all current Froogle Feed license owners (download the new version from your &lt;A href="http://www.sfaddons.com/custprofilemain.aspx"&gt;order details page&lt;/A&gt;). This maintenance release include the following change:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class=""&gt;CHANGE: Spaces is the product and image url are converted to "%20" (without the quote marks).&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;A href="http://www.sfaddons.com/TrialDownload/FroogleFeedTrialSetup.exe"&gt;trial download&lt;/A&gt; | &lt;A href="http://www.sfaddons.com/custprofilemain.aspx"&gt;licensed download&lt;/A&gt; | &lt;A href="ProductInfo.aspx?ProductID=FROOGLE-SF"&gt;purchase&lt;/A&gt; | &lt;A href="help/storefront/FroogleFeed.htm"&gt;online help&lt;/A&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNFroogleFeedMaintenanceRelease145</guid></item><item><title>Moving VIEWSTATE to the bottom of the page redux</title><pubDate>Fri, 28 Oct 2005 19:51:00 GMT</pubDate><description>&lt;p&gt;&lt;a href="http://www.hanselman.com/blog/MovingViewStateToTheBottomOfThePage.aspx"&gt;Scott Hanselman&lt;/a&gt; and &lt;a href="http://www.codinghorror.com/blog/archives/000415.html"&gt;Jeff Atwood&lt;/a&gt; recently wrote about moving the ASP.NET hidden _VIEWSTATE form field to the end of the form. The theory behind this movement is that indexers such as Google only read the beginning of the page HTML or&amp;nbsp;treat the beginning HTML with more respect than the rest of the page. If that is true, than it is a bad thing to have the viewstate, which is basically gobbletygook, taking up precious real estate near the top of the page. A side benefit to moving viewstate is that the page source is much easier to read if you don't have to scroll down past the big block of gibberish.&lt;/p&gt;
&lt;p&gt;Scott &lt;a href="http://www.hanselman.com/blog/MovingViewStateToTheBottomOfThePage.aspx"&gt;shows how&lt;/a&gt; to move the viewstate by overriding the Render method of&amp;nbsp;a base&amp;nbsp;Page class. I believe this is the same approach used by the DotNetNuke folks. I show how to do the same thing with an HttpModule. The main advantage of using an HttpModule is that you can add this to your site without implementing a base Page class or even compiling anything, all you need&amp;nbsp;is one of the assemblies attached below. There are some restrictions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This module must come before any compression module or any other module that changes the page HTML in such a way that the __VIEWSTATE field is hidden. Note that I had to disable the blowery.HttpCompression module that was running on this site to get the MoveViewState module to work. No matter what order the two modules were loaded, the content was always compressed before MoveViewState saw it. My guess is that ASP.NET calls the BeginRequest handlers in some specific order that I don't understand. 
&lt;li&gt;This module assumes that the first &amp;lt;/form&amp;gt; tag on the page corresponds to the first __VIEWSTATE field (normally true, but if you have somehow implemented multiple forms, it may not work for you). 
&lt;li&gt;This module assumes UTF8 encoding will work to decode and encode your page contents. If you are using some other encoding, then the contents will not look like text and viewstate will not be moved [the page will still display correctly].&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The code itself is really very simple. There are just two classes: MoveViewStateModule and MoveViewStateFilter. MoveViewStateModule implements IHttpModule. During IHttpModule.Init it&amp;nbsp;adds an event handler to the HttpApplication.BeginRequest event. During the BeginRequest event, it creates a new MoveViewStateFilter and assigns it to the Response.Filter. Here's the code in both VB and C#:&lt;/p&gt;
&lt;h5&gt;MoveViewStateModule.vb&lt;/h5&gt;&lt;pre class="code"&gt;Public Class MoveViewStateModule
    Implements System.Web.IHttpModule

    Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
    End Sub

    Public Sub Init(ByVal context As System.Web.HttpApplication) &lt;br /&gt;        Implements System.Web.IHttpModule.Init
        AddHandler context.BeginRequest, AddressOf BeginRequestHandler
    End Sub

    Private Sub BeginRequestHandler(ByVal sender As Object, ByVal e As EventArgs)
        Dim application As System.Web.HttpApplication = CType(sender, System.Web.HttpApplication)
        application.Response.Filter = New MoveViewStateFilter(application.Response.Filter)
    End Sub
End Class
&lt;/pre&gt;
&lt;h5&gt;MoveViewStateModule.cs&lt;/h5&gt;&lt;pre class="code"&gt;public class MoveViewStateModule : System.Web.IHttpModule
{
    public MoveViewStateModule() {}
    void System.Web.IHttpModule.Dispose() {}

    void System.Web.IHttpModule.Init(System.Web.HttpApplication context) 
    {
        context.BeginRequest += new EventHandler(this.BeginRequestHandler);
    }

    void BeginRequestHandler(object sender, EventArgs e)
    {
        System.Web.HttpApplication application = (System.Web.HttpApplication) sender;
        application.Response.Filter = new MoveViewStateFilter(application.Response.Filter);
    }
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Response.Filter is a System.IO.Stream. Whatever filter we assign must be chained to the previous filter. [And whater filter is assigned later will do the same thing]. The upstream filter will write to our MoveViewStateFilter and our MoveViewStateFilter must write to the downstream filter.&lt;/p&gt;
&lt;p&gt;MoveViewStateFilter is implemented as a type of System.IO.MemoryStream. All it does is capture everything that is written to it in a buffer. When the Close method is called, the buffer is converted into a string. The string is searched for the hidden __VIEWSTATE form field. If the field is found, then the entire viewstate form field is moved to the end of the form. Here is the code in both VB and C#:&lt;/p&gt;
&lt;h5&gt;MoveViewStateFilter.vb&lt;/h5&gt;&lt;pre class="code"&gt;Public Class MoveViewStateFilter
  Inherits System.IO.MemoryStream

  Private _filter As System.IO.Stream
  Private _filtered As Boolean = False

  ''' &amp;lt;param name="filter"&amp;gt;A reference to the downstream HttpResponse.Filter.&amp;lt;/param&amp;gt;
  Public Sub New(ByVal filter As System.IO.Stream)
    _filter = filter
  End Sub

  ''' &amp;lt;remarks&amp;gt;
  ''' The contents of this filter are written to the downstream filter after the hidden
  ''' __VIEWSTATE form field is moved.
  ''' &amp;lt;/remarks&amp;gt;
  ''' &amp;lt;summary&amp;gt;Closes this filter stream.&amp;lt;/summary&amp;gt;
  Public Overrides Sub Close()
    If _filtered Then
      If Me.Length &amp;gt; 0 Then
        Dim bytes() As Byte
        Dim content As String = System.Text.Encoding.UTF8.GetString(Me.ToArray)
        Dim viewstateStart As Integer
        viewstateStart = content.IndexOf("&amp;lt;input type=""hidden"" name=""__VIEWSTATE""")
        If viewstateStart &amp;gt;= 0 Then
          Dim viewstateEnd As Integer
          viewstateEnd = content.IndexOf("/&amp;gt;", viewstateStart) + 2
          Dim viewstate As String
          viewstate = content.Substring(viewstateStart, viewstateEnd - viewstateStart)
          content = content.Remove(viewstateStart, viewstateEnd - viewstateStart)
          Dim formEndStart As Integer = content.IndexOf("&amp;lt;/form&amp;gt;")
          If formEndStart &amp;gt;= 0 Then
            content = content.Insert(formEndStart, viewstate)
          End If
          bytes = System.Text.Encoding.UTF8.GetBytes(content)
        Else
          bytes = Me.ToArray
        End If
        _filter.Write(bytes, 0, bytes.Length)
      End If
      _filter.Close()
    End If
    MyBase.Close()
  End Sub

  Public Overrides Sub Write(ByVal buffer() As Byte, _
      ByVal offset As Integer, ByVal count As Integer)
    If Not System.Web.HttpContext.Current Is Nothing _
        AndAlso System.Web.HttpContext.Current.Response.ContentType = "text/html" Then
      MyBase.Write(buffer, offset, count)
      _filtered = True
    Else
      _filter.Write(buffer, offset, count)
      _filtered = False
    End If
  End Sub

End Class
&lt;/pre&gt;
&lt;h5&gt;MoveViewStateFilter.cs&lt;/h5&gt;&lt;pre class="code"&gt;using System;

namespace StructuredSolutions.MoveViewState
{
  /// &amp;lt;summary&amp;gt;Moves the hidden __VIEWSTATE form field to the end of the form.&amp;lt;/summary&amp;gt;
  public class MoveViewStateFilter : System.IO.MemoryStream
  {
    System.IO.Stream _filter;
    bool _filtered = false;

    /// &amp;lt;param name="filter"&amp;gt;A reference to the downstream HttpResponse.Filter.&amp;lt;/param&amp;gt;
    public MoveViewStateFilter(System.IO.Stream filter)
    {
      _filter = filter;
    }

    /// &amp;lt;summary&amp;gt;Closes this filter stream.&amp;lt;/summary&amp;gt;
    /// &amp;lt;remarks&amp;gt;
    /// The contents of this filter are written to the downstream filter after the hidden
    /// __VIEWSTATE form field is moved.
    /// &amp;lt;/remarks&amp;gt;
    public override void Close()
    {
      if (_filtered)
      {
        if (this.Length &amp;gt; 0)
        {
          byte[] bytes;
          string content = System.Text.Encoding.UTF8.GetString(this.ToArray());
          int viewstateStart = content.IndexOf("&amp;lt;input type=\"hidden\" name=\"__VIEWSTATE\"");
          if (viewstateStart &amp;gt;= 0)
          {
            int viewstateEnd = content.IndexOf("/&amp;gt;", viewstateStart) + 2;
            string viewstate = content.Substring(viewstateStart, viewstateEnd - viewstateStart);
            content = content.Remove(viewstateStart, viewstateEnd - viewstateStart);
            int formEndStart = content.IndexOf("&amp;lt;/form&amp;gt;");
            if (formEndStart &amp;gt;= 0)
              content = content.Insert(formEndStart, viewstate);
            bytes = System.Text.Encoding.UTF8.GetBytes(content);
          }
          else
          {
            bytes = this.ToArray();
          }
          _filter.Write(bytes, 0, bytes.Length);
        }
        _filter.Close();
      }
      base.Close();
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
      if ((System.Web.HttpContext.Current != null)
        &amp;amp;&amp;amp; ("text/html" == System.Web.HttpContext.Current.Response.ContentType))
      {
        base.Write(buffer, offset, count);
        _filtered = true;
      }
      else
      {
        _filter.Write(buffer, offset, count);
        _filtered = false;
      }
    }
  }
&lt;/pre&gt;
&lt;p&gt;Once you have the module in hand, all you have to do is convince ASP.NET to load it. This is done by putting the assembly in the bin folder of the site and adding the module to the list&amp;nbsp;of &amp;lt;httpModules&amp;gt; in web.config.&lt;/p&gt;
&lt;h5&gt;web.config&lt;/h5&gt;&lt;pre class="code"&gt;&amp;lt;system.web&amp;gt;
  &amp;lt;httpModules&amp;gt;
    &amp;lt;!-- To use the C# version, use this add instead of the other one
    &amp;lt;add type="StructuredSolutions.MoveViewState.MoveViewStateModule, StructuredSolutions.MoveViewStateCS"&lt;br /&gt;         name="MoveViewStateModule" /&amp;gt;
    --&amp;gt;
    &amp;lt;add type="StructuredSolutions.MoveViewState.MoveViewStateModule, StructuredSolutions.MoveViewStateVB"&lt;br /&gt;         name="MoveViewStateModule" /&amp;gt;
  &amp;lt;/httpModules&amp;gt;
&amp;lt;/system.web&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;Assemblies&lt;/h5&gt;
&lt;p&gt;Copy either one of the assemblies from the zip file to the bin directory of your site. Make sure the &amp;lt;httpModules&amp;gt; section is loading the one you choose.&lt;/p&gt;
&lt;p&gt;&lt;a href="content/binary/MoveViewState.zip"&gt;File Attachment: MoveViewState.zip (4 KB)&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;Project Files&lt;/h5&gt;
&lt;p&gt;&lt;a href="content/binary/MoveViewStateVB.zip"&gt;File Attachment: MoveViewStateVB.zip (2 KB)&lt;/a&gt;&lt;br /&gt;&lt;a href="content/binary/MoveViewStateCS.zip"&gt;File Attachment: MoveViewStateCS.zip (2 KB)&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Update&amp;nbsp;October 22, 2005:&amp;nbsp;Disable filter if content type is not text/html.&lt;/p&gt;
&lt;p&gt;Update July 17, 2006: Fix insertion point and add search for meta tag to disable moving viewstate on a specific page:&lt;/p&gt;
&lt;p&gt;&amp;lt;meta name="moveviewstate" content="nomove"&amp;gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/MovingVIEWSTATEtothebottomofthepageredux</guid></item><item><title>ANN: Shipping Cost Calculator Maintenance Release 1.3.2</title><pubDate>Thu, 27 Oct 2005 17:17:51 GMT</pubDate><description>&lt;P&gt;Shipping Cost Calculator version 1.3.2 is now available. This maintenance release includes the following changes. Please see the release notes for a complete history of changes.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class=""&gt;CHANGE: Discounted shipping rates are now displayed in a format that is similar to the way they are displayed on Checkout_Shipping.aspx.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=""&gt;CHANGE: References to GeoMonster ZipServe have been removed from the documentation.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;A href="Downloads?download=bvc2004/ShippingCostSetup.exe"&gt;download&lt;/A&gt; | &lt;A href="ProductInfo.aspx?ProductID=SHIPCOST-BV"&gt;purchase&lt;/A&gt; | &lt;A href="help/bvc2004/shippingcost/webframe.html"&gt;online help&lt;/A&gt; | &lt;A href="help/bvc2004/shippingcost/Release%20Notes.html"&gt;release notes&lt;/A&gt;&lt;/BLOCKQUOTE&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNShippingCostCalculatorMaintenanceRelease132</guid></item><item><title>Goofing around with Camtasia Studio PIP</title><pubDate>Tue, 04 Oct 2005 22:29:57 GMT</pubDate><description>&lt;p&gt;Patrick and I were experimenting with &lt;a href="http://www.techsmith.com/products/studio/default.asp"&gt;Camtasia Studio&lt;/a&gt;&amp;rsquo;s new PIP feature&amp;hellip;and having a little fun.&lt;/p&gt;
&lt;p&gt;Video: &lt;a href="http://support.structured-solutions.net/videos/FeedDemonDemo/FeedDemonDemo.html" target="_blank"&gt;FeedDemon Demo&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/GoofingaroundwithCamtasiaStudioPIP</guid></item><item><title>ANN: Shipper Service for StoreFront Maintenance Release 1.1.5</title><pubDate>Wed, 28 Sep 2005 20:20:47 GMT</pubDate><description>&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Shipper Service for StoreFront version 1.1.5&amp;nbsp;is now available. This free maintenance release includes the following changes:: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;FIXED: Using &lt;EM&gt;Quick Ship!&lt;/EM&gt; without selecting or entering a service erases the existing shipping method from the underlying store. Fix changes this behaviour so that if no service is selected, the existing shipping method is kept.&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN-LEFT: 3em"&gt;This is a complete install package, not a patch. Please see the documentation for installation instructions. Careful readers will note that this fix was also included in version 1.1.4. Unfortunately, the fix only made it into the Shipper Service for BVC2004 release.&lt;/P&gt;
&lt;P style="MARGIN-LEFT: 3em"&gt;&lt;A href="downloads/shipperservice/ShipperServiceStoreFront_1.1.exe"&gt;download&lt;/A&gt; | &lt;A href="ProductInfo.aspx?ProductID=SHIPPER-SERVICE"&gt;purchase&lt;/A&gt; | &lt;A href="help/shipper/shipperservice/webframe.html"&gt;online help&lt;/A&gt; | &lt;A href="help/shipper/shipperservice/release%20Notes.html"&gt;release notes&lt;/A&gt;&lt;/P&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNShipperServiceforStoreFrontMaintenanceRelease11</guid></item><item><title>ANN: SignIn Control Maintenance Release 1.3.7</title><pubDate>Wed, 28 Sep 2005 15:33:54 GMT</pubDate><description>&lt;p&gt;SignIn Control version 1.3.7 is now available. This is a free maintenance release that includes the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FIX: Cart cookie is not cleared when switching to new domain for secured checkout. 
&lt;li&gt;FIX: [CustIsSubscribed] value is not updated when editing user profile (CustEdit.aspx). 
&lt;li&gt;NEW: Items are not restored if the attributes have been changed in Merchant Tools. 
&lt;li&gt;NEW: Querystring "nc=1" will clear the cart cookie. 
&lt;li&gt;NEW: Updated Infragistics web controls.&lt;/li&gt;&lt;/ul&gt;
&lt;p style="MARGIN-LEFT: 3em"&gt;&lt;a href="downloads/storefront/signincontrolsetup.exe"&gt;&lt;font color="#881100"&gt;download&lt;/font&gt;&lt;/a&gt; |&amp;nbsp;&lt;a href="ProductInfo.aspx?ProductID=SIGNIN-SF"&gt;&lt;font color="#881100"&gt;purchase&lt;/font&gt;&lt;/a&gt; | &lt;a href="help/storefront/SignInControl/webframe.html"&gt;&lt;font color="#881100"&gt;help&lt;/font&gt;&lt;/a&gt; | &lt;a href="help/storefront/SignInControl/Release%20Notes.html"&gt;&lt;font color="#881100"&gt;release notes&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="padding:2em 0 0 0"&gt;&lt;hr /&gt;&lt;a href="http://structured-solutions.net"&gt;Structured Solutions&lt;/a&gt;&lt;br /&gt;Software to help you build a better store.&lt;/div&gt;</description><guid>http://structured-solutions.net/ANNSignInControlMaintenanceRelease137</guid></item></channel></rss>
