<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Operational Services - Tam Tam</title>
    <link>http://blogs.tamtam.nl/operational-services/</link>
    <description>Operational Services</description>
    <language>en-us</language>
    <copyright>Tam Tam</copyright>
    <lastBuildDate>Thu, 03 Feb 2011 12:11:54 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>dasblog@example.com</managingEditor>
    <webMaster>dasblog@example.com</webMaster>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=8935c56a-3dee-4da9-ba7f-cc7cd71704dc</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,8935c56a-3dee-4da9-ba7f-cc7cd71704dc.aspx</pingback:target>
      <dc:creator>Patrick Steenks</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,8935c56a-3dee-4da9-ba7f-cc7cd71704dc.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=8935c56a-3dee-4da9-ba7f-cc7cd71704dc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <b>
            <a href="https://www.oxxio.nl/" target="_blank">
              <img style="float: right" border="0" src="http://blogs.tamtam.nl/operational-services/content/binary/Oscar-case-100.jpg" />
            </a> Zoals
bij ieder commercieel bedrijf is de website van Oxxio een belangrijk verlengstuk van
de marketing campagnes. Tam Tam zorgt daarbij voor de vertaling online. De lancering
van de nieuwe wintercampagne was een uitgelezen kans om het gehele aanmeldproces onder
handen te nemen. </b>
          <br />
          <br />
          <br />
Tam Tam werkt al sinds een aantal jaren nauw samen met Oxxio en fungeert daarbij als
vaste partner voor haar website. Wat het werken met Oxxio zo prettig maakt is dat
zij openstaat voor nieuwe mogelijkheden en dat zij graag als early adopter wil fungeren
voor innovatieve technologiën.<br /><br />
Dit komt onder meer tot uitdrukking in de vergaande integratie van Google Analytics
die Oxxio op haar website heeft doorgevoerd. Vooral de campagne pagina's worden op
alle mogelijke manieren doorgemeten. Waar klikken mensen op, wat zien zij als waardevolle
secties, waar lopen bezoekers tegen problemen aan? Maar nog belangrijker: hoeveel
bezoekers gaan daadwerkelijk een interactie met Oxxio aan?<br /><br />
Naar aanleiding van de wintercampagne werd Tam Tam betrokken bij de doorontwikkeling
van deze campagne pagina's. Op basis van de eerder verzamelde statistieken is er een
vertaling gemaakt van de zwakke en sterke punten. De <a href="https://www.oxxio.nl/Oxxio-Thuis/Klant-worden/Kies-uw-energiepakket" target="_blank">pakkettest</a> speelde
op de oude website een belangrijke rol en was de belangrijkste landingspagina in het
gehele aanmeldproces.<br /><br />
Op basis van het <a href="http://www.frankwatching.com/archive/2009/04/09/mbti-the-a-team-gaan-hand-in-hand/" target="_blank">MBTI
model</a> (dat bezoekers indeelt in vier verschillende typen) hebben we gekeken naar
de pagina's. Kan ieder van deze vier typen vinden wat hij/zij zoekt op de website?
En hoe kunnen we de pagina's verbeteren zodat elk type het beste wordt benaderd? Uit
onze analyse bleek dat de oude pagina's vooral focusten op één type bezoeker. Op basis
hiervan zijn we een redesign traject ingegaan, met de <a href="https://www.oxxio.nl/Oxxio-Thuis/Klant-worden/Kies-uw-energiepakket" target="_blank">nieuwe
campagne site</a> als gevolg. 
<br /><br />
Sinds 17 januari staan de pagina's live en vanaf die datum zijn we ook weer druk bezig
met het doormeten van de pagina's in Google Analytics. Zorgen de nieuwe pagina's voor
een hogere conversie en meer klanttevredenheid? En wat moet er aangepast worden om
deze pagina's nog verder te verbeteren? Een on-going, maar vooral erg leuk proces.<br /><br />
Ook dat is Tam Tam: samen meedenken met de klant en zorgen voor de beste oplossing.
Met daarbij een duidelijke focus op het resultaat. 
</p>
      </body>
      <title>Wintercampagne Oxxio - Design vanuit je bezoekers</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,8935c56a-3dee-4da9-ba7f-cc7cd71704dc.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2011/02/03/Wintercampagne+Oxxio+Design+Vanuit+Je+Bezoekers.aspx</link>
      <pubDate>Thu, 03 Feb 2011 12:11:54 GMT</pubDate>
      <description>&lt;p&gt;
&lt;b&gt;&lt;a href="https://www.oxxio.nl/" target=_blank&gt;&lt;img style="float: right" border="0" src="http://blogs.tamtam.nl/operational-services/content/binary/Oscar-case-100.jpg"&gt;&lt;/a&gt; Zoals
bij ieder commercieel bedrijf is de website van Oxxio een belangrijk verlengstuk van
de marketing campagnes. Tam Tam zorgt daarbij voor de vertaling online. De lancering
van de nieuwe wintercampagne was een uitgelezen kans om het gehele aanmeldproces onder
handen te nemen. &lt;/b&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Tam Tam werkt al sinds een aantal jaren nauw samen met Oxxio en fungeert daarbij als
vaste partner voor haar website. Wat het werken met Oxxio zo prettig maakt is dat
zij openstaat voor nieuwe mogelijkheden en dat zij graag als early adopter wil fungeren
voor innovatieve technologiën.&lt;br&gt;
&lt;br&gt;
Dit komt onder meer tot uitdrukking in de vergaande integratie van Google Analytics
die Oxxio op haar website heeft doorgevoerd. Vooral de campagne pagina's worden op
alle mogelijke manieren doorgemeten. Waar klikken mensen op, wat zien zij als waardevolle
secties, waar lopen bezoekers tegen problemen aan? Maar nog belangrijker: hoeveel
bezoekers gaan daadwerkelijk een interactie met Oxxio aan?&lt;br&gt;
&lt;br&gt;
Naar aanleiding van de wintercampagne werd Tam Tam betrokken bij de doorontwikkeling
van deze campagne pagina's. Op basis van de eerder verzamelde statistieken is er een
vertaling gemaakt van de zwakke en sterke punten. De &lt;a href="https://www.oxxio.nl/Oxxio-Thuis/Klant-worden/Kies-uw-energiepakket" target=_blank &gt;pakkettest&lt;/a&gt; speelde
op de oude website een belangrijke rol en was de belangrijkste landingspagina in het
gehele aanmeldproces.&lt;br&gt;
&lt;br&gt;
Op basis van het &lt;a href="http://www.frankwatching.com/archive/2009/04/09/mbti-the-a-team-gaan-hand-in-hand/" target=_blank &gt;MBTI
model&lt;/a&gt; (dat bezoekers indeelt in vier verschillende typen) hebben we gekeken naar
de pagina's. Kan ieder van deze vier typen vinden wat hij/zij zoekt op de website?
En hoe kunnen we de pagina's verbeteren zodat elk type het beste wordt benaderd? Uit
onze analyse bleek dat de oude pagina's vooral focusten op één type bezoeker. Op basis
hiervan zijn we een redesign traject ingegaan, met de &lt;a href="https://www.oxxio.nl/Oxxio-Thuis/Klant-worden/Kies-uw-energiepakket" target=_blank &gt;nieuwe
campagne site&lt;/a&gt; als gevolg. 
&lt;br&gt;
&lt;br&gt;
Sinds 17 januari staan de pagina's live en vanaf die datum zijn we ook weer druk bezig
met het doormeten van de pagina's in Google Analytics. Zorgen de nieuwe pagina's voor
een hogere conversie en meer klanttevredenheid? En wat moet er aangepast worden om
deze pagina's nog verder te verbeteren? Een on-going, maar vooral erg leuk proces.&lt;br&gt;
&lt;br&gt;
Ook dat is Tam Tam: samen meedenken met de klant en zorgen voor de beste oplossing.
Met daarbij een duidelijke focus op het resultaat. 
&lt;/p&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,8935c56a-3dee-4da9-ba7f-cc7cd71704dc.aspx</comments>
      <category>Campagnes</category>
      <category>Google Analytics</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=0eff6f58-a3ec-4299-9f4a-ee9fc545bfd6</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,0eff6f58-a3ec-4299-9f4a-ee9fc545bfd6.aspx</pingback:target>
      <dc:creator>Nuno Freitas</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,0eff6f58-a3ec-4299-9f4a-ee9fc545bfd6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=0eff6f58-a3ec-4299-9f4a-ee9fc545bfd6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
AJAX applications can have one pitfall: the browser can't handle the history state,
so the usual features don't work (back, forward, refresh, etc.). To overcome this
you need to explicitly add browser history support. With ASP.NET (since 3.5 SP1) it's
pretty straightforward. To do that you have to enable history in the <a href="http://msdn.microsoft.com/en-us/library/bb344905.aspx">ScriptManager</a> and
make an event handler for navigation.
</p>
        <p>
Let's take the example of a tabbed interface. Maybe you have an update panel and a
navigational menu. Each time you click on a tab it loads the content using AJAX.
</p>
        <p>
The first thing to do is set the <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.enablehistory.aspx">EnableHistory</a> property
of your <em>ScriptManager</em> to <em>true</em>. As you can imagine this adds support
to your application for adding browser history points.
</p>
        <p>
Another property that I like to configure is <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.enablesecurehistorystate.aspx">EnableSecureHistoryState</a>.
This property encrypts the anchor string that will identify your application state.
I usually set it to <em>false</em>, to have a nice human readable anchor in the browser
instead of an ugly string (e.g. <em>#&amp;&amp;tab=settings</em>, which is actually
readable and can be changed if you know the possible values).
</p>
        <p>
Normally you would have a click event on your menu and, according to the tab that
was clicked, different content would be loaded. You still do this, but now there is
an extra step: you need to add a history point to the browser state.
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">protected</span>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> menu_TabClick(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span> tab)
{     Navigate(tab); <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px">//
load the appropriate content from this tab</span>     AddHistoryPoint(tab); <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px">//
save the current history state</span> }</span>
        </pre>
        <p>
 
