<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>RainerAtSpirit's blog</title>
 <link href="http://RainerAt.spirit.de/atom.xml" rel="self"/>
 <link href="http://RainerAt.spirit.de"/>
 <updated>2013-11-11T12:06:09-08:00</updated>
 <id>http://RainerAt.spirit.de/</id>
 <author>
   <name>Rainer Wittmann</name>
   <email>R.Wittmann@spirit.de</email>
 </author>

 
 <entry>
   <title>Testing Durandal apps made easy</title>
   <link href="http://RainerAt.spirit.de/2013/11/11/testing-durandal-apps-made-easy"/>
   <updated>2013-11-11T00:00:00-08:00</updated>
   <id>http://RainerAt.spirit.de/2013/11/11/testing-durandal-apps-made-easy/</id>
   <content type="html">&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;The today&amp;#8217;s post is targeted to a very dedicated audience, so let&amp;#8217;s see if the following is for you.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You belong to the growing number of &lt;a href=&#39;http://www.durandaljs.com&#39;&gt;Durandal&lt;/a&gt; developer?&lt;/li&gt;

&lt;li&gt;You have a need to make your apps better?&lt;/li&gt;

&lt;li&gt;You don&amp;#8217;t know yet how to test a Durandal app?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you answered one or multiple of these questions with a yes, read on.&lt;/p&gt;

&lt;p&gt;Hey, even you answered the last two questions with a &lt;strong&gt;no&lt;/strong&gt; read on to see if &lt;a href=&#39;http://gruntjs.com/&#39;&gt;Grunt&lt;/a&gt; can make your life easier. When you haven&amp;#8217;t heard of &lt;a href=&#39;http://gruntjs.com/&#39;&gt;Grunt&lt;/a&gt; yet, head over to smashingmagazine for a nice &lt;a href=&#39;http://coding.smashingmagazine.com/2013/10/29/get-up-running-grunt/&#39;&gt;Grunt intro&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#39;prerequisites&#39;&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;Clone the following repo &lt;a href=&#39;https://github.com/RainerAtSpirit/HTMLStarterKitPro&#39;&gt;https://github.com/RainerAtSpirit/HTMLStarterKitPro&lt;/a&gt;, which is the &lt;a href=&#39;http://gruntjs.com/&#39;&gt;Grunt&lt;/a&gt; enabled version of the Durandal &amp;#8220;HTML Starter kit&amp;#8221; (at the time of this writing Durandal 2.0.1). Follow the steps in the readme, obviously skipping things you&amp;#8217;ve already installed on your machine.&lt;/p&gt;

&lt;h3 id=&#39;quick_start&#39;&gt;Quick start&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;install node from http://nodejs.org&lt;/li&gt;

&lt;li&gt;install grunt using &lt;code&gt;npm install -g grunt-cli&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;download/clone this repo&lt;/li&gt;

&lt;li&gt;run &lt;code&gt;npm install&lt;/code&gt; in repo&amp;#8217;s root directory to install grunt&amp;#8217;s dependencies&lt;/li&gt;

&lt;li&gt;run &lt;code&gt;grunt&lt;/code&gt; to run the default task, which opens the resultant &lt;code&gt;_specrunner.html&lt;/code&gt; in the browser&amp;#8230; and waits for you to write some tests&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When everything runs smoothly you should see something like the following while running &lt;code&gt;grunt&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;bash&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt;     &lt;span class=&#39;nv&#39;&gt;$ &lt;/span&gt;grunt
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     Running &lt;span class=&#39;s2&#39;&gt;&amp;quot;jshint:all&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;(&lt;/span&gt;jshint&lt;span class=&#39;o&#39;&gt;)&lt;/span&gt; task
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &amp;gt;&amp;gt; 8 files lint free.
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     Running &lt;span class=&#39;s2&#39;&gt;&amp;quot;jasmine:dev&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;(&lt;/span&gt;jasmine&lt;span class=&#39;o&#39;&gt;)&lt;/span&gt; task
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;     Testing jasmine specs via phantom
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     ..............
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;     14 specs in 0.113s.
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &amp;gt;&amp;gt; 0 failures
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;     Running &lt;span class=&#39;s2&#39;&gt;&amp;quot;connect:dev:livereload&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;(&lt;/span&gt;connect&lt;span class=&#39;o&#39;&gt;)&lt;/span&gt; task
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;     Started connect web server on 127.0.0.1:8999.
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     Running &lt;span class=&#39;s2&#39;&gt;&amp;quot;open:dev&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;(&lt;/span&gt;open&lt;span class=&#39;o&#39;&gt;)&lt;/span&gt; task
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;     Running &lt;span class=&#39;s2&#39;&gt;&amp;quot;watch:dev&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;(&lt;/span&gt;watch&lt;span class=&#39;o&#39;&gt;)&lt;/span&gt; task
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;     Waiting...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#39;Specrunner&#39; src=&#39;/img/2013-11-11-SpecRunner.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you are seeing an error message like following instead&amp;#8230;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;bash&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt;     &lt;span class=&#39;nv&#39;&gt;$ &lt;/span&gt;grunt
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     Loading &lt;span class=&#39;s2&#39;&gt;&amp;quot;Gruntfile.js&amp;quot;&lt;/span&gt; tasks...ERROR
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &amp;gt;&amp;gt; Error: Cannot find module &lt;span class=&#39;s1&#39;&gt;&amp;#39;connect-livereload&amp;#39;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     Warning: Task &lt;span class=&#39;s2&#39;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; not found. Use --force to &lt;span class=&#39;k&#39;&gt;continue&lt;/span&gt;.
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt; Aborted due to warnings.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;then reread the instructions, you probably missed step 4 &lt;code&gt;;-)&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&#39;ready_for_your_first_test_time_for_some_myth_busting&#39;&gt;Ready for your first test? Time for some myth busting&amp;#8230;&lt;/h3&gt;

&lt;h2 id=&#39;durandals_amd_modules_are_hard_to_grok&#39;&gt;Durandal&amp;#8217;s AMD modules are hard to grok&lt;/h2&gt;

&lt;p&gt;Hmh, not really. From a Durandal perspective an AMD module should either return a singleton or a constructor function. Here are two simple examples:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;singleton.js&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;s1&#39;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;        &lt;span class=&#39;nx&#39;&gt;type&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;I\&amp;#39;m a singleton&amp;#39;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;constructor.js&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;s1&#39;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(){&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;        &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;type&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt;  &lt;span class=&#39;s1&#39;&gt;&amp;#39;I\&amp;#39;m a constructor function&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;On a side note&lt;/strong&gt; When a module has dependencies than there are two ways to declare them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;singleton.js regular&lt;/strong&gt; syntax&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;([&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;knockout&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;s1&#39;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;        &lt;span class=&#39;nx&#39;&gt;type&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;I\&amp;#39;m a singleton&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;        &lt;span class=&#39;nx&#39;&gt;observable&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;observable&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;singleton.js &lt;a href=&#39;http://requirejs.org/docs/whyamd.html#sugar&#39;&gt;sugar&lt;/a&gt;&lt;/strong&gt; syntax&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;require&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;s1&#39;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;require&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;knockout&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;        &lt;span class=&#39;nx&#39;&gt;type&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;I\&amp;#39;m a singleton&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;        &lt;span class=&#39;nx&#39;&gt;observable&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;observable&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;9&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You&amp;#8217;ll find both in the wild and it&amp;#8217;s a question of personal style, which one to use. Before you ask, I tend to use the sugar syntax lately, but now back to the track.&lt;/p&gt;

&lt;p&gt;When I say Durandal&amp;#8217;s perspective I mean that the &lt;code&gt;module&lt;/code&gt; gets loaded by using &lt;code&gt;system.resolveObject&lt;/code&gt;, where Durandal differentiate between modules that return a function and &amp;#8230; the rest. Of course Durandal wouldn&amp;#8217;t be Durandal if this couldn&amp;#8217;t be customized, but that&amp;#8217;s another story and you have to read it on your own (see &lt;a href=&#39;http://durandaljs.com/documentation/Customizing-System/&#39;&gt;customizing system&lt;/a&gt;).&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;resolveObject&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;module&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;system&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;isFunction&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;module&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;))&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;module&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;module&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ok so how can we use our testing environment to figure out what is returned by our modules. Let&amp;#8217;s face it just because I assume that one returns a constructor and the other a singleton doesn&amp;#8217;t necessarily mean that it&amp;#8217;s true.&lt;/p&gt;

&lt;p&gt;Start by copying &lt;code&gt;flickr.spec.js&lt;/code&gt; to &lt;code&gt;singleton.spec.js&lt;/code&gt; and update the spec to the following.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt;/*global jasmine, describe, beforeEach, it, expect, require */&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;describe&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;viewmodels/singleton&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;s2&#39;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;singleton&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;require&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;viewmodels/singleton&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;it&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;should have a &amp;quot;type&amp;quot; property&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;expect&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;singleton&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;type&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toBeDefined&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On save you&amp;#8217;ll see the &lt;code&gt;grunt watch&lt;/code&gt; task kicking in, running the specs updating the browser via &lt;code&gt;livereload&lt;/code&gt;. Hopefully all is green, so let&amp;#8217;s move on.&lt;/p&gt;

&lt;p&gt;Copy &lt;code&gt;singleton.spec.js&lt;/code&gt; to &lt;code&gt;constructor.spec.js&lt;/code&gt; and update the spec so that it loads &lt;code&gt;constructor.js&lt;/code&gt; instead:&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt;/*global jasmine, describe, beforeEach, it, expect, require */&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;describe&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;viewmodels/constructor&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;s2&#39;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;constructor&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;require&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;viewmodels/constructor&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;it&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;should have a &amp;quot;type&amp;quot; property&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;expect&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;constructor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;type&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toBeDefined&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This time you should see a nice red warning message at the command prompt telling you that&amp;#8217;s something wrong.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;bash&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &amp;gt;&amp;gt; File &lt;span class=&#39;s2&#39;&gt;&amp;quot;test\specs\dev\constructor.spec.js&amp;quot;&lt;/span&gt; changed.
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; Running &lt;span class=&#39;s2&#39;&gt;&amp;quot;jasmine:dev&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;(&lt;/span&gt;jasmine&lt;span class=&#39;o&#39;&gt;)&lt;/span&gt; task
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; Testing jasmine specs via phantom
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; x...............
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; viewmodels/constructor:: should have a &lt;span class=&#39;s2&#39;&gt;&amp;quot;type&amp;quot;&lt;/span&gt; property: failed
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;   Expected undefined to be defined. &lt;span class=&#39;o&#39;&gt;(&lt;/span&gt;1&lt;span class=&#39;o&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; 16 specs in 0.011s.
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; &amp;gt;&amp;gt; 1 failures
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; Warning: Task &lt;span class=&#39;s2&#39;&gt;&amp;quot;jasmine:dev&amp;quot;&lt;/span&gt; failed. Use --force to &lt;span class=&#39;k&#39;&gt;continue&lt;/span&gt;.
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt; Aborted due to warnings.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now having a browser that allows us investigating what&amp;#8217;s going on becomes pretty handy. Luckily in our case we don&amp;#8217;t even need that. We already know that &lt;code&gt;constructor.js&lt;/code&gt; returns a constructor function and not an object, so let&amp;#8217;s rewrite the test to take that into account, which should bring us back to &amp;#8220;all green&amp;#8221;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;describe&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;viewmodels/constructor&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;s2&#39;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;Constructor&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;require&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;viewmodels/constructor&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;instance&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;Constructor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;it&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;should be a Constructor function&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;           &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;Constructor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;           &lt;span class=&#39;nx&#39;&gt;expect&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;constructor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toEqual&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Constructor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;       &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;it&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;should have a &amp;quot;type&amp;quot; property&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;expect&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;instance&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;type&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toBeDefined&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&amp;#8217;s it for today, pretty straight forward, so it can be easily applied/adapted to your own Durandal projects. It&amp;#8217;s the first post in the &amp;#8220;Catch fish&amp;#8221; category, hopefully more to come.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give a man a fish, and you feed him for a day; show him how to catch fish, and you feed him for a lifetime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me know what kind of &lt;em&gt;fish&lt;/em&gt; you can come up with.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Durandal SP3: Developing SharePoint SPAs made easy</title>
   <link href="http://RainerAt.spirit.de/2013/04/08/durandal-sp3-developing-sharepoint-spas-made-easy"/>
   <updated>2013-04-08T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2013/04/08/durandal-sp3-developing-sharepoint-spas-made-easy/</id>
   <content type="html">&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;In the last post I introduced you to &lt;a href=&#39;http://www.durandaljs.com&#39;&gt;Durandal&lt;/a&gt; a SPA Framework, which can be used to create SPAs on top of the SharePoint infrastructure. This time we&amp;#8217;re going to leverage Marc Anderson&amp;#8217;s &lt;a href=&#39;http://spservices.codeplex.com/&#39;&gt;SPServices&lt;/a&gt; as a data service for our SPA.&lt;/p&gt;

&lt;p&gt;The obvious advantage is that web services are around for a long time, so one SPA (same code base) runs in SharePoint (2003), 2007, 2010 and 2013.&lt;/p&gt;

&lt;p&gt;The obvious disadvantage is that web services are deprecated in 2013, so they might go away with the next major release. If you are already running on 2010/2013 and don&amp;#8217;t have to support older browser versions you might want looking into using REST services with &lt;a href=&#39;http://jaydata.org&#39;&gt;JayData&lt;/a&gt; or &lt;a href=&#39;http://www.breezejs.com&#39;&gt;Breeze&lt;/a&gt; instead&amp;#8230; but that&amp;#8217;s worth another story.&lt;/p&gt;

&lt;p&gt;Seeing is believing so here a couple of screen shots using IE versions that roughly matches the SP release time.&lt;/p&gt;

&lt;h4 id=&#39;sharepoint_2013__ie_10&#39;&gt;SharePoint 2013 | IE 10:&lt;/h4&gt;

&lt;p&gt;&lt;img alt=&#39;SP2013 IE10 demo&#39; src=&#39;/img/2013-04-08-SP2013Demo.jpg&#39; /&gt;&lt;/p&gt;

&lt;h4 id=&#39;sharepoint_2010__ie_8&#39;&gt;SharePoint 2010 | IE 8:&lt;/h4&gt;

&lt;p&gt;&lt;img alt=&#39;SP2010 IE8 demo&#39; src=&#39;/img/2013-04-08-SP2010Demo.jpg&#39; /&gt;&lt;/p&gt;

&lt;h4 id=&#39;sharepoint_2007__ie_7&#39;&gt;SharePoint 2007 | IE 7:&lt;/h4&gt;

&lt;p&gt;In SP2007 you&amp;#8217;ll notice some issues with the CSS that is used in the SPA otherwise it&amp;#8217;s fully functional. That is less an issue with IE7, but more with SP2007 that is running pages in Quirks mode. A quick workaround would be to apply a DOCTYPE to the pages that host your SPA.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;SP2007 IE6 demo&#39; src=&#39;/img/2013-04-08-SP2007Demo.jpg&#39; /&gt;&lt;/p&gt;

&lt;h4 id=&#39;sharepoint_2003__ie_6&#39;&gt;SharePoint 2003 | IE 6:&lt;/h4&gt;

&lt;p&gt;Sorry, I&amp;#8217;m out of historic SharePoint VMs. Please give me a shot if somebody has still access to a SP2003 environment. I&amp;#8217;d love to add the missing screen shot.&lt;/p&gt;

&lt;p&gt;Now, after hopefully getting you excited, here&amp;#8217;s the bad news. The demo is using the alpha release &lt;strong&gt;2013.01ALPHA5&lt;/strong&gt; of &lt;a href=&#39;http://spservices.codeplex.com/&#39;&gt;SPServices&lt;/a&gt;, so I won&amp;#8217;t make the demo code available through Github as usual. I&amp;#8217;ll update this post once the next official version of SPServices has been released and tested with Durandal SP3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2013/06/04:&lt;/strong&gt; And here&amp;#8217;s the link to the &lt;a href=&#39;https://github.com/RainerAtSpirit/Blog-Durandal-SP3&#39;&gt;github repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The good news is that there are two public available pages that allows you to go hands-on. Both are best viewed with your favorite console open.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#39;http://www.spirit.de/demos/metro/DurandalSP3/index.html#/&#39;&gt;development version:&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href=&#39;http://www.spirit.de/demos/metro/DurandalSP3/WebPartPage2010.aspx#/&#39;&gt;optimized build:&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without going into the details lets see what the Promises demo app is doing when you activate the list route (/#lists).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retrieve information about the lists in the current site via SPServices &lt;code&gt;GetListCollection&lt;/code&gt; method (with caching)&lt;/li&gt;

&lt;li&gt;Retrieve detail information about the selected list via SPServices &lt;code&gt;GetList&lt;/code&gt; method and build a mapping that can be used in SPServices &lt;code&gt;SPXmlToJson&lt;/code&gt; method (with caching)&lt;/li&gt;

&lt;li&gt;Retrieve item information via SPServices &lt;code&gt;GetListItems&lt;/code&gt; (NO caching)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Update 2013/04/11:&lt;/strong&gt; The live demo was updated based on some feedback I got. The list overview now produces a configurable row view of lists with meta information like ItemCount and Last Modified. Step 2 and 3 are performed once you select a list.&lt;/p&gt;

&lt;p&gt;By opening up the &lt;a href=&#39;http://www.spirit.de/demos/metro/DurandalSP3/WebPartPage2010.aspx#/&#39;&gt;optimized build&lt;/a&gt; and filtering the network tab for XHR you can see the three POST requests to &lt;code&gt;lists.asmx&lt;/code&gt; nicely lined up. Once you start selecting other lists, you&amp;#8217;ll noticed that the number of XHR requests decrease as more and more cached information becomes available.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Optimized build&#39; src=&#39;/img/2013-04-08-OptimizedBuild.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;The development version on the other side shows far more details via the console. That allows you to get familiar with Durandal&amp;#8217;s application life cycle and to inspect the Json result of some &lt;code&gt;spdata&lt;/code&gt; methods.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Development&#39; src=&#39;/img/2013-04-08-Development.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;After reading so far and hopefully seen the Promises demo in action by yourself, I hope that you share my excitement of the upcoming promise support in &lt;a href=&#39;http://spservices.codeplex.com/&#39;&gt;SPServices&lt;/a&gt;. Once it&amp;#8217;s part of an official release &lt;a href=&#39;http://spservices.codeplex.com/&#39;&gt;SPServices&lt;/a&gt; will become a perfect fit for Durandal&amp;#8217;s life cycle methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2013/04/16&lt;/strong&gt; Marc Anderson reposted this article as &lt;a href=&#39;http://sympmarc.com/2013/04/15/spservices-stories-13-durandal-sp3-developing-sharepoint-spas-made-easy/&#39;&gt;SPServices story&lt;/a&gt; and added a bunch of additional, valuable information. Do not miss to check it out.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Durandal meets SharePoint 2013</title>
   <link href="http://RainerAt.spirit.de/2013/02/21/durandal-meets-sharepoint-2013"/>
   <updated>2013-02-21T00:00:00-08:00</updated>
   <id>http://RainerAt.spirit.de/2013/02/21/durandal-meets-sharepoint-2013/</id>
   <content type="html">&lt;p&gt;One of the benefits of the new SharePoint 2013 app model is that we are nowadays allowed to live on the cutting edge of technology. At least if you build Autohosted or Providerhosted apps. If that what you&amp;#8217;re doing make sure to read Scott&amp;#8217;s &lt;a href=&#39;http://weblogs.asp.net/scottgu/archive/2013/02/18/announcing-release-of-asp-net-and-web-tools-2012-2-update.aspx&#39;&gt;Announcing release of ASP.NET and Web Tools 2012.2 Update&lt;/a&gt;, install the bits and then explore some of the new MVC4 &lt;a href=&#39;http://www.asp.net/single-page-application/overview/templates&#39;&gt;templates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next step would be to look at Ananu&amp;#8217;s blog &lt;a href=&#39;http://aanuwizard.com/2012/11/19/article-12-from-30-how-to-use-mvc-web-project-for-auto-hosted-and-provider-hosted-sharepoint-apps/&#39;&gt;aanuwizard&lt;/a&gt; as it has step-by-step instructions for you how to add a MVC4 project to your SharePoint 2013 apps.&lt;/p&gt;

&lt;p&gt;But how can you survive building single page application (SPA) in SharePoint if you are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;still running on SharePoint 2010 or&lt;/li&gt;

&lt;li&gt;creating SharePoint-hosted SharePoint 2013 apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me introduce you to &lt;a href=&#39;http://durandaljs.com/&#39;&gt;Durandal&lt;/a&gt;, a pretty young SPA framework, which is named after a famous French sword. As it states on the web site&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your search for a SPA framework ends here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Durandal claims to be &lt;strong&gt;comfortable&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We didn&amp;#8217;t try to re-invent the wheel. Durandal is built on libs you know and love like jQuery, Knockout and RequireJS. There&amp;#8217;s little to learn and building apps feels comfortable and familiar. Dive in and enjoy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Durandal claims to run &lt;strong&gt;Anyone and Everyone&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the end, Durandal is just a collection of JavaScript libraries, so you don&amp;#8217;t need anything special to use it. Hop on over to our github repo and fork away. You can just grab the contents of the App folder and use it to kickstart your own project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Alright let&amp;#8217;s test these statements by throwing Durandal into a SharePoint-hosted SharePoint 2013 app and see how it goes.&lt;/p&gt;

