<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>LavaBlast Software Blog</title>
    <description>Help your franchise business get to the next level.</description>
    <link>http://blog.lavablast.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.6.0.0</generator>
    <language>en-CA</language>
    <blogChannel:blogRoll>http://blog.lavablast.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://feeds.feedburner.com/LavablastSoftwareBlog</blogChannel:blink>
    <dc:creator>LavaBlast</dc:creator>
    <dc:title>LavaBlast Software Blog</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LavablastSoftwareBlog" /><feedburner:info uri="lavablastsoftwareblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>LavablastSoftwareBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <title>jQuery plugin to postback an ASP.NET button</title>
      <description>&lt;p&gt;We use jQuery a lot here at LavaBlast, but we also use ASP.NET webforms. We needed a simple reusable way to cause a postback on an asp.net managed Button or LinkButton.&lt;/p&gt;
&lt;p&gt;Here is how it would be used for &amp;lt;asp:Button ID=&amp;rdquo;btShow&amp;rdquo; runat=&amp;rdquo;server&amp;rdquo; OnClick=&amp;rdquo;DoSomething&amp;rdquo; /&amp;gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Cause btShow to postback to the server&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;$(&lt;span class="str"&gt;'[id$="btShow"]'&lt;/span&gt;).postback();&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you are not too familiar with jQuery, the selector [id$=&amp;rdquo;btShow&amp;rdquo;] search for any control with an id &lt;a href="http://api.jquery.com/attribute-ends-with-selector/" target="_blank"&gt;which ends with&lt;/a&gt; &amp;ldquo;btShow&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Since ASP.NET 4.0, you could also use the new ClientIDMode=&amp;rdquo;Static&amp;rdquo; property on the server control to be able to have a static ID on the client and use a jQuery selector like this: $(&amp;lsquo;#btShow&amp;rsquo;), but this is the matter of another discussion completely.&lt;/p&gt;
&lt;p&gt;The postback() method is a jQuery plugin which I include here:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;(&lt;span class="kwrd"&gt;function&lt;/span&gt; ($)&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    $.fn.extend({&lt;/pre&gt;
&lt;pre&gt;        postback: &lt;span class="kwrd"&gt;function&lt;/span&gt; ()&lt;/pre&gt;
&lt;pre class="alt"&gt;        {&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.each(&lt;span class="kwrd"&gt;function&lt;/span&gt; ()&lt;/pre&gt;
&lt;pre class="alt"&gt;            {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="str"&gt;"undefined"&lt;/span&gt; != &lt;span class="kwrd"&gt;typeof&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.click)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;this&lt;/span&gt;.click();&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="kwrd"&gt;this&lt;/span&gt;.tagName.toLowerCase() == &lt;span class="str"&gt;"a"&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class="kwrd"&gt;this&lt;/span&gt;.href.indexOf(&lt;span class="str"&gt;'javascript:'&lt;/span&gt;) == 0)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    eval(&lt;span class="kwrd"&gt;this&lt;/span&gt;.href.toString().replace(&lt;span class="str"&gt;'javascript:'&lt;/span&gt;, &lt;span class="str"&gt;''&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;            });&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;    });    &lt;/pre&gt;
&lt;pre class="alt"&gt;})(jQuery);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Feel free to use this and let us know if you find any problems with the code.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/JAS-8DvHWhE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/JAS-8DvHWhE/post.aspx</link>
      <author>EtienneT</author>
      <comments>http://blog.lavablast.com/post/2012/08/20/jQuery-plugin-to-postback-an-ASPNET-control.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=1c209650-cae6-4a56-a9ec-6c6f05b56265</guid>
      <pubDate>Mon, 20 Aug 2012 10:52:00 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>EtienneT</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=1c209650-cae6-4a56-a9ec-6c6f05b56265</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=1c209650-cae6-4a56-a9ec-6c6f05b56265</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2012/08/20/jQuery-plugin-to-postback-an-ASPNET-control.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=1c209650-cae6-4a56-a9ec-6c6f05b56265</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=1c209650-cae6-4a56-a9ec-6c6f05b56265</feedburner:origLink></item>
    <item>
      <title>Style ASP.NET Web Forms Validators with qTip 2</title>
      <description>&lt;p&gt;&lt;a href="http://blog.lavablast.com/qtipvalidator/default.aspx" target="_blank"&gt;View demo&lt;/a&gt; | &lt;a href="http://blog.lavablast.com/demos/QTipValidators.zip" target="_blank"&gt;Download source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The default validators inside ASP.NET Web Forms are quite uninteresting and require some styling work to look adequate.&amp;nbsp; Recently, we&amp;rsquo;ve been using the &lt;a href="http://craigsworks.com/projects/qtip2/" target="_blank"&gt;qTip2&lt;/a&gt; jQuery library and we love it.&amp;nbsp; qTip enables you to add visually pleasant tooltips to any element.&amp;nbsp; For example, you simply add a &amp;ldquo;title&amp;rdquo; attribute to any element and then apply qTip to this element and the &amp;ldquo;title&amp;rdquo; attribute will be used as the tooltip&amp;rsquo;s text.&amp;nbsp; This is the simplest use case.&amp;nbsp; Here&amp;rsquo;s an example; with our &lt;a href="http://franchiseblast.com/" target="_blank"&gt;FranchiseBlast&lt;/a&gt; registration form.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.lavablast.com/image.axd?picture=image_10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" src="http://blog.lavablast.com/image.axd?picture=image_thumb_5.png" border="0" alt="image" width="560" height="528" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When you try to submit this form and the validation doesn&amp;rsquo;t pass, we replaced the default ASP.NET validators with styled qTip tooltips beside each validated element.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.lavablast.com/image.axd?picture=SNAGHTML6770ee44.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML6770ee44" src="http://blog.lavablast.com/image.axd?picture=SNAGHTML6770ee44_thumb.png" border="0" alt="SNAGHTML6770ee44" width="556" height="520" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Like you can see, the validators have absolute positioning, which enables them to flow outside of the bounds of the registration panel.&amp;nbsp; We could also easily &lt;a href="http://craigsworks.com/projects/qtip2/demos/#tips" target="_blank"&gt;change the position of the bubble&lt;/a&gt; in relation to the validated element and also change the bubble tip position.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a look at what was needed to accomplish this, using a simple ASP.NET project. Here is the main ASP.NET code for the ASPX page.&amp;nbsp; Nothing fancy: a simple form with some validators:&lt;/p&gt;
&lt;h3&gt;Default.aspx&lt;/h3&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="p"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Scripts&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptReference&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptReference&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;="~/Scripts/qtip/jquery.qtip.min.js"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptReference&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;="~/Scripts/validators.js"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Scripts&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="Validate"&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;="width: 300px"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;legend&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Tell us about yourself&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;legend&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="label"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Business Name:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtBusinessName"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:RequiredFieldValidator&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="rfvBusinessName"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ControlToValidate&lt;/span&gt;&lt;span class="kwrd"&gt;="txtBusinessName"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Your business name is required"&lt;/span&gt; &lt;span class="attr"&gt;SetFocusOnError&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="attr"&gt;EnableClientScript&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="alternate"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="label"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Your Name:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtYourName"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:RequiredFieldValidator&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="rfvName"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ControlToValidate&lt;/span&gt;&lt;span class="kwrd"&gt;="txtYourName"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Your name is required"&lt;/span&gt; &lt;span class="attr"&gt;SetFocusOnError&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="attr"&gt;EnableClientScript&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="label"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Your Email:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtEmail"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:RequiredFieldValidator&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="rfvEmail"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ControlToValidate&lt;/span&gt;&lt;span class="kwrd"&gt;="txtEmail"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Email is required"&lt;/span&gt; &lt;span class="attr"&gt;SetFocusOnError&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="attr"&gt;EnableClientScript&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:RegularExpressionValidator&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="revEmail"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Invalid Email"&lt;/span&gt; &lt;span class="attr"&gt;ControlToValidate&lt;/span&gt;&lt;span class="kwrd"&gt;="txtEmail"&lt;/span&gt; &lt;span class="attr"&gt;SetFocusOnError&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="attr"&gt;ValidationExpression&lt;/span&gt;&lt;span class="kwrd"&gt;="^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-\w]*[0-9a-zA-Z])*\.)+[a-zA-Z]{2,9})$"&lt;/span&gt; &lt;span class="attr"&gt;EnableClientScript&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="btnCreateAccount"&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="Next"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Create Account"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Starting from the top, we need jQuery and also qTip to be added to our page.&amp;nbsp; The interesting JavaScript code in located in ~/Scripts/validators.js.&amp;nbsp; The rest of the code here is a simple ASP.NET form.&amp;nbsp; One important thing is that each element to be validated is enclosed in a &amp;lt;div&amp;gt; with his corresponding validators.&amp;nbsp; This is important because we will use this convention later in our script to find the associated validators for an input control.&lt;/p&gt;
&lt;p&gt;I also have to mention that I added some lines in the .skin file of the App_Theme:&lt;/p&gt;
&lt;h3&gt;Default.skin&lt;/h3&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:RequiredFieldValidator&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="ErrorMsg"&lt;/span&gt; &lt;span class="attr"&gt;Display&lt;/span&gt;&lt;span class="kwrd"&gt;="Dynamic"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:CustomValidator&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="ErrorMsg"&lt;/span&gt; &lt;span class="attr"&gt;Display&lt;/span&gt;&lt;span class="kwrd"&gt;="Dynamic"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:RangeValidator&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="ErrorMsg"&lt;/span&gt; &lt;span class="attr"&gt;Display&lt;/span&gt;&lt;span class="kwrd"&gt;="Dynamic"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:CompareValidator&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="ErrorMsg"&lt;/span&gt; &lt;span class="attr"&gt;Display&lt;/span&gt;&lt;span class="kwrd"&gt;="Dynamic"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:RegularExpressionValidator&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="ErrorMsg"&lt;/span&gt; &lt;span class="attr"&gt;Display&lt;/span&gt;&lt;span class="kwrd"&gt;="Dynamic"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This will force CssClass=&amp;rdquo;ErrorMsg&amp;rdquo; on validators.&amp;nbsp; This will be used next in our JavaScript code to find the validators:&lt;/p&gt;
&lt;h3&gt;validator.js&lt;/h3&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(&lt;span class="kwrd"&gt;function&lt;/span&gt; () {&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;function&lt;/span&gt; getValidator() {&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).parent().find(&lt;span class="str"&gt;'.ErrorMsg'&lt;/span&gt;).filter(&lt;span class="kwrd"&gt;function&lt;/span&gt; () { &lt;span class="kwrd"&gt;return&lt;/span&gt; $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).css(&lt;span class="str"&gt;'display'&lt;/span&gt;) != &lt;span class="str"&gt;'none'&lt;/span&gt;; });&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; inputs = &lt;span class="str"&gt;'.Validate input:text, .Validate select, .Validate input:password'&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; submit = $(&lt;span class="str"&gt;'input:submit'&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; q = $(inputs).qtip({&lt;/pre&gt;
&lt;pre class="alt"&gt;        position: {&lt;/pre&gt;
&lt;pre&gt;            my: &lt;span class="str"&gt;'center left'&lt;/span&gt;,&lt;/pre&gt;
&lt;pre class="alt"&gt;            at: &lt;span class="str"&gt;'center right'&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        },&lt;/pre&gt;
&lt;pre class="alt"&gt;        content: {&lt;/pre&gt;
&lt;pre&gt;            text: &lt;span class="kwrd"&gt;function&lt;/span&gt; (api) {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; getValidator.call(&lt;span class="kwrd"&gt;this&lt;/span&gt;).html();&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;        },&lt;/pre&gt;
&lt;pre&gt;        show: {&lt;/pre&gt;
&lt;pre class="alt"&gt;            ready: &lt;span class="kwrd"&gt;true&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;event&lt;/span&gt;: &lt;span class="str"&gt;'none'&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        },&lt;/pre&gt;
&lt;pre&gt;        hide: {&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;event&lt;/span&gt;: &lt;span class="str"&gt;'none'&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        },&lt;/pre&gt;
&lt;pre class="alt"&gt;        style: {&lt;/pre&gt;
&lt;pre&gt;            classes: &lt;span class="str"&gt;'ui-tooltip-red ui-tooltip-shadow ui-tooltip-rounded'&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        },&lt;/pre&gt;
&lt;pre&gt;        events: {&lt;/pre&gt;
&lt;pre class="alt"&gt;            show: &lt;span class="kwrd"&gt;function&lt;/span&gt; (&lt;span class="kwrd"&gt;event&lt;/span&gt;, api) {&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;var&lt;/span&gt; $&lt;span class="kwrd"&gt;this&lt;/span&gt; = api.elements.target;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;var&lt;/span&gt; validator = getValidator.call($&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (validator.length == 0)&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;event&lt;/span&gt;.preventDefault();&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;    });&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (window.Page_ClientValidate != undefined) {&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;function&lt;/span&gt; afterValidate() {&lt;/pre&gt;
&lt;pre&gt;            $(inputs).each(&lt;span class="kwrd"&gt;function&lt;/span&gt; () {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;var&lt;/span&gt; validator = getValidator.call(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (validator.length &amp;gt; 0) {&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;var&lt;/span&gt; text = validator.html();&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                    $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).addClass(&lt;span class="str"&gt;'Error'&lt;/span&gt;).qtip(&lt;span class="str"&gt;'show'&lt;/span&gt;).qtip(&lt;span class="str"&gt;'option'&lt;/span&gt;, &lt;span class="str"&gt;'content.text'&lt;/span&gt;, text);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//                    validator.hide();&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                }&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).removeClass(&lt;span class="str"&gt;'Error'&lt;/span&gt;).qtip(&lt;span class="str"&gt;'hide'&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            });&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        $(inputs).blur(afterValidate);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; oldValidate = Page_ClientValidate;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        Page_ClientValidate = &lt;span class="kwrd"&gt;function&lt;/span&gt; (group) {&lt;/pre&gt;
&lt;pre&gt;            oldValidate(group);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            afterValidate.call(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            submit.removeAttr(&lt;span class="str"&gt;'disabled'&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;});&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;There is much to explain in this code.&amp;nbsp; First we register a new function to be executed each time there&amp;rsquo;s an ASP.NET PostBack on the page here: Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(&lt;span class="kwrd"&gt;function&lt;/span&gt; () { &amp;hellip; });&lt;/p&gt;
&lt;p&gt;The function getValidator finds the visible ASP.NET validators associated to a control to be validated.&amp;nbsp; We use the fact that the control to validate and the validators are contained inside a &amp;lt;div&amp;gt;.&lt;/p&gt;
&lt;p&gt;We apply qTip to the inputs to validate and we get the text of the message by finding the visible validators.&amp;nbsp; Also we have some logic to prevent showing the qTip element if there aren&amp;rsquo;t any visible validators.&lt;/p&gt;
&lt;p&gt;We also do some monkey patching at the end where we inject our own code inside the Page_ClientValidate ASP.NET JavaScript method.&amp;nbsp; To do that, we simply get a reference to the Page_ClientValidate function, create a new function with our additional code (calling the old Page_ClientValidate) plus we override window.Page_ClientValidate with our new function.&amp;nbsp; This new function have both the new and old functionality.&lt;/p&gt;
&lt;p&gt;You would probably have to modify this code a little bit to fit your needs, but this shows how you could integrate qTip2 for nicer validators in ASP.NET Web Forms.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.lavablast.com/qtipvalidator/default.aspx" target="_blank"&gt;View demo&lt;/a&gt; | &lt;a href="http://blog.lavablast.com/demos/QTipValidators.zip" target="_blank"&gt;Download source&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/SmLP9q2psyQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/SmLP9q2psyQ/post.aspx</link>
      <author>EtienneT</author>
      <comments>http://blog.lavablast.com/post/2012/08/13/Style-ASPNET-Web-forms-validators-with-qTip-2.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=0c588347-edfd-42ef-b663-e6ae8a894bb3</guid>
      <pubDate>Mon, 13 Aug 2012 08:20:00 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>EtienneT</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=0c588347-edfd-42ef-b663-e6ae8a894bb3</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=0c588347-edfd-42ef-b663-e6ae8a894bb3</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2012/08/13/Style-ASPNET-Web-forms-validators-with-qTip-2.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=0c588347-edfd-42ef-b663-e6ae8a894bb3</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=0c588347-edfd-42ef-b663-e6ae8a894bb3</feedburner:origLink></item>
    <item>
      <title>Microsoft Excel on Multi-Monitor Machines</title>
      <description>&lt;p&gt;All of the developers at LavaBlast use three monitors; utilizing multiple monitors has significantly increased our efficiency. However, Microsoft Excel doesn’t work particularly well in a multi-monitor setup. By default, every time you open a new Excel file, its contents are displayed within the same instance. You have to manually launch other instances of Excel to have one instance per monitor, which is time consuming. &lt;/p&gt;  &lt;p&gt;It is possible to configure Microsoft Excel to load one Window per file, but it involves a number of obscure configuration settings &amp;amp; registry changes. Every time we move to a new machine, this configuration needs to be redone. The information is spread out on a number of sites/forums and it takes a while to re-discover the sources. his post aims at centralizing this information. &lt;/p&gt;  &lt;p&gt;In particular, this post focuses on Microsoft Excel 2010 on Windows 7 64-bit. I believe the fix works on other versions as well; feel free to comment on this blog post if the steps are different. &lt;/p&gt;  &lt;h1&gt;Step 1) Force Excel To Open Multiple Windows&lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;Excel 2010: &lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;File –&amp;gt; Options –&amp;gt; Advanced –&amp;gt; Scroll down into the “General” section –&amp;gt; Check the “Ignore other applications that use Dynamic Data Exchange (DDE)” checkbox &lt;a href="http://blog.lavablast.com/image.axd?picture=image_9.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.lavablast.com/image.axd?picture=image_thumb_4.png" width="543" height="444" /&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Excel 2007:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Office Icon in the top left corner of Excel –&amp;gt; &lt;a href="http://spreadsheets.about.com/od/exceltips/qt/excel07_options.htm"&gt;Excel Options&lt;/a&gt; –&amp;gt; Advanced&amp;#160; -&amp;gt; Scroll down into the “General” section –&amp;gt; Check the “Ignore other applications that use Dynamic Data Exchange (DDE)” checkbox &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Once this change is done, every time you double click on an Excel file in Windows Explorer, a new instance of Excel will open. However, you’ll probably encounter the following error. &lt;/p&gt;  &lt;h1&gt;Step 2) Fixing “There was a problem sending the command to the program”&lt;/h1&gt;  &lt;p&gt;Each Excel file you open from Windows Explorer now launches in its own separate window. However, Excel spits out “There was a problem sending the command to the program” and leaves the Excel window blank.&amp;#160; You can drag &amp;amp; drop your existing file to this window to open it, but this is still painful. We will need to change the system registry to solve this issue; please refrain from doing this is you are not comfortable with the reg edit tool. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.wikihow.com/Open-Regedit"&gt;Launch regedit&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Rename the HKEY_CLASSES_ROOT\&lt;strong&gt;Excel.Sheet.8&lt;/strong&gt;\shell\Open\ddeexec&amp;#160; key to HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\ddeexec.bak &lt;/li&gt;    &lt;li&gt;Edit HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command\(Default).&amp;#160; &lt;strong&gt;Change /dde to “%1” in the value. &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;em&gt;As an example, mine was from &amp;quot;C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE&amp;quot; &lt;strong&gt;/dde&lt;/strong&gt; to &amp;quot;C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE&amp;quot; &lt;strong&gt;&amp;quot;%1&amp;quot;&lt;/strong&gt;&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Edit HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command\command. &lt;strong&gt;Change /dde to “%1” in the value. &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;em&gt;As an example, mine was from ykG^V5!!!!!!!!!MKKSkEXCELFiles&amp;gt;VijqBof(Y8'w!FId1gLQ &lt;strong&gt;/dde&lt;/strong&gt; to ykG^V5!!!!!!!!!MKKSkEXCELFiles&amp;gt;VijqBof(Y8'w!FId1gLQ &lt;strong&gt;&amp;quot;%1&amp;quot;&lt;/strong&gt;&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Rename the HKEY_CLASSES_ROOT\&lt;strong&gt;Excel.Sheet.12&lt;/strong&gt;\shell\Open\ddeexec key to HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\ddeexec.bak &lt;/li&gt;    &lt;li&gt;Edit HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command\(Default). Change /dde to “%1” in the value. &lt;/li&gt;    &lt;li&gt;Edit HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command\command. Change /dde to “%1” in the value. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Excel should now load separate Windows for each file you open. This setup will consume more memory, but will vastly increase your productivity.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Troubleshooting note: &lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ensure you used “%1” with the surrounding quotes (not this: %1) in the above registry changes. Otherwise, you will get an error message: “’{file}’ could not be found. Check the spelling of the file name, and verify that the file location is correct.”&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Thanks to &lt;a href="http://social.technet.microsoft.com/Forums/en-US/office2007deploymentcompatibility/thread/c42f825d-b7e8-48c8-b5af-30563b839f09"&gt;Turbo2001rt&lt;/a&gt;&amp;#160; for the final important tweaks. &lt;/p&gt;  &lt;ul&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/HRO_8-DgzFA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/HRO_8-DgzFA/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2012/06/05/Microsoft-Excel-on-Multi-Monitor-Machines.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=a2d77e67-9fde-49a0-beae-fcdd5d70258c</guid>
      <pubDate>Tue, 05 Jun 2012 11:51:14 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=a2d77e67-9fde-49a0-beae-fcdd5d70258c</pingback:target>
      <slash:comments>25</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=a2d77e67-9fde-49a0-beae-fcdd5d70258c</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2012/06/05/Microsoft-Excel-on-Multi-Monitor-Machines.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=a2d77e67-9fde-49a0-beae-fcdd5d70258c</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=a2d77e67-9fde-49a0-beae-fcdd5d70258c</feedburner:origLink></item>
    <item>
      <title>FranchiseBlast Wins Bootstrap Award</title>
      <description>&lt;a href="http://www.franchiseblast.com"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px; display: inline; border-top: 0px; border-right: 0px" title="FranchiseBlast Wins Bootstrap Award" border="0" alt="FranchiseBlast Wins Bootstrap Award" align="right" src="http://blog.lavablast.com/image.axd?picture=IMG_2470_2.jpg" width="286" height="427" /&gt;&lt;/a&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;We’re proud to announce that 2012 is off to a great start! We’ve recently received lots of local recognition and thought we’d share this great news with you. &lt;/p&gt;  &lt;p&gt;First, we’ve been listed as a &lt;a href="http://www.obj.ca/Other/Special%20Reports/2012-02-22/article-2904339/STARTUPS-TO-WATCH-LavaBlast-Simplifying-franchise-operations/1"&gt;Startup To Watch for 2012 by the Ottawa Business Journal&lt;/a&gt;. Past nominees (&lt;a href="http://www.obj.ca/Other/Special-Reports/2011-01-24/article-2166960/STARTUPS-TO-WATCH%3A-Chide.it/1"&gt;Chide.it&lt;/a&gt;, &lt;a href="http://www.obj.ca/Other/Special-Reports/2011-01-24/article-2166998/STARTUPS-TO-WATCH%3A-FaveQuest/1"&gt;FaveQuest&lt;/a&gt;, &lt;a href="http://www.obj.ca/Other/Special-Reports/2011-01-24/article-2167033/STARTUPS-TO-WATCH%3A-Select-Start-Studios/1"&gt;Select Start Studios&lt;/a&gt; and &lt;a href="http://www.obj.ca/Other/Special-Reports/2011-01-24/article-2167019/STARTUPS-TO-WATCH%3A-PatientWay/1"&gt;PatientWay&lt;/a&gt; to name a few) have had a tremendous impact on the Ottawa-Gatineau startup community&amp;#160; and we strive to do the same. For decades, our region has featured a tremendous wealth of engineering talent and we’re proud to be a part of the group of companies rebuilding our digital economy.&amp;#160; &lt;/p&gt;  &lt;p&gt;Second, we’ve won a &lt;a href="http://www.exploriem.org/ottawa-celebrates-the-2012-bootstrap-awards-winners/"&gt;Bootstrap Award&lt;/a&gt; for Best Sales/Value Proposition. This award recognizes companies who’ve grown their companies without the use of external funding (such as venture capital). We’ve been growing organically since our creation in 2007 and bootstrapping has enabled us to focus on creating value for our customers from day one. Today, we have an awesome product that is a perfect fit for our target market. If we had to name a single element which helped us refine our value proposition (other than listening to our customers for five years), I would have to name &lt;a href="http://blog.lavablast.com/post/2010/06/28/Lead-To-Win-Program-Review.aspx"&gt;Lead To Win&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.leadtowin.ca/"&gt;Lead To Win&lt;/a&gt; is a startup ecosystem/accelerator (which takes no equity)&amp;#160; which helps companies get to market faster and/or accelerate their growth. We strongly recommend the program to other high-tech entrepreneurs, especially engineering students who don’t have a background in business. &lt;/p&gt;  &lt;p&gt;Thank you to everyone who’s vouched for us over the years. 2012 will be a year of great growth for us and we hope to share more good news soon! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/cBbidfRutCQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/cBbidfRutCQ/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2012/02/27/FranchiseBlast-Wins-Bootstrap-Award.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=fb33bcbb-dd0f-44df-8f79-10a864316276</guid>
      <pubDate>Mon, 27 Feb 2012 10:07:00 -0400</pubDate>
      <category>News</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=fb33bcbb-dd0f-44df-8f79-10a864316276</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=fb33bcbb-dd0f-44df-8f79-10a864316276</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2012/02/27/FranchiseBlast-Wins-Bootstrap-Award.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=fb33bcbb-dd0f-44df-8f79-10a864316276</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=fb33bcbb-dd0f-44df-8f79-10a864316276</feedburner:origLink></item>
    <item>
      <title>FranchiseBlast Now Member of the CFA and CQF</title>
      <description>&lt;p&gt;&lt;a href="http://www.lavablast.com" target="_blank"&gt;LavaBlast Software Inc&lt;/a&gt;. (creator of &lt;a href="http://www.franchiseblast.com" target="_blank"&gt;FranchiseBlast&lt;/a&gt;) is proud to announce that it is now a member of both the &lt;a href="http://www.cfa.ca" target="_blank"&gt;CFA (Canadian Franchise Association)&lt;/a&gt; and the &lt;a href="http://www.cqf.ca" target="_blank"&gt;CQF (Conseil Québécois de la Franchise / Quebec Franchise Association)&lt;/a&gt;. Over the past five years, we’ve helped numerous franchises grow thanks to improved operational software and we feel the time is now ripe to get involved in these franchise associations. We hope to have the pleasure to meet you at one of the upcoming CFA or CQF events, such as the &lt;a href="http://cfa.ca/NationalConvention/default.aspx" target="_blank"&gt;CFA’s National Convention in April 2012&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.franchiseblast.com"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="franchiseblast" border="0" alt="franchiseblast" src="http://blog.lavablast.com/image.axd?picture=franchiseblast_1.png" width="240" height="76" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://www.cfa.ca"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CFA" border="0" alt="CFA" src="http://blog.lavablast.com/image.axd?picture=CFA_1.png" width="104" height="95" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://www.cqf.ca"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="cqf" border="0" alt="cqf" src="http://blog.lavablast.com/image.axd?picture=cqf_1.png" width="150" height="102" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/Oo5JBjrcVEc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/Oo5JBjrcVEc/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2012/02/17/FranchiseBlast-Now-Member-of-the-CFA-and-CQF.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=1f2e09eb-5b33-4fc0-ab6b-2d70eadf2f46</guid>
      <pubDate>Fri, 17 Feb 2012 11:25:23 -0400</pubDate>
      <category>News</category>
      <category>Franchising</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=1f2e09eb-5b33-4fc0-ab6b-2d70eadf2f46</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=1f2e09eb-5b33-4fc0-ab6b-2d70eadf2f46</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2012/02/17/FranchiseBlast-Now-Member-of-the-CFA-and-CQF.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=1f2e09eb-5b33-4fc0-ab6b-2d70eadf2f46</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=1f2e09eb-5b33-4fc0-ab6b-2d70eadf2f46</feedburner:origLink></item>
    <item>
      <title>New Grant for Canadian Franchises to Adopt Tech</title>
      <description>&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="(From left to right) Jason Kealey (President, LavaBlast Software), The Honourable Christian Paradis (Minister of Industry)" border="0" alt="(From left to right) Jason Kealey (President, LavaBlast Software), The Honourable Christian Paradis (Minister of Industry)" align="right" src="http://blog.lavablast.com/image.axd?picture=IMG_0137.jpg" width="324" height="484" /&gt; Yesterday, the &lt;a href="http://www.nrc-cnrc.gc.ca/eng/ibp/irap/digital-technology-adoption/dtapp-index.html" target="_blank"&gt;Minister of Industry announced a new grant pilot program (DTAPP)&lt;/a&gt; offering up to &lt;a href="http://www.marketwire.com/press-release/government-of-canada-invests-in-canadian-business-innovation-1586453.htm" target="_blank"&gt;$99,999 in financial support to Canadian small- and medium-sized enterprises (SMEs)&lt;/a&gt; to facilitate the adoption of digital technologies. The &lt;a href="http://franchiseblast.com/lavablast-and-boomerang-kids-when-helping-local-families-meets-the-cloud/" target="_blank"&gt;announcement featured FranchiseBlast&lt;/a&gt; as an example of such a digital technology and &lt;a href="http://www.ottawacitizen.com/technology/Tech+fund+help+small+business/5710269/story.html" target="_blank"&gt;was made inside one of the Boomerang Kids stores, our newest franchise client&lt;/a&gt; (see photo). &lt;/p&gt;  &lt;p&gt;This pilot program is great news for Canadian franchises as it includes the adoption of business systems (franchise management, customer/work order management, inventory management, etc.). In the context of a franchise, these are often customized systems ensuring the uniformity of their proprietary business processes across all franchisees. Off-the-shelf hardware and software are not covered by this grant, but the following are: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Internal labour costs: franchisor’s time spent elaborating the system &lt;/li&gt;    &lt;li&gt;Contractors: technology firm helping the franchisor adopt the technology &lt;/li&gt;    &lt;li&gt;Travel &amp;amp; Training &lt;/li&gt;    &lt;li&gt;Hiring of recent college graduates as a part of the adoption process&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The &lt;a href="http://www.nrc-cnrc.gc.ca/eng/ibp/irap/digital-technology-adoption/dtapp-index.html" target="_blank"&gt;new grant program is managed by NRC-IRAP&lt;/a&gt;. As with all NRC-IRAP grants, the process starts with the franchisor developing a relationship with an &lt;a href="http://www.nrc-cnrc.gc.ca/eng/ibp/irap/about/advisors.html" target="_blank"&gt;Industrial Technology Advisor&lt;/a&gt; (ITA). Over 240 ITAs, located all over Canada, will work with you to determine the best course of action for your business, whether is be via the new &lt;a href="http://www.nrc-cnrc.gc.ca/eng/ibp/irap/digital-technology-adoption/dtapp-index.html" target="_blank"&gt;Digital Technology Adoption Pilot Program (DTAPP)&lt;/a&gt; or one of the numerous existing grant program­s. &lt;/p&gt;  &lt;p&gt;As our specialty is creating &lt;a href="http://franchiseblast.com/services/" target="_blank"&gt;franchise-specific software solutions&lt;/a&gt;, we’ve gone through the process in the past. Our team &lt;a href="http://franchiseblast.com/contact/" target="_blank"&gt;can work with both you and your ITA&lt;/a&gt; to establish the scope and requirements for your project.&lt;/p&gt;  &lt;p&gt;For more information about DTAPP, please &lt;a href="http://www.nrc-cnrc.gc.ca/eng/ibp/irap/digital-technology-adoption/dtapp-index.html" target="_blank"&gt;visit this site&lt;/a&gt; and call toll-free 1-855-453-3940 to be assigned an ITA in your area.&amp;#160; &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/zNRhYBGHLa4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/zNRhYBGHLa4/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2011/11/15/new-grant-for-canadian-franchises-to-adopt-tech.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=52066f6c-2c2c-497b-85c1-92cecf14ef32</guid>
      <pubDate>Tue, 15 Nov 2011 11:18:13 -0400</pubDate>
      <category>Franchising</category>
      <category>News</category>
      <category>Business</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=52066f6c-2c2c-497b-85c1-92cecf14ef32</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=52066f6c-2c2c-497b-85c1-92cecf14ef32</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/11/15/new-grant-for-canadian-franchises-to-adopt-tech.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=52066f6c-2c2c-497b-85c1-92cecf14ef32</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=52066f6c-2c2c-497b-85c1-92cecf14ef32</feedburner:origLink></item>
    <item>
      <title>LavaBlast and Boomerang Kids: When helping local families meets the Cloud</title>
      <description>&lt;p&gt;&lt;a href="http://www.boomerangkids.ca"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px; display: inline; border-top: 0px; border-right: 0px" title="(From left to right): Jason Kealey (President LavaBlast Software Inc.), Honourable Christian Paradis (Minister of Industry), Bogdan Ciobanu (Director General NRC-IRAP), Lynne Plante (Directrice NRC-IRAP), Heather Meek (co-owner, Boomerang Kids Consignment Shops)" border="0" alt="(From left to right): Jason Kealey (President LavaBlast Software Inc.), Honourable Christian Paradis (Minister of Industry), Bogdan Ciobanu (Director General NRC-IRAP), Lynne Plante (Directrice NRC-IRAP), Heather Meek (co-owner, Boomerang Kids Consignment Shops)" align="right" src="http://blog.lavablast.com/image.axd?picture=IMG_0111.jpg" width="404" height="309" /&gt;&lt;/a&gt; LavaBlast, a leading provider of cloud-based franchise management solutions, announced today the deployment of its flagship product, &lt;a href="http://www.franchiseblast.com"&gt;FranchiseBlast&lt;/a&gt;, to the first of four &lt;a href="http://www.boomerangkids.ca"&gt;Boomerang Kids&lt;/a&gt; locations. This state of the art software solution enables &lt;a href="http://www.boomerangkids.ca"&gt;Boomerang Kids to grow their consignment franchise nationwide&lt;/a&gt; while allowing local families to shop smarter. &lt;/p&gt;  &lt;p&gt;&amp;quot;&lt;em&gt;Using the FranchiseBlast system will allow employees to focus more on helping local families,&lt;/em&gt;&amp;quot; said Heather Meek, owner of Boomerang Kids. &amp;quot;&lt;em&gt;We are expanding our franchise throughout Canada and we want to ensure the success of our current and future franchisees. FranchiseBlast will allow us to offer a complete easy-to-use system that helps store owners, employees and their customers. And now, I can even manage my business on my iPad!&lt;/em&gt;&amp;quot;&lt;/p&gt;  &lt;p&gt;The FranchiseBlast deployment consists of an integrated suite of local and cloud-based tools that allow Boomerang Kids to automate the management recipes they’ve perfected throughout the years and replicate them in a franchise environment. FranchiseBlast will boost Boomerang Kids’ efficiency and customer service with:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Point of Sale (POS) stations to allow employees manage and sell all items under consignment. &lt;/li&gt;    &lt;li&gt;In-store interactive kiosks and web-based tools to making it possible for parents to review their account and item statuses&lt;/li&gt;    &lt;li&gt;A cloud-based franchise management solution giving both franchisees and franchisors immediate insight &lt;a name="_GoBack"&gt;&lt;/a&gt;into the franchise’s operations. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;quot;&lt;em&gt;We are excited to be powering the expansion of a local franchise. Boomerang Kids has a solid management team and now has the tools to support its upcoming rapid growth.&lt;/em&gt;&amp;quot; said Jason Kealey, President of LavaBlast. &amp;quot;&lt;em&gt;This collaboration strengthens our position in the Franchise Management market and has allowed us to bring on new team members and scale up our operations.&lt;/em&gt;&amp;quot;&lt;/p&gt;  &lt;h4&gt;&lt;a href="http://www.boomerangkids.ca"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.lavablast.com/image.axd?picture=image_6.png" width="180" height="62" /&gt;&lt;/a&gt; &lt;/h4&gt;  &lt;h4&gt;About Boomerang Kids:&lt;/h4&gt;  &lt;p&gt;At &lt;a href="http://www.boomerangkids.ca"&gt;Boomerang Kids&lt;/a&gt;, families can help the planet and their wallet through reuse and recycling of kids clothing and equipment. Parents bring the items into the store and Boomerang Kids will take care of verifying quality, selling and, best of all, sharing profits. The concept is extremely popular and independent of the economic climate. From their four initial locations in the Ottawa region, Boomerang Kids is now expanding Canada-wide via franchising. &lt;/p&gt;  &lt;h4&gt;&lt;a href="http://www.lavablast.com"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.lavablast.com/image.axd?picture=image_7.png" width="141" height="64" /&gt;&lt;/a&gt; &lt;/h4&gt;  &lt;h4&gt;About LavaBlast Software Inc.:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.lavablast.com"&gt;LavaBlast&lt;/a&gt; produces state of the art software solutions for the franchise industry and has played an integral part in the growth of numerous franchises, both in Canada and globally. By migrating to FranchiseBlast, franchisors reap the benefits of a turn-key software solution for their franchisees and LavaBlast’s deep software engineering skills to adapt their franchise in a rapidly changing technological environment. &lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;&lt;a href="http://www.franchiseblast.com"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.lavablast.com/image.axd?picture=image_8.png" width="197" height="67" /&gt;&lt;/a&gt; &lt;/h4&gt;  &lt;h4&gt;About our flagship product, FranchiseBlast:&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.franchiseblast.com"&gt;FranchiseBlast&lt;/a&gt; empowers you to run a successful franchise business with easy-to-use operational software. Manage day-to-day issues with franchisees, see everything happening in real-time and increase the level of control you have over your franchise business.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lavablast.com/pr/20111114_PressRelease_BoomerangKids.pdf" target="_blank"&gt;Download this press release (PDF format).&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/47Vpnj0kC7Y" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/47Vpnj0kC7Y/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2011/11/14/LavaBlast-and-Boomerang-Kids-When-helping-local-families-meets-the-Cloud.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=ad0f1c17-bdd4-4d74-b5ee-0e26654deb9a</guid>
      <pubDate>Mon, 14 Nov 2011 20:17:32 -0400</pubDate>
      <category>Franchising</category>
      <category>News</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=ad0f1c17-bdd4-4d74-b5ee-0e26654deb9a</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=ad0f1c17-bdd4-4d74-b5ee-0e26654deb9a</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/11/14/LavaBlast-and-Boomerang-Kids-When-helping-local-families-meets-the-Cloud.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=ad0f1c17-bdd4-4d74-b5ee-0e26654deb9a</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=ad0f1c17-bdd4-4d74-b5ee-0e26654deb9a</feedburner:origLink></item>
    <item>
      <title>LavaBlast POS v4.0.0</title>
      <description>&lt;p&gt;We’re just about to release the version 4.0.0 of our &lt;a href="http://franchiseblast.com/tour/retail-franchises/pos/"&gt;franchise point of sale system&lt;/a&gt;. One of the most noteworthy change is the fact we’ve given the look &amp;amp; feel a major overhaul, thanks to &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; which &lt;a href="http://blog.lavablast.com/post/2011/05/24/Re-skin-your-existing-web-app-using-jQuery-Mobile.aspx"&gt;we’ve blogged about previously&lt;/a&gt;. We thought we’d take a minute to share with you what makes it so special!&lt;/p&gt;  &lt;p&gt;First off, I’ve recorded a short video featuring a variation of our &lt;a href="http://franchiseblast.com/tour/retail-franchises/pos/"&gt;franchise POS&lt;/a&gt; for the &lt;a href="http://www.teddymountain.com"&gt;Teddy Mountain franchise&lt;/a&gt;. Teddy Mountain provides the stuff your own teddy bear experience to children worldwide and have been using our POS since 2006. &lt;/p&gt; &lt;iframe height="516" src="http://www.youtube.com/embed/Jf0WlugXpQ8?hd=1" frameborder="0" width="660" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;As you’ll see, I focus on a few of our differentiators in the point of sale space. We’re not a point of sale company and our POS is not conventional: we’re a franchise software company and we’ve created the best point of sale system for a franchise environment. &lt;/p&gt;  &lt;p&gt;We bake in a franchise’s unique business processes into the point of sale, making it very powerful while still extremely easy to use. By integrating our point of sale with &lt;a href="http://www.franchiseblast.com"&gt;FranchiseBlast&lt;/a&gt;, we’ve also eliminated dozens of standardization/uniformity issues which face small retail chains or franchises. &lt;/p&gt;  &lt;p&gt;Furthermore, we’ve given additional focus to cross-browser compatibility in this release as our POS is not only used regular POS hardware (in brick &amp;amp; mortar stores) but also on the &lt;a href="http://apple.com/ipad"&gt;Apple iPad&lt;/a&gt; for back office operations an for managing the warehouses that feed our &lt;a href="http://franchiseblast.com/tour/retail-franchises/e-commerce/"&gt;franchise e-commerce websites&lt;/a&gt;.&amp;#160; We’re definitely excited by the potential tablets have for both retail and service-based franchises! Expect more news from us in this space soon! &lt;/p&gt;  &lt;p&gt;In the meantime, if you know of small chains / new franchises which want to explore disruptive technologies in their locations, we hope you’ll point them in our direction! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/lHXSa8vKcuk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/lHXSa8vKcuk/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2011/09/06/LavaBlast-POS-v400.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=fc3ecb43-b17d-485d-9c33-b053f7d08682</guid>
      <pubDate>Tue, 06 Sep 2011 13:49:00 -0400</pubDate>
      <category>Software</category>
      <category>News</category>
      <category>Franchising</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=fc3ecb43-b17d-485d-9c33-b053f7d08682</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=fc3ecb43-b17d-485d-9c33-b053f7d08682</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/09/06/LavaBlast-POS-v400.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=fc3ecb43-b17d-485d-9c33-b053f7d08682</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=fc3ecb43-b17d-485d-9c33-b053f7d08682</feedburner:origLink></item>
    <item>
      <title>Gotcha: Reporting Services Viewer bugs on Google Chrome</title>
      <description>&lt;p&gt;We include the ASP.NET ReportViewer which comes with Microsoft SQL Reporting Services inside some of our applications. Simply put, it generates a web-based version of the report and can easily be integrated within a website. However, the ReportViewer has been plagued with numerous cross-browser compatibility bugs over the years. Some have been fixed, while others remain. Recently, we’ve had the following issues:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;On Google Chrome, each button in the toolbar takes a separate line. You thus end up with 5 toolbars instead of one, taking up all the space. &lt;/li&gt;    &lt;li&gt;On Google Chrome, the width &amp;amp; height were slightly off (50 to 100 pixels), causing scrollbars to appear. &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;A quick search revealed some &lt;a href="http://www.mazsoft.com/blog/post/2009/08/13/ReportViewer-control-toolbar-in-Google-Chrome-browser.aspx"&gt;sample code&lt;/a&gt; for &lt;a href="http://stackoverflow.com/questions/778688/reportviewer-control-height-issue"&gt;similar issues&lt;/a&gt;, but none of them fully resolved our issues. Mainly, we require AsyncRendering=”true” and most of the fixes didn’t work in this context. Here’s what we ended up rolling with (uses jQuery and Microsoft AJAX).&lt;/ul&gt;  &lt;ul&gt;&lt;strong&gt;~/js/fixReportViewer.js &lt;/strong&gt;&lt;/ul&gt;  &lt;ul&gt;   &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// container is either the ReportViewer control itself, or a div containing it. &lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; fixReportingServices(container) {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; ($.browser.safari) { &lt;span class="rem"&gt;// toolbars appeared on separate lines. &lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        $(&lt;span class="str"&gt;'#'&lt;/span&gt; + container + &lt;span class="str"&gt;' table'&lt;/span&gt;).each(&lt;span class="kwrd"&gt;function&lt;/span&gt; (i, item) {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ($(item).attr(&lt;span class="str"&gt;'id'&lt;/span&gt;) &amp;amp;&amp;amp; $(item).attr(&lt;span class="str"&gt;'id'&lt;/span&gt;).match(/fixedTable$/) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                $(item).css(&lt;span class="str"&gt;'display'&lt;/span&gt;, &lt;span class="str"&gt;'table'&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                $(item).css(&lt;span class="str"&gt;'display'&lt;/span&gt;, &lt;span class="str"&gt;'inline-block'&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        });&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;}&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="rem"&gt;// needed when AsyncEnabled=true. &lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(&lt;span class="kwrd"&gt;function&lt;/span&gt; () { fixReportingServices(&lt;span class="str"&gt;'rpt-container'&lt;/span&gt;); });&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="rem"&gt;/*$(document).ready(function () { fixReportingServices('rpt-container');});*/&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;strong&gt;example .aspx&lt;/strong&gt;&lt;/ul&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;background-color: White; width: 950px&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;rpt-container&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;rsweb:ReportViewer&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ReportViewer1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Font-Names&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Times New Roman&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="attr"&gt;Font-Size&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;8pt&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;700px&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;950px&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ShowExportControls&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ShowPrintButton&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="attr"&gt;ShowRefreshButton&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ShowZoomControl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;SkinID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;AsyncRendering&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="attr"&gt;ShowBackButton&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;LocalReport&lt;/span&gt; &lt;span class="attr"&gt;ReportPath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;contract.rdlc&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            &lt;span class="attr"&gt;DisplayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Contract&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;LocalReport&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;rsweb:ReportViewer&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManagerProxy&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;proxy&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Scripts&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptReference&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/js/fixReportViewer.js&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Scripts&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManagerProxy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The fixes we found on other websites (setting the display to inline-block on the included tables) only worked for the first load – as soon as the report changed due to AsyncRendering=”true”, the toolbars were broken again. This was fixed by replacing jQuery’s ready function with Microsoft ASP.NET Ajax’s PageLoaded function. &lt;/p&gt;

&lt;p&gt;We also noticed that these fixes also broke down our width &amp;amp; height. We pinpointed the issue to the generated HTML table with the id ending with fixedTable, which needed to be left as display table instead of inline-block. We thus adapted the JavaScript. &lt;/p&gt;

&lt;p&gt;The HTML wraps the ReportViewer with a div, mostly for convenience (to avoid peppering our code with &amp;lt;%= ReportViewer1.ClientID %&amp;gt;). Furthermore, if my memory serves me well, we set the background-color manually because some browsers made the ReportViewer transparent. &lt;/p&gt;

&lt;p&gt;Hope this helps! If you find more elegant ways of doing this, or know of more gotchas, please let us know! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/ixzOEaooJNg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/ixzOEaooJNg/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2011/06/28/Gotcha-Reporting-Services-Viewer-bugs-on-Google-Chrome.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=4f5a9405-8276-472f-905b-c6d2e66543f0</guid>
      <pubDate>Tue, 28 Jun 2011 11:09:07 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=4f5a9405-8276-472f-905b-c6d2e66543f0</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=4f5a9405-8276-472f-905b-c6d2e66543f0</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/06/28/Gotcha-Reporting-Services-Viewer-bugs-on-Google-Chrome.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=4f5a9405-8276-472f-905b-c6d2e66543f0</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=4f5a9405-8276-472f-905b-c6d2e66543f0</feedburner:origLink></item>
    <item>
      <title>Using Microsoft POS for .NET in 2011</title>
      <description>&lt;p&gt;Five years ago, we decided to utilize &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=eaae202a-0fcc-406a-8fde-35713d7841ca"&gt;Microsoft’s Point Of Service for .NET (POS for .NET)&lt;/a&gt; in our &lt;a href="http://franchiseblast.com/tour/retail-franchises/"&gt;point of sale (POS)&lt;/a&gt; to integrate with the various peripherals used by &lt;a href="http://franchiseblast.com/tour/retail-franchises/"&gt;POS systems&lt;/a&gt;. Simply put, POS for .NET enables developers to utilize receipt printers, cash drawers, barcode scanners, magnetic stripe readers (MSR), line displays (and many other peripherals) within their .NET applications. Back then, the .NET framework was at version 2.0. Obviously, many things have changed since then with the advent of .NET 3.0, 3.5 and, more recently, 4.0. However, the latest version of POS for .NET’s is v1.12 and it was released in 2008. &lt;/p&gt;  &lt;p&gt;Being forward-thinking as we are, we structured our point of sale as a web application from day one, to enable future deployment scenarios (being browser-based means we can easily use our &lt;a href="http://franchiseblast.com/tour/retail-franchises/pos/"&gt;point of sale on the iPad&lt;/a&gt; or any other hot hardware platform) and code-reuse within our &lt;a href="http://franchiseblast.com/tour/retail-franchises/e-commerce/"&gt;e-commerce application&lt;/a&gt; and &lt;a href="http://franchiseblast.com"&gt;FranchiseBlast&lt;/a&gt;. However, this made it a bit harder on us to integrate with the peripherals as we weren’t using them in the traditional context of a desktop application (especially access Windows printers from a server-side web application). However, we solved those issues many years ago and have continued to evolve the solution ever since. &lt;/p&gt;  &lt;p&gt;Fast forward to 2011: POS for .NET has not been refreshed in three years, we’ve moved to 64-bit machines and .NET 4.0. This blog post is a collection of tips &amp;amp; tricks for issues commonly faced by .NET developers working with POS for .NET in 2011. &lt;/p&gt;  &lt;h1&gt;Common Control Objects – don’t forget about them!&lt;/h1&gt;  &lt;p&gt;This is just a reminder, as this was true back in 2006 too. You’d typically expect to be able to install the peripheral’s driver and then utilize it within your .NET application. However, you also need to install intermediary Common Control Objects.&amp;#160; I always &lt;a href="http://monroecs.com/oposccos_current.htm"&gt;end up downloading the CCOs from here.&lt;/a&gt;&amp;#160; I always forget the proper order and sometimes run into trouble because of this and end up having to uninstall and reinstall half a dozen times until it works (… pleasant…). I believe this is the installation order I use (you may need to reboot between each step). &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Install &lt;a href="https://www.epsonexpert.com/login"&gt;Epson OPOS ADK&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Install other drivers (scanners, etc.) &lt;/li&gt;    &lt;li&gt;Install the &lt;a href="http://monroecs.com/oposccos_current.htm"&gt;Common Control Objects&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Define logical device names (LDN) using Epson OPOS &lt;/li&gt;    &lt;li&gt;Install &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=eaae202a-0fcc-406a-8fde-35713d7841ca"&gt;POS for .NET&lt;/a&gt;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;POS for .NET doesn’t work in 64-bit&lt;/h1&gt;  &lt;p&gt;Long story short, due to the legacy hardware it supports, POS for .NET only works in 32-bit. If you’re running an app on a 64-bit machine, it will fail with a cryptic error message or will simply be unable to find your peripherals. Example:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {CCB90102-B81E-11D2-AB74-0040054C3719} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can still use the peripherals on 64-bit operating systems, but you will need to &lt;a href="http://davidstechtips.com/2010/06/force-net-application-to-run-in-32-bit-process-on-64-bit-windows/"&gt;compile your desktop application as 32-bit&lt;/a&gt; (Right click on your project –&amp;gt; Build –&amp;gt; Platform target: x86). You even need to do this with the example application that comes with POS for .NET (in C:\Program Files (x86)\Microsoft Point Of Service\SDK\Samples\Sample Application) if you want to use it. &lt;/p&gt;  &lt;p&gt;You’ll probably run into the same issues with all the .NET test applications supplied by the device manufacturers. Unless you can manage to find an updated sample, you’ll have to work your magic &lt;a href="http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1"&gt;with a decompiler&lt;/a&gt;. In addition to probably being illegal, it is a pain and a half. Therefore, you’re better off using the test application that comes with POS for .NET. &lt;/p&gt;  &lt;p&gt;As for web applications, you need to &lt;a href="http://blogs.msdn.com/b/rakkimk/archive/2007/11/03/iis7-running-32-bit-and-64-bit-asp-net-versions-at-the-same-time-on-different-worker-processes.aspx"&gt;force IIS to run your application in a 32-bit application pool.&lt;/a&gt; &lt;/p&gt;  &lt;h1&gt;POS for .NET doesn’t work in .NET 4.0&lt;/h1&gt;  &lt;p&gt;Another bad surprise is migrating your application to .NET 4.0 and then realizing the POS hardware stops working. Long story short, you’ll get this error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;This method explicitly uses CAS policy, which has been obsoleted by the .NET Framework. In order to enable CAS policy for compatibility reasons, please use the NetFx40_LegacySecurityPolicy configuration switch. Please see &lt;/em&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=155570"&gt;&lt;em&gt;&lt;/em&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=155570"&gt;http://go.microsoft.com/fwlink/?LinkID=155570&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The error message is fairly self-explanatory. Microsoft stopped supporting '”Code Access Security”, which is internally used by POS for .NET. You can either turn on a configuration option that re-enables the legacy CAS model or wait for Microsoft to release a new version of POS for .NET.&amp;#160; We’ve been told &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/posfordotnet/thread/d7215e48-be61-4d24-8735-8e9736fc8738/"&gt;not to hold our breath&lt;/a&gt;, so the configuration option is the preferred flag.&amp;#160; &lt;/p&gt;  &lt;p&gt;If you’re creating a desktop application, the solution is in the error message – &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/posfordotnet/thread/ba05a23e-0337-4490-ac35-79cf65e01491"&gt;more details here&lt;/a&gt;.&amp;#160; Add this to your app.config:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;NetFx40_LegacySecurityPolicy&lt;/span&gt; &lt;span class="attr"&gt;enabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;If you’re creating a web application, the flag is a bit different. Add this to your web.config: &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;trust&lt;/span&gt; &lt;span class="attr"&gt;legacyCasModel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h1&gt;POS for .NET doesn’t work with ASP.NET MVC / dynamic data/operations&lt;/h1&gt;

&lt;p&gt;The above flag will cause your legacy code to run properly on .NET 4.0 but it does have a side-effect. You will not be able to use some of the newer .NET framework features such as the dynamic keyword. Not only can you not use it explicitly within your own code, but &lt;a href="http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx"&gt;ASP.NET MVC 3 uses it internally within the ViewBag&lt;/a&gt;. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Dynamic operations can only be performed in homogenous AppDomain.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thus, you have to choose between POS for .NET or ASP.NET MVC 3, &lt;a href="http://stackoverflow.com/questions/5541143/legacycasmodel-true-and-dynamic-data-operations"&gt;unless you load up your POS objects in another AppDomain.&lt;/a&gt; Here’s some sample code to help you do that.&lt;/p&gt;

&lt;p&gt;You need to be able to create another AppDomain and specify that this AppDomain should use the NetFx40_LegacySecurityPolicy option, even if your current AppDomain doesn’t have this flag enabled. &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;var curr = AppDomain.CurrentDomain.SetupInformation;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;var info = &lt;span class="kwrd"&gt;new&lt;/span&gt; AppDomainSetup()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ApplicationBase = curr.ApplicationBase,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    LoaderOptimization = curr.LoaderOptimization,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    ConfigurationFile = curr.ConfigurationFile,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;};&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;info.SetCompatibilitySwitches(&lt;span class="kwrd"&gt;new&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;NetFx40_LegacySecurityPolicy&amp;quot;&lt;/span&gt; });&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; AppDomain.CreateDomain(&lt;span class="str"&gt;&amp;quot;POS Hardware AppDomain&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt; , info);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;You can then use this AppDomain to create your POS peripherals. All our peripherals extend our own custom &lt;strong&gt;PosHardware&lt;/strong&gt; base class with a few standard methods such as FindAndOpenDevice(), so we use the following code. For testing purposes, we created a configuration option (&lt;strong&gt;IsHardwareLibInSameAppDomain&lt;/strong&gt;) to toggle between loading in the current AppDomain versus a separate one. &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; T Build&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt; id) &lt;span class="kwrd"&gt;where&lt;/span&gt; T : PosHardware, &lt;span class="kwrd"&gt;new&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    T hardware = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (IsHardwareLibInSameAppDomain)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        hardware = &lt;span class="kwrd"&gt;new&lt;/span&gt; T();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        hardware = (T)OtherAppDomain.CreateInstanceFromAndUnwrap(Assembly.GetAssembly(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T)).Location, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).FullName);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(id))&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        hardware.DeviceName = id;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    hardware.FindAndOpenDevice();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; hardware;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Also, don’t forget to mark your classes as Serializable and MarshalByRefObject. &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[Serializable]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PosHardware : MarshalByRefObject&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Working with objects in other AppDomains is a pain.&amp;#160; Any object that you pass between the two app domains (such as parameters to functions or return values) must be marked as Serializable and extend MarshalByRefObject if you wish to avoid surprises.&amp;#160; If you marshal by value instead, you will be working on read-only copies of (which may or may not be desirable, depending on your context.)&lt;/p&gt;

&lt;h1&gt;Conclusion&lt;/h1&gt;
It only took three years without a new release before POS for .NET started being a pain to work with – unless you stick with past technologies. With the advice provided here, however, you should be able to move forward without issue. Did you discover any other gotchas with POS for .NET?&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/dn4kblnk-kc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/dn4kblnk-kc/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2011/06/06/Using-Microsoft-POS-for-NET-in-2011.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=d2f7074b-d0aa-45c2-a72c-bf4bf25384ac</guid>
      <pubDate>Mon, 06 Jun 2011 08:41:00 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=d2f7074b-d0aa-45c2-a72c-bf4bf25384ac</pingback:target>
      <slash:comments>53</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=d2f7074b-d0aa-45c2-a72c-bf4bf25384ac</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/06/06/Using-Microsoft-POS-for-NET-in-2011.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=d2f7074b-d0aa-45c2-a72c-bf4bf25384ac</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=d2f7074b-d0aa-45c2-a72c-bf4bf25384ac</feedburner:origLink></item>
    <item>
      <title>Gotcha: iPad versus ASP.NET</title>
      <description>&lt;h1&gt;Your web app looks awesome on the iPad, until… &lt;/h1&gt;  &lt;p&gt;&lt;a href="http://www.franchiseblast.com"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px; display: inline; border-top: 0px; border-right: 0px" title="FranchiseBlast: Franchise Intranet on iPad" border="0" alt="FranchiseBlast: Franchise Intranet on iPad" align="right" src="http://blog.lavablast.com/image.axd?picture=franchiseblast.jpg" width="240" height="149" /&gt;&lt;/a&gt; You decide to save it to your home screen. &lt;/p&gt;  &lt;p&gt;If you’re doing this with a web application you’ve developed, you probably want to make it appear a bit more like a native app,&amp;#160; so you’ll add two meta tags to make the experience nicer (add an app &lt;a href="http://www.hanselman.com/blog/MakeYourWebsiteMobileAndIPhoneFriendlyAddHomeScreenIPhoneIconsAndAdjustTheViewPort.aspx"&gt;icon&lt;/a&gt; and remove the &lt;a href="http://developer.apple.com/library/safari/#documentation/appleapplications/reference/SafariHTMLRef/Articles/MetaTags.html"&gt;navigation bar&lt;/a&gt;). Remember: Safari caches these tags when creating the shortcut, so you will need to delete/recreate the shortcut to force it to refresh. &lt;/p&gt;  &lt;p&gt;Everything will look fine, until you reload the web app on some other occasion: &lt;strong&gt;ASP.NET Ajax is now completely broken and many of your styles are missing. &lt;/strong&gt;Simply put, an application that worked fine when you shut down your iPad minutes ago will be completely unusable. No amount of refreshing will solve the issue. Clearing Safari’s cache and using it outside of the home screen icon is the only workaround. &lt;/p&gt;  &lt;h1&gt;Gotcha: Safari uses different HTTP User-Agent strings depending on context!&lt;/h1&gt;  &lt;p&gt;The iPad (and iPhone/iPod Touch) don’t use the same HTTP User-Agent string when a website is accessed normally via the Safari application versus a webpage that was saved to the home screen (which still uses Safar internally). Here’s an example: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Normal Safari: Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) &lt;strong&gt;Version/5.0.2&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Website as app: Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) &lt;strong&gt;Mobile/8J2&lt;/strong&gt; &lt;strong&gt;&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;ASP.NET doesn’t recognize the latter as being Safari – it recognizes it as a generic browser with &lt;a href="http://msdn.microsoft.com/en-us/library/3yekbd5b.aspx"&gt;no capabilities&lt;/a&gt;. As an example: Supports JavaScript? Nope. &lt;/ul&gt;  &lt;ul&gt;Add this hack to your base page to fix it. It makes ASP.NET think that anything based on AppleWebkit is a newer browser – a much better default setting (for most of us) than assuming the browser was created back in 1994. &lt;/ul&gt;  &lt;ul&gt;   &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_PreInit(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Request.UserAgent != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; Request.UserAgent.IndexOf(&lt;span class="str"&gt;&amp;quot;AppleWebKit&amp;quot;&lt;/span&gt;, StringComparison.CurrentCultureIgnoreCase) &amp;gt; -1)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.ClientTarget = &lt;span class="str"&gt;&amp;quot;uplevel&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    }&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/ul&gt;

&lt;h1&gt;The long answer&lt;/h1&gt;

&lt;p&gt;On and off over the course of a month, I spent dozens of hours investigating this issue. In the end, the fix is trivial and updated *.browser files will probably be produced by Microsoft over the next months/years. However, I did learn a lot about how to debug a web-app on the iPad in the process, and thought I’d share a few lessons learned. I’ve kept them purposefully brief as you can easily find detailed answers on &lt;a href="http://www.google.com"&gt;Google&lt;/a&gt; or &lt;a href="http://www.stackoverflow.com"&gt;StackOverflow&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Enable Safari’s Developer Debug Console&lt;/h2&gt;

&lt;p&gt;That’s how I figured out ASP.NET AJAX wasn’t loading properly. Was getting JavaScript errors that you normally get when ASP.NET Ajax is not properly configured in the web.config file. &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On the iPad: Settings –&amp;gt; Safari –&amp;gt; Developer –&amp;gt; Debug Console (on) &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Install Firebug Lite on your iPad&lt;/h2&gt;

&lt;p&gt;I frequently use Firebug on my desktop computer to analyse web pages. The lite version on the iPad helped me review the HTML/JavaScript in greater detail. Install &lt;a href="http://www.thecssninja.com/javascript/iphone-bookmarklet"&gt;this bookmarklet&lt;/a&gt; (found it painful to do) then install the &lt;a href="http://getfirebug.com/firebuglite"&gt;FireBug Lite bookmarklet&lt;/a&gt;. More info &lt;a href="http://community.godaddy.com/library/setting-up-a-debugging-environment-on-the-ipad/"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;Setup an HTTP Proxy&lt;/h2&gt;

&lt;p&gt;This helped me get in-depth information about exactly what HTML/JavaScript was being served in response to which HTTP Headers. That’s how I realized certain scripts were not being included when the User-Agent changed. &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;As I develop on a Windows machine, I made it run through &lt;a href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt; on my desktop. &lt;a href="http://www.ravelrumba.com/blog/ipad-http-debugging/"&gt;Other options found here&lt;/a&gt;. &lt;/li&gt;

  &lt;li&gt;In Fiddler, Tools &amp;gt; Fiddler Options &amp;gt; Connections –&amp;gt; Allow Remote Computers To Connect. Restart Fiddler. (Not working? Check Windows Firewall.)&lt;/li&gt;

  &lt;li&gt;On the iPad: Settings –&amp;gt; Wi-Fi –&amp;gt; Click on the right arrow for your connection –&amp;gt; HTTP Proxy –&amp;gt; Manual –&amp;gt; Set Server and Port.&amp;#160; &lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Other limitations worth knowing about&lt;/h1&gt;

&lt;p&gt;As everyone knows, Flash doesn’t work on the iPad/iPhone/iPod. It doesn’t come as a surprise to use that we have to eliminate it from our app (not a big detail for us). &lt;/p&gt;

&lt;p&gt;However, one gotcha that had not come to mind initially is that certain JavaScript functionality such as click&amp;amp;drag or drag&amp;amp;drop does not work on the iPad given the differences in gestures between a conventional computer and a tablet. That code needs to be rewritten. &lt;/p&gt;

&lt;p&gt;Did you experience any issues you’d like to share?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/QRjlEnnm2bg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/QRjlEnnm2bg/post.aspx</link>
      <author>JKealey</author>
      <comments>http://blog.lavablast.com/post/2011/05/29/Gotcha-iPad-versus-ASPNET.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=4cc05b73-dd31-4c6d-a513-362aa0bc8788</guid>
      <pubDate>Sun, 29 May 2011 14:19:00 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>JKealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=4cc05b73-dd31-4c6d-a513-362aa0bc8788</pingback:target>
      <slash:comments>34</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=4cc05b73-dd31-4c6d-a513-362aa0bc8788</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/05/29/Gotcha-iPad-versus-ASPNET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=4cc05b73-dd31-4c6d-a513-362aa0bc8788</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=4cc05b73-dd31-4c6d-a513-362aa0bc8788</feedburner:origLink></item>
    <item>
      <title>Re-skin your existing web app using jQuery Mobile</title>
      <description>&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IMG_3337" src="http://blog.lavablast.com/image.axd?picture=IMG_3337_2.jpg" border="0" alt="IMG_3337" width="240" height="160" align="right" /&gt;Recently, for a new franchise client of ours, we had to add some new features to our &lt;a href="http://franchiseblast.com/tour/retail-franchises/pos/"&gt;web-based point of sale system&lt;/a&gt;.&amp;nbsp;&amp;nbsp; This piece of software makes extensive use of touch screen functionality; we need to think about this when we design our UI.&amp;nbsp; The interface must be optimized to allow cashiers to perform their operations effectively and intuitively with a touch screen.&amp;nbsp; Our application isn&amp;rsquo;t traditionally used via a multi-touch interface like the iPhone or iPad; rather, operators use a &lt;a href="http://www.elotouch.com/Products/LCDs/1515L/default.asp"&gt;traditional touch screen&lt;/a&gt;. In this project, we had to adapt existing pages and create completely new modules.&lt;/p&gt;
&lt;p&gt;In the past, we had played with &lt;a href="http://jquerymobile.com/" target="_blank"&gt;jQuery Mobile&lt;/a&gt; and we were really impressed.&amp;nbsp; Take a look at the &lt;a href="http://jquerymobile.com/demos/1.0a4.1/" target="_blank"&gt;demo site&lt;/a&gt; &amp;ndash; all you need to do is including a reference to jQuery Mobile&amp;rsquo;s JavaScript and follow some conventions with your HTML to get a nice mobile-friendly user interface. However, when you think about it, mobile-friendly (touch friendly) user interfaces are also very appropriate for traditional touch screen technologies utilized by the retail industry for over a decade.&lt;/p&gt;
&lt;p&gt;Given our point of sale was initially created to be compatible with IE6 back in the day, we felt it was time to enhance the look and feel utilizing new technologies. We liked jQuery Mobile&amp;rsquo;s look &amp;amp; feel and wanted to utilize some bits &amp;amp; pieces, without having to re-implement everything following their conventions.&amp;nbsp; When you peek at the &lt;a href="https://github.com/jquery/jquery-mobile" target="_blank"&gt;jQuery Mobile source code on GitHub&lt;/a&gt;, you realize that each component is separated in it&amp;rsquo;s own little jQuery plugin.&amp;nbsp; Some plugins are not completely independent from the jQM (jQuery Mobile) page, but you can use most of them outside of that context; you can thus use them in your own applications without a jQM page that takes 100% of the screen real estate.&amp;nbsp; In a typical jQM scenario, you define a page and then jQM works it&amp;rsquo;s magic: it initializes all the controls for you - if you followed the conventions. In this post, we&amp;rsquo;ll cover using jQuery Mobile outside of the jQM page and mobile context.&lt;/p&gt;
&lt;h2&gt;How to trick jQuery Mobile&lt;/h2&gt;
&lt;p&gt;First, you simply have to trick jQM into thinking that there&amp;rsquo;s a jQM page in the HTML.&amp;nbsp; To do that, you have to bind to a special jQM event, &lt;em&gt;mobileinit&lt;/em&gt;.&amp;nbsp; This is event is executed before any jQM code modifies your html:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;$(document).bind(&lt;span class="str"&gt;"mobileinit"&lt;/span&gt;, function ()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; ($(&lt;span class="str"&gt;'div[data-role=page]'&lt;/span&gt;).length === 0)&lt;/pre&gt;
&lt;pre&gt;        $(&lt;span class="str"&gt;'&amp;lt;div data-role="page" id="pageTemp" style="display:none;"&amp;gt;&amp;lt;/div&amp;gt;'&lt;/span&gt;).appendTo($(&lt;span class="str"&gt;'body'&lt;/span&gt;));&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    $.mobile.ajaxEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    $(&lt;span class="str"&gt;'#pageTemp'&lt;/span&gt;).live(&lt;span class="str"&gt;'pagebeforecreate'&lt;/span&gt;, function (&lt;span class="kwrd"&gt;event&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;    {&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;    });&lt;/pre&gt;
&lt;pre&gt;})&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Here you insert a jQM page in your html if one hasn&amp;rsquo;t already been defined. This is required for some controls to work (like the dropdown list, if I remember correctly). We then disable AJAX page fetching and also disable the &lt;span class="str"&gt;'pagebeforecreate' event for the newly created dummy page.&amp;nbsp; Most of our pages utilize this placeholder (as we only use the UI controls), but we did &amp;ndash; on a few occasions - utilize the standard jQM page in all its glory inside our point of sale.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="str"&gt;If there&amp;rsquo;s a better way to do this, please let us know - with the current version of jQuery Mobile (1.0a4.1) it appears to be working pretty well.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://jquerymobile.com/demos/1.0a4.1/#docs/forms/index.html" target="_blank"&gt;Interesting controls&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The plugins we found most interesting were the one dealing with forms controls. You can see a gallery of all forms elements in jQuery Mobile &lt;a href="http://jquerymobile.com/demos/1.0a4.1/#docs/forms/forms-all.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example, some of the base HTML controls are not ideal in the context of a touch-enabled application. Take radio buttons, for example. They are way too small and hard to click on accurately - you have to manually change their styling via CSS to make them easy to touch.&amp;nbsp; Here is the jQM version of radio button list:&lt;/p&gt;
&lt;h3&gt;Radio Button List&lt;/h3&gt;
&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="radio" src="http://blog.lavablast.com/image.axd?picture=radio_1.png" border="0" alt="radio" width="607" height="161" /&gt;&lt;/p&gt;
&lt;p&gt;To create this, first you need a little bit HTML plus the &lt;em&gt;checkboxradio&lt;/em&gt; plugin from jQuery Mobile:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt; &lt;span class="attr"&gt;data-role&lt;/span&gt;&lt;span class="kwrd"&gt;="controlgroup"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="radio"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-1"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-1"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Cat"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="radio"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-2"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-2"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Dog"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="radio"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-3"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-3"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Hamster"&lt;/span&gt; &lt;span class="attr"&gt;checked&lt;/span&gt;&lt;span class="kwrd"&gt;="checked"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="radio"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-4"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="radio-choice-4"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Lizard"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Basically the fieldset groups the radio input together and gives the rounded corners only to the top and bottom items.&lt;/p&gt;
&lt;p&gt;Then you can add this JavaScript to your page:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;$(&lt;span class="str"&gt;'input[type=checkbox], input[type=radio]'&lt;/span&gt;).filter(&lt;span class="kwrd"&gt;function&lt;/span&gt; ()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).parent(&lt;span class="str"&gt;'.ui-checkbox'&lt;/span&gt;).length == 0;&lt;/pre&gt;
&lt;pre&gt;}).checkboxradio();&lt;/pre&gt;
&lt;pre class="alt"&gt;$(&lt;span class="str"&gt;"fieldset[data-role='controlgroup']"&lt;/span&gt;).not(&lt;span class="str"&gt;'.ui-controlgroup'&lt;/span&gt;).controlgroup();&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This piece of JavaScript will select all checkboxes or radios inputs, filter the ones we already applied the plugin and then call checkboxradio() to change them to follow the jQuery Mobile style.&amp;nbsp; We then use the &lt;em&gt;controlgroup&lt;/em&gt; plugin to group the controls together visually.&amp;nbsp; Once again we don&amp;rsquo;t re-apply this code to fieldsets that were changed previously, for efficiency reasons.&lt;/p&gt;
&lt;p&gt;For an horizontal look, simply add &lt;em&gt;data-style=&amp;rdquo;horizontal&amp;rdquo;&lt;/em&gt; to the fieldset grouping the elements.&amp;nbsp; It is still a radio button list, but the layout is different.&lt;/p&gt;
&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="radio-horiz" src="http://blog.lavablast.com/image.axd?picture=radio-horiz_1.png" border="0" alt="radio-horiz" width="240" height="37" /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://jquerymobile.com/demos/1.0a4.1/#docs/forms/forms-checkboxes.html" target="_blank"&gt;Checkbox list&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can even do the same thing with checkboxes:&lt;/p&gt;
&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="checkboxes" src="http://blog.lavablast.com/image.axd?picture=checkboxes_1.png" border="0" alt="checkboxes" width="607" height="218" /&gt;&lt;/p&gt;
&lt;p&gt;Suddenly, your UI becomes much easier to use with a touchscreen.&lt;/p&gt;
&lt;h3&gt;Dropdown&lt;/h3&gt;
&lt;p&gt;Here is a dropdown list, in the jQuery Mobile style:&lt;/p&gt;
&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="dropdown" src="http://blog.lavablast.com/image.axd?picture=dropdown_1.png" border="0" alt="dropdown" width="601" height="291" /&gt;&lt;/p&gt;
&lt;p&gt;You simply execute the following JavaScript code:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;$(&lt;span class="str"&gt;'select:not([multiple="multiple"])'&lt;/span&gt;).selectmenu();&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We had some problems with multi-selection lists, so that&amp;rsquo;s why we don&amp;rsquo;t automatically style those.&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://jquerymobile.com/demos/1.0a4.1/#docs/buttons/index.html" target="_blank"&gt;Button&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Buttons are pretty straightforward. In our application, we decided to automatically transform all of our buttons which utilize the CSS class &amp;lsquo;button&amp;rsquo;.&amp;nbsp; This could be an input[type=button], input[type=submit], a simple link &amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;.&amp;nbsp; We&amp;rsquo;re using a mix of these in our application and modify them all like this:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;$(&lt;span class="str"&gt;'.button'&lt;/span&gt;).not(&lt;span class="str"&gt;'.ui-btn'&lt;/span&gt;).button();&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="buttons2" src="http://blog.lavablast.com/image.axd?picture=buttons2.png" border="0" alt="buttons2" width="224" height="53" /&gt;&lt;/p&gt;
&lt;p&gt;Above, the two buttons are inline (add the data-inline=&amp;rdquo;true&amp;rdquo; attribute to the HTML elements). The Save button has a different &lt;a href="http://jquerymobile.com/demos/1.0a4.1/#docs/buttons/buttons-themes.html" target="_blank"&gt;theme&lt;/a&gt; (specify data-theme=&amp;rdquo;b&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="buttons" src="http://blog.lavablast.com/image.axd?picture=buttons.png" border="0" alt="buttons" width="263" height="46" /&gt;&lt;/p&gt;
&lt;p&gt;You can also group buttons as above, by defining a horizontal controlgroup.&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;data-role&lt;/span&gt;&lt;span class="kwrd"&gt;="controlgroup" data-type=&amp;rdquo;horizontal&amp;rdquo;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;="index.html"&lt;/span&gt; &lt;span class="attr"&gt;data-role&lt;/span&gt;&lt;span class="kwrd"&gt;="button"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Yes&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;="index.html"&lt;/span&gt; &lt;span class="attr"&gt;data-role&lt;/span&gt;&lt;span class="kwrd"&gt;="button"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;No&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;="index.html"&lt;/span&gt; &lt;span class="attr"&gt;data-role&lt;/span&gt;&lt;span class="kwrd"&gt;="button"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Maybe&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Working with controls&lt;/h3&gt;
&lt;p&gt;Visit this page to know operations you can do on your controls once they are modified by jQM: &lt;a href="http://jquerymobile.com/demos/1.0a4.1/#docs/forms/plugin-eventsmethods.html" target="_blank"&gt;Form Plugin Methods&lt;/a&gt;. This reference is very useful if you want to enable/disable controls or refresh them with new values.&lt;/p&gt;
&lt;h2&gt;ASP.NET WebForms&lt;/h2&gt;
&lt;p&gt;If you are using ASP.NET WebForms as is our case, you want to run these plugins every time your page is modified.&amp;nbsp; If you are using ASP.NET UpdatePanels, then you can bind a function to the following event handler where you could modify your controls each time an UpdatePanel is updated:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(&lt;span class="kwrd"&gt;function&lt;/span&gt;()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Add the jQuery Mobile code modifing controls here&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;});&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Normally this job is done automatically by jQM, but since we are not using the controls inside a jQM page, we have to update the DOM manually after each postback.&lt;/p&gt;
&lt;h2&gt;Caveat&lt;/h2&gt;
&lt;p&gt;In its current form, jQuery Mobile is not compatible with Internet Explorer. Depending on the version of IE, it is easier completely unusable or doesn&amp;rsquo;t look as good (rounded corner issues). In our context (point of sale), we ended up utilizing &lt;a href="http://code.google.com/chrome/chromeframe/"&gt;Google Chrome Frame&lt;/a&gt; for our IE users &amp;ndash; at least for the time being. The jQM team appears to be working towards full IE support for their beta release.&lt;/p&gt;
&lt;h2&gt;Future of jQuery Mobile&lt;/h2&gt;
&lt;p&gt;In conclusion, we loved working with jQuery Mobile once we figured out how to utilize bits &amp;amp; pieces of it individually. Currently, jQM focuses on development for mobile devices (which is normal) but we would be thrilled if they made integration into existing projects simpler. As this is an open source project, we weren&amp;rsquo;t afraid to peek at the code to figure out why it wasn&amp;rsquo;t working the way we intended it to. Let&amp;rsquo;s hope the project keeps on improving both its modularity and the desktop-based functionality.&amp;nbsp; Thank you to the jQuery Mobile team, continue the great work!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/e9yztnEd1A4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/e9yztnEd1A4/post.aspx</link>
      <author>EtienneT</author>
      <comments>http://blog.lavablast.com/post/2011/05/24/Re-skin-your-existing-web-app-using-jQuery-Mobile.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=b941cd7e-e6f2-402c-94fb-94481a921b12</guid>
      <pubDate>Tue, 24 May 2011 15:44:00 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>EtienneT</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=b941cd7e-e6f2-402c-94fb-94481a921b12</pingback:target>
      <slash:comments>17</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=b941cd7e-e6f2-402c-94fb-94481a921b12</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/05/24/Re-skin-your-existing-web-app-using-jQuery-Mobile.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=b941cd7e-e6f2-402c-94fb-94481a921b12</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=b941cd7e-e6f2-402c-94fb-94481a921b12</feedburner:origLink></item>
    <item>
      <title>Positions to be filled at LavaBlast Software</title>
      <description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.franchiseblast.com"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px 0px; display: inline; border-top: 0px; border-right: 0px" title="Positions to be filled at LavaBlast Software" border="0" alt="Positions to be filled at LavaBlast Software" align="right" src="http://blog.lavablast.com/image.axd?picture=IMG_1106.jpg" width="364" height="274" /&gt;&lt;/a&gt; LavaBlast is currently looking to hire! &lt;/p&gt;  &lt;p&gt;Want to help improve &lt;a href="http://www.franchiseblast.com"&gt;FranchiseBlast&lt;/a&gt;? Apply here: &lt;a href="http://jobs.lavablast.com/apply"&gt;http://jobs.lavablast.com/apply&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Rather than rehash what’s in the job postings, I wanted to list a few cool projects we have in the works for the short/medium/long term. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SaaS application for tracking and managing franchise information requests. &lt;/li&gt;    &lt;li&gt;Create an iPad-based version of our point of sale. (Most probably HTML5 instead of a native app). &lt;/li&gt;    &lt;li&gt;Stream data from our point of sale into the cloud, for real-time tracking and data synchronization between stores and our data warehouse. &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;In addition, we’re always building new operational software for our franchisor clients so our work is always full of fresh challenges. Interested, &lt;a href="http://jobs.lavablast.com/apply"&gt;let us know&lt;/a&gt;.&amp;#160; &lt;/ul&gt;  &lt;ul&gt;PS: You might have noticed us as &lt;a href="http://www.ocri.ca/exploriem/mediarelease-feb0111.pdf"&gt;nominees for the 2011 Bootstrap Awards&lt;/a&gt;. The Ottawa-Gatineau region is filled with top notch software startups and we were honoured to be nominated!&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/yuZQ7hF5MQ8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/yuZQ7hF5MQ8/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2011/02/08/Positions-to-be-filled-at-LavaBlast-Software.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=cc43b5b6-27ef-47e6-b389-3c73d8bf707a</guid>
      <pubDate>Tue, 08 Feb 2011 09:26:00 -0400</pubDate>
      <category>News</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=cc43b5b6-27ef-47e6-b389-3c73d8bf707a</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=cc43b5b6-27ef-47e6-b389-3c73d8bf707a</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2011/02/08/Positions-to-be-filled-at-LavaBlast-Software.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=cc43b5b6-27ef-47e6-b389-3c73d8bf707a</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=cc43b5b6-27ef-47e6-b389-3c73d8bf707a</feedburner:origLink></item>
    <item>
      <title>Slash your ASP.NET compile/load time without any hard work</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/etremblay/4947113934/"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px; display: inline; border-top: 0px; border-right: 0px" title="Jason has a cool eye :)" src="http://blog.lavablast.com/image.axd?picture=EYE4_1.png" border="0" alt="Jason has a cool eye :)" width="337" height="250" align="right" /&gt;&lt;/a&gt; FranchiseBlast, our &lt;a href="http://www.franchiseblast.com"&gt;franchise management platform&lt;/a&gt;, is a &amp;lsquo;large&amp;rsquo; solution inside Visual Studio which currently contains 35 projects. In total, we manage over 60 interrelated projects, and have always been concerned at improving the compilation/load performance on our development machines. This post is a quick summary of what we did to keep things as fast as possible.&lt;/p&gt;
&lt;p&gt;Personally, when it starts taking over a minute to compile or load my application, I start throwing things. This was the case early this week and with a bit of work, I managed to cut down things by an order of magnitude (from around 140 seconds down to around 14 seconds) with only software changes.&amp;nbsp; This is what prompted me to write this post.&lt;/p&gt;
&lt;p&gt;There are three things worth improving:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Compilation time&lt;/li&gt;
&lt;li&gt;First load time (ASP.NET)&lt;/li&gt;
&lt;li&gt;Application speed / database performance &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I only want to talk about the first two; the only tip I&amp;rsquo;ll give you for #3 is to get your hands on a profiler such as &lt;a href="http://www.jetbrains.com/profiler/"&gt;dotTrace&lt;/a&gt; as it is a real time saver.&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Get better hardware (Big impact)&lt;/h1&gt;
&lt;p&gt;You&amp;rsquo;ll get the best bang for your buck by upgrading your hard disk, especially if you&amp;rsquo;re using a single 5400 RPM or 7200 RPM drive (download &lt;a href="http://www.techpowerup.com/downloads/1137/ATTO_Disk_Benchmark_v2.34.html"&gt;benchmark&lt;/a&gt; &lt;a href="http://www.hdtune.com/"&gt;software&lt;/a&gt; to evaluate your current disk). Our projects are stored on a solid state disk. We currently use &lt;a href="http://www.newegg.com/Product/ProductList.aspx?Submit=ENE&amp;amp;DEPA=0&amp;amp;Order=BESTMATCH&amp;amp;Description=x25-m&amp;amp;x=0&amp;amp;y=0"&gt;Intel X25-M G2&lt;/a&gt;, but the &lt;a href="http://www.newegg.com/Product/ProductList.aspx?Submit=ENE&amp;amp;DEPA=0&amp;amp;Order=BESTMATCH&amp;amp;Description=revodrive&amp;amp;x=0&amp;amp;y=0"&gt;RevoDrive x2&lt;/a&gt; looks much faster (basically a RAID-0 array of SSDs) if you have an available PCI-Express x4 slot. If you&amp;rsquo;re cheap and find the SSDs to be too small, just get two large 7200 RPM drives and put them in RAID-0. Make sure you&amp;rsquo;ve got a robust backup solution.&lt;/p&gt;
&lt;p&gt;We have 12GB RAM on our development machines and a recent Core i7 processor, but nothing fancy. This is more than sufficient.&lt;/p&gt;
&lt;h1&gt;Store your temporary IIS files on your fastest disk or a RAM disk&lt;/h1&gt;
&lt;p&gt;Depending on the amount of RAM you have, it may make sense to use a &lt;a href="http://memory.dataram.com/products-and-services/software/ramdisk"&gt;RAM disk&lt;/a&gt;. I use my RAM disk for my temporary internet files and for IIS&amp;rsquo;s temporary folder (compilation results). I haven&amp;rsquo;t measured specific performance details but since I have so much free RAM, might as well try use it in creative ways.&lt;/p&gt;
&lt;p&gt;To speed up the first load time, you can tell IIS to store its temporary files on your RAM disk (or fastest disk) by changing the following setting in your web.config files:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;compilation&lt;/span&gt; ... &lt;span class="attr"&gt;tempDirectory&lt;/span&gt;&lt;span class="kwrd"&gt;="q:\temp\iistemp\"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; ... &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;compilation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --&gt;&lt;!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You can either change your project files directly, or, if you&amp;rsquo;ve lazy and have numerous applications running on your development machine (like I do), update the system-wide web.config files. Note that you need to update this for each runtime version of the Framework and, if running a 64-bit machine, for both Framework and Framework64. On my machine, I needed to modify the following files:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Web.config&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Web.config&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\Web.config&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Web.config&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Trade-off: If you save your RAM disk when shutting down, you&amp;rsquo;ll notice how much longer it takes to reboot. I can live with that, rebooting only once every couple months.&lt;/p&gt;
&lt;h1&gt;Review a few magical settings (Most impact)&lt;/h1&gt;
&lt;p&gt;When an ASP.NET website is loaded for the first time, it pre-compiles all your pages and user controls. Once done, everything runs faster. This is great for production websites, but horrible for your development machine. Why?&amp;nbsp; When programming, you&amp;rsquo;re usually only modifying a page or two (or back-end code). You&amp;rsquo;ll iteratively make a change, compile, launch the website, test, and start over; often dozens of times. A two minute compile/load time (like we had) forces you to lose focus and get distracted. The following setting makes pre-compilation more selective, making the first load time &lt;strong&gt;massively faster&lt;/strong&gt; in development scenarios. On my machine, it cut the first load time from around 74 seconds to 6 seconds.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;compilation&lt;/span&gt; ... &lt;span class="attr"&gt;batch&lt;/span&gt;&lt;span class="kwrd"&gt;="false"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; ...&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;compilation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;While on the subject of random boolean flags that make your life better, I should mention the following:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;compilation&lt;/span&gt; ... &lt;span class="attr"&gt;optimizeCompilations&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; ... &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;compilation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --&gt;&lt;/p&gt;
&lt;p&gt;This flag has a number of &lt;a href="http://blogs.msdn.com/b/davidebb/archive/2009/04/15/a-new-flag-to-optimize-asp-net-compilation-behavior.aspx"&gt;gotcha&amp;rsquo;s that are documented here.&lt;/a&gt; I&amp;rsquo;ve enabled it for now, although my quick tests didn&amp;rsquo;t show any significant performance improvements compared to the previous one. However, I was probably not testing the right thing.&lt;/p&gt;
&lt;h1&gt;Restructure your projects&lt;/h1&gt;
&lt;h2&gt;Try multiple solutions&lt;/h2&gt;
&lt;p&gt;About a year ago, we took 50% of our least used projects and moved them into a secondary solution. We compile that solution only when changing one of these projects, once every couple months. After rebuilding the secondary solution, we copy the *.dll files to a separate folder. Our primary projects reference those pre-generated libraries. I should repeat this process again, but I like having all my projects in one place and splitting them was a pain. However, this is probably the only sustainable way to manage extremely large solutions.&lt;/p&gt;
&lt;h2&gt;Selectively build the necessary projects&lt;/h2&gt;
&lt;p&gt;Using Visual Studio&amp;rsquo;s Configuration Manager, I also created different active solution configurations in my primary solution with only a subset of the projects included in the build.&amp;nbsp; I can thus swap between configurations depending on my primary task (working on our point of sale instead of FranchiseBlast, for example). This can drastically reduce compilation time, but I don&amp;rsquo;t use it as often as I should because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I find the user interface slow to refresh (Visual Studio). &lt;/li&gt;
&lt;li&gt;My dependency tree is complex and going through the list of projects to remove those I don&amp;rsquo;t want built is a pain. &lt;/li&gt;
&lt;li&gt;I context-switch a lot and often hit cases where I modify a project and forget that is not included in the build. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A simpler option is to build only the current project (and its dependencies) instead of all projects. Just make sure you don&amp;rsquo;t accidentally break the build (recompile everything before a commit).&lt;/p&gt;
&lt;h1&gt;Parallel compilation (Big impact)&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx"&gt;Following Scott Hanselman&amp;rsquo;s post,&lt;/a&gt; I setup my project to compile in parallel. I did add a few options to make it easier for me to see errors/warnings without MSBuild&amp;rsquo;s typical clutter. (I also had a post-build action using NAnt which I set to quiet). This reduced my full rebuild time from 96 seconds down to 16 (after a clean solution). In a typical recompilation, we&amp;rsquo;re talking roughly 8 seconds instead of around 66.&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Title: Parallel Build&lt;/pre&gt;
&lt;pre&gt;Command: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe&lt;/pre&gt;
&lt;pre class="alt"&gt;Arguments: /m $(SolutionFileName) /v:m /ds /nologo /clp:Summary;Verbosity=minimal&lt;/pre&gt;
&lt;pre&gt;Initial Directory: $(SolutionDir)&lt;/pre&gt;
&lt;pre class="alt"&gt;Check: Use Output window.&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --&gt;&lt;/p&gt;
&lt;p&gt;Trade-off: Error messages aren&amp;rsquo;t nicely presented in the Visual Studio Error List tab and you are not notified when the build is complete.&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Other noteworthy attempts&lt;/h1&gt;
&lt;p&gt;Over time, I&amp;rsquo;ve tried a few things that didn&amp;rsquo;t work out. In general, they improved things slightly but I don&amp;rsquo;t use them on a daily basis due to the tradeoffs.&lt;/p&gt;
&lt;p&gt;I tried putting the whole project (source and output folders) onto the RAM disk but its volatility scared me away, regardless of the performance enhancements (Off the top of my head, it was between 25% and 50%). I then tried putting my only project&amp;rsquo;s bin folders on my RAM disk (by creating &lt;a href="http://en.wikipedia.org/wiki/NTFS_symbolic_link"&gt;symbolic links&lt;/a&gt; from my bin folders to my RAM disk). This also had a positive impact on performance, but not significant enough to warrant the &lt;a href="http://thereifixedit.failblog.org/"&gt;kludge&lt;/a&gt; (around 25% reduction in compilation time).&lt;/p&gt;
&lt;p&gt;I also found a few &lt;a href="http://stackoverflow.com/questions/280751/what-is-the-best-practice-for-copy-local-and-with-project-references"&gt;tips &amp;amp; tricks for larger projects on Stack Overflow&lt;/a&gt;. First, I tried putting &amp;lsquo;Copy Local&amp;rsquo; to false for all project references. This gave me a 25% reduction in compilation time, but broke my deployment scripts which needed all the files in the bin folder.&amp;nbsp; Separately, I configured all my projects Output Paths to the same folder, avoiding content duplication on the disk. This also gave me a 25% reduction in compilation time. Oddly enough, moving this folder to my RAM disk did not impact performance.&lt;/p&gt;
&lt;h1&gt;Summary&lt;/h1&gt;
&lt;p&gt;I hope this post gave you some ideas on how to improve your compilation speeds and first load times. I didn&amp;rsquo;t intend to give exact benchmarks, as performance will vary greatly depending on your projects. However, the main lesson learned is that there are dozens of improvements you can make; it&amp;rsquo;s up to you to try them out and keep what works for you.&lt;/p&gt;
&lt;p&gt;The top three time savers for us are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setting batch=false in the ASP.NET configuration page. (Now ~10 times faster) &lt;/li&gt;
&lt;li&gt;Parallel compilation for our projects (Now ~8 times faster) &lt;/li&gt;
&lt;li&gt;Better hardware (Now between 2 and 5 times faster) &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Honorable mention goes to splitting your solution files, even though it&amp;rsquo;s painful and time consuming process to setup.&lt;/p&gt;
&lt;p&gt;Do you have any other tips &amp;amp; tricks you&amp;rsquo;d like to share with us?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/xGflnk6ZzHs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/xGflnk6ZzHs/post.aspx</link>
      <author>JKealey</author>
      <comments>http://blog.lavablast.com/post/2010/12/01/Slash-your-ASPNET-compileload-time.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=e46bb9d7-3f09-4f26-adc6-a0ce337c16a2</guid>
      <pubDate>Wed, 01 Dec 2010 09:18:00 -0400</pubDate>
      <category>Software</category>
      <dc:publisher>JKealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=e46bb9d7-3f09-4f26-adc6-a0ce337c16a2</pingback:target>
      <slash:comments>29</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=e46bb9d7-3f09-4f26-adc6-a0ce337c16a2</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2010/12/01/Slash-your-ASPNET-compileload-time.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=e46bb9d7-3f09-4f26-adc6-a0ce337c16a2</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=e46bb9d7-3f09-4f26-adc6-a0ce337c16a2</feedburner:origLink></item>
    <item>
      <title>Startup Pivot: Lessons Learned</title>
      <description>&lt;p&gt;&lt;a href="http://franchiseblast.com" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="logo" border="0" alt="logo" align="right" src="http://blog.lavablast.com/image.axd?picture=logo.png" width="336" height="107" /&gt;&lt;/a&gt;We’ve just launched a new website, &lt;a href="http://www.franchiseblast.com"&gt;FranchiseBlast.Com&lt;/a&gt;. Simply put, we’re spinning off all the content related to our &lt;a href="http://www.franchiseblast.com"&gt;franchise software&lt;/a&gt; from our main site onto this domain. We did this for a number of reasons, but one of them was that we decided to perform a minor &lt;a href="http://www.startuplessonslearned.com/2009/06/pivot-dont-jump-to-new-vision.html"&gt;segment pivot&lt;/a&gt;. We launched LavaBlast in 2007, focusing on an integrated solution for retail franchises. We built an awesome solution around this problem but, for a number of reasons – mainly scalability, we are pivoting to service-based franchises instead. We provide an equivalent feature set to both types of franchises; the main distinction is simply the deployment architecture. Our differentiators are still our focus on integration and our desire to build &lt;a href="http://franchiseblast.com/services/"&gt;franchise-specific software solutions&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Since we’ve just pivoted, I don’t have any witty insights on the business aspects of the pivot. Sorry folks, you’ll have to tune in later to see if was a good idea or not! However, I do want to share a few lessons about the nitty-gritty details of the pivot. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;1) Working with an outsider&lt;/h1&gt;  &lt;p&gt;Early on in the process, we got &lt;a href="http://www.instigatorblog.com"&gt;Ben Yoskovitz&lt;/a&gt; involved. In case you didn’t know, Ben is not only a co-founder of &lt;a href="http://www.yearonelabs.com/"&gt;Year One Labs&lt;/a&gt; but also assists existing startups with product development via &lt;a href="http://www.flowventures.com/blog/index.php/services/"&gt;Flow Ventures&lt;/a&gt;. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Working with A-Team individuals simplifies things&lt;/strong&gt;. Even though our backgrounds are dissimilar, we share the same general philosophy about how to grow a business. Therefore, our debates were short and focused on key decisions to be made. Once decided, everyone could run with the idea and get things done. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;We didn’t want to look like fools. &lt;/strong&gt;Explaining what you do to a respected outsider forces you to better articulate your thoughts. He didn’t need to point anything out; we preemptively realized inconsistencies or flaws in our own logic while explaining our business strategies.&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Get some different thoughts. &lt;/strong&gt;A breath of fresh air… unrelated to the use of Binaca. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;As time passes, the business context changes. Going through this exercise once in a while helps you refocus and re-orient when necessary. &lt;/p&gt;  &lt;h1&gt;2) Moving away from SubSonic CMS&lt;/h1&gt;  &lt;p&gt;The &lt;a href="http://www.lavablast.com"&gt;LavaBlast&lt;/a&gt; website is built using a tweaked version of the &lt;a href="http://subsonicproject.com/"&gt;SubSonic CMS&lt;/a&gt;.&amp;#160; We started using that CMS the first week it came out and slightly tweaked it for our needs. It is plain and simple and did what we needed it to in 2007. However, the open source project was never maintained and we keep getting burned by random issues. As an example, the rich text editor it includes doesn’t seem to work consistently on &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; (which did not exist back then) and has issues with session timeouts. &lt;/p&gt;  &lt;p&gt;The &lt;a href="http://franchiseblast.com"&gt;FranchiseBlast&lt;/a&gt; website is built on &lt;a href="http://www.wordpress.org"&gt;WordPress&lt;/a&gt;. Given our busy schedules, we didn’t waste any time with the revamp. Having never played with WordPress before, the main thing that struck us was the wide variety of plugins that are available.&amp;#160; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Install WordPress. [Yes, you can install it on IIS. ] &lt;/li&gt;    &lt;li&gt;Purchase a &lt;a href="http://themeforest.net"&gt;WordPress theme&lt;/a&gt;. [There are awesome ones for software-as-a-service type startups]. &lt;/li&gt;    &lt;li&gt;Tweak the site structure/theme. Pump out some content. &lt;/li&gt;    &lt;li&gt;Install plug-ins as you go. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;As an example, we installed one plugin for our contact forms. Time spent configuring: 5 minutes. This enabled us to focus on the message, not the form or infrastructure-related-time-wasters. &lt;/p&gt;  &lt;h1&gt;3) The social web has changed dramatically&lt;/h1&gt;  &lt;p&gt;I remember reaching out to franchisors and franchise bloggers back in 2007. There were a handful of blogs and that’s about it.&amp;#160; Social media adoption has tremendously increased in the past years thanks to services such as &lt;a href="http://www.twitter.com/franchiseblast"&gt;Twitter&lt;/a&gt;. It is much easier to get in touch with someone now (using warm introductions) than it was back then.&amp;#160; We’ve now reached an era where franchisors are overwhelmed by the number of social media services they need to feed information to. &lt;/p&gt;  &lt;p&gt;Have you been in business for a few years? Do you have lessons learned to share?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LavablastSoftwareBlog/~4/uTRqzGHaj4Y" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/LavablastSoftwareBlog/~3/uTRqzGHaj4Y/post.aspx</link>
      <author>jkealey</author>
      <comments>http://blog.lavablast.com/post/2010/11/16/Startup-Pivot-Lessons-Learned.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lavablast.com/post.aspx?id=1d338488-8cb2-4f5b-a2af-500b12a3bc62</guid>
      <pubDate>Tue, 16 Nov 2010 10:12:00 -0400</pubDate>
      <category>News</category>
      <category>Business</category>
      <category>Franchising</category>
      <dc:publisher>jkealey</dc:publisher>
      <pingback:server>http://blog.lavablast.com/pingback.axd</pingback:server>
      <pingback:target>http://blog.lavablast.com/post.aspx?id=1d338488-8cb2-4f5b-a2af-500b12a3bc62</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.lavablast.com/trackback.axd?id=1d338488-8cb2-4f5b-a2af-500b12a3bc62</trackback:ping>
      <wfw:comment>http://blog.lavablast.com/post/2010/11/16/Startup-Pivot-Lessons-Learned.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lavablast.com/syndication.axd?post=1d338488-8cb2-4f5b-a2af-500b12a3bc62</wfw:commentRss>
    <feedburner:origLink>http://blog.lavablast.com/post.aspx?id=1d338488-8cb2-4f5b-a2af-500b12a3bc62</feedburner:origLink></item>
  </channel>
</rss>