</p>
        <p>
When adding a history state, you need to specify a key, a value (identifying the state
of your application) and optionally a title (so you can have different titles depending
on the state).
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">protected</span>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> AddHistoryPoint(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span> tab)
{     ScriptManager manager <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> ScriptManager.GetCurrent(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">this</span>.Page);
    <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">if</span> (manager
!<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">null</span>)
    {         <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">if</span> (manager.IsInAsyncPostBack)
        {             <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span> title <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"Your
page title"</span>;             manager.AddHistoryPoint(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"tab"</span>,
tab, title);         }     }
}</span>
        </pre>
        <p>
 
</p>
        <p>
Finally you need to create an event handler for the <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.navigate.aspx">Navigate</a> event
of the <em>ScriptManager</em>. In this event you can read the state of your application
(using the key of your designation) and then do the appropriate action.
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> manager_Navigate(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">object</span> sender,
HistoryEventArgs e) {     <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span> tab <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> e.State[<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"tab"</span>];
    Navigate(tab); <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px">//
load the appropriate content from this tab</span>     <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">this</span>.updatePanel.Update();
}</span>
        </pre>
        <p>
 
</p>
        <p>
As you can see it's not that much work, but increases the usability of your application
substantially.
</p>
      </body>
      <title>Add browser history support for ASP.NET AJAX applications</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,0eff6f58-a3ec-4299-9f4a-ee9fc545bfd6.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/12/17/Add+Browser+History+Support+For+ASPNET+AJAX+Applications.aspx</link>
      <pubDate>Fri, 17 Dec 2010 13:38:45 GMT</pubDate>
      <description>&lt;p&gt;
AJAX applications can have one pitfall: the browser can't handle the history state,
so the usual features don't work (back, forward, refresh, etc.). To overcome this
you need to explicitly add browser history support. With ASP.NET (since 3.5 SP1) it's
pretty straightforward. To do that you have to enable history in the &lt;a href="http://msdn.microsoft.com/en-us/library/bb344905.aspx"&gt;ScriptManager&lt;/a&gt; and
make an event handler for navigation.
&lt;/p&gt;
&lt;p&gt;
Let's take the example of a tabbed interface. Maybe you have an update panel and a
navigational menu. Each time you click on a tab it loads the content using AJAX.
&lt;/p&gt;
&lt;p&gt;
The first thing to do is set the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.enablehistory.aspx"&gt;EnableHistory&lt;/a&gt; property
of your &lt;em&gt;ScriptManager&lt;/em&gt; to &lt;em&gt;true&lt;/em&gt;. As you can imagine this adds support
to your application for adding browser history points.
&lt;/p&gt;
&lt;p&gt;
Another property that I like to configure is &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.enablesecurehistorystate.aspx"&gt;EnableSecureHistoryState&lt;/a&gt;.
This property encrypts the anchor string that will identify your application state.
I usually set it to &lt;em&gt;false&lt;/em&gt;, to have a nice human readable anchor in the browser
instead of an ugly string (e.g. &lt;em&gt;#&amp;amp;&amp;amp;tab=settings&lt;/em&gt;, which is actually
readable and can be changed if you know the possible values).
&lt;/p&gt;
&lt;p&gt;
Normally you would have a click event on your menu and, according to the tab that
was clicked, different content would be loaded. You still do this, but now there is
an extra step: you need to add a history point to the browser state.
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;protected&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; menu_TabClick(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt; tab)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Navigate(tab); &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px"&gt;//
load the appropriate content from this tab&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddHistoryPoint(tab); &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px"&gt;//
save the current history state&lt;/span&gt; }&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
When adding a history state, you need to specify a key, a value (identifying the state
of your application) and optionally a title (so you can have different titles depending
on the state).
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;protected&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; AddHistoryPoint(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt; tab)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ScriptManager manager &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; ScriptManager.GetCurrent(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;this&lt;/span&gt;.Page);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;if&lt;/span&gt; (manager
!&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;null&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;if&lt;/span&gt; (manager.IsInAsyncPostBack)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt; title &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"Your
page title"&lt;/span&gt;; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;manager.AddHistoryPoint(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"tab"&lt;/span&gt;,
tab, title); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Finally you need to create an event handler for the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.navigate.aspx"&gt;Navigate&lt;/a&gt; event
of the &lt;em&gt;ScriptManager&lt;/em&gt;. In this event you can read the state of your application
(using the key of your designation) and then do the appropriate action.
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; manager_Navigate(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;object&lt;/span&gt; sender,
HistoryEventArgs e) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt; tab &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; e.State[&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"tab"&lt;/span&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Navigate(tab); &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px"&gt;//
load the appropriate content from this tab&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;this&lt;/span&gt;.updatePanel.Update();
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
As you can see it's not that much work, but increases the usability of your application
substantially.
&lt;/p&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,0eff6f58-a3ec-4299-9f4a-ee9fc545bfd6.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=65ef21c6-74dd-4bdc-b7f6-0c89c5729446</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,65ef21c6-74dd-4bdc-b7f6-0c89c5729446.aspx</pingback:target>
      <dc:creator>Nuno Freitas</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,65ef21c6-74dd-4bdc-b7f6-0c89c5729446.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=65ef21c6-74dd-4bdc-b7f6-0c89c5729446</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This error message can have different causes. I will talk about one of them, that
I found reading the ASP.net forums (<a href="http://forums.asp.net/t/1193378.aspx">Bug
: Setting ScriptPath</a>). This is the type of error that can drive someone insane.
</p>
        <h3>Background information
</h3>
        <p>
The <a href="http://msdn.microsoft.com/en-us/library/bb344905(v=VS.90).aspx">ScriptManager</a> control
has a property called <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.scriptpath(v=VS.90).aspx">ScriptPath</a> which
lets you specify a path to the ASP.NET AJAX JavaScript files as well as other custom
scripts.
</p>
        <p>
Using this, the ASP.NET AJAX files will be loaded directly from the file system, in
contrast to the default, where they are loaded through an HTTP handler.
</p>
        <p>
This is not only useful for debugging, but may also be necessary in specific scenarios
where the HTTP Handler might give you some problems.
</p>
        <p>
With this in mind, Microsoft included the JavaScript files for ASP.NET AJAX so that
you can copy them to your desired folder.
</p>
        <p>
Depending on your setup, these files can be usually found at:
</p>
        <ul>
          <li>
            <em>C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025\MicrosoftAjaxLibrary\System.Web.Extensions\1.0.61025.0\Globalization</em>
          </li>
        </ul>
        <p>
You will find both debug and release (minified) versions for each JavaScript file.
</p>
        <h3>The problem
</h3>
        <p>
It appears that using the release version of the <em>MicrosoftAjaxTimer.js</em> file
can lead to trouble when also using a timer on a page.
</p>
        <p>
In these cases, "h is not a constructor" JavaScript errors can appear and things start
to fail.
</p>
        <p>
The problem is in the <em>MicrosoftAjaxTimer.js</em> file where aparently the minification
didn't go so well and a semicolon (;) was left out.
</p>
        <p>
To fix this, open the file and search for the following string:
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">Sys.UI._Timer.registerClass(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"Sys.UI._Timer"</span>,Sys.UI.Control)<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">if</span>(typeof(Sys)!=='<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">undefined</span>')Sys.Application.notifyScriptLoaded();<br /><br /></span>
        </pre>
        <p>
There should be a semicolon (;) before the "if". Just add it, save the file and be
glad that someone else found this for you (not me, congratulate the original guy in
the forums)!
</p>
        <h3>Resources
</h3>
        <ul>
          <li>
            <a href="http://forums.asp.net/t/1193378.aspx">Bug : Setting ScriptPath</a>
          </li>
          <li>
            <a href="http://iridescence.no/post/UsingtheScriptPathoftheASPNETAjaxScriptManager.aspx">Using
the ScriptPath of the ASP.NET Ajax ScriptManager</a>
          </li>
          <li>
            <a href="http://damianblog.com/2006/11/27/scriptmanager-scriptpath/">Tip/Trick: Using
ScriptManager ScriptPath to load MicrosoftAjax.js from file system</a>
          </li>
        </ul>
        <p>
 
</p>
      </body>
      <title>"h is not a constructor" JavaScript error using ASP.NET AJAX</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,65ef21c6-74dd-4bdc-b7f6-0c89c5729446.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/11/30/h+Is+Not+A+Constructor+JavaScript+Error+Using+ASPNET+AJAX.aspx</link>
      <pubDate>Tue, 30 Nov 2010 15:03:51 GMT</pubDate>
      <description>&lt;p&gt;
This error message can have different causes. I will talk about one of them, that
I found reading the ASP.net forums (&lt;a href="http://forums.asp.net/t/1193378.aspx"&gt;Bug
: Setting ScriptPath&lt;/a&gt;). This is the type of error that can drive someone insane.
&lt;/p&gt;
&lt;h3&gt;Background information
&lt;/h3&gt;
&lt;p&gt;
The &lt;a href="http://msdn.microsoft.com/en-us/library/bb344905(v=VS.90).aspx"&gt;ScriptManager&lt;/a&gt; control
has a property called &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.scriptpath(v=VS.90).aspx"&gt;ScriptPath&lt;/a&gt; which
lets you specify a path to the ASP.NET AJAX JavaScript files as well as other custom
scripts.
&lt;/p&gt;
&lt;p&gt;
Using this, the ASP.NET AJAX files will be loaded directly from the file system, in
contrast to the default, where they are loaded through an HTTP handler.
&lt;/p&gt;
&lt;p&gt;
This is not only useful for debugging, but may also be necessary in specific scenarios
where the HTTP Handler might give you some problems.
&lt;/p&gt;
&lt;p&gt;
With this in mind, Microsoft included the JavaScript files for ASP.NET AJAX so that
you can copy them to your desired folder.
&lt;/p&gt;
&lt;p&gt;
Depending on your setup, these files can be usually found at:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025\MicrosoftAjaxLibrary\System.Web.Extensions\1.0.61025.0\Globalization&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You will find both debug and release (minified) versions for each JavaScript file.
&lt;/p&gt;
&lt;h3&gt;The problem
&lt;/h3&gt;
&lt;p&gt;
It appears that using the release version of the &lt;em&gt;MicrosoftAjaxTimer.js&lt;/em&gt; file
can lead to trouble when also using a timer on a page.
&lt;/p&gt;
&lt;p&gt;
In these cases, "h is not a constructor" JavaScript errors can appear and things start
to fail.
&lt;/p&gt;
&lt;p&gt;
The problem is in the &lt;em&gt;MicrosoftAjaxTimer.js&lt;/em&gt; file where aparently the minification
didn't go so well and a semicolon (;) was left out.
&lt;/p&gt;
&lt;p&gt;
To fix this, open the file and search for the following string:
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;Sys.UI._Timer.registerClass(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"Sys.UI._Timer"&lt;/span&gt;,Sys.UI.Control)&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;if&lt;/span&gt;(typeof(Sys)!=='&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;undefined&lt;/span&gt;')Sys.Application.notifyScriptLoaded();&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
There should be a semicolon (;) before the "if". Just add it, save the file and be
glad that someone else found this for you (not me, congratulate the original guy in
the forums)!
&lt;/p&gt;
&lt;h3&gt;Resources
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://forums.asp.net/t/1193378.aspx"&gt;Bug : Setting ScriptPath&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://iridescence.no/post/UsingtheScriptPathoftheASPNETAjaxScriptManager.aspx"&gt;Using
the ScriptPath of the ASP.NET Ajax ScriptManager&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://damianblog.com/2006/11/27/scriptmanager-scriptpath/"&gt;Tip/Trick: Using
ScriptManager ScriptPath to load MicrosoftAjax.js from file system&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,65ef21c6-74dd-4bdc-b7f6-0c89c5729446.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=525ac44d-60d7-4c6c-838e-96090f73c4a6</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,525ac44d-60d7-4c6c-838e-96090f73c4a6.aspx</pingback:target>
      <dc:creator>Nuno Freitas</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,525ac44d-60d7-4c6c-838e-96090f73c4a6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=525ac44d-60d7-4c6c-838e-96090f73c4a6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Some developers are unaware that you can store custom properties in <a href="http://msdn.microsoft.com/en-us/library/ms412253.aspx">SPWeb</a> objects.
It's usually referred as the property bag and can be useful for storing configuration
variables.
</p>
        <p>
If you look at an <em>SPWeb</em> object you will notice a property called <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.allproperties.aspx">AllProperties</a>.
"Great", you say, but looking further down reveals another property: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.properties.aspx">Properties</a>.
"Which one to use?", you ask. The answer is simple: both.
</p>
        <p>
          <em>Properties</em> is of type <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.utilities.sppropertybag.aspx">SPPropertyBag</a> and
was only left for backwards compatibility. <em>AllProperties</em> was implemented
later as a replacement for <em>Properties</em> and is an <a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx">Hashtable</a> object. <em>Properties</em> only
contains a subset of what is stored in <em>AllProperties</em>.
</p>
        <p>
To avoid any inconsistencies, you should write an entry to both, as following:
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">SPSecurity.RunWithElevatedPrivileges(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">delegate</span>()
{     <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">using</span> (SPSite
site <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">new</span> SPSite(SPContext.Current.Site.ID))
    {         <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">using</span> (SPWeb
web <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> site.OpenWeb(SPContext.Current.Web.ID))
        {             web.AllowUnsafeUpdates <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">true</span>;
            web.Properties[key] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> value;
            web.AllProperties[key] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> value;
            web.Update();
            web.Properties.Update();
            web.AllowUnsafeUpdates <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">false</span>;
        }     } });</span>
        </pre>
        <p>
 