&lt;p&gt;Before we start here&amp;#8217;s a screen shot of the final result as teaser. There&amp;#8217;s an &lt;a href=&#39;https://spirit2013preview-eb1020d742cee2.sharepoint.com/DurandalSharePoint-hosted/Pages/Default.aspx?SPHostUrl=https%3A%2F%2Fspirit2013preview-public.sharepoint.com&amp;amp;SPLanguage=en-US&amp;amp;SPClientTag=4&amp;amp;SPProductNumber=15.0.4454.1011&amp;amp;SPAppWebUrl=https%3A%2F%2FSpirit2013Preview-eb1020d742cee2.sharepoint.com%2FDurandalSharePoint-hosted&#39;&gt;online version&lt;/a&gt; as well and the VS template can be forked from &lt;a href=&#39;https://github.com/RainerAtSpirit/Durandal.SharePoint-hosted&#39;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Final app running online&#39; src=&#39;/img/2013-02-21--finalResult.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;We are starting by opening up the MVC4 Durandal starter template and creating an OOTB SharePoint 2013 app of type SharePoint-hosted. Files in the MVC Content and Script folder can be copied straight away, because there are already corresponded modules in the SP template. Create a new module named &lt;code&gt;App&lt;/code&gt;, copy all App files from MVC4 app and make sure to exclude &lt;code&gt;App/Durandal/amd/optimizer.exe&lt;/code&gt; from the project. By default SP won&amp;#8217;t allow upload of &lt;code&gt;.exe&lt;/code&gt; files. Do NOT delete that file, we&amp;#8217;ll need it later.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Creating an App module&#39; src=&#39;/img/2013-02-21--App-Module.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;In the next step we&amp;#8217;re copying the necessary bits from &lt;code&gt;Index.cshtml&lt;/code&gt; and &lt;code&gt;_splash.cshtml&lt;/code&gt; into our &lt;code&gt;Default.aspx&lt;/code&gt; and adjust them to the aspx syntax.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Modifying default.aspx&#39; src=&#39;/img/2013-02-21--Default.aspx.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;In order to substitute the MVC4 BundleConfig settings for CSS and JavaScript files you must have &lt;a href=&#39;http://visualstudiogallery.msdn.microsoft.com/07d54d12-7133-4e15-becb-6f451ea3bea6&#39;&gt;Web Essentials 2012&lt;/a&gt; installed. If not, this is a good time to install it otherwise the next step won&amp;#8217;t work.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;BundleConfig settings&#39; src=&#39;/img/2013-02-21--BundleConfig.jpg&#39; /&gt; &lt;img alt=&#39;Using WebEssentials&#39; src=&#39;/img/2013-02-21--WebEssentials.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Hit F5, wait till the upload has finished and you should see something similar like this.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Running in developer mode&#39; src=&#39;/img/2013-02-21--FirstStab.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Not that bad for a first stab I&amp;#8217;d say, you&amp;#8217;ve reached Durandal&amp;#8217;s development mode. All AMD files will be served individually and in addition we are getting a whole amount of logging messages in the console. That&amp;#8217;s the place where later down the road you&amp;#8217;d spend most of your time, so make yourself familiar. Today we simply heading forward to production, but before we do that let&amp;#8217;s make a small adjustment to Durandal&amp;#8217;s navigation bar because at the moment it&amp;#8217;s overlaying the default SharePoint top nav. If you are already familiar with Durandal&amp;#8217;s app structure the next two steps are obvious. If not here are some readings that get you started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#39;http://durandaljs.com/pages/docs&#39;&gt;Durandal docs&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href=&#39;http://www.johnpapa.net/hottowel/&#39;&gt;John Papa&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href=&#39;http://stephenwalther.com/archive/2013/02/08/using-durandal-to-create-single-page-apps.aspx&#39;&gt;Stephen Walter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order to address the positioning of the navbar remove the &lt;code&gt;navbar-fixed-top&lt;/code&gt; class in &lt;code&gt;views/shell.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Modifying nav settings&#39; src=&#39;/img/2013-02-21--Shell.html.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;And now a scary moment. Let&amp;#8217;s create an optimized version of our app by going down to a command line and run &lt;code&gt;optimizer.exe&lt;/code&gt;. Remember, that was the file that we excluded earlier in the process from our project, but of course it&amp;#8217;s still sitting in the file system. As long as you stick with Durandal&amp;#8217;s defaults this tool will help you creating an optimized &lt;code&gt;main-built.js&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Running optimizer&#39; src=&#39;/img/2013-02-21--Optimizer.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;In the last step comment|uncomment the appropriate parts in default.aspx that are responsible for loading &lt;code&gt;main-build.js&lt;/code&gt; and you should be good to go.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Switching from dev to prod mode&#39; src=&#39;/img/2013-02-21--finalDefault.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Looks like we accomplished our mission for today and from my first impressions I&amp;#8217;d say that Durandal can fulfill the promise of &lt;em&gt;Your search for a SPA framework ends here.&lt;/em&gt; In one of the upcoming posts I&amp;#8217;ll add my trusted data access tool &lt;a href=&#39;http://jaydata.org&#39;&gt;JayData&lt;/a&gt; that allows us to work with native SharePoint list and libraries through OData and see how it fits into the Durandal SPA framework.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a final word of warning. Before diving deeper into this new and mighty thing called Durandal, remember it&amp;#8217;s young. So weigh the risks and don&amp;#8217;t miss to dig up the story of Durandal&amp;#8217;s eponym. You&amp;#8217;ll see that at the end the hero Roland is dead, only the sword survived &lt;code&gt;;-)&lt;/code&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>More about REST in SharePoint 2010/2013</title>
   <link href="http://RainerAt.spirit.de/2013/01/19/more-about-rest-in-sharepoint"/>
   <updated>2013-01-19T00:00:00-08:00</updated>
   <id>http://RainerAt.spirit.de/2013/01/19/more-about-rest-in-sharepoint/</id>
   <content type="html">&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s been a while since the last post about SharePoint 2013 and why you should use REST when talking to it. I&amp;#8217;m still convinced that this holds true in the long run, but you should be aware of a couple of facts that I&amp;#8217;ve learned in the meantime.&lt;/p&gt;

&lt;p&gt;At the time of this writing SharePoint 2013 only supports OData V2. &lt;strong&gt;How comes?&lt;/strong&gt; During beta phase I got the impression that &lt;code&gt;/_api&lt;/code&gt; acts as an OData V3 provider, but in the release version Microsoft pulled the plug and removed $metadata support. You can read more about that in this &lt;a href=&#39;http://social.msdn.microsoft.com/Forums/en-US/appsforsharepoint/thread/9e10f90d-666b-4787-8775-4065d9d8af44/&#39;&gt;thread&lt;/a&gt;, but here&amp;#8217;s the relevant paragraph from the &lt;a href=&#39;http://www.odata.org/media/30002/OData.html#metadatarequests&#39;&gt;specs&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OData services MUST expose a Metadata Document which defines all data exposed by the service. The Metadata Document URL SHOULD be the root URL of the service with &amp;#8220;/$metadata&amp;#8221; appended. To retrieve this document a client issues a GET request to the Metadata Document URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you read a MUST in the specs you know that without it (whatever else your service delivers) it&amp;#8217;s definitively not an OData v3 provider. What makes that so disappointing is that JayData won&amp;#8217;t work without having the $metadata information exposed to it.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re like me and want to give JayData a try for abstracting the access to the underlying data provider, you should be aware of another limiting factor. Like jQuery 2.0 that was just announced, JayData is targeted to work with modern (mobile) browser. IE8 and below definitively doesn&amp;#8217;t belong into that group and for JayData there&amp;#8217;s no way to &lt;em&gt;shim&lt;/em&gt; the missing required capabilities in.&lt;/p&gt;

&lt;p&gt;Not a big deal you say, IE8 is outdated anyway and nobody in my org is using it any longer. Lucky you, go ahead and give the OData v2/JayData combo a try. If on the other hand you want to create an app and put it in the app store&amp;#8230;&lt;/p&gt;

&lt;p&gt;Guess what one of the &lt;strong&gt;MUST&lt;/strong&gt; have criteria is that allows it to be placed in the app store is? You guessed right IE8 support! Read more about this requirement and some other pitfalls you might encounter in &lt;a href=&#39;http://www.aidangarnish.net/post/Getting-a-SharePoint-2013-App-Submitted-to-the-Office-Store.aspx&#39;&gt;this post by Aidan Garnish&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hopefully Microsoft will deliver two things in the near future:&lt;/p&gt;

&lt;p&gt;1. provide $metadata for &lt;code&gt;_api&lt;/code&gt; -&amp;gt; this will make &lt;code&gt;_api&lt;/code&gt; a real OData v3 provider&lt;/p&gt;

&lt;p&gt;2. lift the requirements for the app store. Come on guys IE8 is outdated and you&amp;#8217;ve already got two newer releases out there!&lt;/p&gt;

&lt;p&gt;but regardless if Microsoft will fulfill my small wish list or not, luckily you can get JayData running on SharePoint 2010 and SharePoint 2013 by using &lt;code&gt;_vti_bin/listdata.svc&lt;/code&gt; as of today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;: As Thomas pointed out since the Feb. 5th update to the &lt;a href=&#39;http://msdn.microsoft.com/en-us/library/office/apps/jj220035.aspx&#39;&gt;validation policies&lt;/a&gt; IE8 is no longer a requirement for SharePoint app.&lt;/p&gt;

&lt;p&gt;In order to get you started here are links to two example sites that will allow you to get hands-on. Both require that you know your way around in a browser console :), so pick up your favorite one and give it a try.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;http://jslq.spirit.de&#39;&gt;JavaScript language query playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;JSQL Playground example 13&#39; src=&#39;/img/2013-01-18-JSQL-Example13.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;This is a live version of the JSLQ101 document that will allow you to work with a public OData v2 endpoint using JayData. Note that everything that you can do with the public OData v2 endpoint can be done using &lt;code&gt;_vti_bin/listdata.svc&lt;/code&gt; in SharePoint 2010/2013.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://spirit2013preview-c3b1709654b2e8.sharepoint.com/sites/Demos/TypeScriptMeetsJayDataSharePointhosted/Pages/Default.aspx?SPHostUrl=https%3A%2F%2Fspirit2013preview%2Esharepoint%2Ecom%2Fsites%2FDemos&amp;amp;SPLanguage=en-US&amp;amp;SPClientTag=0&amp;amp;SPProductNumber=15%2E0%2E4433%2E1011&amp;amp;SPAppWebUrl=https%3A%2F%2FSpirit2013Preview-c3b1709654b2e8%2Esharepoint%2Ecom%2Fsites%2FDemos%2FTypeScriptMeetsJayDataSharePointhosted&#39;&gt;JSQL SharePoint 2013 app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UserName&lt;/strong&gt;: odatademo@spirit2013preview.onmicrosoft.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Password&lt;/strong&gt;: OData!Demo&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;SharePoint hosted JSLQ example 6&#39; src=&#39;/img/2013-01-18--SP13-Example6.jpg&#39; /&gt; This is a SharePoint-hosted app that allows you to use CRUD operation against the app web. The list structure is described in more detail by Chris O&amp;#8217;Brien and consists of a simple project list and a custom time tracking list that has a lookup to the project list. Make yourself familiar with this setup by reading &lt;a href=&#39;http://www.sharepointnutsandbolts.com/2012/08/create-lists-content-types-files-etc.html&#39;&gt;this post from Chris&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note even if this is an SharePoint hosted app running on SharePoint 2013, because it&amp;#8217;s using &lt;code&gt;_vti_bin/listdata.svc&lt;/code&gt; this would work on SP2010 as well.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SharePoint 2013 apps: CSOM vs. REST?</title>
   <link href="http://RainerAt.spirit.de/2012/10/05/sharepoint-2013-apps-csom-vs-rest"/>
   <updated>2012-10-05T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/10/05/sharepoint-2013-apps-csom-vs-rest/</id>
   <content type="html">&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;Have your seen Microsoft&amp;#8217;s &lt;a href=&#39;http://www.typescriptlang.org/&#39;&gt;TypeScript&lt;/a&gt; preview already? Are you curious how that will help you building SharePoint 2013 apps? Eager to get your hands dirty? So the good news is that by simply following the steps outlined in the &lt;a href=&#39;http://rainerat.spirit.de/2012/09/08/mv-sharepoint-2013-apps-a-la-carte/&#39;&gt;last blog&lt;/a&gt;, this time using the TypeScript &lt;a href=&#39;http://www.typescriptlang.org/Samples/#TodoMVC&#39;&gt;ToDoMVC example&lt;/a&gt; as your &lt;em&gt;a la carte&lt;/em&gt; selection, you will be up and running in minutes.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;TypeScript SharePoint 2013 app&#39; src=&#39;/img/2012-10-05-TypeScriptToDo.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Great starting point, but what&amp;#8217;s next? How can we access data that is stored inside SharePoint? No server side code is allowed in the app model, so your options are CSOM or REST. Which one is the better approach? Does the type of App you build has an influence? &lt;strong&gt;Just to recap&lt;/strong&gt; you can choose between SharePoint-hosted, Autohosted and Provider-hosted. Other than the typical consultant answer &lt;em&gt;it depends&lt;/em&gt; &lt;code&gt;;-)&lt;/code&gt; here are some reasons why I&amp;#8217;m always using &lt;strong&gt;REST&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the server side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SharePoint 2010 already provides &lt;code&gt;listdata.svc&lt;/code&gt; (OData v2) -&amp;gt; Start building list-based CRUD solutions today&lt;/li&gt;

&lt;li&gt;SharePoint 2013 adds the new OData v3 &lt;code&gt;_api&lt;/code&gt; endpoint -&amp;gt; Function support in OData v3 allows Microsoft to expose the whole range of CSOM functionality via REST&lt;/li&gt;

&lt;li&gt;You can control access to external OData services by using &lt;a href=&#39;http://zimmergren.net/technical/sharepoint-2013-business-connectivity-services-bcs-improvements-introduction&#39;&gt;Business Connectivity Services&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;VS2012 makes it easier than ever to produce OData v2/v3 services based on your own data sources&lt;/li&gt;

&lt;li&gt;&lt;a href=&#39;http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/133/A-LightSwitch-Netflix-OData-Mash-up.aspx&#39;&gt;LightSwitch&lt;/a&gt; eases the creation of server side mash-ups and expose them via OData&lt;/li&gt;

&lt;li&gt;&lt;a href=&#39;http://www.odata.org/ecosystem&#39;&gt;OData ecosystem&lt;/a&gt; provides access to data outside of the SharePoint context&lt;/li&gt;

&lt;li&gt;Earlier this year Microsoft announced that OData becomes an &lt;a href=&#39;http://www.microsoft.com/en-us/news/press/2012/may12/05-24ODataPR.aspx&#39;&gt;OASIS Standard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the client side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HTML5/JavaScript apps are extremely popular nowadays and languages that compile into JavaScript like &lt;a href=&#39;http://coffeescript.org/&#39;&gt;CoffeeScript&lt;/a&gt; and &lt;a href=&#39;http://www.typescriptlang.org/&#39;&gt;TypeScript&lt;/a&gt; help to transition from server side languages to JavaScript&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CoffeeScript is to Ruby as TypeScript is to Java/C#/C++.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Luke Hoban (co-creator of TypeScript)&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;SPAs are the perfect fit for mobile application&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Client side libraries like &lt;a href=&#39;http://datajs.codeplex.com/documentation&#39;&gt;data.js&lt;/a&gt; or &lt;a href=&#39;http://jaydata.org/documentation&#39;&gt;jaydata.js&lt;/a&gt; provide an abstraction layer for OData, so you don&amp;#8217;t have to deal with the OData &lt;a href=&#39;http://www.odata.org/documentation/uri-conventions&#39;&gt;URI Conventions&lt;/a&gt; on your own.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So at the end of the day you learn OData and a couple of client side app pattern once, and then you can reuse this knowledge over and over again&amp;#8230; even outside of SharePoint.&lt;/p&gt;

&lt;p&gt;With that said, we still need to figure out how to access data that is stored in SharePoint from our remote hosted web, don&amp;#8217;t we?&lt;/p&gt;

&lt;p&gt;The following drawing summarizes what&amp;#8217;s going on when you run an Autohosted or Provider-hosted app.&lt;/p&gt;

&lt;p&gt;You end up with three places where data can be stored.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the remote web&lt;/li&gt;

&lt;li&gt;In the app web&lt;/li&gt;

&lt;li&gt;In the host web&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img alt=&#39;Access data using SP.RequestExecutor&#39; src=&#39;/img/2012-10-05-AccessData.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;In a client-only application direct accessing data in the app web (2.) and host web (3.) from your remote app (1.) is prohibited by &lt;a href=&#39;http://en.wikipedia.org/wiki/Cross-site_scripting&#39;&gt;cross-site-script&lt;/a&gt; restrictions. That where Microsoft&amp;#8217;s &lt;code&gt;SP.RequestExecutor.js&lt;/code&gt; library comes into play. As you can see in the drawing under the hood the system creates an IFrame in the remote web to a specific page in the app/host web (AppWebProxy.aspx), so in effect you&amp;#8217;re &amp;#8220;remote call&amp;#8221; is a local call that tunnels through the IFrame to the remote site.&lt;/p&gt;

&lt;p&gt;Accessing data in the host web is further secured by OAuth, so in order to access information in the host web your application has to be configured correctly using the AppManifest.xml file. Last but not least you are allowed to configure the &lt;a href=&#39;http://msdn.microsoft.com/en-us/library/fp179892(v=office.15).aspx&#39;&gt;App authorization policy type&lt;/a&gt; e.g. if you app needs elevated privileges.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;appmanifest.xml&#39; src=&#39;/img/2012-10-05-AppManifest.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;In the default App for SharePoint 2013 Autohosted and Provider-hosted templates, Microsoft provides the &lt;code&gt;Tokenhelper.cs&lt;/code&gt; file to deal with the whole App authentication and authorization process. Good news is, you don&amp;#8217;t even have to deal with that if you are creating a client side only app. Once you&amp;#8217;ve access to the app web you can use the &lt;code&gt;SP.AppContextSite(@hostweb)/&lt;/code&gt; &lt;code&gt;_api&lt;/code&gt; function to access information from the host web. &lt;code&gt;SP.AppContextSite()&lt;/code&gt; will then ensure that you are accessing the host data in compliance to the permissions you&amp;#8217;ve configured.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s some minimalistic code that retrieves information from the app web and the host web and logs title and url on success.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;execCrossDomainRequest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// executor: The RequestExecutor object&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Initialize the RequestExecutor with the app web URL.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;executor&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;RequestExecutor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;appweburl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Retrieve information from the app web&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;executor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;executeAsync&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;       &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;           &lt;span class=&#39;nx&#39;&gt;url&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;               &lt;span class=&#39;nx&#39;&gt;appweburl&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;               &lt;span class=&#39;s2&#39;&gt;&amp;quot;/_api/web&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;           &lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;           &lt;span class=&#39;nx&#39;&gt;headers&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;application/json; odata=verbose&amp;quot;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;           &lt;span class=&#39;nx&#39;&gt;success&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;successHandler&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;           &lt;span class=&#39;nx&#39;&gt;error&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;errorHandler&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;       &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Retrieve information from the host web&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;executor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;executeAsync&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;url&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;appweburl&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;                 &lt;span class=&#39;s2&#39;&gt;&amp;quot;/_api/SP.AppContextSite(@hostweb)/web/?@hostweb=&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hostweburl&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;headers&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;application/json; odata=verbose&amp;quot;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;success&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;successHandler&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;error&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;errorHandler&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;30&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;31&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;32&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;33&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;successHandler&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;data&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;34&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;result&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JSON&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;parse&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;data&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;body&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;35&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;console&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;log&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;Title: &amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;result&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Title&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39; Url: &amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;result&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Url&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;36&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Trying to run this code using an OOTB template won&amp;#8217;t work and the various error messages you might see can be tracked down to the fact that the &lt;code&gt;appweburl&lt;/code&gt; is &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;appweburl undefined&#39; src=&#39;/img/2012-10-05-MissingAppWeb.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How comes?&lt;/strong&gt; By default the Autohosted or Provider-hosted template have an empty app web. If the app web is empty SharePoint doesn&amp;#8217;t create the app web for you. But as you can see in the diagram above without an app web, there&amp;#8217;s no way to retrieve information for a client side solution. An NO, replacing &lt;code&gt;appweburl&lt;/code&gt; through &lt;code&gt;hostweburl&lt;/code&gt;to bypass the app web completely like in the following code example won&amp;#8217;t work.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;hostweb not allowed here&#39; src=&#39;/img/2012-10-05-Hostweb.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Instead the system returns the following error message.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Error message&#39; src=&#39;/img/2012-10-05-Error.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to mitigate?&lt;/strong&gt; The solution is as simple as adding an &lt;code&gt;Empty Element&lt;/code&gt; to the app web. This will force SharePoint to create the app web and you&amp;#8217;ve got your missing stepping stone into the host web.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Mission accomplished&#39; src=&#39;/img/2012-10-05-MissionAccomplished.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Mission accomplished and for those of you who made it till the end here&amp;#8217;s the link for today&amp;#8217;s &lt;a href=&#39;https://github.com/RainerAtSpirit/TypeScript.Autohosted.App&#39;&gt;github repro&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>MV* SharePoint 2013 Apps a la carte</title>
   <link href="http://RainerAt.spirit.de/2012/09/08/mv-sharepoint-2013-apps-a-la-carte"/>
   <updated>2012-09-08T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/09/08/mv-sharepoint-2013-apps-a-la-carte/</id>
   <content type="html">&lt;p&gt;Hey there,&lt;/p&gt;

&lt;p&gt;Welcome to our small SharePoint App restaurant, where we serve the best client side MV* &lt;em&gt;crossover&lt;/em&gt; SharePoint apps worldwide. So what make us so special and what do I mean when saying MV* &lt;em&gt;crossover&lt;/em&gt; app?&lt;/p&gt;

&lt;p&gt;As you already know you can use the Visual studio 2012 &lt;code&gt;App for SharePoint 2013&lt;/code&gt; template to create app flavors like &lt;code&gt;SharePoint-hosted&lt;/code&gt;, &lt;code&gt;Autohosted&lt;/code&gt; or &lt;code&gt;Provider-hosted&lt;/code&gt;, which can be used as starting point for creating your own apps. And there is this world of client side single page application (SPA) that can be easily mixed into it. If you&amp;#8217;ve ever have written some SPA before, you&amp;#8217;ll know that you&amp;#8217;re in the need to structure your apps real soon, otherwise you&amp;#8217;ll start writing unmaintainable Spaghetti code.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s where Model View Controller, Model View Presenter, Model View View Model or short MV* libraries like &lt;a href=&#39;http://knockoutjs.com/&#39;&gt;Knockout&lt;/a&gt;, &lt;a href=&#39;http://backbonejs.org/&#39;&gt;backbone.js&lt;/a&gt;&amp;#8230; or frameworks like &lt;a href=&#39;http://dojotoolkit.org/&#39;&gt;dojo&lt;/a&gt;, &lt;a href=&#39;http://yuilibrary.com/&#39;&gt;yui&lt;/a&gt;&amp;#8230; come into play. They help you, and I&amp;#8217;m going to quote John Papa&amp;#8217;s words here:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Turn your code from &lt;a href=&#39;http://johnpapa.net/spapost6&#39;&gt;Spaghetti to Ravioli&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With that said without further hassle, here&amp;#8217;s what we are going to serve today. Even better find all background information needed to help you get started when cooking your own.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;SharePoint 2013 ToDo App&#39; src=&#39;/img/2012-09-08-ToDosApp.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;If you haven&amp;#8217;t made up your mind yet, which MV* style is the right one for you, drop by &lt;a href=&#39;http://todomvc.com/&#39;&gt;http://todomvc.com/&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Developers these days are spoiled with choice when it comes to selecting an MV* framework for structuring and organizing their JavaScript web apps.&lt;/p&gt;

