﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Core :: ClientAPI</title>
    <description>Information and progress on Core ClientAPI functionality.</description>
    <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/BlogId/31/Default.aspx</link>
    <language>en-US</language>
    <managingEditor>jon.henning@dotnetnuke.com</managingEditor>
    <webMaster>admin1@dotnetnuke.com</webMaster>
    <pubDate>Wed, 09 Jul 2008 01:31:37 GMT</pubDate>
    <lastBuildDate>Wed, 09 Jul 2008 01:31:37 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 3.4.0.39853</generator>
    <item>
      <title>Minor Perf Optimization to Caspian Release</title>
      <description>&lt;p&gt;While sitting at the airport waiting for my plane to depart to the &lt;a href="https://www.mvpsummit2008.com/"&gt;MVP Summit&lt;/a&gt;, I decided to spend a little time optimizing the new ClientAPI (codenamed Caspian) for the Cambrian release.&amp;#160; One of the new features for this release was to allow the output of the ClientAPI and Webcontrols to emit compliant markup (more detail mentioned in &lt;a href="http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1532/Default.aspx"&gt;this blog&lt;/a&gt;).&amp;#160; There was two areas that this affected my code.&lt;/p&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1801/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1801/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1801</guid>
      <pubDate>Mon, 14 Apr 2008 06:00:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1801</trackback:ping>
    </item>
    <item>
      <title>Javascript Global Namespaces (the dreaded $ function)</title>
      <description>&lt;p&gt;&lt;em&gt;The whole idea of the $ function and who "owns" that "namespace" has become quite muddy.&amp;#160; When I first learned of the use of $ and found that MS was adopting the same notation, I decided to do it as well.&amp;#160; For at the time, I felt that all frameworks simply used it as a quick way to get the reference to a DOM element.&amp;#160; Soon afterwards I learned that frameworks like prototyle use it for much more.&lt;/em&gt;&lt;/p&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1776/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1776/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1776</guid>
      <pubDate>Mon, 24 Mar 2008 08:00:00 GMT</pubDate>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1776</trackback:ping>
    </item>
    <item>
      <title>We Be 'Tweening</title>
      <description>&lt;p&gt;Ever since version 1.0 of the Solpart menu, it supported animations.  Unfortunately, these animations were specific to IE due to it being the only browser that supported transitions natively.  When I created the DNNMenu I had decided not to go this route, but rather seek out a technique that worked across all browsers.  When I was first reviewing the Atlas bits, there was a portion called Glitz, which I had anticipated would support the animations I was looking for.  Unfortunately, Glitz never became an official part of the framework.  This caused me to research how animations are written that look smooth.  I stumbled upon the concept of &lt;a href="http://en.wikipedia.org/wiki/Tween"&gt;&lt;font face="Verdana" color="#003366" size="2"&gt;Tweens&lt;/font&gt;&lt;/a&gt;, which eventually led me to &lt;a href="http://www.robertpenner.com/easing/penner_chapter7_tweening.pdf"&gt;&lt;font face="Verdana" color="#003366" size="2"&gt;Robert Penner's&lt;/font&gt;&lt;/a&gt; free tweening chapter.  In reviewing it I had decided to try my hand at implementing something similar inside the ClientAPI.  This led to the creation of the dnn.motion namespace.  To demonstrate its functionality have a look at the &lt;a href="http://webcontrols.dotnetnuke.com/samples.net2/default.aspx"&gt;&lt;font face="Verdana" color="#000000" size="2"&gt;new webcontrols site&lt;/font&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Notice how the icons in the header of the page gracefully fall and bounce into position.  This effect is possible thanks to the mathematical formula specified by Mr. Penner.  All a developer has to do to implement it is first register the motion namespace from the server&lt;/p&gt;
&lt;pre&gt;If ClientAPI.BrowserSupportsFunctionality(ClientAPI.ClientFunctionality.Motion) Then
  ClientAPI.RegisterClientReference(Page, ClientAPI.ClientNamespaceReferences.dnn_motion)