</p>
        <p>
What an ugly code for such a simple thing. Unfortunately, the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx">RunWithElevatedPrivileges</a> and
the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.allowunsafeupdates.aspx">AllowUnsafeUpdates</a> are
necessary for this to work. For retrieving an entry you should use <em>AllProperties</em>.
</p>
        <p>
You're better off creating an utility class to add, update, get and remove properties.
</p>
        <p>
You will be restricted to strings, but obviously you can also parse booleans, integers
or even serialize objects to JSON (for that you can use <a href="http://tiredblogger.wordpress.com/2007/10/03/to-and-fromjson-extension-methods/">To
and FromJson Extension Methods</a>).
</p>
        <p>
I haven't confirmed this myself, but it seems there haven't been made any changes
in these properties in SharePoint 2010.
</p>
        <p>
 
</p>
        <h3>Resources
</h3>
        <ul>
          <li>
            <a href="http://trentacular.com/2009/06/sharepoint-the-wicked-spwebproperties-propertybag/">SharePoint:
The Wicked SPWeb.Properties PropertyBag</a>
          </li>
          <li>
            <a href="http://www.iwkid.com/blog/Lists/Posts/Post.aspx?ID=42">The SPWeb PropertyBag</a>
          </li>
          <li>
            <a href="http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/05/12/how-to-write-a-value-into-the-property-bag.aspx">How
to: Write a value into the property bag</a>
          </li>
        </ul>
        <p>
 
</p>
      </body>
      <title>Storing web specific properties in SharePoint</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,525ac44d-60d7-4c6c-838e-96090f73c4a6.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/11/04/Storing+Web+Specific+Properties+In+SharePoint.aspx</link>
      <pubDate>Thu, 04 Nov 2010 09:43:10 GMT</pubDate>
      <description>&lt;p&gt;