&lt;p&gt;Backbone, Ember, AngularJS, Spine&amp;#8230; the list of new and stable solutions continues to grow, but just how do you decide on which to use in a sea of so many options?&lt;/p&gt;

&lt;p&gt;To help solve this problem, we created TodoMVC - a project which offers the same Todo application implemented using MV* concepts in most of the popular JavaScript MV* frameworks of today.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Want to find out what makes it a framework or library and if one or another better suits your needs? Make sure that you don&amp;#8217;t miss Stephen Sanderson&amp;#8217;s &lt;a href=&#39;http://blog.stevensanderson.com/2012/08/01/rich-javascript-applications-the-seven-frameworks-throne-of-js-2012/&#39;&gt;the Seven Frameworks&lt;/a&gt; post.&lt;/p&gt;

&lt;p&gt;Enough theory let&amp;#8217;s get hands-on to see &lt;em&gt;What needs to be done&lt;/em&gt;. Each todo below has some instructions and screen shots, but I won&amp;#8217;t dig into too much code today. Don&amp;#8217;t worry though, because&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;a href=&#39;https://github.com/RainerAtSpirit/ToDoMVC&#39;&gt;ToDoMVC example is available at github&lt;/a&gt;, so clone it and use it as starting point for your own apps&lt;/li&gt;

&lt;li&gt;Each todo has an associated git tag that let you checkout the example at this specific point&lt;/li&gt;

&lt;li&gt;Links to git diffs are available, whenever there&amp;#8217;s a need for some details&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#39;todo_1_create_sharepoint_2013_autohosted_app&#39;&gt;Todo 1: Create SharePoint 2013 Autohosted app&lt;/h3&gt;

&lt;p&gt;Let&amp;#8217;s start by creating an App for SharePoint 2013 in Visual Studio 2012 and use Autohosted for the hosting type.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-CreateApp.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-Autohosted.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-CleanTheStageBefore.jpg&#39; /&gt;&lt;/p&gt;

&lt;h3 id=&#39;todo_2_clean_the_stage&#39;&gt;Todo 2: Clean the stage&lt;/h3&gt;

&lt;p&gt;The defaults above don&amp;#8217;t do us any good as we are going to create a client side SPA. Let&amp;#8217;s get rid of all Properties and References, and then delete the Pages directory and the TokenHelper.cs file. This will leave us with a really clean stage, which we can build on. &lt;em&gt;Please note&lt;/em&gt; that at this point the example isn&amp;#8217;t doing anything. &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-CleanTheStageAfter.jpg&#39; /&gt;&lt;/p&gt;

&lt;h3 id=&#39;todo_3_select_from_the_todomv_menu&#39;&gt;Todo 3: Select from the ToDoMV* menu&lt;/h3&gt;

&lt;p&gt;Picking something from the ToDoMV* menu is completely up to your personal taste, but it probably helps if you already have some experience with the library/framework you chose.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;ve seen/read &lt;a href=&#39;http://rainerat.spirit.de/2012/08/01/the-ferrari-meets-jaydata/&#39;&gt;The Ferrari meets JayData&lt;/a&gt;, you&amp;#8217;re probably not astonished why my pick for today is the Knockout + RequireJS example from the labs section.&lt;/p&gt;

&lt;p&gt;Regardless of what you&amp;#8217;ve picked, here are the steps to get it working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Choose from the menu. &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-ChooseFromTheMenu.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step2:&lt;/strong&gt; Copy the files into the web project. &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-PickFiles.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step3:&lt;/strong&gt; Copy the asset directory that holds common files for all todo examples. &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-PickAssets.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step4:&lt;/strong&gt; Update the appmanifest.xml so that it points to your index.html (or whatever start page you&amp;#8217;ve created/copied). &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-UpdateAppManifest.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; When done press F5 start the app and enjoy the results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please note&lt;/strong&gt;: If you are seeing a &lt;code&gt;405.0 error&lt;/code&gt; instead, make sure to apply the settings described in this post &lt;a href=&#39;http://rainerat.spirit.de/2012/09/03/SharePoint-2013-App-HTTP-Error-405.0/&#39;&gt;SharePoint 2013 App HTTP Error 405.0&lt;/a&gt; &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-FirstResult.jpg&#39; /&gt;&lt;/p&gt;

&lt;h3 id=&#39;todo_4_add_the_chrome_control&#39;&gt;Todo 4: Add the chrome control&lt;/h3&gt;

&lt;p&gt;Adding the chrome control is a two-step process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Add the chrome_ctrl_placeholder div to index.html &lt;a href=&#39;https://github.com/RainerAtSpirit/ToDoMVC/commit/df8de9a1644fc75fbfa9289d1a9440b04bcbcf9a#diff-1&#39;&gt;Todo 4 Step Diff 1&lt;/a&gt; &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-index.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Add the required chrome control JavaScript to your code. &lt;a href=&#39;https://github.com/RainerAtSpirit/ToDoMVC/commit/df8de9a1644fc75fbfa9289d1a9440b04bcbcf9a#diff-3&#39;&gt;Todo 4 Step Diff 2&lt;/a&gt; &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-addcode.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Depending on the example you&amp;#8217;ve picked, running this right away might lead to some error messages, which needs to be resolved before moving on. With the &lt;a href=&#39;http://knockoutjs.com/&#39;&gt;Knockout&lt;/a&gt; + &lt;a href=&#39;http://requirejs.org/&#39;&gt;RequireJS&lt;/a&gt; example I&amp;#8217;m running into this. &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-MissingJQuery.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Reason is that this example doesn&amp;#8217;t use jQuery at all&amp;#8230; up till now. So let&amp;#8217;s add it following the &lt;a href=&#39;http://requirejs.org/&#39;&gt;RequireJS&lt;/a&gt; way and while on it let&amp;#8217;s make sure that we try loading from a CDN first before serving our own local copy.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-mainjs.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-Cosmetics.jpg&#39; /&gt;&lt;/p&gt;

&lt;h3 id=&#39;todo_5_cosmetic_changes&#39;&gt;Todo 5: Cosmetic changes&lt;/h3&gt;

&lt;p&gt;There are only a couple of &lt;a href=&#39;https://github.com/RainerAtSpirit/ToDoMVC/commit/76e784704f62b3399dfd251b7435ed841d9301b4&#39;&gt;minor tweaks&lt;/a&gt; left like adding an AppIcon, changing the body and/or chrome-control width before we&amp;#8217;re satisfied with the result. &lt;img alt=&#39;Create App for SharePoint&#39; src=&#39;/img/2012-09-08-MissionAccomplished.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s it for today, you&amp;#8217;ve just cooked your &lt;strong&gt;first MV* SharePoint 2013 app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Is there more to it? Sure! Here are a couple of suggestions that you might want to try out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store todos in a SharePoint list instead of local storage&lt;/li&gt;

&lt;li&gt;Store todos in SQL azure&lt;/li&gt;

&lt;li&gt;Store todos in your own provider-hosted data-store&lt;/li&gt;

&lt;li&gt;&amp;#8230; fill in the blanks with your own ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As long as you like cooking/coding/building/architecting, I don&amp;#8217;t see any shortcoming of opportunities while SharePoint 2013 is making it to the market.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SharePoint 2013 and the notorious disclaimer</title>
   <link href="http://RainerAt.spirit.de/2012/09/05/SharePoint-2013-and-the-notorious-disclaimer"/>
   <updated>2012-09-05T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/09/05/SharePoint-2013-and-the-notorious-disclaimer/</id>
   <content type="html">&lt;p&gt;At the time of this writing you&amp;#8217;ve probably seen something like the below, while browsing SharePoint 2013 blogs or the documentation on MSDN.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclaimer MONTH DAY 2012: SharePoint 2013 is in preview at this stage, so some specifics and user experiences may change slightly between now and release time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With that in mind we expect having some fun time while trying to get things working using the documentation/examples that are out there. To make things even more exciting Visual studio 2012 and Windows 8 were just released lately. In contrast most examples have been written using prerelease software.&lt;/p&gt;

&lt;p&gt;Once you get started with SharePoint apps, you will be in need for examples and you know that &lt;a href=&#39;http://code.msdn.microsoft.com/officeapps/&#39;&gt;officeapps&lt;/a&gt; is a great starting point. Me, I&amp;#8217;m primarily interested in SharePoint 2013 apps that use client side REST calls to access server side data. Luckily there are already a couple of examples at &lt;a href=&#39;http://code.msdn.microsoft.com/officeapps/&#39;&gt;officeapps&lt;/a&gt; that cover that area.&lt;/p&gt;

&lt;p&gt;Unfortunately most of them fall under the above &lt;code&gt;Disclaimer&lt;/code&gt; category and therefore need some tweaking before they work to my liking.&lt;/p&gt;

&lt;p&gt;Before moving on&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Notorious disclaimer September 05 2012: I&amp;#8217;m running the example in a VMWare instance of Win8 plus VS2012, both RTM. Your experience may wary, but that&amp;#8217;s expected.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sorry couldn&amp;#8217;t resist &lt;code&gt;:)&lt;/code&gt;. With that said let&amp;#8217;s take a specific example like &lt;a href=&#39;http://code.msdn.microsoft.com/officeapps/SharePoint-2013-Use-the-a759e9f8&#39;&gt;Use the chrome control and the cross-domain library (REST)&lt;/a&gt; and see what might happen while you testing it out.&lt;/p&gt;

&lt;h3 id=&#39;issue_1_httpshttp_mixed_content&#39;&gt;Issue 1: HTTPS/HTTP Mixed content&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Download the example, open in Visual studio 2012 and add your SiteURL &lt;img alt=&#39;Adding SiteURL&#39; src=&#39;/img/2012-09-05-SiteURL.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Run the example and launch the app &lt;img alt=&#39;Launch App&#39; src=&#39;/img/2012-09-05-LaunchApp.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; If you see an error messages in VS, hit continue &lt;img alt=&#39;Continue on VS error&#39; src=&#39;/img/2012-09-05-VS$undefined.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Switch to IE and confirm &amp;#8220;Show all content&amp;#8221; &lt;img alt=&#39;IE message&#39; src=&#39;/img/2012-09-05-IEMessage.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Finally: Success! &lt;img alt=&#39;IE message&#39; src=&#39;/img/2012-09-05-Success.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s the problem?&lt;/strong&gt; Based on the IE message we see that we have a mixed bag of &lt;code&gt;https&lt;/code&gt; and &lt;code&gt;http&lt;/code&gt; content on our page, which is prevented by the default IE settings. Glancing through the html code reveals that we are loading files from a CDN via &lt;code&gt;http&lt;/code&gt; while the web site is running on &lt;code&gt;https&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;        &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;         &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;        &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;         &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;How to mitigate:&lt;/strong&gt; Instead of simply changing the src attribute to &lt;code&gt;src=&amp;quot;https://ajax...&amp;quot;&lt;/code&gt;, which would reintroduce the issue if we later switch the web site protocol from &lt;code&gt;https:&lt;/code&gt; to &lt;code&gt;http:&lt;/code&gt;, let&amp;#8217;s get rid of the protocol all together so that it reads: &lt;code&gt;src=&amp;quot;//ajax...&amp;quot;&lt;/code&gt;. If that syntax doesn&amp;#8217;t look familiar to you, check out &lt;a href=&#39;http://encosia.com/3-reasons-why-you-should-let-google-host-jquery-for-you/&#39;&gt;3 reasons why you should let Google host jQuery for you&lt;/a&gt; to learn more about it.&lt;/p&gt;

&lt;h3 id=&#39;issue_2_chrome_control_prevents_scroll_bar&#39;&gt;Issue 2: Chrome control prevents scroll bar&lt;/h3&gt;

&lt;p&gt;&lt;img alt=&#39;No scroll bar&#39; src=&#39;/img/2012-09-05-NoScrollBar.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s the problem?&lt;/strong&gt; The chrome control dynamically loads some additional CSS from the &lt;code&gt;host web&lt;/code&gt;. So it&amp;#8217;s not your CSS that causes the issues, it&amp;#8217;s the remote CSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to mitigate:&lt;/strong&gt; The chrome control injects a &lt;code&gt;link id=&amp;quot;...&lt;/code&gt; element inside the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section, which ensures that this CSS is evaluated first (see issue 4 for details). That allows us to overwrite conflicting styles in our own CSS file. Let&amp;#8217;s create an app.css file and include it in the html file(s). While on it you might want to clean up a little and get rid of the &lt;code&gt;script&lt;/code&gt; element that loads &lt;code&gt;MicrosoftAjax.js&lt;/code&gt;. Neither the example nor the chrome control and cross-domain library rely on it.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;    &lt;span class=&#39;nt&#39;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Chrome control host page&lt;span class=&#39;nt&#39;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;    &lt;span class=&#39;nt&#39;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;rel=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;app.css&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;    &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;       &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;        &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;    &lt;span class=&#39;nt&#39;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt;    ...
&lt;span class=&#39;lineno&#39;&gt;9&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;app.css:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;css&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;body&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;overflow-y&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;scroll&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#39;issue_3_houston_weve_got_a_problem&#39;&gt;Issue 3: Houston, We&amp;#8217;ve Got a Problem&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Realize that we have a problem. &lt;img alt=&#39;No scroll bar&#39; src=&#39;/img/2012-09-05-LeakingGlobals.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s the problem?&lt;/strong&gt; Do we really have a problem here? After the modification done above the example is working and therefore allows grasping the essence of it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This code sample includes a remote webpage that hosts the chrome control and retrieves information from the host web using the cross domain library and Representational State Transfer (REST) in SharePoint 2013 Preview.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;So again. What&amp;#8217;s the problem?&lt;/strong&gt; If you are an experienced HTML5/CSS/JavaScript developer there&amp;#8217;s probably none. You&amp;#8217;d see that there are a couple of issues with the example like&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;leaking globals&lt;/li&gt;

&lt;li&gt;script elements in header&lt;/li&gt;

&lt;li&gt;waiting for $(document).ready before code execution&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;but you&amp;#8217;d simply ignore them and make a mental note to fix them in your own code. You grasped the essence of it and that&amp;#8217;s what count.&lt;/p&gt;

&lt;p&gt;Chances are that you&amp;#8217;re coming from a different angle, let&amp;#8217;s say you&amp;#8217;re an experienced .NET or even SharePoint developer and HTML5/CSS/JavaScript is not your prime area of expertise. You make the example work and grasp the essence of it. But because you don&amp;#8217;t know what you don&amp;#8217;t know, you will start replicating the code base&amp;#8230; including the issues.&lt;/p&gt;

&lt;p&gt;But hey, we got the &lt;code&gt;notorious disclaimer&lt;/code&gt;, so Microsoft may change things later down the road. Maybe they start updating the examples closer to the release date. Yes maybe they do, but we better don&amp;#8217;t &lt;code&gt;wait for || rely on&lt;/code&gt; it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to mitigate:&lt;/strong&gt; Let&amp;#8217;s apply some JavaScript best practice rules and refactor the example. The goal is not to bend it too much, just making it living to the rules without losing the essence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Move declared global vars and named functions inside &lt;code&gt;$(document).ready&lt;/code&gt;. &lt;strong&gt;Catchword:&lt;/strong&gt; &lt;a href=&#39;https://www.google.de/search?q=Declared+and++implied+globals&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:official&amp;amp;client=firefox-a&#39;&gt;Declared and implied globals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hostweburl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;appweburl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Load the required SharePoint libraries&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ready&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Function to prepare and issue the request to get&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;//  SharePoint data&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;execCrossDomainRequest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;..&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Load the required SharePoint libraries&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ready&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hostweburl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;appweburl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Function to prepare and issue the request to get&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;//  SharePoint data&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;execCrossDomainRequest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;..&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Load scripts at the bottom of your html. &lt;strong&gt;Catchword:&lt;/strong&gt; &lt;a href=&#39;http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5/&#39;&gt;High Performance Web Sites: Rule 6&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;cp&#39;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;html&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Chrome control host page&lt;span class=&#39;nt&#39;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;rel=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;app.css&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- Chrome control placeholder --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;chrome_ctrl_placeholder&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;h1&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;ms-accentText&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;Main content&lt;span class=&#39;nt&#39;&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- This is the placeholder for the announcements --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;renderAnnouncements&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- Script tags moved to bottom --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;ChromeLoader.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;CrossDomainExec.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: By loading scripts at the bottom, the need to wait for &lt;code&gt;$(document).ready&lt;/code&gt; before we can kick off our code vanishes away, so we can speed up load time by switching to an Immediately-Invoked Function Expression &lt;a href=&#39;http://benalman.com/news/2010/11/immediately-invoked-function-expression/&#39;&gt;IIFE&lt;/a&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ready&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are probably other things that you might want to improve, but with those minor tweaks above, we already covered a lot of ground.&lt;/p&gt;

&lt;p&gt;Further readings: &lt;a href=&#39;http://net.tutsplus.com/tutorials/javascript-ajax/the-essentials-of-writing-high-quality-javascript/&#39;&gt;The Essentials of Writing High Quality JavaScript&lt;/a&gt;, &lt;a href=&#39;http://benalman.com/news/2010/11/immediately-invoked-function-expression/&#39;&gt;IIFE&lt;/a&gt; and &lt;a href=&#39;http://en.wikipedia.org/wiki/Houston,_We&amp;apos;ve_Got_a_Problem&#39;&gt;Okay, Houston, we&#39;ve had a problem here&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#39;issue_4_preventing_flash_of_unstyled_content&#39;&gt;Issue 4: Preventing flash of unstyled content&lt;/h3&gt;

