Detecting the Safari Browser to load scripts

I needed to detect if Safari was being used as there were some issues with styling on a website I was working upon, only on Mac Safari though!!!

The following code is what I use to detect safari and load the relevant script:

<script type="text/javascript">

	if(/Safari/.test(navigator.userAgent))
	{
 		//you are using safari, or at least you CLAIM to be
		document.write('<link type="text/css" media="screen" rel="stylesheet" href="/css/safari.css" title="example" />');
	}
	</script>

Add in the tags and set the path to the correct css file you wish to load. Same concept can be used to load javascript files.

Using and grouping RadioButton Controls in a Repeater

By default, you cannot group radiobutton controls within a repeater as the repeater mangles the names. I had this exact problem when changing from checkboxes to radio buttons – after searching Google for 10 mins, I found a post at the following site by Eric Smith which i’ll copy the relevant info here so I don’t lose it

http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c12371/

Add the following Javascript code to your page:

function SetUniqueRadioButton(nameregex, current)
{
   re = new RegExp(nameregex);
   for(i = 0; i < document.forms[0].elements.length; i++)
   {
      elm = document.forms[0].elements[i]
      if (elm.type == 'radio')
      {
         if (re.test(elm.name))
         {
            elm.checked = false;
         }
      }
   }
   current.checked = true;
}

Now for the repeater itself,

The code is linked to the Repeater through the ItemDataBound event. For it to work properly, you need to know the name of the Repeater control, as well as the GroupName you’re assigning to the RadioButtons. In this case, I’m using rptPortfolios as the name of the Repeater, and Portfolios as the group name:

protected void rptPortfolios_ItemDataBound(object sender,
                                           RepeaterItemEventArgs e)
{
   if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType
      != ListItemType.AlternatingItem)
      return;

   RadioButton rdo = (RadioButton)e.Item.FindControl("rdoSelected");
   string script =
      "SetUniqueRadioButton('rptPortfolios.*Portfolios',this)";
   rdo.Attributes.Add("onclick", script);

}

Getting the control that posted back to asp.net application

Need to know which specific control posted back to your page? (Original article at http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx)

/// <summary>
 /// Tells us which control posted back
 /// </summary>
 /// <returns></returns>
 public Control getPostBackControlName()
 {
 Control control = null;
 //first we will check the "__EVENTTARGET" because if post back made by       the controls
 //which used "_doPostBack" function also available in Request.Form collection.
 string ctrlname = Page.Request.Params["__EVENTTARGET"];
 if (ctrlname != null && ctrlname != String.Empty)
 control = Page.FindControl(ctrlname);

 // if __EVENTTARGET is null, the control is a button type and we need to
 // iterate over the form collection to find it
 else
 {
 string ctrlStr = String.Empty;
 Control c = null;
 foreach (string ctl in Page.Request.Form)
 {
 //handle ImageButton they having an additional "quasi-property" in their Id which identifies
 //mouse x and y coordinates
 if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
 {
 ctrlStr = ctl.Substring(0, ctl.Length - 2);
 c = Page.FindControl(ctrlStr);
 }
 else
 c = Page.FindControl(ctl);

 if (c is System.Web.UI.WebControls.Button || c is System.Web.UI.WebControls.ImageButton)
 {
 control = c;
 break;
 }
 }
 }
 return control;
 }

If you are using master pages, simply add this to the master.cs file and where you need to call the method use the following code:

MasterPage masterPage = (MasterPage)Page.Master; // where MasterPage is the class name
 Control rep = masterPage.getPostBackControlName();
 if (rep.Parent.Parent.ID == "rpRegion")// only if postback is the regions control
 GetSelectedRegion();

Preparing an asp.net master page for print only view – stripping out css etc

Searching google turned up nothing on this so did some digging in MSDN and worked out a method of disabling all the style sheets, javascript etc to produce a text only page:

1/ Add a content block to your master page – i’ve called mine ‘cssContentHolder’