Some developers are unaware that you can store custom properties in &lt;a href="http://msdn.microsoft.com/en-us/library/ms412253.aspx"&gt;SPWeb&lt;/a&gt; objects.
It's usually referred as the property bag and can be useful for storing configuration
variables.
&lt;/p&gt;
&lt;p&gt;
If you look at an &lt;em&gt;SPWeb&lt;/em&gt; object you will notice a property called &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.allproperties.aspx"&gt;AllProperties&lt;/a&gt;.
"Great", you say, but looking further down reveals another property: &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.properties.aspx"&gt;Properties&lt;/a&gt;.
"Which one to use?", you ask. The answer is simple: both.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Properties&lt;/em&gt; is of type &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.utilities.sppropertybag.aspx"&gt;SPPropertyBag&lt;/a&gt; and
was only left for backwards compatibility. &lt;em&gt;AllProperties&lt;/em&gt; was implemented
later as a replacement for &lt;em&gt;Properties&lt;/em&gt; and is an &lt;a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx"&gt;Hashtable&lt;/a&gt; object. &lt;em&gt;Properties&lt;/em&gt; only
contains a subset of&amp;nbsp;what is&amp;nbsp;stored in &lt;em&gt;AllProperties&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
To avoid any inconsistencies, you should write an entry to both, as following:
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;SPSecurity.RunWithElevatedPrivileges(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;delegate&lt;/span&gt;()
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;using&lt;/span&gt; (SPSite
site &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; SPSite(SPContext.Current.Site.ID))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;using&lt;/span&gt; (SPWeb
web &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; site.OpenWeb(SPContext.Current.Web.ID))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;web.AllowUnsafeUpdates &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;web.Properties[key] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;web.AllProperties[key] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;web.Update();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;web.Properties.Update();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;web.AllowUnsafeUpdates &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} });&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
What an ugly code for such a simple thing. Unfortunately, the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx"&gt;RunWithElevatedPrivileges&lt;/a&gt; and
the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.allowunsafeupdates.aspx"&gt;AllowUnsafeUpdates&lt;/a&gt; are
necessary for this to work. For retrieving&amp;nbsp;an entry&amp;nbsp;you should use &lt;em&gt;AllProperties&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
You're better off creating an utility class to add, update, get and remove properties.
&lt;/p&gt;
&lt;p&gt;
You will be restricted to strings, but obviously you can also parse booleans, integers
or even serialize objects to&amp;nbsp;JSON (for that you can use &lt;a href="http://tiredblogger.wordpress.com/2007/10/03/to-and-fromjson-extension-methods/"&gt;To
and FromJson Extension Methods&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
I haven't confirmed this myself, but it seems there haven't been made any changes
in these properties in SharePoint 2010.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Resources
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://trentacular.com/2009/06/sharepoint-the-wicked-spwebproperties-propertybag/"&gt;SharePoint:
The Wicked SPWeb.Properties PropertyBag&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.iwkid.com/blog/Lists/Posts/Post.aspx?ID=42"&gt;The SPWeb PropertyBag&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/05/12/how-to-write-a-value-into-the-property-bag.aspx"&gt;How
to: Write a value into the property bag&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,525ac44d-60d7-4c6c-838e-96090f73c4a6.aspx</comments>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=9d6a22c3-7d4a-42a3-92ae-136a0ad237ac</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,9d6a22c3-7d4a-42a3-92ae-136a0ad237ac.aspx</pingback:target>
      <dc:creator>Nuno Freitas</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,9d6a22c3-7d4a-42a3-92ae-136a0ad237ac.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=9d6a22c3-7d4a-42a3-92ae-136a0ad237ac</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
SharePoint search offers a lot of possibilities. In this article we'll discuss some
of the shortcomings that you might come across when programmatically querying the
SharePoint 2007 search service.
</p>
        <h3>Welcome pages as "STS_Web"
</h3>
        <p>
The welcome page of a publishing site is the page a user first sees when visiting
that sub site (usually <em>default.aspx</em>).
</p>
        <p>
Here's the strange part: the SharePoint search service treats these results with the
content class "STS_Web", differentiating them from the remaining pages.
</p>
        <p>
What does this mean? It means, for example, that if you want to create a scope that
includes all the pages of a site (e.g. by including only items with content class
"STS_ListItem_850"), the welcome pages will not show up, unless you also include the
content class "STS_Web".
</p>
        <p>
Of course, that's not all. This comes with all sorts of shortcomings. Let's say you
want to retrieve all results for the content type "Project". Now imagine, that you
have several sub sites and some of those have a welcome page of the type "Project".
</p>
        <p>
You'll just query the search service and say that you want all results of the content
type "Project", right? Wrong. The thing is, because the welcome pages are treated
differently, this simply won't work. As long as those pages are welcome pages they
will be treated with content class "STS_Web", preventing you from filtering them by
their managed properties, with no easy way around this.
</p>
        <p>
Here's one solution that you can adopt: create a redirect page using the "RedirectPageLayout.aspx".
Make this page redirect to the actual page that you want to be the homepage of the
publishing site. Now set the welcome page to the redirect page.
</p>
        <p>
The search service will now treat your redirect page as the welcome page (meaning
with content class "STS_Web"), but all the other pages will be treated normally. Users
won't notice the redirect, because it happens behind the scenes.
</p>
        <p>
Beware that you might also want to adjust the navigation of your site to hide your
actual homepage from the navigation.
</p>
        <p>
 
</p>
        <h3>Unable to get results for items with null values
</h3>
        <p>
By design, null values are not stored for an item's properties in the SharePoint database.
</p>
        <p>
This means that if you use an "OR" condition for several properties, only items with
values for <em>all</em> properties will be returned. For example, maybe you're trying
to find all "Project" items which belong to a specific industry or have a specific
status. If there are some projects which don't have a value for any one of those properties,
your search will not return them.
</p>
        <p>
Another implication of this situation, is that you cannot find items which have a
property set to null. For example, you're trying to find all items that don't have
a value for a given property - you can't. You can either retrieve all items and then
manually remove those that don't have any value for the property you're searching
for, or you can get all items that have <em>some</em> value.
</p>
        <p>
Unfortunately, this is a serious limitation and I'm not aware of any workaround for
this yet.
</p>
        <p>
 
</p>
        <h3>Retrieve an item's content type
</h3>
        <p>
There is a managed property named "ContentType" that you can use to filter the results
by their content type. However, if you want to read their actual content type, you
cannot use the same property.
</p>
        <p>
That's because the managed property "ContentType" is mapped to two crawled properties:
"Basic:5" and "ows_ContentType". Although it works for filtering (i.e. in the WHERE
clause), if you try to read its value, the "ContentType" property will return the
value of the "Basic:5" crawled property.
</p>
        <p>
If you want to retrieve the content type for your results (e.g. for showing them in
a filter), you will need to create a new managed property (e.g. "ItemContentType")
and map it just to the crawled property "ows_ContentType".
</p>
        <p>
 
</p>
        <h3>HTML is stripped from properties (or why PublishingPageImage doesn't work in search)
</h3>
        <p>
Let's say you have news items on your site. As part of a news' content, you use the
default "Page Image" field (internally named "PublishingPageImage") for storing a
news' main image.
</p>
        <p>
In your search results, you want to be able to display the news images right next
to the text summary. You create a new managed property and you map it to the "ows_PublishingPageImage"
crawled property. Now you try to use that property in your search results, but you
notice that the property is always empty. How can this be?
</p>
        <p>
That's because by design SharePoint cannot crawl compound controls. That's a beautiful
way of saying that SharePoint hates you and will strip all HTML markup from the values
of the properties when crawling them. Because the "PublishingPageImage" is entirely
stored as HTML markup (i.e. "&lt;img ..."), nothing comes up in the search.
</p>
        <p>
There is a "simple" workaround for this. If you want to make use of the "PublishingPageImage"
property for your search results, first you'll need to create a new property. This
property will store just the image's path. Secondly, you'll need to create an event
handler. In the handler you will need to define the "ItemUpdated" event, so that each
time an item is updated you will populate the new property you created with the URL
to the image of the "PublishingPageImage" field. After that, just create a new managed
property mapped to your new site column and then use that property in your search
results.
</p>
        <p>
 
</p>
        <h3>Conclusion
</h3>
        <p>
In this article we covered some trivial and simple things that become a nuissance
when working with the SharePoint search that, although being powerful, also has many
shortcomings in itself.
</p>
        <p>
 
</p>
        <h3>Resources
</h3>
        <ul>
          <li>
            <a href="http://blog.mastykarz.nl/including-pages-search-scope-sharepoint-web-content-management-solutions/">Including
Welcome Pages in the search scope in SharePoint Web Content Management solutions</a>
          </li>
          <li>
            <a href="http://www.devcow.com/blogs/jdattis/archive/2007/12/20/the-contentclass-and-isdocument-properties-along-with-the-welcome-page-caveat.aspx">The
contentclass and isDocument properties along with the Welcome Page caveat</a>
          </li>
          <li>
            <a href="http://vspug.com/smc750/2007/06/20/custom-cross-list-search-development-pitfalls-part-two/">Custom
Cross-List Search Development Pitfalls (Part Two)</a>
          </li>
          <li>
            <a href="http://www.sharepointdev.net/sharepoint--search/fulltext-sql-query-issues-with-null-metadata-properties-36240.shtml">FullText
SQL Query issues with NULL MetaData Properties</a>
          </li>
          <li>
            <a href="http://treenovum-wss.com/alavpa/Lists/Posts/Post.aspx?List=03d51c71-9fa7-4906-8d8e-0e33ae819454&amp;ID=85">FullTextSQLQuery
tips</a>
          </li>
          <li>
            <a href="http://sjoere.blogspot.com/2009/12/publishing-image-does-not-get-indexed.html">Publishing
Image does not get indexed</a>
          </li>
          <li>
            <a href="http://blogs.msdn.com/b/jjameson/archive/2009/09/23/no-html-markup-in-moss-2007-managed-properties.aspx">No
HTML Markup in MOSS 2007 Managed Properties</a>
          </li>
          <li>
            <a href="http://stefan-stanev-sharepoint-blog.blogspot.com/2009/11/sharepoint-search-and-html-meta-tags.html">SharePoint
Search and HTML Meta tags</a>
          </li>
        </ul>
      </body>
      <title>SharePoint Search: bugs, limitations and workarounds</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,9d6a22c3-7d4a-42a3-92ae-136a0ad237ac.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/09/29/SharePoint+Search+Bugs+Limitations+And+Workarounds.aspx</link>
      <pubDate>Wed, 29 Sep 2010 08:43:14 GMT</pubDate>
      <description>&lt;p&gt;
SharePoint search offers a lot of possibilities. In this article we'll discuss some
of the shortcomings that you might come across when programmatically querying the
SharePoint 2007 search service.
&lt;/p&gt;
&lt;h3&gt;Welcome pages as "STS_Web"
&lt;/h3&gt;
&lt;p&gt;
The welcome page of a publishing site is the page a user first sees when visiting
that sub site (usually &lt;em&gt;default.aspx&lt;/em&gt;).
&lt;/p&gt;
&lt;p&gt;
Here's the strange part: the SharePoint search service treats these results with the
content class "STS_Web", differentiating them from the remaining pages.
&lt;/p&gt;
&lt;p&gt;
What does this mean? It means, for example, that if you want to create a scope that
includes all the pages of a site (e.g. by including only items with content class
"STS_ListItem_850"), the welcome pages will not show up, unless you also include the
content class "STS_Web".
&lt;/p&gt;
&lt;p&gt;
Of course, that's not all. This comes with all sorts of shortcomings. Let's say you
want to retrieve all results for the content type "Project". Now imagine, that you
have several sub sites and some of those have a welcome page of the type "Project".
&lt;/p&gt;
&lt;p&gt;
You'll just query the search service and say that you want all results of the content
type "Project", right? Wrong. The thing is, because the welcome pages are treated
differently, this simply won't work. As long as those pages are welcome pages they
will be treated with content class "STS_Web", preventing you from filtering them by
their managed properties, with no easy way around this.
&lt;/p&gt;
&lt;p&gt;
Here's one solution that you can adopt: create a redirect page using the "RedirectPageLayout.aspx".
Make this page redirect to the actual page that you want to be the homepage of the
publishing site. Now set the welcome page to the redirect page.
&lt;/p&gt;
&lt;p&gt;
The search service will now treat your redirect page as the welcome page (meaning
with content class "STS_Web"), but all the other pages will be treated normally. Users
won't notice the redirect, because it happens behind the scenes.
&lt;/p&gt;
&lt;p&gt;
Beware that you might also want to adjust the navigation of your site to hide your
actual homepage from the navigation.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Unable to get results for items with null values
&lt;/h3&gt;
&lt;p&gt;
By design, null values are not stored for an item's properties in the SharePoint database.
&lt;/p&gt;
&lt;p&gt;
This means that if you use an "OR" condition for several properties, only items with
values for &lt;em&gt;all&lt;/em&gt; properties will be returned. For example, maybe you're trying
to find all "Project" items which belong to a specific industry or have a specific
status. If there are some projects which don't have a value for any one of those properties,
your search will not return them.
&lt;/p&gt;
&lt;p&gt;
Another implication of this situation, is that you cannot find items which have a
property set to null. For example, you're trying to find all items that don't have
a value for a given property - you can't. You can either retrieve all items and then
manually remove those that don't have any value for the property you're searching
for, or you can get all items that have &lt;em&gt;some&lt;/em&gt; value.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, this is a serious limitation and I'm not aware of any workaround for
this yet.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Retrieve an item's content type
&lt;/h3&gt;
&lt;p&gt;
There is a managed property named "ContentType" that you can use to filter the results
by their content type. However, if you want to read their actual content type, you
cannot use the same property.
&lt;/p&gt;
&lt;p&gt;
That's because the managed property "ContentType" is mapped to two crawled properties:
"Basic:5" and "ows_ContentType". Although it works for filtering (i.e. in the WHERE
clause), if you try to read its value, the "ContentType" property will return the
value of the "Basic:5" crawled property.
&lt;/p&gt;
&lt;p&gt;
If you want to retrieve the content type for your results (e.g. for showing them in
a filter), you will need to create a new managed property (e.g. "ItemContentType")
and map it just to the crawled property "ows_ContentType".
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;HTML is stripped from properties (or why PublishingPageImage doesn't work in search)
&lt;/h3&gt;
&lt;p&gt;
Let's say you have news items on your site. As part of a news' content, you use the
default "Page Image" field (internally named "PublishingPageImage") for storing a
news' main image.
&lt;/p&gt;
&lt;p&gt;
In your search results, you want to be able to display the news images right next
to the text summary. You create a new managed property and you map it to the "ows_PublishingPageImage"
crawled property. Now you try to use that property in your search results, but you
notice that the property is always empty. How can this be?
&lt;/p&gt;
&lt;p&gt;
That's because by design SharePoint cannot crawl compound controls. That's a beautiful
way of saying that SharePoint hates you and will strip all HTML markup from the values
of the properties when crawling them. Because the "PublishingPageImage" is entirely
stored as HTML markup (i.e. "&amp;lt;img ..."), nothing comes up in the search.
&lt;/p&gt;
&lt;p&gt;
There is a "simple" workaround for this. If you want to make use of the "PublishingPageImage"
property for your search results, first you'll need to create a new property. This
property will store just the image's path. Secondly, you'll need to create an event
handler. In the handler you will need to define the "ItemUpdated" event, so that each
time an item is updated you will populate the new property you created with the URL
to the image of the "PublishingPageImage" field. After that, just create a new managed
property mapped to your new site column and then use that property in your search
results.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Conclusion
&lt;/h3&gt;
&lt;p&gt;
In this article we covered some trivial and simple things that become a nuissance
when working with the SharePoint search that, although being powerful, also has many
shortcomings in itself.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Resources
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://blog.mastykarz.nl/including-pages-search-scope-sharepoint-web-content-management-solutions/"&gt;Including
Welcome Pages in the search scope in SharePoint Web Content Management solutions&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.devcow.com/blogs/jdattis/archive/2007/12/20/the-contentclass-and-isdocument-properties-along-with-the-welcome-page-caveat.aspx"&gt;The
contentclass and isDocument properties along with the Welcome Page caveat&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://vspug.com/smc750/2007/06/20/custom-cross-list-search-development-pitfalls-part-two/"&gt;Custom
Cross-List Search Development Pitfalls (Part Two)&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.sharepointdev.net/sharepoint--search/fulltext-sql-query-issues-with-null-metadata-properties-36240.shtml"&gt;FullText
SQL Query issues with NULL MetaData Properties&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://treenovum-wss.com/alavpa/Lists/Posts/Post.aspx?List=03d51c71-9fa7-4906-8d8e-0e33ae819454&amp;amp;ID=85"&gt;FullTextSQLQuery
tips&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://sjoere.blogspot.com/2009/12/publishing-image-does-not-get-indexed.html"&gt;Publishing
Image does not get indexed&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/b/jjameson/archive/2009/09/23/no-html-markup-in-moss-2007-managed-properties.aspx"&gt;No
HTML Markup in MOSS 2007 Managed Properties&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://stefan-stanev-sharepoint-blog.blogspot.com/2009/11/sharepoint-search-and-html-meta-tags.html"&gt;SharePoint
Search and HTML Meta tags&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,9d6a22c3-7d4a-42a3-92ae-136a0ad237ac.aspx</comments>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=f9856ff2-2d0d-4daf-877b-0c7f9174d854</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,f9856ff2-2d0d-4daf-877b-0c7f9174d854.aspx</pingback:target>
      <dc:creator>Nuno Freitas</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,f9856ff2-2d0d-4daf-877b-0c7f9174d854.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=f9856ff2-2d0d-4daf-877b-0c7f9174d854</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A strange problem started occuring with the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.webcontrols.richhtmlfield.aspx">RichHtmlField</a>.
When using IE8 in a SharePoint site, after editing a RichHtmlField the second time,
a JavaScript error is thrown in <em>form.js</em> and the user is redirected to the
welcome page of the site.
</p>
        <p>
I'm still not sure what triggered this strange behaviour, if it is something specific
to this site or a general problem. What I found out is that this occurs in IE8.
</p>
        <p>
Here is how to duplicate this issue:
</p>
        <ul>
          <li>
You edit a RichHtmlField (clicking where it says "Edit Content"). 
</li>
          <li>
Then you click somewhere else on the page. 
</li>
          <li>
Now go and edit the same field again.</li>
        </ul>
        <p>
 
</p>
        <p>
If you have the same issue, after doing this, a JavaScript error will be thrown:
</p>
        <blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
          <p>
            <em>Message: 'null' is null or not an object<br />
Line: 2325<br />
Char: 2<br />
Code: 0<br />
URI: (...)/form.js?rev=df60y6YolDjUVbi91%2BZw%2Fg%3D%3D</em>
          </p>
        </blockquote>
        <p>
 
</p>
        <p>
Unfortunately this is not all that happens. After the error, the user will be redirected
to the welcome page of the site where he's at.
</p>
        <p>
It's something that occurs in the <em>form.js</em> file, so I'm not sure if this is
something that can be fixed by configuration.
</p>
        <p>
The workaround I implemented is not entirely pleasant, but it also solves other
issues with default SharePoint installations. Basically what I did was make IE8 render
the site as if it were IE7.
</p>
        <p>
You can do this in several ways. For example, you can put a meta tag in your masterpage:
</p>
        <blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
          <p>
            <em>&lt;meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible" /&gt;</em>
          </p>
        </blockquote>
        <p>
 
</p>
        <p>
Another alternative is to add an HTTP header to the site in IIS with:
</p>
        <blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
          <p>
            <em>X-UA-Compatible: IE=EmulateIE7</em>
          </p>
        </blockquote>
        <p>
 
</p>
        <p>
You can read more about <a href="http://blogs.msdn.com/b/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx">emulating
IE7 for IE8 here</a>.
</p>
      </body>
      <title>A JS error and a redirect occurs when editing a RichHtmlField twice</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,f9856ff2-2d0d-4daf-877b-0c7f9174d854.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/09/03/A+JS+Error+And+A+Redirect+Occurs+When+Editing+A+RichHtmlField+Twice.aspx</link>
      <pubDate>Fri, 03 Sep 2010 08:08:50 GMT</pubDate>
      <description>&lt;p&gt;
A strange problem started occuring with the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.webcontrols.richhtmlfield.aspx"&gt;RichHtmlField&lt;/a&gt;.
When using IE8 in a SharePoint site, after editing a RichHtmlField the second time,
a JavaScript error is thrown in &lt;em&gt;form.js&lt;/em&gt; and the user is redirected to the
welcome page of the site.
&lt;/p&gt;
&lt;p&gt;
I'm still not sure what triggered this strange behaviour, if it is something specific
to this site or a general problem. What I found out is that this occurs in IE8.
&lt;/p&gt;
&lt;p&gt;
Here is how to duplicate this issue:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
You edit a RichHtmlField (clicking where it says "Edit Content"). 
&lt;li&gt;
Then you click somewhere else on the page. 
&lt;li&gt;
Now go and edit the same field again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
If you have the same issue, after doing this, a JavaScript error will be thrown:
&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
&lt;em&gt;Message: 'null' is null or not an object&lt;br&gt;
Line: 2325&lt;br&gt;
Char: 2&lt;br&gt;
Code: 0&lt;br&gt;
URI: (...)/form.js?rev=df60y6YolDjUVbi91%2BZw%2Fg%3D%3D&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Unfortunately this is not all that happens. After the error, the user will be redirected
to the welcome page of the site where he's at.
&lt;/p&gt;
&lt;p&gt;
It's something that occurs in the &lt;em&gt;form.js&lt;/em&gt; file, so I'm not sure if this is
something that can be fixed by configuration.
&lt;/p&gt;
&lt;p&gt;
The workaround I implemented&amp;nbsp;is not entirely pleasant, but it also solves other
issues with default SharePoint installations. Basically what I did was make IE8 render
the site as if it were IE7.
&lt;/p&gt;
&lt;p&gt;
You can do this in several ways. For example, you can put a meta tag in your masterpage:
&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
&lt;em&gt;&amp;lt;meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible" /&amp;gt;&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Another alternative is to add an HTTP header to the site in IIS with:
&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
&lt;em&gt;X-UA-Compatible: IE=EmulateIE7&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
You can read more about &lt;a href="http://blogs.msdn.com/b/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx"&gt;emulating
IE7 for IE8 here&lt;/a&gt;.
&lt;/p&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,f9856ff2-2d0d-4daf-877b-0c7f9174d854.aspx</comments>
      <category>Browsers</category>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=09b2cc50-1d84-403f-8ad8-cd412e5a8e82</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,09b2cc50-1d84-403f-8ad8-cd412e5a8e82.aspx</pingback:target>
      <dc:creator>Nuno Freitas</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,09b2cc50-1d84-403f-8ad8-cd412e5a8e82.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=09b2cc50-1d84-403f-8ad8-cd412e5a8e82</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Sometimes in complex tables with lots of columns you will run into the problem of
the headers being too wide and causing the table to stretch beyond the available width.
One solution is to use vertical text to render the headers.
</p>
        <p>
It is easy to achieve this using images, but by doing so you lose the benefits of
text: selectable, resizable, easier to style and update and easier to dynamically
generate.
</p>
        <p>
With the future CSS <strong>transform</strong> attribute it is possible to rotate
text to become vertical. Current browsers already provide support for this:
</p>
        <blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir="ltr">
          <p>
div.vertical<br />
{<br />
    /* Safari/Chrome */<br />
    -webkit-transform: rotate(-90deg);
</p>
          <p>
    /* Firefox */<br />
    -moz-transform: rotate(-90deg);<br />
 <br />
    /* Opera */<br />
    -o-transform: rotate(-90deg);<br />
}
</p>
        </blockquote>
        <p>
 
</p>
        <p>
For Internet Explorer it is done in a different way:
</p>
        <blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir="ltr">
          <p>
div.vertical<br />
{<br />
    /* Internet Explorer */<br />
    writing-mode: tb-rl;<br />
    filter: flipv fliph;<br />
}
</p>
        </blockquote>
        <p>
 
</p>
        <p>
There are some caveats though. Browsers usually apply the transform at the end, so
we have to take this into account and adjust the width/height accordingly. If you
don't adjust the size, the width/height of the container will be the same as if the
text wasn't rotated.
</p>
        <p>
In the case of a table we will use a div inside each table cell so we have more control
to style the outcome.
</p>
        <blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir="ltr">
          <p>
&lt;table&gt;<br />
    &lt;thead&gt;<br />
        &lt;tr&gt;<br />
            &lt;th class="vertical"&gt;&lt;div
class="vertical"&gt;Really long and complex title 1&lt;/div&gt;&lt;/th&gt;<br />
            &lt;th class="vertical"&gt;&lt;div
class="vertical"&gt;Really long and complex title 2&lt;/div&gt;&lt;/th&gt;<br />
            &lt;th class="vertical"&gt;&lt;div
class="vertical"&gt;Really long and complex title 3&lt;/div&gt;&lt;/th&gt;<br />
        &lt;/tr&gt;<br />
    &lt;/thead&gt;<br />
    &lt;tbody&gt;<br />
        &lt;tr&gt;<br />
            &lt;td&gt;Example&lt;/td&gt;<br />
            &lt;td&gt;a, b,
c&lt;/td&gt;<br />
            &lt;td&gt;1, 2,
3&lt;/td&gt;<br />
        &lt;/tr&gt;<br />
        (...)<br />
    &lt;/tbody&gt;<br />
&lt;/table&gt;
</p>
        </blockquote>
        <p>
 
</p>
        <p>
Due to the differences in rendering between IE and the others browsers we will use
two different stylesheets.
</p>
        <p>
For IE:
</p>
        <blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir="ltr">
          <p>
div.vertical<br />
{<br />
    position: relative;<br />
    height: 210px;<br />
    width: 45px;<br />
    margin-left: 0;<br />
    padding-right: 10px;<br />
    writing-mode: tb-rl;<br />
    filter: flipv fliph;<br />
}
</p>
          <p>
th.vertical<br />
{<br />
    padding-bottom: 10px;<br />
    vertical-align: bottom;<br />
}
</p>
        </blockquote>
        <p>
 
</p>
        <p>
For the other browsers:
</p>
        <blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir="ltr">
          <p>
div.vertical<br />
{<br />
    margin-left: -85px;<br />
    position: absolute;<br />
    width: 210px;<br />
 <br />
    /* Safari/Chrome */<br />
    -webkit-transform: rotate(-90deg);
</p>
          <p>
    /* Firefox */<br />
    -moz-transform: rotate(-90deg);<br />
 <br />
    /* Opera */<br />
    -o-transform: rotate(-90deg);<br />
}
</p>
          <p>
th.vertical<br />
{<br />
    height: 220px;<br />
    line-height: 14px;<br />
    padding-bottom: 20px;<br />
    text-align: left;<br />
}
</p>
        </blockquote>
        <p>
 
</p>
        <p>
Here is a screenshot of the final result:
</p>
        <p>
          <img border="0" src="http://blogs.tamtam.nl/operational-services/content/binary/vertical_text.png" />
        </p>
        <p>
You can download the final code here: <a href="http://blogs.tamtam.nl/operational-services/content/binary/vertical-text.zip">vertical-text.zip
(1,07 KB)</a>.
</p>
PS: If you open the file locally with IE it will display a warning because of the
filter that's being used. You can enable it without problems. That warning is not
displayed if you place the files in a server.</body>
      <title>Vertical text for table headers with CSS</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,09b2cc50-1d84-403f-8ad8-cd412e5a8e82.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/08/06/Vertical+Text+For+Table+Headers+With+CSS.aspx</link>
      <pubDate>Fri, 06 Aug 2010 07:43:08 GMT</pubDate>
      <description>&lt;p&gt;
Sometimes in complex tables with lots of columns you will run into the problem of
the headers being too wide and causing the table to stretch beyond the available width.
One solution is to use vertical text to render the headers.
&lt;/p&gt;
&lt;p&gt;
It is easy to achieve this using images, but by doing so you lose the benefits of
text: selectable, resizable, easier to style and update and easier to dynamically
generate.
&lt;/p&gt;
&lt;p&gt;
With the future CSS &lt;strong&gt;transform&lt;/strong&gt; attribute it is possible to rotate
text to become vertical. Current browsers already provide support for this:
&lt;/p&gt;
&lt;blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
div.vertical&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Safari/Chrome */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -webkit-transform: rotate(-90deg);
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Firefox */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -moz-transform: rotate(-90deg);&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Opera */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -o-transform: rotate(-90deg);&lt;br&gt;
}
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
For Internet Explorer it is done in a different way:
&lt;/p&gt;
&lt;blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
div.vertical&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Internet Explorer */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; writing-mode: tb-rl;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; filter: flipv fliph;&lt;br&gt;
}
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
There are some caveats though. Browsers usually apply the transform at the end, so
we have to take this into account and adjust the width/height accordingly. If you
don't adjust the size, the width/height of the container will be the same as if the
text wasn't rotated.
&lt;/p&gt;
&lt;p&gt;
In the case of a table we will use a div inside each table cell so we have more control
to style the outcome.
&lt;/p&gt;
&lt;blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
&amp;lt;table&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;thead&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th class="vertical"&amp;gt;&amp;lt;div
class="vertical"&amp;gt;Really long and complex title 1&amp;lt;/div&amp;gt;&amp;lt;/th&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th class="vertical"&amp;gt;&amp;lt;div
class="vertical"&amp;gt;Really long and complex title 2&amp;lt;/div&amp;gt;&amp;lt;/th&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th class="vertical"&amp;gt;&amp;lt;div
class="vertical"&amp;gt;Really long and complex title 3&amp;lt;/div&amp;gt;&amp;lt;/th&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/thead&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tbody&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;Example&amp;lt;/td&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;a, b,
c&amp;lt;/td&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;1, 2,
3&amp;lt;/td&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (...)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tbody&amp;gt;&lt;br&gt;
&amp;lt;/table&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Due to the differences in rendering between IE and the others browsers we will use
two different stylesheets.
&lt;/p&gt;
&lt;p&gt;
For IE:
&lt;/p&gt;
&lt;blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
div.vertical&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; position: relative;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 210px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 45px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; margin-left: 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-right: 10px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; writing-mode: tb-rl;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; filter: flipv fliph;&lt;br&gt;
}
&lt;/p&gt;
&lt;p&gt;
th.vertical&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-bottom: 10px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; vertical-align: bottom;&lt;br&gt;
}
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
For the other browsers:
&lt;/p&gt;
&lt;blockquote style="MARGIN-LEFT: 30px; MARGIN-RIGHT: 0px" dir=ltr&gt; 
&lt;p&gt;
div.vertical&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; margin-left: -85px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; position: absolute;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 210px;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Safari/Chrome */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -webkit-transform: rotate(-90deg);
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Firefox */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -moz-transform: rotate(-90deg);&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Opera */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; -o-transform: rotate(-90deg);&lt;br&gt;
}
&lt;/p&gt;
&lt;p&gt;
th.vertical&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 220px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; line-height: 14px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-bottom: 20px;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; text-align: left;&lt;br&gt;
}
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Here is a screenshot of the final result:
&lt;/p&gt;
&lt;p&gt;
&lt;img border=0 src="http://blogs.tamtam.nl/operational-services/content/binary/vertical_text.png"&gt;
&lt;/p&gt;
&lt;p&gt;
You can download the final code here: &lt;a href="http://blogs.tamtam.nl/operational-services/content/binary/vertical-text.zip"&gt;vertical-text.zip
(1,07 KB)&lt;/a&gt;.
&lt;/p&gt;PS: If you open the file locally with IE it will display a warning because of the filter that's being used. You can enable it without problems. That warning is not displayed if you place the files in a server.</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,09b2cc50-1d84-403f-8ad8-cd412e5a8e82.aspx</comments>
      <category>CSS</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=bab7fcf9-365e-4fd2-8194-5cf57f5f53ac</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,bab7fcf9-365e-4fd2-8194-5cf57f5f53ac.aspx</pingback:target>
      <dc:creator>Patrick Steenks</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,bab7fcf9-365e-4fd2-8194-5cf57f5f53ac.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=bab7fcf9-365e-4fd2-8194-5cf57f5f53ac</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img border="0" src="http://blogs.tamtam.nl/operational-services/content/binary/google-analytics-problemen.jpg" />
        <br />