&lt;p&gt;&lt;img alt=&#39;No scroll bar&#39; src=&#39;/img/2012-09-05-Fouc.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&amp;#8217;s the problem?&lt;/strong&gt; Loading the chrome control happens asynchronously using &lt;a href=&#39;http://api.jquery.com/jQuery.getScript/&#39;&gt;$.getScript()&lt;/a&gt; with &lt;code&gt;renderChrome()&lt;/code&gt; as callback. Within &lt;code&gt;renderChrome&lt;/code&gt; you first configure the control and then kick it off via &lt;code&gt;nav.setVisible(true) &lt;/code&gt;. This will add the dynamic &lt;code&gt;link&lt;/code&gt; element that finally loads the remote CSS. So there&amp;#8217;s a time frame after &lt;code&gt;document.ready&lt;/code&gt; in which our static HTML content will not be aware of the remote CSS.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt;    &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;    &lt;span class=&#39;c1&#39;&gt;// Load the js file and continue to the&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;//   success handler&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;getScript&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;scriptbase&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;SP.UI.Controls.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;renderChrome&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;//Function to prepare the options and render the control&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;renderChrome&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;9&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;How to mitigate:&lt;/strong&gt; Switching from &lt;code&gt;SP.UI.Controls.js&lt;/code&gt; to &lt;code&gt;SP.UI.Controls.debug.js&lt;/code&gt; let step us into &lt;code&gt;nav
.setVisible(true)&lt;/code&gt;, where we see how MS constructs the link to &lt;code&gt;defaultcss.ashx&lt;/code&gt; and sets up an event listener to determine when the CSS is loaded.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;visible&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;!&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$s_0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;             &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$v_0&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;head&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;))[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;             &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$v_1&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;createElement&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;link&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;$v_1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setAttribute&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;UI&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Controls&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Navigation&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$2&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;UI&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Controls&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Navigation&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$12&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;$v_1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setAttribute&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;rel&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;stylesheet&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;$v_1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setAttribute&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;text/css&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;$v_1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setAttribute&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$3_0&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;UI&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Controls&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Navigation&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;getVersionedLayoutsUrl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;defaultcss.ashx&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$v_1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;addEventListener&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;                         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$$t_5&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;                         &lt;span class=&#39;nx&#39;&gt;$v_1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;addEventListener&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;load&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;                             &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;UI&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Controls&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Navigation&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$z&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$$t_5&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;visible&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;                         &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;false&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;                     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What&amp;#8217;s good for MS is good for us, so we add a &lt;code&gt;style=&amp;quot;display: none&amp;quot;&lt;/code&gt; to the body tag and add our own event handler that changes the style attribute to &lt;code&gt;display: block&lt;/code&gt; when the CSS is loaded. As we are already using jQuery this is pretty straight forward.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;nav&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setVisible&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kc&#39;&gt;true&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;#chromeControl_stylesheet&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;on&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;load&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;event&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;body&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;show&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&amp;#8217;s it for today and as a benefit for people who really made it till the end of this TL;DR, here&amp;#8217;s a link to &lt;a href=&#39;https://github.com/RainerAtSpirit/SharePoint-2013-Use-the-a759e9f8&#39;&gt;github&lt;/a&gt;, where the code for today&amp;#8217;s post is available. While there take a look at the &lt;a href=&#39;https://github.com/RainerAtSpirit/SharePoint-2013-Use-the-a759e9f8/commits/master&#39;&gt;commit history&lt;/a&gt; and you&amp;#8217;ll see that for every issue described above there&amp;#8217;s a commit available.&lt;/p&gt;

&lt;p&gt;Feel free to clone and send me a pull request if you find other issues.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Commit history&#39; src=&#39;/img/2012-09-05-CommitHistory.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;You are working on another example, but find applying the above modifications beneficial? Good, make sure to share. I&amp;#8217;m using the shortened URL from &lt;a href=&#39;http://code.msdn.microsoft.com/officeapps/&#39;&gt;officeapps&lt;/a&gt; as git repository name. Create a git repro using this naming convention and link to your repro from the &lt;a href=&#39;http://code.msdn.microsoft.com/officeapps/&#39;&gt;officeapps&lt;/a&gt; example Q&amp;amp;A section.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Naming convention&#39; src=&#39;/img/2012-09-05-OfficeAppsUrl.jpg&#39; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SharePoint 2013 App HTTP Error 405.0</title>
   <link href="http://RainerAt.spirit.de/2012/09/03/SharePoint-2013-App-HTTP-Error-405.0"/>
   <updated>2012-09-03T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/09/03/SharePoint-2013-App-HTTP-Error-405.0/</id>
   <content type="html">&lt;p&gt;Hi there!&lt;/p&gt;

&lt;p&gt;Today&amp;#8217;s post is just a short one about an &lt;code&gt;HTTP Error 405.0&lt;/code&gt; that I was seeing when trying to get an &lt;code&gt;Autohosted&lt;/code&gt; SharePoint app working with static files. If you&amp;#8217;re not sure what a SharePoint App is or what it&amp;#8217;s good for read Ted Pattison&amp;#8217;s blog &lt;a href=&#39;http://blog.tedpattison.net/Lists/Posts/Post.aspx?List=9d54806e-14ca-456d-a62a-b903c9dda841&amp;amp;ID=17&amp;amp;utm_source=twitterfeed&amp;amp;utm_medium=twitter&amp;amp;Web=dbc8a5bc-c0d9-412c-8929-177a045a5351&#39;&gt;My first weekend in Napa&lt;/a&gt; and the &lt;a href=&#39;http://blogs.msdn.com/b/officeapps/&#39;&gt;Apps for Office and SharePoint blog&lt;/a&gt; to get you started.&lt;/p&gt;

&lt;p&gt;So what happened? I wanted to replace the default files in an &lt;code&gt;Autohosted&lt;/code&gt; template with files coming from my favorite HTML5 framework: &lt;a href=&#39;http://foundation.zurb.com/&#39;&gt;Zurb foundation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you don&amp;#8217;t trust screenshots &lt;code&gt;;-)&lt;/code&gt; here are the steps to follow along:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create an App for SharePoint &lt;img alt=&#39;Create App&#39; src=&#39;/img/2012-09-03-NewProject.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Choose Autohosted for hosting type &lt;img alt=&#39;Choose Autohosted&#39; src=&#39;/img/2012-09-03-Autohosted.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Get rid of the defaults files, references and properties &lt;img alt=&#39;Defaults&#39; src=&#39;/img/2012-09-03-Defaults.jpg&#39; /&gt; &lt;img alt=&#39;Clean&#39; src=&#39;/img/2012-09-03-Clean.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Copy/paste you static HTML files and adjust AppManifest &lt;img alt=&#39;Source files&#39; src=&#39;/img/2012-09-03-Files.jpg&#39; /&gt; &lt;img alt=&#39;AppManifest&#39; src=&#39;/img/2012-09-03-AppManifest.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Run the app, trust it and &amp;#8230; &lt;code&gt;HTTP Error 405.0&lt;/code&gt; &lt;img alt=&#39;Trust&#39; src=&#39;/img/2012-09-03-Trust.jpg&#39; /&gt; &lt;img alt=&#39;Error 405&#39; src=&#39;/img/2012-09-03-Error.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m pretty sure you&amp;#8217;ve been to &lt;a href=&#39;http://code.msdn.microsoft.com/office&#39;&gt;http://code.msdn.microsoft.com/office&lt;/a&gt; before and seen many SharePoint 2013 examples with the following troubleshooting message.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;405 Recommendation&#39; src=&#39;/img/2012-09-03-405Recommendation.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately after applying the additional verbs to my &lt;code&gt;applicationhost.config&lt;/code&gt; file I still got the same error &lt;code&gt;:(&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For further troubleshooting I&amp;#8217;ve added a new handler &lt;code&gt;StaticHTML&lt;/code&gt; for &lt;code&gt;*.html
 files&lt;/code&gt;, which while leading to the same error at least proved that the new handler with all correctly configured verbs was used by the system.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xml&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt;  ..
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;  &lt;span class=&#39;nt&#39;&gt;&amp;lt;handlers&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     ..
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;add&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticHTML&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;path=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*.html&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;verb=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;GET,HEAD,POST,DEBUG,TRACE&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;modules=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticFileModule&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;resourceType=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;File&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;requireAccess=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Read&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;add&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticFile&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;path=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;verb=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;modules=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticFileModule,DefaultDocumentModule,DirectoryListingModule&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;resourceType=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Either&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;requireAccess=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Read&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;  &lt;span class=&#39;nt&#39;&gt;&amp;lt;/handlers&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#39;New error&#39; src=&#39;/img/2012-09-03-error2.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;After a moment of frustation Google-fu came to the rescue: &lt;a href=&#39;http://www.paraesthesia.com/archive/2011/05/02/when-staticfilehandler-is-not-staticfilehandler.aspx&#39;&gt;this post&lt;/a&gt; talks about some intrinic of the &lt;code&gt;StaticFileHandler&lt;/code&gt; and why static sometimes is not static enough. After following the recommendation of adding an &lt;code&gt;AspNetStaticFileHandler&lt;/code&gt; everything was working as expected.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xml&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt;  ..
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;  &lt;span class=&#39;nt&#39;&gt;&amp;lt;handlers&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     ...
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;add&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;AspNetStaticFileHandler&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;path=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;verb=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;System.Web.StaticFileHandler&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;add&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticHTML&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;path=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*.html&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;verb=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;GET,HEAD,POST,DEBUG,TRACE&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;modules=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticFileModule&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;resourceType=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;File&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;requireAccess=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Read&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;add&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticFile&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;path=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;verb=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;modules=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;StaticFileModule,DefaultDocumentModule,DirectoryListingModule&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;resourceType=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Either&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;requireAccess=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Read&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;  &lt;span class=&#39;nt&#39;&gt;&amp;lt;/handlers&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Finally:&lt;/strong&gt; SharePoint Autohosted App meets Zurb foundation &lt;img alt=&#39;Result&#39; src=&#39;/img/2012-09-03-Result.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 09/09:&lt;/strong&gt; Ready to deploy to Azure? Make sure to add the handlers to web.config otherwise you&amp;#8217;ll be presented with a similiar error 405.0 when trying to launch your app on azure.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Result&#39; src=&#39;/img/2012-09-03-AzureError.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Result&#39; src=&#39;/img/2012-09-03-AzureHandlers.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Result&#39; src=&#39;/img/2012-09-03-DeployToAzure.jpg&#39; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Nappa apps and Chrome Control</title>
   <link href="http://RainerAt.spirit.de/2012/08/28/napa-app-and-chrome-control"/>
   <updated>2012-08-28T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/08/28/napa-app-and-chrome-control/</id>
   <content type="html">&lt;p&gt;Let&amp;#8217;s assume you&amp;#8217;ve&lt;/p&gt;

&lt;p&gt;a) read Ted Pattison&amp;#8217;s blog &lt;a href=&#39;http://blog.tedpattison.net/Lists/Posts/Post.aspx?List=9d54806e-14ca-456d-a62a-b903c9dda841&amp;amp;ID=17&amp;amp;utm_source=twitterfeed&amp;amp;utm_medium=twitter&amp;amp;Web=dbc8a5bc-c0d9-412c-8929-177a045a5351&#39;&gt;My first weekend in Napa&lt;/a&gt; and got Microsoft&amp;#8217;s invite&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But then I think about this new breed of SharePoint developer that Mike Morton described to me. A developer that&amp;#8217;s never never used SharePoint before and has never seen a SharePoint dinosaur like me (except maybe in a museum). This developers has a very high IQ and has tons of experience with things like .NET, C#, JavaScript and jQuery&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;b) seen my &lt;a href=&#39;http://rainerat.spirit.de/2012/08/24/goodbye-ferrari-hello-napa/&#39;&gt;previous post&lt;/a&gt; that turned the OOTB Nappa masterpage template into an easier to handle HTML5 template&lt;/p&gt;

&lt;p&gt;Just to recap. In the template we removed the reference to the masterpage, which is normally responsible to load the chrome for Nappa apps, because we didn&amp;#8217;t like the overhead that comes with it. According to the invite you&amp;#8217;ve never seen SharePoint before (feel free to read on even if you have) and you&amp;#8217;re wondering if you&amp;#8217;re now supposed to turn the minimalistic Nappa template (see below) into something that looks like a SharePoint app on your own.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;First Result&#39; src=&#39;/img/2012-08-24-NapaRestResult.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Don&amp;#8217;t wonder any longer, you don&amp;#8217;t &lt;code&gt;;-)&lt;/code&gt; and even better there are just a few changes necessary. Without the masterpage reference our current Nappa template behaves more like a hosted HTML5 app and for that kind of SharePoint app Microsoft already offers &lt;strong&gt;&lt;a href=&#39;http://msdn.microsoft.com/en-us/library/fp179916(v=office.15).aspx&#39;&gt;the client chrome control&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For the eager of you here are the 5 steps that provide you access to a clean Nappa template that uses &lt;a href=&#39;http://msdn.microsoft.com/en-us/library/fp179916(v=office.15).aspx&#39;&gt;the client chrome control&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create a new Nappa app &lt;img alt=&#39;Create Nappe App&#39; src=&#39;/img/2012-08-28-ChromeControl-New-App.jpg&#39; /&gt; &lt;strong&gt;Step 2:&lt;/strong&gt; Replace default.aspx content with &lt;a href=&#39;https://raw.github.com/gist/3436332/39aa1959e8a39b86509a387c1cba242b9d05e629/SourceDefault.aspx&#39;&gt;this default.aspx content&lt;/a&gt; &lt;img alt=&#39;default.aspx&#39; src=&#39;/img/2012-08-28-ChromeControl-Default-Aspx.jpg&#39; /&gt; &lt;strong&gt;Step 3:&lt;/strong&gt; Replace apps.js content with &lt;a href=&#39;https://raw.github.com/gist/3498247/2fa274af932028e97b6091226f360298670fff4e/app.js&#39;&gt;this app.js content&lt;/a&gt; &lt;img alt=&#39;app.js&#39; src=&#39;/img/2012-08-28-ChromeControl-App-JS.jpg&#39; /&gt; &lt;strong&gt;Step 4:&lt;/strong&gt; Change permission to allow read access to web &lt;img alt=&#39;permissions&#39; src=&#39;/img/2012-08-28-ChromeControl-Permission.jpg&#39; /&gt; &lt;strong&gt;Step 5:&lt;/strong&gt; . Trust the app &lt;img alt=&#39;trust&#39; src=&#39;/img/2012-08-28-ChromeControl-Trust.jpg&#39; /&gt; &lt;strong&gt;Step 6:&lt;/strong&gt; Party time: A clean Nappa App template with client chrome control &lt;img alt=&#39;result&#39; src=&#39;/img/2012-08-28-ChromeControl-Result.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;The chrome configuration is done in the &lt;code&gt;renderChrome()&lt;/code&gt; function and is following the settings in this MSDN &lt;a href=&#39;http://msdn.microsoft.com/en-us/library/fp179916(v=office.15).aspx&#39;&gt;the client chrome control&lt;/a&gt; article. &lt;strong&gt;Please note&lt;/strong&gt; that the MSDN settings assume that you create a couple of additional pages otherwise the links won&amp;#8217;t work.&lt;/p&gt;

