<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/" xmlns:l="http://purl.org/rss/1.0/modules/link/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
 <!-- Generated by Ektron CMS400.NET -->
 <channel rdf:about="http://www.skonet.com/Resources/Articles/Read.aspx?blogid=91">
  <title>Articles</title>
  <link>http://www.skonet.com/Resources/Articles/Read.aspx?blogid=91</link>
  <description></description>
  <dc:date>2012-05-19T22:56:29Z</dc:date>
  <dc:language>en-US</dc:language>
  <items>
   <rdf:Seq>
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Facebook_Removes_App_Profile_Pages.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Reserved_Files_and_Folders.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Use_Entity_Framework_4_With_Visual_Studio_2010_and_SQL_Server_2000.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/System_Uri_Properties_Reflection.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Collection_of_Quick_Tool_Javascript_Bookmarklets.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/ASP_NET_Implementation_of_the_Google_GeoChart_Visualization_Tools_and_APIs.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/No_Items_Exist_In_The_List_When_Defining_Custom_Data_Lists_In_Content.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Disable_The_Windows_Shutdown_Event_Tracker.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Change_the_Default_Height_of_the_Catalog_Entry_Editor_Window_in_Ektron_CMS400_Net.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/The_Controls_Collection_Cannot_Be_Modified_Because_The_Control_Contains_Code_Blocks.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Access_to_the_path_FileListAbsolute_txt_is_Denied_Error.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Configure_ASP_NET_Unit_Tests_in_Visual_Studio_2010.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Implement_a_Google_Custom_Search_Engine_on_an_ASP_NET_Based_Website.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Fixing_That_Annoying__Attach_Security_Warning__Message_on_Windows_7.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Robocopy_Job_Template.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Search_Engine_Optimization_Reference.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Visio_Macro_To_List_Document_Tabs.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Helpful_Sql_Scripts_for_Ektron_CMS_400_Net.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Programmatically_Enable_ThickBox_Functionality_in_Ektron_CMS_400_Net.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/CMS400-Plugin_Event_Log_Errors.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/TortoiseSVN_Global_Ignore_Pattern.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Shrink_or_Clear_Out_Large_SQL_Server_Log_Files.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Enable_Aliases_With_Localized_Content.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Online_Project_Management_Systems.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Purge_Content_and_Asset_History_Utility.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Run_IIS_and_Apache_on_the_Same_Machine.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_NET_Helper_Utilities.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Search.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_eSync.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_eSync_Error_Generating_Security_Certificates.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_eSync_Failing_With_Faulted_State_Error_Message.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_Upgrade_on_Replicated_SQL_Server_Instance.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Progressive_Solution_for_Handling_Browsers_That_Have_Disabled_JavaScript_for_Your_Web_Site.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Take_an_IIS_Web_Site_Offline.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Disable_Ektron_Modules_and_Handlers_in_IIS_7_Virtual_Applications.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Enable_SMTP_Authentication_for_Outlook_2007.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Redirect_Reference_for_Microsoft_IIS_6_0.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Leverage_machine_config_comments_to_Learn_How_to_Configure_Your_ASP_NET_Web_Sites.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Script_to_Start-Stop_All_Running_Ektron_Services_on_Local_Workstation.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Salesforce_com_Web-To-Lead_CSharp_Class.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/PHP_Flickr_Photo_Rotator_Class.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Web_Page_Layout.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Breaking_HttpModule_Inheritance_-_InheritInChildApplications.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Generic_JavaScript_Page_onLoad_Event_Handler.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Take_a_Screenshot_of_a_Windows_Media_Video_Movie.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Tips_to_Protect_Yourself_From_Phishing_Schemes.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Configure_Custom_QuickLinks_in_Ektron.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Convert__NET_DateTime_to_UNIX_Timestamp.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Encoding_and_Downloading_FLV_Media.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_API_to_Access_Localization_Tag.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Delete_a_Windows_Service.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_Issues_with_Redirecting_Submitted_Form_Data.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/SharePoint_Wiki_Homepage_Not_Working.aspx?blogid=91" />
   </rdf:Seq>
  </items>
 </channel>
 <item rdf:about="/Articles_Archive/Facebook_Removes_App_Profile_Pages.aspx?blogid=91">
  <title>Facebook Removes App Profile Pages</title>
  <link>http://www.skonet.com/Articles_Archive/Facebook_Removes_App_Profile_Pages.aspx?blogid=91</link>
  <description><![CDATA[<p>Once again, Facebook has thwarted developers' attempts to build successful applications on their platform by removing the ability to [easily] add application tabs to brand pages.</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2012-01-19T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<style type="text/css">input { width: 250px; }</style><p>Once again, <a href="https://developers.facebook.com/blog/post/611">Facebook</a> has thwarted developers' attempts to build successful applications on their platform by <a href="https://developers.facebook.com/blog/post/611" target="_blank">removing the ability to [easily] add application tabs to brand pages</a>.</p>
<p>Their solution? Create your own (expletive) "add tab dialog" page.</p>
<p>Honestly, who runs this group?</p>
<p>Here is the "template" provided by Facebook:</p>
<pre class="brush:html">&lt;html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:og="http://ogp.me/ns#"
	xmlns:fb="http://www.facebook.com/2008/fbml"&gt;
	&lt;body&gt;
		&lt;a href="#" onclick=window.open("http://www.facebook.com/dialog/pagetab?app_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL","PageTab","width=500,height=200");&gt;Dialog&lt;/a&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre><p>Rather than deal with the various hacks other developers have come up with, I decided to write my own, as it appears I'll need it over the next foreseable future. I've verified this works and does actually allow you to add an app tab to your own brand page(s).</p>
<table border="0" cellspacing="0" cellpadding="4">
<tbody>
<tr>
<td><label for="fbAppId">App Id:</label> </td>
<td><input id="fbAppId" type="text" /> </td>
<td><em>This is the app id for the application tab you want to add to your page</em> </td>
</tr>
<tr>
<td><label for="fbPageUrl">App URL:</label> </td>
<td><input id="fbPageUrl" type="text" /> </td>
<td><em>This is the URL to the application canvas page for the application you want to add to your page (not the page URL)</em> </td>
</tr>
<tr>
<td> </td>
<td><input id="fbAddTab" type="button" value="Submit" /> </td>
</tr>
</tbody>
</table>
<script type="text/javascript"><!--
var format = ['http://www.facebook.com/dialog/pagetab?app_id=','&redirect_uri='];
	$(function()
	{
		$('#fbAddTab').click(function()
		{
			var id = $('#fbAppId').val();
			var url = $('#fbPageUrl').val();
			window.open(format[0] + id + format[1] + url,'PageTab','width=900,height=450');
		});
	});
//--></script><h2>References</h2>
<ul>
<li><a href="https://developers.facebook.com/blog/post/611" target="_blank">Removing App Profile Pages | Facebook Developer Blog</a> </li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_Net_Reserved_Files_and_Folders.aspx?blogid=91">
  <title>Ektron CMS400.Net Reserved Files and Folders</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Reserved_Files_and_Folders.aspx?blogid=91</link>
  <description><![CDATA[<p>The following files and folders are pre installed configured by the Ektron site setup. Most of them can be configured through the web.config. Folders %WebRoot% Assets DMS storage location of public uploaded assets %Drive% %CustomPath% AssetLibrary %SiteName% DMS storage location</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2012-01-17T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>The following files and folders are pre-installed/configured by the Ektron site setup. Most of them can be configured through the web.config.</p>
<h2>Folders</h2>
<table cellpadding="0" cellspacing="0" class="matrix">
<tbody>
<tr>
<td>%WebRoot%/Assets/</td>
<td>DMS storage location of public uploaded assets</td>
</tr>
<tr>
<td>%Drive%:/%CustomPath%/AssetLibrary/%SiteName%/</td>
<td>DMS storage location defined during site setup</td>
</tr>
<tr>
<td>%WebRoot%/AssetManagement/</td>
<td>DMS application files used to upload/view DMS assets</td>
</tr>
<tr>
<td>%WebRoot%/UploadedFiles/</td>
<td>Where the uploaded files are saved</td>
</tr>
<tr>
<td>%WebRoot%/UploadedImages/</td>
<td>Where the uploaded images are saved</td>
</tr>
<tr>
<td>%WebRoot%/PrivateAssets/</td>
<td>DMS storage location of secured/private uploaded assets</td>
</tr>
<tr>
<td>%WebRoot%/Widgets/</td>
<td>Custom page builder widgets</td>
</tr>
<tr>
<td>%WebRoot%/Workarea/</td>
<td>Central location where you most tasks for managing the website are performed. Normally do not modify code here.</td>
</tr>
<tr>
<td colspan="1">%WebRoot%/XmlFiles/</td>
<td colspan="1">Location Ektron looks for custom ekml and xslt files.</td>
</tr>
</tbody>
</table>
<h2>Files</h2>
<table cellpadding="0" cellspacing="0" class="matrix">
<tbody>
<tr>
<td>%WebRoot%/AssetManagement.config</td>
<td>Configuration file for the DMS</td>
</tr>
<tr>
<td>%WebRoot%/Instrumentation.config</td>
<td>Error, trace and event logging configuration</td>
</tr>
<tr>
<td>%WebRoot%/objectFactory.config</td>
<td>Register custom events within the CMS</td>
</tr>
<tr>
<td>%WebRoot%/Shipment.config</td>
<td>Custom shipping provider configuration</td>
</tr>
<tr>
<td>%WebRoot%/Web.config</td>
<td>Configuration file for the website (standard ASP.Net web configuration)</td>
</tr>
</tbody>
</table>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Use_Entity_Framework_4_With_Visual_Studio_2010_and_SQL_Server_2000.aspx?blogid=91">
  <title>How To Use Entity Framework 4 With Visual Studio 2010 and SQL Server 2000</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Use_Entity_Framework_4_With_Visual_Studio_2010_and_SQL_Server_2000.aspx?blogid=91</link>
  <description><![CDATA[<p>If you are unfortunate enough to have to support applications running on legacy SQL 2000 databases like me, you are probably aware of the limitation of Visual Studio 2010 and Entity Framework 4.0 for SQL Server 2000. There are plenty</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-11-07T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>If you are unfortunate enough to have to support applications running on legacy <a title="SQL Server 2000" href="http://www.microsoft.com/sqlserver/en/us/default.aspx" target="_blank">SQL Server 2000</a> databases like me, you are probably aware of the <a title="limitation of Visual Studio 2010 and Entity Framework 4.0 for SQL Server 2000" href="http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/781d7256-8226-4e56-a1aa-16ca33e1cbe7" target="_blank">limitation of Visual Studio 2010 and Entity Framework 4.0 for SQL Server 2000</a>.</p>
<p>There are plenty of articles out there on work-arounds. I find this one the most direct and feasible. Granted, I have not looked into possible version issue that may result in doing it this way, but for the various applications on which I have worked, it is sufficiently elegant and functional.</p>
<p>This a work-around. Let me repeat, <span style="TEXT-TRANSFORM: uppercase; COLOR: #ff0000; FONT-WEIGHT: bold">this is a work-around!</span>.</p>
<p>Here are the steps to add a new Entity Framework 4 entity context to a Visual Studio 2010 project:</p>
<ol>
<li>Download the <a title="base entity data model for SQL Server 2000" href="http://www.skonet.com/uploadedFiles/Code/BaseEntityModel.edmx.xml" target="_blank">base entity data model for SQL Server 2000</a> file and save it to the project folder to which you wish to add the SQL 2000 entity context. Do <strong>NOT</strong> add it to your project yet.</li>
<li>Rename the EDMX file to the name of the data context (e.g. MyDataModel.edmx).</li>
<li>Open the EDMX file in a text editor.</li>
<li>Find/replace all references to %DB_NAME% with your own value (e.g. SomeDatabaseName).</li>
<li>Add this new connection string section to your App or Web.config and find/replace with your own values: <pre class="brush:xml">&lt;connectionStrings&gt;
  &lt;add name="%DB_NAME%Entities" connectionString="metadata=res://*/%DB_NAME%.csdl|res://*/%DB_NAME%.ssdl|res://*/%DB_NAME%.msl;provider=System.Data.SqlClient;provider connection string=&amp;quot;Data Source=%DB_HOST_NAME%;Initial Catalog=%DB_NAME%;Persist Security Info=True;User ID=%DB_USER%;Password=%DB_USER_PWD%;MultipleActiveResultSets=False&amp;quot;" providerName="System.Data.EntityClient" /&gt;
&lt;/connectionStrings&gt;</pre><p>Please note: the connection string name <strong>MUST MATCH</strong> the EntityContainer section name you specified in the EDMX file.</p>
</li>
<li>After the .edmx and web.config files configured, add them to the project and verify the new entity data source appears after refreshing the Data Source manager window.</li>
<li>If the new entity data source appears, open the .edmx file in design view and refresh the design model.</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/System_Uri_Properties_Reflection.aspx?blogid=91">
  <title>System.Uri Properties Reflection</title>
  <link>http://www.skonet.com/Articles_Archive/System_Uri_Properties_Reflection.aspx?blogid=91</link>
  <description><![CDATA[<p> I felt it would be useful (at least for me) to keep a property map available of the System.Uri class and it's respective values as they relate to a standard URI/URL. 
 This should prove useful when forgetting (which I often do) all the fields and their meanings. 
 The following table reflects a standard formatted UR</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-10-07T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I felt it would be useful (at least for me) to keep a property map available of the System.Uri class and it's respective values as they relate to a standard URI/URL.</p>
<p>This should prove useful when forgetting (which I often do) all the fields and their meanings.</p>
<p>The following table reflects a standard formatted URL: </p>
<pre class="brush:text">https://www.example.com/some/path/page.ext:8080?query=value#hashfragment</pre><p><a href="http://skonet.com/uploadedfiles/code/urireflection.aspx" target="_blank">Here is the reflected output</a>.</p>
<table cellspacing="0" class="matrix">
<tbody>
<tr>
<th>Property</th>
<th>Value</th>
</tr>
<tr>
<td>AbsolutePath</td>
<td>/some/path/page.html</td>
</tr>
<tr>
<td>AbsoluteUri</td>
<td>http://www.example.com:8080/some/path/page.html?query=value#hashfragment</td>
</tr>
<tr>
<td>Authority</td>
<td>www.example.com:8080</td>
</tr>
<tr>
<td>Host</td>
<td>www.example.com</td>
</tr>
<tr>
<td>HostNameType</td>
<td>Dns</td>
</tr>
<tr>
<td>IsDefaultPort</td>
<td>False</td>
</tr>
<tr>
<td>IsFile</td>
<td>False</td>
</tr>
<tr>
<td>IsLoopback</td>
<td>False</td>
</tr>
<tr>
<td>IsUnc</td>
<td>False</td>
</tr>
<tr>
<td>LocalPath</td>
<td>/some/path/page.html</td>
</tr>
<tr>
<td>PathAndQuery</td>
<td>/some/path/page.html?query=value</td>
</tr>
<tr>
<td>Port</td>
<td>8080</td>
</tr>
<tr>
<td>Query</td>
<td>?query=value</td>
</tr>
<tr>
<td>Fragment</td>
<td>#hashfragment</td>
</tr>
<tr>
<td>Scheme</td>
<td>http</td>
</tr>
<tr>
<td>OriginalString</td>
<td>http://www.example.com:8080/some/path/page.html?query=value#hashfragment</td>
</tr>
<tr>
<td>DnsSafeHost</td>
<td>www.example.com</td>
</tr>
<tr>
<td>IsAbsoluteUri</td>
<td>True</td>
</tr>
<tr>
<td>Segments</td>
<td>/<br />some/<br />path/<br />page.html</td>
</tr>
<tr>
<td>UserEscaped</td>
<td>False</td>
</tr>
<tr>
<td>UserInfo</td>
<td>&#160;</td>
</tr>
</tbody>
</table>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Collection_of_Quick_Tool_Javascript_Bookmarklets.aspx?blogid=91">
  <title>Collection of Quick Tool Javascript Bookmarklets</title>
  <link>http://www.skonet.com/Articles_Archive/Collection_of_Quick_Tool_Javascript_Bookmarklets.aspx?blogid=91</link>
  <description><![CDATA[<p>I've decided to keep tabs on a few bookmarklets I use on a day to day bases. Enjoy. </p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-09-30T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I've decided to keep tabs on a few bookmarklets I use on a day to day bases.</p>
<p>Add the script as the URL of your browser bookmark and click the bookmark to fire it off.</p>
<p>Enjoy.</p>
<ul>
<li>Whois Lookup Bookmarklet<br /><pre class="brush:javascript">javascript:(function(){var p=prompt('Enter the URL','');var u='http://www.whois.net/whois_new.cgi?d=';var a=window,c=encodeURIComponent,d=a.open(u+c(p),'pop','left='+((a.screenX||a.screenLeft)+10)+',top='+((a.screenY||a.screenTop)+10)+',height=550px,width=780px,resizable=1,alwaysRaised=1,scrollbars=1');a.setTimeout(function(){d.focus()},500);})();</pre> </li>
<li>Google Bookmark - Add Bookmark<br /><pre class="brush:javascript">javascript:(function(){var%20a=window,b=document,c=encodeURIComponent,d=a.open('http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk='+c(b.location)+'&amp;title='+c(b.title),'bkmk_popup','left='+((a.screenX||a.screenLeft)+10)+',top='+((a.screenY||a.screenTop)+10)+',height=420px,width=550px,resizable=1,alwaysRaised=1');a.setTimeout(function(){d.focus()},300)})();</pre>
 </li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/ASP_NET_Implementation_of_the_Google_GeoChart_Visualization_Tools_and_APIs.aspx?blogid=91">
  <title>ASP.NET Implementation of the Google GeoChart Visualization Tools and APIs</title>
  <link>http://www.skonet.com/Articles_Archive/ASP_NET_Implementation_of_the_Google_GeoChart_Visualization_Tools_and_APIs.aspx?blogid=91</link>
  <description><![CDATA[<p> ASP.NET Implementation of the Google GeoChart Visualization Tools and APIs 
 I have been digging into the  Google Chart Tools  lately, and have had the opportunity to utilize a few of them on client projects. This article will offer a rudimentary implementation. 
 The particular chart that is quite useful, especiall</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-09-29T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have been digging into the <a target="_blank" href="http://code.google.com/apis/chart/">Google Chart Tools</a> lately, and have had the opportunity to utilize a few of them on client projects. This article will offer a rudimentary implementation.</p>
<p>The particular chart that is quite useful, especially with the shift <em>away</em> from <a href="http://www.adobe.com/flash">Flash</a>, is the <a title="Google GeoChart" target="_blank" href="http://code.google.com/apis/chart/interactive/docs/gallery/geochart.html">Google GeoChart</a>.</p>
<blockquote>A Geochart is an SVG-based map of a country, continent, or region map, with colors and values assigned to specific regions. Values are displayed as a color scale, and you can specify optional hovertext for regions. The map is rendered in the browser using SVG. Note that the map is not scrollable or draggable.</blockquote>
<p>To render a populated GeoChart:</p>
<ol>
<li>Generate the data source</li>
<li>Load the Google Charting JavaScript APIs and render to the page</li>
<li>Bind the data to the chart objects</li>
<li>Draw the chart to the page</li>
</ol>
<h2>Generate the Data Source</h2>
<p>First, get data to fuel the control. Here we use a simple generic dictionary:</p>
<pre class="brush:csharp">Dictionary&lt;string, int&gt; data = new Dictionary&lt;string, int&gt;();
data.Add("UT", 0);
data.Add("Texas", 1);
data.Add("California", 2);
data.Add("New York", 3);</pre><p>Now to get the data into the charting objects. The Google data APIs support AJAX calls to a JSON data source which is probably a better solution than what has been done here by rendering directly to the page as a JSON object.</p>
<pre class="brush:csharp">string MAP_DATA_FORMAT = "dataRows = [{0}];\n";
string MAP_DATA_ROW_FORMAT = "['{0}',{1}],";
string MAP_SCRIPT_FORMAT = "google.setOnLoadCallback({0});\n";
StringBuilder sbData = new StringBuilder();
StringBuilder sbScript = new StringBuilder();

foreach(KeyValuePair&lt;string, int&gt; d in data)
{
	sbData.AppendFormat(MAP_DATA_ROW_FORMAT, d.Key, d.Value);
}
if(sbData.Length &gt; 0)
{
	// generate javascript to render the data objects to the page
	sbScript.AppendFormat(MAP_DATA_FORMAT, sbData.ToString().TrimEnd(','));
	sbScript.AppendFormat(MAP_SCRIPT_FORMAT, "initGlobalMap");
	ClientScript.RegisterStartupScript(this.GetType(), "GlobalMap", sbScript.ToString(), true);
}</pre><h2>Render Google Charting JavaScript/HTML</h2>
<p>Load the Google JavaScript APIs by including the library references in the &lt;head /&gt;:</p>
<pre class="brush:html">&lt;script type='text/javascript' src='https://www.google.com/jsapi'&gt;&lt;/script&gt;</pre><p>Render the JavaScript necessary to handle the chart visulization:</p>
<pre class="brush:javascript">// load the apis
google.load('visualization', '1', { 'packages': ['geochart'] });
// variable to hold our generated data source
var dataRows;
// color, style, options for the rendered control
var mapOptions = {
	colors: ['#FF6F28', '#FFD7C4'],
	backgroundColor: {
		stroke: '#ffffff',
		strokeWidth: 0,
		fill: '#ffffff'
	},
	width: 500,
	height: 312,
	region: 'US',
	resolution: 'provinces'
};

// initialization function that gets fired once the data source
// has been generated and everything is ready to go
function initGlobalMap()
{
	// configure the map data
	var mapData = new google.visualization.DataTable();
	mapData.addColumn('string', 'Region');
	mapData.addColumn('number', 'ID');
	mapData.addRows(dataRows);
	// instantiate the control/object
	var geochart = new google.visualization.GeoChart(document.getElementById('chart'));
	// add click (select) event listener
	google.visualization.events.addListener(geochart, 'select', function ()
	{
		var selection = geochart.getSelection();
		// pull the value from our generated data source
		var id = mapData.getValue(selection[0].row, 1);
		// do something wonderful
		window.location = '&lt;%= Request.Url.AbsolutePath %&gt;?id=' + id;
	});
	// draw the map
	geochart.draw(mapData, mapOptions);
}</pre><p>Last, a &lt;div /&gt; to contain the rendered control:</p>
<pre class="brush:html">&lt;div id="chart"&gt;&lt;/div&gt;</pre><h2>Conclusion</h2>
<p>The Google Charting APIs are a great resource if you are looking for out-of-box, supported web controls. Integration with .NET is a little more difficult due to the general lack of support, but implementation is easy and quick.</p>
<p><a target="_blank" href="http://www.skonet.com/uploadedFiles/Code/GoogleGeoChartApi.aspx">See it in action</a> </p>
<p>Alltogether, packaged with a pretty bow:</p>
<pre class="brush:html">&lt;%@ Page language="c#" %&gt;
&lt;%@ Import namespace="System.Collections.Generic" %&gt;
&lt;%@ Import namespace="System.Linq" %&gt;
&lt;script runat="server"&gt;
	protected void Page_Load(object s, EventArgs e)
	{
		string MAP_DATA_FORMAT = "dataRows = [{0}];\n";
		string MAP_DATA_ROW_FORMAT = "['{0}',{1}],";
		string MAP_SCRIPT_FORMAT = "google.setOnLoadCallback({0});\n";
		StringBuilder sbData = new StringBuilder();
		StringBuilder sbScript = new StringBuilder();

		// get data
		Dictionary&lt;string, int&gt; data = new Dictionary&lt;string, int&gt;();
		data.Add("UT", 0);
		data.Add("Texas", 1);
		data.Add("California", 2);
		data.Add("New York", 3);

		// render js
		foreach(KeyValuePair&lt;string, int&gt; d in data)
		{
			sbData.AppendFormat(MAP_DATA_ROW_FORMAT, d.Key, d.Value);
		}
		if(sbData.Length &gt; 0)
		{
			sbScript.AppendFormat(MAP_DATA_FORMAT, sbData.ToString().TrimEnd(','));
			sbScript.AppendFormat(MAP_SCRIPT_FORMAT, "initGlobalMap");
			ClientScript.RegisterStartupScript(this.GetType(), "GlobalMap", sbScript.ToString(), true);
			MapScript.Visible = true;
		}

		// check request
		string id = Request["id"];
		if(!String.IsNullOrEmpty(id))
		{
			SelectedItem.Visible = true;
			SelectedItem.InnerHtml = String.Format(SelectedItem.InnerHtml, HttpUtility.HtmlEncode(id));
		}
	}
&lt;/script&gt;
&lt;!doctype html&gt;
&lt;html lang="en-US"&gt;
	&lt;head runat="server"&gt;
		&lt;title&gt;Google GeoChart API Example - SkoNet.com&lt;/title&gt;
		&lt;asp:placeholder id="MapScript" runat="server" visible="false"&gt;
			&lt;script type='text/javascript' src='https://www.google.com/jsapi'&gt;&lt;/script&gt;
			&lt;script type='text/javascript'&gt;
				google.load('visualization', '1', { 'packages': ['geochart'] });
				var dataRows;
				var mapOptions = {
					colors: ['#FF6F28', '#FFD7C4'],
					backgroundColor: {
						stroke: '#ffffff',
						strokeWidth: 0,
						fill: '#ffffff'
					},
					width: 500,
					height: 312,
					region: 'US',
					resolution: 'provinces'
				};

				function initGlobalMap()
				{
					var mapData = new google.visualization.DataTable();
					mapData.addColumn('string', 'Region');
					mapData.addColumn('number', 'ID');
					mapData.addRows(dataRows);
					var geochart = new google.visualization.GeoChart(document.getElementById('chart'));
					google.visualization.events.addListener(geochart, 'select', function ()
					{
						var selection = geochart.getSelection();
						var id = mapData.getValue(selection[0].row, 1);
						window.location = '&lt;%= Request.Url.AbsolutePath %&gt;?id=' + id;
					});
					geochart.draw(mapData, mapOptions);
				}
			&lt;/script&gt;
		&lt;/asp:placeholder&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;form runat="server"&gt;
			&lt;p id="SelectedItem" runat="server" visible="false"&gt;You selected value: {0}&lt;/p&gt;
			&lt;div id="chart"&gt;&lt;/div&gt;
		&lt;/form&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/No_Items_Exist_In_The_List_When_Defining_Custom_Data_Lists_In_Content.aspx?blogid=91">
  <title>No Items Exist In The List When Defining Custom Data Lists In Content</title>
  <link>http://www.skonet.com/Articles_Archive/No_Items_Exist_In_The_List_When_Defining_Custom_Data_Lists_In_Content.aspx?blogid=91</link>
  <description><![CDATA[<p> The  Ektron knowledgebase  contains an article,  How To Define Data Lists In Content  using  smart forms  and structured content. These content based lists can be used on smart form templates, html forms, or anywhere else you need structured lists. 
 When attemping to implement this custom logic, you may run into the</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-09-27T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>The <a target="_blank" href="http://dev.ektron.com/kb_article.aspx">Ektron knowledgebase</a> contains an article, <a target="_blank" href="http://dev.ektron.com/kb_article.aspx?id=29147">How To Define Data Lists In Content</a> using <a target="_blank" href="http://documentation.ektron.com/cms400/v802/webhelp/Managing%20Content/Smart%20Forms/smart_forms_intro.htm">smart forms</a> and structured content. These content based lists can be used on smart form templates, html forms, or anywhere else you need structured lists.</p>
<p>When attempting to implement this custom logic, you may run into the following message/error in the "Item List" section of the Choices Field editor form:</p>
<pre class="brush:text">No items exist in the list.</pre><p>The problem lies in the <a target="_blank" href="http://www.skonet.com/workarea/contentdesigner/choicesfield.js">/workarea/contentdesigner/choicesfield.js</a> file. On line 750 (or so), is a hard-coded URL to the DataListSpec.xml file. Unfortunately, most browsers will cache xml files indefinitely or until the cache is forcefully cleared. Any updates made to the local version will not get loaded. So, new list source names will appear in List (source) drop down list, but the data items will not load properly.</p>
<p>A reasonably quick fix is to append a timestamp variable to the URL, forcing the browser to load the non-cached version:</p>
<pre class="brush:js">var strDatalistUrl = "/WorkArea/ContentDesigner/DataListSpec.xml?ts=" + new Date().getMilliseconds(); // would be nice if not hardcoded</pre>
<p>Hopefully this helps someone that runs into the same issue I was having.</p>
<p>Code on!</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Disable_The_Windows_Shutdown_Event_Tracker.aspx?blogid=91">
  <title>How To Disable The Windows Shutdown Event Tracker</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Disable_The_Windows_Shutdown_Event_Tracker.aspx?blogid=91</link>
  <description><![CDATA[<p>How To Disable The Windows Shutdown Event Tracker</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-09-08T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>As I have been setting up servers as of late, a quick little note on how to disable this annoying "feature".</p>
<ol>
<li>Open Group Policy Editor: gpedit.msc</li>
<li>Expand: Local Computer Policy | Computer Configuration | Administrative Templates | System</li>
<li>Disable: Display Shutdown Event Tracker</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Change_the_Default_Height_of_the_Catalog_Entry_Editor_Window_in_Ektron_CMS400_Net.aspx?blogid=91">
  <title>How to Change the Default Height of the Catalog Entry Editor Window in Ektron CMS400.Net</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Change_the_Default_Height_of_the_Catalog_Entry_Editor_Window_in_Ektron_CMS400_Net.aspx?blogid=91</link>
  <description><![CDATA[<p> To my knowledge (and patience to find another means), this is the only way to change the default editor height for the catalog entry editor window in the  Ektron CMS400.Net  workarea. 
 Because, if you have clients like I do, they probably don't like trying to edit entire pages of content in an itty bitty 400px high </p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-04-21T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>To my knowledge (and patience to find another means), this is the only way to change the default editor height for the catalog entry editor window in the <a href="http://www.ektron.com" title="Ektron CMS400.Net">Ektron CMS400.Net</a> workarea.</p>
<p>Because, if you have clients like I do, they probably don't like trying to edit entire pages of content in an itty bitty 400px high window space (in IE at least).</p>
<p>The fact I even have to type this up is painful enough. Let alone the fact I have to make this change at all due to poor UI/UX design drives me crazy.</p>
<p>To change the default (and only) height to the catalog entry edit window in the workarea, do the following:</p>
<ol>
<li>Open the following file in your favorite text editor: /wwwroot/Workarea/Commerce/CatalogEntry.aspx.vb</li>
<li>Go to line 119</li>
<li>Modify any of the contentEditor settings you wish (mine is .Height = New Unit(1000, UnitType.Pixel) in IE)</li>
<li>Save the file</li>
<li>Immediate relief from disgruntled clients who don't like poor UX design</li>
</ol>
<p>Here is what my code looks like.</p>
<pre class="brush:vb">With contentEditor
	If Request.Browser.Type = "IE6" Then
		.Width = New Unit(1200, UnitType.Pixel)
		.Height = New Unit(1000, UnitType.Pixel)
	ElseIf Request.Browser.Type.IndexOf("Firefox") &lt;&gt; -1 Then
		.Width = New Unit(100, UnitType.Percentage)
		.Height = New Unit(1000, UnitType.Pixel)
	Else
		.Width = New Unit(100, UnitType.Percentage)
		.Height = New Unit(1000, UnitType.Pixel)
	End If
End With

With summaryEditor
	If Request.Browser.Type = "IE6" Then
		.Width = New Unit(1200, UnitType.Pixel)
		.Height = New Unit(400, UnitType.Pixel)
	ElseIf Request.Browser.Type.IndexOf("Firefox") &lt;&gt; -1 Then
		.Width = New Unit(100, UnitType.Percentage)
		.Height = New Unit(800, UnitType.Pixel)
	Else
		.Width = New Unit(100, UnitType.Percentage)
		.Height = New Unit(500, UnitType.Pixel)
	End If
End With</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/The_Controls_Collection_Cannot_Be_Modified_Because_The_Control_Contains_Code_Blocks.aspx?blogid=91">
  <title>The Controls Collection Cannot Be Modified Because The Control Contains Code Blocks</title>
  <link>http://www.skonet.com/Articles_Archive/The_Controls_Collection_Cannot_Be_Modified_Because_The_Control_Contains_Code_Blocks.aspx?blogid=91</link>
  <description><![CDATA[How to solve the 'The Controls Collection Cannot Be Modified Because The Control Contains Code Blocks' error]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-04-07T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Over the years, I have run into this issue multiple times and have decided to document my top two solutions. There are plenty more out there, these are mine.</p>
<h2>Problem</h2>
<p>You attempt to run ASP.NET code blocks (<span style="background-color: yellow;">&lt;%= %&gt;</span>), such as trying to resolve the application root using</p>
<pre class="brush:html">&lt;script href="&lt;%= ResolveUrl("~/Js/Default.js") %&gt;" /&gt;</pre><p>and have the <strong>&lt;head /&gt;</strong> tag of your Master Page or Web Form set to <strong>runat="server"</strong> you will get the following runtime error:</p>
<p style="color: maroon; font-style: italic; font-size: 14pt;">The Controls collection cannot be modified because the control contains code blocks (i.e. &lt;% ... %&gt;)</p>
<h2>Solutions</h2>
<p>Here are (in my opinions) the cleanest solutions I have found with the least impact on code behind and time to implement.</p>
<h3>Solution One</h3>
<p>Wrap your code blocks in a server control. I use a plain-ole PlaceHolder control.</p>
<pre class="brush:html">&lt;asp:PlaceHolder runat="server"&gt;
&lt;script src="&lt;%= ResolveUrl("~/Js/jquery.js") %&gt;" type="text/javascript"&gt;&lt;/script&gt;
&lt;/asp:PlaceHolder&gt;</pre><p>This prevents the error but also does not render an actual control. All good.</p>
<h3>Solution Two</h3>
<p>Use a databinding tag <span style="background: none repeat scroll 0% 0% yellow;">&lt;%# %&gt;</span> </p>
<pre class="brush:html">&lt;script src="&lt;%# ResolveUrl("~/Js/jquery.js") %&gt;" type="text/javascript"&gt;&lt;/script&gt;</pre><p>The only caveat to this is that you need to fire the DataBind event for the head control onLoad or onInit.</p>
<pre class="brush:csharp">Page.Header.DataBind();</pre><p>Of the two solutions, I find option one my preferred as it requires less (no) back-end code.</p>
<h2>Related Articles</h2>
<ul>
<li><a target="_blank" href="http://leedumond.com/blog/the-controls-collection-cannot-be-modified-because-the-control-contains-code-blocks/">The Controls Collection Cannot Be Modified Because The Control Contains Code Blocks</a> </li>
<li><a target="_blank" href="http://www.west-wind.com/weblog/posts/2006/May/27/The-Controls-collection-cannot-be-modified-because-the-control-contains-code-blocks-ie-">The Controls collection cannot be modified because the control contains code blocks (i.e. &lt;% ... %&gt;).</a>
 </li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Access_to_the_path_FileListAbsolute_txt_is_Denied_Error.aspx?blogid=91">
  <title>Access to the path FileListAbsolute.txt is Denied Error</title>
  <link>http://www.skonet.com/Articles_Archive/Access_to_the_path_FileListAbsolute_txt_is_Denied_Error.aspx?blogid=91</link>
  <description><![CDATA[<p> Over the past day or so, I have been dealing with a quite elusive and frustratingly evil build problem in one of many web projects in our  Team Foundation System  build environment. Apparently, though we have a rule to excluded the "obj" folder from our commits, someone on the team "somehow" committed the "obj" folder</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-03-18T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Over the past day or so, I have been dealing with a quite elusive and frustratingly evil build problem in one of many web projects in our <a href="http://msdn.microsoft.com/en-us/vstudio/ff637362" target="_blank" title="Team Foundation System">Team Foundation System</a> build environment. Apparently, though we have a rule to excluded the "obj" folder from our commits, someone on the team "somehow" committed the "obj" folder. This apparently causes havoc when MSBuild attempts to write to various source files that are set read-only. Consequently, when the build process runs, you "may" see the following error in your build summary/log file:</p>
<pre class="brush:plain">C:\Windows\Microsoft.NET\Framework\v#\Microsoft.Common.targets (#): Could not write lines to file "obj\%CONFIGURATION%)\%PROJECTNAME%.csproj.FileListAbsolute.txt". Access to the path '%MSBUILD_SOURCE_PATH%\obj\%CONFIGURATION%)\%PROJECTNAME%.csproj.FileListAbsolute.txt' is denied.</pre><p>The solution is simple, delete the "obj" folder from source control, commit the changes, and re-run the build.</p>
<h3>Reference</h3>
<ul>
<li><a href="http://social.msdn.microsoft.com/Forums/en/tfsbuild/thread/5b30f17c-cb7c-4891-98b2-44f5df8b83da?prof=required" title="Getting Errors with Team Builds - no idea what to do">Getting Errors with Team Builds - no idea what to do</a> </li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Configure_ASP_NET_Unit_Tests_in_Visual_Studio_2010.aspx?blogid=91">
  <title>How To Configure ASP.NET Unit Tests in Visual Studio 2010</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Configure_ASP_NET_Unit_Tests_in_Visual_Studio_2010.aspx?blogid=91</link>
  <description><![CDATA[<p> This article demonstrates how to setup a basic unit test project to take care of code coverage of a standard ASP.NET website. 
 This article assumes you have created an  ASP.NET Web Application project  (not ASP.NET Website). 
 Setup a Unit Test Project 
 
 Open your solution in Visual Studio 2010 
 Click Test | </p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-02-03T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>This article demonstrates how to setup a basic unit test project to take care of code coverage of a standard ASP.NET website.</p>
<p>This article assumes you have created an <a href="http://msdn.microsoft.com/en-us/library/dd547590.aspx" title="ASP.NET Web Application project" target="_blank">ASP.NET Web Application project</a> (not ASP.NET Website).</p>
<h2>Setup a Unit Test Project</h2>
<ol>
<li>Open your solution in Visual Studio 2010</li>
<li>Click Test | New Test</li>
<li>Select Basic Unit Test (or any of the others)</li>
<li>Name your test class</li>
<li>Add to or create a new test project (preferably ProjectName.Tests)</li>
</ol>
<p>Couple of caveats:</p>
<ol>
<li>Only works for ASP.NET 4.0 Web Applications</li>
<li>You will need to remove any backwards compatible runtime assemblies from the web.config or you will get 500 errors. Best to add them to your web.config transforms if necessary.</li>
</ol>
<pre class="brush:xml">&lt;runtime xdt:Transform="Replace"&gt;
	&lt;assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"&gt;
		&lt;dependentAssembly&gt;
			&lt;assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/&gt;
			&lt;bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/&gt;
		&lt;/dependentAssembly&gt;
		&lt;dependentAssembly&gt;
			&lt;assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/&gt;
			&lt;bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/&gt;
		&lt;/dependentAssembly&gt;
	&lt;/assemblyBinding&gt;
&lt;/runtime&gt;</pre><h2>Example Test Class</h2>
<p>This is a very basic test class and unit test method for example.</p>
<pre class="brush:csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Web;

namespace Project.Tests
{
	[TestClass]
	public class BusinessTests
	{
		[TestMethod]
		[UrlToTest("http://localhost:8080/Default.aspx")]
		[HostType("ASP.NET")]
		[AspNetDevelopmentServerHost("$(SolutionDir)\\Project.Web")]
		public void TestMethod1()
		{
			string url = HttpContext.Current.Request.Url.ToString();
		}
	}
}</pre><p>A couple of things to note:</p>
<ol>
<li>UrlToTest: References the Visual Studio Development Server. IMHO, best to use a specific port (i.e. 8080) when using tests.</li>
<li>AspNetDevelopmentServerHost: Microsoft recommends using the environment variable: <strong>%PathToWebRoot%</strong>. However, this can prove to be problematic when working in team environments. So in this example, we take advantage of the Visual Studio macro variable, <strong>$(SolutionDir)</strong> to fill the path to the solution regardless of the build environment.</li>
</ol>
<h2>Debugging ASP.NET Unit Tests</h2>
<p>To debug your tests, you will need to attach to the worker process for your web application (either WebDev.WebServer... or w3svc), and <strong>NOT</strong> to the test project.</p>
<p>Once attached to the web debugger, you can then select the test method and click <em>CTRL + R + T</em> to run the selected test, or <em>CTRL + R + A</em> to run all tests.</p>
<p>Code, out!</p>
<h2>References</h2>
<ul>
<li><a href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;l=EN-US&amp;k=k%28VS.TEST.RUNCONFIG.EDITOR%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-CSHARP%29&amp;rd=true" title="Create Test Settings to Run Automated Tests from Visual Studio" target="_blank">Create Test Settings to Run Automated Tests from Visual Studio</a>&#160;</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms182526%28v=VS.80%29.aspx" title="How to: Create an ASP.NET Unit Test" target="_blank">How to: Create an ASP.NET Unit Test</a>&#160;</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms243172.aspx" title="How to: Debug while Running a Test in an ASP.NET Solution" target="_blank">How to: Debug while Running a Test in an ASP.NET Solution</a>&#160;</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms243136.aspx" title="Testing Web Sites and Web Services in a Team Environment" target="_blank">Testing Web Sites and Web Services in a Team Environment</a>&#160;</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms182480.aspx" title="How to: Specify Test Settings from Microsoft Visual Studio" target="_blank">How to: Specify Test Settings from Microsoft Visual Studio</a>&#160;</li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Implement_a_Google_Custom_Search_Engine_on_an_ASP_NET_Based_Website.aspx?blogid=91">
  <title>How To Implement a Google Custom Search Engine on an ASP.NET Based Website</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Implement_a_Google_Custom_Search_Engine_on_an_ASP_NET_Based_Website.aspx?blogid=91</link>
  <description><![CDATA[<p> This article demonstrates a basic implementation of a  Google Custom Search Engine (CSE)  on an  ASP.NET  based website. 
 Create and Configure a Custom Search Engine 
 Log in and  create a custom search engine account . Standard edition is free, but requires that you display the ads on the results pages. Site Searc</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-01-20T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p><em>Updated: February 16, 2011</em> </p>
<p>This article demonstrates a basic implementation of a <a href="http://www.google.com/cse/" target="_blank" title="Google Custom Search Engine (CSE)">Google Custom Search Engine (CSE)</a> on an <a href="http://www.asp.net" target="_blank" title="ASP.NET">ASP.NET</a> based website.</p>
<h2>Create and Configure a Custom Search Engine</h2>
<p>Log in and <a href="http://www.google.com/cse/manage/create" target="_blank">create a custom search engine account</a>. Standard edition is free, but requires that you display the ads on the results pages. Site Search is the paid edition, starts at $100 / month, and is ad-free.</p>
<p>While following the create wizard, customize your search engine. Customizing the Minimalist style makes it easy to style your results page by leveraging the rendered CSS to include into your own stylesheets.</p>
<p>Once the search engine has been created, the create wizard will generate the HTML output needed to drop on the webpages.</p>
<p>Here is an example JavaScript block:</p>
<pre class="brush:html">&lt;div id="cse" style="width: 100%;"&gt;Loading&lt;/div&gt;
&lt;script src="http://www.google.com/jsapi" type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  google.load('search', '1', {language : 'en', style : google.loader.themes.MINIMALIST});
  google.setOnLoadCallback(function() {
    var customSearchControl = new google.search.CustomSearchControl('%YOUR CSE KEY WILL BE HERE%');
    customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
    customSearchControl.draw('cse');
  }, true);
&lt;/script&gt;</pre><h2>Search Input Form</h2>
<p>Drop a &lt;asp:textbox /&gt; and &lt;asp:linkbutton /&gt; control either on your Default.master or another .aspx page to handle the global search input elements.</p>
<pre class="brush:html">&lt;asp:textbox id="Textbox1" runat="server" rel="/Search.aspx?q={0}" /&gt;
&lt;asp:linkbutton id="LinkButton1" runat="server" Text="Search" onclick="LinkButton1_Click" /&gt;</pre><p>There are many ways to handle triggering the search request. In this example, a keypress handler is bound to the keypress even of the textbox using <a href="http://jquery.com" target="_blank" title="jQuery">jQuery</a>.</p>
<pre class="brush:js">$(document).ready(
	function ()
	{
		$('#&lt;%= Textbox1.ClientID %&gt;').bind('keydown', function (e)
		{
			if (e.which == 13)
			{
				// trigger the __postBack() event of the linkbutton
				window.location = $('#&lt;%= LinkButton1.ClientID %&gt;').attr('href');
				return false; // don't capture any keypress event
			}
		});
	});</pre><p>Handle the linkbutton click event. <em>(This should be done in the code behind or business classes)</em> </p>
<pre class="brush:csharp">protected void LinkButton1_Click(object s, EventArgs e)
{
	// use the relationship (rel) attribute of the
	// textbox to store the url formatter string
	string searchURL = String.Format(Textbox1.Attributes["rel"],
	HttpUtility.UrlEncodeUnicode(Textbox1.Text));
	Response.Redirect(searchURL, true);
}</pre><h2>Search Results Page</h2>
<p>On the Search.aspx page, drop the HTML code provided by the Google CSE creation wizard. The code below has been modified to handle the rendering events of the CSE in order to synchronize the site search textbox with the search queries entered into the CSE.</p>
<pre class="brush:js">google.load('search', '1', { language: 'en' });
google.setOnLoadCallback(function ()
{
	var customSearchControl = new google.search.CustomSearchControl('%GOOGLE_CSE_KEY%');
	customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
	customSearchControl.setLinkTarget(google.search.Search.LINK_TARGET_TOP); // target the parent iframe
	customSearchControl.setSearchCompleteCallback(window, onSearchComplete, this); // handle callback
	customSearchControl.draw('cse');
	customSearchControl.execute('&lt;%= HttpUtility.HtmlEncode(Request.QueryString["q"]) %&gt;');
}, true);

function onSearchComplete(search)
{
	$('#&lt;%= Textbox1.ClientID %&gt;').val(search.Tc);
}</pre><p>Your search page then just needs the CSE DIV to which the search form and results will be rendered.</p>
<pre class="brush:html">&lt;form runat="server"&gt;
	&lt;div id="cse" style="width: 100%;"&gt;Loading&lt;/div&gt;
&lt;/form&gt;</pre><p>Here is the entire page in a working example. Here is a working example of the <a href="http://www.skonet.com/uploadedfiles/code/googlecustomsearchengine.aspx" title="Google Customer Search Engine" target="_blank">Google Customer Search Engine</a>.</p>
<pre class="brush:html">&lt;%@ page language="C#" autoeventwireup="true" %&gt;
&lt;script language="c#" runat="server"&gt;
	protected void Search_Click(object s, EventArgs e)
	{
		// use the relationship (rel) attribute of the
		// textbox to store the url formatter string
		string searchURL = String.Format(SearchBox.Attributes["rel"], Request.Url.AbsolutePath, HttpUtility.UrlEncodeUnicode(SearchBox.Text));
		Response.Redirect(searchURL, true);
	}
&lt;/script&gt;
&lt;!doctype html&gt;
&lt;html&gt;
	&lt;head runat="server"&gt;
		&lt;title&gt;Google Search Example&lt;/title&gt;
		&lt;script type="text/javascript" src="http://www.skonet.com//www.google.com/jsapi"&gt;&lt;/script&gt;
		&lt;script type="text/javascript" src="http://www.skonet.com//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"&gt;&lt;/script&gt;
		&lt;script type="text/javascript"&gt;
			$().ready(function ()
			{
				$('#&lt;%= SearchBox.ClientID %&gt;').bind('keydown', function (e)
				{
					if (e.which == 13)
					{
						// trigger the __postBack() event of the linkbutton
						window.location = $('#&lt;%= Search.ClientID %&gt;').attr('href');
						return false; // don't capture the keypress event
					}
				});
			});

			google.load('search', '1', { language: 'en' });
			google.setOnLoadCallback(function ()
			{
				var customSearchControl = new google.search.CustomSearchControl('002003371182621917485:m90nacd99nk');
				customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
				customSearchControl.setLinkTarget(google.search.Search.LINK_TARGET_TOP); // target the parent iframe
				customSearchControl.setSearchCompleteCallback(window, onSearchComplete, this);
				customSearchControl.draw('cse');
				customSearchControl.execute('&lt;%= HttpUtility.HtmlEncode(Request.QueryString["q"]) %&gt;');
			}, true);

			function onSearchComplete(search)
			{
				$('#&lt;%= SearchBox.ClientID %&gt;').val(search.Ic);
			}
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;form runat="server"&gt;
			&lt;asp:textbox id="SearchBox" runat="server" rel="{0}?q={1}"  /&gt;
			&lt;asp:linkbutton id="Search" runat="server" text="Search" onclick="Search_Click" /&gt;
			&lt;div id="cse" style="width: 100%;"&gt;Loading...&lt;/div&gt;
		&lt;/form&gt;
	&lt;/body&gt;
&lt;/html&gt;


</pre><h2>Conclusion</h2>
<p>Implementing a <a href="http://www.google.com/cse/" target="_blank" title="Google Custom Search Engine">Google Custom Search Engine</a> is fairly straight forward with the results being quite impressive. The <a href="http://code.google.com/apis/customsearch/docs/dev_guide.html" title="Google Custom Search Engine API" target="_blank">Google Custom Search Engine API</a>'s are equally robust if you have the bandwidth to dig into the framework as well.</p>
<p>Carry on...</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Fixing_That_Annoying__Attach_Security_Warning__Message_on_Windows_7.aspx?blogid=91">
  <title>Fixing That Annoying &#39;Attach Security Warning&#39; Message on Windows 7</title>
  <link>http://www.skonet.com/Articles_Archive/Fixing_That_Annoying__Attach_Security_Warning__Message_on_Windows_7.aspx?blogid=91</link>
  <description><![CDATA[I have had to deal with the annoying "Attach Security Warning" dialog more than once over the past year. As such, I am writing this to remind myself, and assist others that may run across it, on how to fix the warning message when manually attaching the Visual Studio (2008 and 2010) debugger to the web processes in Windows 7.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2011-01-06T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have had to deal with the annoying "Attach Security Warning" dialog more than once over the past year. As such, I am writing this to remind myself, and assist others that may run across it, on how to fix the warning message when manually attaching the Visual Studio (2008 and 2010) debugger to the web processes in Windows 7.</p>
<p>The solution is simple, hack the registry. Come on Microsoft, really?</p>
<p>Anyway, you can just copy/paste this registry entry into your own .REG file to import the settings into the registry. Thanks to <a target="_blank" title="Abhijit" href="http://meondotnet.wordpress.com/2010/03/31/disable-attach-security-warning-in-visual-studio-2010/">Abhijit</a> for the full solution.</p>
<pre class="code">Windows Registry Editor Version 5.00<br /><br />[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Debugger]<br />"DisableAttachSecurityWarning"=dword:00000001<br /><br />[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger]<br />"DisableAttachSecurityWarning"=dword:00000001<br /><br /></pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Robocopy_Job_Template.aspx?blogid=91">
  <title>Robocopy Job Template</title>
  <link>http://www.skonet.com/Articles_Archive/Robocopy_Job_Template.aspx?blogid=91</link>
  <description><![CDATA[<p> When not using a full  MSBuild  deployment, I leverage the Windows  Robocopy  utility to deploy website files. I have put together a job template for reference and general use. 
 Enjoy. 
 :: Source Directory : /sd:c:\%SOURCE_PATH%	:: Source Directory.  :: Destination Directory : /dd:c:\%DEST_PATH%	:: Destination Dir</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-12-31T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>When not using a full <a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx" title="MSBuild" target="_blank">MSBuild</a> deployment, I leverage the Windows <a target="_blank" href="http://technet.microsoft.com/en-us/library/cc733145%28WS.10%29.aspx">Robocopy</a> utility to deploy website files. I have put together a job template for reference and general use.</p>
<p>Usage: robocopy.exe /job:"c:\path_to_job_file\job_file.rcj"</p>
<p>Download the <a href="http://www.skonet.com/uploadedFiles/Deploy.rcj.txt" title="Robocopy Job Template" target="_blank">Robocopy Job Template</a> </p>
<p>Enjoy.</p>
<pre class="brush:plain">:: Source Directory :
/sd:c:\%SOURCE_PATH%	:: Source Directory.
	
:: Destination Directory :
/dd:c:\%DEST_PATH%	:: Destination Directory.

	
:: File selection options
:: /a		:: Copies only files for which the Archive attribute is set.
:: /m		:: Copies only files for which the Archive attribute is set, and resets the Archive attribute.

	
::  R – Read only
::  A – Archive
::  S – System
::  H – Hidden
::  C – Compressed
::  N – Not content indexed
::  E – Encrypted
::  T – Temporary
::  O - Offline
:: /ia:[RASHCNETO]		:: Includes only files for which any of the specified attributes are set.
:: /xa:[RASHCNETO]		:: Excludes files for which any of the specified attributes are set.

	
/xf &lt;FileName&gt;[ ...]		:: Excludes files that match the specified names or paths. Note that FileName can include wildcard characters (* and ?).
	*.fla
	*.as
	*.cs
	*.vb
	*.csproj
	*.config
	*.user
	*.Publish.xml
	Readme.txt
	EkDAVlog.txt
	noise.enu	

	
/xd	:: Excludes directories that match the specified names and paths.
	.svn
	App_Browsers
	App_Code
	App_GlobalResources
	App_WebReferences
	AssetManagement
	aspnet_client
	Common
	Config
	LatestChanges
	Properties
	Widgets
	Assets
	Logs
	Obj
	Privateassets
	Uploadedfiles
	Uploadedimages
	Workarea

	
:: /xct		:: Excludes changed files.
:: /xn		:: Excludes newer files.
:: /xo		:: Excludes older files.
:: /xx		:: Excludes extra files and directories.
:: /xl		:: Excludes "lonely" files and directories.
:: /is		:: Includes the same files.
:: /it		:: Includes "tweaked" files.
:: /max:&lt;N&gt;		:: Specifies the maximum file size (to exclude files bigger than N bytes).
:: /min:&lt;N&gt;		:: Specifies the minimum file size (to exclude files smaller than N bytes).
:: /maxage:&lt;N&gt;		:: Specifies the maximum file age (to exclude files older than N days or date).
:: /minage:&lt;N&gt;		:: Specifies the minimum file age (exclude files newer than N days or date).
:: /maxlad:&lt;N&gt;		:: Specifies the maximum last access date (excludes files unused since N).
:: /minlad:&lt;N&gt;		:: Specifies the minimum last access date (excludes files used since N) If N is less than 1900, N specifies the number of days. Otherwise, N specifies a date in the format YYYYMMDD.
:: /xj		:: Excludes junction points, which are normally included by default.
:: /fft		:: Assumes FAT file times (two-second precision).
:: /dst		:: Compensates for one-hour DST time differences.
:: /xjd		:: Excludes junction points for directories.
:: /xjf		:: Excludes junction points for files.

	

	
:: Copy options
/s				:: Copies subdirectories. Note that this option excludes empty directories.
/e				:: Copies subdirectories. Note that this option includes empty directories.
:: /lev:&lt;N&gt;	:: Copies only the top N levels of the source directory tree.
:: /z				:: Copies files in Restart mode.
:: /b				:: Copies files in Backup mode.
:: /zb				:: Uses Restart mode. If access is denied, this option uses Backup mode.
:: /efsraw		:: Copies all encrypted files in EFS RAW mode.
:: /copy:&lt;CopyFlags&gt;	:: Specifies the file properties to be copied.
		:: The following are the valid values for this option:
			:: D Data
			:: A Attributes
			:: T Time stamps
			:: S NTFS access control list (ACL)
			:: O Owner information
			:: U Auditing information
		:: The default value for CopyFlags is DAT (data, attributes, and time stamps).

	
:: /dcopy:T	:: Copies directory time stamps.
:: /sec			:: Copies files with security (equivalent to /copy:DAT).
:: /copyall	:: Copies all file information (equivalent to /copy:DATSOU).
:: /nocopy		:: Copies no file information (useful with /purge).
:: /secfix		:: Fixes file security on all files, even skipped ones.
:: /timfix		:: Fixes file times on all files, even skipped ones.
:: /purge		:: Deletes destination files and directories that no longer exist in the source. For additional information, see Remarks.
:: /mir			:: Mirrors a directory tree (equivalent to /e plus /purge). For additional information, see Remarks.
:: /mov			:: Moves files, and deletes them from the source after they are copied.
:: /move			:: Moves files and directories, and deletes them from the source after they are copied.
:: /a+:[RASHCNET]	:: Adds the specified attributes to copied files.
:: /a-:[RASHCNET]	:: Removes the specified attributes from copied files.
:: /create		:: Creates a directory tree and zero-length files only.
:: /fat			:: Creates destination files by using 8.3 character-length FAT file names only.
:: /256			:: Turns off support for very long paths (longer than 256 characters).
:: /mon:&lt;N&gt;	:: Monitors the source, and runs again when more than N changes are detected.
:: /mot:&lt;M&gt;	:: Monitors source, and runs again in M minutes if changes are detected.
:: /rh:hhmm-hhmm		:: Specifies run times when new copies may be started.
:: /pf				:: Checks run times on a per-file (not per-pass) basis.
:: /ipg:n		:: Specifies the inter-packet gap to free bandwidth on slow lines.
:: /sl				:: Copies the symbolic link instead of the target.

	
:: Retry Options :
/r:2	:: number of Retries on failed copies: default 1 million.
/w:10		:: Wait time between retries: default is 30 seconds.


:: Logging Options :
/v		:: produce Verbose output, showing skipped files.</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Search_Engine_Optimization_Reference.aspx?blogid=91">
  <title>Search Engine Optimization Reference</title>
  <link>http://www.skonet.com/Articles_Archive/Search_Engine_Optimization_Reference.aspx?blogid=91</link>
  <description><![CDATA[<p> Search Engine Optimization Reference 
 v.01, October 4, 2010 
 There are hundreds if not thousands of references regarding website search engine optimization. I have opted to compile and maintain my own core reference which will be used as the "base" recommendation for websites on which I work. 
 General Techniques</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-10-04T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p class="updated">Updated November 14, 2011</p>
<p>An SEO checklist web developers should adhere to when programming SEO optimized websites.</p>
<h2>General</h2>
<table cellspacing="0" cellpadding="0" class="matrix">
<tbody>
<tr>
<td class="label wide">Domain Name</td>
<td>The domain name should be brandable, rankable, and linkable. The argument to create keyword heavy domain names is no longer relevant.</td>
</tr>
<tr>
<td class="label wide">Domain Canonicalization</td>
<td>http://www.example.com/ or http://example.com/, pick one and stick with it. Use 301 permanent redirects to redirect the least preferred URLs back to the preferred.</td>
</tr>
<tr>
<td class="label wide">File/Directory Names Using Keywords</td>
<td>Your file names and directory names should contain keywords. (e.g. http://www.example.com/products/product_category/product_name.html)/</td>
</tr>
<tr>
<td class="label wide">Page File Size</td>
<td>No more than 150 kilobytes (Before Images, CSS and other Attachments)</td>
</tr>
<tr>
<td class="label wide">Amount of Links</td>
<td>No more than 100 unique links per page</td>
</tr>
<tr>
<td class="label wide">Parameters in URL</td>
<td>No more than 2. Bad: http://www.example.com/products/?object=1&amp;amp;type=2&amp;amp;kind=3&amp;amp;node=5&amp;amp;arg=6. Good: http://www.example.com/products/shoes</td>
</tr>
<tr>
<td class="label wide">Depth of URL</td>
<td>No more than 4. Bad: http://www.example.com/people/places/things/noun/danny/car. Good: http://www.example.com/people/danny/</td>
</tr>
<tr>
<td class="label wide">Hyphens or Underscores</td>
<td>Use hyphens ( - ) <strong>OR</strong> underscores ( _ ) to separate words in directory and file names. In the past, hyphens have been recommended, but Google and other search engines have been parsing underscores as spaces in URLs.</td>
</tr>
<tr>
<td class="label wide">Navigation on Every Page</td>
<td>Place consistent navigation on every page of your website. Navigation should link to the major sections, including the homepage.</td>
</tr>
<tr>
<td class="label wide">Sitemap</td>
<td>Prepare two sitemaps: one for users (/Sitemap.aspx), one for search engines (XML sitemap, /Sitemap.xml, /Sitemap.xml.gz, or /Sitemap.gz). The sitemap should contain links to the major sections and sub-sections of your website. The sitemap should be linked to from your website's home page at the very least. The sitemap should be linked to from every page.</td>
</tr>
<tr>
<td class="label wide">404 Page</td>
<td>Create and maintain a 404 page.</td>
</tr>
<tr>
<td class="label wide">Robots.txt File</td>
<td>Most web crawlers look for a robots.txt file in your root directory. Create a valid robots.txt. The common robot traps are: Input Forms, Session IDs in URL, Pages Restricted by Cookies, Frames, and Logins</td>
</tr>
<tr>
<td class="label wide">Validation</td>
<td>Every page on your website should adhere to W3C standards as closely as possible. Standards compliant Web pages help with cross browser compatibility and MAY help with SERPs.</td>
</tr>
<tr>
<td class="label wide">Content</td>
<td>A page should have more text content than markup language. Having pages upon pages of original, relevant content is the best form of search engine optimization.</td>
</tr>
<tr>
<td class="label wide">Refresh Content</td>
<td>If you can add a new page of content every day then your site will stay fresh and give search engine crawlers a reason to keep coming back day in and day out.</td>
</tr>
<tr>
<td class="label wide">Keyword Density</td>
<td>Main keywords should have a density of at least 5% and no more than 30%. Should be higher than the densities of other phrases and words.</td>
</tr>
<tr>
<td class="label wide">Tricks, Bombs, Etc.</td>
<td>If it doesn't seem ethical, then it isn't a good idea. If it doesn't help your visitors, then don't do it.</td>
</tr>
<tr>
<td class="label wide">Broken Links</td>
<td>Linking to pages that don't exist is a very bad thing. Run Xenu or another link validation tool to check for broken links.</td>
</tr>
</tbody>
</table>
<h2>Programming</h2>
<table cellspacing="0" cellpadding="0" class="matrix">
<tbody>
<tr>
<td class="label wide">Title Tag</td>
<td>The title (&lt;title&gt;Keyword&lt;/title&gt;) of the page should be used in the TITLE tag and at the top of every page. The title should be keyword rich (containing a max of 7 to 10 words, No more than 70 characters), unique, and accurate. (e.g. Keyword | Category | Website Title). Don't match up the H1 tag and the title tag.</td>
</tr>
<tr>
<td class="label wide">Description META Tag</td>
<td>Some search engines use them underneath a pages title on search engine result pages (SERPs). No more than 155 characters. Your description should be a keyword rich, complete sentence.</td>
</tr>
<tr>
<td class="label wide">Keyword META Tag</td>
<td>Ultimately, most (relevant) search engines ignore the tag. If used, separate keywords by spaces, commas or both.</td>
</tr>
<tr>
<td class="label wide">Robots META Tag</td>
<td>Search engines user the robots.txt file to effectively navigate and index your website. A well written robots.txt file helps improve search engine rankings by providing important information to the search engine bots.</td>
</tr>
<tr>
<td class="label wide"><a href="http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html" target="_blank">Canonical Links</a></td>
<td><a href="http://www.google.com" title="Google" target="_blank">Google</a>, <a href="http://www.yahoo.com" title="Yahoo" target="_blank">Yahoo</a> and <a href="http://www.microsoft.com" title="Microsoft" target="_blank">Microsoft</a> provide webmasters a means to specify a link element that allows you to publicly specify your preferred version of a URL. If your site has identical or vastly similar content that's accessible through multiple URLs, this format provides you with more control over the URL returned in search results. It also helps to make sure that properties such as link popularity are consolidated to your preferred version.</td>
</tr>
<tr>
<td class="label wide">Heading Tags</td>
<td>Heading tags (H1, H2, H3, H4, etc.) should be used wherever possible and should be structured appropriately (H1 comes before H2, etc). Only use one H1 tag per page, and every page should have a unique H1 tag. (&lt;h1&gt;Most Important&lt;/h1&gt;, &lt;h2&gt;Second Most Important&lt;/h2&gt;, &lt;h3&gt;Third Most Important&lt;/h3&gt;)</td>
</tr>
<tr>
<td class="label wide">Hidden Text</td>
<td>Google has specifically mentioned flagging websites/pages as untrusted if it finds any attempt to <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=66353" title="hide text and links" target="_blank">hide text and links</a> via CSS or any other means. Our friend Matt Cutts recommends <a href="http://www.youtube.com/watch?v=fBLvn_WkDJ4 " title="using ALT text" target="_blank">using ALT text</a>.</td>
</tr>
<tr>
<td class="label wide">Bold/Strong Tags</td>
<td>&lt;b&gt;Keyword&lt;/b&gt;, &lt;strong&gt;Keyword&lt;/strong&gt;: both hold the same worth with regards to engine rankings.</td>
</tr>
<tr>
<td class="label wide">Image Tags</td>
<td>(&lt;img src="keyword.jpg" alt="keyword" /&gt;) Should have an ALT tag and use keyword rich description of what the image is, especially if the image contains text.</td>
</tr>
<tr>
<td class="label wide">Anchor Tag</td>
<td>&lt;a href="http://www.example.com/webpage.html" title="keyword" rel="nofollow"&gt;Keyword in Anchor Text&lt;/a&gt;</td>
</tr>
<tr>
<td class="label wide">Anchor Text</td>
<td>The anchor text you use for a link should provide at least a basic idea of what the page linked to is about.</td>
</tr>
<tr>
<td class="label wide">Anchor TITLE Attribute</td>
<td>Use the anchor TITLE attribute (example: &lt;a href="page.html" title="This page contains links to other pages."&gt;). The TITLE attribute improves usability/accessibility. Be sure to include keywords as you see fit but remember it should tell your visitors where they will go when they click the link.</td>
</tr>
<tr>
<td class="label wide">Named Anchors</td>
<td>Though named anchors (#name) or "jump links" do not get individually indexed by Google, they do improve how your website will appear in Google's SERPs. Ensure that long, multi-topic pages on your site are well-structured and broken into distinct logical sections. Then ensure that each section has an associated anchor with a descriptive name, and that your page includes a "table of contents" which links to the individual anchors.</td>
</tr>
<tr>
<td class="label wide">Use Text Links, Not Images</td>
<td>If you're going to link to something use text. Text in images can't be read by search engines. The only time this rule doesn't apply is when you're linking to something with a well known logo. Even then it's still better to use a text link. If you must use an image as a link then make sure you give it a good ALT tag.</td>
</tr>
<tr>
<td class="label wide">Frames</td>
<td>Don't use frames, ever.</td>
</tr>
</tbody>
</table>
<h2>References</h2>
<p>Though many of these references are old, they are still quite relevant and useful when architecting your own website's SEO strategy.</p>
<ul>
<li><a target="_blank" href="http://www.socialh.com/seo-tips-for-web-designing/">30 Great SEO Tips for Web Designing</a> </li>
<li><a target="_blank" href="http://www.searchenginejournal.com/canonicalization-seo-should-i-use-www-or-not/6950/">Canonicalization &amp; SEO : Should I use WWW or not?</a> </li>
<li><a target="_blank" href="http://www.google.com/support/forum/p/Webmasters/thread?tid=2a3eee1ff6ba7cb8&amp;hl=en">Does having hyphens in domain names affect seo and ranking? </a> </li>
<li><a target="_blank" href="http://www.seobook.com/how-choose-great-domain-names">How To Choose Domain Names For SEO</a> </li>
<li><a target="_blank" href="http://www.mattcutts.com/blog/whitehat-seo-tips-for-bloggers/">Whitehat SEO tips for bloggers</a> </li>
<li><a target="_blank" href="http://www.searchenginejournal.com/7-essential-seo-cheat-sheets/8908/">7 Essential SEO Cheat Sheets</a> </li>
<li><a target="_blank" href="http://css-tricks.com/common-sense-seo-checklist/">Common Sense SEO Checklist</a> </li>
<li><a target="_blank" href="http://www.microsoft.com/web/seo/default.aspx">Free SEO Toolkit from Microsoft</a> </li>
<li><a target="_blank" href="http://www.vaughns-1-pagers.com/internet/google-ranking-factors.htm">Google Ranking Factors - SEO Checklist</a> </li>
<li><a target="_blank" href="http://www.submitawebsite.com/blog/2009/07/h1-tag-recommendations.html">H1 Tag Recommendations</a> </li>
<li><a target="_blank" href="http://www.scottklarr.com/topic/94/html-and-xhtml-cheat-sheets/">Html and Xhtml cheat sheets</a> </li>
<li><a target="_blank" href="http://searchengineland.com/meta-keywords-tag-101-how-to-legally-hide-words-on-your-pages-for-search-engines-12099">Meta Keywords Tag 101: How To “Legally” Hide Words On Your Pages For Search Engines</a> </li>
<li><a target="_blank" href="http://www.imediaconnection.com/content/28301.asp" title="Rules for beating Google at SEO">Rules for beating Google at SEO</a> </li>
<li><a href="http://googlewebmastercentral.blogspot.com/2009/09/using-named-anchors-to-identify.html" title="Using named anchors to identify sections on your pages" target="_blank">Using named anchors to identify sections on your pages</a></li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Visio_Macro_To_List_Document_Tabs.aspx?blogid=91">
  <title>Visio Macro To List Document Tabs</title>
  <link>http://www.skonet.com/Articles_Archive/Visio_Macro_To_List_Document_Tabs.aspx?blogid=91</link>
  <description><![CDATA[<p>Some I wrote up quickly to throw a sequential list of all the tabs (pages) of a Microsoft Visio document into a Shape (e.g. table of contents). Create your overview page Drop a shape onto the canvas Open the shape</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-06-17T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I wrote up quickly to throw a sequential list of all the tabs (pages) of a Microsoft Visio document into a Shape (e.g. table of contents).</p>
<ol>
<li>Create your overview page</li>
<li>Drop a shape onto the canvas</li>
<li>Open the shape sheet and assign the sheet a name (mine is called "Tabs")</li>
<li>Open the VBA editor (ALT + F11)</li>
<li>Paste the code from below into your document's code window</li>
<li>Make sure the name of your shape matches the <em>Shape</em> reference in the code</li>
<li>Right-click the shape and assign a macro behavior to the new macro/method</li>
<li>Double-click the shape</li>
<li>You're welcome</li>
</ol>
<pre class="code">
Public Sub FillOverViewPage()
    Dim vsoChars As Visio.Characters
    Dim vsoPages As Visio.Pages
    Dim i As Integer
    
    Set vsoPages = Me.Pages
    Set vsoChars = Me.Pages(1).Shapes("Tabs").Characters
    
    ' clear whats in there now
    vsoChars.Text = ""
    
    ' loop pages and add page name to the chars
    For i = 1 To vsoPages.Count
        If vsoPages(i).Background = False Then
            vsoChars.Text = vsoChars.Text &amp; i &amp; " - " &amp; vsoPages(i).Name &amp; vbCrLf
        End If
    Next i
End Sub
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Helpful_Sql_Scripts_for_Ektron_CMS_400_Net.aspx?blogid=91">
  <title>Helpful Sql Scripts for Ektron CMS 400.Net</title>
  <link>http://www.skonet.com/Articles_Archive/Helpful_Sql_Scripts_for_Ektron_CMS_400_Net.aspx?blogid=91</link>
  <description><![CDATA[<p>Helpful Sql Scripts for Ektron CMS 400.Net A compilation of various SQL scripts I have acquired, modified or written myself to perform various tasks not possible through the workarea (at least as of 8.0). Disclaimer if you are downloading and</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-06-12T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p><em>Last Updated September 11, 2011</em> </p>
<p>A compilation of various SQL scripts I have acquired, modified or written myself to perform various tasks not possible through the workarea (at least as of 8.0).</p>
<p><em>Disclaimer: if you are downloading and utilizing these scripts, one can only assume you are familiar with SQL Server and: 1) have backed up your database, 2) have tested on a dev or staging instance, 3) run uncommitted until you are certain the appropriate results have been verified. I have spoken.</em> </p>
<ul>
<li><a target="_blank" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_Content_Html.txt" title="Ektron Find Replace In Content Html">Ektron Find Replace In Content Html</a>—Script to search and replace specific content/phrases through the entire content table. This script can be modified to handle different scenarios as well.</li>
<li><a target="_blank" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_Library.txt" title="Ektron Find Replace In Library">Ektron Find Replace In Library</a>—Script to search and replace specific library links.</li>
<li><a target="_blank" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_SiteMap.txt" title="Ektron Find Replace In SiteMap">Ektron Find Replace In SiteMap</a>— Script to search and replace sitemap links/titles/etc.</li>
<li><a target="_blank" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_Menu.txt" title="Ektron Find Replace In Menu">Ektron Find Replace In Menu</a>—Script to rename menu link paths. </li>
<li><a target="_blank" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_UrlAliasManual.txt" title="Ektron Find Replace In Menu">Ektron Find Replace In UrlAliasManual</a>—Script to rename manual aliases. </li>
<li><a target="_blank" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_Library_Folder_Names.txt" title="Ektron Find Replace Library Folder Names">Ektron Find Replace Library Folder Names</a>—Script to rename folder paths of renamed cms folders. </li>
<li><a target="_blank" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Rename_Templates.txt" title="Ektron Rename Templates">Ektron Rename Templates</a>—Script to rename template paths. </li>
<li>Ektron Retrieve Current Version Script—<pre>select convert(varchar,version) from settings</pre> </li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Programmatically_Enable_ThickBox_Functionality_in_Ektron_CMS_400_Net.aspx?blogid=91">
  <title>How to Programmatically Enable ThickBox Functionality in Ektron CMS 400.Net</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Programmatically_Enable_ThickBox_Functionality_in_Ektron_CMS_400_Net.aspx?blogid=91</link>
  <description><![CDATA[Ektron CMS 400.Net includes a proprietary version of jQuery  to handle most if not all its DHTML/AJAX client-side requirements. I wanted to demonstrate how a developer could leverage the out-of-box ThickBox (lightbox, etc.) functionality that is used throughout the Ektron components.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-04-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p><a target="_blank" title="Ektron CMS 400.Net" href="http://www.ektron.com">Ektron CMS 400.Net</a> includes a <a target="_blank" title="proprietary version" href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=17838">proprietary version</a> of <a target="_blank" title="jQuery" href="http://www.jquery.org">jQuery</a> to handle most if not all its DHTML/AJAX client-side requirements. I wanted to demonstrate how a developer could leverage the out-of-box <a target="_blank" title="ThickBox" href="http://jquery.com/demo/thickbox/">ThickBox</a> (lightbox, etc.) functionality that is used throughout the Ektron components. Do not include your own jQuery library (unless you are forced to). You will end up killing your site performance by loading two complete jQuery libraries.</p>
<ol>
<li>Make sure the Ektron version of the ThickBox library is loaded. The easiest and least conflicting way is to register the JavaScript and StyleSheet in your .CS page OnInit or OnLoad events:
<pre class="code">// make sure we're loading the ektron thickbox script<br />Ektron.Cms.API.JS.RegisterJS(this, Ektron.Cms.API.JS.ManagedScript.EktronThickBoxJS);<br />Ektron.Cms.API.Css.RegisterCss(this, Ektron.Cms.API.Css.ManagedStyleSheet.EktronThickBoxCss);</pre></li>
<li>Tag your links with the necessary Ektron ThickBox class name:
<pre class="code">class="ek_thickbox"</pre></li>
<li>Modify any Ektron ThickBox attributes (based on the standard ThickBox URL tags):
<pre class="code">href="http://www.example.org?KeepThis=true&amp;EkTB_iframe=true&amp;height=500&amp;width=750</pre></li>
<li>Done!</li>
</ol>
<p>Obviously there is much more you can do to customize your interface, styles, etc. But for a quick and dirty yet functional "lights out" effect, you can't beat this.</p>
<p>Carry on.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/CMS400-Plugin_Event_Log_Errors.aspx?blogid=91">
  <title>CMS400-Plugin Event Log Errors</title>
  <link>http://www.skonet.com/Articles_Archive/CMS400-Plugin_Event_Log_Errors.aspx?blogid=91</link>
  <description><![CDATA[<p>Ektron has a snazzy <a href="../../../../../../../../../../../../../../workarea/help/Extra%20developer%20topics/Plug-in%20Architecture.htm" title="plug-in framework" target="_blank" style="">plug-in framework</a> that 
allows developers to write applications that hook directly into the CMS 
event model, thereby allowing us to create our own logic that is handled
 inline, alongside, within the CMS's.</p>
<p>If you have installed the <a href="../../../../../../../../../../../../../../workarea/help/Extra%20developer%20topics/DeveloperSDK.htm#DeveloperSDK_1781729295_1007576" title="Ektron Developer SDK" target="_blank" style="">Ektron Developer SDK</a> 
as part of your core platform installation, this service will run 
automatically and has a couple of default plug-ins (Google, etc.) that 
run after installation.</p>
<p>The problem is that out of the box, these modules are not configured,
 so every time someone does anything in the work area that causes the 
plug-ins to fire, you <em>may</em> get errors.</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-04-08T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Ektron has a snazzy <a href="http://www.skonet.com/workarea/help/Extra%20developer%20topics/Plug-in%20Architecture.htm" title="plug-in framework" target="_blank">plug-in framework</a> that allows developers to write applications that hook directly into the CMS event model, thereby allowing us to create our own logic that is handled inline, alongside, within the CMS's.</p>
<p>If you have installed the <a href="http://www.skonet.com/workarea/help/Extra%20developer%20topics/DeveloperSDK.htm#DeveloperSDK_1781729295_1007576" title="Ektron Developer SDK" target="_blank">Ektron Developer SDK</a> as part of your core platform installation, this service will run automatically and has a couple of default plug-ins (Google, etc.) that run after installation.</p>
<p>The problem is that out of the box, these modules are not configured, so every time someone does anything in the work area that causes the plug-ins to fire, you <em>may</em> see errors similar to this in your Event Viewer/Log:</p>
<p><img src="http://www.skonet.com/uploadedImages/Ektron CMS-PlugIn Event Log Error.png" alt="Ektron CMS-PlugIn Event Log Error" title="Ektron CMS-PlugIn Event Log Error" /></p>
<p>This can be somewhat annoying when dealing with larger CMS sites that have hundreds or thousands of users, constantly adding, editing, and deleting content. I would imagine most installations do not need the service running, and it was probably installed by accident by the system/server administrator. In these circumstances, the easiest thing to do is to just disable the service in the Windows Services Manager. However, if you actually have a need for the plug-in service to run, you will need to manually configure the problematic plug-ins through the <a href="http://www.skonet.com/workarea/help/Extra%20developer%20topics/Configuring_a_Plug_in_Ex.htm#Plug_in_Architecture_185590548_1053631" title="Extensibility Configuration Editor" target="_blank">Extensibility Configuration Editor</a>. More than likely your developers have already done this is probably irrelevant.</p>
<p>Hopefully this helps someone searching for a reason for all the "CMS-Plugin" even log errors.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/TortoiseSVN_Global_Ignore_Pattern.aspx?blogid=91">
  <title>TortoiseSVN Global Ignore Pattern</title>
  <link>http://www.skonet.com/Articles_Archive/TortoiseSVN_Global_Ignore_Pattern.aspx?blogid=91</link>
  <description><![CDATA[I use Subversion as my version control system both at work and at home. To interact with the various Subversion repositories, I use TortoiseSVN, a SCM / source control software for Microsoft Windows and possibly the best standalone Subversion client there is. Over the years I have amassed a somewhat lengthy global ignore pattern used to prevent unversioned files from showing up in the commit dialog.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-04-07T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I use <a href="http://subversion.apache.org/" target="_blank">Subversion</a> as my version control system both at work and at home. To interact with the various Subversion repositories, I use <a title="TortoiseSVN" href="http://tortoisesvn.net/" target="_blank">TortoiseSVN</a>, a SCM / source control software for Microsoft Windows and possibly the best standalone Subversion client there is. Over the years I have amassed a somewhat lengthy <a title="global ignore pattern" href="http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html" target="_blank">global ignore pattern</a> used to prevent unversioned files from showing up in the commit dialog.</p>
<p>There are exclusions for standard <a title="Ektron" href="http://www.ektron.com/" target="_blank">Ektron</a> folders and files, Visual Studio files, etc. I expect to update this as I add/remove from my client on a regular basis.</p>
<p>Enjoy!</p>
<pre class="code">
#*# *.*~ *.a *.al *.back *.cer *.csproj.user *.data *.la *.lo *.o *.pfx *.pvk *.pyc *.pyo *.rej *.resharperoptions *.so *.so.[0-9]* *.suo *.swd *.swo *.swp *.tmp *.user *.webinfo *~ .#* .*.swp .DS_Store .libs .project .settings .svn EkDAVlog.txt EktSyncStatus PrivateAssets Thumbs.db [Aa]dx [Aa]sset[Mm]anagement [Aa]ssets [Dd]ebug [Pp]rivate[Aa]ssets [Rr]elease [Uu]ploaded[Ff]iles [Uu]ploaded[Ii]mages [Ww]idgets [Ww]orkarea _Resharper* _UpgradeReport_Files aspnet_client bin obj *.msi *.exe
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Shrink_or_Clear_Out_Large_SQL_Server_Log_Files.aspx?blogid=91">
  <title>How To Shrink or Clear Out Large SQL Server Log Files</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Shrink_or_Clear_Out_Large_SQL_Server_Log_Files.aspx?blogid=91</link>
  <description><![CDATA[While migrating our database server environment, I was reminded how huge
 SQL Server transaction log files can get. Of course in a development 
environment, transaction logs are irrelivant, so prior to migrating it 
is always best to truncate the log files as not to move GIGs of log 
files. These are the ways I am aware of to do such a thing.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-04-06T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>First, let me preface this article for all you SQL Server DBAs reading this, in no way am I recommending that the following procedure be used in a production (or development depending on your restoration policy) environment unless you know what you are doing, and are aware of the repercussions to clearing the transaction logs. If not, feel free to read <a target="_blank" title="Aaron Bertrand's post on the topic" href="http://sqlblog.com/blogs/aaron_bertrand/archive/2009/07/27/oh-the-horror-please-stop-telling-people-they-should-shrink-their-log-files.aspx">Aaron Bertrand's post on the topic</a>. The main purpose of this article is for those that are in the same situation I often find myself, quickly configured databases in a development environment that do <strong>NOT</strong> require transactions <strong>NOR</strong> restoration to any other point other than the last FULL database backup (*.bak).</p>
<p>Now, on to the article...</p>
<p>While migrating our <strong>development</strong> database server environment, I was reminded how huge SQL Server transaction log files can get. Of course in a development environment, transaction logs <strike>are</strike> may be irrelevant, so prior to migrating it is always best to truncate the log files as not to move GIGs of log files. These are the ways I am aware of to do such a thing.</p>
<p>First, perform a FULL DB BACKUP of the database (yes, seems redundant, but you will be glad if something fails and you don't lose a days worth of work.)</p>
<p><strong>Update: </strong>I've been getting so much flak from people in the community using truncate_only, I have decided to scratch it out. Continue to the recommended method below.</p>
<p><strike>You can use the following SQL command to backup the log file while truncating the existing logs <em>(note: this is deprecated in 2008)</em>:</strike></p>
<pre class="code" style="height: 100px;"><strike>backup log [dbname] with truncate_only<br />go<br /><br />dbcc shrinkdatabase ([dbname], 10, truncateonly)<br />go</strike><br /></pre><p>OR</p>
<p>You can do the same through SQL Server Management Studio:</p>
<ol>
<li>Right click the database to be "shrunk" | Properties</li>
<li>Under Select a page click Options</li>
<li>Change Recovery Model to Simple | Ok</li>
<li>Right click the database | Tasks | Shrink | Database | Ok</li>
<li>Make sure to set the recovery mode back to Full (or not, depending on your needs)</li>
<li>Done!</li>
</ol>
<p>Obviously if you are in a production environment, you probably want to actually backup your logs before you truncate.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Enable_Aliases_With_Localized_Content.aspx?blogid=91">
  <title>How to Enable Aliases With Localized Content</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Enable_Aliases_With_Localized_Content.aspx?blogid=91</link>
  <description><![CDATA[By default, the disable language awareness flag is "disabled" (ironic). 
By enabling this flag, the content for the specific language will 
display based the alias of the default language content block.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-03-27T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>This past week I had a client ask me to look into an issue they were having with their localized content not inheriting the content block's alias for the default language. I have quite a bit of localization background, but to be honest, I had not worked a lot with aliases on localized sites (we never used the built in aliasing with Ektron with the previous localized sites.) The problem was that the page rendering the content block for the default language would work, but when the site language ID was changed, the localized requests would fail (404 errors).</p>
<p>I had begun to write a custom application to manually assign the aliases to the localized content blocks, but found a buried configuration flag within the aliasing modules that resolves this issue.</p>
<p>By default, the disable language awareness flag is "disabled" (ironic). By enabling this flag, the content for the specific language will display based the alias of the default language content block.</p>
<ol>
<li>Log in to the work area as administrator</li>
<li>Browse to Settings | Configuration | Url Aliasing | Settings</li>
<li>Enter edit mode</li>
<li>Check the <strong>Disable Language Awareness</strong> checkbox</li>
<li>Save your settings<br /></li>
</ol>
<p>Also keep in mind that if you have multiple aliases for a single content block, you must set the alias you want to cascade down to be the "default" alias or else your localized content blocks will not inherit the desired alias.</p>
<p>Here is the help link reference to <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=URL_aliasing_KY.78.38.html" title="enable language aware aliases" target="_blank">enable language aware aliases</a>.</p>
<p><img src="http://www.skonet.com/uploadedImages/ektron_disable_language_awareness.png" alt="Ektron Disable Language Awareness Flag" title="Ektron Disable Language Awareness Flag" /></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Online_Project_Management_Systems.aspx?blogid=91">
  <title>Online Project Management Systems</title>
  <link>http://www.skonet.com/Articles_Archive/Online_Project_Management_Systems.aspx?blogid=91</link>
  <description><![CDATA[I have been asked on more than one occasion what online project management solution I would recommend. After emailing this list time over, I have decided to post it, permanently, on my site. For now, most of my ratings are]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-03-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have been asked on more than one occasion what <a href="http://en.wikipedia.org/wiki/Project_management_software" title="online project management solution" target="_blank">online project management solution</a> I would recommend. After emailing this list time over, I have decided to post it, permanently, on my site.</p>
<p>For now, most of my ratings are based on a combination of cost/user/feature comparison. Nothing mathematical or statistical (yet.) I hope to write more on each one as I have time to review them more.</p>
<p>I will caveat this by saying I have signed up for a trial account for all of these so I can at least say I have looked at them to a certain extent.</p>
<p>At work, we use <a href="http://www.aceproject.com" title="Ace Project" target="_blank">Ace Project</a>. Mainly because back when I was evaluating solutions, it was the best bang for the buck (and offered a hosted solution with unlimited users.)</p>
<p>Enjoy.</p>
<table cellpadding="0" class="matrix" cellmargin="0">
<tbody>
<tr>
<th>Application Name</th>
<th width="1%">Recommended</th>
</tr>
<tr class="even">
<td><a href="http://www.project-open.org/" target="_blank">Project-Open</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.assembla.com/" target="_blank">Assembla</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="even">
<td><a href="http://www.deskaway.com/index.php" target="_blank">DeskAway</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.dotproject.net/" target="_blank">dotProject</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.easyprojects.net/" target="_blank">EasyProjects</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.fogcreek.com/FogBugz/" target="_blank">FogBugs</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.liquidplanner.com/" target="_blank">Liquid Planner</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://nokahuna.com/" target="_blank">NoKahuna</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://projects.zoho.com/" target="_blank">Zoho Projects</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.phprojekt.com/" target="_blank">PHProjekt</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.aceproject.com/" target="_blank">Ace Project</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.huddle.net/price-plans/" target="_blank">Huddle</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://basecamphq.com/" target="_blank">BaseCamp</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.creativeprooffice.com/" target="_blank">CreativePro Office</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.proofhub.com/" target="_blank">Proof Hub</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.taskfreak.com/" target="_blank">TaskFreak</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="even">
<td><a href="http://www.thymer.com/" target="_blank">Thymer</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://unfuddle.com/" target="_blank">Unfuddle</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
</tbody>
</table>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_Net_Purge_Content_and_Asset_History_Utility.aspx?blogid=91">
  <title>Ektron CMS400.Net Purge Content and Asset History Utility</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Purge_Content_and_Asset_History_Utility.aspx?blogid=91</link>
  <description><![CDATA[If you are stuck with a DMS heavy CMS instance, with very limited 
disk-space, you need to read this.<br />]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-03-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>We ran into a scenario on one of our asset-heavy CMS instances. The virtual machine ran out of disk-space due to the high number of large DMS assets in the CMS. We were quickly able to clear out the disk to solve the immediate need, but I was left wondering how we could clean out old or archived assets versions that were irrelevant and unnecessary moving forward.</p>
<p>After <a target="_blank" title="tweeting" href="http://twitter.com/skowronek/status/10180888024">tweeting</a> about it, searching the forums, and even pinging my internal Ektron contacts, I was still no closer to a finding a satisfactory solution.</p>
<p>So, I decided to ask Ektron support. Kudos to knowledgeable Ektron support engineering for having the answer to my question.</p>
<p>Though it it does not do <em>exactly</em> what I had hoped, it is close enough.</p>
<p>If you are stuck with a DMS heavy CMS instance, with very limited disk-space, be sure to bookmark the following link, <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=ManagingContentFolders.61.14.html#1034768" title="Ektron CMS Purge History Option" target="_blank">Ektron CMS Purge History Option</a>.</p>
<p>The utility will allow you clear out versioned content and assets based on:</p>
<ol>
<li>A specific date before which historical versions are purged</li>
<li>A folder and subfolders</li>
<li>Published as well as checked-in versions of content</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Run_IIS_and_Apache_on_the_Same_Machine.aspx?blogid=91">
  <title>How to Run IIS and Apache on the Same Machine</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Run_IIS_and_Apache_on_the_Same_Machine.aspx?blogid=91</link>
  <description><![CDATA[<p>I have decided to consolidate various how-to's on configuring<a target="_blank" title="Apache" href="http://httpd.apache.org" style="">Apache</a><a target="_blank" title="IIS" href="http://www.iis.net" style="">IIS</a></p>
<p>andto run on the same machine 
but on different IP addresses.</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-03-02T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have decided to consolidate various how-to's on configuring <a target="_blank" title="Apache" href="http://httpd.apache.org">Apache</a> and <a target="_blank" title="IIS" href="http://www.iis.net">IIS</a> to run on the same machine but on different IP addresses.</p>
<p>This how-to assumes you have IIS and Apache installed and configured to do everything, but cannot get them to run simultaneously.</p>
<h2>Bind IIS to Specific IP Addresses</h2>
<ol>
<li>Make sure your machine has two IP addresses</li>
<li>For IIS 7<ol>
<li>Stop IIS services</li>
<li>Open a command prompt</li>
<li>Type <strong>netsh</strong></li>
<li>Type <strong>http</strong></li>
<li>Type <strong>sho iplisten</strong>. <em>(It should be blank)</em></li>
<li>Type <strong>add iplisten ipaddress=XXX.XXX.XXX.XXX</strong> (IP address to bind IIS to)<br />You should get IP address successfully added message</li>
<li>Type <strong>add iplisten ipaddress=127.0.0.0</strong> (this allows for localhost browsing)<br />You should get IP address successfully added message</li>
<li>Type <strong>sho iplisten</strong><br />It should show XXX.XXX.XXX.XXX and 127.0.0.0 in the list</li>
<li>Type <strong>exit</strong> to get out of netsh</li>
<li>Start IIS services<br /></li>
<li>Type <strong>netstat -an</strong>. Only XXX.XXX.XXX.XXX:80 and 127.0.0.0:80 should be bound to port :80.</li>
</ol>
</li>
<li>For IIS 6 <ol>
<li><a title="Follow the Microsoft KB Article" href="http://support.microsoft.com/kb/813368/EN-US/" target="_blank">Follow the Microsoft KB Article</a></li>
</ol>
</li>
</ol>
<h2>Bind Apache to Specific IP Address</h2>
<ol>
<li>Open httpd.conf</li>
<li>Set IP bindings to listen to the alternate IP and port
<ol>
<li>Listen XXX.XXX.XXX.YYY:80</li>
</ol>
</li>
<li>Restart the Apache service (httpd -k stop, httpd -k start)</li>
</ol>
<h2>Verify Bindings</h2>
<ol>
<li>Open command prompt</li>
<li>Type <strong>netstat -an</strong></li>
<li>You should see XXX.XXX.XXX.XXX:80, 127.0.0.0:80, and XXX.XXX.XXX.YYY:80</li>
<li>Open a browser and test both IP's to see if IIS and Apache come up</li>
</ol>
<p>Thanks to: </p>
<ul>
<li><a href="http://weblogs.asp.net/steveschofield/archive/2007/07/06/iis7-post-44-iis7-and-apache-on-the-same-machine.aspx" target="_blank">Steve Shofield</a></li>
<li><a title="Vijay Ganesh" href="http://geekswithblogs.net/vganesh/archive/2005/07/19/47619.aspx" target="_blank">Vijay Ganesh</a></li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_NET_Helper_Utilities.aspx?blogid=91">
  <title>Ektron CMS400.NET Helper Utilities</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_NET_Helper_Utilities.aspx?blogid=91</link>
  <description><![CDATA[In hopes to get these utilities in the public (and search engine) lime-light, I am posting the content of the Utilities.doc file of the CMS 400.Net program folder. If you are not familiar with these (as I myself haven't even taken advantage of all of them yet), I would urge that you at least read over this so you are familiar with them and what they do.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-03-01T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>In hopes to get these utilities in the public (and search engine) limelight, I am posting the content of the Utilities.doc file of the <a title="CMS400.Net" href="http://www.ektron.com">CMS400.Net</a> program folder. If you are not familiar with these (as I myself haven't even taken advantage of all of them yet), I would urge that you at least read over this so you are familiar with them and what they do.</p>
<p>Enjoy!</p>
<h2>Utilities Root Programs</h2>
<ul>
<li><strong>AssetWorkerSetup.msi</strong> - Installs a service to allow a user to place DMS assets in a directory to be uploaded to the CMS Database.</li>
<li><strong>CMS400SDK_Setup.exe</strong> - Installs Ektron Plugins so users can add there own Extensions to be used in the workarea.</li>
<li><strong>CreateFolderInfo.exe</strong> - This updates the folder structure for searching and is only run for users upgrading to 6.0 or greater.</li>
<li><strong>DBUpgrade.exe</strong> - This is used only for users upgrading from versions prior to CMS400 5.0 as well as any CMS300 product versions. This will be run automatically as needed during the CMS400 database upgrade setup.</li>
<li><strong>EktronNotificationService.exe</strong> - This executable will install the Ektron Notification Service. Installing the base installs this service for you.</li>
<li><strong>EncryptEmailPassword.exe</strong> - Tool that encrypts a user's email password for the smtpPass key in the web.config file.</li>
<li><strong>SharePoint_To_CMS.exe</strong> - Integrates CMS400 with SharePoint Portal.</li>
<li><strong>UpdateGAC.msi</strong> - This updates the EktronBasePlugin.dll in the Windows\assembly directory for use with the Ektron Extensibility Server service.</li>
<li><strong>vcredist.msi</strong> - This is run on 64 bit machines only and is used for Esync.</li>
<li><strong>WebAlerts.exe</strong> - Installs Web Alerts so users can send emails to users signed up for alerts on a specific topic.</li>
</ul>
<h2>BigIntUtility Directory</h2>
<p>The BigInt utility updates the Code-Behind files for a website from Ektron 32 bit API's to Ektron's 64 bit API's and has to be done in this version of CMS.</p>
<h2>BuiltinAccountReset</h2>
<p><strong>BuiltinAccountReset.exe</strong> - This will reset your CMS400 user \ password to Builtin \ Builtin incase you forget the Username and Password used login to the workarea.</p>
<h2>CMS Uninstaller</h2>
<p><strong>CompleteUninstall.exe</strong> - This executable will wipe your machine clean of all ektron products. Users can choose to remove a specific website or all websites as well as the application directory. (Use with caution. Once run files will not be able to be restored)</p>
<h2>DMS Directory</h2>
<p><strong>Dms400encryptpassword.exe</strong> - Allows a user to encrypt a password to be used to encrypt password in Workarea &gt; Settings &gt; Configuration &gt; Asset Server Setup &gt; Password. This password must match the one used for the EKT_ASSET_USER on the webserver.</p>
<h2>EWSUpdates Directory</h2>
<p>This directory contains a backup of the Ektron Windows Service 3.0 as well as the older Ektron Window Service file updates for users who upgrade.</p>
<h2>Icons Directory</h2>
<p>This directory holds all the icons used for the start menu shortcuts.</p>
<h2>iFilterPack Directory</h2>
<p>This directory contains the PDF Filter msi's that are installed for dms dragging and dropping.</p>
<h2>MergeCatalog Directory</h2>
<p><strong>MergeCatalog.exe</strong> - This executable is used during the sitesetup.exe to merge indexing catalogs. If a user has more than 3 sets of catalogs than it will begin to merge any new sets of catalogs that are added during future site installations.</p>
<h2>MultiSiteInstall Directory</h2>
<p><strong>Multisite.exe</strong> - This executable is used when a user wishes to setup a multisite environment. It will copy the necessary files from an existing site to directory for your multisite website. It will also configure IIS for the multisite.</p>
<h2>PasswordUpgrade Directory</h2>
<p><strong>PasswordUpgrade.exe</strong> - This executable is used during the sitesetup. If a user is upgrading there website and it's from before version 7.65 this exe will run and update all of your user password encryptions to the new password encryption values.</p>
<h2>QLXFilter Directory</h2>
<p>The QLXFilter.dll is copied to the System32 directory during the base installation. This is used for the searching feature in the CMS.</p>
<h2>ResourceFiles Directory</h2>
<p>This directory holds all the resource files for easy access to the non-binary versions of the resource files.</p>
<h2>SiteSetup Directory</h2>
<p><strong>cms400sitesetup.exe</strong> - Runs the CMS400 Site Setup install.</p>
<h2>Database directory</h2>
<p>Holds all the SQL and Oracle database scripts needed to create the CMS400 database.</p>
<h2>CMS400SiteSetup directory</h2>
<p>Holds all the files that run the CMS400 Site Setup.</p>
<h2>Logs directory</h2>
<p>Holds all the installation logs. Everytime an installation is run a new log is created and everything that occurs during the install is printed in the log.</p>
<h2>Software Directory</h2>
<ul>
<li><strong>Microsoft WSE 3.0msi</strong> - This will install WSE 3.0 which is needed for CMS400.</li>
<li><strong>SearchConfig Folder</strong> - This folder contains the SearchConfigUI.exe that indexes all of your content.</li>
<li><strong>SecurityConfigurator Folder</strong> - This folder contains the SecurityConfigurator.exe. This creates the certificates used for esync to allow users to have Esync talk from the stage machine to the production machine and vice versa.</li>
<li><strong>UrlAliasing Folder</strong> - This folder contains the UrlAliasingUpgradeCmd.exe. This run during a website upgrade and if the site is older than version 7.60. This runs updates for UrlAlias functionality.</li>
</ul>
<h2>SQLGenerator Directory</h2>
<ul>
<li><strong>SQLGenerator.exe</strong> - This executable is used to produce a sql script of your database.</li>
</ul>
<h2>Support Directory</h2>
<ul>
<li><strong>WSPathChecker.exe</strong> - This exe will check all of your websites to make sure the WSPath in each web.config don't match one another.</li>
</ul>
<h2>XMLConfigWriter Directory</h2>
<p>This folder contains dll's used in indexing content and the search feature.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_Net_Search.aspx?blogid=91">
  <title>Ektron CMS400.Net Search</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Search.aspx?blogid=91</link>
  <description><![CDATA[I've decided to start maintain a repository for things I encounter with Ektron CMS400.Net Search. This includes system issues, programming issues, and cross platform issues. I plan on maintaining this over time. Indesing Services Friendly Names File Includes all custom]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-02-17T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Over the years, and through many hours of swearing and gnashing of teeth, I have ammassed a substantial treasure-trove of wisdom dealing with the <a title="Ektron CMS400.net" href="http://www.ektron.com" target="_blank">Ektron CMS400.net</a> search. Therefore, I have decided to maintain this repository as a sort of "brain dump", primarily for my benefit in dealing with future issues that may arise, including but not limited to: system issues, programming issues, and cross platform issues.</p>
<h2>Ektron Resoures</h2>
<p>Before starting here, please read the <a title="search troubleshooting" href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.44.html" target="_blank">search troubleshooting</a> and online help for <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.3.html" target="_blank">the catalogs and index files</a>. You'll probably find something there to help you. Otherwise, feel free to continue.</p>
<h2>Nuts and Bolts of Search</h2>
<p>Ektron utilizes <a title="Windows Indexing Services" href="http://msdn.microsoft.com/en-us/library/ee805985%28VS.85%29.aspx" target="_blank">Windows Indexing Services</a> for the bulk of its search. Key things to note: HTML and other text-based content are copied as TXT files with relevant searchable content to the [Assets] and [PrivateAssets] folders. Other asset types (PPT, DOC, XLS, PDF, etc) are parsed using <a title="ifilter technology" href="http://msdn.microsoft.com/en-us/library/aa965717%28VS.85%29.aspx" target="_blank">ifilter technology</a> and corresponding content and meta data are written to the actual file on upload and saved into the <a title="properties, comments" href="http://www.skonet.com/uploadedImages/office_document_properties.gif" target="_blank">properties, comments</a> and <a title="advanced properties" href="http://www.skonet.com/uploadedImages/office_document_advanced_properties.gif" target="_blank">advanced properties</a> of the document. Indexing Services then indexes all TXT and custom attributes of everything under the [Assets] and [PrivateAssets] folders.</p>
<h2>Indexing Services</h2>
<p>Verify Private/Public catalogs have been created for your site. Easiest way to regenerate everything from scratch, is to use the <a title="SearchConfigUI tool" href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.6.html" target="_blank">SearchConfigUI tool</a>.</p>
<p>Also, make sure there are no orphaned catalogs lingering around in the registry:</p>
<pre>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex\Catalogs
</pre><h2>Friendly Names</h2>
<p>Ektron uses a friendly names mapping file (<a title="DefaultColumnFile" href="http://msdn.microsoft.com/en-us/library/ms692121%28VS.85%29.aspx" target="_blank">DefaultColumnFile</a>) to map meta data keys, smart forms fields, and other search properties to index property names. The file is specified by the following registry key:</p>
<pre>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndexCommon
</pre><p>Ektron [usually] registers their friendly names txt file under the following path.</p>
<p><strong>Update</strong> - There is a template for the FriendlyNamesDefinitionFile.txt located in the "<a title="Utilities" href="http://www.skonet.com/Articles_Archive/Ektron_CMS_400_NET_Helper_Utilities.aspx">Utilities</a>" folder for the specific version you are running.</p>
<pre>C:\Windows\System32\FriendlyNamesDefinitionFile.txt
</pre><p>This file may not contain all meta data values for your CMS meta data. Verify all your meta data definitions have a record in this files (as well as the custom meta data search you are using.)</p>
<p>Learn more about the <a title="catalog and index files Ektron uses" href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.3.html" target="_blank">catalog and index files Ektron uses</a>.</p>
<h2>Metaconfig.doc</h2>
<p>Ektron caches Microsoft Office document meta data definitions in the metaconfig.doc file. Confirm the necessary custom properties are defined in the metaconfig.doc. Also confirm that your assets actually have values for these properties saved internally.</p>
<p>Incidentally, I've noticed this file is the same for all sites being hosted on a single server. I imagine that has to due with the single friendly names file that aggregates all custom properties.</p>
<h2>Conclusion</h2>
<p>Like eSync, search, when functioning on all cylinders, is great (and speedy). However, if any one of these systems fail, you may be looking at hours of troubleshooting. Nine times out of ten, the SearchConfigUI tool will fix it. However, for those times where it does not, you can use this reference to dig into each system and verify everything is running smoothly.</p>
<p>Happy searching!</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_Net_eSync.aspx?blogid=91">
  <title>Ektron CMS400.Net eSync</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_eSync.aspx?blogid=91</link>
  <description><![CDATA[The goal of this article is to ease the burden of troubleshooting other esync implementations out there by documenting various undocumented aspects of Ektron CMS400.Net's esync platform. Perhaps someone at Ektron will write a better explanation than this, but for now, I have not been able to locate anything better.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-02-12T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p><em><strong>Updated 4/5/2011</strong></em> </p>
<p>Regardless of your personal opinion of <a href="http://www.ektron.com" title="Ektron" target="_blank">Ektron</a>'s <a href="http://www.ektron.com/Products/Web-CMS/eSync/" title="eSync" target="_blank">eSync</a> technology, you can't help but admit it is a pretty amazing. After having used it for a few years, I have gained a love-hate relationship for its ability to seamlessly synchronize every aspect of web CMS implementations, and at the same time, cause hours of angst when it fails.</p>
<p>The goal of this article is to ease the burden of troubleshooting other esync implementations out there by documenting various undocumented aspects of Ektron CMS400.Net's esync platform. Perhaps someone at Ektron will write a better explanation than this, but for now, I have not been able to locate anything better.</p>
<p>This is not a "how to" setup and configure esync. There are plenty of articles and manuals written to assist with your eSync setup. This article is meant to be a deep dive into the inner workings of esync, in hopes of assisting other developers, system administrators, etc, that may run into similar esync failure scenarios.</p>
<h2>CMS License</h2>
<p>Esync requires a valid, current, non-expired, esync enabled license (with (S) or (EN) in the key.) If any of the servers configured in your esync system have an invalid license, <a href="http://www.skonet.com/Articles_Archive/eSync_Failing_With_Faulted_State_Error_Message.aspx">esync will fail</a>.</p>
<h2>Web.config</h2>
<ol>
<li><strong>eSyncEnabled</strong>: Set this key to true to <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=Sync.109.30.html" title="enable content/folder sync" target="_blank">enable content/folder sync</a> if the eSync feature is available.</li>
<li><strong>WSPath</strong> Must be set to the web service callback URL in the workarea (Workarea/ServerControlWS.asmx)</li>
<li><strong>encodedValue</strong> The value of this <strong>&lt;appSettings /&gt;</strong> key must match the attribute value of the public(k) cert key for the respective server in the <strong>Ektron.ASM.EktronServices30.exe.config</strong> file of the sync server.
	<p><strong>AppSettings</strong> </p>
<pre class="brush:xml">&lt;add key="encodedValue" value="%LONG_ENCODED_VALUE%" /&gt;</pre><p><strong>publickCertKeys</strong> </p>
<pre class="brush:xml">&lt;publickCertKeys&gt;
 &lt;add key="SERVERNAME_SyncClient.cer" encodedValue="%LONG_ENCODED_VALUE%" /&gt;
&lt;/publickCertKeys&gt;</pre>

 </li>
</ol>
<h2>Windows Service</h2>
<p>The esync core process is driven by the Ektron Windows Services. If you have it disabled or it is not running for some reason, do not continue. Esync will not function without the service running.</p>
<p>The following files lie under the <em>EktronWindowsService30</em> folder underneath the base installation directory.</p>
<ol>
<li><strong>Ektron.ASM.EktronServices30.exe.config</strong> - Contains valid esync certificate information for the servers that are part of the sync pair.</li>
<li><strong>sitedb.config</strong> - Stores each CMS 400.Net site configuration that the Windows service will manage. Each site must have a unique WSPath or it will not show up as a unique site to be managed (this applies to SearchConfigUI instances as well incidentally.) You can safely clear this file as it is regenerated each time the Windows service is restarted. This can help determine why a site is not functioning properly.</li>
<li><strong>log (folder)</strong> - If you haven't dug into the log folder, start. It contains error events that are not written to the event log that can help assist in troubleshooting failed esync processing.</li>
</ol>
<h2>Database Tables</h2>
<p>The following tables are used in one way or another by the esync framework:</p>
<ol>
<li><strong>[AssetServerTable]</strong> - Stores a record for each site (domain) that connects to a specific CMS instance. For example, if you have multiple IIS web sites (local or not) using the same CMS database, a separate record will exist for each server that connects to and makes request against the specific CMS instance. The main thing to confirm with this table, is that a record with a valid callback URL (sometimes blank if the Windows service fails to catalog each server) for each esynced web site. If you have problems with any CMS processes that rely on the Windows service, you can safely truncate/delete the records from this table, restart the Ektron Windows Service, and regenerate the valid records.
<ul>
<li><strong>[callbackUrl]</strong> - Callback URL the service uses to perform actions.</li>
</ul>



 </li>
<li><strong>[scheduler]</strong> - Stores configuration options for each esync configuration instance. <ul>
<li><strong>[scheduledesc]</strong> - The current sync status of that particular instance (usually completed or running)</li>
<li><strong>[<a href="#triggeraction">triggeraction</a>]</strong> - The configuration options for the specific esync instance (get to know this). Also stored in the Sync folder XML configuration files. I'm assuming this field is tied directly to the XML config settings somehow.</li>
</ul>



 </li>
<li><strong>[perform_action]</strong> - This table is the engine of the Windows service. Any action the service is to perform, originates in this table (such as esync actions.)</li>
<li><strong>[sync_resolve_tbl]</strong> - Undocumented at this time (anyone?)</li>
<li><strong>[syncfolder]</strong> - Undocumented</li>
</ol>
<h2><a name="triggeraction"></a>Trigger Action</h2>
<p>The triggeraction field contains the key configuration settings for the local and remote sync servers. If any of the paths in your *SiteConfigData are not set properly, or the target folders have been moved/relocated, you may get a:</p>
<pre class="brush:plain">Object reference not set to an instance of an object</pre><p>error as well.</p>
<pre class="brush:xml">&lt;ScheduleInfo&gt;
&lt;RemoteSite&gt;server=%REMOTE_DB_HOST%;database=%REMOTE_DB_NAME%;Integrated Security=false;user=%DB_USER%;pwd=%DB_PASS%;&lt;/RemoteSite&gt;
&lt;LocalSite&gt;server=%LOCAL_DB_HOST%;database=%LOCAL_DB_NAME%;Integrated Security=false;user=%DB_USER%;pwd=%DB_PASS%;&lt;/LocalSite&gt;
&lt;RemoteUrl&gt;http://%REMOTE_URL%:8732/Ektron.Sync.SyncServices/SiteCommunicationService.svc&lt;/RemoteUrl&gt;
&lt;SiteUrl&gt;http://%LOCAL_URL%:8732/Ektron.Sync.SyncServices/SiteCommunicationService.svc&lt;/SiteUrl&gt;
&lt;SyncDirection&gt;&lt;/SyncDirection&gt;
&lt;ConflictPolicy&gt;&lt;/ConflictPolicy&gt;
&lt;Files filter="none" /&gt;
&lt;LocalSiteConfigData&gt;
	&lt;AssetLibraryPath&gt;c:\%PATH_TO_ASSETLIBRARY%\AssetLibrary\&lt;/AssetLibraryPath&gt;
	&lt;AssetsPath&gt;c:\%PATH_TO_WEB_ROOT%\assets&lt;/AssetsPath&gt;
	&lt;LocalAddress&gt;%LOCAL_HOST%&lt;/LocalAddress&gt;
	&lt;LocalSiteAddress&gt;%LOCAL_HOST%&lt;/LocalSiteAddress&gt;
	&lt;PrivateAssetsPath&gt;c:\%PATH_TO_WEB_ROOT%\privateassets&lt;/PrivateAssetsPath&gt;
	&lt;SitePath&gt;c:\%PATH_TO_WEB_ROOT%&lt;/SitePath&gt;
	&lt;UploadedFilesPath&gt;c:\%PATH_TO_WEB_ROOT%\UploadedFiles&lt;/UploadedFilesPath&gt;
	&lt;UploadedImagesPath&gt;c:\%PATH_TO_WEB_ROOT%\UploadedImages&lt;/UploadedImagesPath&gt;
	&lt;WebSitePath&gt;http://%LOCAL_URL%&lt;/WebSitePath&gt;
	&lt;WorkareaPath&gt;c:\%PATH_TO_WEB_ROOT%\workarea&lt;/WorkareaPath&gt;
&lt;/LocalSiteConfigData&gt;
&lt;RemoteSiteConfigData&gt;
	&lt;AssetLibraryPath&gt;c:\%PATH_TO_ASSETLIBRARY%\AssetLibrary\&lt;/AssetLibraryPath&gt;
	&lt;AssetsPath&gt;c:\%PATH_TO_WEB_ROOT%\Assets\&lt;/AssetsPath&gt;
	&lt;PrivateAssetsPath&gt;c:\%PATH_TO_WEB_ROOT%\PrivateAssets\&lt;/PrivateAssetsPath&gt;
	&lt;RemoteAddress&gt;%REMOTE_HOST%&lt;/RemoteAddress&gt;
	&lt;SitePath&gt;c:\%PATH_TO_WEB_ROOT%&lt;/SitePath&gt;
	&lt;UploadedFilesPath&gt;c:\%PATH_TO_WEB_ROOT%\uploadedfiles\&lt;/UploadedFilesPath&gt;
	&lt;UploadedImagesPath&gt;c:\%PATH_TO_WEB_ROOT%\UploadedImages\&lt;/UploadedImagesPath&gt;
	&lt;WebSitePath&gt;http://%REMOTE_URL%/&lt;/WebSitePath&gt;
	&lt;WorkareaPath&gt;c:\%PATH_TO_WEB_ROOT%\workarea&lt;/WorkareaPath&gt;
&lt;/RemoteSiteConfigData&gt;
&lt;IsDownloadUpload&gt;false&lt;/IsDownloadUpload&gt;
&lt;/ScheduleInfo&gt;</pre><h2>Sync Folder</h2>
<p>ESync creates local folder (usually C:\Sync) to maintain file sync status. Each sync instance has it's own root folder. InetPub (or wherever you store your web roots) for the local server, and a folder for each sync server by server name.</p>
<h3>ServerInfo.xml</h3>
<p>Esync bindings are stored in the c:\sync\ServerInfo.xml file. This file is autogenerated by the Ektron Windows Services and based on the triggeraction setting in the database.</p>
<h3>Esyncknow and Eknow Files</h3>
<p>Under each sync sub-folder is a pair of esync knowledge files: replica.esyncknow and knowledge.esyncknow (*.eknow for older versions). Deleting all *.esyncknow (*.eknow) files may solve any <em>SyncAssetLibraryFailed</em> errors.</p>
<h2>EkStatus Xml Files</h2>
<p>The <em>EkStatus</em> folder usually lives under your web root. A separate ##.xml status file is created for each esync binding configured under synchronization in the workarea. Each time an esync is kicked off, the correlating ##.xml file is truncated and all logging is done within the file. This is one of the first places to check in the event of a failed esync. You can usually determined what action esync was trying to perform at the time of failure.</p>
<h3>Conclusion</h3>
<p>Ektron CMS 400.Net Esync Technology is by far one of the most robust Web CMS synchronization platforms on the market. A successfully configured, running, synchronizing implementation results in satisfied developers, content administrators, and ultimately, content stakeholders. I have found that most issues correlate directly to one of the items listed here. Any additional information from those of you that have experienced similar situations is also welcomed.</p>
<p>Happy syncing!</p>
<h2>Other Resources</h2>
<p><a href="http://martinondotnet.blogspot.com/2010/03/ektron-esync-error-servicechannel.html" target="_blank">Martin on .NET eSync Reference</a> </p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_eSync_Error_Generating_Security_Certificates.aspx?blogid=91">
  <title>Ektron eSync Error Generating Security Certificates</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_eSync_Error_Generating_Security_Certificates.aspx?blogid=91</link>
  <description><![CDATA[<p>While setting up another client esync configuration tonight we ran into the following error. It appears right after you click to add an esync relationship, before getting references to any local security cerficates in the drop down The communication object,</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-02-04T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>While setting up another client esync configuration tonight we ran into the following error. It appears right after you click to add an esync relationship, before getting references to any local security cerficates in the drop down:</p>
<pre style="COLOR: #cc3300">
The communication object, System.ServiceModel.Channels.ServiceChannel,
cannot be used for communication because it is in the Faulted state.
Error generating security certificates.

Please make sure security configurator is run and security certificates
are properly configured.
</pre><p>After running through all the normal esync checklist items, I decided to check other setup areas, mainly the AssetServer table.</p>
<p>Keep in mind, the internal systems use this table to determine how to connect to the various servers that my be using a single database. So after clearing out ALL records (it's ok, they come back), the perform_action table (just to be sure), and restarting the Ektron Windows Services 3.0 (regenerates the records in these tables), we were aable to successfully run the esync web configuration wizard and start the esync process.</p>
<p>Chalk one up to hours and hours of troubleshooting and resolution for this one.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_eSync_Failing_With_Faulted_State_Error_Message.aspx?blogid=91">
  <title>Ektron eSync Failing With Faulted State Error Message</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_eSync_Failing_With_Faulted_State_Error_Message.aspx?blogid=91</link>
  <description><![CDATA[Today, I had the unforunate event of dealing with a failed Ektron eSync job. Also unfortunate was the fact that the error message doesn't stay up long enough to even figure out something went wrong. If you're not paying attention]]></description>
  <dc:creator></dc:creator>
  <dc:date>2010-01-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Today, I had the unfortunate event of dealing with a failed Ektron eSync job. Also unfortunate was the fact that there did not appear to be any sort of error message to even figure out something had gone wrong. The blank "Synchronization Status" just sat there, trying to figure out what it should do next, indefinitely.</p>
<p>After waiting around a few minutes, I killed the Ektron Windows Service on the source CMS instance (my developer box), restarted IIS, and re-ran the esync process. This time I made certain to pay attention. The error did not say much, nor did it stay on screen longer than a few seconds before returning to the "Synchronization Status" waiting screen. Here is what it looks like.</p>
<p><img title="Ektron eSync Fault Error Message" alt="Ektron eSync Fault Error Message" src="http://www.skonet.com/uploadedImages/ektron-esync-fault.png" border="0" /></p>
<p>Something apparently failed in the .NET System.ServiceModel.Channels.ServiceChannel class and had left eSync (Ektron?) in a faulted state.</p>
<p>What the hell does that mean?</p>
<p>After troubleshooting every Ektron log, database table, and esync system I could think of, I resorted to the nefarious Ektron forums and found an <a href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=27990" target="_blank">article in the Ektron forums</a> regarding a similar situation in which I found myself.</p>
<p>The answer came from Andrew, "check your license."</p>
<p>Now forgive me, but having a communication channel in a faulted state does NOT sound like a license issue. But what the heck, I decided to give it a shot.</p>
<p>It worked. Apparently our recently updated server license keys had omitted the (S) flag, thus discontinuing the production server's support of esync.</p>
<p>Boy, I am glad that error message helped me figure that out after two hours of spinning my wheels on completely unrelated tangents.</p>
<p>&lt;/rant&gt;</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_Upgrade_on_Replicated_SQL_Server_Instance.aspx?blogid=91">
  <title>Ektron Upgrade on Replicated SQL Server Instance</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_Upgrade_on_Replicated_SQL_Server_Instance.aspx?blogid=91</link>
  <description><![CDATA[<p>I ran into an interesting situation this evening while prototyping an Ektron upgrade for a client. After running the site upgrade utility on my local instance, the DB upgrade portion of the upgrade process failed miserably. A slew of pop</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-11-17T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I ran into an interesting situation this evening while prototyping an <a href="http://www.ektron.com/" target="_blank">Ektron</a> upgrade for a client. After running the site upgrade utility on my local instance, the database upgrade portion of the upgrade process failed miserably. A slew of pop-up error messages and then a final summary pop-up explaining that a handful of scripts did not succeed in running, <strong><em>"ERROR! Failed to execute script! Insert Error: Column name or number of supplied values does not match table definition."</em></strong></p>
<p>After digging into the error logs and reviewing the SQL scripts that failed, I ran across an issue relating to SQL Server and database replication. Apparently, to track changes, merge replication and transactional replication with queued updating subscriptions must be able to uniquely identify every row in every published table. So, if a transactional publication supports queued updating subscriptions, replication adds the column <strong><em>msrepl_tran_version</em></strong> to every table. <strong>AND</strong>, if the table is dropped from the publication, the <em>msrepl_tran_version</em> column is <strong>NOT</strong> removed!!! <a href="http://msdn.microsoft.com/en-us/library/ms151740.aspx" target="_blank"><sup>*</sup></a></p>
<p>I was dealt with having an entire Ektron CMS database that had an extra field/column in <strong>EVERY SINGLE</strong> table. Thankfully, dropping this field (and it's constraints) does nothing to Ektron. I'm not entirely sure what it does to the replication environment however.</p>
<p>I have included the SQL script I wrote to generate and run the alter statements to drop the offending field for anyone dealing with this issue. Feel free to comment if this is helpful.</p>
<p><em>And this did allow me to finally perform a successfully upgrade to 7.6.6 SP2.</em></p>
<pre class="code">
if exists (
 select o.name from syscolumns c inner join sysobjects o on c.id=o.id where c.name='msrepl_tran_version'
) 
/*
 select 'alter table ' + object_name(parent_obj) + ' drop constraint ' + name + char(13) From sysobjects where name like '%msrep%' and type ='D' and object_name(parent_obj) &lt;&gt; 'MSreplication_subscriptions'
 select 'alter table ' + object_name(ID) + ' drop column msrepl_tran_version ' + char(13) from syscolumns where name like 'msrepl_tran_version%' and object_name(ID) not like 'conflict%'
*/
 
 declare @sql varchar(1000)
 declare mycurs cursor
 for select 'alter table ' + object_name(parent_obj) + ' drop constraint ' + name + char(13) From sysobjects where name like '%msrep%' and type ='D' and object_name(parent_obj) &lt;&gt; 'MSreplication_subscriptions'
 
 open mycurs
 fetch next from mycurs into @sql
 
 while @@FETCH_STATUS = 0
 begin
  exec (@sql)
  fetch next from mycurs into @sql
 end
 
 close mycurs
 deallocate mycurs
 declare mycurs cursor
 for select 'alter table ' + object_name(ID) + ' drop column msrepl_tran_version ' + char(13) from syscolumns where name like 'msrepl_tran_version%' and object_name(ID) not like 'conflict%'
 
 open mycurs
 fetch next from mycurs into @sql
 
 while @@FETCH_STATUS = 0
 begin
  exec (@sql)
  fetch next from mycurs into @sql
 end
 
 close mycurs
 deallocate mycurs
go
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Progressive_Solution_for_Handling_Browsers_That_Have_Disabled_JavaScript_for_Your_Web_Site.aspx?blogid=91">
  <title>Progressive Solution for Handling Browsers That Have Disabled JavaScript for Your Web Site</title>
  <link>http://www.skonet.com/Articles_Archive/Progressive_Solution_for_Handling_Browsers_That_Have_Disabled_JavaScript_for_Your_Web_Site.aspx?blogid=91</link>
  <description><![CDATA[<p>Anyone that uses Firefox as their default web browser and has the NoScript add on enabled (if you don't I would highly recommend that you install it post haste) can attest to the terrible implementations of web sites that do</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-11-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Anyone that uses Firefox as their default web browser and has the NoScript add-on enabled (if you don't I would highly recommend that you install it post-haste) can attest to the terrible implementations of web sites that do not gracefully (or progressively, whichever methodology your prescribe) handle our blocking of their web site. Usually you get a mess of a user interface, intertwined with garbled presentation and missing page elements. As I am a somewhat experienced netizen, it's an easy enough thing for me to enable the scriptability of the site with a simple "allow JavaScript" from the NoScript context menu.</p>
<p>Now consider average Joe web user that, more than likely, isn't quite as browser savvy. What is the experience when they hit your site with all your highly stylized, graphical, AJAX driven, DHTML (DOH!) based components? I'll tell you, crap.</p>
<p>So what can you do? Well, my solution is simple, create a global "no script" DIV layer that contains instructions for everyone visiting your site that instructs them on the requirements for your web site. My example uses the facebook-esque notification block. The important thing to realize is that this block with always appear, regardless of their browsers ability to parse your complex JavaScript. The beauty of the method, is that you allow those visitors that DO allow your site to run it's JavaScript to <em>hide</em> your global JavaScript notice, gracefully, without interruption to their browsing experience.</p>
<p>Here is the code I have as an example. Keep in mind, this hasn't been cross-browser tested nor printer optimized (hmmm, that's a good question.)</p>
<pre class="code">
&lt;!-- NeedScript Global Notice --&gt;
&lt;style type="text/css"&gt;
.ns-shown
{
 position:absolute;
 top:0;
 left:0;
 width:100%;
 border:solid 1px #FFFF00;
 background: #FFFFEC;
 text-align:center;
}
.ns-hidden
{
 display:none;
}
&lt;/style&gt;
&lt;div id="noscript" class="ns-shown"&gt;
 &lt;p&gt;This site requires JavaScript. Please try again.&lt;/p&gt;
&lt;/div&gt;
&lt;script&gt;
var $_ns = document.getElementById('noscript');
if($_ns != undefined)
{
 $_ns.className = 'ns-hidden';
}
&lt;/script&gt;
&lt;!-- NeedScript Global Notice --&gt;
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Take_an_IIS_Web_Site_Offline.aspx?blogid=91">
  <title>How to Take an IIS Web Site Offline</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Take_an_IIS_Web_Site_Offline.aspx?blogid=91</link>
  <description><![CDATA[<p>Use the following methods to put an IIS web site into off line or maintenance mode. App_Offline.htm Static Override Page (prefered) Adding a file in the application root named App_Offline.htm automatically causes the AppDomain to recycle and modifies its behavior</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-10-27T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p><em>Updated December 14, 2011</em></p>
<h2>App_Offline.htm Static Override Page (preferred)</h2>
<p>Adding a file in the application root named <em>App_Offline.htm</em> automatically causes the AppDomain to recycle and modifies its behavior such that any request for an ASP.NET resource returns the contents of the App_Offline.htm file instead (along with an HTTP 404 status). Deleting App_Offline.htm automatically recycles the AppDomain again and the web application is back to serving its usual content.<a href="http://aspnet.4guysfromrolla.com/articles/110707-1.aspx" target="_blank">*</a></p>
<ol>
<li>Create a static HTML page called <em><strong>App_Offline.htm</strong></em></li>
<li>Filesize must be at LEAST 512MB and cannot exceed 1MB in order to work properly as an offline mode trigger</li>
</ol>
<p>A caveat to using the app_offline.htm method is that all local resources such as images and stylesheets are also taken offline and are unavailable. There are various solutions to this problem, the easiest of which is to embed the resources directly into the page as data.</p>
<p>The following loads an image that has been base 64 encoded and embedded on the page:</p>
<pre class="brush:html">&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAuCAMAAAD9RhDIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGNQTFRFkpSQYbVqsNq0ra+s1+zaiciP+Pj4mZuXyMnH5OTjp6ilu7y61tfV6uvqtLazxOPH8fLx4fHjdb59a7pznNGik8yZ9fr26/bsz9DOzejQoKGe3d3cwsPBf8OGut6+ptar////yEvtTQAAACF0Uk5T//////////////////////////////////////////8An8HQIQAABCVJREFUeNrsmNeCmzAQRWVASKJX01z4/6+MQL2AvUk22QfP0y7C6DBzNQWw+m0E1Ir1fxk4uB5uWOCD9cH6YH2TDR2EMPhxWMFls/pnYkUfrA/WP8PKyYgXEr+LFROC6f358R1RGUzR1bdS06Uyql9jkRQBZvOt8mPhhP4fssXqNgNhRaaRNJdLM+1/9Rdm99Km7Vq+1PaMoqYZCzbsbsis3naOC6Ab9mGlbG1jqMzbARqNV6Y58SqgNoO6x2p40Q1uLnteHOvpzjkytwG5i5WxlYQGObNvp06MDay6NfZoFFdp799SZ0IXC4I1TuxdiIOlUwGPJbGG5ex9P6SiVq6d11uYRQLnm4530ThYHiqUYip6KclCYd05yzPoGrm1TtU+qaaGidO0Q9Q6PpzAuj8ZVdIxyAkij/JGVSH+EuLIjkiJjh+nHYqp+cHDyKox274TMa3ZC0DvSSTqqfzo55bkNaqVqR1peYGvzgZWJ1Y5154MOnOJnoxWLdpYmT9BKaxKo8qV+BSXcldgBm0zpuetYxk033CbFKiNhV9g8RPBRM3SRGremkp1cayHtsj01Lsb79bIEPu9tRxhGVRMh6Ayb62AeIXADhMNlPTR3TiUem4fDrU1xwdYoU7F4hXar5CIyLJnr16HDDKaThQjX/HhZ4t4sVKdis20rArodtsvj34syK9Fnhjyiw8fFhapenGxTCq+P7GxMkF7hsXWHpFhD+lCt1TLLD/jysJSxUi7WNlYRByE11he82Pp1acgHqzkRbdDhOTOsPqvYq0yjkD1LoyAiUlmhAOs+B0seIxVHvVbVaraArRoBAXQi8ABVv5nWP31uDuNx9nX2PAA82pzGsT0nSBGX+/l81RIXyMQJS9WWMSP9dZJ/A0sGstExkw6JtM6l9RfEbD40TdhiQ6h0OPFfTjK/W/2IwsR+jOsyZfl38WKEVevwhL5g4hoJavvN2g9x/I0EF+YE0MHS7Z+VF7AJ65MJpEzLFYc97L8d7DWBYgMUHhqNXPWznqK9XTbCwdrUh1E7mbGwsoFrBZSUS1KZ5aywvUV1uC0iG4v8ZRYFKKyW7rMTlFcXov4QzURYsYkL7FE+TG5pp7NkayXaK8Ki+qCn3k+mG4qMrF4oFBORGrL9kRWYQS003mOxUeMCxShuk7PVgpKjSbDA06i4oQpLhJtrLYSOhEjmSqfKAztYn6OpY2JUM33Aqszx1fXUl+dwWIt9fzCmKqPsbzjq/gyWZtY2Evllr9QyMsd9rF5nI6x9m8ntnWekbsDKzG+dIREO19IP6OzQIhTAyyt1jOsXeitnDgCE6zp1PekUk3X0z5zZbdw2zQsRpkt4hFjbPSh+5VxD1e83MJNiHN4y/TZ5PoIgsAqe/s1PYnWQQ/ZR6NnaX7jupY9bFrYP4b1lwADAHRMJJPCmDsVAAAAAElFTkSuQmCC" /&gt;</pre><p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAuCAMAAAD9RhDIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGNQTFRFkpSQYbVqsNq0ra+s1+zaiciP+Pj4mZuXyMnH5OTjp6ilu7y61tfV6uvqtLazxOPH8fLx4fHjdb59a7pznNGik8yZ9fr26/bsz9DOzejQoKGe3d3cwsPBf8OGut6+ptar////yEvtTQAAACF0Uk5T//////////////////////////////////////////8An8HQIQAABCVJREFUeNrsmNeCmzAQRWVASKJX01z4/6+MQL2AvUk22QfP0y7C6DBzNQWw+m0E1Ir1fxk4uB5uWOCD9cH6YH2TDR2EMPhxWMFls/pnYkUfrA/WP8PKyYgXEr+LFROC6f358R1RGUzR1bdS06Uyql9jkRQBZvOt8mPhhP4fssXqNgNhRaaRNJdLM+1/9Rdm99Km7Vq+1PaMoqYZCzbsbsis3naOC6Ab9mGlbG1jqMzbARqNV6Y58SqgNoO6x2p40Q1uLnteHOvpzjkytwG5i5WxlYQGObNvp06MDay6NfZoFFdp799SZ0IXC4I1TuxdiIOlUwGPJbGG5ex9P6SiVq6d11uYRQLnm4530ThYHiqUYip6KclCYd05yzPoGrm1TtU+qaaGidO0Q9Q6PpzAuj8ZVdIxyAkij/JGVSH+EuLIjkiJjh+nHYqp+cHDyKox274TMa3ZC0DvSSTqqfzo55bkNaqVqR1peYGvzgZWJ1Y5154MOnOJnoxWLdpYmT9BKaxKo8qV+BSXcldgBm0zpuetYxk033CbFKiNhV9g8RPBRM3SRGremkp1cayHtsj01Lsb79bIEPu9tRxhGVRMh6Ayb62AeIXADhMNlPTR3TiUem4fDrU1xwdYoU7F4hXar5CIyLJnr16HDDKaThQjX/HhZ4t4sVKdis20rArodtsvj34syK9Fnhjyiw8fFhapenGxTCq+P7GxMkF7hsXWHpFhD+lCt1TLLD/jysJSxUi7WNlYRByE11he82Pp1acgHqzkRbdDhOTOsPqvYq0yjkD1LoyAiUlmhAOs+B0seIxVHvVbVaraArRoBAXQi8ABVv5nWP31uDuNx9nX2PAA82pzGsT0nSBGX+/l81RIXyMQJS9WWMSP9dZJ/A0sGstExkw6JtM6l9RfEbD40TdhiQ6h0OPFfTjK/W/2IwsR+jOsyZfl38WKEVevwhL5g4hoJavvN2g9x/I0EF+YE0MHS7Z+VF7AJ65MJpEzLFYc97L8d7DWBYgMUHhqNXPWznqK9XTbCwdrUh1E7mbGwsoFrBZSUS1KZ5aywvUV1uC0iG4v8ZRYFKKyW7rMTlFcXov4QzURYsYkL7FE+TG5pp7NkayXaK8Ki+qCn3k+mG4qMrF4oFBORGrL9kRWYQS003mOxUeMCxShuk7PVgpKjSbDA06i4oQpLhJtrLYSOhEjmSqfKAztYn6OpY2JUM33Aqszx1fXUl+dwWIt9fzCmKqPsbzjq/gyWZtY2Evllr9QyMsd9rF5nI6x9m8ntnWekbsDKzG+dIREO19IP6OzQIhTAyyt1jOsXeitnDgCE6zp1PekUk3X0z5zZbdw2zQsRpkt4hFjbPSh+5VxD1e83MJNiHN4y/TZ5PoIgsAqe/s1PYnWQQ/ZR6NnaX7jupY9bFrYP4b1lwADAHRMJJPCmDsVAAAAAElFTkSuQmCC" /></p>
<p>I used a free base 64 encoded for the example above: <a href="http://www.opinionatedgeek.com/dotnet/tools/base64encode/">Free Base 64 Encoder</a></p>
<h2>Redirect the entire IIS Application (alternative)</h2>
<ol>
<li>Create an offline or maintenance mode web page (per design specifications or use default version) and save the page to the application root directory</li>
<li>Open IIS manager on the web server that is hosting the site/application</li>
<li>Right-click the site/application name | Properties</li>
<li>Click the "Home Directory" tab (or "Virtual Directory" tab if an application)</li>
<li>Select "A redirect to a URL"</li>
<li>Enter the fully qualified URL to the offline page</li>
<li>Check "The exact URL entered above" checkbox</li>
<li>Click Apply | OK</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Disable_Ektron_Modules_and_Handlers_in_IIS_7_Virtual_Applications.aspx?blogid=91">
  <title>How To Disable Ektron Modules and Handlers in IIS 7 Virtual Applications</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Disable_Ektron_Modules_and_Handlers_in_IIS_7_Virtual_Applications.aspx?blogid=91</link>
  <description><![CDATA[I recently came across a scenario where we had to configure a separate virtual application under our <a href="http://www.ektron.com/" target="_blank">Ektron</a> site. As you are aware, <a href="http://www.ektron.com/" target="_blank">Ektron</a> is heavy with it's own HttpHandlers and modules. This is the contents of a bare-bones web.config file you can drop into your virtual application directory to disable the offending <a href="http://www.ektron.com/" target="_blank">Ektron</a> DLLs from running and failing.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-10-21T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I recently came across a scenario where we had to configure a separate virtual application under our <a href="http://www.ektron.com/" target="_blank">Ektron</a> site. As you are aware, <a href="http://www.ektron.com/" target="_blank">Ektron</a> is heavy with it's own HttpHandlers and modules. This is the contents of a bare-bones web.config file you can drop into your virtual application directory to disable the offending <a href="http://www.ektron.com/" target="_blank">Ektron</a> DLLs from running and failing.</p>
<p>Update 1:</p>
<p>I ran across a KB article posted by Ektron on this topic as well. They offer a more <a href="http://dev.ektron.com/kb_article.aspx?id=9394" target="_blank">in-depth list of modules/handlers to disable in the web.config</a>.</p>
<pre class="code">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;configuration&gt;
 &lt;system.web&gt;
  &lt;customErrors mode="Off"&gt;
  &lt;/customErrors&gt;
 &lt;/system.web&gt;
    &lt;system.webServer&gt;
  &lt;handlers&gt;
   &lt;remove name="ek*" /&gt;
   &lt;remove name="ekdav" /&gt;
   &lt;remove name="EktronWorkflowImage" /&gt;
  &lt;/handlers&gt;
  &lt;modules&gt;
   &lt;remove name="MyDigestAuthenticationModule" /&gt;
   &lt;remove name="EkUrlAliasModule" /&gt;
  &lt;/modules&gt;
    &lt;/system.webServer&gt;
&lt;/configuration&gt;
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Enable_SMTP_Authentication_for_Outlook_2007.aspx?blogid=91">
  <title>How to Enable SMTP Authentication for Outlook 2007</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Enable_SMTP_Authentication_for_Outlook_2007.aspx?blogid=91</link>
  <description><![CDATA[<p>This article explains how to enable SMTP authentication for outbound e mail in Microsoft Outlook. Open Microsoft Outlook 2007 From the ribbon menu click Tools | Account Settings… Click the E mail tab Select the account to be modified and</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-10-06T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>This article explains how to enable SMTP authentication for outbound e-mail in Microsoft Outlook.</p>
<ol>
<li>Open Microsoft Outlook 2007</li>
<li>From the ribbon menu click <em>Tools</em> | <em>Account Settings…</em><br /><img title="SMTP Outlook Authentication 01" border="0" alt="SMTP Outlook Authentication 01" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_01.png" /></li>
</ol>
<p><span id="more-951"></span></p>
<ol>
<li start="3">Click the <em>E-mail</em> tab</li>
<li>Select the account to be modified and click the <em>Change…</em> (not the Change Folder) button<br /><img title="SMTP Outlook Authentication 02" border="0" alt="SMTP Outlook Authentication 02" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_02.png" width="450" /></li>
<li>In the Change E-mail Account dialog, click the <em>More Settings…</em> button<br /><img title="SMTP Outlook Authentication 03" border="0" alt="SMTP Outlook Authentication 03" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_03.png" width="450" /></li>
<li>In the Internet E-mail Settings dialog, click the <em>Outgoing Server</em> tab</li>
<li>Check the <em>My outgoing server (SMTP) requires authentication</em> checkbox</li>
<li>Select the <em>Use same settings as my incoming mail server</em> radio button<br /><img title="SMTP Outlook Authentication 04" border="0" alt="SMTP Outlook Authentication 04" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_04.png" /></li>
<li>Click the <em>OK</em> button</li>
<li>Click the <em>Next</em> button</li>
<li>Click the <em>Finish</em> button</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Redirect_Reference_for_Microsoft_IIS_6_0.aspx?blogid=91">
  <title>Redirect Reference for Microsoft IIS 6.0</title>
  <link>http://www.skonet.com/Articles_Archive/Redirect_Reference_for_Microsoft_IIS_6_0.aspx?blogid=91</link>
  <description><![CDATA[While assisting with a client deployment, I ran across a redirect web site that had the redirect URL that included wildcards. Yes, wildcards I tell you.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-10-01T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have been working with web servers (IIS and Apache) for over 10 years, and it amazes me how much I still do not know.</p>
<p>I have to give credit to the <a href="http://www.ektron.com/">Ektron</a> hosting team. While assisting with a client deployment, I ran across a redirect web site that had the redirect URL that included wildcards. Yes, wildcards I tell you.</p>
<p>I am not sure if this means I need to pick up my books again or what, but this little nugget could be helpful for those of us still managing IIS 6.0 servers (IIS 7.0 redirect/rewrite engine is completely different.)</p>
<p><a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/41c238b2-1188-488f-bf2d-464383b1bb08.mspx?mfr=true" target="_blank">Microsoft IIS 6.0 Redirect Reference</a></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Leverage_machine_config_comments_to_Learn_How_to_Configure_Your_ASP_NET_Web_Sites.aspx?blogid=91">
  <title>Leverage machine.config.comments to Learn How to Configure Your ASP.NET Web Sites</title>
  <link>http://www.skonet.com/Articles_Archive/Leverage_machine_config_comments_to_Learn_How_to_Configure_Your_ASP_NET_Web_Sites.aspx?blogid=91</link>
  <description><![CDATA[<p>As one who is constantly having to deal with the web.config and on occasion the machine.config, I have found referencing the machine.config.comments indispensible. As such, I have decided to upload and host an accessible version the 2.0 configuration folder (C</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-10-01T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>As one who is constantly having to deal with the web.config and on occasion the machine.config, I have found referencing the machine.config.comments indispensible. As such, I have decided to upload and host an accessible version the 2.0 configuration folder (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG).</p>
<p>I'd like to eventually list all the default configuration options available, for now, this will have to suffice.</p>
<p><a title="machine.config.comments.xml" href="http://www.skonet.com/uploadedFiles/Snippets/ASPNET/machine.config.comments.xml" target="_blank">machine.config.comments</a> (xml format)</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Script_to_Start-Stop_All_Running_Ektron_Services_on_Local_Workstation.aspx?blogid=91">
  <title>Script to Start-Stop All Running Ektron Services on Local Workstation</title>
  <link>http://www.skonet.com/Articles_Archive/Script_to_Start-Stop_All_Running_Ektron_Services_on_Local_Workstation.aspx?blogid=91</link>
  <description><![CDATA[<p>Script to Start Stop All Running Ektron Services on Local Workstation Anyone that develops on Ektron knows just how resource intensive the locally run Windows services can be. After manually stopping and starting all three of them every time I</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-09-25T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Anyone that develops on <a href="http://www.ektron.com/" target="_blank">Ektron</a> knows just how resource intensive the locally run Windows services can be. After manually stopping and starting all three of them every time I get on or pulled off a project, I decided to write a handy VBScript to start or stop ALL Ektron Windows Services with a single command.</p>
<p>Enjoy.</p>
<pre class="code">
' Force explicit declaration of all variables.
Option Explicit
On Error Resume Next
dim arg, ArgNum, oArgs
dim WshShell
Set oArgs = WScript.Arguments
Set WshShell = WScript.CreateObject("WScript.Shell")
ArgNum = 0
While ArgNum &lt; oArgs.Count
 arg = LCase(oArgs(ArgNum))
 Select Case arg
  Case "-stop":
   Call ServiceAction ("stop")
  Case "-start":
   Call ServiceAction ("start")
  Case "-help","-?":
   Call DisplayUsage
  Case Else:
   Call DisplayUsage
 End Select 
 
 ArgNum = ArgNum + 1
Wend
Sub DisplayUsage
 WScript.Echo "Usage: EktronServicesManager &lt;-start|-stop&gt;, [-help|-?]" &amp; vbCrLf &amp; _
       "Example 1: EktronServicesManager -start"
 WScript.Quit (1)
End Sub
Sub ServiceAction (action)
 WshShell.Run "net " &amp; action &amp; " ""Ektron Extensibility Server""", 1
 WshShell.Run "net " &amp; action &amp; " ""Ektron Async Processor""", 1
 WshShell.Run "net " &amp; action &amp; " ""Ektron Windows Services 3.0""", 1
End Sub
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Salesforce_com_Web-To-Lead_CSharp_Class.aspx?blogid=91">
  <title>Salesforce.com Web-To-Lead C# Class</title>
  <link>http://www.skonet.com/Articles_Archive/Salesforce_com_Web-To-Lead_CSharp_Class.aspx?blogid=91</link>
  <description><![CDATA[Over the years I have done numerous Salesforce.com web projects using their API's and APEX libraries. I wrote this class library to do quick and dirty web to lead submissions without having to do clunky form redirects to their out.]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-09-24T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p><em>Updated April 18, 2012</em> </p>
<p>Over the years I have done numerous <a target="_blank" href="http://www.salesforce.com/">Salesforce.com</a> web projects using their <a target="_blank" href="http://wiki.developerforce.com/index.php/Web_Services_API">Web Services API</a>'s and <a target="_blank" href="http://wiki.developerforce.com/index.php/Apex">APEX libraries</a>. I wrote this class library to do quick and dirty web-to-lead submission without having to do clunky form redirects to their out of box HTML form handler. Includes callback handler to which you can wire-up.</p>
<h2>The Example</h2>
<pre class="brush:csharp">void Example()
{
	WebToLead w2l = new WebToLead("YOUR_ORG_ID");
	w2l.FirstName = "First";
	w2l.LastName = "Last";
	w2l.KeyValueFields["c__custom_field"] = "My Value";
	w2l.Submit();
}</pre><h2>SkoNet.Salesforce.WebToLead Class</h2>
<pre class="brush:csharp">using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace SkoNet.Salesforce
{
	/// &lt;summary&gt;
	/// This class represents the base Web Lead object in Salesforce.com.
	/// &lt;/summary&gt;
	public class WebToLead
	{
		private bool isWebToLeadUrlBuilt;

		#region Events/Event Handlers
		/// &lt;summary&gt;
		/// Occurs immediately following the HttpRequest.GetResponse() method being called.
		/// &lt;/summary&gt;
		public event SubmitWebToLeadEventHandler SubmitWebToLeadEvent;
		#endregion

		#region Accessors/Properties
		private Dictionary&lt;string, string&gt; parms;
		/// &lt;summary&gt;
		/// Dictionary &lt;string,string&gt; containing key/value pairs of single field values
		/// &lt;/summary&gt;
		public Dictionary&lt;string,string&gt; KeyValueFields
		{
			set
			{
				parms = value;
			}
			get
			{
				return parms;
			}
		}

		private Dictionary&lt;string, List&lt;string&gt;&gt; keyPicklistFields;
		/// &lt;summary&gt;
		/// Dictionary &lt;string,List&lt;string,string&gt;&gt; containing key/value pairs of multi-select values
		/// &lt;/summary&gt;
		public Dictionary&lt;string, List&lt;string&gt;&gt; KeyPicklistFields
		{
			get
			{
				return keyPicklistFields;
			}
			set
			{
				keyPicklistFields = value;
			}
		}

		private string webRequestMethod;
		/// &lt;summary&gt;
		/// Method to submit HttpRequest to Salesforce.com. Default is POST
		/// &lt;/summary&gt;
		public string WebRequestMethod
		{
			set
			{
				webRequestMethod = value;
			}
			get
			{
				return webRequestMethod;
			}
		}

		private string webContentType;
		/// &lt;summary&gt;
		/// ContentType when submitting to Salesforce.com. Default is application/x-www-form-urlencoded
		/// &lt;/summary&gt;
		public string WebContentType
		{
			set
			{
				webContentType = value;
			}
			get
			{
				return webContentType;
			}
		}

		private string webToLeadUrl;
		/// &lt;summary&gt;
		/// The Web-to-lead form action URL as outputed in the Web-to-lead HTML generation wizard.
		/// &lt;/summary&gt;
		public string WebToLeadUrl
		{
			set
			{
				webToLeadUrl = value;
			}
			get
			{
				return webToLeadUrl;
			}
		}

		private string webToLeadData;
		/// &lt;summary&gt;
		/// Form data that will be submitted to Salesforce.com. Viewable only after the BuildWebToLeadUrl() method is called.
		/// &lt;/summary&gt;
		public string WebToLeadData
		{
			get
			{
				return webToLeadData;
			}
		}

		#region Default SFDC Lead Fields (strong typed)
		private bool enableDebug;
		/// &lt;summary&gt;
		/// Enable debug for this request (requires debug email)
		/// &lt;/summary&gt;
		public bool EnableDebug
		{
			set
			{
				enableDebug = value;
				parms["debug"] = value ? "1" : "0";
			}
			get
			{
				return enableDebug;
			}
		}

		private string debugEmail;
		/// &lt;summary&gt;
		/// If debug is enabled, the email address to send the submitted lead confirmation.
		/// &lt;/summary&gt;
		public string DebugEmail
		{
			set
			{
				debugEmail = value;
				parms["debugEmail"] = value;
			}
			get
			{
				return debugEmail;
			}
		}

		private string recordType;
		/// &lt;summary&gt;
		/// Lead Record Type
		/// &lt;/summary&gt;
		public virtual string RecordType
		{
			set
			{
				recordType = value;
				parms["recordType"] = value;
			}
			get { return recordType; }
		}

		private string organizationID;
		/// &lt;summary&gt;
		/// The Organization ID for the account to which leads should be posted
		/// &lt;/summary&gt;
		public string OrganizationID
		{
			set
			{
				organizationID = value;
				parms["oid"] = value;
			}
			get { return organizationID; }
		}

		private string firstName;
		public virtual string FirstName
		{
			set
			{
				firstName = value;
				parms["first_name"] = value;
			}
			get { return firstName; }
		}

		private string lastName;
		public virtual string LastName
		{
			set
			{
				lastName = value;
				parms["last_name"] = value;
			}
			get { return lastName; }
		}

		private string email;
		public virtual string Email
		{
			set
			{
				email = value;
				parms["email"] = value;
			}
			get { return email; }
		}

		private string title;
		public virtual string Title
		{
			set
			{
				title = value;
				parms["title"] = value;
			}
			get { return title; }
		}

		private string company;
		public virtual string Company
		{
			set
			{
				company = value;
				parms["company"] = value;
			}
			get { return company; }
		}

		private string industry;
		public virtual string Industry
		{
			set
			{
				industry = value;
				parms["industry"] = value;
			}
			get { return industry; }
		}

		private string street;
		public virtual string Street
		{
			set
			{
				street = value;
				parms["street"] = value;
			}
			get { return street; }
		}

		private string city;
		public virtual string City
		{
			set
			{
				city = value;
				parms["city"] = value;
			}
			get { return city; }
		}

		private string state;
		public virtual string State
		{
			set
			{
				state = value;
				parms["state"] = value;
			}
			get { return state; }
		}

		private string postalCode;
		public virtual string PostalCode
		{
			set
			{
				postalCode = value;
				parms["zip"] = value;
			}
			get { return postalCode; }
		}

		private string country;
		public virtual string Country
		{
			set
			{
				country = value;
				parms["country"] = value;
			}
			get { return country; }
		}

		private string phone;
		public virtual string Phone
		{
			set
			{
				phone = value;
				parms["phone"] = value;
			}
			get { return phone; }
		}

		private string fax;
		public virtual string Fax
		{
			set
			{
				fax = value;
				parms["fax"] = value;
			}
			get { return fax; }
		}

		private string webSite;
		/// &lt;summary&gt;
		/// Web site for the lead being submitted
		/// &lt;/summary&gt;
		public virtual string WebSite
		{
			set
			{
				webSite = value;
				parms["URL"] = value;
			}
			get { return webSite; }
		}

		private string campaignId;
		public virtual string CampaignId
		{
			set
			{
				campaignId = value;
				parms["Campaign_ID"] = value;
			}
			get { return campaignId; }
		}

		private string leadSource;
		public virtual string LeadSource
		{
			set
			{
				leadSource = value;
				parms["lead_source"] = value;
			}
			get { return leadSource; }
		}

		private string description;
		public virtual string Description
		{
			set
			{
				description = value;
				parms["description"] = value;
			}
			get { return description; }
		}
		#endregion
		#endregion

		#region Constructors
		/// &lt;summary&gt;
		/// Provides properties, methods, and events that pertain to submitting a Web-to-lead request in a Salesforce.com instance.
		/// &lt;/summary&gt;
		/// &lt;param name="oid"&gt;Organization ID of the Salesforce.com account to which the lead submission will be sent.&lt;/param&gt;
		public WebToLead(string oid)
		{
			// initialize default salesforce fields
			OrganizationID = oid;
			DebugEmail = String.Empty;
			EnableDebug = false;
			RecordType = String.Empty;
			CampaignId = String.Empty;
			LeadSource = String.Empty;
			
			FirstName = String.Empty;
			LastName = String.Empty;
			Email = String.Empty;
			Title = String.Empty;
			Company = String.Empty;
			Industry = String.Empty;

			Street = String.Empty;
			City = String.Empty;
			State = String.Empty;
			PostalCode = String.Empty;
			Country = String.Empty;
			Phone = String.Empty;
			Fax = String.Empty;
			
			Description = String.Empty;
			WebSite = String.Empty;
			
			parms = new Dictionary&lt;string, string&gt;();
			keyPicklistFields = new Dictionary&lt;string, List&lt;string&gt;&gt;();

			// initialize other class members
			isWebToLeadUrlBuilt = false;
			webToLeadUrl = "https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8"; // default
			webRequestMethod = "POST"; // default request method
			webContentType = "application/x-www-form-urlencoded"; // default content type
		}

		public WebToLead() : this(String.Empty) { }
		#endregion

		/// &lt;summary&gt;
		/// Generate the URL and POST Data that will be used to submit the request to salesforce.com
		/// &lt;/summary&gt;
		public virtual void BuildWebToLeadUrl()
		{
			const string FORMAT = "&amp;{0}={1}";
			StringBuilder query = new StringBuilder();

			// pull single select values
			foreach (string key in parms.Keys)
			{
				string val = (string)parms[key];
				val = HttpUtility.UrlEncode(val);
				string keyName = String.Format(FORMAT, key, val);
				query.Append(keyName);
			}

			// pull multiselect values
			foreach (string key in keyPicklistFields.Keys)
			{
				List&lt;string&gt; vals = (List&lt;string&gt;)keyPicklistFields[key];
				foreach (string val1 in vals)
				{
					if (!String.IsNullOrEmpty(val1))
					{
						string val = val1;
						val = HttpUtility.UrlEncode(val1);
						string keyName = String.Format(FORMAT, key, val);
						query.Append(keyName);
					}
				}
			}

			webToLeadData = query.ToString();
			isWebToLeadUrlBuilt = true;
		}

		/// &lt;summary&gt;
		/// Submit the Web to Lead request to Salesforce.com
		/// &lt;/summary&gt;
		public virtual void Submit()
		{
			// make sure submit data has been generated
			if (!isWebToLeadUrlBuilt) BuildWebToLeadUrl();

			// verify required properties are set
			if (String.IsNullOrEmpty(organizationID) || String.IsNullOrEmpty(webToLeadUrl))
			{
				throw new SalesforceException("You must specify an organization ID and a web to lead URL before you can submit a lead to Salesforce.");
			}

			// encode data and convert to byte array to send
			UTF8Encoding encoding = new UTF8Encoding();
			byte[] byteArray = encoding.GetBytes(webToLeadData);

			// Create HttpWebRequest
			HttpWebRequest reqSF = (HttpWebRequest)WebRequest.Create(webToLeadUrl);
			reqSF.Method = webRequestMethod;
			reqSF.ContentType = webContentType;
			reqSF.ContentLength = webToLeadData.Length;

			// Post the data stream to Salesforce
			Stream requestStream = reqSF.GetRequestStream();
			requestStream.Write(byteArray, 0, byteArray.Length);
			requestStream.Close();

			//Get the response data stream from Salesforce
			HttpWebResponse respSF = (HttpWebResponse)reqSF.GetResponse();
			// raise the event
			if (SubmitWebToLeadEvent != null)
			{
				SubmitWebToLeadEvent(this, new SubmitWebToLeadEventArgs(respSF));
			}
			respSF.Close();
			respSF = null;
			reqSF = null;
		}
	}

	/// &lt;summary&gt;
	/// Represents the method that will handle a WebToLeadSubmit event that has WebToLeadSubmitEventArgs data.
	/// &lt;/summary&gt;
	/// &lt;param name="sender"&gt;Object&lt;/param&gt;
	/// &lt;param name="e"&gt;WebToLeadSubmitEventArgs&lt;/param&gt;
	public delegate void SubmitWebToLeadEventHandler(object sender, SubmitWebToLeadEventArgs e);

	/// &lt;summary&gt;
	/// Provides data for the web to lead submission of the WebToLead class.
	/// &lt;/summary&gt;
	public class SubmitWebToLeadEventArgs
	{
		private HttpWebResponse response;
		public HttpWebResponse Response
		{
			set
			{
				response = value;
			}
			get
			{
				return response;
			}
		}

		public SubmitWebToLeadEventArgs(HttpWebResponse input)
		{
			response = input;
		}
	}
}</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/PHP_Flickr_Photo_Rotator_Class.aspx?blogid=91">
  <title>PHP Flickr Photo Rotator Class</title>
  <link>http://www.skonet.com/Articles_Archive/PHP_Flickr_Photo_Rotator_Class.aspx?blogid=91</link>
  <description><![CDATA[<p>Last year I was approached by an old work associate buddy who needed someone to program a basic photo display web component that he could use with a WordPress blog site he was designing. Since I am pretty decent at WordPress,</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-09-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Last year I was approached by an old work associate/buddy who needed someone to program a basic photo display web component that he could use with a WordPress blog site he was designing. Since I am pretty decent at WordPress, and quite versed at <a title="PHP" href="http://www.php.net/" target="_blank">PHP</a>, I accepted. Here is what I ended up with. Quick and dirty.</p>
<p>It utilized the <a title="Flickr developer API's" href="http://www.flickr.com/services/api/" target="_blank">Flickr developer API's</a>, <a title="PHP" href="http://www.php.net/" target="_blank">PHP</a> and a little HTML/CSS/JavaScript knowhow and turned out to work quite well.</p>
<p>I'm sure there are much more robust exampes of a similar component, this one just worked for what they needed at <a title="Solitude Ski Resort" href="http://www.skisolitude.com/community/" target="_blank">Solitude Ski Resort</a>.</p>
<pre class="code">
&lt;?php
function _pre($out,$kill=false)
{
    echo '&lt;pre&gt;';
    if (is_array($out))
    {
        print_r($out);
    }
    else
    {
        echo $out;
    }

    if ($kill)
    {
        die('&lt;/pre&gt;');
    }
    else
    {
        echo '&lt;/pre&gt;';
    }
}

class daily_candy
{
    var $candy = array();
    var $candy_count = 0;
    var $api_key = '';
    var $service_url = 'http://api.flickr.com/services/rest/?';

    function daily_candy($api_key)
    {
        // set props
        $this-&gt;api_key = $api_key;
        
        // we need posts
        if ($this-&gt;get_photo_ids())
        {
            $this-&gt;get_photo_sizes();
            $this-&gt;get_photo_info();
            $this-&gt;candy_count = count($this-&gt;candy);
        }
    }

    function get_photo_ids($photoset_id,$per_page = '4',$format='php_serial')
    {
        // build the main url
        $params = array(
            'api_key'   =&gt; $this-&gt;api_key,
            'photoset_id'   =&gt; $photoset_id,
            'per_page'  =&gt; $per_page,
            'method'    =&gt; 'flickr.photosets.getPhotos',
            'format'    =&gt; $format
        );
        $encoded_params = array();
        foreach ($params as $k =&gt; $v)
        {
            $encoded_params[] = $k.'='.urlencode($v);
        }
        $url = $this-&gt;service_url.implode('&amp;', $encoded_params);
        $rsp = file_get_contents($url);
        $rsp_obj = unserialize($rsp);

        if ($rsp_obj['stat'] == 'ok' &amp;&amp; count($rsp_obj['photoset']['photo']) &gt; 0)
        {
            foreach($rsp_obj['photoset']['photo'] as $photo)
            {
                array_push($this-&gt;candy,new daily_candy_photo($photo['id']));
            }
        }
        else
        {
            // do nothing
        }
        return count($this-&gt;candy);
    }

    function get_photo_sizes($format='php_serial')
    {
        // build the main url
        $params = array(
            'api_key'   =&gt; $this-&gt;api_key,
            'method'    =&gt; 'flickr.photos.getSizes',
            'format'    =&gt; $format
        );
        $encoded_params = array();
        foreach ($params as $k =&gt; $v)
        {
            $encoded_params[] = urlencode($k).'='.urlencode($v);
        }
        for($i = 0; $i &lt; count($this-&gt;candy); $i++)
        {
            $url_format = $this-&gt;service_url.implode('&amp;', $encoded_params).'&amp;photo_id=%s';
            $url = sprintf($url_format,$this-&gt;candy[$i]-&gt;photo_id);
            $rsp = file_get_contents($url);
            $rsp_obj = unserialize($rsp);

            if ($rsp_obj['stat'] == 'ok')
            {
                $this-&gt;candy[$i]-&gt;thumb_url = $rsp_obj['sizes']['size'][0]['source'];
                $this-&gt;candy[$i]-&gt;photo_url = $rsp_obj['sizes']['size'][3]['source'];
            }
            else
            {
                // do nothing
            }
        }
    }

    function get_photo_info($format='php_serial')
    {
        // build the main url
        $params = array(
            'api_key'   =&gt; $this-&gt;api_key,
            'method'    =&gt; 'flickr.photos.getInfo',
            'format'    =&gt; $format
        );
        $encoded_params = array();
        foreach ($params as $k =&gt; $v)
        {
            $encoded_params[] = urlencode($k).'='.urlencode($v);
        }
        $url_format = $this-&gt;service_url.implode('&amp;', $encoded_params).'&amp;photo_id=%s';
        for($i = 0; $i &lt; count($this-&gt;candy); $i++)
        {
            $url = sprintf($url_format,$this-&gt;candy[$i]-&gt;photo_id);
            $rsp = file_get_contents($url);
            $rsp_obj = unserialize($rsp);

            if ($rsp_obj['stat'] == 'ok')
            {
                $this-&gt;candy[$i]-&gt;description = $rsp_obj['photo']['description']['_content'];
            }
            else
            {
                // do nothing
            }
        }
    }

    function render_candy()
    {
        // hold script output
        $script = "\n";
        $script_imgs = "\n";

//      _pre($this-&gt;candy);

        // write out the HTML for the visual display of the page
        for($i = 0; $i &lt; $this-&gt;candy_count; $i++)
        {
            $item = $this-&gt;candy[$i];

            // fill script
            $script .= "dc_photos.push(['".$item-&gt;photo_url."','".htmlspecialchars(addslashes($item-&gt;description))."']);\n";
            $script_imgs .= "dc_imgs[$i] = new Image();\ndc_imgs[$i].src = '".$item-&gt;photo_url."';\n";

            // first loop?
            if ($i == 0)
            {
                echo &lt;&lt;&lt;HTML
&lt;!-- Daily Candy --&gt;
&lt;style type="text/css"&gt;
#dc-shell
{
    height:520px;
    width:600px;
    clear:both;
    margin-left:20px;
}
#dc-shell h2
{
    width:600px;
    padding:0px;
    margin:0px 0px 5px 0px;
}
#dc-bottom
{
    float:left;
    height:80px;
    width:500px;
}
.dc-lft
{
    width:510px;
    height:375px;
    float:left;
    position:relative;
}
.dc-rgt
{
    width:85px;
    float:left;
}
.dc-sml
{
    height:96px;
}
&lt;/style&gt;
&lt;script type="text/javascript" language="javascript"&gt;
var dc_photos = []; // hold generated photos and links
var dc_imgs = new Array();

// show the daily candy player
function dc_show_candy(id)
{
    var img = document.getElementById("dc-img");
    var txt = document.getElementById("dc-bottom");
    if (img != undefined &amp;&amp; txt != undefined)
    {
        try
        {
            img.src = dc_imgs[id].src;
            txt.innerHTML = dc_photos[id][1];
        }
        catch(ex)
        {
        }
    }
}
&lt;/script&gt;
&lt;div id="dc-shell" class="post-info"&gt;
    &lt;div class="dc-lft"&gt;
        &lt;div class="dc-top"&gt;&lt;a href="$item-&gt;photo_url" target="_blank"&gt;&lt;img src="$item-&gt;photo_url" border="0" alt="" title="" width="500" height="375" id="dc-img" /&gt;&lt;/a&gt;&lt;/div&gt;
        &lt;div id="dc-bottom"&gt;$item-&gt;description&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="dc-rgt"&gt;
HTML;
            }


            // smaller thumbnail item
            echo &lt;&lt;&lt;HTML
        &lt;div class="dc-sml"&gt;&lt;a href="javascript:dc_show_candy($i);"&gt;&lt;img src="$item-&gt;thumb_url" border="0" alt="" title="" width="85" height="85" /&gt;&lt;/a&gt;&lt;/div&gt;
HTML;

            // last loop
            if ($i == $this-&gt;candy_count - 1)
            {
                echo &lt;&lt;&lt;HTML
    &lt;/div&gt;
&lt;/div&gt;
&lt;!-- /Daily Candy --&gt;
HTML;
            }
        }

        // write out the javascript array needed
        echo &lt;&lt;&lt;JS
&lt;script type="text/javascript" language="javascript"&gt;
$script
$script_imgs
&lt;/script&gt;
JS;
    }
};

class daily_candy_photo
{
    var $photo_id = '';
    var $thumb_url = '';
    var $photo_url = '';
    var $description = '';

    function daily_candy_photo($photo_id)
    {
        $this-&gt;photo_id = $photo_id;
    }
};

$dc = new daily_candy('FLICKR_API_KEY');
$dc-&gt;render_candy();
?&gt;
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Web_Page_Layout.aspx?blogid=91">
  <title>Web Page Layout</title>
  <link>http://www.skonet.com/Articles_Archive/Web_Page_Layout.aspx?blogid=91</link>
  <description><![CDATA[<p>Web Page Layout A web page layout refers to the structural design of a web page being served up on the World Wide Web. There are various key sections or components that make up the core layout of a web</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-09-08T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>A web page layout refers to the <a href="http://en.wikipedia.org/wiki/Structural_design" target="_blank">structural design</a> of a <a href="http://en.wikipedia.org/wiki/Web_page" target="_blank">web page</a> being served up on the <a href="http://en.wikipedia.org/wiki/World_Wide_Web" target="_blank">World Wide Web</a>. There are various key sections or components that make up the core layout of a web page: the header, body, and footer. Other sections that contribute to the web page layout are the channels (or rails) and ankle.</p>
<h2>Header</h2>
<p>The web page header represents the heading of the web page. The header usually contains some sort of graphical element such as a masthead, corporate logo, or web site title. Other elements such as utility navigation, a search form, or even site navigation can also be included in the header.</p>
<h2>Body</h2>
<p>The web page body contains the primary content of the page. The body is usually positioned between the page header and page footer.</p>
<h2>Footer</h2>
<p>The web page footer contains ancillary content usually comprised of official notices (such as legal policies and copyright declarations) and auxiliary <a href="http://en.wikipedia.org/wiki/Hyperlinks" target="_blank">hyperlinks</a> to internal page content.</p>
<p>The footer is normally the last rendered bit of content on a page by the <a href="http://en.wikipedia.org/wiki/Web_browser" target="_blank">web browser</a>.</p>
<h2>Channel/Rail/Side Bar</h2>
<p>The web page channel or web page rail contains <a href="http://en.wikipedia.org/w/index.php?title=Meta_links&amp;action=edit&amp;redlink=1" target="_blank">meta links</a> or other auxiliary content that supports the web page body content. Subnavigation or submenus may also be displayed in the channel.</p>
<h2>Ankle</h2>
<p>The web page ankle contains additional internal hyperlinks and other relevant content to the web site. With the increase in popularity of the AJAX driven content and menuing systems, the ankle servers as a redundant method to guarantee critical hyperlinked web content is indexed by <a href="http://en.wikipedia.org/wiki/Search_engines" target="_blank">search engines</a> and <a href="http://en.wikipedia.org/w/index.php?title=Internet_spiders&amp;action=edit&amp;redlink=1" target="_blank">Internet spiders</a>.</p>
<p>The ankle is usually positioned between the web page body content and the web page footer.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Breaking_HttpModule_Inheritance_-_InheritInChildApplications.aspx?blogid=91">
  <title>Breaking HttpModule Inheritance - InheritInChildApplications</title>
  <link>http://www.skonet.com/Articles_Archive/Breaking_HttpModule_Inheritance_-_InheritInChildApplications.aspx?blogid=91</link>
  <description><![CDATA[<p>Ran into a situation with root IIS applications sites squatting sub applications' configuration (HttpModule's specifically). Here is how to disable the inheritance. &lt;location inheritInChildApplications="false"&gt; &lt;system.web&gt; ... &lt; system.web&gt; &lt; location&gt; SectionInformation.InheritInChildApplications Property</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-08-20T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Ran into a situation with root IIS applications/sites squatting sub-applications' configuration (HttpModule's specifically). Here is how to disable the inheritance.</p>
<pre class="code">
&lt;location inheritInChildApplications="false"&gt;
  &lt;system.web&gt;
   ...
  &lt;/system.web&gt;
&lt;/location&gt;
</pre><p><a title="InheritInChildApplications" href="http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.inheritinchildapplications.aspx" target="_blank">SectionInformation.InheritInChildApplications Property</a></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Generic_JavaScript_Page_onLoad_Event_Handler.aspx?blogid=91">
  <title>Generic JavaScript Page onLoad Event Handler</title>
  <link>http://www.skonet.com/Articles_Archive/Generic_JavaScript_Page_onLoad_Event_Handler.aspx?blogid=91</link>
  <description><![CDATA[<p>setup onload function if(typeof window.addEventListener = 'undefined') .. gecko, safari, konqueror and standard window.addEventListener('load', generic, false) else if(typeof document.addEventListener = 'undefined')</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-08-18T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<pre class="code">
//setup onload function
if(typeof window.addEventListener != 'undefined')
{
    <em>//.. gecko, safari, konqueror and standard</em>
    window.addEventListener('load', generic, false);
}
else if(typeof document.addEventListener != 'undefined')
{
    <em>//.. opera</em> 
    document.addEventListener('load', generic, false);
}
else if(typeof window.attachEvent != 'undefined')
{
    <em>//.. win/ie</em>
    window.attachEvent('onload', generic);
}

//** remove this condition to degrade older browsers
else
{
    //.. mac/ie5 and anything else that gets this far
    
    //if there's an existing onload function
    if(typeof window.onload == 'function')
    {
        <em>//store it</em>
        var existing = onload;
        
        <em>//add new onload handler</em>
        window.onload = function()
        {
            <em>//call existing onload function</em>
            existing();
            
            <em>//call generic onload function</em>
            generic();
        };
    }
    else
    {
        <em>//setup onload function</em>
        window.onload = generic;
    }
}
</pre><p>As referenced from <a title="Brothercake.com" href="http://www.brothercake.com/" target="_blank">Brothercake.com</a></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Take_a_Screenshot_of_a_Windows_Media_Video_Movie.aspx?blogid=91">
  <title>How to Take a Screenshot of a Windows Media Video Movie</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Take_a_Screenshot_of_a_Windows_Media_Video_Movie.aspx?blogid=91</link>
  <description><![CDATA[<p>I can count on one hand how many times I have had to do this over the past few years, but each time it takes considerable effort to "reacall" how to replicate. Apparently, by default, Windows Media Player enables what's</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-08-13T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I can count on one hand how many times I have had to do this over the past few years, but each time it takes considerable effort to "reacall" how to replicate. Apparently, by default, Windows Media Player enables what's called, Video Overlay, to improve the output of the video it renders. Unfortunately, this streams the bits directly to the video card, which makes it difficult to obtain any sort of screen shot using the usual ALT + PRTSCN sequence.</p>
<p>Thankfully, you can disable this setting (temporarily I recommend) to buffer the stream through the OS. Simply modify the setting in Windows Media Player as shown here.</p>
<p><img title="Disable Overlay in Windows Media Player" alt="Disable Overlay in Windows Media Player" src="http://www.skonet.com/uploadedImages/Home/Blog/screen-disable-video-overlay.png" /></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Tips_to_Protect_Yourself_From_Phishing_Schemes.aspx?blogid=91">
  <title>Tips to Protect Yourself From Phishing Schemes</title>
  <link>http://www.skonet.com/Articles_Archive/Tips_to_Protect_Yourself_From_Phishing_Schemes.aspx?blogid=91</link>
  <description><![CDATA[<p>Never provide your personal information when responding to an unsolicited email request, no matter how legitimate the communication may look. Whether by phone, email or internet site, data created by phishers may look like the real thing. If you</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<ol>
<li>Never provide your personal information when responding to an unsolicited email request, no matter how legitimate the communication may look. Whether by phone, email or internet site, data created by phishers may look like the real thing. If you didn’t initiate the communication, you shouldn’t provide any information. </li>
<li>Never provide a password over the telephone in response to an unsolicited request. Financial institutions should never ask you to verify your account information online. </li>
<li>Contact the financial institution yourself, if you believe the contact may be legitimate. Phone number and websites can be found on your monthly statements from your financial institutions. You can also look up companies on the internet or in phone books. </li>
<li>Regularly review your account statements to confirm there are no fraudulent charges. If your account statement is ever late, immediately contact the financial institution to determine why. </li>
<li>Visit the anti-phishing working group website to obtain a list of the most recent incidents of phishing and find the latest news in the fight against phishing, www.antiphishing.orgBecoming Proactive </li>
</ol>
<p>When you encounter a potential fraud, especially if you believe you’ve lost money, act immediately:</p>
<ul>
<li>If you receive phishing emails, you can report the fraud to the FBI’s Internet Fraud Complaint Center at www.ic3.gov, and forward the email to <a href="mailto:enforcement@sec.gov">enforcement@sec.gov</a>, to pass the tip to the SEC’s Enforcement Division. </li>
<li>If you think your personal information has been compromised, visit the <a href="http://www.consumer.gov/idtheft" target="_blank">Identity Theft Resource Center of the Federal Trade Commission</a> for more information on how to proceed with protecting yourself and minimizing the damage.</li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Configure_Custom_QuickLinks_in_Ektron.aspx?blogid=91">
  <title>How to Configure Custom QuickLinks in Ektron</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Configure_Custom_QuickLinks_in_Ektron.aspx?blogid=91</link>
  <description><![CDATA[<p>While prototyping a custom DMS asset handler today I managed to locate actual instructions on configuring your own QuickLink handlers for specific assets. However confusing it may be that these instructions were found in the “Users Manual”, I am just</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>While prototyping a custom DMS asset handler today I managed to locate actual instructions on configuring your own QuickLink handlers for specific assets. However confusing it may be that these instructions were found in the “Users Manual”, I am just glad I was able to locate it fairly quickly.</p>
<h3>Updating Default Template for Multiple Quicklinks</h3>
<p>WARNING! This procedure is only necessary if Link Management is set to false in your web.config file. If if Link Management is set to true, Ektron CMS400.NET automatically updates the template within the quicklink when content is moved. See your system administrator for help with the web.config file.</p>
<p>NOTE This action can only be performed on quicklinks. When content is moved in Ektron CMS400.NET, its quicklink does not get changed. After it is moved, you need to update the default template called in the content’s quicklink. To update the default template for one or more quicklinks, follow these steps.</p>
<ol>
<li>In the library, access the quicklinks folder containing quicklinks you want to update.</li>
<li>Click the Update Quicklinks button.</li>
<li>The Update URL Link Template Quicklinks screen is displayed.</li>
<li>Check the quicklinks you want to update. NOTE Check the box in the table header to select or deselect all.</li>
<li>In the To: text field, enter the name of the template you want to apply to the selected quicklinks. Last User to Edit Last user that made changes to the quicklink or form. Last Edit Date The date the quicklink or form was last edited. Date Created The date and time the quicklink or form was originally added to the Ektron CMS400.NET library. Field Description Library Folder Ektron CMS400.NET User Manual, Version 7.5 155</li>
<li>Click the Update Quicklinks button to update the changes. A confirmation message is displayed.</li>
<li>Click OK to continue. The selected quicklinks are updated to use the specified template.</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Convert__NET_DateTime_to_UNIX_Timestamp.aspx?blogid=91">
  <title>How to Convert .NET DateTime to UNIX Timestamp</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Convert__NET_DateTime_to_UNIX_Timestamp.aspx?blogid=91</link>
  <description><![CDATA[<p>How to convert .NET DateTime to UNIX timestamp (as in PHP, etc.)int timestamp = (DateTime.UtcNow new DateTime(1970,1,1,0,0,0)).TotalSecondsand convert a Unix timestamp to an ASP.NET DateTime value DateTime date = (new DateTime(1970,1,1,0,0,0)).AddSeconds(datestamp)</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<div>How to convert .NET DateTime to UNIX timestamp (as in PHP, etc.)</div><div class="code">int timestamp = (DateTime.UtcNow - new DateTime(1970,1,1,0,0,0)).TotalSeconds</div><div>and convert a Unix timestamp to an ASP.NET DateTime value:</div><div class="code">DateTime date = (new DateTime(1970,1,1,0,0,0)).AddSeconds(datestamp)</div>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Encoding_and_Downloading_FLV_Media.aspx?blogid=91">
  <title>Encoding and Downloading FLV Media</title>
  <link>http://www.skonet.com/Articles_Archive/Encoding_and_Downloading_FLV_Media.aspx?blogid=91</link>
  <description><![CDATA[<p>One of the greatest features of Flash is the ability to encode video for online playback. For those that have not done this, the quick notes version Create a blank Flash movie (somewhere near the dimensions of the source video)</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>One of the greatest features of Flash is the ability to encode video for online playback. For those that have not done this, the quick notes version:</p>
<ol>
<li>Create a blank Flash movie (somewhere near the dimensions of the source video)</li>
<li>File | Import | Import to library…</li>
<li>Select Windows | Library OR CTRL + L for those key-jockeys out there</li>
<li>Select the imported movie from the library</li>
<li>Right-click | Properties</li>
<li>In the Embedded Video Properties dialog box, click Export.</li>
<li>Save the movie for later use</li>
</ol>
<p>Now, what if we want to be able to download an FLV movie from somewhere on the web. Lately I have been researching ways to leverage various online social media provider’s technologies (and uhm, assets.) In doing so, I rely heavily on <a href="http://www.fiddlertool.com/fiddler/" target="_blank">Fiddler</a>, an HTTP debugging proxy which logs all HTTP traffic between your computer and the Internet (that is all IE traffic.) By listening to the HTTP requests being sent from any embedded Flash application from your local computer, FLV assets from YouTube, Brightcove and others are easily retrievable. Although there are freely available plug-ins for Firefox and Internet Explorer that <em>occasionally</em> work, oftentimes it becomes necessary to dig in and get your hands dirty. Let’s dirty up…</p>
<p><span id="more-666"></span></p>
<ol>
<li>Download, install and run Fiddler 2 (you’ll need the latest version of .NET 2.0)</li>
<li>Disable capture (F12)</li>
<li>Launch IE (any recent flavor will due)</li>
<li>Open up <a href="http://www.youtube.com/" target="_blank">YouTube.com</a>, <a href="http://www.brightcove.tv/" target="_blank">Brightcove.tv</a> or any media outlet that offers streaming video via Flash</li>
<li>Return to Fiddler and click F12 to begin capture (this is important or you will miss the capture part of this mini-tutorial)</li>
<li>Now, browse to a page that has the video you wish to <em>“archive”</em> and allow it to load and begin playing <em>(I have found that sometimes Fiddler or the site will hang, you may need to start capture a few times to get the page to load up.)</em> </li>
<li>Return to Fiddler and click F12 again (we have captured all we need)</li>
</ol>
<p>You should have a list of links that Fiddler has so graciously tracked for us. Now time to locate the actual session that contains the source movie.</p>
<ol>
<li>Click CTRL + F (find) and type <em><strong>video/flv</strong></em> in the text box</li>
<li>Search | Requests and Headers</li>
<li>Examine | Headers and Body</li>
<li>Click Find Sessions</li>
</ol>
<p>Now the final step, download the FLV source. This is the easy part. Fiddler gives us an easy copy context menu to handle this:</p>
<ol>
<li>Right-click the link session that the find from above highlighted.</li>
<li>Copy | Just Url (CTRL + U)</li>
<li>Paste the copied URL into your favorite download accelerator or just paste it directly into IE or Windows Explorer.</li>
</ol>
<p>As long as you do not have the FLV extension associated to any other Windows application, you should be prompted with a Save/Open dialog box. Save the file down to your computer and you are done.</p>
<p>Granted, not a lot you can do directly with an FLV file. Perhaps I’ll put something together on how to actually use the FLV source at a later day.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_API_to_Access_Localization_Tag.aspx?blogid=91">
  <title>Ektron API to Access Localization Tag</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_API_to_Access_Localization_Tag.aspx?blogid=91</link>
  <description><![CDATA[<p>I ran across an interesting API library deep in the Ektron API framework that allows you to pull the actual localization tag (e.g. en US, en GB, etc.) for the current language type id of the site (e.g. 1033, 2058,</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I ran across an interesting API library deep in the Ektron API framework that allows you to pull the actual <a href="http://www.iana.org/assignments/language-tags" target="_blank">localization tag</a> (e.g. en-US, en-GB, etc.) for the current language type id of the site (e.g. 1033, 2058, etc.). Previous to this, we had to create our own associative, key/value pair XML file that stored the relationships. Since I could only find a single reference to this library on the Ektron site, I hoping this information proves useful to others. Enjoy.</p>
<pre class="code">
// retrieve the language date for the current site API instance
Ektron.Cms.SiteAPI sAPI = new Ektron.Cms.SiteAPI();

// assign the localization tagstring langTag = Ld.XmlLang;
Ektron.Cms.LanguageData ld = sAPI.GetLanguageById(ContentBlock.LanguageID);
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Delete_a_Windows_Service.aspx?blogid=91">
  <title>How to Delete a Windows Service</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Delete_a_Windows_Service.aspx?blogid=91</link>
  <description><![CDATA[<p>I have used the service controller command line tool for years. I have finally decided to write something up on it briefly since I have been working with various frameworks systems that are not completely removing their services after uninstalling</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have used the service controller command line tool for years. I have finally decided to write something up on it briefly since I have been working with various frameworks/systems that are not completely removing their services after uninstalling them.</p>
<ol>
<li>Open services applet/application: Start | Programs | Administrative Tools | Services</li>
<li>Locate offending Service</li>
<li>Double-click OR Right-click | Properties</li>
<li>Copy the ‘Display Name’ property</li>
<li>Stop the service</li>
<li>Exit service information screen and services applet</li>
<li>Start | Run | cmd | OK</li>
<li>Type: cs delete “%PASTE OR TYPE THE SERVICE NAME HERE%”</li>
<li>Hit enter key</li>
<li>Service has been deleted</li>
</ol>
<p>You may or may not be able to delete the service depending on it’s dependencies. You will need to follow the chain down to any child services if that is the case and delete them first. You may also be required to reboot.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_Issues_with_Redirecting_Submitted_Form_Data.aspx?blogid=91">
  <title>Ektron Issues with Redirecting Submitted Form Data</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_Issues_with_Redirecting_Submitted_Form_Data.aspx?blogid=91</link>
  <description><![CDATA[<p>I have been architecting, designing, and programming Ektron CMS400.NET web applications for over a year now. Though not an expert, I feel I am to the point I can actually add value to other programmers architects who may be running</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-25T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>When developing custom action pages for the built in Ektron forms, remember to set the Page directives as specified in the Administrator Manual.</p>
<p><em>page 312</em> </p>
<p><code>If your site is using URL Aliasing, the action page’s header must include the following:<br />
EnableEventValidation=”false” EnableViewStateMac=”false”</code> </p>
<p>Apparently when you set the EnableViewStateMac attribute to true, the encoded and encrypted view state is not checked to verify that it has not been tampered with on the client. Otherwise .NET will not persist the Viewstate from the original .NET form to the action page specified in the Ektron form.</p>
<p>Though disabling the EnableEventValidation attribute may be necessary, I don’t see any real reason since the page that is handling the postback shouldn’t have any controls on it in the first place. However, in the event it does, the page’s validation must be turned off else the postback handler will not validate the form post.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/SharePoint_Wiki_Homepage_Not_Working.aspx?blogid=91">
  <title>SharePoint Wiki Homepage Not Working</title>
  <link>http://www.skonet.com/Articles_Archive/SharePoint_Wiki_Homepage_Not_Working.aspx?blogid=91</link>
  <description><![CDATA[<p>I ran into an issue when migrating a SharePoint Wiki list from one site to another. In creating a Wiki list based on a saved template (with content) the default home document was broken or not being set. So the</p>]]></description>
  <dc:creator></dc:creator>
  <dc:date>2009-07-25T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I ran into an issue when migrating a SharePoint Wiki list from one site to another. In creating a Wiki list based on a saved template (with content) the default home document was broken or not being set. So the QuickLink link takes you to the Wiki list default view, AllItems.aspx, rather than the Home.aspx document as it normally should. Apparently, WSS does not allow administrators to <a href="http://office.microsoft.com/en-us/sharepointserver/HA101577851033.aspx" target="_blank">change the welcome page</a> property, only MOSS.</p>
<p>In searching for a fix to this, I ran across a blog post of someone that had similar <a href="http://mphacker.spaces.live.com/blog/cns%218040CC624DDC5404%21279.entry" target="_blank">SharePoint Wiki Library issues</a>, and recommended a great utility called the <a href="http://www.codeplex.com/spm" target="_blank">SharePoint Manager 2007</a>. It allows you to view/edit the SharePoint object model directly.</p>
<p>So, to fix the broken Home.aspx Wiki list, you set the /Site/RootFolders/Wiki/WelcomePage property to "Home.aspx".</p>
<p>Hope this helps someone else out there.</p>]]></content:encoded>
 </item>
</rdf:RDF>