Google Analytics heeft onlangs problemen gehad met hun data verzameling. Hierdoor
kunnen de bezoekersgegevens tussen 24 en 29 juni een vertekend beeld geven. De rapporten
over deze periode kunnen dus wat gegevens missen voor wat betreft de bezoekersaantallen
en campagne informatie.<br /><br />
Google is op dit moment bezig met het verwerken van alle data en verwacht dat de gegevens
weer correct zullen worden weergegeven in de week van 12 juli.<br /><br />
Verder geven ze aan dat de impact kan verschillen tussen verschillende websites. Verwacht
wordt dat vooral grotere website (&gt;1000 bezoekers per dag) problemen hebben ondervonden.<br /><br />
Het volledige bericht van Google, inclusief oprechte excuses van Google, is te vinden
via onderstaande link:<br /><br /><a href="http://analytics.blogspot.com/2010/07/campaign-data-issue-being-corrected.html" title="Problemen met Google Analytics">Lees
meer over de problemen met Google Analytics</a><br /></body>
      <title>Problemen met Google Analytics data</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,bab7fcf9-365e-4fd2-8194-5cf57f5f53ac.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/07/09/Problemen+Met+Google+Analytics+Data.aspx</link>
      <pubDate>Fri, 09 Jul 2010 08:05:02 GMT</pubDate>
      <description>&lt;img border="0" src="http://blogs.tamtam.nl/operational-services/content/binary/google-analytics-problemen.jpg"&gt; 