End If&lt;/pre&gt;
&lt;p&gt;Then on the client simply tell the animations how to behave with the following code&lt;/p&gt;
&lt;pre&gt;dnn.dom.doTween(id, ctl, 'top', dnn.easing.easeOutBounce, -100, 50, 1);&lt;/pre&gt;
&lt;table class="style1" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td class="style2" bgcolor="#cccccc"&gt;Parameter&lt;/td&gt;
            &lt;td class="style2" bgcolor="#cccccc"&gt;Description&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;id&lt;/td&gt;
            &lt;td&gt;ID to uniquely identify animation.  Useful if you wish to stop or replay the animation&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ctl&lt;/td&gt;
            &lt;td&gt;Control to animate&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;property&lt;/td&gt;
            &lt;td&gt;Property to modify for animation  Valid values are any style name (top, height, etc.) plus cliptop, clipbottom, clipleft, clipright&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;easeFunc&lt;/td&gt;
            &lt;td&gt;Easing equation to use (linearTween, ease[In/Out/InOut]Quad, ease[In/Out/InOut]Cubic, ease[In/Out/InOut]Quart, ease[In/Out/InOut]Quint, ease[In/Out/InOut]Sine, ease[In/Out/InOut]Expo, ease[In/Out/InOut]Circ, ease[In/Out/InOut]Bounce) - if these seem overwhelming, read &lt;a href="http://www.robertpenner.com/easing/penner_chapter7_tweening.pdf"&gt;&lt;font face="Verdana" color="#003366" size="2"&gt;the chapter&lt;/font&gt;&lt;/a&gt;.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;begin&lt;/td&gt;
            &lt;td&gt;starting value for the property (in our sample we start at top=-100&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;finish&lt;/td&gt;
            &lt;td&gt;finishing value for the property (stop at top=50)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;duration&lt;/td&gt;
            &lt;td&gt;number of seconds to run the tween&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;interval&lt;/td&gt;
            &lt;td&gt;(optional) how often animation gets updated (milliseconds).  The lower the number the more smooth but also the more demanding on the CPU (default=10)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;suffix&lt;/td&gt;
            &lt;td&gt;(optional) suffix to append to value (px for example)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;onStartFunc&lt;/td&gt;
            &lt;td&gt;(optional) function to invoke prior to animation&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;onFinishFunc&lt;/td&gt;
            &lt;td&gt;(optional) function to invoke after animation&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Another example of the use of animations can be found in the &lt;a href="http://webcontrols.dotnetnuke.com/samples.net2/ClientAPI/animation.aspx"&gt;animations sample page&lt;/a&gt;.  This sample utilizes the same doTween implementation for the mouse over and out events.  However, when the icon is clicked, it uses a "canned" animation technique to give the appearance of the box sliding out underneath the icon.  This effect is done by combining multiple tweens together.  To invoke these techniques the element being animated must have its positioning specified as absolute. &lt;/p&gt;
&lt;pre&gt;dnn.dom.animate(m_Description, dnn.motion.animationType.Slide, 'right', 1, 1, 
	dnn.motion.easingType.Expo, dnn.motion.easingDir.easeInOut);&lt;/pre&gt;
&lt;table class="style1" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td class="style2" bgcolor="#cccccc"&gt;Parameter&lt;/td&gt;
            &lt;td class="style2" bgcolor="#cccccc"&gt;Description&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ctl&lt;/td&gt;
            &lt;td&gt;Control to animate&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;type&lt;/td&gt;
            &lt;td&gt;[dnn.motion.animationType enumerator] Ttype of animation (Slide, Expand, Diagonal, ReverseDiagonal)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;dir&lt;/td&gt;
            &lt;td&gt;[dnn.motion.animationDir enumerator] direction (up, down, left, right)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;easingType&lt;/td&gt;
            &lt;td&gt;[dnn.motion.easingType enumerator] Type of equation to use (Bounce, Circ, Cubic, Expo, Quad, Quint, Quart, Sine)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;easingDir&lt;/td&gt;
            &lt;td&gt;[dnn.motion.easingDir enumerator] Direction of animation (easeIn, easeOut, easeInOut)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;duration&lt;/td&gt;
            &lt;td&gt; number of seconds to run the animation&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;interval&lt;/td&gt;
            &lt;td&gt;(optional) how often animation gets updated (milliseconds).  The lower the number the more smooth but also the more demanding on the CPU (default=10)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;onStartFunc&lt;/td&gt;
            &lt;td&gt;(optional) function to invoke prior to animation&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;onFinishFunc&lt;/td&gt;
            &lt;td&gt;(optional) function to invoke after animation&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The animate function is utilized by the new DNNMenu and eventually other webcontrols.  The menu on the WebControls sample site currently uses the Slide technique to show and hide the sub-menus.  To apply custom settings when using the control directly, the following markup is used.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;You can play with the different settings allowed for the menu animations on &lt;a href="http://webcontrols.dotnetnuke.com/samples.net2/samples/menuanimation.aspx"&gt;&lt;font face="Verdana" color="#000000" size="2"&gt;this sample page&lt;/font&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In case you are wondering how animations can be applied to the navigation controls within DNN, the current plan is for the Nav skin object to allow access to the these properties through the CustomAttributes collection.&lt;/p&gt;
&lt;pre&gt;&lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;CustomAttributes&lt;/font&gt;&lt;font color="#0000ff"&gt;&gt;&lt;/font&gt;
  &lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;dnn&lt;/font&gt;&lt;font color="#0000ff"&gt;:&lt;/font&gt;&lt;font color="#a31515"&gt;CustomAttribute&lt;/font&gt;&lt;font color="#ff0000"&gt; Name&lt;/font&gt;&lt;font color="#0000ff"&gt;="AnimationType"&lt;/font&gt;&lt;font color="#ff0000"&gt; Value&lt;/font&gt;&lt;font color="#0000ff"&gt;="Slide"/&gt;&lt;/font&gt;
  &lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;dnn&lt;/font&gt;&lt;font color="#0000ff"&gt;:&lt;/font&gt;&lt;font color="#a31515"&gt;CustomAttribute &lt;/font&gt;&lt;font color="#ff0000"&gt;Name&lt;/font&gt;&lt;font color="#0000ff"&gt;="EasingType"&lt;/font&gt;&lt;font color="#ff0000"&gt;Value&lt;/font&gt;&lt;font color="#0000ff"&gt;="Bounce"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&gt;&lt;/font&gt;
  &lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;dnn&lt;/font&gt;&lt;font color="#0000ff"&gt;:&lt;/font&gt;&lt;font color="#a31515"&gt;CustomAttribute&lt;/font&gt;&lt;font color="#ff0000"&gt; Name&lt;/font&gt;&lt;font color="#0000ff"&gt;="EasingDirection"&lt;/font&gt;&lt;font color="#ff0000"&gt;Value&lt;/font&gt;&lt;font color="#0000ff"&gt;="Out"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&gt;&lt;/font&gt;
  &lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;dnn&lt;/font&gt;&lt;font color="#0000ff"&gt;:&lt;/font&gt;&lt;font color="#a31515"&gt;CustomAttribute&lt;/font&gt;&lt;font color="#ff0000"&gt; Name&lt;/font&gt;&lt;font color="#0000ff"&gt;="AnimationLength"&lt;/font&gt;&lt;font color="#ff0000"&gt;Value&lt;/font&gt;&lt;font color="#0000ff"&gt;="1"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&gt;&lt;/font&gt;
  &lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;dnn&lt;/font&gt;&lt;font color="#0000ff"&gt;:&lt;/font&gt;&lt;font color="#a31515"&gt;CustomAttribute&lt;/font&gt;&lt;font color="#ff0000"&gt; Name&lt;/font&gt;&lt;font color="#0000ff"&gt;="AnimationInterval"&lt;/font&gt;&lt;font color="#ff0000"&gt;Value&lt;/font&gt;&lt;font color="#0000ff"&gt;="10"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&gt;&lt;/font&gt;
  &lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;dnn&lt;/font&gt;&lt;font color="#0000ff"&gt;:&lt;/font&gt;&lt;font color="#a31515"&gt;CustomAttribute&lt;/font&gt;&lt;font color="#ff0000"&gt; Name&lt;/font&gt;&lt;font color="#0000ff"&gt;="RenderMode"&lt;/font&gt;&lt;font color="#ff0000"&gt;Value&lt;/font&gt;&lt;font color="#0000ff"&gt;="Normal"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&gt;&lt;/font&gt;
&lt;font color="#0000ff"&gt;&lt;font color="#a31515"&gt;CustomAttributes&lt;/font&gt;&lt;font color="#0000ff"&gt;&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;That's enough information for this blog.  I will be covering this topic briefly, along with a whole lot more of the new features available to the module developer in &lt;a href="http://www.openforce07.com/Conferences/OpenForce07/Sessions/tabid/57/Default.aspx"&gt;my session at OpenForce '07&lt;/a&gt;.. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;Animation-AnimationType&lt;font color="#0000ff"&gt;="Slide"&lt;/font&gt; &lt;font color="#ff0000"&gt;Animation-EasingDirection&lt;/font&gt;&lt;font color="#0000ff"&gt;="Out"&lt;/font&gt; &lt;font color="#ff0000"&gt;Animation-EasingType&lt;/font&gt;&lt;font color="#0000ff"&gt;="Expo"&lt;/font&gt;&lt;/p&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1580/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1580/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1580</guid>
      <pubDate>Fri, 05 Oct 2007 18:05:32 GMT</pubDate>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1580</trackback:ping>
    </item>
    <item>
      <title>Tradeoffs In Script Registration</title>
      <description>&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;One interesting enhancement that the AJAX Control Toolkit team came up with in the latest release is yet &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/06/08/new-asp-net-ajax-control-toolkit-release.aspx"&gt;another way&lt;/a&gt; to register your scripts (ToolkitScriptCombiner).&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Earlier I &lt;a href="http://www.dotnetnuke.com/Projects/CoreClientAPI/tabid/851/EntryID/1238/Default.aspx"&gt;blogged&lt;/a&gt; on the fact that Microsoft can’t seem to make up its mind on how these things should be registered.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;In the Control Toolkit team’s case, it is not bad, as they are inheriting from the ScriptManager, and extending its functionality, so as long as Microsoft keeps with the ScriptManager for script registration, their method &lt;em style="mso-bidi-font-style: normal"&gt;should&lt;/em&gt; work.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;So what did they do, you ask?&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Well, they decided to tackle an issue I have debated for a long time.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;How much should you include in your script?&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;Should it contain everything and affect the initial load time of a page, or should the script be small chunks of code only containing what is necessary to allow the page to function?&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;As with most programming techniques, there is always tradeoffs.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;In the case where you include everything (as the MicrosoftAjax.js file does) you pay a big price (relatively speaking) the first time a visitor hits your page.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;However, after the initial load, the only price you pay is a small request checking to see if the script has been modified.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;In the later case, where you have many small scripts, the initial load only grabs the script necessary, thus making the initial payload smaller.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;However, every load thereafter, needs to make a request verifying the script has not been changed.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;So if you broke your functionality into 10 scripts, each page requested results in no less than 11 requests (1 for the page, and 10 for each js file).&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;em&gt;Note:&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;the same holds true for css and image tags.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;So what is the correct answer?&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;What I came up with for the ClientAPI is a compromise between the two.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;The ClientAPI groups its scripts by functionality (dnn (common functionality), positioning, xml, xmlhttp, diagnostics, and scripts).&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;What the Control Toolkit came up with is a new control that will aggregate all scripts for a given page and send down a single script reference.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;I am not sure what I think of this idea at the moment.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Let me explain my reservations with an example.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Lets say you have 3 scripts A, B, and C.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Lets also say you have 7 pages with the following script references.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font: 7pt "Times New Roman""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Page1 (A)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font: 7pt "Times New Roman""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Page2 (B)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font: 7pt "Times New Roman""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Page3 (C)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font: 7pt "Times New Roman""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Page4 (A,B)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font: 7pt "Times New Roman""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Page5 (B,C)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font: 7pt "Times New Roman""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Page6 (A,B,C)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; text-indent: -0.25in; mso-list: l0 level1 lfo1"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font: 7pt "Times New Roman""&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Page7 (A,C)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;As noted above, the initial page load is the most costly, since it needs to download the scripts content.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;In the scenario above (made a little extreme to demonstrate my point), you would have 7 initial script loads.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Whereas, if you kept the 3 scripts separate, you would have only 3 initial page loads.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;After the initial load you would only have one, which is as good as having a single file, but I’m not sure that the cost of the 7 initial loads outweighs the cost of having a single large load.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;I guess it is up to the page developer to determine where he or she places their emphasis.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Now is also probably a good time to briefly talk about resource files, as they are coming soon to the ClientAPI.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Embedding your resource files in a dll has one main advantage.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;It guarantees your server-side code is in sync with your client side code, thus easing the distribution and maintenance of your codebase.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;The disadvantage of course, is that resource files are processed by the ASP.NET process, thus increasing the workload of your webserver (however small).&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;I believe that the Control Toolkit team has a switch allowing the use of resource files or not, but I am assuming that if you don’t use them you don’t get the script aggregation functionality.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Similarly, the ClientAPI will allow the toggling of the use of resource files via the ClientAPICaps.config file.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&lt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: "Courier New"; mso-no-proof: yes"&gt;functionality&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="font-size: 8pt; color: red; font-family: "Courier New"; mso-no-proof: yes"&gt;nm&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: "Courier New"; mso-no-proof: yes"&gt;"&lt;span style="color: blue"&gt;UseExternalScripts&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;desc&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Determines if ClientAPI should use an embedded resource or external script files&lt;/span&gt;"&lt;span style="color: blue"&gt;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: "Courier New"; mso-no-proof: yes"&gt;supports&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;&lt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: "Courier New"; mso-no-proof: yes"&gt;browser&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span style="font-size: 8pt; color: red; font-family: "Courier New"; mso-no-proof: yes"&gt;nm&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: "Courier New"; mso-no-proof: yes"&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;"&lt;span style="color: blue"&gt; /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: "Courier New"; mso-no-proof: yes"&gt;supports&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: "Courier New"; mso-no-proof: yes"&gt;excludes&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: "Courier New"; mso-no-proof: yes"&gt;excludes&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: "Courier New"; mso-no-proof: yes"&gt;functionality&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: "Courier New"; mso-no-proof: yes"&gt;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;font face="Calibri" size="3"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;If using an embedded resource, how the dll is compiled will determine what version of the scripts will be sent down (compressed for Release, developer for Debug).&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;The MSBuild file for the ClientAPI will also generate both sets of external js files, by default placing the debug versions of the script files in a subfolder.&lt;/font&gt;&lt;/p&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1469/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1469/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1469</guid>
      <pubDate>Fri, 15 Jun 2007 12:55:56 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1469</trackback:ping>
    </item>
    <item>
      <title>The ClientAPI Integrates ASP.NET AJAX Extensions</title>
      <description>&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;I have finished the initial conversion of the DotNetNuke WebUtility (ClientAPI) project to utilize the Microsoft ASP.NET AJAX Extension framework.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;This has several advantages and one major disadvantage.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;The disadvantage is that upgrading to it will &lt;strong&gt;&lt;u&gt;require&lt;/u&gt;&lt;/strong&gt; Microsoft ASP.NET AJAX extensions (System.Web.Extensions.dll) to be installed.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;I do not have the time, nor do I think it worth the effort, to provide an optional install.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Technically, since the current implementation does not require the extensions and the new one does, I do have an optional install.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;So I guess all this means is that if any enhancements or bugs are going to be added, only the code supporting the extensions will be upgraded (unless it is considered a major fix).&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;There has been no timeline set as of the writing of this blog as to when this will be integrated into the core.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Obviously, it cannot be integrated until we can make the same constraint of requiring the extensions to exist.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;When I &lt;a href="http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/49/Default.aspx"&gt;first heard about Atlas&lt;/a&gt; (Microsoft ASP.NET AJAX Extensions) I had an idea on how the ClientAPI and Atlas were going to fit together.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;I had envisioned the ClientAPI to simply be an extension to Atlas.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;The areas where the logic overlapped I would simply delegate the task to Atlas, and there would be no break in compatibility.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Examples of this include the ClientAPI’s &lt;/font&gt;&lt;span style="font-family: " courier=""&gt;createDelegate&lt;/span&gt;&lt;font face="Calibri"&gt;, &lt;/font&gt;&lt;span style="font-family: " courier=""&gt;getCurrentStyle&lt;/span&gt;&lt;font face="Calibri"&gt;, and &lt;/font&gt;&lt;span style="font-family: " courier=""&gt;getById&lt;/span&gt;&lt;font face="Calibri"&gt; methods.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;createDelegate: &lt;span style="color: blue"&gt;function&lt;/span&gt;(oThis, pFunc) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; Function.createDelegate(oThis, pFunc);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;span style="color: green"&gt;//return function() {pFunc.apply(oThis, arguments);};&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;},&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;getById: &lt;span style="color: blue"&gt;function&lt;/span&gt;(sID, oCtl)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; $get(sID, oCtl);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;span style="color: green"&gt;/*if (oCtl == null)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;oCtl = document;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;if (oCtl.getElementById)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;return oCtl.getElementById(sID);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;else if (oCtl.all)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;return oCtl.all(sID);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;return null;*/&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;},&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;getCurrentStyle: &lt;span style="color: blue"&gt;function&lt;/span&gt;(oNode, prop) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; oStyle = Sys.UI.DomElement._getCurrentStyle(oNode);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; oStyle[prop];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&lt;span style="color: green"&gt;/*&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;if (document.defaultView) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;if (oNode.nodeType != oNode.ELEMENT_NODE) return null;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;return document.defaultView.getComputedStyle(oNode,'').getPropertyValue(prop.split('-').join(''));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;if (oNode.currentStyle) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;return oNode.currentStyle[prop.split('-').join('')];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;if (oNode.style) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 2"&gt;              &lt;/span&gt;return oNode.style.getAttribute(prop.split('-').join(''));&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;// We need to get rid of slashes&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;return null;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier=""&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;*/&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: " courier=""&gt;},&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;font face="Calibri" size="3"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;Where the ClientAPI logic is commented out and the delegating of the task is using Atlas.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;As I began to do my conversion I ran into quite a few scenarios where if I did this delegation, I would lose functionality.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;For example, my client-side browser detection logic handles Internet Explorer, MacIE, Netscape, Mozilla (FireFox), Opera, Safari, and Konqueror.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Atlas on the other hand only detects Internet Explorer, FireFox, Safari, and Opera.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;This is primarily due to the fact that it only supports these browsers.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;There are quite a few routines in the ClientAPI that do different things on a per-browser basis (which is also true of Atlas).&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;If these routines delegated their work to Atlas, they would lose functionality.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;This has led me to the decision of only delegating off work when no compatibility is lost and recommending to the community to only use the ClientAPI with these methods when you need to.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Otherwise, call the Atlas methods directly.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;I am running short on time these days.  I plan on posting more information on this subject soon.  I also plan on releasing a Community Technology Preview (CTP) to a limited set of users to help me test out the new ClientAPI integration with the ASP.NET Extensions and hopefully iron out any bugs while we wait for broader adoption of the ASP.NET Extensions.  In the meantime, I figured some of you may be interested in the size differences between the original ClientAPI files, and the newly converted then compressed (like the control toolkit does) files.&lt;/font&gt;&lt;/p&gt;
&lt;table class="MsoTableGrid" style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing="0" cellpadding="0" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; background: #d9d9d9; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-background-themecolor: background1; mso-background-themeshade: 217" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;Script Name&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; background: #d9d9d9; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;Original Size (bytes)&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; background: #d9d9d9; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;Compressed &lt;/font&gt;&lt;/p&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;Size (bytes)&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; background: #d9d9d9; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1" valign="top" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;Percent &lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 1"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;29,261&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;19,856&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;32%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 2"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.dom.positioning.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;11,433&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;8,439&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;26%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 3"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.xml.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;7,810&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;4,857&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;38%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 4"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.xml.jsparser.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;7,204&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;4,909&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;32%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 5"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.xmlhttp.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;6,429&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;4,015&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;38%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 6"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.xmlhttp.jsxmlhttprequest.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;2,555&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;2,102&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;18%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 7"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.scripts.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;1,658&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;1,243&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;25%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 8"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.util.tablereorder.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;3,757&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;3,047&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;19%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr style="mso-yfti-irow: 9; mso-yfti-lastrow: yes"&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: black 1pt solid; width: 154.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign="top" width="206"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal"&gt;&lt;font face="Calibri" size="3"&gt;dnn.diagnostics.js&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 66.7pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="89"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;5,729&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 76.5pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="top" width="102"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: right" align="right"&gt;&lt;font face="Calibri" size="3"&gt;4,064&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #e0dfe3; padding-left: 5.4pt; padding-bottom: 0in; border-left: #e0dfe3; width: 45.4pt; padding-top: 0in; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign="bottom" width="61"&gt;
            &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; text-align: center" align="center"&gt;&lt;span style="color: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;29%&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;font face="Calibri" size="3"&gt; &lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1463/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1463/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1463</guid>
      <pubDate>Fri, 15 Jun 2007 12:49:16 GMT</pubDate>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1463</trackback:ping>
    </item>
    <item>
      <title>Compatibility Between Javascript Frameworks</title>
      <description>&lt;div&gt;
&lt;p&gt;I will be releasing the next point release of DotNetNuke WebControls (v1.5.3) shortly.  There are a couple reasons for this.  First, it was detected by some users that the currently released version with DNN 4.5 was compiled in Debug mode, thus affecting performance a little.  The second, and primary reason is due to our desire to &lt;em&gt;try&lt;/em&gt; (emphasis on this word) and maintain compatibility with other AJAX frameworks.  In this case we are talking about &lt;a href="http://www.prototypejs.org/"&gt;prototype&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To explain the compatibility issue, it may help to think of what the new LINQ functionality offers and how it works.   It utilizes a new technique called &lt;a target="_blank" onclick="return top.js.OpenExtLink(window,event,this)" href="http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx"&gt;&lt;font color="#0000cc"&gt;Extension Methods&lt;/font&gt;&lt;/a&gt;.  This allows for new methods to be attached to any object (In LINQ's case it is IEnumerable).  LINQ will only attach these methods if the namespace is imported.  Javascript is pretty much the same.  Inside javascript there are a few native objects (string, number, array, date).  Some js frameworks like prototype decide to add their own custom methods to these objects (when imported or referenced).  This starts to cause compatibility problems when new methods get added to these underlying objects.  The specific case here has to do with the Array object.  In some of my code I use an array without indexes (like a hashtable).  Lets say we have the following array defined.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&lt;font face="Courier New"&gt; var myarray = new Array();&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font face="Courier New"&gt; myarray['bob'] = 1;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font face="Courier New"&gt; myarray['joe'] = 2;&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;To enumerate it I use the following script&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;for (var sKey in myarray)&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The only values obtained from the array and placed in the sKey variable should be &lt;font face="Courier New"&gt;bob&lt;/font&gt; and &lt;font face="Courier New"&gt;joe&lt;/font&gt;.   However, if the Array object was extended, this will unfortunately contain the newly added functions.  To get around this a check was inserted into some of the js scripts&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span class="q"&gt;
&lt;div&gt;&lt;font face="Courier New" size="2"&gt;  if( typeof sKey is "function" )&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font face="Courier New" size="2"&gt;    continue;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;/span&gt;
&lt;div&gt;&lt;font size="2"&gt;While extension methods are very powerful, it is one of those things that should be used with care.  Especially if a user anticipates multiple frameworks co-existing.  &lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;font size="2"&gt;This fixes the current issue, but I think it is worth discussing a much larger issue.  The ClientAPI has taken care to expose a minimal surface area it can affect.  For the most part the only thing it "owns" is the &lt;font face="Courier New"&gt;dnn&lt;/font&gt; and &lt;font face="Courier New"&gt;dnncore&lt;/font&gt; namespaces (and everything under it).  The one exception to this is the $ function (which I regret, see &lt;a target="_blank" onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/76/threadid/108457/scope/posts/Default.aspx"&gt;&lt;font color="#0000cc"&gt;here&lt;/font&gt;&lt;/a&gt;).  Other frameworks have taken a much more liberal approach to what they try to "own".  Its one thing for my framework to have to trap for this enumarator's case, but what happens if I want to extend Array as well, and what happens if I choose a function name that conflicts with one or more frameworks and is a little different in its implementation that the others? &lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;font size="2"&gt;The answer, is random chaos.  Whichever framework's js is registered last will "win". &lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1399/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1399/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1399</guid>
      <pubDate>Sat, 14 Apr 2007 02:00:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1399</trackback:ping>
    </item>
    <item>
      <title>Client-Side Personalization - A Sneak Peek At 4.5.0</title>
      <description>&lt;p&gt;Being able to retrieve and set personalization values on the client is a new feature that DNN will support for version 4.5.  Since personalization is something specific to DNN, the code will reside in the DNN specific ClientAPI files of dnncore.js and DNNClientAPI (ClientAPI.vb).  The current state of the dnncore.js is such that it does not utilize namespaces.  Instead it prefixes all function names with __dnn_.  Module developers use these client-side functions when they are calling server-side methods like &lt;font face="Courier New"&gt;AddBodyOnloadEventHandler&lt;/font&gt; and &lt;font face="Courier New"&gt;EnableMinMax&lt;/font&gt;, but they are not intended to be used directly from the client.  Since we now wish to expose client-side methods for setting and obtaining personalization values, the creation on a new namespace is in order.&lt;br /&gt;
The name of this namespace will be dnncore.  To start out, it will only support personalization methods, but eventually the entire set of dnncore functions will be encapsulated.&lt;/p&gt;
&lt;p&gt;Since the core is in the process of adapting the MS AJAX framework, I have decided to start following some of their naming standards, specifially, denoting a method is meant to be private by the prefixing of an _ (underscore).&lt;/p&gt;
&lt;p&gt;The first two methods of dnncore that are not private are &lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;dnncore.getUserProp(sNameCtr, sKey, pFunc)&lt;br /&gt;
dnncore.setUserProp(sNameCtr, sKey, sVal, pFunc)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sNameCtr&lt;/strong&gt; - The concept of the naming container serves a similar function to namespaces in our js and .NET code.  It enables our keys to be unique between our modules.  &lt;br /&gt;
&lt;strong&gt;sKey&lt;/strong&gt; - The key parameter should also be self explanitory.  It is the property name we are setting or retrieving.&lt;br /&gt;
&lt;strong&gt;sVal&lt;/strong&gt; - The setUserProp obviously needs to pass a value to assign.  &lt;br /&gt;
&lt;strong&gt;pFunc&lt;/strong&gt; - pointer to function to invoke with results from our async callback.&lt;/p&gt;
&lt;p&gt;Pesonalization has existed in the DNN Framework for a long time.  Therefore, most of these parameters should be easy to understand.  The one exception to this is the &lt;font face="Courier New"&gt;pFunc&lt;/font&gt; parameter.  To explain this it is important to remember is what the first A in AJAX stands for.  Thats right, Asynchronous!  Javascript is a single threaded environment.  There is no way to do some sort of looping structure with something like DoEvents (VB) while we wait for a result.  Some of you are probably saying that the XMLHTTP object that the MS and Mozilla/FireFox offer has a property that allows for async to be true or false.  Additionally, the method the ClientAPI exposes has a parameter for async.  What gives?&lt;br /&gt;
Causing javascript to execute a synchronous request to the serer is not a good idea, for it will make the browser appear to be locked up.  Additonally, support for browsers that do not have their own XMLHTTP object would be impossible.  Most AJAX frameworks utilize the hidden IFrame method to utilize postbacks for these browsers.  As you know, the requesting of a webpage is certainly not synchronous.&lt;/p&gt;
&lt;p&gt;So how do you obtain a value?  &lt;/p&gt;
&lt;p&gt;Code similar to this can be used.&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;function getUserSettings()&lt;br /&gt;
{&lt;br /&gt;
    dnncore.getUserProp('MyModule', 'backgroundColor', setValue);&lt;br /&gt;
    dnncore.getUserProp('MyModule', 'color', setValue);&lt;br /&gt;
}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;function setValue(sNameCtr, sKey, sVal)&lt;br /&gt;
{&lt;br /&gt;
    $('mytextbox').style[sKey] = sVal;&lt;br /&gt;
}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;function setUserSettings()&lt;br /&gt;
{&lt;br /&gt;
    dnncore.setUserProp('MyModule', 'backgroundColor', 'yellow');&lt;br /&gt;
    dnncore.setUserProp('MyModule', 'color', 'blue');&lt;br /&gt;
}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Some of you may be asking, since this is just javascript, how can I be sure that users don't obtain any personalization value they want?  Or, how can I stop them from putting a bunch of junk in these tables, thus bloating my database?&lt;/p&gt;
&lt;p&gt;Both of these are legitimate concerns.  The first, however, depends on what module developers are storing in the user's personalization.  Most likely, these are simple settings the user already knows about.  The second, is a bigger concern, and therefore something needs to be done to limit what values can be inserted.  To address both concerns, the DNNClientAPI class now has a method that needs to be used to enable a personalization property to be both set and retrieved.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;font face="Courier New"&gt;EnableClientPersonalization(ByVal strNamingContainer As String, ByVal strKey As String, ByVal objPage As Page) As Boolean&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;strNamingContainer&lt;/strong&gt; - personalization naming container&lt;br /&gt;
&lt;strong&gt;strKey&lt;/strong&gt; - personalization key&lt;br /&gt;
&lt;strong&gt;objPage&lt;/strong&gt; - page being rendered (handles callback)&lt;br /&gt;
&lt;strong&gt;ReturnValue&lt;/strong&gt; - Returns True when browser supports client-side personalization.  If this returns false, it is your responsibility to ensure that your code still functions, most likely with postbacks.&lt;/p&gt;
&lt;p&gt;The core has supported the &lt;font face="Courier New"&gt;EnableMinMax&lt;/font&gt; method for a long time now.  One of the parameters going into this method is &lt;font face="Courier New"&gt;PersonaliztionType&lt;/font&gt;.  The supported types consisted of:  &lt;font face="Courier New"&gt;None&lt;/font&gt;, &lt;font face="Courier New"&gt;Page&lt;/font&gt;, and &lt;font face="Courier New"&gt;Cookie&lt;/font&gt;.  A new type has been added to support persisting to Personalization.  Support for this requires an additional overloads to be added to allow the developer to pass in the NamingContainer and Key for personalization.&lt;/p&gt;
&lt;p&gt;In addition to module developers having another cool tool in their toolbox, the core has also utilized this feature.  The newly updated control panel currently has min/max capability, that persists between page requests.  This is now persisting with the new overloaded &lt;font face="Courier New"&gt;EnableMinMax&lt;/font&gt;.&lt;/p&gt;
&lt;font size="3"&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;DotNetNuke.UI.Utilities.DNNClientAPI.EnableMinMax(imgVisibility, rowControlPanel, Not IsVisible, Common.Globals.ApplicationPath &amp; "/images/min.gif", _&lt;br /&gt;
 Common.Globals.ApplicationPath &amp; "/images/max.gif", DNNClientAPI.MinMaxPersistanceType.Personalization, "Usability", "ControlPanelVisible" &amp; Me.PortalSettings.PortalId.ToString)&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1325/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1325/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1325</guid>
      <pubDate>Fri, 02 Mar 2007 15:10:00 GMT</pubDate>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1325</trackback:ping>
    </item>
    <item>
      <title>Adventures In Script Registration</title>
      <description>&lt;div&gt;Before I get into the reason for the article I wanted to wish everyone a Happy New Year!  I have been very busy the past couple months on the next version of the ClientAPI and WebControls and am getting anxious about publishing my work.  However, I am going to need a couple weeks to gather my work up again after the long holiday and polish it off a bit.  In the meantime I wanted to give a quick bit of history regarding my decision in how to obtain what scripts need to be registered during a partial rendering event.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;hr /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;In version 1.0 of the framework we were blessed (sarcasm) with the use of a HybridDictionary to hold our page's registered scripts. This had the unfortunate side-effect that after 9 scripts were registered the order they were emitted to the browser was random.  (If you ever looked at the ClientAPI’s js files you will see a lot of extra work at the end of each file that is necessary to work around this issue.)&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;In .NET 2.0 Microsoft finally removed the HybridDictionary, and decided to do away with the normal way of registering scripts (on the Page object) and introduced a new object, the ClientScriptManager.  The unfortunate thing about the newly redesigned object is they offered no way to obtain a list of scripts that are registered.  Initially, the Atlas team at Microsoft decided to work around this issue for their UpdatePanel by writing "&lt;a href="http://forums.asp.net/thread/1440058.aspx"&gt;extremely hacky parsing work&lt;/a&gt;".  At the time &lt;a href="http://www.dotnetnuke.com/DotNetNukeProjects/CoreWebControls/tabid/873/EntryID/1179/Default.aspx"&gt;I found&lt;/a&gt; writing a routine to parse the page output looking for script tags hacky as well (and I still do).&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Apparently the Atlas team could not convince the Framework team to make the script collection accessible in the upcoming SP1 (pure speculation on my part), so they decided to invent yet another object used to render client scripts (ScriptManager).  This allowed them to do away with their hacky parsing logic.  I am beginning to think this whole adventure in script registration is looking similar to my adventures in data access objects over the past decade (DAO, RDO, ADO, ADO.NET, etc...)  &lt;img alt="" src="/Providers/HtmlEditorProviders/FckHtmlEditorProvider/FCKeditor/editor/images/smiley/msn/regular_smile.gif" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Personally, I feel that it would have been much better for SP1 to simply expose the script collection in a readonly manner (if necessary).  However, I am sure there are some good reasons they have not done so.  Requiring control vendors to change their code to detect the &lt;a href="http://weblogs.asp.net/leftslipper/archive/2006/11/13/HOWTO_3A00_-Write-controls-compatible-with-UpdatePanel-without-linking-to-the-ASP.NET-AJAX-DLL.aspx"&gt;presence of certain objects via reflection&lt;/a&gt; in order to figure out which register script method to call is a major hack IMO.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;So what does this have to do with the ClientAPI?  Well, in dealing with partial rendering for the DNNTabStrip I need to determine if a partially rendered tab needs to send down new script.  While I could have gone the Atlas route and came up with my own script object that other control vendors would need to detect and use if present, I am not naive enough to think that I could pull that off.  Microsoft may have the backing to pull something like this off, but I know I don't. I could have tied into the Atlas script manager, but at this point I do not want to marry my library with theirs. Perhaps in a couple months I may consider it, after the widespread adoption of SP1.  However, you need to remember that I am still supporting .NET 1.x at the time of the writing. Another option would be to hack into the script collection via reflection. In case you are unaware, you can access private variables in your code using reflection. This, however, is not advisable, as Microsoft may change the underlying objects names at any time without breaking compatibility. &lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;So the only option left to me was to write my own "hacky script parser".  Being that I am new to regular expressions I feel this may prove to be a weakness in my implementation.  However, I do have confidence that given some help, I will be able to work through these issues.  My current expression to parse arbitrary html looks as follows.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font face="Courier New"&gt;(?i:&lt;br /&gt;
 (?:&lt;&lt;br /&gt;
  (?&lt;element&gt;[^/ &gt;]+)&lt;br /&gt;
  (?:\s(?!/)+&lt;br /&gt;
  (?:&lt;br /&gt;
   (?&lt;attr&gt;[^=]+)&lt;br /&gt;
   =(?:"|')&lt;br /&gt;
   (?&lt;attrv&gt;[^"\']+)&lt;br /&gt;
   (?:"|')&lt;br /&gt;
  ))*&lt;br /&gt;
  )&lt;br /&gt;
 (?:&lt;br /&gt;
  [^/]*/&gt;&lt;br /&gt;
  |&lt;br /&gt;
  [^/]{0}&gt;&lt;br /&gt;
   (?&lt;text&gt;[^&lt;]*)&lt;br /&gt;
  (?&lt;close&gt;&lt;/\k&lt;element&gt;&gt;+)&lt;br /&gt;
 )&lt;br /&gt;
)&lt;br /&gt;
&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
If you are one of the fortunate programmers out there blessed with the ability to read these expressions easily, please have a look and let me know if I can improve it.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt; &lt;/div&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1238/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1238/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1238</guid>
      <pubDate>Thu, 04 Jan 2007 04:00:00 GMT</pubDate>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1238</trackback:ping>
    </item>
    <item>
      <title>Open-Source Javascript Editor</title>
      <description>&lt;P&gt;Back in 2004 when I was creating the ClientAPI I spent some time trying to find the best way to edit javascript, with hopes that I would find a solution that offered &lt;A href="http://en.wikipedia.org/wiki/IntelliSense"&gt;&lt;U&gt;IntelliSense™&lt;/U&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;and an easy means to document it.  Having found neither I decided to create my own console app to transform an XML file &lt;A href="http://webcontrols.dotnetnuke.com/js/clientapitests/"&gt;&lt;U&gt;into documentation&lt;/U&gt;&lt;/A&gt;.  While this is a starting point, it sure is a far-cry from the in-line IntelliSense™ documentation we as developers have become accustomed to.&lt;/P&gt;
&lt;P&gt;A couple days ago I was reading &lt;A href="http://west-wind.com/weblog/posts/7380.aspx"&gt;&lt;U&gt;one of the blogs&lt;/U&gt;&lt;/A&gt; I subscribe to that discussed javascript editors.  The first response to that blog was for an open-source project called &lt;A href="http://www.aptana.com/"&gt;&lt;U&gt;Aptana&lt;/U&gt;&lt;/A&gt;.  I decided to download it, in hopes that it would provide me a much better javascript editing experience than what is currently offered by Visual Studio.&lt;/P&gt;
&lt;P&gt;I must admit that my first impression was one of confusion, for the product uses different terminology than I am accustomed to (namely perspectives).  However, seeing that my main goal was to get IntelliSense™ (they call it Code Assist) to work, I decided to simply focus on what was necessary to accomplish this.  It proved to be quite easy.  Simply drag the js files you wish to take part in Code Assist to the Code Assist Profiles window and your editor now offers fairly accurate IntelliSense™ for the entire ClientAPI.&lt;/P&gt;
&lt;P&gt;
&lt;P&gt;&lt;IMG height=322 alt=ClientAPI_Aptana.gif src="/Portals/25/CoreTeam/ClientAPI_Aptana.gif" width=678 border=0&gt;&lt;/P&gt;
&lt;P&gt;This editor seems to offer other features I am quite interested in, namely the ability to document the api, have it show up in Code Assist and provide some sort of HTML documentation.  I assume there is a way to strip out the documentation comments as well, along with being able to reliably compress the javascript.  I wish I had more time to tinker with this, but there is way too many other things I need to get done first.  If anyone has some free cycles to play with these features, don’t hesitate to send me an email with some of your findings.   &lt;/P&gt;</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1130/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/1130/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=1130</guid>
      <pubDate>Mon, 18 Sep 2006 20:30:00 GMT</pubDate>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=1130</trackback:ping>
    </item>
    <item>
      <title>Client Side Reordering</title>
      <description>A couple months back the core team was going over some of the excellent enhancements Charles was working on for the 3.3/4.1 release.  One of those pages offered the ability to customize the user properties, including the order in which they were displayed.  The traditional method for reordering a list was implemented, meaning the use of postbacks.  I was tasked with coming up with a better way to accomplish this without requiring postbacks.</description>
      <link>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/433/Default.aspx</link>
      <author>jon.henning@dotnetnuke.com</author>
      <comments>http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/433/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dotnetnuke.com/Default.aspx?tabid=825&amp;EntryID=433</guid>
      <pubDate>Wed, 24 May 2006 12:00:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.dotnetnuke.com/DesktopModules/Blog/Trackback.aspx?id=433</trackback:ping>
    </item>
  </channel>
</rss>