<asp:contentplaceholder id=”cssContentHolder” runat=”server”>
<link rel=”stylesheet” href=”css/master.css” type=”text/css” media=”all” />
<link href=”css/flyout.css” media=”screen” rel=”stylesheet” type=”text/css” />
<script src=”scripts/APIs/JQuery/JQuery-1.3.2.min.js” type=”text/javascript”></script>
<script src=”scripts/APIs/JQuery/Plugins/jquery-ui-1.7.1.custom.min.js” type=”text/javascript”></script>
</asp:contentplaceholder>

2/ In the markup, add a link button so the user can click it to remove the formatting

<asp:LinkButton  PostBackUrl=”#” ID=”textLink”  runat=”server” Text=”Text Only Version” onclick=”textLink_Click” ></asp:LinkButton>

3/ In the code behind, create an event handler for the button and add the following code

protected void textLink_Click(object sender, EventArgs e)
{
bool Hidden = Page.Master.FindControl(“cssContentHolder”).Visible ;
Page.Master.FindControl(“cssContentHolder”).Visible = !Hidden;
if (Hidden)
textLink.Text = “Switch to Graphical Version”;
else
textLink.Text = “Text Only Version”;
}

That’s it. When you click on the link, you will perform a postback to the server, get the state of the control and show/hide accordingly. It will also change the text so you can click back again.

Simple when you know how!

Using Javascript, another method to remove all the CSS but not update any link text etc is to call the following function:

function hideCSS(){
	if(document.getElementsByTagName){
		for(n=0;n<document.getElementsByTagName("link").length;n++){
			if(document.getElementsByTagName("link")[n].getAttribute){
				if(document.getElementsByTagName("link")[n].getAttribute("rel").indexOf("stylesheet")!=-1){
					document.getElementsByTagName("link")[n].disabled="disabled"
					}
				}
			}
		}
	}