&lt;br /&gt;
Google Analytics heeft onlangs problemen gehad met hun data verzameling. Hierdoor
kunnen de bezoekersgegevens tussen 24 en 29 juni een vertekend beeld geven. De rapporten
over deze periode kunnen dus wat gegevens missen voor wat betreft de bezoekersaantallen
en campagne informatie.&lt;br /&gt;
&lt;br /&gt;
Google is op dit moment bezig met het verwerken van alle data en verwacht dat de gegevens
weer correct zullen worden weergegeven in de week van 12 juli.&lt;br /&gt;
&lt;br /&gt;
Verder geven ze aan dat de impact kan verschillen tussen verschillende websites. Verwacht
wordt dat vooral grotere website (&gt;1000 bezoekers per dag) problemen hebben ondervonden.&lt;br /&gt;
&lt;br /&gt;
Het volledige bericht van Google, inclusief oprechte excuses van Google, is te vinden
via onderstaande link:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://analytics.blogspot.com/2010/07/campaign-data-issue-being-corrected.html" title="Problemen met Google Analytics"&gt;Lees
meer over de problemen met Google Analytics&lt;/a&gt; 
&lt;br /&gt;
</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,bab7fcf9-365e-4fd2-8194-5cf57f5f53ac.aspx</comments>
      <category>Google Analytics</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=42e3e57c-9235-41b2-aed4-e1fb0fa504fd</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,42e3e57c-9235-41b2-aed4-e1fb0fa504fd.aspx</pingback:target>
      <dc:creator>Patrick Steenks</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,42e3e57c-9235-41b2-aed4-e1fb0fa504fd.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=42e3e57c-9235-41b2-aed4-e1fb0fa504fd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Tegenwoordig zijn nog weinig websites volledig opgemaakt in Flash. Toch zien je nog