&lt;p&gt;One minor issue that I&amp;#8217;ve noticed it that without further modifications the MSDN version might lead to some flash of unstyled content (&lt;a href=&#39;http://en.wikipedia.org/wiki/Flash_of_unstyled_content&#39;&gt;fouc&lt;/a&gt;). One way to prevent that is to change our HTML in default.aspx to &lt;code&gt;&amp;lt;div
id=&amp;quot;message&amp;quot; style=&amp;quot;display: none&amp;quot;&amp;gt;&lt;/code&gt; to hide our message div by default. In our code we then bind to the load event of the dynamically injected stylesheet and leverage &lt;code&gt;$(&amp;#39;#message&amp;#39;).show();&lt;/code&gt; to show the message.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nav&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;UI&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Controls&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Navigation&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;                         &lt;span class=&#39;s2&#39;&gt;&amp;quot;chrome_ctrl_placeholder&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;                         &lt;span class=&#39;nx&#39;&gt;options&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;                   &lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nav&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setVisible&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kc&#39;&gt;true&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;#chromeControl_stylesheet&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;on&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;load&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;event&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;#message&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;show&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With those modification you should have a nice clean starting template for your HTML5 Nappa apps.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s party!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Goodbye Ferrari, hello Napa?</title>
   <link href="http://RainerAt.spirit.de/2012/08/24/goodbye-ferrari-hello-napa"/>
   <updated>2012-08-24T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/08/24/goodbye-ferrari-hello-napa/</id>
   <content type="html">&lt;p&gt;Hey there!&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;ve seen my series about the SharePoint &lt;strong&gt;DVWP&lt;/strong&gt; in &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; mode (&lt;a href=&#39;http://rainerat.spirit.de/2012/07/15/sharepoint-dvwp-from-workhorse-to-ferrari-in-7-steps/&#39;&gt;Part 1&lt;/a&gt;, &lt;a href=&#39;http://rainerat.spirit.de/2012/07/20/the-sharepoint-dvwp-in-ferrari-mode-strikes-again/&#39;&gt;Part 2&lt;/a&gt;, &lt;a href=&#39;http://rainerat.spirit.de/2012/08/01/the-ferrari-meets-jaydata/&#39;&gt;Part 3&lt;/a&gt;) you remember that we ended up with a small HTML5/CSS3/JavaScript app that is running on &lt;a href=&#39;http://www.spirit.de/demos/metro/zurbv3/MetroStyle.aspx&#39;&gt;SP 2010&lt;/a&gt; and &lt;a href=&#39;https://spirit2013preview-public.sharepoint.com/zurbv3/MetroStyle.aspx&#39;&gt;SP 2013&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Today we take some of our lessons learned and try to apply them into the brave new world of SP 2013 apps or to be more precise into the world of Napa apps. &lt;em&gt;Please note&lt;/em&gt; that I&amp;#8217;m not going to cover the whole SharePoint 2013 App Model, but if you want to learn more about it, spend an hour and watch Jeremy Thake&amp;#8217;s &lt;a href=&#39;http://www.made4the.net/archive/2012/08/17/introduction-to-sharepoint-2013-app-model-screencast.aspx&#39;&gt;screencast&lt;/a&gt; about that topic.&lt;/p&gt;

&lt;p&gt;Why should we talk about Napa apps in the first place? One reason is that Napa apps are the lowest hanging fruits in SP2013 development at least in terms of required infrastructure. You don&amp;#8217;t need to setup an on premise SP2013 development environment and you&amp;#8217;re not required to have Visual studio 2012 installed.&lt;/p&gt;

&lt;p&gt;With that said if you want to follow along and haven&amp;#8217;t Napa yet, this &lt;a href=&#39;http://msdn.microsoft.com/en-us/library/fp179924(v=office.15).aspx&#39;&gt;Office 365 Developer&lt;/a&gt; page will get you started.&lt;/p&gt;

&lt;p&gt;Just to get our feet wet let&amp;#8217;s create an OOTB app called &amp;#8216;SharePointApp1&amp;#8217; and run the project without further modification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; Add a new project &lt;img alt=&#39;Napa Development&#39; src=&#39;/img/2012-08-24-NapaDevelopment.jpg&#39; /&gt; &lt;strong&gt;Step 2&lt;/strong&gt; Choose App for SharePoint and give it a name &lt;img alt=&#39;Napa Development&#39; src=&#39;/img/2012-08-24-NapaChooseApp.jpg&#39; /&gt; &lt;strong&gt;Step 3&lt;/strong&gt; Press the Run project button and see how the system is doing its job to package, deploy and launch your app &lt;img alt=&#39;Napa Development&#39; src=&#39;/img/2012-08-24-NapaDistribution.jpg&#39; /&gt; &lt;strong&gt;Step 4&lt;/strong&gt; Be impressed with the results of all your hard work :) &lt;img alt=&#39;Napa Development&#39; src=&#39;/img/2012-08-24-NapaResult.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Take a quick glance at the &lt;a href=&#39;https://gist.github.com/3436301#file_result_default.aspx&#39;&gt;HTML source&lt;/a&gt; of our impressive app. I say impressive because even though the payload is just the User Name it has &lt;strong&gt;644 lines&lt;/strong&gt; of code. The reason is that our small &amp;#8216;payload&amp;#8217; is nicely embedded into SP2013, which comes with a price.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%-- The following 4 lines are ASP.NET directives needed when using SharePoint components --%&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Page Inherits=&amp;quot;Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; MasterPageFile=&amp;quot;~masterurl/default.master&amp;quot; language=&amp;quot;C#&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Register Tagprefix=&amp;quot;SharePoint&amp;quot; Namespace=&amp;quot;Microsoft.SharePoint.WebControls&amp;quot; Assembly=&amp;quot;Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Register Tagprefix=&amp;quot;Utilities&amp;quot; Namespace=&amp;quot;Microsoft.SharePoint.Utilities&amp;quot; Assembly=&amp;quot;Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Register Tagprefix=&amp;quot;WebPartPages&amp;quot; Namespace=&amp;quot;Microsoft.SharePoint.WebPartPages&amp;quot; Assembly=&amp;quot;Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%-- The markup and script in the following Content element will be placed in the &lt;span class=&#39;nt&#39;&gt;&amp;lt;head&amp;gt;&lt;/span&gt; of the page --%&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;asp:Content&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ContentPlaceHolderId=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;PlaceHolderAdditionalPageHead&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;runat=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.2.min.js&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- Add your CSS styles to the following file --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;rel=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;../Content/App.css&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- Add your JavaScript to the following file --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;../Scripts/App.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/asp:Content&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%-- The markup and script in the following Content element will be placed in the &lt;span class=&#39;nt&#39;&gt;&amp;lt;body&amp;gt;&lt;/span&gt; of the page --%&amp;gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;asp:Content&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ContentPlaceHolderId=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;PlaceHolderMain&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;runat=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;p&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;             &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- The following content will be replaced with the user name when you run the app - see App.js --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;             initializing...
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/asp:Content&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Within the &lt;a href=&#39;https://gist.github.com/3436301#file_source_default.aspx&#39;&gt;Source&lt;/a&gt; we see some familiar ASP.NET directives with a link to a masterpage and then two &lt;code&gt;&amp;lt;asp:Content&amp;gt;&lt;/code&gt; blocks.The &lt;code&gt;PlaceHolderAdditionalPageHead&lt;/code&gt; is used to load your app specific CSS and JavaScript. The CSS is of no interest for us at the moment so let&amp;#8217;s take a look at &lt;code&gt;App.js&lt;/code&gt; instead.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;web&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;user&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// This code runs when the DOM is ready. It ensures the SharePoint&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// script file sp.js is loaded and then executes sharePointReady()&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ready&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;SOD&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;executeFunc&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;sp.js&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;SP.ClientContext&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;sharePointReady&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// This function creates a context object which is needed to use the SharePoint object model&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;sharePointReady&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ClientContext&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;get_current&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;web&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;get_web&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;getUserName&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// This function prepares, loads, and then executes a SharePoint query to get the current users information&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;getUserName&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;user&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;web&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;get_currentUser&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;load&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;user&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;executeQueryAsync&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;onGetUserNameSuccess&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;onGetUserNameFail&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// This function is executed if the above call is successful&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// It replaces the contents of the &amp;#39;helloString&amp;#39; element with the user name&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;onGetUserNameSuccess&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;#message&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;text&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;Hello &amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;user&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;get_title&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;());&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;30&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;31&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;32&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// This function is executed if the above call fails&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;33&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;onGetUserNameFail&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sender&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;args&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;34&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;alert&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;Failed to get user name. Error:&amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;args&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;get_message&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;());&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;35&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Beside the fact that the small code leaks more than half a dozen globals, which makes some of us laugh and some of us cry, we see that &lt;code&gt;getUserName()&lt;/code&gt; retrieves the user information from the &lt;code&gt;app web&lt;/code&gt; via CSOM and finally &lt;code&gt;onGetUserNameSuccess()&lt;/code&gt; renders the &lt;code&gt;Hello username&lt;/code&gt; message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint&lt;/strong&gt; So far everything was nice and easy I&amp;#8217;d say and you shouldn&amp;#8217;t have an issue if you follow along.&lt;/p&gt;

&lt;p&gt;Now let&amp;#8217;s switch gears by &lt;strong&gt;first&lt;/strong&gt; getting rid of the SharePoint chrome. Simply copy &lt;a href=&#39;https://gist.github.com/3436332#file_source_default.aspx&#39;&gt;Source2&lt;/a&gt; and replace your existing default.aspx content in Napa. Running the app will show that the &lt;a href=&#39;https://gist.github.com/3436332#file_result_default.aspx&#39;&gt;HTML source2&lt;/a&gt; for the page is down to &lt;strong&gt;18 lines&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By glancing through &lt;a href=&#39;https://gist.github.com/3436332#file_source_default.aspx&#39;&gt;Source2&lt;/a&gt; you see that we are still using some ASP.NET directives, just the reference to the masterpage has gone. In addition the &lt;code&gt;&amp;lt;asp:Content&amp;gt;&lt;/code&gt; blocks have been replaced by some standard HTML5. In &lt;a href=&#39;http://rainerat.spirit.de/2012/07/15/sharepoint-dvwp-from-workhorse-to-ferrari-in-7-steps/&#39;&gt;Part 1&lt;/a&gt; we stripped down the &lt;strong&gt;DVWP&lt;/strong&gt; in a similar manner, so we might call this mode the &lt;strong&gt;&lt;code&gt;Naparari&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;:-)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please note&lt;/em&gt; that at this time the JavaScript won&amp;#8217;t work as some required CSOM files are loaded via the masterpage we just removed.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%-- The following 5 lines are ASP.NET directives needed when using SharePoint components --%&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Page Inherits=&amp;quot;Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; Language=&amp;quot;C#&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Register TagPrefix=&amp;quot;SharePoint&amp;quot; Namespace=&amp;quot;Microsoft.SharePoint.WebControls&amp;quot; Assembly=&amp;quot;Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Import Namespace=&amp;quot;Microsoft.SharePoint&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Register TagPrefix=&amp;quot;Utilities&amp;quot; Namespace=&amp;quot;Microsoft.SharePoint.Utilities&amp;quot; Assembly=&amp;quot;Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;&amp;lt;&lt;/span&gt;%@ Register TagPrefix=&amp;quot;WebPartPages&amp;quot; Namespace=&amp;quot;Microsoft.SharePoint.WebPartPages&amp;quot; Assembly=&amp;quot;Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot; %&amp;gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; &lt;span class=&#39;cp&#39;&gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;SharePoint:ProjectProperty&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;Property=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Title&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;runat=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- Add your CSS styles to the following file --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;rel=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;../Content/App.css&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;         &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- The following content will be replaced with the user name when you run the app - see App.js --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;         initializing...
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.min.js&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;../Scripts/App.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt; let&amp;#8217;s make some modification to app.js.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Goal: In addition to the username we want to retrieve the web title from the &lt;code&gt;host web&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;Goal: Instead of adding the required CSOM files, we are switching to &lt;code&gt;OData&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;Goal: While on it let&amp;#8217;s get rid of the globals &lt;code&gt;;-)&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Napa apps like other SharePoint Apps enforces a clear separation between the &lt;code&gt;host web&lt;/code&gt;, the web where you install your app, and the &lt;code&gt;app web&lt;/code&gt;, the place where your code is actually running.&lt;/p&gt;

&lt;p&gt;As an example take a look at my &lt;code&gt;host web&lt;/code&gt; URL: https://spirit2013preview.sharepoint.com/sites/dev/&lt;/p&gt;

&lt;p&gt;Whenever a Napa app is launched it runs at an &lt;code&gt;app web&lt;/code&gt; URL similiar to&lt;/p&gt;

&lt;p&gt;https://spirit2013preview&lt;strong&gt;-b0204c96e900db&lt;/strong&gt;.sharepoint.com/sites/dev/GoodbyeFerrariHelloNapa/Pages/Default.aspx&lt;/p&gt;

&lt;p&gt;You see that an app specific GUID like &lt;strong&gt;-b0204c96e900db&lt;/strong&gt; is added to the host header, so for our JavaScript code that is running in the &lt;code&gt;app web&lt;/code&gt; there&amp;#8217;s NO way to access information directly in the &lt;code&gt;host web&lt;/code&gt; due to cross site scripting restriction.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s see how our goals can be accomplished in the JavaScript below, which is based on code from &lt;a href=&#39;http://msdn.microsoft.com/en-us/library/fp179927(v=office.15).aspx&#39;&gt;MSDN&lt;/a&gt;. If you&amp;#8217;re not familiar with the cross-domain library &lt;code&gt;SP.RequestExecutor.js&lt;/code&gt; please check it out first.&lt;/p&gt;

&lt;p&gt;Goal 1 and 2: The answer to both goals live in the &lt;code&gt;execCrossDomainRequest()&lt;/code&gt; function. As you can see we are executing a call against the local &lt;code&gt;SPAppWebUrl&lt;/code&gt; &lt;code&gt;/_api/SP.AppContextSite(@target)/&lt;/code&gt; OData endpoint and passing in &lt;code&gt;SPHostUrl&lt;/code&gt; as &lt;code&gt;@target&lt;/code&gt;. Effectivily this will provide us access to the remote &lt;code&gt;SPHostUrl/_api&lt;/code&gt; endpoint (through the cross-domain library).&lt;/p&gt;

&lt;p&gt;Beside the cross-domain library specific you can now use the same OData syntax that you would use locally e.g. here &lt;code&gt;/web?$expand=CurrentUser&lt;/code&gt; is used to retrieve web and at the same time CurrentUser information.&lt;/p&gt;

&lt;p&gt;Goal 3: There&amp;#8217;s more than one way to accomplish that, but to be close to the origal version let&amp;#8217;s wrap our code in an Immediately-Invoked Function Expression &lt;a href=&#39;http://benalman.com/news/2010/11/immediately-invoked-function-expression/&#39;&gt;IIFE&lt;/a&gt;, which you might know as self-executing anonymous function as well.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;getParams&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(),&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;scriptbase&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;SPHostUrl&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;/_layouts/15/&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Load the js file and continue to the&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;//   success event handler.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;getScript&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;scriptbase&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;SP.RequestExecutor.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;execCrossDomainRequest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Function to prepare and issue the request to get&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;//  SharePoint data.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;execCrossDomainRequest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;executor&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;SP&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;RequestExecutor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;SPAppWebUrl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Issue the call against the host web.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// To get the title using REST we can hit the endpoint:&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;//      app_web_url/_api/SP.AppContextSite(@target)/web/title?@target=&amp;#39;siteUrl&amp;#39;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// The response formats the data in the JSON format.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// The functions successHandler and errorHandler attend the&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;//      success and error events respectively.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;executor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;executeAsync&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;url&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;                     &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;SPAppWebUrl&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;                     &lt;span class=&#39;s2&#39;&gt;&amp;quot;/_api/SP.AppContextSite(@target)/web?$expand=CurrentUser&amp;amp;@target=&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt;                     &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;SPHostUrl&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;headers&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;application/json; odata=verbose&amp;quot;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;30&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;success&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;successHandler&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;31&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;error&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;errorHandler&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;32&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;33&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;34&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;35&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;36&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Function to handle the success event.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;37&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Prints the host web&amp;#39;s title to the page.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;38&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;successHandler&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;data&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;39&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;jsonObject&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JSON&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;parse&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;data&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;body&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;40&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;#message&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;html&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;jsonObject&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;CurrentUser&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Title&lt;/span&gt;  &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;41&lt;/span&gt;                     &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;lt;br/&amp;gt;host web: &amp;lt;b&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;jsonObject&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Title&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;lt;/b&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;42&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;43&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;44&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Function to handle the error event.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;45&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Prints the error message to the page.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;46&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;errorHandler&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;data&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;errorCode&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;errorMessage&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;47&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;#message&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;html&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;Could not complete cross-domain call: &amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;errorMessage&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;48&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;49&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;50&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;51&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Returning the params object&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;52&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;getParams&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;53&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;54&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;location&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;search&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;].&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;param&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;55&lt;/span&gt;             &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;param&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;56&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;val&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;decodeURIComponent&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;param&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;57&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;val&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;58&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;59&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;60&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;61&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;62&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After all that hard work here&amp;#8217;s the &lt;strong&gt;Punchline&lt;/strong&gt;:&lt;/p&gt;

&lt;h2 id=&#39;running_the_example_right_away_wont_work&#39;&gt;Running the example right away won&amp;#8217;t work!&lt;/h2&gt;

&lt;p&gt;The reason is that we missed the most important configuration part for SP 2013 apps. Whenever your app requires acccessing information in the &lt;code&gt;host web&lt;/code&gt; you have to configure the appropriate permissions. In addition whenever a site admin installs an app, they have to decide if they trust your app or not.&lt;/p&gt;

&lt;p&gt;It will be interesting to see how this new concept (new to SharePoint, you&amp;#8217;re probably familiar with it from mobile apps) will pay off in the real world.&lt;/p&gt;

&lt;p&gt;For Napa apps there&amp;#8217;s just one additional step required as developer, so let&amp;#8217;s walk trough that process quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; As a developer you have to explicitly ask for permission for your app &lt;img alt=&#39;Napa Development&#39; src=&#39;/img/2012-08-24-NapaPermision.jpg&#39; /&gt; &lt;strong&gt;Step 2&lt;/strong&gt; As site admin you have to trust the app &lt;img alt=&#39;Napa Development&#39; src=&#39;/img/2012-08-24-NapaTrust.jpg&#39; /&gt; &lt;strong&gt;Step 3&lt;/strong&gt; Finally the desired result: No chrome, user name and (Host)web title. &lt;img alt=&#39;Napa Development&#39; src=&#39;/img/2012-08-24-NapaRestResult.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s it for today and I&amp;#8217;m leaving you with this example, which -while visually not as impressive as the first version- under the hood is clean as hell and hopefully well understood &lt;code&gt;;-)&lt;/code&gt;. Take it a starting point for your own Napa apps and let me know how it goes.&lt;/p&gt;

&lt;p&gt;One question though: How do you feel about SP apps and the SP marketplace in general? Are you already sold (can&amp;#8217;t wait for it to open, so that you can get rich) or do you have some concerns compared to traditional farm or sandbox solutions?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The Ferrari meets JayData</title>
   <link href="http://RainerAt.spirit.de/2012/08/01/the-ferrari-meets-jaydata"/>
   <updated>2012-08-01T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/08/01/the-ferrari-meets-jaydata/</id>
   <content type="html">&lt;p&gt;Good morning, good afternoon, good evening to you.&lt;/p&gt;

&lt;p&gt;Welcome back to a new episode in the &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; series. For those of you who remember what I call the &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; read on; all other please make yourself familiar with &lt;a href=&#39;http://rainerat.spirit.de/2012/07/15/sharepoint-dvwp-from-workhorse-to-ferrari-in-7-steps/&#39;&gt;Part 1&lt;/a&gt; and &lt;a href=&#39;http://rainerat.spirit.de/2012/07/20/the-sharepoint-dvwp-in-ferrari-mode-strikes-again/&#39;&gt;Part 2&lt;/a&gt; in this series before moving on.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&#39;http://rainerat.spirit.de/2012/07/20/the-sharepoint-dvwp-in-ferrari-mode-strikes-again/&#39;&gt;Part 2&lt;/a&gt; we ended up with a HTML5 app that shows a nice metro style tile view of SharePoint lists and libraries. This time we want to enhance the solutions so that it retrieves items through SharePoint&amp;#8217;s OData service. Sorry SP2007 we&amp;#8217;ve to leave you behind as this service was first introduced in SP2010. Don&amp;#8217;t worry too much though; using REST is forward thinking as SP2013 will expose a whole new &lt;a href=&#39;http://msdn.microsoft.com/en-us/library/fp142385(v=office.15).aspx&#39;&gt;REST API&lt;/a&gt; that will greatly expanding the existing capabilities.&lt;/p&gt;

&lt;p&gt;In the simplest form you could make &lt;code&gt;XHR&lt;/code&gt; calls to the service endpoint at &lt;code&gt;_vti_bin/listdata.svc&lt;/code&gt;, but we&amp;#8217;re not going down that route. Instead we&amp;#8217;re using &lt;a href=&#39;http://jaydata.org&#39;&gt;JayData&lt;/a&gt; for doing the heavy lifting. While being relatively new to the market JayData brings an astonishing range of capabilities to the table, one of them is the abstracting of underlying storage provider. Yes, you heard me right; OData is just one of the supported storage provider, see &lt;a href=&#39;http://jaydata.org/providers&#39;&gt;JayData provider&lt;/a&gt; for a full list. Once you learned a little bit about &lt;a href=&#39;http://jaydata.org/blog/javascript-language-query-jslq-101&#39;&gt;JSLQ&lt;/a&gt; the JavaScript Query Language you will (probably) never go back talking to any storage provider on your own.&lt;/p&gt;

&lt;p&gt;After settling on &lt;a href=&#39;http://jaydata.org&#39;&gt;JayData&lt;/a&gt; the next choice is about a client framework that helps us building our dynamic UI. JayData comes with a bunch of modules that offers integration into various third party frameworks and &lt;code&gt;knockout&lt;/code&gt; is one of them. &lt;em&gt;A word of warning&lt;/em&gt; take everything that you see me doing with &lt;code&gt;knockout&lt;/code&gt; with some grain of salt, as I haven&amp;#8217;t worked with it before. The last piece of software that I want to bring to the table is of course RequireJS. We are going to build a JavaScript app and based on my experience there&amp;#8217;s simply no way of writing one without it.&lt;/p&gt;

&lt;p&gt;So without further hassle we are now going to build a pretty straight forward three tier navigation, which BTW will align us nicely with the Metro-style design guides; and nah, we won&amp;#8217;t do Metro style left &amp;lt;-&amp;gt; right scrolling, this is still a web app not Window 8 Metro ;-). For the eager of you here are the links to the live demos:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;http://www.spirit.de/demos/metro/zurbv3/MetroStyle.aspx&#39;&gt;Live on SP 2010&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://spirit2013preview-public.sharepoint.com/zurbv3/MetroStyle.aspx&#39;&gt;Live on SP 2013&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First tier:&lt;/strong&gt; Entry screen consists of a Tile View (green) and a Login View (yellow). The whole page can be served anonymously, but in order to see the next tier you&amp;#8217;ve to log on. You probably heard me saying that before &amp;#8220;SharePoint OData service won&amp;#8217;t work anonymously&amp;#8221;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Tile View&#39; src=&#39;/img/2012-08-01-TileView.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;The following HTML is used as by Knockout to produce the Tile View.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;row&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;tileVM&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;twelve columns tiles&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;foreach: TileData, updateTilesOnce: true&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;live-tile&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-stops=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-speed=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;750&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-delay=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;              &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;class: color + &amp;#39; &amp;#39; + size,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;                        attr: {&amp;#39;data-mode&amp;#39;: mode ? mode : &amp;#39;&amp;#39;, &amp;#39;data-direction&amp;#39;: direction} ,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;                        click: $root.goToDetail&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;tile-title&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text: title&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;badge&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text: count&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;                 &lt;span class=&#39;nt&#39;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;micon&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;attr: {src: icon}&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;                 &lt;span class=&#39;nt&#39;&gt;&amp;lt;h3&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text: backTitle&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;                 &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;prettyDate&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;attr: {title: prettyDate}&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here&amp;#8217;s the &lt;code&gt;TileViewModel&lt;/code&gt; as RequireJS module leveraging the revealing module pattern. I&amp;#8217;ve seen John Papa &lt;a href=&#39;http://johnpapa.net/spapost2&#39;&gt;mentioning this pattern&lt;/a&gt; more than once. BTW feel free to provide feedback about your favorite way to structure knockout apps.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;([&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;knockout&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;helper&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;fn&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;s2&#39;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// ko observables&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;observable&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;().&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;subscribeTo&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;userId&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;selectedList&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;observable&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;().&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;subscribeTo&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;selectedList&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;TileData&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;observableArray&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;([]),&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// functions&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;goToDetail&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// end of var declaration&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;goToDetail&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;tile&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;event&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;!==&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;anonymous&amp;#39;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;selectedList&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;fn&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;cleanup&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;tile&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;location&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;hash&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;/view/&amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;selectedList&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;alert&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39; Make sure to log on.&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Bootstrap&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;TileData&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;tilesData&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;tiles&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;tile&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Return public methods&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;30&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;31&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;32&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;TileData&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;TileData&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;33&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;goToDetail&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;goToDetail&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;34&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;35&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;36&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Our trusted DVWP produces the required &lt;code&gt;app.tilesData.tiles.tile&lt;/code&gt; array that is used to bootstrap the &lt;code&gt;TileData&lt;/code&gt; observableArray. I&amp;#8217;m not going to cover the required XSLT here as this is just a variation what we did in &lt;a href=&#39;http://rainerat.spirit.de/2012/07/20/the-sharepoint-dvwp-in-ferrari-mode-strikes-again/&#39;&gt;Part 2&lt;/a&gt;, but if you want to deep dive again take a look at this gist &lt;a href=&#39;https://gist.github
.com/3227125#L150&#39;&gt;DVWP&amp;#8217;s settings and XSLT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the HTML for the login area and the related LogonViewModel.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt;  &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;logonVM&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;visible: userId() !== &amp;#39;anonymous&amp;#39; &amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;style=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;display: none;&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         You&amp;#39;re logged on as: &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;success label&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text: userId&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;visible: userId() === &amp;#39;anonymous&amp;#39; &amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;style=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;display: none;&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-bind=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;attr: {href: loginURL}&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt; Sign
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;             in&lt;span class=&#39;nt&#39;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;         with username: &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;secondary label&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;ODataDemo&lt;span class=&#39;nt&#39;&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; password: &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;secondary label&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;OData!Demo&lt;span class=&#39;nt&#39;&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;([&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;knockout&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;s2&#39;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;observable&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;configMap&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;publishOn&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;userId&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;loginURL&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;loginURL&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;computed&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;../_layouts/Authenticate.aspx?Source=&amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;encodeURIComponent&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;location&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;pathname&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;location&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;hash&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Return public methods&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;loginURL&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;loginURL&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Second tier:&lt;/strong&gt; The Login View (yellow) will show your username once you&amp;#8217;re logged in and by clicking on one of the tiles you&amp;#8217;ll see 10 items of the chosen list or library. Bear in mind that this is a demo, but adding paging, sorting and filtering per data source &lt;strong&gt;in the UI&lt;/strong&gt; would be a pretty straight forward as they are already implemented in the ListingViewModel.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Listing View&#39; src=&#39;/img/2012-08-01-ListingView.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third tier:&lt;/strong&gt; By clicking on one of the level 2 tiles you&amp;#8217;ll see the full detail information on the right. One of the benefits of working with OData is that is allows you to get multiple related information in single call, which greatly simplifies your life as client side app developer.&lt;/p&gt;

&lt;p&gt;From the &lt;a href=&#39;http://www.odata.org/documentation/uri-conventions/#ExpandSystemQueryOption&#39;&gt;OData website&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A URI with a $expand System Query Option indicates that Entries associated with the Entry or Collection of Entries identified by the Resource Path section of the URI must be represented inline (i.e. eagerly loaded). For example, if you want to identify a category and its products, you could use two URIs (and execute two requests), one for /Categories(1) and one for /Categories(1)/Products. The &amp;#8216;$expand&amp;#8217; option allows you to identify related Entries with a single URI such that a graph of Entries could be retrieved with a single HTTP request.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img alt=&#39;Detail View&#39; src=&#39;/img/2012-08-01-DetailView.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;For this demo I haven&amp;#8217;t separated the Listing and the Detail view and the Detail view is just an un-styled list of properties for the current item. For a larger application it would probably make sense to separate the views and work the detail view a little bit out &lt;code&gt;;-)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To see the full html and JS that is involved take a look at &lt;a href=&#39;https://gist.github.com/3227125&#39;&gt;this gist&lt;/a&gt;, I&amp;#8217;m going to concentrate on the parts that deal with the JayData configuration here.&lt;/p&gt;

&lt;p&gt;But before we can do that, we need to take quick look how all the various VMs are integrated by RequireJS. As in almost every standard RequireJS app there&amp;#8217;s a &lt;code&gt;main.js&lt;/code&gt; file that allows you to configure various aspects and then kick off your app.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;require&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;config&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;    &lt;span class=&#39;c1&#39;&gt;//By default load any module IDs from js/lib&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;baseUrl&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;libs&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;paths&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;        &lt;span class=&#39;c1&#39;&gt;// Try loading from CDN first&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;        &lt;span class=&#39;p&#39;&gt;...&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;require&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;([&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;app&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// we can safely kick of the app even before document.ready&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;init&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Within app.js we define dependencies on the various VMs that you&amp;#8217;ve seen earlier and within the &lt;code&gt;init&lt;/code&gt; method we use &lt;code&gt;ko.applyBindings()&lt;/code&gt; to bind them to the corresponding element in the DOM. As said I&amp;#8217;m new to knockout, so I leave it to the experts if that&amp;#8217;s a recommend pattern or not. At least it&amp;#8217;s working, so it can&amp;#8217;t be totally wrong ;-). Path.js is used as a light alternative to sammy.js in order to setup some URL rules. As you can see Ryan Niemeyer&amp;#8217;s excellent &lt;a href=&#39;http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html&#39;&gt;postbox&lt;/a&gt; -a native ko pubsub sytem- is used to notify subscribers whenever changes occur.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;([&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;knockout&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;LogonVM&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;TileVM&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;ListingVM&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;postbox&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;appData&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;kocBH&amp;#39;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;],&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;LogonVM&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;TileVM&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ListingVM&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;postbox&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         &lt;span class=&#39;s2&#39;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;init&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;             &lt;span class=&#39;c1&#39;&gt;// Exposing ko as global&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;nb&#39;&gt;window&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;window&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;||&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;             &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$tileContainer&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;#tileVM&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;             &lt;span class=&#39;c1&#39;&gt;// Configuring JayData to use current site&amp;#39;s Odata service&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;MetroStyleDataContext&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;({&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;name&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;oData&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;oDataServiceHost&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;../_vti_bin/listdata.svc&amp;#39;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;             &lt;span class=&#39;c1&#39;&gt;// binding ko to the appropriate container&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;applyBindings&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;TileVM&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(),&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;getElementById&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;tileVM&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;applyBindings&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;LogonVM&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(),&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;getElementById&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;logonVM&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;applyBindings&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ListingVM&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(),&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;getElementById&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;listingVM&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;             &lt;span class=&#39;c1&#39;&gt;// Client-side routes. Path exposed as global via shim configuration&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;             &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;toggleTiles&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;                 &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;isVisible&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$tileContainer&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;css&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;display&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;block&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;isVisible&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$tileContainer&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;slideUp&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;300&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$tileContainer&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;slideDown&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;300&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;Path&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;#/view/:list&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;to&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;postbox&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;publish&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;selectedList&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;}).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;enter&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toggleTiles&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;Path&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;(#)&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;to&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;30&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;postbox&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;publish&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;selectedList&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;31&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;}).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;enter&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toggleTiles&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;32&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;33&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;Path&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;listen&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;34&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;35&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;36&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;37&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;init&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;init&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;38&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;39&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;40&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Boy, Rainer! All those talk about RequireJS and knockout basics. I&amp;#8217;m already familiar with it, so where&amp;#8217;s the beef? You promised to tell us about JayData, didn&amp;#8217;t you?&lt;/p&gt;

&lt;p&gt;Yes I did and here you go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: Retrieving ListingView date via OData service.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt;  &lt;span class=&#39;nx&#39;&gt;postbox&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;subscribe&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;selectedList&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;newValue&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;configMap&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;userId&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;anonymous&amp;#39;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;alert&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;Make sure to log on.&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;newValue&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;!==&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Clean out existing itemDetail&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;itemDetail&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;([]);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;base&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;newValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;_&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;extend&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;({},&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;base&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;sortExp&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;it.&amp;#39;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;orderBy&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;orderAsc&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;_&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;extend&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;orderBy&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sortExp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;_&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;extend&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;orderByDescending&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sortExp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;_&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;each&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;includeArray&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(),&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;inc&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;_&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;extend&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;include&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;inc&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;myBase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;chooseMap&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;newValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;))&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;take&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;take&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;())&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toArray&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;allItems&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Clean out existing allItems&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;allItems&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;([]);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Clean out existing itemDetail&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;itemDetail&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;([]);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;30&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;31&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Within ListingViewModel.js you find the above &lt;code&gt;postbox.subscriber&lt;/code&gt; that listen to any change in the &lt;code&gt;selectedList&lt;/code&gt; channel. After checking if there&amp;#8217;s a non empty value and that the user is already logged in &lt;a href=&#39;http://jaydata.org&#39;&gt;JayData&lt;/a&gt; takes over.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;app.context&lt;/code&gt; knows about all lists and libraries, so here we use &lt;code&gt;base&lt;/code&gt; to select a specific one &lt;code&gt;var base = app.context[newValue]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;code&gt;orderBy()&lt;/code&gt; or &lt;code&gt;orderByDescending()&lt;/code&gt; are using the default sorting criteria . This can be modified during runtime by updating the &lt;code&gt;OrderAsc&lt;/code&gt; and &lt;code&gt;OrderBy&lt;/code&gt; observables.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;code&gt;include()&lt;/code&gt; in OData terms maps to the OData &lt;code&gt;$expand&lt;/code&gt; verb. Default settings here are &lt;code&gt;CreatedBy&lt;/code&gt; and &lt;code&gt;ModifiedBy&lt;/code&gt;. There&amp;#8217;s a &lt;code&gt;includeArray()&lt;/code&gt; observabelArray that is used to store the ones you&amp;#8217;re interested in.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;code&gt;map()&lt;/code&gt; mapping or projection is another important feature that allows you to select specific fields instead of retrieving all information. The &lt;a href=&#39;https://gist.github.com/3237820#L43&#39;&gt;&lt;code&gt;chooseMap()&lt;/code&gt; method&lt;/a&gt; is used to retrieve a small set of fields based on their availability e.g. &lt;code&gt;Title&lt;/code&gt; vs. &lt;code&gt;Name&lt;/code&gt; vs &lt;code&gt;URL&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;code&gt;take()&lt;/code&gt; allows you to restrict the number of items returned by the system. Again a observable is used to store the default.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;code&gt;toArray()&lt;/code&gt; and finally this method is used to update the &lt;code&gt;allItems&lt;/code&gt; observableArray. For those of you that are curious how that works under the cover, take a look at the &lt;a href=&#39;http://jaydata
.org/blog/how-to-use-jaydata-with-knockoutjs&#39;&gt;following blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: Retrieving the Detail View data for a selected item.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt;  &lt;span class=&#39;nx&#39;&gt;showDetails&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;currItem&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;currentList&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;selectedList&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;app&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;currentList&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;single&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Id&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Id&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Id&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;currItem&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Id&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;             &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[];&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;_&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;each&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toJSON&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(),&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;val&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;key&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;val&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;val&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;itemDetail&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;([]);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;ko&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;utils&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;arrayPushAll&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;itemDetail&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(),&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;itemDetail&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;valueHasMutated&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Come on, that&amp;#8217;s almost too easy isn&amp;#8217;t it? This time we&amp;#8217;re using &lt;a href=&#39;http://jaydata.org/blog/javascript-language-query-jslq-101&#39;&gt;JSLQ&lt;/a&gt;`s &lt;code&gt;.single&lt;/code&gt; method to retrieve ONE item based on a unique criteria, here the &lt;code&gt;currItem.Id&lt;/code&gt;. Whenever the system returns the information it&amp;#8217;s converted to JSON. Underscore&amp;#8217;s &lt;code&gt;each&lt;/code&gt; method allows us to push the returned key/value pairs into the keyValue array. Whenever done we use &lt;code&gt;ko.utils.arrayPushAll&lt;/code&gt; to update the &lt;code&gt;itemDetails()&lt;/code&gt; observable and &lt;code&gt;valueHasMutated()&lt;/code&gt; to notify it about the changes.&lt;/p&gt;

&lt;p&gt;As you can see, we haven&amp;#8217;t dealt a bit with the native OData protocol and when you take a look at what&amp;#8217;s going over the wire you&amp;#8217;ll be surprised how complex it can get. But luckily that is of no concern for us any longer as we only have to deal with &lt;a href=&#39;http://jaydata.org/blog/javascript-language-query-jslq-101&#39;&gt;JSLQ&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s it for today, but before you ask I wanna cover two questions that I feel coming up:&lt;/p&gt;

&lt;p&gt;Would you choose JayData for another project?&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s a clear YES. JayData is something that&amp;#8217;s better than sliced bread. Luckily it&amp;#8217;s already invented.&lt;/p&gt;

&lt;p&gt;Would you choose knockout for another project?&lt;/p&gt;

&lt;p&gt;Yes&amp;#8230; most likely. After reading some of the stuff over at the &lt;a href=&#39;http://knockoutjs.com/&#39;&gt;knockout site&lt;/a&gt; itself, but more important over at &lt;a href=&#39;http://www.knockmeout.net/&#39;&gt;Ryan Niemeyer&amp;#8217;s blog&lt;/a&gt;, I found it pretty straight forward to work with. By being the only overall framework that JayData supports as module at the moment, it&amp;#8217;s the natural choice for the time being. With that said, there are already Sencha and Titanium modules out there, so maybe there&amp;#8217;s a JayData backbone module one day&amp;#8230; at that point feel free to ask me that question again.&lt;/p&gt;

&lt;p&gt;One last thing, you can find the code for the 2010 demo site on &lt;a href=&#39;https://github
.com/RainerAtSpirit/FerrariMeetsJayData&#39;&gt;github&lt;/a&gt;. You have to update the appdata.js in order to work in your environment. Checkout &lt;a href=&#39;http://localhost:4000/2012/07/13/metro-javascript-app---strongly-typed/&#39;&gt;this post&lt;/a&gt; that guides you through the required steps with &lt;code&gt;JaySvcUtil&lt;/code&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The SharePoint DVWP in Ferrari mode strikes again</title>
   <link href="http://RainerAt.spirit.de/2012/07/20/the-sharepoint-dvwp-in-ferrari-mode-strikes-again"/>
   <updated>2012-07-20T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/07/20/the-sharepoint-dvwp-in-ferrari-mode-strikes-again/</id>
   <content type="html">&lt;p&gt;In the &lt;a href=&#39;/2012/07/15/sharepoint-dvwp-from-workhorse-to-ferrari-in-7-steps/&#39;&gt;last post&lt;/a&gt; we dissected the SharePoint DVWP up till the point where it delivered &lt;strong&gt;clean HTML5&lt;/strong&gt;. If you remember I call this mode the &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt;. Now the bad news: For those who like to cut things down to the bare bones, that&amp;#8217;s it. You can&amp;#8217;t dissect the &lt;strong&gt;DVWP&lt;/strong&gt; any further.&lt;/p&gt;

&lt;p&gt;Now the good news: For those who think that this would be great starting point to build something new, read on. In this post I&amp;#8217;m going to show you my way of driving the &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt;. Of course this is not the only way, so feel free to do something completely different&amp;#8230; and give me your success stories.&lt;/p&gt;

&lt;p&gt;First let&amp;#8217;s ask ourselves some question:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What are we going to build?&lt;/li&gt;

&lt;li&gt;Which technologies are we going to use?&lt;/li&gt;

&lt;li&gt;How to effectively use our &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; in that scenario?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Answer to Q1:&lt;/strong&gt; Let&amp;#8217;s build a new version of the &lt;a href=&#39;http://www.metaengine.com/2012/03/SharePoint-menu-web-part-with-Metro-style-using-a-DVWP&#39;&gt;Metro style menu web part&lt;/a&gt;, that was initially build by &lt;a href=&#39;https://plus.google.com/107337505738738118800/posts&#39;&gt;Peter Collins&lt;/a&gt;. Hey Rainer, why would you do that? It&amp;#8217;s already build, isn&amp;#8217;t it? Yeah, you&amp;#8217;re right, but we are going to add some visual effects and some configuration options to the picture, which wasn&amp;#8217;t in the first version. Simply think of our version as V2.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer to Q2:&lt;/strong&gt; A &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; needs to be driven in adequate places like the N&amp;#252;rburgring &lt;a href=&#39;http://www.nuerburgring.de/&#39;&gt;in Germany&lt;/a&gt;, so let&amp;#8217;s try to find a technology stack that can cope with that ideal &lt;code&gt;;-)&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&#39;technologies&#39;&gt;Technologies:&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Accessing SharePoint data: &lt;a href=&#39;http://rainerat.spirit.de/2012/07/15/sharepoint-dvwp-from-workhorse-to-ferrari-in-7-steps/&#39;&gt;DVWP in ferrari mode&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Providing a modern HTML5/CSS3/JavaScript Framework &lt;a href=&#39;http://foundation.zurb.com/&#39;&gt;Zurb Foundation 3&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Metro styled live tiles by Drew Greenwell &lt;a href=&#39;http://drewgreenwell.com/projects/metrojs&#39;&gt;MetroJS&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Alternative for SergoiUI (the metro font) &lt;a href=&#39;http://www.google.com/webfonts#UsePlace:use/Collection:Open+Sans+Condensed&#39;&gt;Open Sans Condensed&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Metro like icons by IconShock &lt;a href=&#39;http://www.iconshock.com/windows8-icons/&#39;&gt;Free Metro Icons&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The reasoning behind each selection is simple: I like them. I know that there are alternatives at each level, but as said earlier it&amp;#8217;s your decision entirely&amp;#8230; when you build your solution. Now without further hesitation lets present two screenshots of the live demo. Thanks to some feedback I got on twitter from &lt;a href=&#39;https://twitter.com/sympmarc&#39;&gt;Marc D Anderson&lt;/a&gt; the second screenshot shows an optimized version for iPhones.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Empty ASPX Page&#39; src=&#39;/img/2012-07-20-dvwp-result.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Empty ASPX Page&#39; src=&#39;/img/2012-07-20-dvwp-iPhone.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/ZurbMeetsMetroJS/blob/master/MetroStyle.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/metro/Zurb/MetroStyle.aspx&#39;&gt;Live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I encourage you to take a look at the live version first to see the live tiles in action. All kudos to Drew Greenwell&amp;#8217;s &lt;a href=&#39;http://drewgreenwell.com/projects/metrojs&#39;&gt;MetroJS&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;Now let&amp;#8217;s dive a little deeper into the code by looking at the &lt;a href=&#39;https://github.com/RainerAtSpirit/ZurbMeetsMetroJS/blob/master/MetroStyle.aspx&#39;&gt;Source&lt;/a&gt;. As you can see it&amp;#8217;s almost the same minimal HTML5 that was introduced last time, enhanced by the files required by &lt;a href=&#39;http://foundation.zurb.com/&#39;&gt;Zurb Foundation 3&lt;/a&gt; and &lt;a href=&#39;http://drewgreenwell.com/projects/metrojs&#39;&gt;MetroJS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Somewhere in the middle you see this div &lt;code&gt;&amp;lt;div id=&amp;quot;metroTiles&amp;quot;&amp;gt;...&amp;lt;/div&amp;gt;&lt;/code&gt;, where the &lt;strong&gt;DVWP&lt;/strong&gt; is instantiated. If you are looking very closely, you spot some differences from where we left it last time. This time the web part properties are stripped down to the bare minimum and by using &lt;code&gt;&amp;lt;XslLink&amp;gt;XSLT/ListsAsTiles.xslt&amp;lt;/XslLink&amp;gt;&lt;/code&gt; we are allowed to store the XSLT in an external file. As in the Peter Collin&amp;#8217;s version the DataSourceMode is set to &lt;code&gt;ListOfLists&lt;/code&gt; in which the server returns information about all lists/libraries of the current site.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;metroTiles&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;twelve columns tiles&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;         &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- DVWP with DataSourceMode=&amp;quot;ListOfLists&amp;quot; --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;WebPartPages:DataFormWebPart&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;runat=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;AsyncRefresh=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;False&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;FrameType=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;None&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;SuppressWebPartChrome=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;ParameterBindings&amp;gt;&amp;lt;/ParameterBindings&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;DataFields&amp;gt;&amp;lt;/DataFields&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;XslLink&amp;gt;&lt;/span&gt;XSLT/ListsAsTiles.xslt&lt;span class=&#39;nt&#39;&gt;&amp;lt;/XslLink&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;Xsl&amp;gt;&amp;lt;/Xsl&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;DataSources&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;                 &lt;span class=&#39;nt&#39;&gt;&amp;lt;SharePoint:SPDataSource&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;runat=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;DataSourceMode=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;ListOfLists&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;SelectCommand=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;                                          &lt;span class=&#39;na&#39;&gt;ID=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;dsLists&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/SharePoint:SPDataSource&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;/DataSources&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;/WebPartPages:DataFormWebPart&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;         &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- DVWP with DataSourceMode=&amp;quot;ListOfLists&amp;quot; --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I&amp;#8217;m not going to talk about the &lt;a href=&#39;http://foundation.zurb.com/&#39;&gt;Zurb Foundation 3&lt;/a&gt; specific configurations here (sass and compass based), but from my first impression I can say at least so much: &amp;#8221;&lt;strong&gt;It&amp;#8217;s hot! Real hot!&lt;/strong&gt;&amp;#8221;. A quantum leap compared to other prominent HTML5 frameworks. Don&amp;#8217;t take my word on it, check it out on your own and let me know what you think.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer to Q3:&lt;/strong&gt; This one is pretty short: Know your &lt;strong&gt;XSLT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint:&lt;/strong&gt; Up till now you should have a rough understanding how the various pieces of the solution fits together. While it&amp;#8217;s certainly not rocket science it&amp;#8217;s nothing for beginners either. But now we are coming to the heart of the solution. We have to fine tune the &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt;, so that it can deliver its best performance. You asked for it, so here it is:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A word of warning&lt;/em&gt;: I don&amp;#8217;t want to waste your time, so there&amp;#8217;s no need to read on, if you most likely never work with XSLT at all.&lt;/p&gt;

&lt;h3 id=&#39;xslt_deep_dive&#39;&gt;XSLT deep dive&lt;/h3&gt;

&lt;p&gt;XSLT might not be everybody&amp;#8217;s darling, but let&amp;#8217;s face it, you can do a lot of smart things in SharePoint with it that otherwise would require either third party tools or custom .Net development.&lt;/p&gt;

&lt;p&gt;You have access to the complete XSLT at &lt;a href=&#39;https://github
.com/RainerAtSpirit/ZurbMeetsMetroJS/blob/master/XSLT/ListsAsTiles.xslt&#39;&gt;github&lt;/a&gt; and I&amp;#8217;m going to provide some background information about the various pieces below. Of course that code only reflects my coding style. If you pick up one or another XSLT trick that you find useful, good. If not, there&amp;#8217;s certainly more than one way to skin a cat, so I&amp;#8217;d glad to hear from you about you&amp;#8217;re tackling things instead.&lt;/p&gt;

&lt;p&gt;BTW before you ask: My favorite book ever on that topic is Jenni Tennison&amp;#8217;s &lt;a href=&#39;http://www
.amazon.com/XSLT-XPath-Unlimited-Professional-Mindware/dp/0764547763&#39;&gt;XSLT and XPath On the edge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With that here&amp;#8217;s what makes the &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; engine tick. After the usual &lt;code&gt;&amp;lt;xsl:stylesheet ..&amp;gt;&lt;/code&gt; declaration we start by defining a &lt;code&gt;$Rows&lt;/code&gt; variable. It&amp;#8217;s used to filter out list/libaries that you don&amp;#8217;t want to render e.g. like those with &lt;code&gt;(@__spHidden = &amp;#39;True&amp;#39;&lt;/code&gt; and &amp;#8230;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Rows&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/dsQueryResponse/Rows/Row[not(@__spHidden = &amp;#39;True&amp;#39;) and not(contains&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;(@__spDefaultViewUrl, &amp;#39;_catalogs&amp;#39;)) and @__spTitle != &amp;#39;ServiceFiles&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;One goal for the solution was to make it configurable. One of the easiest way to accomplish that is by defining a variable and access it via &lt;code&gt;msxsl:node-set($VariableName)&lt;/code&gt;. Here I&amp;#8217;m using the &lt;code&gt;global&lt;/code&gt; element to store global configuration options and &lt;code&gt;tiles&lt;/code&gt; to store configuration options based on the &lt;code&gt;BaseTemplate&lt;/code&gt; e.g. Contacts, DocumentLibrary and so on. As you can see there are options for color and icon, which control the visual appearance, but also options like &lt;code&gt;data-mode&lt;/code&gt; and &lt;code&gt;data-direction&lt;/code&gt; that will be used by &lt;a href=&#39;http://drewgreenwell.com/projects/metrojs&#39;&gt;MetroJS&lt;/a&gt; to provide the slide and flip animations.&lt;/p&gt;

&lt;p&gt;In a fully fledged solution you&amp;#8217;d store those somewhere externally and then bring them in either via &lt;em&gt;Linked Data source&lt;/em&gt;, cookies, querystrings etc.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- configMap allows configuration per BaseTemplate --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;configMap&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;global&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;maxTiles&amp;gt;&lt;/span&gt;12&lt;span class=&#39;nt&#39;&gt;&amp;lt;/maxTiles&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;wideTiles&amp;gt;&lt;/span&gt;3&lt;span class=&#39;nt&#39;&gt;&amp;lt;/wideTiles&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;backTileTitle&amp;gt;&lt;/span&gt;Last updated&lt;span class=&#39;nt&#39;&gt;&amp;lt;/backTileTitle&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/global&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;tiles&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Contacts&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;lime&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/bomb.png&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;DocumentLibrary&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;teal&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/file.png&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-mode=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;slide&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;               &lt;span class=&#39;na&#39;&gt;data-direction=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;GenericList&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;green&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/inventory2.png&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-mode=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;flip&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;               &lt;span class=&#39;na&#39;&gt;data-direction=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Tasks&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;red&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/bomb.png&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-mode=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;flip&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;               &lt;span class=&#39;na&#39;&gt;data-direction=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;horizontal&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;GanttTasks&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;purple&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/hand_thumbsup.png&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;IssueTracking&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;pink&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/clipboard.png&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-mode=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;slide&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;               &lt;span class=&#39;na&#39;&gt;data-direction=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Links&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;lime&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/link.png&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;WebPageLibrary&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;brown&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/clipboard.png&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Events&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;mango&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/clipboard.png&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;BaseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;unknown&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;color=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;blue&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;icon=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;images/48/smiley_sad.png&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/tiles&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:variable&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt; &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- shortcuts to globalConfig and tilesConfig --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;globalConfig&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;msxsl:node-set($configMap)/global&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;tilesConfig&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;msxsl:node-set($configMap)/tiles&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The next variable &lt;code&gt;$itemInList&lt;/code&gt; stores a result set that it sorted descending by &lt;code&gt;@__spItemCount&lt;/code&gt;. This in combination with &lt;code&gt;$globalConfig/wideTiles&lt;/code&gt; will be used to show wide tiles based on the number of items in a given list or library e.g. $wideTiles = 3 would show the 3 lists with the most items as wide tile.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- itemsInList sorted by @__spItemCount descending. Used to distinguish between normal and wide tiles  --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;itemsInList&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:for-each&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$Rows&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:sort&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;@__spItemCount&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;order=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;descending&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;number&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;item&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{@__spID}&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;count=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{@__spItemCount}&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;pos=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{position()}&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:for-each&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:variable&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;The above variables are all globally defined, so they can be accessed throughout the code in every template. Next comes the root template and you can see that the result set is sorted by a &lt;em&gt;heavy&lt;/em&gt; &lt;strong&gt;XPath&lt;/strong&gt; expression. All we want to do here is having the lists/libraries sorted by the time they were last modified, but unfortunately the system buries the only reliable UTC date somewhere down in the &lt;code&gt;@__spPropertiesXml&lt;/code&gt; attribute. I leave it up to you to digest this XPath and figure out what it&amp;#8217;s exactly doing.&lt;/p&gt;

&lt;p&gt;By checking &lt;code&gt;&amp;lt;xsl:if test=&amp;quot;position() &amp;amp;lt;= $globalConfig/maxTiles&amp;quot;&amp;gt;&lt;/code&gt; before we call the &lt;code&gt;Tile&lt;/code&gt; template we restrict the number of rendered tiles to whatever is configured, nothing fancy here.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;match=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:for-each&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$Rows&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- This complex sort criteria is required because __spModified is localized. Using information inside __spPropertiesXml instead --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:sort&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;                 &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;translate(substring-before(substring-after(@__spPropertiesXml, &amp;#39;Modified=&amp;amp;quot;&amp;#39;), &amp;#39;&amp;amp;quot; LastDeleted&amp;#39;), &amp;#39; :&amp;#39;, &amp;#39;&amp;#39;)&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;                 &lt;span class=&#39;na&#39;&gt;order=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;descending&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;number&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:if&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;test=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;position() &amp;amp;lt;= $globalConfig/maxTiles&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:call-template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Tile&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:if&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:for-each&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;Tile&lt;/code&gt; template is responsible for building up the tile html, but as you can see this is divided into multiple separate templates. I simply follow common sense here that mixing structure and logic will become unmaintainable very soon. So we build up a helper variable &lt;code&gt;$t&lt;/code&gt; using the &lt;code&gt;MetaData&lt;/code&gt; template (logic), which is passed to the &lt;code&gt;TileTemplate&lt;/code&gt; (html). Think of this template as your dispenser: logic -&amp;gt; left, structure -&amp;gt;right.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Tile&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- Mashup of $configMap and $ itemsInList for the current item --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;coreMetaData&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:call-template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;MetaData&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:with-param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;baseTemplate&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;@__spBaseTemplate&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:with-param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;spID&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;@__spID&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:with-param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;spPropertiesXml&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;@__spPropertiesXml&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:variable&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- shortcut for accessing $coreMetaData --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;t&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;msxsl:node-set($coreMetaData)&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:call-template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;TileTemplate&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:with-param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;t&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$t&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:call-template&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alright prime time; we are building the required html that represents one tile. We start by copying the tile html from the &lt;a href=&#39;http://drewgreenwell.com/projects/metrojs&#39;&gt;MetroJS&lt;/a&gt; page. There are multipe variable that you can access here.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$Rows&lt;/code&gt; attributes can be accessed directly e.g. &lt;code&gt;&amp;lt;xsl:value-of select=&amp;quot;@__spItemCount&amp;quot;/&amp;gt;&lt;/code&gt; or &lt;code&gt;data-target=&amp;quot;{@__spDefaultViewUrl}&amp;quot;&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Meta data can be accessed through &lt;code&gt;$t&lt;/code&gt; with the same ease as e.g. &lt;code&gt; &amp;lt;div class=&amp;quot;live-tile
{$t/item/@color} {$t/size}&amp;quot;&lt;/code&gt; or &lt;code&gt;&amp;lt;img src=&amp;quot;{$t/item/@icon}&amp;quot; class=&amp;quot;micon&amp;quot;/&amp;gt;&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;You&amp;#8217;ve access to everything that was globally defined like e.g &lt;code&gt;$globalConfig&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;TileTemplate&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;t&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;live-tile {$t/item/@color} {$t/size}&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-stops=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-speed=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;750&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-delay=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-mode=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{$t/item/@data-mode}&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-direction=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{$t/item/@data-direction}&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-target=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{@__spDefaultViewUrl}&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;          &lt;span class=&#39;na&#39;&gt;data-baseTemplate=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{@__spBaseTemplate}&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;tile-title&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;@__spTitle&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;badge right&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;                 &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;@__spItemCount&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{$t/item/@icon}&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;micon&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;                &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$globalConfig/backTileTitle&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;prettyDate&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;title=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{$t/prettyDate}&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;                 &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$t/prettyDate&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;             &lt;span class=&#39;nt&#39;&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The last template builds a mashup based on the current item&amp;#8217;s &lt;code&gt;$tilesConfig&lt;/code&gt;. Think of it as multiple tables that are joined by some common keys e.g. &lt;code&gt; $tilesConfig/item[@BaseTemplate = $baseTemplate]&lt;/code&gt;. Here we use the &lt;code&gt;@__spBaseTemplate&lt;/code&gt; attribute of the current Row, which was passed in as &lt;code&gt;baseTemplate&lt;/code&gt; param as the join criteria for &lt;code&gt;$tilesConfig/item/@BaseTemplate&lt;/code&gt;. If there&amp;#8217;s a match we make a copy of the matched &lt;code&gt;$tilesConfig/item&lt;/code&gt; if not we copy &lt;code&gt;$tilesConfig/item[@BaseTemplate = &amp;#39;unknown&amp;#39;]&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;Everything that needs to be calculated like &lt;code&gt;&amp;lt;size&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;prettyDate&amp;gt;&lt;/code&gt; goes in this template as well. If the logic for a given calculation would become to complex you should factor it out of course.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;MetaData&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;spID&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;baseTemplate&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:param&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;spPropertiesXml&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- accessible via $t/item/@XXXX. Available attributes see $configMap/tiles/item/@XXXX --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:choose&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:when&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;test=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$tilesConfig/item[@BaseTemplate = $baseTemplate]&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:copy-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$tilesConfig/item[@BaseTemplate = $baseTemplate]&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:when&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:otherwise&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:copy-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;$tilesConfig/item[@BaseTemplate = &amp;#39;unknown&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:otherwise&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:choose&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- accessible via $t/size --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;size&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:choose&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:when&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;test=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;msxsl:node-set($itemsInList)/item[@id = $spID]/@pos &amp;amp;lt;= $globalConfig/wideTiles&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;                 &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:text&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;wide&lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:text&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:when&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:otherwise&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:choose&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/size&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;prettyDate&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:variable&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;name=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;DateRaw&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;                       &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;translate(substring-before(substring-after($spPropertiesXml, &amp;#39;Modified=&amp;amp;quot;&amp;#39;), &amp;#39;&amp;amp;quot; LastDeleted&amp;#39;), &amp;#39; &amp;#39;, &amp;#39;T&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:value-of&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt;                 &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;concat(substring($DateRaw, 1, 4), &amp;#39;-&amp;#39;, substring($DateRaw, 5, 2), &amp;#39;-&amp;#39;, substring($DateRaw, 7,2), substring($DateRaw, 9), &amp;#39;Z&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/prettyDate&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&amp;#8217;s it, you made it. You&amp;#8217;ve seen how to build a modern HTML5/CSS3/JavaScript solution in SharePoint 2007/2010/(2013?) using the good old &lt;strong&gt;DVWP&lt;/strong&gt;. And you know that at its core it&amp;#8217;s powered by &lt;strong&gt;134 lines&lt;/strong&gt; of XSLT.&lt;/p&gt;

&lt;p&gt;As always feedback welcome and bye for now.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SharePoint DVWP: from workhorse to Ferrari in 7 steps</title>
   <link href="http://RainerAt.spirit.de/2012/07/15/sharepoint-dvwp-from-workhorse-to-ferrari-in-7-steps"/>
   <updated>2012-07-15T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/07/15/sharepoint-dvwp-from-workhorse-to-ferrari-in-7-steps/</id>
   <content type="html">&lt;p&gt;This is going to be intense and this is going to be fun&amp;#8230;, if you are willing to follow till the end. I&amp;#8217;m going to take the good old Data Form Web Part, better known as &lt;strong&gt;DVWP&lt;/strong&gt;, and turn the standard HTML, which is delivered by this reliable workhorse, in some highly optimized HTML5 code: I call it the &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; version.&lt;/p&gt;

&lt;p&gt;But before we even start, here are some prerequisites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you worked with the &lt;strong&gt;DVWP&lt;/strong&gt; before&lt;/li&gt;

&lt;li&gt;you&amp;#8217;re familiar with XML/XSLT&lt;/li&gt;

&lt;li&gt;you know who Marc D Anderson is and know his &lt;a href=&#39;http://sympmarc.com/tag/dvwp/&#39;&gt;posts about the DVWP&lt;/a&gt; inside out&lt;/li&gt;

&lt;li&gt;you are familiar with SharePoint Designer, but you are not afraid using a text editor. Notepad will do, but some kind of syntax checking and highlighting would be beneficial. Before you ask: I&amp;#8217;m using &lt;a href=&#39;http://www.jetbrains.com/webstorm/&#39;&gt;WebStorm&lt;/a&gt; for overall web development and &lt;a href=&#39;http://www.altova.com/xmlspy.html&#39;&gt;Altova XML Spy&lt;/a&gt; for complex XML/XSLT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let&amp;#8217;s get started with something the &lt;strong&gt;DVWP&lt;/strong&gt; was build for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accessing data via a data source&lt;/li&gt;

&lt;li&gt;(just to recap: &lt;em&gt;Database&lt;/em&gt;, &lt;em&gt;SOAP&lt;/em&gt;, &lt;em&gt;REST&lt;/em&gt;, &lt;em&gt;XML Files&lt;/em&gt; and &lt;em&gt;Linked Data source&lt;/em&gt; are supported)&lt;/li&gt;

&lt;li&gt;converting the data using XSLT&lt;/li&gt;

&lt;li&gt;and finally display the result as part of a SharePoint page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go ahead and:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;create a new site using the blank site template&lt;/li&gt;

&lt;li&gt;create a document library called &lt;code&gt;servicefiles&lt;/code&gt; that is used to store our pages&lt;/li&gt;

&lt;li&gt;create a subfolder &lt;code&gt;servicefiles/xml&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;and finally create a &lt;code&gt;helloworld.xml&lt;/code&gt; file with the following content&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xml&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;cp&#39;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;root&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; 	&lt;span class=&#39;nt&#39;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Hello World&lt;span class=&#39;nt&#39;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nothing fancy so far, so let&amp;#8217;s move on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let&amp;#8217;s created a XML data source for this file&lt;/li&gt;

&lt;li&gt;create a web part page called &lt;code&gt;WebPartPage.aspx&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;Place a &lt;strong&gt;DVWP&lt;/strong&gt; on it show us the standard content.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint:&lt;/strong&gt; As said, I assume that you know the &lt;strong&gt;DVWP&lt;/strong&gt; inside out. But if not or you&amp;#8217;d prefer not following along right now, don&amp;#8217;t worry. Each of the steps below can be accessed online, so sit back, relax and enjoy the ride. If you wanna get your hands dirty later, you find the &lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5&#39;&gt;source code&lt;/a&gt; at github.&lt;/p&gt;

&lt;p&gt;Ok, let&amp;#8217;s move on. By default SPD uses some baked in XSLT to perform the XML/XSLT conversion, which is clearly not the best starting point for us, so let&amp;#8217;s replace the xsl:stylesheet by our own.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:stylesheet&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;version=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;exclude-result-prefixes=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;xsl msxsl ddwrt&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:ddwrt=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/WebParts/v2/DataView/runtime&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:asp=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/ASPNET/20&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:__designer=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/WebParts/v2/DataView/designer&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:xsl=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:msxsl=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;urn:schemas-microsoft-com:xslt&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:SharePoint=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Microsoft.SharePoint.WebControls&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:ddwrt2=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;urn:frontpage:internal&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:output&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;method=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;html&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;indent=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;match=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:asp=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/ASPNET/20&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:__designer=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/WebParts/v2/DataView/designer&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:SharePoint=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Microsoft.SharePoint.WebControls&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;root/title&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Assuming nothing went wrong, you should see something like this in your browser.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Empty ASPX Page&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_0.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;For your convenience you have access to the &lt;a href=&#39;https://github
.com/RainerAtSpirit/DVWP-HTML5/blob/master/WebPartPage.aspx&#39;&gt;Source&lt;/a&gt;, see the rendered result &lt;a href=&#39;http://www.spirit
.de/demos/gtk/dvwp/ServiceFiles/WebPartPage.aspx&#39;&gt;Live&lt;/a&gt; and what&amp;#8217;s more important you can see the &lt;a href=&#39;https://gist.github.com/3116685#file_web_part_page.aspx&#39;&gt;HTML source&lt;/a&gt; of that page; and yes, right click on the rendered result, view source will work as well.&lt;/p&gt;

&lt;p&gt;The size of HTML source will act as our &lt;em&gt;baseline&lt;/em&gt;, and a quick look reveals that there are &lt;strong&gt;772&lt;/strong&gt; lines of code, which includes our &lt;em&gt;payload&lt;/em&gt; of &lt;code&gt;&amp;lt;h1&amp;gt;Hello world&amp;lt;/h1&amp;gt;&lt;/code&gt;. You can see that our &lt;em&gt;payload&lt;/em&gt; is nicely integrated into a fully-fledged SharePoint theme. As said above this scenario is exactly, what the &lt;strong&gt;DVWP&lt;/strong&gt; was built for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint&lt;/strong&gt; In a series of small step-by-step modifications this starting point now undergoes optimization, with the goal of creating a slick HTML5 version that uses the same &lt;em&gt;payload&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ready?&lt;/li&gt;

&lt;li&gt;3&lt;/li&gt;

&lt;li&gt;2&lt;/li&gt;

&lt;li&gt;1&lt;/li&gt;

&lt;li&gt;go&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; Create an empty aspx page in the same folder (hint: right click is your friend) call it &lt;em&gt;step_1.aspx&lt;/em&gt; and copy/paste the existing &lt;strong&gt;DVWP&lt;/strong&gt; from &lt;em&gt;WebPartPage.aspx&lt;/em&gt; into it.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 1&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_1.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_1.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_1.aspx&#39;&gt;Live&lt;/a&gt;, &lt;a href=&#39;https://gist.github.com/3116685#file_step_1.aspx&#39;&gt;HTML source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By placing the &lt;strong&gt;DVWP&lt;/strong&gt; onto it&amp;#8217;s own empty aspx page we a) removed almost all visible SharePoint chrome and b) reduced the HTML source size to &lt;strong&gt;160&lt;/strong&gt; lines. Make a copy of the current page &lt;em&gt;(step_1.aspx)&lt;/em&gt; and save as next page &lt;em&gt;(step_2 .aspx)&lt;/em&gt;; repeat the same process for the following steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; Getting rid of the Web part properties bar is straight forward and frankly could have been done in our original page as well. Simply open the web part properties and change the Chrome Type to &lt;code&gt;none&lt;/code&gt;, which will bring us down to &lt;strong&gt;154&lt;/strong&gt; lines.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 2&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_2.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_2.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_2.aspx&#39;&gt;Live&lt;/a&gt;, &lt;a href=&#39;https://gist.github.com/3116685#file_step_2.aspx&#39;&gt;HTML source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; After that easy passage in &lt;strong&gt;step 2&lt;/strong&gt; let&amp;#8217;s get a little bit more aggressive by getting rid of the &lt;code&gt;asp:ScriptManager&lt;/code&gt; tag. You can either delete it in the code view or in design view. If the latter, make sure that you&amp;#8217;ve turned on Visual Aids otherwise you won&amp;#8217;t see it.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 3&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_3.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;You should test this modification immediately in the browser and you&amp;#8217;ll see this error message.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 3 error&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_3error.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_3.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_3.aspx&#39;&gt;Live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How comes? The page looks still good in SPD, doesn&amp;#8217;t it? Somehow the web part seems to have a dependency on the &lt;code&gt;asp:ScriptManager&lt;/code&gt; that only shows up in the browser. Being at this point before, you remember that the ScriptManager is responsible for loading all kind of JavaScript files, some of them &lt;code&gt;Async&lt;/code&gt; in nature. So by carefully exploring the &lt;strong&gt;DVWP&lt;/strong&gt; settings, you come across the following &lt;code&gt;AsyncRefresh=True&lt;/code&gt; property. Modifying this to &lt;code&gt;AsyncRefresh=False&lt;/code&gt; will ensure that the error message goes away and brings the html down to &lt;strong&gt;124&lt;/strong&gt; lines.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 3 error&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_3async.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_3a.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_3a.aspx&#39;&gt;Live&lt;/a&gt;, &lt;a href=&#39;https://gist.github.com/3116685#file_step_3a.aspx&#39;&gt;HTML source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint&lt;/strong&gt; Up till now we&amp;#8217;ve used SPD to make modifications, but from this point on SPD is no longer your best friend for dealing with the &lt;strong&gt;DVWP&lt;/strong&gt;. This is not the fault of SPD though; we are simply driving the &lt;strong&gt;DVWP&lt;/strong&gt; behind the point that&amp;#8217;s supported inside SPD. Therefore I&amp;#8217;d suggest that you now grab your favorite XML/XSLT HTML editor and make further modifications directly in the source code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One additional warning&lt;/strong&gt; By making modifications beyond this point, you will no longer be able to save your site as a site template and create new sites from it, at least not reliable. Most of the time this is not an issue, remember we are going to build a &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; and you probably just need one not thousands &lt;code&gt;;-)&lt;/code&gt;. But if there&amp;#8217;s ever a need to move your &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; around, you can still manually copy the aspx pages or turn them into a Visual studio feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt; Looking at the source code of the result in step 3 will immediately trigger our attention to the next optimization target. There is that huge &lt;code&gt;input&lt;/code&gt; that hosts the viewstate. All nice and well if you are doing server side stuff, but we don&amp;#8217;t want that, so simply remove the &lt;code&gt;&amp;lt;form ...&amp;gt;&lt;/code&gt;and &lt;code&gt;&amp;lt;/forms&amp;gt;&lt;/code&gt; tags in the source.&lt;/p&gt;

&lt;p&gt;Yeah, I know that might sound a little bit drastic, but give it a try before you judge; and you&amp;#8217;ll be rewarded by seeing the HTML source cutting down to &lt;strong&gt;51&lt;/strong&gt; lines.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 3a source&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_3asource.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_4.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_4.aspx&#39;&gt;Live&lt;/a&gt;, &lt;a href=&#39;https://gist.github.com/3116685#file_step_4.aspx&#39;&gt;HTML source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt; Let&amp;#8217;s see if we can still use some SharePoint controls at the server side after our drastic &lt;strong&gt;step 4&lt;/strong&gt;; and in addition let&amp;#8217;s cleanup the current header.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change the static title to a dynamic one (see below)&lt;/li&gt;

&lt;li&gt;update the doctype &lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; tag&lt;/li&gt;

&lt;li&gt;remove existing &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;title&amp;gt;&amp;lt;SharePoint:ListItemProperty&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;Property=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;BaseName&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;maxlength=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;40&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;runat=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&amp;lt;/title&amp;gt;&lt;/span&gt;`
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see below the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; information is correctly showing the current&amp;#8217;s page name; and by cleaning up we are down to &lt;strong&gt;20&lt;/strong&gt; lines.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 5&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_5.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_5.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_5.aspx&#39;&gt;Live&lt;/a&gt;, &lt;a href=&#39;https://gist.github.com/3116685#file_step_5.aspx&#39;&gt;HTML source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt; Now have a look at the HTML5 source after all the optimization. Not too bad I&amp;#8217;d say, but still there&amp;#8217;s room for improvement. See the highlighted namespaces in the &lt;em&gt;payload&lt;/em&gt;. This will be our next target.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 5 source&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_5source.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Truth told, we might have tackled those namespaces earlier, but now that our HTML becomes smaller, it is far easier to spot that they are not required.&lt;/p&gt;

&lt;p&gt;This one is pretty straight forward, just modify the XSLT slightly. Here&amp;#8217;s the reformatted version that defines all &lt;code&gt;exclude-result-prefixes&lt;/code&gt; correctly and removes the namespaces in &lt;code&gt;&amp;lt;xsl:template match=&amp;quot;/&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;xslt&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:stylesheet&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;version=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;exclude-result-prefixes=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;ddwrt asp __designer xsl msxsl SharePoint ddwrt2&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:ddwrt=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/WebParts/v2/DataView/runtime&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:asp=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/ASPNET/20&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:__designer=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://schemas.microsoft.com/WebParts/v2/DataView/designer&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:xsl=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:msxsl=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;urn:schemas-microsoft-com:xslt&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:SharePoint=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Microsoft.SharePoint.WebControls&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;xmlns:ddwrt2=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;urn:frontpage:internal&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:output&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;method=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;html&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;indent=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;no&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;match=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;select=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;root/title&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_6.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_6.aspx&#39;&gt;Live&lt;/a&gt;, &lt;a href=&#39;https://gist.github.com/3116685#file_step_6.aspx&#39;&gt;HTML source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7&lt;/strong&gt; Not much room for optimization left, correct? But there&amp;#8217;s one thing that annoys me most, when looking at the current state of things. Take a look at our XSLT stylesheet above, there&amp;#8217;s clearly &lt;strong&gt;NO&lt;/strong&gt; &lt;code&gt;&amp;lt;table class&amp;quot;....&amp;gt;&amp;lt;/table&amp;gt;&lt;/code&gt; in there, this code is injected by the &lt;strong&gt;DVWP&lt;/strong&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 6 source&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_6source.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;The not that well known property &lt;code&gt;SuppressWebPartChrome&lt;/code&gt; (&lt;a href=&#39;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.webpart.suppresswebpartchrome.aspx&#39;&gt;see MSDN&lt;/a&gt;) will help us getting rid of this extra &lt;code&gt;WebPartChrome&lt;/code&gt;. &lt;em&gt;Please note&lt;/em&gt; that this only works if the &lt;strong&gt;DVWP&lt;/strong&gt; lives outside a web part zone, so you can&amp;#8217;t use this for standard implemenations like our initial &lt;code&gt;WebPartPage.aspx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You reach the finishing line by adding &lt;code&gt;SuppressWebPartChrome=&amp;quot;True&amp;quot;&lt;/code&gt; to the web part properties, which brings us to&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;16&lt;/strong&gt; lines of &lt;strong&gt;clean HTML5&lt;/strong&gt; code or The &lt;strong&gt;&lt;code&gt;Ferrari&lt;/code&gt;&lt;/strong&gt; version&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Step 7 source&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-step_7.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;https://github.com/RainerAtSpirit/DVWP-HTML5/blob/master/step_7.aspx&#39;&gt;Source&lt;/a&gt;, &lt;a href=&#39;http://www.spirit.de/demos/gtk/dvwp/ServiceFiles/step_7.aspx&#39;&gt;Live&lt;/a&gt;, &lt;a href=&#39;https://gist.github.com/3116685#file_step_7.aspx&#39;&gt;HTML source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Boy, that was probably just another &lt;strong&gt;TL;DR&lt;/strong&gt;, but if you made it till here, you might have picked up one or two things about the &lt;strong&gt;DVWP&lt;/strong&gt; that you&amp;#8217;d consider &amp;#8216;Good to know&amp;#8217;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d be glad to hear from you about the experiences you make, while testing this out.&lt;/p&gt;

&lt;p&gt;BTW if you are looking for inspiration, where to go from here, take a look at this Metro demo, which is a HTML5 client app that was build using two &lt;strong&gt;DVWPs&lt;/strong&gt;&amp;#8230;, but&amp;#8217;s that&amp;#8217;s worth another story, so stay tuned!&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Metro demo&#39; src=&#39;/img/2012-07-15-sharepoint-dvwp-metro.jpg&#39; /&gt; &lt;a href=&#39;http://www.spirit.de/demos/metro/ServiceFiles/DynMetroStyle.aspx&#39;&gt;Live&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Metro JavaScript App - strongly typed?</title>
   <link href="http://RainerAt.spirit.de/2012/07/13/metro-javascript-app---strongly-typed"/>
   <updated>2012-07-13T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/07/13/metro-javascript-app---strongly-typed/</id>
   <content type="html">&lt;p&gt;Let&amp;#8217;s face it, even when I choose to build Metro style apps with HTML5, JavaScript and CSS because I love the dynamic nature of this environment, there are times when I&amp;#8217;m a little bit jealous of that strong typed stuff that you get in that boring C#/XAML world &lt;code&gt;;-)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let see if we can take an existing application like Jeremy Foster&amp;#8217;s excellent &lt;a href=&#39;http://codefoster.com/post/2012/06/13/netflixstage1.aspx&#39;&gt;A Metro Netflix browser in HTML/JS - The Hub page&lt;/a&gt;, add some magic (&lt;a href=&#39;http://jaydata.org/&#39;&gt;JayData&lt;/a&gt;) to it and see if that helps reducing my jealousy .&lt;/p&gt;

&lt;p&gt;Start by downloading Jeremy&amp;#8217;s code that is attached to the blog. While on it don&amp;#8217;t miss to download and install &lt;a href=&#39;http://www.fiddler2.com/fiddler2/version.asp&#39;&gt;Fiddler 4&lt;/a&gt; and the &lt;a href=&#39;http://www.fiddler2.com/Fiddler2/extensions.asp&#39;&gt;Windows 8 AppContainer Loopback Utility&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Simply follow the Jeremy&amp;#8217;s instructions, fire up fiddler and run the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint:&lt;/strong&gt; Make sure that you see some titles coming back from Netflix. &lt;img alt=&#39;Fiddler Response&#39; src=&#39;/img/metro-javascript-app---strong-typed-fiddler.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Looking at fiddler you should see something like the above. Notice the response size of about 740K. At the moment we are not leveraging OData to its full extend. I know that if you&amp;#8217;re an OData expert you already spoted a way to reduce the response by using server side projection. But wait, maybe there are others that aren&amp;#8217;t experts yet, so we come back to this a little later.&lt;/p&gt;

&lt;p&gt;Next download the latest version of &lt;code&gt;JayData&lt;/code&gt; and &lt;code&gt;JaySvcUtil&lt;/code&gt; from the &lt;a href=&#39;http://jaydata.org/download&#39;&gt;download area&lt;/a&gt;. Extract both files into two separate directories, we don&amp;#8217;t want all of them lingering around in our projcect directory, we cherry pick instead the bare minimum.&lt;/p&gt;

&lt;p&gt;So from the JayData directory add the following files into the project&amp;#8217;s &lt;strong&gt;js&lt;/strong&gt; directory&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JayData-vsdoc.js&lt;/li&gt;

&lt;li&gt;JayData.js&lt;/li&gt;

&lt;li&gt;datajs-1.0.2.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open up your preferred command line and navigate to the &lt;code&gt;JaySvcUtil&lt;/code&gt; directory. &lt;code&gt;JaySvcUtil.exe&lt;/code&gt; is command line utility that allows converting OData $metada information into a strongly typed JavaScript object. While it has several switches for fine tuning, we only require three of them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt; $metadata url of your service e.g http://odata.netflix.com/catalog/$metadata&lt;/li&gt;

&lt;li&gt;&lt;code&gt;-n&lt;/code&gt; Namespace e.g. here Netflix&lt;/li&gt;

&lt;li&gt;&lt;code&gt;-o&lt;/code&gt; output file e.g. Netflix.js&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;bash&#39;&gt;Rainer@METRORP ~/Downloads/JaySvcUtil
&lt;span class=&#39;nv&#39;&gt;$ &lt;/span&gt;JaySvcUtil.exe -m &lt;span class=&#39;s1&#39;&gt;&amp;#39;http://odata.netflix.com/catalog/$metadata&amp;#39;&lt;/span&gt; -o Netflix.js -n &lt;span class=&#39;s1&#39;&gt;&amp;#39;Netflix&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If everything went smoothly the system should have generated your &amp;#8216;Netflix.js&amp;#8217; file. Depending on the complexity of your service you might receive a couple of warning messages, which - most of the time - can safely be ignored. Please add the newly created &amp;#8216;YourOutputFile.js&amp;#8217; to the project&amp;#8217;s &lt;strong&gt;js&lt;/strong&gt; directory as well.&lt;/p&gt;

&lt;p&gt;Your default.html should now look like this:&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;cp&#39;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;charset=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;NetflixBrowser&lt;span class=&#39;nt&#39;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- WinJS references --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;//Microsoft.WinJS.1.0.RC/css/ui-dark.css&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;rel=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;//Microsoft.WinJS.1.0.RC/js/base.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;//Microsoft.WinJS.1.0.RC/js/ui.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- NetflixBrowser references --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/css/default.css&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;rel=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/js/default.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/js/navigator.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- JayData references --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/js/datajs-1.0.2.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/js/JayData.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/js/netflix.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;contenthost&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-win-control=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Application.PageControlNavigator&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;data-win-options=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{home: &amp;#39;/pages/home/home.html&amp;#39;}&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt;     &lt;span class=&#39;c&#39;&gt;&amp;lt;!-- &amp;lt;div id=&amp;quot;appbar&amp;quot; data-win-control=&amp;quot;WinJS.UI.AppBar&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt; &lt;span class=&#39;c&#39;&gt;        &amp;lt;button data-win-control=&amp;quot;WinJS.UI.AppBarCommand&amp;quot; data-win-options=&amp;quot;{id:&amp;#39;cmd&amp;#39;, label:&amp;#39;Command&amp;#39;, icon:&amp;#39;placeholder&amp;#39;}&amp;quot;&amp;gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt; &lt;span class=&#39;c&#39;&gt;    &amp;lt;/div&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Checkpoint:&lt;/strong&gt; Run the app just to see if all files can be loaded and no error occurs. &lt;img alt=&#39;Netflix.js errors&#39; src=&#39;/img/metro-javascript-app---strong-typed-params.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;While doing that in my case Visual studio was complaining about some errors in &lt;code&gt;Netflix.js&lt;/code&gt; and right so. You can see that there are a couple of mistyped &lt;code&gt;..., params : , ...&lt;/code&gt; in the code begining at line 166. If that the case for you as well go ahead and remove them. Not quite sure if that&amp;#8217;s Netflix or an JayData issue, but it&amp;#8217;s reported to JayData.&lt;/p&gt;

&lt;p&gt;Alright almost done with the setup phase. Let&amp;#8217;s open up &lt;code&gt;js/home.js&lt;/code&gt; and&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;get rid of the current WinJS.xhr call&lt;/li&gt;

&lt;li&gt;add some references to the JayData files to get Intellisense support.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You&amp;#8217;re home.js should look like below. Remember that you need to compile once to get Intellisense picking up the changes.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;/// &amp;lt;reference path=&amp;quot;/js/jaydata.js&amp;quot; /&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;/// &amp;lt;reference path=&amp;quot;/js/jaydata-vsdoc.js&amp;quot; /&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;/// &amp;lt;reference path=&amp;quot;/js/netflix.js&amp;quot; /&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;  &lt;span class=&#39;s2&#39;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;  &lt;span class=&#39;nx&#39;&gt;WinJS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;UI&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Pages&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;/pages/home/home.html&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;      &lt;span class=&#39;c1&#39;&gt;// This function is called whenever a user navigates to this page. It&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;      &lt;span class=&#39;c1&#39;&gt;// populates the page elements with the app&amp;#39;s data.&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;      &lt;span class=&#39;nx&#39;&gt;ready&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;element&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;options&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;          &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;titlesListGrouped&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;WinJS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Binding&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;List&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;().&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;createGrouped&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;              &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;charAt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;              &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;firstLetter&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;charAt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;          &lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;          &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;q&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;#list&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;winControl&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;          &lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;itemDataSource&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;titlesListGrouped&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;dataSource&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;          &lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;itemTemplate&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;q&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;#template&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt;          &lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;groupDataSource&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;titlesListGrouped&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;groups&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;dataSource&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt;          &lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;groupHeaderTemplate&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;q&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;#headertemplate&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt;      &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt;  &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, roll drum&amp;#8230; here&amp;#8217;s the magic moment &lt;code&gt;:)&lt;/code&gt;, type in &lt;code&gt;Netflix.context.&lt;/code&gt; and you should see Intellisene kicking in. Before we move on let&amp;#8217;s celebrate by leaving the computer and doing whatever you prefer to do when you celebrate.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;Intellisense&#39; src=&#39;/img/metro-javascript-app---strong-typed-Intellisense.jpg&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Alright, back to work! Your first goal would be to come up with an equivalent of the original WinJS.xhr call&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;WinJS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;xhr&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;url&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;http://odata.netflix.com/Catalog/Titles?$format=json&amp;amp;$top=200&amp;quot;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;})&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;then&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;xhr&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;titles&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JSON&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;parse&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;xhr&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;response&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;).&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;titles&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;titlesListGrouped&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ShortName&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;                 &lt;span class=&#39;nx&#39;&gt;imageUrl&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;BoxArt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;LargeUrl&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;             &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Converting this is pretty straight forward. &lt;code&gt;Netflix.context&lt;/code&gt; is already aware of the URL and JayData will add the appropriate Request-Header, so that the Odata service returns Json. That leaves us with teaching the system that we would like to retrieve 200 Titles. By looking at the available methods for &lt;code&gt;Netflix.context.Titles&lt;/code&gt; we notice the &lt;code&gt;take()&lt;/code&gt;method, which probably sounds familiar to many of you. There are several other methods like &lt;code&gt;include()&lt;/code&gt;, &lt;code&gt;filter()&lt;/code&gt;, &lt;code&gt;orderBy()&lt;/code&gt;, &lt;code&gt;skip()&lt;/code&gt;, &lt;code&gt;map()&lt;/code&gt; and &lt;code&gt;forEach&lt;/code&gt; that are all part of the JavaScript Language Query. If you never heard of any of those or want to learn more about it check them out at &lt;a href=&#39;http://jaydata.org/blog/javascript-language-query-jslq-101&#39;&gt;(JSLQ) 101&lt;/a&gt; and come back later.&lt;/p&gt;

&lt;p&gt;The last thing we need to do is reusing the logic of the original forEach loop to push the results into &lt;code&gt;titlesListGrouped&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;Netflix&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Titles&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;take&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;200&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;titlesListGrouped&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;imageUrl&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;BoxArt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;LargeUrl&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;8&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Please note&lt;/em&gt; that at the time of this writing, while there is an JayData deferred.js adapter available for jQuery there&amp;#8217;s NO WinJS aware adapter&amp;#8230; yet. So at the moment you won&amp;#8217;t be able to create promises and use &lt;code&gt;.then()&lt;/code&gt; or &lt;code&gt;.done()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checkpoint:&lt;/strong&gt; Run the code and make sure that you &lt;strong&gt;still&lt;/strong&gt; see titles coming back from Netflix. Alright how does that feel so far? Without being an OData expert you just conducted an OData query, without leaving the comfort zone of Visual Studio and its Intellisene. Not too shabby I&amp;#8217;d say. But we&amp;#8217;ll take it even a step further and try making our OData request a little bit more precise.&lt;/p&gt;

&lt;p&gt;Can we do that? Of course we can by leveraging the &lt;code&gt;.map&lt;/code&gt; method; and you&amp;#8217;ll see, which benefits that brings in just a moment. &lt;em&gt;Please note&lt;/em&gt; that I couldn&amp;#8217;t bring Intellisense to show available properties for &lt;code&gt;item&lt;/code&gt;, but when you look at the Json returned by the service in Fiddler, you can see that we map &lt;code&gt;title: item.ShortName&lt;/code&gt; and &lt;code&gt;BoxArt: item.BoxArt&lt;/code&gt; and return that as an anonymous object. So in the forEach loop we access those as &lt;code&gt;item.title&lt;/code&gt; and &lt;code&gt;item.BoxArt&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;Netflix&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;context&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Titles&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ShortName&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;BoxArt&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;BoxArt&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;})&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;take&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;200&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;titlesListGrouped&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;title&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;imageUrl&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;item&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;BoxArt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;LargeUrl&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&#39;Fiddler 140K&#39; src=&#39;/img/metro-javascript-app---strong-typed-fiddler140k.jpg&#39; /&gt; If you are now running the application and watch Fiddler you see that the return set is way smaller than before. We are down from &lt;strong&gt;740K&lt;/strong&gt; to about &lt;strong&gt;140K&lt;/strong&gt;. So by using the strongly typed Netflix object you not only gained the benefit of Intellisense support, you somehow became an OData expert as well &lt;code&gt;;-)&lt;/code&gt;. Closer watching the URL in Fiddler reveals that there&amp;#8217;s a new &lt;code&gt;$select=ShortName,BoxArt&lt;/code&gt; parameter that was added by JayData, so now the projection is accomplished at the server side and no longer at the client.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s it for today and truth told I feel my jealousy about strongly typed C#/XAML fading away and my excitement about JavaScript grow. But everybody&amp;#8217;s different, so here are two choices if you want to move on with Jeremy&amp;#8217;s Metro app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You can get rid of all JayData files you&amp;#8217;ve added and apply the knowledge about the &lt;code&gt;$select&lt;/code&gt; parameter to enhance the original WinJS code manually. You will see the same performance benefits that we got here.&lt;/p&gt;

&lt;p&gt;Just so that you know, there&amp;#8217;s nothing wrong with this approach, really.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;But maybe you want to stay a little with JayData and see how it pays off.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For those of you, who are on the fence line, it might be good to know that JayData supports a couple of other formats that can be all accessed using the same &lt;strong&gt;JSQL&lt;/strong&gt; you started getting familiar with.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Facebook Query Language, SqlLite, Yahoo Open Data Tables, InMemoryDB, WebSQL, IndexedDb&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and there are more in the pipeline&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d be glad to hear from you about your decission and the reasoning behind it.&lt;/p&gt;

&lt;p&gt;PS: For the impatient ones that wants to start immediately with JayData version of Jeremy&amp;#8217;s Metro example feel free to &lt;a href=&#39;https://github.com/RainerAtSpirit/JayData-Netflix&#39;&gt;clone this repo&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dynamic search in a static world</title>
   <link href="http://RainerAt.spirit.de/2012/07/09/dynamic-search-in-a-static-world"/>
   <updated>2012-07-09T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/07/09/dynamic-search-in-a-static-world/</id>
   <content type="html">&lt;p&gt;While adding search to a new blog might not be the most important thing to do, it gave me perfect excuse to work a little with Jekyll liquid and AngularJS. There was no need to reinvent the wheel as &lt;a href=&#39;http://edwardhotchkiss.com/blog/2012/03/11/jekyll-live-search-with-angular.js/&#39;&gt;Edward Hotchkiss&lt;/a&gt; already implemented something pretty similiar. Therefore here are just the major differences, I expect that you&amp;#8217;re familiar with &lt;a href=&#39;http://edwardhotchkiss.com/blog/2012/03/11/jekyll-live-search-with-angular.js/&#39;&gt;Edward&amp;#8217;s post&lt;/a&gt;, if not please read it first. The implementation is based on AngularJS v1.0.1 and by using a small liquid condition scripts are only loaded on the search page.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the relevant excerpt from default.html.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; {% if page.title == &amp;#39;Search&amp;#39; %}
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;http://code.angularjs.org/angular-1.0.1.min.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;src=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;/js/JekyllApp.js&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt; {% endif %}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Edward Hotchkiss is making an XHR call to retrieve the RSS-feed &lt;code&gt;feed.xml&lt;/code&gt; and then parses the xml. This is a pretty straight forward implementation, but I wanted to omit this extra XHR call and &amp;#8216;bootstrap&amp;#8217; the information into the initial page. Therefore a liquid helper is used to create an JavaScript array with the relevant post information. This has the additional advantage that you can leverage liquid filter like &lt;code&gt;strip_html | truncate : 120 &lt;/code&gt; (on the server side!) to clean up and cut down potentially large information.&lt;/p&gt;

&lt;p&gt;One goal was to having a search box on every page. The Controller was enhanced so that the &lt;code&gt;$scope
.searchText = &amp;#39;&amp;#39;&lt;/code&gt; can now be passed in via querystring as well.&lt;/p&gt;

&lt;p&gt;BTW: You can give it a try on all blog pages, to see it in action.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt;/**&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt; * Setup Module with `highlight` filter&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt; */&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JekyllApp&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;angular&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;module&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;JekyllApp&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[],&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$routeProvider&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$locationProvider&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$locationProvider&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;html5Mode&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kc&#39;&gt;false&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JekyllApp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;filter&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;highlight&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;text&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;filter&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;filter&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;text&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;             &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;text&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;replace&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;RegExp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;filter&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;gi&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;lt;span class=&amp;quot;match&amp;quot;&amp;gt;$&amp;amp;&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt;/**&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;21&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt; * Inject required $objects into our Controller&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;22&lt;/span&gt; &lt;span class=&#39;cm&#39;&gt; */&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;23&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;24&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JekyllSearchController&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$inject&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;$scope&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;$location&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;$window&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;25&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;26&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JekyllSearchController&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;$scope&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$location&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;$window&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;27&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Optionally passing in a search term via q=XXX&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;28&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// $location.search won&amp;#39;t work without html5Mode false using window.location.search instead&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;29&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// $scope.searchText =  $location.search().q || &amp;quot;&amp;quot;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;30&lt;/span&gt;     &lt;span class=&#39;c1&#39;&gt;// Todo: Consider switching back to $location.search once it supports html5Mode false&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;31&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$scope&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;searchText&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;32&lt;/span&gt;     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;search&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;window&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;location&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;search&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;33&lt;/span&gt;     &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;search&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;indexOf&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;?q=&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;||&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;search&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;indexOf&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;amp;q=&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;34&lt;/span&gt;         &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;35&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;angular&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;search&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;].&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;param&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;36&lt;/span&gt;             &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;param&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;param&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;split&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;37&lt;/span&gt;         &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;38&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;$scope&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;searchText&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;params&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;q&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;||&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;39&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;40&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt;41&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$scope&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;externalLink&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;42&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// Todo: Figure out the correct AngularJS way for a page reload on href click&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;43&lt;/span&gt;         &lt;span class=&#39;c1&#39;&gt;// https://github.com/angular/angular.js/issues/1102&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;44&lt;/span&gt;         &lt;span class=&#39;nx&#39;&gt;$window&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;location&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;href&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;post&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;url&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;45&lt;/span&gt;     &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;46&lt;/span&gt;     &lt;span class=&#39;nx&#39;&gt;$scope&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;posts&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;JekyllApp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;posts&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;47&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are a couple of things that I didn&amp;#8217;t grasp fully at the moment I&amp;#8217;ve to admit, like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why &lt;code&gt;$location.search()&lt;/code&gt; only works with &lt;code&gt;$locationProvider.html5mode(true)&lt;/code&gt; or&lt;/li&gt;

&lt;li&gt;why AngularJS doesn&amp;#8217;t have an easy (to discover) method that allows a full page reload on href click&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;so I&amp;#8217;d be happy if somebody could fill the gaps. In the meantime workarounds are used, so querystring &lt;code&gt;q&lt;/code&gt; is determined in a good old fashioned way and there&amp;#8217;s a thread on the &lt;a href=&#39;https://groups.google.com/forum/#!msg/angular/zu5RMEWWyPQ/1yiOm9p5CCkJ&#39;&gt;angular groups&lt;/a&gt; that discusses page reload.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt; 1&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 2&lt;/span&gt;    &lt;span class=&#39;c1&#39;&gt;// Using liquid to populate JeykllApp.posts array&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 3&lt;/span&gt;    &lt;span class=&#39;nx&#39;&gt;JekyllApp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;posts&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;%&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;include&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;Helper&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;/&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;JekyllAppPosts&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;%&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 4&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 5&lt;/span&gt; 
&lt;span class=&#39;lineno&#39;&gt; 6&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;search-container&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;entrance&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-app=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;JekyllApp&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-controller=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;JekyllSearchController&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 7&lt;/span&gt;   &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;entrance-item&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 8&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;p&amp;gt;&amp;lt;input&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;id=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;searchText&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;type=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;search&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;placeholder=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Live Search Posts...&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-model-instant&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-model=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;searchText&amp;quot;&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt; 9&lt;/span&gt;   &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;10&lt;/span&gt;   &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;entrance-item&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;11&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;12&lt;/span&gt;       &lt;span class=&#39;nt&#39;&gt;&amp;lt;li&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-repeat=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;post in posts | filter:searchText&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;13&lt;/span&gt;          &lt;span class=&#39;nt&#39;&gt;&amp;lt;span&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-bind-html-unsafe=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;post.date | date:&amp;#39;MMM d, y&amp;#39; | highlight:searchText&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt; &lt;span class=&#39;ni&#39;&gt;&amp;amp;raquo;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;14&lt;/span&gt;         &lt;span class=&#39;nt&#39;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-href=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;{{ post.url }}&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-click=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;externalLink()&amp;quot;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;15&lt;/span&gt;            &lt;span class=&#39;na&#39;&gt;ng-bind-html-unsafe=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;post.title | highlight:searchText&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;16&lt;/span&gt;           &lt;span class=&#39;nt&#39;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;class=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;preview&amp;quot;&lt;/span&gt; &lt;span class=&#39;na&#39;&gt;ng-bind-html-unsafe=&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;post.content | highlight:searchText&amp;quot;&lt;/span&gt;&lt;span class=&#39;nt&#39;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;17&lt;/span&gt;       &lt;span class=&#39;nt&#39;&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;18&lt;/span&gt;     &lt;span class=&#39;nt&#39;&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;19&lt;/span&gt;   &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#39;lineno&#39;&gt;20&lt;/span&gt; &lt;span class=&#39;nt&#39;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So where&amp;#8217;s that magic &lt;code&gt;include Helper/JekyllAppPosts&lt;/code&gt; coming from? This is where my very first liquid expression :) kicks in and returns an array with title, url, date and content information.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;html&#39;&gt;&lt;span class=&#39;lineno&#39;&gt;1&lt;/span&gt; [{% for post in site.posts %}
&lt;span class=&#39;lineno&#39;&gt;2&lt;/span&gt; {&amp;quot;title&amp;quot; : &amp;quot;{{ post.title }}&amp;quot;,
&lt;span class=&#39;lineno&#39;&gt;3&lt;/span&gt; &amp;quot;url&amp;quot; : &amp;quot;{{ post.url }}&amp;quot;,
&lt;span class=&#39;lineno&#39;&gt;4&lt;/span&gt; &amp;quot;date&amp;quot; : &amp;quot;{{ post.date | date_to_string }}&amp;quot;,
&lt;span class=&#39;lineno&#39;&gt;5&lt;/span&gt; &amp;quot;content&amp;quot; : &amp;quot;{{ post.content |  strip_html | truncate : 120 }}&amp;quot;}{% if forloop.rindex0 != 0 %},{% endif %}
&lt;span class=&#39;lineno&#39;&gt;6&lt;/span&gt; {% endfor %}
&lt;span class=&#39;lineno&#39;&gt;7&lt;/span&gt; ];
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All in all the implementation was pretty straight forward, even when there were a couple of gotchas.&lt;/p&gt;

&lt;p&gt;On very last gotcha I run into and that I&amp;#8217;d like to share, is that on my local box jekyll is running with liquid 2.3 whatever, which allows you to use &lt;code&gt;{% raw %}&lt;/code&gt;, while github is using liquid 2.2 whatever and therefore the older &lt;code&gt;{% literal %}&lt;/code&gt; expression is used. After being hit by that one I finally understood Edward&amp;#8217;s &lt;code&gt;LeftCurley&lt;/code&gt; setting in _config.yml and &lt;strong&gt;I feel his pain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Anyway as a rule of thumb, don&amp;#8217;t use those tags for the time being and rewrite the code instead. There are some instructions from &lt;a href=&#39;http://stackoverflow.com/questions/3426182/how-to-escape-liquid-template-tags&#39;&gt;Khaja Minhajuddin&lt;/a&gt; that doesn&amp;#8217;t require plug-ins.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>WinJS.Namespace.define gotcha</title>
   <link href="http://RainerAt.spirit.de/2012/07/06/winjs--namespace"/>
   <updated>2012-07-06T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/07/06/winjs--namespace/</id>
   <content type="html">&lt;p&gt;So you are following MS best practice and started namespacing your Metro JavaScript projects nicely already. Good :). Now here&amp;#8217;s the challenge: &lt;strong&gt;spot the issue&lt;/strong&gt; with the following code:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problematic version&lt;/strong&gt;: using &lt;code&gt;WinJS.Namespace.define&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;nx&#39;&gt;WinJS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Namespace&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;MyApp&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;version&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;0.0.1&amp;#39;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;WinJS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Namespace&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;Myapp.Helper&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;think&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;input&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;c1&#39;&gt;// do something&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;console&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;log&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;typeof&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;MyApp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Helper&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;think&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;  &lt;span class=&#39;c1&#39;&gt;// -&amp;gt; 0x800a138f - JavaScript runtime error: Unable to get property &amp;#39;think&amp;#39; of&lt;/span&gt;
&lt;span class=&#39;kc&#39;&gt;undefined&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;or&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;null&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;reference&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Yeah, I know you spotted the mistyped namespace &lt;code&gt;Myapp.Helper&lt;/code&gt; immediately. But what if &lt;code&gt;Myapp.Helper&lt;/code&gt; would have been defined in another file, maybe by another coder? You might have been suprised a little, at least I was, when first faced with it;-).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better version&lt;/strong&gt;: using &lt;code&gt;WinJS.Namespace.defineWithParent&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;nx&#39;&gt;WinJS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Namespace&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;define&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s1&#39;&gt;&amp;#39;MyApp&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;version&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;0.0.1&amp;#39;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;WinJS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Namespace&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;defineWithParent&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;MyApp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s1&#39;&gt;&amp;#39;Helper&amp;#39;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;think&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;input&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;c1&#39;&gt;// do something&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;console&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;log&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;typeof&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;MyApp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;Helper&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;think&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// -&amp;gt; &amp;quot;function&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Using &lt;code&gt;defineWithParent&lt;/code&gt; won&amp;#8217;t have that issue as you are passing in the parent object as first parameter, so VS immediately starts yelling if this object doesn&amp;#8217;t exist. Probably worth making a rule like only using &lt;code&gt;define&lt;/code&gt; for root namespaces and from that point on using &lt;code&gt;defineWithParent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Love to hear about your experiences with &lt;code&gt;WinJS.Namespace&lt;/code&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>First steps</title>
   <link href="http://RainerAt.spirit.de/2012/07/05/first-steps"/>
   <updated>2012-07-05T00:00:00-07:00</updated>
   <id>http://RainerAt.spirit.de/2012/07/05/first-steps/</id>
   <content type="html">&lt;p&gt;The obvious challenge: Where and how to start blogging. The answer: After deciding to use github pages and jekyll to host a static blog &lt;a href=&#39;http://blended.co.nz/tech/2012/01/15/blogging-fun-part-2-set-up&#39;&gt;this blog here&lt;/a&gt; brought me up to speed. I&amp;#8217;m especially glad about finding &lt;a href=&#39;https://github.com/jekyllbootstrap/theme-the-program&#39;&gt;the_program&lt;/a&gt; theme, which provides a great responsive design without looking like &amp;#8216;twitter bootstrap&amp;#8217; at all ;-).&lt;/p&gt;</content>
 </entry>
 
 
</feed>