ARGHH WordPress is playing up on me :(

Not a happy bunny this morning. I uploaded a long post this week regarding using the Windows Mixer control API and the formatting is so screwy it’s not true.

Even the title does not appear on the summary page, rewritten it twice already but still no joy

Firefox 3.0 is Europe's most popular browser | News | TechRadar UK

Firefox 3.0 is officially the most popular web browser in Europe, according to StatCounter’s latest statistics.

Although Mozilla’s browser lags behind Microsoft’s Internet Explorer if you add all of the latter’s different versions together, FireFox has finally pipped IE7 as the most used individual browser version – with 35.05 per cent of the market, according to the data.

Firefox, benefiting from the fact that it doesn’t have the same problem with ‘legacy’ users who stay on older versions of the browser and the arrival of IE8 which is prising people away from IE7.

Not much in it

The gap is currently just over half of a percentage point, and StatCounter CEO Aodhen Cullen believes that it will overtake IE’s complete range shortly.

“The move is partly explained by a small switch from IE 7.0 usage to IE 8.0 but also by growing market share overall by Firefox 3.0,” said Cullen.

“The data shows that Firefox is closing the gap and is now just 10% behind all IE versions in Europe.”

Apparently StatCounter analyse four billion pageloads per month, but it should be pointed out that other major website traffic monitoring companies come up with different figures.

By Patrick Goss

via Firefox 3.0 is Europe’s most popular browser | News | TechRadar UK.

URL Rewriting in Asp.net using URLRewriter

URL Rewriting in asp.net (c#). (Download Example Project for URL Rewriting in asp.net at the end of this article)

One way to get yourselves rated better in the search engines is to get rid of the basic aspx page and replace it with something much more descriptive i.e.:

If I were selling Nokia phones, I may have a page called http://www.mydomain.com/nokia.aspx – not much good if I am trying to target a specific phone though is it? What about this then?

http://www.mydomain.com/Nokia-E71-Mobile-Phone-With-Email-And-Internet-Browser

Much more descriptive and much more likely to get the search engines juices flowing more and hence get you rated higher in the listings.

After searching around for a few solutions, I found this article by Scott GU (Microsoft Guru Extraordinaire) http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx which got me excited.

He mentions a few methods, one of which I use on http://www.simonantony.co.uk which is running IIS7 by using the Rewrite module built into IIS – works a treat and has allowed me to convert a static html site into a more dynamic and search engine friendly version.

The other is to use a library from http://urlrewriter.net/ which is the other route I have taken. I’ve successfully implemented this on a project I am currently working upon and thought it would be nice of me to post some fully working example code that you can actually understand – the examples on the urlrewriter website/demos are very poor and not clear at all – no wonder so many people struggle to get it working.

Some blurb from the URLRewriting website will explain it more:

UrlRewriter.NET is an open-source, light-weight, highly configurable URL rewriting component for ASP.NET 1.1 and 2.0. UrlRewriter.NET provides similar IIS Rewrite capabilities that the Apache web server provides with mod_rewrite and .htaccess. You don’t need to install an ISAPI Rewrite filter to use the component. Best of all, UrlRewriter.NET is free and licensed with a very permissive MIT-style licence.

UrlRewriter.NET is a great Search Engine Optimization (SEO) tool. Using UrlRewriter.NET, you can create URL’s containing your target keywords, boosting your rankings.

With UrlRewriter.NET, you can:

* Rewrite URL’s from “user and Search Engine” friendly urls to the actual .aspx pages (also known as URL Masking, IIS Rewrite or ASP Rewrite)
* Redirect from old URL patterns to the new ones, ensuring the Search Engine spiders continue to follow your links (also known as URL Replace)
* Block certain visitors based on the User-Agent – very helpful for blocking crawlers that don’t obey the robots.txt protocol
* Ban users based on IP range (provides the capabilities of mod_rewrite on IIS)
* And much more…

UrlRewriter.NET is a pure .NET component written in C#, and does not require any ISAPI rewrite dll’s to be installed in IIS. You configure rules in a very readable XML format, either in your web.config file or an external rewriter configuration file.

UrlRewriter.NET is in use in many websites large and small such as DotNetKicks, and is embedded in several open source packages, such as the fantastic Yet Another Forum.NET.

Anyway here is how the project is constructed and how to get it working.

  1. Create a new web project – I am using C# but if you really want to you can use VB
  2. Download the urlrewriting library from the official site http://urlrewriter.net
  3. Add a reference to the UrlRewritingNet.UrlRewriter.dll to your project
  4. Open up the web.config file and replace the content with the following code:

<?xml version=”1.0″?>
<configuration>
<configSections>
<section name=”urlrewritingnet” requirePermission=”false”  type=”UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter”  />
</configSections>

<urlrewritingnet
rewriteOnlyVirtualUrls=”true”
contextItemsPrefix=”QueryString”
defaultPage=”default.aspx”
defaultProvider=”RegEx”
xmlns=”http://www.urlrewriting.net/schemas/config/2006/07″ >
<rewrites>
<add name=”this-is-a-long-page-name”  virtualUrl=”^~/this-is-a-long-page-name”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/longpage.aspx”
ignoreCase=”true” />

<add name=”Product-Search-uk”  virtualUrl=”^~/Product-Search-uk”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/search.aspx”
ignoreCase=”true” />

<add name=”submit-your-company”  virtualUrl=”^~/submit-your-company”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/submit_company.aspx”
ignoreCase=”true” />

<add name=”this-is-my-site-blog”  virtualUrl=”^~/this-is-my-site-blog”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/blog.aspx”
ignoreCase=”true” />

<add name=”contact-my-company”  virtualUrl=”^~/contact-my-company”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/contact.aspx”
ignoreCase=”true” />

<add name=”Product-Search-uk-partnumber”  virtualUrl=”^~/product(.*).aspx”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/search.aspx?id=$1″
ignoreCase=”true” />

<!–<add name=”Rewrite”  virtualUrl=”^~/(.*)/Detail(.*).aspx”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/Default.aspx?language=$1&amp;id=$2″
ignoreCase=”true” />

<add name=”RedirectInApplication”  virtualUrl=”^~/(.*)/Default.aspx”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”~/$1/Detail_Redirected.aspx”
redirect=”Application”
redirectMode=”Permanent”
ignoreCase=”true” />

<add name=”KickBrowserToDomain”  virtualUrl=”^http://(.*)/SampleWeb/kickto/(.*).aspx”
rewriteUrlParameter=”ExcludeFromClientQueryString”
destinationUrl=”http://$2?source=$1″
redirect=”Domain”
redirectMode=”Permanent”
ignoreCase=”true” />–>
</rewrites>
</urlrewritingnet>

<appSettings/>
<system.web>
<customErrors mode=”Off”>
</customErrors>
<httpModules>
<add name=”UrlRewriteModule” type=”UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter” />
</httpModules>
<compilation debug=”true” />
</system.web>
</configuration>

    • Create the aspx pages
      1. blog.aspx
      2. contact.aspx
      3. default.aspx (this should already exist)
      4. longpage.aspx
      5. search.aspx
      6. submit_company.aspx
        • In Default.aspx add the following code:

          <div id=”nav”>
          <div id=”navcontainer”>
          <ul id=”navlist”>
          <li><a href=”default.aspx”>Home</a></li>
          <li><a href=”this-is-a-long-page-name”>this-is-a-long-page-name</a></li>
          <li><a href=”Product-Search-uk”>Product Search</a></li>
          <li><a href=”submit-your-company”>Submit your company</a></li>
          <li><a href=”this-is-my-site-blog”>Blog</a></li>
          <li><a href=”contact-my-company”>Contact</a></li>
          <li><a href=”product123.aspx”>Note that this aspx page does not actually exist – click it and see what happens</a></li>

          </ul>
          </div>
          </div>

          You will notice that the href links are defined in the web.config file.

            • In search.aspx, add the following html code:

              <div>
              This is the region page – if you click on <a href=”product12345.aspx”>product12345.aspx</a>, you will be redirected here but the code will show the arguments of the page i.e. 12345 – confused? You will be!

              </div>

                • Now open up the code behind file for search.aspx and add in the Page_Load event:

                  if(Request.QueryString[“id”] != null)
                  Response.Write(“querystring passed in: ” + Request.QueryString[“id”]);
                  else
                  Response.Write(“No query string passed in”);

                    • Run the project. If you click on the search link, you will be taken to the search page but notice the URL in the browser window as it should be reading Product-Search-UK. Same for the other url’s as well except for the last one, if you click on that, a product id will be passed into the page as a querystring that you can use to display specific products on a single page – clever eh!

                      Anyway I hope this has helped you understand how to get a basic implementation of URL Rewriting in your site – i’d love to hear of any more examples you have used, if you want to post them here let me know.

                      Si

                      Download Example Project for URL Rewriting in asp.net

                      Developers issue death warrant for IE6 | News | TechRadar UK

                      A campaign calling for the immediate death of Internet Explorer 6 is picking up pace, with a host of developers castigating the browser that ‘hindered the development of the web’.

                      .net magazine is supporting a campaign to rid the world of IE6 – a browser that is still being used by a large proportion of people – asking the industry if the time has come for sites to no longer support IE6.

                      The magazine – a Future publication just like TechRadar – is hoping that Microsoft will port IE7 and IE8 to Windows 2000 allowing thousands of users to upgrade.

                      Shunned

                      “Clearly, IE7 can’t be shunned: not supporting the current version of Microsoft’s market-leading browser would be a crazy move. However, with its predecessor now approaching its eighth birthday – positively ancient in software terms – should designers now ignore it until it fades away?” asks .net.

                      “That’s a really attractive thought,” Kleber’s Tom Muller answers, “but when a fifth or more of the audience still uses IE6, we can’t just drop it.”

                      It’s a valid point, and will be repeated by web designers the world over if they considered dropping support for the notorious IE6, but .net‘s editor Dan Oliver insists that the time has come for the plug to be pulled.

                      Developers issue death warrant for IE6 | News | TechRadar UK.