regelmatig bepaalde elementen in Flash terugkomen. Bijvoorbeeld een banner, button
of video. Hierbij wil je graag weten hoe je bezoekers omgaan met deze elementen. Hoe
vaak wordt er op geklikt of een andere actie ondernomen? Google Analytics kan je hier
vergaande inzichten in verschaffen.
</p>
        <p>
Er zijn verschillende manieren om je Flash elementen door te meten met behulp van
Google Analytics. Eén en ander hangt ook een beetje af van de Flash versie waarin
het element ontwikkeld is. En de actionscript code die is gebruikt.
</p>
        <h3>Actionscript 2.0
</h3>
        <p>
Binnen Actionscript 2.0 is het mogelijk om <a href="http://www.google.com/support/analytics/bin/answer.py?answer=55520&amp;cbid=-1dx59ajuhbxw2&amp;src=cb">de
_trackPageview functie</a> aan te roepen indien je een actie wilt registreren. Door
middel van het aanroepen van de getURL functie binnen actionscript kan je ervoor zorgen
dat Google Analytics een bepaalde actie in het Flash element trackt. Hieronder een
voorbeeld van het doormeten van een button die naar een bepaalde pagina verwijst.
</p>
        <p>
Stel je hebt een button die naar een volgende pagina binnen je website verwijst. Normaal
gezien zorg je er met de getURL functie voor dat zodra er op de button geklikt wordt
door de bezoeker hij naar de pagina wordt doorverwezen:
</p>
        <p>
          <font face="Courier New">on (release) {<br />
getURL("</font>
          <a href="http://www.google.nl">
            <font face="Courier New">http://www.google.nl</font>
          </a>
          <font face="Courier New">",
"_blank");<br />
}</font>
        </p>
        <p>
Maar stel nu dat je met Google Analytics het aantal kliks op deze button wilt bijhouden.
Normaal gezien zou je dit binnen de HTML inrichten met een onClick event, maar dat
is binnen Flash niet mogelijk. Met de volgende functie wordt het mogelijk om de _trackPageview
functie van Google Analytics te gebruiken én ervoor te zorgen dat de bezoeker ook
doorgeleidt wordt naar de juiste pagina:
</p>
        <p>
          <font face="Courier New">on (release) {<br />
getURL("javascript:pageTracker._trackPageview('/clickthrough/flash-button-google');
window.location = 'http://www.google.nl';", "_blank");<br />
}</font>
        </p>
        <p>
Door de url te vervangen door een javascript code kunnen we zowel de _trackPageview
functie als de redirect functie gebruiken. En dat allemaal binnen Flash. Om te checken
of de functie correct werkt is het nog wel aan te raden om een alert te plaatsen binnen
het javascript.
</p>
        <p>
Voorwaarde voor bovenstaande is wel dat de Google Analytics code binnen de HTML aan
de bovenkant van de pagina wordt geplaatst, of in ieder geval boven het Flash element.
Anders zal Flash de trackPageview functie niet herkennen en het ‘bezoek’ niet registreren.
</p>
        <p>
Hieronder nog een aantal voorbeelden van andere codes die gebruikt kunnen worden.
Naast de _trackPageview functie is het uiteraard ook mogelijk om een _trackEvent in
het Flash bestand te plaatsen.
</p>
        <p>
          <img src="http://blogs.tamtam.nl/operational-services/content/binary/flash-actionscript-example-code.jpg" border="0" />
        </p>
        <h3>Actionscript 3.0
</h3>
        <p>
Door een recente samenwerking tussen Google Analytics en Adobe Flash is het sinds
kort een stuk eenvoudiger geworden om Flash elementen door te meten. Het Google Analytics
for Adobe Flash component zorgt ervoor dat je de Analytics code gemakkelijk in je
Flash bestand kunt gebruiken. Voorbeelden van toepassingen zijn onder andere:
</p>
        <ul>
          <li>
Het meten van een Flash widget op een HTML pagina; 
</li>
          <li>
Een volledige Flash website die wordt gehost op een HTML-pagina; 
</li>
          <li>
Een gedistribueerde Flex/Flash applicatie waar je geen controle hebt over de plaatsing
van de widget.</li>
        </ul>
        <p>
Het Google Analytics component is zowel beschikbaar voor Adobe Flash en Adobe Flex.
Google heeft een uitgebreid overzicht beschikbaar voor het implementeren van het Google
Analytics component. 
</p>
        <p>
Belangrijke randvoorwaarde voor het gebruik van het component is wel dat de Flash
bestanden zijn ontwikkeld met Actionscript 3.0. Anders zal het component niet werken.
</p>
        <h3>Update
</h3>
Een goed punt van <a href="http://twitter.com/waltervos">Walter Vos</a>. Door het
meten van de button met behulp van de pageviews function krijg je last van <a href="http://help.asu.edu/node/1211">inflated
pageviews</a>. Het is daarom beter om buttons door te meten met event tracking. Gelukkig
kan dit ook door een simpele aanpassing van de actionscript code:<br /><br /><font face="Courier New">on (release) {<br />
getURL("javascript:pageTracker._trackEvent('homepage, 'clickthrough', 'flash-button-google');
window.location = 'http://www.google.nl';", "_blank");<br />
}<br /></font><br />
Et voila, geen last meer van inflated pageviews en goede doormeting van buttons in
Flash binnen Analytics.<br /></body>
      <title>Flash meten in Google Analytics</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,42e3e57c-9235-41b2-aed4-e1fb0fa504fd.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/05/21/Flash+Meten+In+Google+Analytics.aspx</link>
      <pubDate>Fri, 21 May 2010 15:07:55 GMT</pubDate>
      <description>&lt;p&gt;
Tegenwoordig zijn nog weinig websites volledig opgemaakt in Flash. Toch zien je nog
regelmatig bepaalde elementen in Flash terugkomen. Bijvoorbeeld een banner, button
of video. Hierbij wil je graag weten hoe je bezoekers omgaan met deze elementen. Hoe
vaak wordt er op geklikt of een andere actie ondernomen? Google Analytics kan je hier
vergaande inzichten in verschaffen.
&lt;/p&gt;
&lt;p&gt;
Er zijn verschillende manieren om je Flash elementen door te meten met behulp van
Google Analytics. Eén en ander hangt ook een beetje af van de Flash versie waarin
het element ontwikkeld is. En de actionscript code die is gebruikt.
&lt;/p&gt;
&lt;h3&gt;Actionscript 2.0
&lt;/h3&gt;
&lt;p&gt;
Binnen Actionscript 2.0 is het mogelijk om &lt;a href="http://www.google.com/support/analytics/bin/answer.py?answer=55520&amp;amp;cbid=-1dx59ajuhbxw2&amp;amp;src=cb"&gt;de
_trackPageview functie&lt;/a&gt; aan te roepen indien je een actie wilt registreren. Door
middel van het aanroepen van de getURL functie binnen actionscript kan je ervoor zorgen
dat Google Analytics een bepaalde actie in het Flash element trackt. Hieronder een
voorbeeld van het doormeten van een button die naar een bepaalde pagina verwijst.
&lt;/p&gt;
&lt;p&gt;
Stel je hebt een button die naar een volgende pagina binnen je website verwijst. Normaal
gezien zorg je er met de getURL functie voor dat zodra er op de button geklikt wordt
door de bezoeker hij naar de pagina wordt doorverwezen:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;on (release) {&lt;br&gt;
getURL("&lt;/font&gt;&lt;a href="http://www.google.nl"&gt;&lt;font face="Courier New"&gt;http://www.google.nl&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;",
"_blank");&lt;br&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Maar stel nu dat je met Google Analytics het aantal kliks op deze button wilt bijhouden.
Normaal gezien zou je dit binnen de HTML inrichten met een onClick event, maar dat
is binnen Flash niet mogelijk. Met de volgende functie wordt het mogelijk om de _trackPageview
functie van Google Analytics te gebruiken én ervoor te zorgen dat de bezoeker ook
doorgeleidt wordt naar de juiste pagina:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;on (release) {&lt;br&gt;
getURL("javascript:pageTracker._trackPageview('/clickthrough/flash-button-google');
window.location = 'http://www.google.nl';", "_blank");&lt;br&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Door de url te vervangen door een javascript code kunnen we zowel de _trackPageview
functie als de redirect functie gebruiken. En dat allemaal binnen Flash. Om te checken
of de functie correct werkt is het nog wel aan te raden om een alert te plaatsen binnen
het javascript.
&lt;/p&gt;
&lt;p&gt;
Voorwaarde voor bovenstaande is wel dat de Google Analytics code binnen de HTML aan
de bovenkant van de pagina wordt geplaatst, of in ieder geval boven het Flash element.
Anders zal Flash de trackPageview functie niet herkennen en het ‘bezoek’ niet registreren.
&lt;/p&gt;
&lt;p&gt;
Hieronder nog een aantal voorbeelden van andere codes die gebruikt kunnen worden.
Naast de _trackPageview functie is het uiteraard ook mogelijk om een _trackEvent in
het Flash bestand te plaatsen.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blogs.tamtam.nl/operational-services/content/binary/flash-actionscript-example-code.jpg" border="0"&gt;
&lt;/p&gt;
&lt;h3&gt;Actionscript 3.0
&lt;/h3&gt;
&lt;p&gt;
Door een recente samenwerking tussen Google Analytics en Adobe Flash is het sinds
kort een stuk eenvoudiger geworden om Flash elementen door te meten. Het Google Analytics
for Adobe Flash component zorgt ervoor dat je de Analytics code gemakkelijk in je
Flash bestand kunt gebruiken. Voorbeelden van toepassingen zijn onder andere:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Het meten van een Flash widget op een HTML pagina; 
&lt;/li&gt;
&lt;li&gt;
Een volledige Flash website die wordt gehost op een HTML-pagina; 
&lt;/li&gt;
&lt;li&gt;
Een gedistribueerde Flex/Flash applicatie waar je geen controle hebt over de plaatsing
van de widget.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Het Google Analytics component is zowel beschikbaar voor Adobe Flash en Adobe Flex.
Google heeft een uitgebreid overzicht beschikbaar voor het implementeren van het Google
Analytics component. 
&lt;/p&gt;
&lt;p&gt;
Belangrijke randvoorwaarde voor het gebruik van het component is wel dat de Flash
bestanden zijn ontwikkeld met Actionscript 3.0. Anders zal het component niet werken.
&lt;/p&gt;
&lt;h3&gt;Update
&lt;/h3&gt;
Een goed punt van &lt;a href="http://twitter.com/waltervos"&gt;Walter Vos&lt;/a&gt;. Door het
meten van de button met behulp van de pageviews function krijg je last van &lt;a href="http://help.asu.edu/node/1211"&gt;inflated
pageviews&lt;/a&gt;. Het is daarom beter om buttons door te meten met event tracking. Gelukkig
kan dit ook door een simpele aanpassing van de actionscript code:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;on (release) {&lt;br&gt;
getURL("javascript:pageTracker._trackEvent('homepage, 'clickthrough', 'flash-button-google');
window.location = 'http://www.google.nl';", "_blank");&lt;br&gt;
}&lt;br&gt;
&lt;/font&gt;
&lt;br&gt;
Et voila, geen last meer van inflated pageviews en goede doormeting van buttons in
Flash binnen Analytics.&lt;br&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,42e3e57c-9235-41b2-aed4-e1fb0fa504fd.aspx</comments>
      <category>Google Analytics</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tamtam.nl/operational-services/Trackback.aspx?guid=bd62b203-80f4-419c-b0fe-c19d145a3fe7</trackback:ping>
      <pingback:server>http://blogs.tamtam.nl/operational-services/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tamtam.nl/operational-services/PermaLink,guid,bd62b203-80f4-419c-b0fe-c19d145a3fe7.aspx</pingback:target>
      <dc:creator>Nuno Freitas</dc:creator>
      <wfw:comment>http://blogs.tamtam.nl/operational-services/CommentView,guid,bd62b203-80f4-419c-b0fe-c19d145a3fe7.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tamtam.nl/operational-services/SyndicationService.asmx/GetEntryCommentsRss?guid=bd62b203-80f4-419c-b0fe-c19d145a3fe7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.getsitedata.aspx">GetSiteData</a> method
allows querying list items across multiple lists and webs. It is extremely useful
because it allows for recursion and searching across the entire Site Collection. It
uses CAML syntax and returns a <strong>DataTable</strong>.
</p>
        <p>
Unfortunately it also contains a known bug in some SharePoint versions, preventing
it from returning all existing results for a given query.
</p>
        <p>
The problem is only visible in some situations, for example, when searching in more
than 10 document libraries, so it might not affect everyone.
</p>
        <p>
The <strong>GetSiteData</strong> method is also used by SharePoint, for example, in
the Content Query Web Part (CQWP). If you're not seeing all expected results from
your CQWP, then it might be because of this.
</p>
        <p>
Microsoft has a KB article with more detailed information about this issue: <a href="http://support.microsoft.com/kb/946484">Search
results are incomplete when you use a CAML query that uses the SPSiteDataQuery class
to search content on a SharePoint Server site or on a Windows SharePoint Services
3.0 site</a>.
</p>
        <p>
Microsoft offers a fix for this in the SharePoint Infrastructure Update of July 15,
2008 (<a href="http://support.microsoft.com/kb/951695/">KB951695</a> for WSS3 and <a href="http://support.microsoft.com/kb/951297">KB951297</a> for
MOSS). This upgrade brings your SharePoint version to 12.0.0.6318, so if you have
an higher version, you already have it.
</p>
        <p>
However, there have been reports by some people that this doesn't completely fix the
issue. You should install it if you're having this problem, though. If it doesn't
work you can try dividing your results in multiple queries.
</p>
        <h3>Related information
</h3>
        <ul>
          <li>
            <a href="http://social.msdn.microsoft.com/Forums/en/sharepointdevelopment/thread/9f337cb2-15c9-4a09-9234-845ec056114b">site.GetSiteData()
query on multiple sharepoint lists does not return all list items of one list</a>
          </li>
          <li>
            <a href="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/30d7fbb5-ba80-4b63-b51f-34593b7c52f9">SPSiteDataQuery
used with GetSiteData method not returning expected results</a>
          </li>
          <li>
            <a href="http://vspug.com/smc750/2007/07/24/spsitedataquery-limited-to-10-document-libraries-or-lists/">SPSiteDataQuery
limited to 10 document libraries or lists</a>
          </li>
        </ul>
        <p>
 
</p>
      </body>
      <title>GetSiteData not returning expected results</title>
      <guid isPermaLink="false">http://blogs.tamtam.nl/operational-services/PermaLink,guid,bd62b203-80f4-419c-b0fe-c19d145a3fe7.aspx</guid>
      <link>http://blogs.tamtam.nl/operational-services/2010/04/16/GetSiteData+Not+Returning+Expected+Results.aspx</link>
      <pubDate>Fri, 16 Apr 2010 14:15:18 GMT</pubDate>
      <description>&lt;p&gt;
The &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.getsitedata.aspx"&gt;GetSiteData&lt;/a&gt; method
allows querying list items across multiple lists and webs. It is extremely useful
because it allows for recursion and searching across the entire Site Collection. It
uses CAML syntax and returns a &lt;strong&gt;DataTable&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Unfortunately it also contains a known bug in some SharePoint versions,&amp;nbsp;preventing
it from returning all existing results for a given query.
&lt;/p&gt;
&lt;p&gt;
The problem is only visible in some situations, for example, when searching in more
than 10 document libraries, so it might not affect everyone.
&lt;/p&gt;
&lt;p&gt;
The &lt;strong&gt;GetSiteData&lt;/strong&gt; method is also used by SharePoint, for example, in
the Content Query Web Part (CQWP). If you're not seeing all expected results from
your CQWP, then it might be because of this.
&lt;/p&gt;
&lt;p&gt;
Microsoft has a KB article with more detailed information about this issue: &lt;a href="http://support.microsoft.com/kb/946484"&gt;Search
results are incomplete when you use a CAML query that uses the SPSiteDataQuery class
to search content on a SharePoint Server site or on a Windows SharePoint Services
3.0 site&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Microsoft offers a fix for this in the SharePoint Infrastructure Update of July 15,
2008 (&lt;a href="http://support.microsoft.com/kb/951695/"&gt;KB951695&lt;/a&gt; for WSS3 and &lt;a href="http://support.microsoft.com/kb/951297"&gt;KB951297&lt;/a&gt; for
MOSS). This upgrade brings your SharePoint version to 12.0.0.6318, so if you have
an higher version, you already have it.
&lt;/p&gt;
&lt;p&gt;
However, there have been reports by some people that this doesn't completely fix the
issue. You should install it if you're&amp;nbsp;having this problem, though. If it doesn't
work you can try dividing your results in multiple queries.
&lt;/p&gt;
&lt;h3&gt;Related information
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://social.msdn.microsoft.com/Forums/en/sharepointdevelopment/thread/9f337cb2-15c9-4a09-9234-845ec056114b"&gt;site.GetSiteData()
query on multiple sharepoint lists does not return all list items of one list&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/30d7fbb5-ba80-4b63-b51f-34593b7c52f9"&gt;SPSiteDataQuery
used with GetSiteData method not returning expected results&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://vspug.com/smc750/2007/07/24/spsitedataquery-limited-to-10-document-libraries-or-lists/"&gt;SPSiteDataQuery
limited to 10 document libraries or lists&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;</description>
      <comments>http://blogs.tamtam.nl/operational-services/CommentView,guid,bd62b203-80f4-419c-b0fe-c19d145a3fe7.aspx</comments>
      <category>SharePoint</category>
    </item>
  </channel>
</rss>
