<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5613510</id><updated>2012-02-03T07:11:15.663Z</updated><category term='windows scripting'/><category term='guidelines'/><category term='dialog'/><category term='Text Clips'/><category term='icons'/><category term='documentation'/><category term='html5'/><category term='paste bin'/><category term='free'/><category term='firebug'/><category term='fonts'/><category term='corner'/><category term='open source'/><category term='api'/><category term='Datejs'/><category term='pdo'/><category term='iCalendar'/><category term='draggable'/><category term='validation'/><category term='ASP.NET'/><category term='array'/><category term='firefox'/><category term='thumbs.db'/><category term='iphone'/><category term='css'/><category term='Rhino'/><category term='mygeneration'/><category term='web 2.0'/><category term='email'/><category term='macro'/><category term='performance'/><category term='date conversion'/><category term='guides'/><category term='dotnet'/><category term='itextsharp'/><category term='doodads'/><category term='opera'/><category term='rollover image'/><category term='compress'/><category term='code generation'/><category term='sample database'/><category term='html entity'/><category term='xml'/><category term='checkbox'/><category term='list files'/><category term='jQuery'/><category term='mysql'/><category term='google gears desktop api'/><category term='script-fu'/><category term='jQIR'/><category term='html parser'/><category term='tsv'/><category term='web standards'/><category term='code sharing'/><category term='techbooks'/><category term='shrink image'/><category term='pdf'/><category term='oracle'/><category term='visual studio'/><category term='timezone'/><category term='svg'/><category term='google code'/><category term='databinding'/><category term='jsonml'/><category term='PN2'/><category term='jQueryUI'/><category term='CSharp'/><category term='rd'/><category term='JavaScript'/><category term='blogging'/><category term='speedup'/><category term='numeric'/><category term='Packer'/><category term='json'/><category term='google'/><category term='Dojo'/><category term='cheat sheet'/><category term='bgiframe'/><category term='cleanup'/><category term='smtp'/><category term='Microsoft'/><category term='pastebin'/><category term='xcf'/><category term='iframe'/><category term='getsimple'/><category term='entity code'/><category term='createCSSClass'/><category term='thumbnails'/><category term='Windows Live Writer'/><category term='directory'/><category term='compact'/><category term='overflow'/><category term='Dojo shrinksafe'/><category term='form layout'/><category term='JSMin'/><category term='compression'/><category term='portable'/><category term='arraylist'/><category term='sharepoint'/><category term='content management'/><category term='FileComparer'/><category term='temporary files'/><category term='plugin'/><category term='cms'/><category term='associative array'/><category term='fieldset'/><category term='selectbox'/><category term='YUI Compressor'/><category term='sort files'/><category term='gimp'/><category term='html 5'/><category term='vbs'/><category term='canvas'/><category term='vbscript'/><category term='csv'/><category term='wave'/><category term='vector'/><category term='focusfields'/><category term='lazy loading'/><category term='debug'/><category term='tabs'/><category term='php'/><category term='ajax'/><category term='sqlite'/><category term='graph paper'/><category term='migration'/><category term='Prototype'/><category term='vml'/><category term='google gears'/><category term='code snippets'/><category term='VB'/><category term='autocomplete'/><category term='adobe reader'/><category term='tip'/><category term='JSLint'/><category term='script.aculo.us'/><category term='acrobat'/><category term='rmdir'/><category term='Mootools'/><category term='datepicker'/><category term='sql'/><category term='SmartTools'/><category term='slideshow'/><category term='indexing service'/><category term='WebHandler'/><category term='raphaël'/><category term='code search'/><category term='newsticker'/><category term='YSlow'/><category term='parser'/><category term='mono'/><category term='pixie'/><category term='browser sniffing'/><category term='CodePlex'/><title type='text'>Web Developer Blog</title><subtitle type='html'>&amp;lt;code&amp;gt;&lt;code&gt;
    void csharp {}
    &amp;lt;?php echo ?&amp;gt;
    SELECT code FROM SQL
    &amp;lt;asp:net runat=&amp;quot;server&amp;quot; /&amp;gt;
    function javascript() {}
    $(jquery)&lt;/code&gt;
&amp;lt;/code&amp;gt;
&amp;lt;tools&amp;gt;
    &amp;lt;freeware /&amp;gt;&amp;lt;opensource /&amp;gt;
&amp;lt;/tools&amp;gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default?start-index=101&amp;max-results=100'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>460</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5613510.post-181150886377653755</id><published>2011-11-23T22:55:00.000Z</published><updated>2011-11-23T22:55:33.887Z</updated><title type='text'>New posts @ http://blog.webmonkey.uk.com/</title><content type='html'>Posts have been copied over to&amp;nbsp;
&lt;a href="http://blog.webmonkey.uk.com/"&gt;http://blog.webmonkey.uk.com/&lt;/a&gt;&amp;nbsp;and all future updates will be made there rather than here. The feedburner feed has been updated to point to the new blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-181150886377653755?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.webmonkey.uk.com/' title='New posts @ http://blog.webmonkey.uk.com/'/><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/181150886377653755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=181150886377653755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/181150886377653755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/181150886377653755'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2011/11/new-posts-httpblogwebmonkeyukcom.html' title='New posts @ http://blog.webmonkey.uk.com/'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5217721831457025976</id><published>2010-10-31T17:17:00.003Z</published><updated>2010-10-31T17:23:41.125Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='numeric'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Numeric Plugin Update</title><content type='html'>&lt;p&gt;Long time since I've posted, but have updated my &lt;a href="http://www.texotela.co.uk/code/jquery/numeric/"&gt;jQuery numeric plugin&lt;/a&gt; for allowing only numbers in input boxes, fixing a couple of bugs and adding functionality (removing from input and allowing integers only). See code updates via &lt;a href="http://github.com/SamWM/jQuery-Plugins/tree/master/numeric/"&gt;GitHub&lt;/a&gt;, or download the latest stable version &lt;a href="http://code.webmonkey.uk.com/plugins/"&gt;zipped&lt;/a&gt;. In the future might set it so you can restrict how many characters you can put after the decimal point (so could be useful for currency input).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5217721831457025976?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5217721831457025976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5217721831457025976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5217721831457025976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5217721831457025976'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2010/10/jquery-numeric-plugin-update.html' title='jQuery Numeric Plugin Update'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1588637099770124060</id><published>2010-02-20T16:01:00.003Z</published><updated>2010-02-20T16:25:35.074Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebHandler'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Update: CSSCompact - WebHandler</title><content type='html'>&lt;p&gt;Only a minor code update: &lt;a href="http://webdevel.blogspot.com/2007/09/csscompact-webhandler-for-shrinking-css.html"&gt;CssCompact: A WebHandler for shrinking CSS files (ASP.NET)&lt;/a&gt;. Code I am developing will go on &lt;a href="http://github.com/SamWM"&gt;GitHub/SamWM&lt;/a&gt; at some point (already has my jQuery plugins and ASP code I wrote a while back).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1588637099770124060?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1588637099770124060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1588637099770124060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1588637099770124060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1588637099770124060'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2010/02/update-csscompact-webhandler.html' title='Update: CSSCompact - WebHandler'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7557256437740709801</id><published>2009-09-10T20:14:00.003+01:00</published><updated>2009-09-10T20:33:55.343+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slideshow'/><title type='text'>Simple Slideshow System: S5</title><content type='html'>&lt;p&gt;&lt;a href="http://meyerweb.com/eric/tools/s5/"&gt;S5&lt;/a&gt; has been around a few years now, but some may not be aware of it. S5 stands for 'Simple Standards-Based Slide Show System'. The XHTML code is simple to modify (adding / removing slides) and understand. Styling via CSS is also very simple to do. It gracefully degrades - so if JavaScript is disabled, you can still see the content. Slideshows are also printer friendly.&lt;/p&gt;
&lt;p&gt;Like a slideshow you would do in Microsoft Office PowerPoint or OpenOffice Impress, you have to make sure not too much content is added to a slide, since any overflow is hidden. The keyboard or mouse can be used to navigate the S5 slideshow (although there are no context menu options).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7557256437740709801?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7557256437740709801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7557256437740709801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7557256437740709801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7557256437740709801'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/09/simple-slideshow-system-s5.html' title='Simple Slideshow System: S5'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-9050824577761395554</id><published>2009-09-09T19:11:00.000+01:00</published><updated>2009-09-09T19:13:09.459+01:00</updated><title type='text'>WebSlide</title><content type='html'>&lt;span style="font-weight: bold;"&gt;What is WebSlide?&lt;/span&gt;

WebSlide is a JavaScript based web application front-end for presenting mockups and other images in a web browser. Click in the demo area and either click buttons with your mouse, or use shortcut keys →, ←, z, x, and n. For more information on using and setting up a WebSlide, view the online documentation.
Features
&lt;ul&gt;&lt;li&gt;    No server-side requirements&lt;/li&gt;&lt;li&gt;    User-configurable&lt;/li&gt;&lt;li&gt;    Create custom themes with CSS&lt;/li&gt;&lt;li&gt;    Keyboard navigation&lt;/li&gt;&lt;li&gt;    Zoom images in &amp;amp; out&lt;/li&gt;&lt;li&gt;Optional password protection&lt;/li&gt;&lt;/ul&gt;Visit &lt;a href="http://paularmstrongdesigns.com/projects/webslide/"&gt;WebSlide&lt;/a&gt; | &lt;a href="http://paularmstrongdesigns.com/projects/webslide/demo/#wsHelpDialog"&gt;Full Screen Demo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-9050824577761395554?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/9050824577761395554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=9050824577761395554' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9050824577761395554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9050824577761395554'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/09/webslide.html' title='WebSlide'/><author><name>n3wton.com</name><uri>http://www.blogger.com/profile/07578318546945063595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_tTIJcwTJ3hk/Sp7QbDEwu1I/AAAAAAAAAAY/Wv35wAMAKvg/S220/q532235438_2119.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-9024987893104511511</id><published>2009-09-06T18:50:00.004+01:00</published><updated>2009-09-06T18:58:08.901+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='cms'/><category scheme='http://www.blogger.com/atom/ns#' term='content management'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='wave'/><title type='text'>Google Wave: 5 Ways It Could Change the Web</title><content type='html'>&lt;p&gt;&lt;a href="http://mashable.com/2009/07/21/google-wave-invites/"&gt;Google Wave arrives on September 30th&lt;/a&gt;.  On that day, Google will start sending out 100,000 invites to non-developers to its much-anticipated real-time communication platform. An interesting article '5 ways Google Wave could change the web' has been published over at &lt;a href="http://mashable.com/2009/09/05/google-wave-ideas/"&gt;Mashable&lt;/a&gt;.
&lt;/p&gt;
1. Wave-Powered Forums&lt;br&gt;
2. Wave-powered Commenting System&lt;br&gt;
3. Wave-Based Content Management System&lt;br&gt;
4. Wave for Customer Support&lt;br&gt;
5. Wave for Education&lt;br&gt;&lt;br&gt;Read the full article over &lt;a href="http://mashable.com/2009/09/05/google-wave-ideas/"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-9024987893104511511?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/9024987893104511511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=9024987893104511511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9024987893104511511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9024987893104511511'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/09/google-wave-5-ways-it-could-change-web.html' title='Google Wave: 5 Ways It Could Change the Web'/><author><name>n3wton.com</name><uri>http://www.blogger.com/profile/07578318546945063595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_tTIJcwTJ3hk/Sp7QbDEwu1I/AAAAAAAAAAY/Wv35wAMAKvg/S220/q532235438_2119.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5957053486992555190</id><published>2009-09-05T08:43:00.006+01:00</published><updated>2009-09-05T09:24:44.540+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Microsoft.NET Framework directory locations</title><content type='html'>&lt;p&gt;Since there are directories all over the place for the Microsoft.NET Framework, I have decided to compile a list of some of the key ones used.&lt;/p&gt;
&lt;p&gt;Compilers, GACUtil, ASP.NET Register IIS/SQL, Assemblies etc.&lt;/p&gt;
&lt;p&gt;.NET 1.0: &lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v1.0.3705&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;.NET 1.1: &lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v1.1.4322&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;.NET 2.0: &lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After 2.0, more directories were added, the build number was also omitted from the directory name. Some key utilities (for Global Assembly Cache (GAC), ASP.NET, Code Access Security Policy Tool (caspol.exe)) weren't part of future versions, so, as a result, .NET 2.0 is required by them.&lt;/p&gt;
&lt;p&gt;.NET 3.0 uses .NET 2.0 compiler. New directories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation&lt;/strong&gt; (only SQL scripts in here)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v3.0\WPF&lt;/strong&gt; (Windows Presentation Foundation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0&lt;/strong&gt; (for reference when compiling / developing)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.NET 3.5&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C:\Windows\Microsoft.NET\Framework\v3.5&lt;/strong&gt; (compiler, WPF, MSBuild)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5&lt;/strong&gt; (for reference when compiling / developing)&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5957053486992555190?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5957053486992555190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5957053486992555190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5957053486992555190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5957053486992555190'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/09/microsoftnet-framework-directory.html' title='Microsoft.NET Framework directory locations'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8669626429366165656</id><published>2009-09-02T21:07:00.001+01:00</published><updated>2009-09-02T21:10:14.326+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQueryUI'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>IxEdit</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ixedit.com/assets/images/cover.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 530px; height: 162px;" src="http://www.ixedit.com/assets/images/cover.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.ixedit.com/" target="_blank"&gt;&lt;strong&gt;IxEdit&lt;/strong&gt;&lt;/a&gt; is a JavaScript-based interaction design tool for the web. With IxEdit, designers can practice DOM-scripting without coding to change, add, move, or transform elements dynamically on your web pages. Especially, IxEdit must be useful to try various interactions rapidly in the prototyping phase of your web application.&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="http://www.ixedit.com/" target="_blank"&gt;http://www.ixedit.com/&lt;/a&gt;&lt;strong&gt; | Demo:&lt;/strong&gt; &lt;a href="http://www.ixedit.com/samples/" target="_blank"&gt;http://www.ixedit.com/samples/&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8669626429366165656?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8669626429366165656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8669626429366165656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8669626429366165656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8669626429366165656'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/09/ixedit.html' title='IxEdit'/><author><name>n3wton.com</name><uri>http://www.blogger.com/profile/07578318546945063595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_tTIJcwTJ3hk/Sp7QbDEwu1I/AAAAAAAAAAY/Wv35wAMAKvg/S220/q532235438_2119.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4739306422586068553</id><published>2009-09-01T11:08:00.002+01:00</published><updated>2009-09-01T11:12:47.273+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQTouch</title><content type='html'>&lt;p&gt;&lt;a target="_blank" href="http://www.jqtouch.com/"&gt;     &lt;/a&gt;&lt;/p&gt;                      &lt;a target="_blank" href="http://www.jqtouch.com/"&gt;&lt;strong&gt;jQTouch&lt;/strong&gt;&lt;/a&gt; is a &lt;strong&gt;jQuery plugin&lt;/strong&gt; for creating mobile applications with just HTML, CSS &amp;amp; JavaScript.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tTIJcwTJ3hk/SpzzdXyUyGI/AAAAAAAAAAM/TPiLsNhsDiQ/s1600-h/Untitled.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 118px;" src="http://4.bp.blogspot.com/_tTIJcwTJ3hk/SpzzdXyUyGI/AAAAAAAAAAM/TPiLsNhsDiQ/s320/Untitled.jpg" alt="" id="BLOGGER_PHOTO_ID_5376439741100378210" border="0" /&gt;&lt;/a&gt;&lt;div id="top"&gt;&lt;div class="center"&gt;         &lt;/div&gt;     &lt;/div&gt;               &lt;div id="at16pcc"&gt;&lt;div style="display: none;" id="at16p"&gt;&lt;a name="atabc"&gt;&lt;/a&gt;&lt;a name="atpro"&gt;&lt;/a&gt;&lt;a name="atclb"&gt;&lt;/a&gt;&lt;a name="atopp"&gt;&lt;/a&gt;&lt;a name="atcle"&gt;&lt;/a&gt;&lt;a name="atcef"&gt;&lt;/a&gt;&lt;div id="at16pib"&gt;&lt;div id="at16pi"&gt;&lt;a id="at16pit" href="http://www.jqtouch.com/#" onclick="if (window._atab) return _atab.opp()" style="display: none; visibility: hidden;"&gt;»&lt;/a&gt;&lt;div id="at16pm"&gt;&lt;div id="at16pt" style="background-color: rgb(99, 214, 16);"&gt;&lt;h4&gt;&lt;span id="at16ptc" style="color: rgb(255, 255, 255);"&gt;Bookmark &amp;amp; Share&lt;/span&gt;&lt;/h4&gt;&lt;span id="at16_brand" style="color: rgb(255, 255, 255);"&gt;jQTouch&lt;/span&gt;&lt;a id="at16ptx" href="http://www.jqtouch.com/#" onclick="return _atw.clb()" style="color: rgb(255, 255, 255);"&gt;X&lt;/a&gt;&lt;/div&gt;&lt;div id="at16pc"&gt;&lt;div id="at_feed" style="display: none;"&gt;&lt;span style="display: block;"&gt;Select from these web-based feed readers:&lt;/span&gt;
&lt;div onclick="return addthis_sendto('aol');"&gt;&lt;a class="fbtn at_baa aol"&gt;AOL&lt;/a&gt;&lt;/div&gt;&lt;div class="at_litem" onclick="return addthis_sendto('bloglines');"&gt;&lt;a class="fbtn at_baa bloglines"&gt;Bloglines&lt;/a&gt;&lt;/div&gt;&lt;div onclick="return addthis_sendto('google');"&gt;&lt;a class="fbtn at_baa google"&gt;Google Reader&lt;/a&gt;&lt;/div&gt;&lt;div class="at_litem" onclick="return addthis_sendto('mymsn');"&gt;&lt;a class="fbtn at_baa mymsn"&gt;My MSN&lt;/a&gt;&lt;/div&gt;&lt;div onclick="return addthis_sendto('netvibes');"&gt;&lt;a class="fbtn at_baa netvibes"&gt;Netvibes&lt;/a&gt;&lt;/div&gt;&lt;div class="at_litem" onclick="return addthis_sendto('newsgator-on');"&gt;&lt;a class="fbtn at_baa newsgator-on"&gt;NewsGator&lt;/a&gt;&lt;/div&gt;&lt;div onclick="return addthis_sendto('newsisfree');"&gt;&lt;a class="fbtn at_baa newsisfree"&gt;Newsisfree&lt;/a&gt;&lt;/div&gt;&lt;div class="at_litem" onclick="return addthis_sendto('pageflakes');"&gt;&lt;a class="fbtn at_baa pageflakes"&gt;Pageflakes&lt;/a&gt;&lt;/div&gt;&lt;div onclick="return addthis_sendto('technorati');"&gt;&lt;a class="fbtn at_baa technorati"&gt;Technorati&lt;/a&gt;&lt;/div&gt;&lt;div class="at_litem" onclick="return addthis_sendto('yahoo');"&gt;&lt;a class="fbtn at_baa yahoo"&gt;Yahoo&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="display: none;" id="at_share"&gt;&lt;div style="display: none; visibility: hidden;" id="at16psf"&gt;&lt;input id="at16filt" name="at16filt" tabindex="1" size="30" maxlength="50" onkeyup="_atw.filt(this.value,_atw.list)" type="text"&gt;&lt;/div&gt;&lt;div id="at16ps"&gt;&lt;div id="at16nms" style="display: none;"&gt;No matching services.&lt;/div&gt;&lt;div id="ati_aim" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('aim');"&gt;&lt;span class="at15t at15t_aim"&gt;AIM&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_amazonwishlist" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('amazonwishlist');"&gt;&lt;span class="at15t at15t_amazonwishlist"&gt;Amazon Wishlist&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_ask" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('ask');"&gt;&lt;span class="at15t at15t_ask"&gt;Ask&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_backflip" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('backflip');"&gt;&lt;span class="at15t at15t_backflip"&gt;Backflip&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_ballhype" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('ballhype');"&gt;&lt;span class="at15t at15t_ballhype"&gt;BallHype&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_bebo" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('bebo');"&gt;&lt;span class="at15t at15t_bebo"&gt;Bebo&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_blogger" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('blogger');"&gt;&lt;span class="at15t at15t_blogger"&gt;Blogger&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_blogmarks" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('blogmarks');"&gt;&lt;span class="at15t at15t_blogmarks"&gt;Blogmarks&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_buzz" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('buzz');"&gt;&lt;span class="at15t at15t_buzz"&gt;Buzz&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_delicious" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('delicious');"&gt;&lt;span class="at15t at15t_delicious"&gt;Delicious&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_digg" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('digg');"&gt;&lt;span class="at15t at15t_digg"&gt;Digg&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_diigo" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('diigo');"&gt;&lt;span class="at15t at15t_diigo"&gt;Diigo&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_email" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('email');"&gt;&lt;span class="at15t at15t_email"&gt;Email&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_facebook" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('facebook');"&gt;&lt;span class="at15t at15t_facebook"&gt;Facebook&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_fark" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('fark');"&gt;&lt;span class="at15t at15t_fark"&gt;Fark&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_faves" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('faves');"&gt;&lt;span class="at15t at15t_faves"&gt;Faves&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_favorites" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('favorites');"&gt;&lt;span class="at15t at15t_favorites"&gt;Favorites&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_friendfeed" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('friendfeed');"&gt;&lt;span class="at15t at15t_friendfeed"&gt;FriendFeed&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_google" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('google');"&gt;&lt;span class="at15t at15t_google"&gt;Google&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_hatena" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('hatena');"&gt;&lt;span class="at15t at15t_hatena"&gt;Hatena&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_kaboodle" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('kaboodle');"&gt;&lt;span class="at15t at15t_kaboodle"&gt;Kaboodle&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_kirtsy" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('kirtsy');"&gt;&lt;span class="at15t at15t_kirtsy"&gt;kIRTSY&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_linkagogo" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('linkagogo');"&gt;&lt;span class="at15t at15t_linkagogo"&gt;Link-a-Gogo&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_linkedin" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('linkedin');"&gt;&lt;span class="at15t at15t_linkedin"&gt;LinkedIn&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_live" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('live');"&gt;&lt;span class="at15t at15t_live"&gt;Live&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_meneame" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('meneame');"&gt;&lt;span class="at15t at15t_meneame"&gt;Menéame&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_misterwong" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('misterwong');"&gt;&lt;span class="at15t at15t_misterwong"&gt;Mister Wong&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_mixx" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('mixx');"&gt;&lt;span class="at15t at15t_mixx"&gt;Mixx&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_multiply" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('multiply');"&gt;&lt;span class="at15t at15t_multiply"&gt;Multiply&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_myaol" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('myaol');"&gt;&lt;span class="at15t at15t_myaol"&gt;myAOL&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_myspace" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('myspace');"&gt;&lt;span class="at15t at15t_myspace"&gt;MySpace&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_netvibes" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('netvibes');"&gt;&lt;span class="at15t at15t_netvibes"&gt;Netvibes&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_netvouz" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('netvouz');"&gt;&lt;span class="at15t at15t_netvouz"&gt;Netvouz&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_newsvine" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('newsvine');"&gt;&lt;span class="at15t at15t_newsvine"&gt;Newsvine&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_nujij" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('nujij');"&gt;&lt;span class="at15t at15t_nujij"&gt;Nujij&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_plaxo" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('plaxo');"&gt;&lt;span class="at15t at15t_plaxo"&gt;Plaxo&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_print" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('print');"&gt;&lt;span class="at15t at15t_print"&gt;Print&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_propeller" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('propeller');"&gt;&lt;span class="at15t at15t_propeller"&gt;Propeller&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_reddit" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('reddit');"&gt;&lt;span class="at15t at15t_reddit"&gt;Reddit&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_segnalo" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('segnalo');"&gt;&lt;span class="at15t at15t_segnalo"&gt;Segnalo&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_simpy" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('simpy');"&gt;&lt;span class="at15t at15t_simpy"&gt;Simpy&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_slashdot" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('slashdot');"&gt;&lt;span class="at15t at15t_slashdot"&gt;Slashdot&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_stumbleupon" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('stumbleupon');"&gt;&lt;span class="at15t at15t_stumbleupon"&gt;StumbleUpon&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_stylehive" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('stylehive');"&gt;&lt;span class="at15t at15t_stylehive"&gt;Stylehive&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_technorati" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('technorati');"&gt;&lt;span class="at15t at15t_technorati"&gt;Technorati&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_thisnext" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('thisnext');"&gt;&lt;span class="at15t at15t_thisnext"&gt;ThisNext&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_tipd" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('tipd');"&gt;&lt;span class="at15t at15t_tipd"&gt;Tip'd&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_tumblr" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('tumblr');"&gt;&lt;span class="at15t at15t_tumblr"&gt;Tumblr&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_twitter" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('twitter');"&gt;&lt;span class="at15t at15t_twitter"&gt;Twitter&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_typepad" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('typepad');"&gt;&lt;span class="at15t at15t_typepad"&gt;TypePad&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_wordpress" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('wordpress');"&gt;&lt;span class="at15t at15t_wordpress"&gt;WordPress&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_yahoobkm" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('yahoobkm');"&gt;&lt;span class="at15t at15t_yahoobkm"&gt;Y! Bookmarks&lt;/span&gt;&lt;/div&gt;&lt;div id="ati_yardbarker" class="at_item" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('yardbarker');"&gt;&lt;span class="at15t at15t_yardbarker"&gt;Yardbarker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="at_complete" style="display: none;"&gt;&lt;button onclick="_atw.clb()"&gt;Done&lt;/button&gt;&lt;/div&gt;&lt;div id="at_success" style="display: none;"&gt;Message sent! &lt;a href="http://www.jqtouch.com/#" onclick="_atw.get('at16filt').value='';_atw.filt('',_atw.list);return _atw.sag()"&gt;Share again.&lt;/a&gt;&lt;/div&gt;&lt;div style="display: none;" id="at_promo"&gt;&lt;div class="at-promo-btm-ffx at-promo-content"&gt;&lt;h4&gt;AddThis for Firefox&lt;/h4&gt;&lt;span&gt;Bookmark, email or share any page, anytime.&lt;/span&gt;&lt;div class="at-promo-btn"&gt;&lt;a href="http://www.addthis.com/landing/?to=ffext&amp;amp;utm_source=el&amp;amp;utm_medium=link&amp;amp;utm_content=ATTool_orig&amp;amp;utm_campaign=AT_tooldl" target="_blank"&gt;Install&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="at_email" style="display: none; visibility: hidden;"&gt;&lt;div id="at_head" class="tmsg"&gt;&lt;a id="at_use_addr" href="http://www.jqtouch.com/#" onclick="_atab.opp();return false"&gt;Use Address Book&lt;/a&gt;&lt;/div&gt;&lt;form onsubmit="addthis_send();return false;"&gt;&lt;label for="at_to"&gt;To:  &lt;span&gt;(email address)&lt;/span&gt;&lt;/label&gt;&lt;textarea id="at_to" cols="30" rows="4" onkeypress="if (window._atab) _atab.htkd(this, event)" onkeyup="_atw.filt(this.value.replace(/[;\n]/g,',').replace(/ /g,'').split(',').pop(), _atw.data.contacts.all, 'at16eatdr', '_ataddr', null, 'a')" tabindex="2" onfocus="_atw.rse();"&gt;&lt;/textarea&gt;&lt;label for="at_from"&gt;From:  &lt;span&gt;(email address)&lt;/span&gt;&lt;/label&gt;&lt;input id="at_from" name="at_from" tabindex="3" size="30" onfocus="_atw.rse();" type="text"&gt;&lt;label for="at_msg"&gt;Note:  &lt;span&gt;(optional)&lt;/span&gt;&lt;/label&gt;&lt;textarea id="at_msg" style="" cols="30" rows="4" tabindex="4" onkeyup="return _atw.lml(this,250);" onfocus="_atw.rse();"&gt;&lt;/textarea&gt;&lt;div id="ateml"&gt;&lt;small&gt;255 character limit&lt;/small&gt;&lt;/div&gt;&lt;div id="addthis-pop-email-btns"&gt;&lt;input class="atbtn" tabindex="5" value="Send" onclick="return addthis_send();" type="submit"&gt;&lt;input class="atbtn" tabindex="6" value="Cancel" onclick="return _atw.cef()" style="font-weight: normal; color: rgb(102, 102, 102);" type="reset"&gt;&lt;/div&gt;&lt;/form&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="at16pf"&gt;&lt;a id="at-whatsthis" href="http://www.addthis.com/landing/?to=ffext" onclick="_ate.cev('ctk', 'ft:fx:dl');return true" target="_blank"&gt;Download AddThis for Firefox&lt;/a&gt;&lt;a class="at_baa" id="at-logo" href="http://www.addthis.com/?utm_source=mm&amp;amp;utm_medium=img&amp;amp;utm_content=ATLogo_orig&amp;amp;utm_campaign=AT_main" title="AddThis" target="_blank"&gt;AddThis&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="at15s" onmouseover="_atw.xwa()" onmouseout="if (this.className.indexOf('border')==-1) addthis_close()" style="z-index: 1000000; position: absolute; visibility: visible; top: 415px; left: 272px; display: none;"&gt;&lt;div id="at15s_head" style="background-color: rgb(99, 214, 16);"&gt;&lt;span id="at15ptc" style="color: rgb(255, 255, 255);"&gt;Bookmark &amp;amp; Share&lt;/span&gt;&lt;span id="at15s_brand" style="color: rgb(255, 255, 255);"&gt;jQTouch&lt;/span&gt;&lt;/div&gt;&lt;div id="at_hover" style="display: block;"&gt;&lt;div class="at_item at_col0" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('email');"&gt;&lt;span class="at15t at15t_email"&gt;Email&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col1" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('favorites');"&gt;&lt;span class="at15t at15t_favorites"&gt;Favorites&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col0" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('print');"&gt;&lt;span class="at15t at15t_print"&gt;Print&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col1" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('delicious');"&gt;&lt;span class="at15t at15t_delicious"&gt;Delicious&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col0" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('digg');"&gt;&lt;span class="at15t at15t_digg"&gt;Digg&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col1" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('google');"&gt;&lt;span class="at15t at15t_google"&gt;Google&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col0" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('myspace');"&gt;&lt;span class="at15t at15t_myspace"&gt;MySpace&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col1" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('live');"&gt;&lt;span class="at15t at15t_live"&gt;Live&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col0" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('facebook');"&gt;&lt;span class="at15t at15t_facebook"&gt;Facebook&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col1" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('stumbleupon');"&gt;&lt;span class="at15t at15t_stumbleupon"&gt;StumbleUpon&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_col0" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('twitter');"&gt;&lt;span class="at15t at15t_twitter"&gt;Twitter&lt;/span&gt;&lt;/div&gt;&lt;div class="at_item at_colNaN" onmouseover="_atw.hov(this)" onmouseout="_atw.hov(this)" onclick="return addthis_sendto('more');"&gt;&lt;span class="at15t at15t_more"&gt;More... (54)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="at16pf"&gt;&lt;a id="at-whatsthis" href="http://www.addthis.com/landing/?to=ffext" onclick="_ate.cev('ctk', 'ft:fx:dl');return true" target="_blank"&gt;Download AddThis for Firefox&lt;/a&gt;&lt;a class="at_baa" id="at-logo" href="http://www.addthis.com/?utm_source=hm&amp;amp;utm_medium=img&amp;amp;utm_content=ATLogo_orig&amp;amp;utm_campaign=AT_main" title="AddThis" target="_blank"&gt;AddThis&lt;/a&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;A jQuery plugin for mobile web development on the iPhone,  Android, Palm Pre, and other forward-thinking devices.&lt;/p&gt;&lt;p&gt;Link: &lt;a href="http://www.jqtouch.com/"&gt;http://www.jqtouch.com/&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4739306422586068553?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4739306422586068553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4739306422586068553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4739306422586068553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4739306422586068553'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/09/jqtouch.html' title='jQTouch'/><author><name>n3wton.com</name><uri>http://www.blogger.com/profile/07578318546945063595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_tTIJcwTJ3hk/Sp7QbDEwu1I/AAAAAAAAAAY/Wv35wAMAKvg/S220/q532235438_2119.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tTIJcwTJ3hk/SpzzdXyUyGI/AAAAAAAAAAM/TPiLsNhsDiQ/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-383627195251659373</id><published>2009-08-24T19:09:00.004+01:00</published><updated>2009-08-24T19:14:18.925+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cms'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='getsimple'/><title type='text'>New a CMS - you need GetSimple.</title><content type='html'>&lt;p&gt;GetSimple is an XML based lite Content Management System. To go along with it’s best-in-class user interface, its loaded with features that every website needs.  &lt;a href="http://get-simple.info/"&gt;GetSimple&lt;/a&gt; is truly the simplest way to manage a small-business website + no MySQL Database required! its all, as above, managed by XML awesome, &lt;a href="http://get-simple.info/"&gt;Check out the site&lt;/a&gt;, download it and check it out!&lt;/p&gt;&lt;p&gt;URL: &lt;a href="http://get-simple.info/"&gt;http://get-simple.info/&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-383627195251659373?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/383627195251659373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=383627195251659373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/383627195251659373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/383627195251659373'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/08/new-cms-you-need-getsimple.html' title='New a CMS - you need GetSimple.'/><author><name>n3wton.com</name><uri>http://www.blogger.com/profile/07578318546945063595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_tTIJcwTJ3hk/Sp7QbDEwu1I/AAAAAAAAAAY/Wv35wAMAKvg/S220/q532235438_2119.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-3562152556432377689</id><published>2009-08-21T17:35:00.002+01:00</published><updated>2009-08-21T17:35:00.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='SmartTools'/><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='newsticker'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery newsticker: SharePoint WebPart</title><content type='html'>&lt;p&gt;It is possible to integrate the &lt;a href="http://www.texotela.co.uk/code/jquery/newsticker/"&gt;jQuery newsticker plugin&lt;/a&gt; into a SharePoint site using a WebPart: &lt;a href="http://spjquerywebparts.codeplex.com/Wiki/View.aspx?title=News%20Ticker%20Web%20Part%20for%20Announcements%20List"&gt;News Ticker Web Part&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://smarttools.codeplex.com/"&gt;SmartTools&lt;/a&gt; is used to integrate jQuery into SharePoint, via the &lt;a href="http://smarttools.codeplex.com/Wiki/View.aspx?title=jQuery"&gt;SmartTools.jQuery&lt;/a&gt; component.&lt;/p&gt;
&lt;p&gt;Anyone else integrated the newsticker plugin into a module / add-on for a Web CMS?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-3562152556432377689?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/3562152556432377689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=3562152556432377689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3562152556432377689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3562152556432377689'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/08/jquery-newsticker-sharepoint-webpart.html' title='jQuery newsticker: SharePoint WebPart'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4458164114531904457</id><published>2009-07-27T16:06:00.005+01:00</published><updated>2009-07-27T16:12:26.711+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><title type='text'>Visual Studio Macro:  Wrap Selected Text in Tag</title><content type='html'>&lt;p&gt;This simple macro allows you to wrap whatever text is selected in a tag - a feature that somehow is missing from Visual Studio 2008...&lt;/p&gt;
&lt;pre&gt;    Sub SurroundWithTag()
        Dim selectedText = DTE.ActiveDocument.Selection.Text
        Dim tag As String
        tag = InputBox("Enter tag name", "Tag", "strong")
        If (tag = "") Then
            MsgBox("No tag defined")
        Else
            ' no end tag needed as Visual Studio creates the end tag..
            DTE.ActiveDocument.Selection.Text = String.Format("&amp;lt;{0}&amp;gt;{1}", tag, selectedText)
        End If
    End Sub&lt;/pre&gt;
&lt;p&gt;Based on the answer to this question found on Stack Overflow: &lt;a href="http://stackoverflow.com/questions/598062/macro-to-wrap-selected-text-with-tags-in-visual-studio"&gt;Macro to wrap selected text with tags in Visual Studio&lt;/a&gt; (which also details how you can create a macro)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4458164114531904457?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4458164114531904457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4458164114531904457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4458164114531904457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4458164114531904457'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/07/visual-studio-macro-wrap-selected-text.html' title='Visual Studio Macro:  Wrap Selected Text in Tag'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5032849727690333239</id><published>2009-07-08T14:55:00.003+01:00</published><updated>2009-07-08T15:03:45.770+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Quick Tip: Extract CSS Background Image</title><content type='html'>&lt;p&gt;jQuery allows you to get the background image of any element on a web page:&lt;/p&gt;
&lt;pre&gt;$("#myelement").css("background-image");&lt;/pre&gt;
&lt;p&gt;However, this returns it in an undesirable format: &lt;code&gt;url(http://example.com/images/image.jpg)&lt;/code&gt; or &lt;code&gt;url("http://example.com/images/image.jpg")&lt;/code&gt;. With a bit of string replacement, you can get extract the URL:&lt;/p&gt;
&lt;pre&gt;function extractUrl(input)
{
 // remove quotes and wrapping url()
 return input.replace(/"/g,"").replace(/url\(|\)$/ig, "");
}&lt;/pre&gt;
&lt;p&gt;So now you can just do this:&lt;/p&gt;
&lt;pre&gt;extractUrl($("#myelement").css("background-image"))&lt;/pre&gt;
&lt;p&gt;Which will return the URL on its own &lt;code&gt;http://example.com/images/image.jpg&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5032849727690333239?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5032849727690333239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5032849727690333239' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5032849727690333239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5032849727690333239'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/07/jquery-quick-tip-extract-css-background.html' title='jQuery Quick Tip: Extract CSS Background Image'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4763649065376538667</id><published>2009-05-18T17:52:00.000+01:00</published><updated>2009-05-18T17:52:00.495+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><title type='text'>ASP.NET Snippet: Delete All Users and Roles</title><content type='html'>&lt;p&gt;Deleting all users and related data from a site using ASP.NET authentication is fairly simple. Useful if copying a database and you want to remove all the users, but keep the structure and other data (e.g. user content) intact.&lt;/p&gt;
&lt;p&gt;Delete all users:&lt;/p&gt;
&lt;pre&gt;foreach (MembershipUser u in Membership.GetAllUsers())
{
 Membership.DeleteUser(u.UserName, true);
}&lt;/pre&gt;
&lt;p&gt;Delete all roles:&lt;/p&gt;
&lt;pre&gt;foreach (string role in Roles.GetAllRoles())
{
 Roles.DeleteRole(role);
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4763649065376538667?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4763649065376538667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4763649065376538667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4763649065376538667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4763649065376538667'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/05/aspnet-snippet-delete-all-users-and.html' title='ASP.NET Snippet: Delete All Users and Roles'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2188851445510912892</id><published>2009-05-15T17:55:00.002+01:00</published><updated>2009-07-08T21:10:38.917+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET Snippet: Quick Password Reset</title><content type='html'>&lt;p&gt;Here is a simple way, via code to reset a password when you are using the built-in ASP.NET authentication system. Useful if you either don't have a reset password form, or you just want to quickly change a password. Create a blank page, and place in the code behind &lt;code&gt;Page_Load&lt;/code&gt; event.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;    protected void Page_Load(object sender, EventArgs e)
    {
        MembershipUser u = Membership.FindUsersByName("Username")["Username"];
        u.UnlockUser();
        u.ChangePassword(u.ResetPassword(), "newpassword");
    }
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;VB&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;    Public Sub Page_Load(sender As Object, e As EventArgs)
        Dim u As MembershipUser = Membership.FindUsersByName("Username")("Username")
        u.UnlockUser()
        u.ChangePassword(u.ResetPassword(), "newpassword")
    End Sub&lt;/pre&gt;
&lt;p&gt;Just delete the page when done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (8 July 2009)&lt;/strong&gt;: If a question and answer is required when you create a user, you have to pass on the answer to &lt;code&gt;u.ResetPassword&lt;/code&gt;, e.g. &lt;code&gt;u.ChangePassword(u.ResetPassword("answer"), "newpassword")&lt;/code&gt;, otherwise &lt;code&gt;ResetPassword&lt;/code&gt; won't work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2188851445510912892?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2188851445510912892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2188851445510912892' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2188851445510912892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2188851445510912892'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/05/aspnet-snippet-quick-password-reset.html' title='ASP.NET Snippet: Quick Password Reset'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6810372556555000640</id><published>2009-05-05T17:51:00.002+01:00</published><updated>2009-05-18T21:43:42.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><title type='text'>Get ListControl values (CheckBoxList, RadioButtonList, DropDownList, ListBox) from a Repeater the easy way (ASP.NET C#)</title><content type='html'>&lt;p&gt;Building on &lt;a href="http://webdevel.blogspot.com/2009/05/get-textbox-values-from-repeater-easy.html"&gt;Get TextBox values from a Repeater the easy way (ASP.NET C#)&lt;/a&gt;, here is a function that will get the selected values from WebControls that inherit from &lt;code&gt;ListControl&lt;/code&gt; (&lt;code&gt;CheckBoxList&lt;/code&gt;, &lt;code&gt;RadioButtonList&lt;/code&gt;, &lt;code&gt;DropDownList&lt;/code&gt; and &lt;code&gt;ListBox&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;It returns &lt;code&gt;null&lt;/code&gt; if the &lt;code&gt;ListControl&lt;/code&gt; matching the given ID does not exist in the repeater or an empty string array if nothing is selected.&lt;/p&gt;
&lt;pre&gt;public string[] ListControlValues(RepeaterItem itm, string controlId)
{
 string[] output = null;
 ListControl t = itm.FindControl(controlId) as ListControl;
 if (t != null)
 {
  ArrayList ar = new ArrayList();
  foreach (ListItem li in t.Items)
  {
   if (li.Selected) ar.Add(li.Value);
  }
  output = (string[])ar.ToArray(typeof(string));
 }
 return output;
}&lt;/pre&gt;
&lt;p&gt;Use in Repeater ItemCommand&lt;/p&gt;
&lt;pre&gt;protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
 switch (e.CommandName.ToString())
 {
  case "Save":
   int recordID = Convert.ToInt32(e.CommandArgument);
   string[] listBoxValues = ListControlValues("ListBox1");
   if(listBoxValues != null)
   {
     foreach(string s in listBoxValues)
     {
      
     }
   }
   string[] dropDownValues = ListControlValues("DropDown1");
   if(dropDownValues != null)
   {
    // since dropdown can only have one item selected...
    string dropDownValue = dropDownValues[0];
   }
   ....
   
   break;
  default:
   break;
 }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6810372556555000640?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6810372556555000640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6810372556555000640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6810372556555000640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6810372556555000640'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/05/get-listcontrol-values-checkboxlist.html' title='Get ListControl values (CheckBoxList, RadioButtonList, DropDownList, ListBox) from a Repeater the easy way (ASP.NET C#)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7388123364012192440</id><published>2009-05-01T19:06:00.001+01:00</published><updated>2009-05-01T19:06:00.330+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><title type='text'>Get TextBox values from a Repeater the easy way (ASP.NET C#)</title><content type='html'>&lt;p&gt;The asp:Repeater control allows you to attach an ItemCommand event to it, for instance, updating a record in a database.&lt;/p&gt;
&lt;pre&gt;&amp;lt;asp:Repeater ID="MyRepeater" DataSource='&amp;lt;%# MyData %&amp;gt;' runat="server" 
 OnItemCommand="MyRepeater_ItemCommand"&amp;gt;
 &amp;lt;HeaderTemplate&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/HeaderTemplate&amp;gt;
 &amp;lt;ItemTemplate&amp;gt;&amp;lt;li&amp;gt;
 Url: &amp;lt;asp:TextBox ID="Urdl" Text='&amp;lt;%# Eval("Url") %&amp;gt;' runat="server" /&amp;gt;
 Text: &amp;lt;asp:TextBox ID="Text" Text='&amp;lt;%# Eval("Text") %&amp;gt;' runat="server" /&amp;gt;
 &amp;lt;asp:Button ID="SaveButton" CommandName="Save" CommandArgument='&amp;lt;%# Eval("RecordID") %&amp;gt;' Text="Save" runat="server" /&amp;gt;
 &amp;lt;/li&amp;gt;&amp;lt;/ItemTemplate&amp;gt;
 &amp;lt;FooterTemplate&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/FooterTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;
&lt;/pre&gt;
&lt;p&gt;MyRepeater_ItemCommand is then defined:&lt;/p&gt;
&lt;pre&gt;protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
 switch (e.CommandName.ToString())
 {
  case "Save":
   int recordID = Convert.ToInt32(e.CommandArgument);
   TextBox url = e.Item.FindControl("Url") as TextBox;
   TextBox text = e.Item.FindControl("Text") as TextBox;
   
   ....
   
   break;
  default:
   break;
 }
}&lt;/pre&gt;
&lt;p&gt;However this has several downsides:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you mistype the control id, you get a &lt;code&gt;NullReferenceException&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The code can get cluttered and harder to understand as more &lt;code&gt;TextBox&lt;/code&gt;'s are added.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To help mitigate this, this function gets the value of the &lt;code&gt;TextBox&lt;/code&gt;, or null if the &lt;code&gt;TextBox&lt;/code&gt; is not found.&lt;/p&gt;
&lt;pre&gt;public string TextBoxValue(RepeaterItem itm, string controlId)
{
 string output = null;
 TextBox t = itm.FindControl(controlId) as TextBox;
 if (t != null)
 {
  output = t.Text;
 }
 return output;
}&lt;/pre&gt;
&lt;p&gt;Then you can get the value without an exception occurring:&lt;/p&gt;
&lt;pre&gt;string url = TextBoxValue(e.Item, "Url");
string text = TextBoxValue(e.Item, "Text");
if(url != null)
{
    // update url in record
}
if(text == null)
{
    // update text in record
}&lt;/pre&gt;
&lt;p&gt;The code could then be used in a class and used on multiple pages, so if a page doesn't have a TextBox with a certain ID, the corresponding data field is not updated (e.g. on one page you might want a user to update the URL, but on another more restricted page, you may only want them to change the text). Code behind would then just be:&lt;/p&gt;
&lt;pre&gt;protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
 RepeaterMethods.MyRepeater_ItemCommand(sender, e);
}&lt;/pre&gt;
&lt;p&gt;And the class could be:&lt;/p&gt;
&lt;pre&gt;using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;

/// &amp;lt;summary&amp;gt;
/// Summary description for RepeaterMethods
/// &amp;lt;/summary&amp;gt;
public class RepeaterMethods
{
 public RepeaterMethods()
 {
  //
  // TODO: Add constructor logic here
  //
 }

 public static void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
 {
  switch (e.CommandName.ToString())
  {
   case "Save":
    string url = TextBoxValue(e.Item, "Url");
    string text = TextBoxValue(e.Item, "Text");
    if (url != null)
    {
     // update url in record
    }
    if (text == null)
    {
     // update text in record
    }
    break;
   default:
    break;
  }
 }

 public static string TextBoxValue(RepeaterItem itm, string controlId)
 {
  string output = null;
  TextBox t = itm.FindControl(controlId) as TextBox;
  if (t != null)
  {
   output = t.Text;
  }
  return output;
 }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7388123364012192440?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7388123364012192440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7388123364012192440' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7388123364012192440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7388123364012192440'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/05/get-textbox-values-from-repeater-easy.html' title='Get TextBox values from a Repeater the easy way (ASP.NET C#)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4903610191578096299</id><published>2009-05-01T18:28:00.000+01:00</published><updated>2009-05-01T18:28:00.659+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><category scheme='http://www.blogger.com/atom/ns#' term='lazy loading'/><title type='text'>Binding data to a Repeater using Lazy Loading (ASP.NET C#)</title><content type='html'>&lt;p&gt;Lazy loading is a method of only loading data as and when you need it. Rather than loading it on page load, you can define a property that can then be bound to a WebControl.&lt;/p&gt;

&lt;p&gt;For example, in the page is an &lt;code&gt;asp:Repeater&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;        &amp;lt;asp:Repeater ID="MyRepeater" DataSource='&amp;lt;%# MyData %&amp;gt;' runat="server"&amp;gt;
            &amp;lt;HeaderTemplate&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/HeaderTemplate&amp;gt;
            &amp;lt;ItemTemplate&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href="&amp;lt;%# Eval("Url") %&amp;gt;"&amp;gt;&amp;lt;%# Eval("Text") %&amp;gt;&amp;lt;/a&amp;gt; (Record ID: &amp;lt;%# Eval("RecordID") %&amp;gt;)&amp;lt;/li&amp;gt;&amp;lt;/ItemTemplate&amp;gt;
            &amp;lt;FooterTemplate&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/FooterTemplate&amp;gt;
        &amp;lt;/asp:Repeater&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;MyData&lt;/code&gt; in the &lt;code&gt;DataSource&lt;/code&gt; attribute of &lt;code&gt;asp:Repeater&lt;/code&gt; is a property defined in the CodeBehind page:&lt;/p&gt;

&lt;pre&gt;    private DataTable _MyData;
    public DataTable MyData
    {
        get
        {
            if (_MyData == null)
            {
                _MyData = LoadMyData();
            }
            return _MyData;
        }
    }&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;LoadMyData&lt;/code&gt; gets the data you want to show (normally it would be loaded from a database, rather than rows added in this case)&lt;/p&gt;

&lt;pre&gt;    private DataTable LoadMyData()
    {
        Trace.Write("LoadMyData");
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("RecordID", Type.GetType("System.Int32")));
        dt.Columns.Add(new DataColumn("Text", Type.GetType("System.String")));
        dt.Columns.Add(new DataColumn("Url", Type.GetType("System.String")));

        DataRow row;
        int index = 1;

        // new row
        row = dt.NewRow();
        // populate row
        row["RecordID"] = index;
        row["Text"] = "Google";
        row["Url"] = "http://www.google.co.uk";
        // add row to table
        dt.Rows.Add(row);

        // increment index
        index++;

        // new row
        row = dt.NewRow();
        // populate row
        row["RecordID"] = index;
        row["Text"] = "Yahoo";
        row["Url"] = "http://www.yahoo.co.uk";
        // add row to table
        dt.Rows.Add(row);

        return dt;
    }&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;Trace.Write&lt;/code&gt; is there to show that the data isn't loaded if it is not bound to a WebControl in the page. This can be tested by turning on tracing (adding &lt;code&gt;Trace="True"&lt;/code&gt; to &lt;code&gt;&amp;lt;%@ Page&lt;/code&gt;) and removing &lt;code&gt;DataSource='&amp;lt;%# MyData %&amp;gt;'&lt;/code&gt; from the Repeater.&lt;/p&gt;

&lt;p&gt;You would then bind the page on load:&lt;/p&gt;

&lt;pre&gt;    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            DataBind();
        }
    }&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;LazyLoadRepeater.aspx:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="LazyLoadRepeater.aspx.cs" Inherits="LazyLoadRepeater" Trace="true" %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;

&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&amp;lt;head runat="server"&amp;gt;
    &amp;lt;title&amp;gt;Lazy Loading&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form id="form1" runat="server"&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;h1&amp;gt;Search Engines&amp;lt;/h1&amp;gt;
        &amp;lt;asp:Repeater ID="MyRepeater" DataSource='&amp;lt;%# MyData %&amp;gt;' runat="server"&amp;gt;
            &amp;lt;HeaderTemplate&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/HeaderTemplate&amp;gt;
            &amp;lt;ItemTemplate&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href="&amp;lt;%# Eval("Url") %&amp;gt;"&amp;gt;&amp;lt;%# Eval("Text") %&amp;gt;&amp;lt;/a&amp;gt; (Record ID: &amp;lt;%# Eval("RecordID") %&amp;gt;)&amp;lt;/li&amp;gt;&amp;lt;/ItemTemplate&amp;gt;
            &amp;lt;FooterTemplate&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/FooterTemplate&amp;gt;
        &amp;lt;/asp:Repeater&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;LazyLoadRepeater.aspx.cs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class LazyLoadRepeater : System.Web.UI.Page
{
    private DataTable _MyData;
    public DataTable MyData
    {
        get
        {
            if (_MyData == null)
            {
                _MyData = LoadMyData();
            }
            return _MyData;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            DataBind();
        }
    }

    private DataTable LoadMyData()
    {
        Trace.Write("LoadMyData");
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("RecordID", Type.GetType("System.Int32")));
        dt.Columns.Add(new DataColumn("Text", Type.GetType("System.String")));
        dt.Columns.Add(new DataColumn("Url", Type.GetType("System.String")));

        DataRow row;
        int index = 1;

        // new row
        row = dt.NewRow();
        // populate row
        row["RecordID"] = index;
        row["Text"] = "Google";
        row["Url"] = "http://www.google.co.uk";
        // add row to table
        dt.Rows.Add(row);

        // increment index
        index++;

        // new row
        row = dt.NewRow();
        // populate row
        row["RecordID"] = index;
        row["Text"] = "Yahoo";
        row["Url"] = "http://www.yahoo.co.uk";
        // add row to table
        dt.Rows.Add(row);

        return dt;
    }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4903610191578096299?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4903610191578096299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4903610191578096299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4903610191578096299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4903610191578096299'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/05/binding-data-to-repeater-using-lazy.html' title='Binding data to a Repeater using Lazy Loading (ASP.NET C#)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1016223989288014</id><published>2009-04-16T18:08:00.001+01:00</published><updated>2009-04-16T18:08:00.154+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='sample database'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Chinook: Cross-Database (SQL Server, Oracle, MySQL) Sample</title><content type='html'>&lt;p&gt;The &lt;a href="http://chinookdatabase.codeplex.com/"&gt;Chinook database&lt;/a&gt; is a sample database that is an alternative to the Northwind sample. One of the advantages it has over Northwind is that it can be installed on SQL Server (including the Compact Edition), Oracle and MySQL. Therefore it can be used to test &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;Object-relational mapping&lt;/a&gt; (ORM) frameworks (e.g. &lt;a href="http://www.hibernate.org/"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://subsonicproject.com/"&gt;SubSonic&lt;/a&gt; etc).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1016223989288014?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1016223989288014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1016223989288014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1016223989288014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1016223989288014'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/04/chinook-cross-database-sql-server.html' title='Chinook: Cross-Database (SQL Server, Oracle, MySQL) Sample'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-55552112023837045</id><published>2009-04-15T18:10:00.001+01:00</published><updated>2009-04-15T18:10:00.788+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mygeneration'/><category scheme='http://www.blogger.com/atom/ns#' term='code generation'/><title type='text'>Code Generation with MyGeneration</title><content type='html'>&lt;p&gt;Rather than type repetitive code, a code generator could be used to do it for you. &lt;a href="http://www.mygenerationsoftware.com/"&gt;MyGeneration&lt;/a&gt; is one such piece of software that will help. As the output is just text, you can output code in any language (ASP.NET, C#, VB.NET, PHP, JavaScript etc) - although with a bit of extra work, PDF's can be generated (using &lt;a href="http://sourceforge.net/projects/itextsharp/"&gt;iTextSharp&lt;/a&gt; - which would need to be downloaded and the dll saved in the MyGeneration install folder). It can query many database types (SQL Server, Oracle, SQLite, MySQL, PostgreSQL and more), but a database isn't required for it to be of use. You can set up an interface (to select columns in a table for example), but it is optional.&lt;/p&gt;
&lt;p&gt;For example, to loop through columns in a database table:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Template Code&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&amp;lt;%
public class GeneratedTemplate : DotNetScriptTemplate
{
 public GeneratedTemplate(ZeusContext context) : base(context) {}
 
 private string DatabaseName;
 private string TableName;
 private ITable table;
 private ArrayList columns;
 private string PrimaryKey = string.Empty;

 //---------------------------------------------------
 // Render() is where you want to write your logic    
 //---------------------------------------------------
 public override void Render()
 {
  DatabaseName = input["databaseName"].ToString();
  TableName = input["tableName"].ToString();
  table = MyMeta.Databases[DatabaseName].Tables[TableName];
  columns = input["lstColumns"] as ArrayList;
  try
  {
   PrimaryKey = table.PrimaryKeys[0].Name; 
  }
  catch (System.Exception ex)
  {
   // no primary key
  }
  foreach (string columnName in columns)
  {
  %&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;%= columnName %&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;%
  }
 }
 
 // check if column has been selected via UI
 private bool IsInColumns(Column c)
 {
  foreach (string columnName in columns)
  {
   if (columnName == c.Name) return true;
  }
  return false;
 }
}
%&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Interface Code&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
public class GeneratedGui : DotNetScriptGui
{
 public GeneratedGui(ZeusContext context) : base(context) {}
 
 private string DatabaseName;
 private string TableName;
 private string PrimaryKey = string.Empty;
 private ArrayList columns;
 private ITable table;

 //-----------------------------------------
 // The User Interface Entry Point
 //-----------------------------------------
 public override void Setup()
 {

  ui.Width  = 500;
  ui.Height = 350;
  
  // Setup Database selection combobox.
  GuiLabel lblDatabases = ui.AddLabel("lblDatabases", "Select a database:", "Select a database in the dropdown below.");
  GuiComboBox cmbDatabases = ui.AddComboBox("databaseName", "Select a database.");
  
  // Setup Tables selection multi-select listbox.
  GuiLabel lblTables = ui.AddLabel("lblTables", "Select table:", "Select table from the combobox below.");
  GuiComboBox cmbTables = ui.AddComboBox("tableName", "Select a table.");
  
  // setup columns list box
  GuiLabel lblColumns = ui.AddLabel("lblColumns", "Select columns:", "Select columns from the listbox below.");
  GuiListBox lstColumns = ui.AddListBox("lstColumns", "Select columns.");
  
  lstColumns.Height = 130;
  
  // bind data to the controls
  cmbDatabases.BindData(MyMeta.Databases);
  cmbDatabases.SelectedValue = MyMeta.DefaultDatabase.Name;
  cmbTables.BindData( MyMeta.Databases[cmbDatabases.SelectedValue].Tables );
  
  // Attach the onchange event to the cmbDatabases control.
  cmbDatabases.AttachEvent("onchange", "cmbDatabases_onchange");
  cmbTables.AttachEvent("onchange", "cmbTables_onchange");
  
  ui.ShowGui = true;
 }
 
 public void cmbDatabases_onchange(GuiComboBox control)
 {
  GuiComboBox cmbDatabases = ui["databaseName"] as GuiComboBox;
  GuiComboBox cmbTables = ui["tableName"] as GuiComboBox;
  cmbTables.BindData( MyMeta.Databases[cmbDatabases.SelectedValue].Tables );
  GuiListBox lstColumns = ui["lstColumns"] as GuiListBox;
  lstColumns.Clear();
 }
 
 public void cmbTables_onchange(GuiComboBox control)
 {
  try 
  {
   GuiComboBox cmbDatabases = ui["databaseName"] as GuiComboBox;
   GuiComboBox cmbTables = ui["tableName"] as GuiComboBox;
   GuiListBox lstColumns = ui["lstColumns"] as GuiListBox;
   lstColumns.BindData( MyMeta.Databases[cmbDatabases.SelectedValue].Tables[cmbTables.SelectedValue].Columns );
  }
  catch (Exception ex)
  {
  }
 }
}&lt;/pre&gt;
&lt;p&gt;To loop through a collection (e.g. ArrayList).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Template Code&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&amp;lt;%
public class GeneratedTemplate : DotNetScriptTemplate
{
 public GeneratedTemplate(ZeusContext context) : base(context) {}

 //---------------------------------------------------
 // Render() is where you want to write your logic    
 //---------------------------------------------------
 public override void Render()
 {
  int i;
  ArrayList items = new ArrayList();
  items.Add("Array Item 1");
  items.Add("Array Item 2");
  items.Add("Array Item 3");
  items.Add("Array Item 4");
  items.Add("Array Item 5");
  
  for(i = 0; i &amp;lt; items.Count; i++)
  {
  %&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;%= items[i].ToString() %&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;%
  }
 }

}
%&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Interface Code&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;public class GeneratedGui : DotNetScriptGui
{
 public GeneratedGui(ZeusContext context) : base(context) {}

 //-----------------------------------------
 // The User Interface Entry Point
 //-----------------------------------------
 public override void Setup()
 {
  // ** UNCOMMENT CODE BELOW TO SEE UI **

  //ui.Width  = 100;
  //ui.Height = 100;
  //GuiLabel lblDemo = ui.AddLabel("lblDemo", "Demo", "Demo Tooltip");
  //ui.ShowGui = true;
 }

}&lt;/pre&gt;
&lt;p&gt;MyGeneration comes with a template library built in, so chances are, someone may have already done a template that does what you want. You can post your own &lt;a href="http://www.mygenerationsoftware.com/templatelibrary/"&gt;templates online&lt;/a&gt; as well (MyGeneration can download templates from this site, so you don't need to actually go to the site to get them).&lt;/p&gt;
&lt;p&gt;It is also on SourceForge: &lt;a href="http://sourceforge.net/projects/mygeneration/"&gt;http://sourceforge.net/projects/mygeneration/&lt;/a&gt;, so you can download the source code for it and make changes or add features.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-55552112023837045?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/55552112023837045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=55552112023837045' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/55552112023837045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/55552112023837045'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/04/code-generation-with-mygeneration.html' title='Code Generation with MyGeneration'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8873966842229033850</id><published>2009-04-10T19:28:00.003+01:00</published><updated>2009-04-10T19:33:35.505+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='xcf'/><title type='text'>GIMP Button Templates - Web 2.0 Style</title><content type='html'>&lt;p&gt;Created some &lt;a href="http://www.texotela.co.uk/gimp/"&gt;GIMP images&lt;/a&gt; that can be used as templates for creating buttons. Available in 64x64 and 256x64 sizes. Text can be altered and the background style changed (by altering visibility).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.texotela.co.uk/gimp/64x64Button.gif" width="64" height="64" /&gt; &lt;img src="http://www.texotela.co.uk/gimp/256x64Button.gif" width="256" height="64" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8873966842229033850?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8873966842229033850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8873966842229033850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8873966842229033850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8873966842229033850'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/04/gimp-button-templates-web-20-style.html' title='GIMP Button Templates - Web 2.0 Style'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5246229125395174057</id><published>2009-04-05T16:39:00.006+01:00</published><updated>2009-04-05T16:52:27.830+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='vector'/><category scheme='http://www.blogger.com/atom/ns#' term='svg'/><category scheme='http://www.blogger.com/atom/ns#' term='raphaël'/><category scheme='http://www.blogger.com/atom/ns#' term='vml'/><title type='text'>Raphaël - a JavaScript library for creating vector images</title><content type='html'>&lt;p&gt;&lt;a href="http://raphaeljs.com/"&gt;Raphaël&lt;/a&gt; enables you to create geometric shapes / vector images in your web page without needing to know the syntax of &lt;a href="http://msdn.microsoft.com/en-us/library/bb250524(VS.85).aspx"&gt;Vector Markup Language&lt;/a&gt; (VML) or &lt;a href="http://www.w3.org/Graphics/SVG/"&gt;Scalable Vector Graphics&lt;/a&gt; (SVG). You can &lt;a href="http://twitter.com/RaphaelJS"&gt;follow Raphaël&lt;/a&gt; on Twitter.&lt;/p&gt;
&lt;p&gt;Sample code (example from website) shows how easy it is to work with.&lt;/p&gt;
&lt;pre&gt;// Creates canvas 320 × 200 at 10, 50
var paper = Raphael(10, 50, 320, 200);
// Creates circle at x = 50, y = 40, with radius 10
var circle = paper.circle(50, 40, 10);
// Sets the fill attribute of the circle to red (#f00)
circle.attr("fill", "#f00");
// Sets the stroke attribute of the circle to white (#fff)
circle.attr("stroke", "#fff");&lt;/pre&gt;
&lt;p&gt;Animation of the shapes created can also be done with it (e.g. circles into squares).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5246229125395174057?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5246229125395174057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5246229125395174057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5246229125395174057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5246229125395174057'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/04/raphael-javascript-library-for-creating.html' title='Raphaël - a JavaScript library for creating vector images'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7079873550186458473</id><published>2009-03-11T17:40:00.001Z</published><updated>2009-03-11T17:40:00.616Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='tabs'/><title type='text'>Pure Accessible JavaScript Tabs</title><content type='html'>&lt;p&gt;Found some code I did a while ago (pre jQuery) of a simple tabbed navigation implementation using JavaScript and basic CSS. Posting if anyone is interested.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&amp;lt;ul id="tabnav"&amp;gt;
 &amp;lt;li&amp;gt;&amp;lt;a href="#tab1"&amp;gt;Tab 1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;&amp;lt;a href="#tab2"&amp;gt;Tab 2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;&amp;lt;a href="#tab3"&amp;gt;Tab 3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;div id="tabs"&amp;gt;
 &amp;lt;div id="tab1"&amp;gt;&amp;lt;a name="tab1"&amp;gt;&amp;lt;/a&amp;gt;
  &amp;lt;h1&amp;gt;Tab 1&amp;lt;/h1&amp;gt;
  This is the contents of Tab 1
 &amp;lt;/div&amp;gt;
 &amp;lt;div id="tab2"&amp;gt;&amp;lt;a name="tab2"&amp;gt;&amp;lt;/a&amp;gt;
  &amp;lt;h1&amp;gt;Tab 2&amp;lt;/h1&amp;gt;
  This is the contents of Tab 2
 &amp;lt;/div&amp;gt;
 &amp;lt;div id="tab3"&amp;gt;&amp;lt;a name="tab3"&amp;gt;&amp;lt;/a&amp;gt;
  &amp;lt;h1&amp;gt;Tab 3&amp;lt;/h1&amp;gt;
  This is the contents of Tab 3
 &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;#tabnav {
 width: 100%;
 overflow: hidden;
 list-style-type: none;
 margin: 0;
 padding: 0;
}
#tabnav li {
 float: left;
 padding: 6px;
 margin: 0;
}
#tabnav li.activetab {
 font-weight: bold;
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; (hopefully the inline comments should explain how it works). Add in &lt;code&gt;script&lt;/code&gt; tag after HTML&lt;/p&gt;
&lt;pre&gt;// setup tabs, default is 'tab2'
setupTabs("tab2");
 
function setupTabs(tabDefault) {
 if (document.getElementById) {
  // get tab navigator
  var tabnav = document.getElementById('tabnav');
  if(tabnav) {
   // get list items in tab navigator
   var tablist = tabnav.getElementsByTagName('li');
   // loop through list items
   for (i=0;i&amp;lt;tablist.length;i++) {
    // get tab links (i.e. anchor tags)
    var tablinks = tablist[i].getElementsByTagName('a');
    // loop through tab links
    for (j=0;j&amp;lt;tablinks.length;j++) {
     // get hash for current tablink (i.e. the #tabname portion)
     var hash = tablinks[j].hash;
     // set onclick attribute to toggle the tabs (does not work in IE)
     tablinks[j].setAttribute("onclick","toggleTabs('"+hash.substring(1)+"'); return false;");
     // detect IE (other browsers don't support attachEvent)
     if (tablinks[j].attachEvent) {
      // set onclick to toggle tabs
      tablinks[j].onclick = Function("toggleTabs('"+hash.substring(1)+"'); return false;");
     }
     // if has is default tab
     if (hash == ("#" + tabDefault)) {
      // set parent nodes css class to 'activetab' (i.e. 'li' tag) and show tab
      tablinks[j].parentNode.className = "activetab";
      showTab(tabDefault);
     } else {
      // set parent nodes css class to empty (i.e. 'li' tag) and hide tab
      tablinks[j].parentNode.className = ""
      hideTab(hash.substring(1));
     }
    }
   }
  }
 }
}
function showTab(tabId) {
 if (document.getElementById) {
  // get current tab
  var currentTab = document.getElementById(tabId);
  // show tab by setting display style to blank string
  currentTab.style.display = "";
  // get anchor tags in current tab
  var currentTabAnchors = currentTab.getElementsByTagName('a'); 
  // loop through anchor tags
  for (k=0;k&amp;lt;currentTabAnchors.length;k++) {
   // if anchor tag has same name as current tag id, hide it
   if(currentTabAnchors[k].name==tabId) {
    currentTabAnchors[k].style.display = "none";
   }
  }
 }
}
function hideTab(tabId) {
 if (document.getElementById) {
  document.getElementById(tabId).style.display = "none";
 }
}
function toggleTabs(tabId) {
 if (document.getElementById) {
  // an array of all the sections
  var sectionnames = new Array();
  // get tab navigator
  var tabnav = document.getElementById('tabnav');
  // get list items in tab navigator
  var tablist = tabnav.getElementsByTagName('li');
  // loop through list items
  for (i=0;i&amp;lt;tablist.length;i++) {
   // get tab links (i.e. anchor tags)
   var tablinks = tablist[i].getElementsByTagName('a');
   // loop through tab links
   for (j=0;j&amp;lt;tablinks.length;j++) {
    // get hash for current tablink (i.e. the #tabname portion)
    var hash = tablinks[j].hash;
    // add has to sections array
    sectionnames.push(hash.substr(1));
    // if hash is selected tab
    if (hash == ("#" + tabId)) {
     // set parent nodes css class to 'activetab' (i.e. 'li' tag)
     tablinks[j].parentNode.className = "activetab";
    } else {
     // set parent nodes css class to empty (i.e. 'li' tag)
     tablinks[j].parentNode.className = ""
    }
   }
  }
  // get tabs
  var tabs = document.getElementById('tabs');
  // get tab sections
  var sections = tabs.childNodes;
  // loop through sections
  for (i=0;i&amp;lt;sections.length;i++) {
   // if node is not a div, then continue to next loop item
   if (sections[i].nodeName!='DIV') continue;
   // if current section id matches tabId show it
   if(sections[i].id==tabId) {
    showTab(sections[i].id);
   } else {
    // get child anchor nodes
    var atags = sections[i].getElementsByTagName("a");
    // if anchor nodes have been found
    if (atags.length &amp;gt; 0) {
     // loop through the section names
     for (j=0;j&amp;lt;sectionnames.length;j++) {
      // if first anchor tags name matches the current section id, hide the tab
      if(sectionnames[j] == atags[0].getAttribute("name")) {
       hideTab(sections[i].id);
      }
     }
    }
    
   }
  }
 }
 return false;
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7079873550186458473?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7079873550186458473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7079873550186458473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7079873550186458473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7079873550186458473'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/03/pure-accessible-javascript-tabs.html' title='Pure Accessible JavaScript Tabs'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2613219268892785864</id><published>2009-01-22T17:57:00.003Z</published><updated>2009-01-22T19:09:33.486Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='shrink image'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Shrink Image (JavaScript)</title><content type='html'>&lt;p&gt;This function shrinks an image, so its dimensions are no bigger than the maximum dimensions you define.&lt;/p&gt;
&lt;pre&gt;// get new dimensions so it fits within the maximum
// o = original dimensions / image, m = maximum dimensions
function shrink(o, m)
{
    // r = resized
    var r = {width: o.width, height: o.height};
    // if an image, rather than an object, resize it
    if(o.nodeName &amp;&amp; o.nodeName.toLowerCase() == "img") r = o;
    if(r.width &gt; m.width)
    {
        r.height = r.height * (m.width / r.width);
        r.width = m.width;
        if(r.height &gt; m.height)
        {
            r.width = r.width * (m.height / r.height);
            r.height = m.height;
        }
    }
    else if(r.height &gt; m.height)
    {
        r.width = r.width * (m.height / r.height);
        r.height = m.height;
    }
    return r;
}&lt;/pre&gt;
&lt;p&gt;To use, simply supply the image and the dimensions to constrain it to:&lt;/p&gt;
&lt;pre&gt;var image = document.getElementById("image");
var max = {width: 1024, height: 768};
shrink(image, max);&lt;/pre&gt;
&lt;p&gt;It also works with an object instead of an image, for non-image related dimension calculation.&lt;/p&gt;
&lt;pre&gt;var original = {width: 1200, height: 960};
var max = {width: 1024, height: 768};
var shrunk = shrink(original, max);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2613219268892785864?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2613219268892785864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2613219268892785864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2613219268892785864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2613219268892785864'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/01/shrink-image-javascript.html' title='Shrink Image (JavaScript)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1088746991865353684</id><published>2009-01-22T12:37:00.005Z</published><updated>2009-01-22T12:51:07.766Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bgiframe'/><category scheme='http://www.blogger.com/atom/ns#' term='jQueryUI'/><category scheme='http://www.blogger.com/atom/ns#' term='dialog'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Changing jQuery UI's Dialog widget's default options</title><content type='html'>&lt;p&gt;While &lt;a href="http://ui.jquery.com/demos/dialog"&gt;jQuery UI's Dialog&lt;/a&gt; widget has good default options, there may be circumstances when you want to change them. For instance, you may want all dialog windows to be modal windows, with a semi-transparent background and the &lt;a href="http://plugins.jquery.com/project/bgiframe"&gt;bgiframe plugin&lt;/a&gt; applied. Place this code at the end of the page, or within &lt;code&gt;$(document).ready&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;$.extend($.ui.dialog.defaults, {
 overlay : { background: "#000", opacity: 0.8},
 modal: true,
 bgiframe: true
});&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1088746991865353684?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1088746991865353684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1088746991865353684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1088746991865353684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1088746991865353684'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/01/changing-jquery-uis-dialog-widget.html' title='Changing jQuery UI&apos;s Dialog widget&apos;s default options'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8040922418172022902</id><published>2009-01-10T21:06:00.001Z</published><updated>2009-01-10T21:06:51.417Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='cms'/><category scheme='http://www.blogger.com/atom/ns#' term='pixie'/><category scheme='http://www.blogger.com/atom/ns#' term='content management'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web standards'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Pixie – small, simple, website maker</title><content type='html'>&lt;p&gt;Recently, I have been looking at &lt;a href="http://getpixie.co.uk"&gt;Pixie&lt;/a&gt;, to see how it works as a simple system for managing websites. It is open source (GPL v3), written to web standards (XHTML Strict, &lt;a href="http://microformats.org/"&gt;Microformats&lt;/a&gt;) and powered by jQuery and PHP/MySQL.&lt;/p&gt;  &lt;p&gt;It consists of several page types – dynamic (blog, news), static or module (e.g. contact form, events, links etc). Plugins add additional functionality to modules (like allowing comments on blog posts). Blocks allow you to add content alongside your content (e.g. display RSS content from BBC News).&lt;/p&gt;  &lt;p&gt;Easy enough to extend, with detailed guides for &lt;a href="http://www.getpixie.co.uk/support/article/module-development/"&gt;module development&lt;/a&gt; (so you can create additional ones to those that are bundled with Pixie) &lt;a href="http://www.getpixie.co.uk/support/article/block-development/"&gt;block development&lt;/a&gt; and &lt;a href="http://www.getpixie.co.uk/support/article/theme-development/"&gt;theme development&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;A few additional blocks I have created: &lt;a href="http://pastebin.ws/8nw1gj"&gt;News&lt;/a&gt; (latest content from a page named ‘news’) and &lt;a href="http://pastebin.ws/e01rf6"&gt;Google Maps&lt;/a&gt;. These can then be shown on any page (so you can see news on your home page for example).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8040922418172022902?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8040922418172022902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8040922418172022902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8040922418172022902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8040922418172022902'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/01/pixie-small-simple-website-maker.html' title='Pixie – small, simple, website maker'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4227350840827718267</id><published>2009-01-07T17:57:00.001Z</published><updated>2009-01-07T17:57:00.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='google gears desktop api'/><category scheme='http://www.blogger.com/atom/ns#' term='google gears'/><title type='text'>Google Gears Desktop API - Working with files</title><content type='html'>&lt;p&gt;The &lt;a href="http://code.google.com/apis/gears/api_desktop.html"&gt;Google Gears Desktop API&lt;/a&gt; allows you to create shortcuts on your desktop (only to a page on the same site, not to another) and work with files. This example shows you how you can filter the file types when choosing files. &lt;a href="http://code.google.com/apis/gears/tools.html#gears_init"&gt;gears_init.js&lt;/a&gt; required.&lt;/p&gt;
&lt;pre&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
 &amp;lt;head&amp;gt;
 &amp;lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8"&amp;gt;
 &amp;lt;title&amp;gt;Google Desktop API - Working with files&amp;lt;/title&amp;gt;
&amp;lt;script type="text/javascript" src="gears_init.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
var fileformats = {

 // word document
 word: 'application/msword',
 // word 2007 document
 wpml: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',

 // excel spreadsheet
 excel: 'application/vnd.ms-excel',
 // excel 2007 spreadsheet
 ssml: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',

 // powerpoint presentation
 powerpoint: 'application/vnd.ms-powerpoint',
 // powerpoint 2007 presentation
 pml: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
 
 // jpeg
 jpeg: 'image/jpeg',
 
 // png
 png: 'image/png',
 
 // gif
 gif: 'image/gif',
 
 // tiff
 tiff: 'image/tiff'
}


// http://code.google.com/apis/gears/api_desktop.html
var desktop = google.gears.factory.create('beta.desktop');

function officeFiles()
{
 desktop.openFiles(openFilesCallback, {singleFile: false,
  filter: [fileformats.word, fileformats.wpml,
   fileformats.excel, fileformats.ssml,
   fileformats.powerpoint, fileformats.pml]
 });
}

function imageFiles()
{
 desktop.openFiles(openFilesCallback, {singleFile: false,
  filter: [fileformats.jpeg, fileformats.png,
   fileformats.gif, fileformats.tiff]
 });
}


function openFilesCallback(files)
{
 if(files.length == 0)
 {
  alert("No files selected");
 }
 else
 {
  var selectedFiles = [];
  for(var i = 0; i &amp;lt; files.length; i++)
  {
   selectedFiles.push(files[i].name + " (" + files[i].blob.length + " bytes)");
  }
  alert("Selected files: " + selectedFiles);
 }
}
&amp;lt;/script&amp;gt;
 &amp;lt;/head&amp;gt;
 &amp;lt;body&amp;gt;
  &amp;lt;p&amp;gt;&amp;lt;a href="http://code.google.com/apis/gears/api_desktop.html"&amp;gt;Google Gears Desktop API&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;form action="" method="post"&amp;gt;
   &amp;lt;input value="Select Office Files" type="button" id="selectofficefiles"&amp;gt;
   &amp;lt;input value="Select Image Files" type="button" id="selectimagefiles"&amp;gt;
  &amp;lt;/form&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
var selectofficefiles = document.getElementById("selectofficefiles");
selectofficefiles.onclick = function()
{
 officeFiles();
 return false;
}

var selectimagefiles = document.getElementById("selectimagefiles");
selectimagefiles.onclick = function()
{
 imageFiles();
 return false;
}
&amp;lt;/script&amp;gt;
 &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;p&gt;The benefit of using Google Gears is that you can get the file size before uploading the file, so a check can be done beforehand to see if the file is to big (e.g. &lt;code&gt;if(files[i].blob.length &amp;gt; 1048576) alert(files[i].name  + " too big (&amp;gt; 1MB)");&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4227350840827718267?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4227350840827718267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4227350840827718267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4227350840827718267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4227350840827718267'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/01/google-gears-desktop-api-working-with.html' title='Google Gears Desktop API - Working with files'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-9185570936527099690</id><published>2009-01-02T14:06:00.004Z</published><updated>2009-01-02T14:46:17.955Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='graph paper'/><title type='text'>Free Graph Paper (for printing)</title><content type='html'>&lt;p&gt;There are a few sites that offer paper (graph, maths, speciality) you can print off (as PDF) for free. Usually with a credit to the site at the bottom of the page.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://konigi.com/tools/graph-paper"&gt;Konigi&lt;/a&gt; offers various storyboard and wireframe PDF's available in 8.5" x 11" (no A4 available). So they are useful when creating a site design mockup or a story.&lt;p&gt;&lt;p&gt;&lt;a href="http://www.printfreegraphpaper.com/"&gt;Print Free Graph Paper&lt;/a&gt; offers Cartesian, Engineering, Polar, Isometric, Logarithmic, Hexagonal, Probability and Smith Chart templates available in Letter and A4 sizes.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mathsphere.co.uk/resources/MathSphereFreeGraphPaper.htm"&gt;MathSphere&lt;/a&gt; also has paper types the previous site doesn't.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://incompetech.com/graphpaper/"&gt;Incompetech.com&lt;/a&gt; has various paper generators for different page sizes (you can create a custom size as well), not just graph paper, but speciality and writing as well (Chinese, Japanese, Fretboard, Cornell etc). You can even define what colour the lines should be.&lt;/p&gt;
&lt;p&gt;Useful when you don't need a full pad, the stationer doesn't sell the paper you want, or the shops are closed and you need paper before they are open again (you have a deadline or late submission).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-9185570936527099690?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/9185570936527099690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=9185570936527099690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9185570936527099690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9185570936527099690'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2009/01/free-graph-paper-for-printing.html' title='Free Graph Paper (for printing)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2092239472338554803</id><published>2008-12-18T23:27:00.005Z</published><updated>2008-12-19T10:45:02.063Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='newsticker'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery newsticker Demo Page</title><content type='html'>&lt;p&gt;Some may have noticed, the demo page for the &lt;a href="http://www.texotela.co.uk/code/jquery/newsticker/"&gt;newsticker jQuery plugin&lt;/a&gt; has not been working in Internet Explorer 7. This is due to it being experimental code for allowing pausing, resuming and clearing of any active news ticker's on the page. It should now work in IE7 (and hopefully IE6 as well).&lt;/p&gt;&lt;p&gt;There are a few additions to the plugin that should be of benefit. Set up the news ticker as usual:&lt;/p&gt;
&lt;pre&gt;var $news = $("#news").newsticker();&lt;/pre&gt;
&lt;p&gt;After doing so, you may pause, resume and clear it in your own functions. For example, clicking on elements with id's &lt;code&gt;pause&lt;/code&gt;, &lt;code&gt;resume&lt;/code&gt; or &lt;code&gt;clear&lt;/code&gt; will perform the relevant action:&lt;/p&gt;
&lt;pre&gt;$("#pause").click(
  function()
  {
    $.newsticker.pause($news);
    return false;
  }
);

$("#resume").click(
  function()
  {
    $.newsticker.resume($news);
    return false;
  }
);

$("#clear").click(
  function()
  {
    $.newsticker.clear($news);
    return false;
   }
);
&lt;/pre&gt;
&lt;p&gt;The code available for download via &lt;a href="http://jqueryjs.googlecode.com/svn/trunk/plugins/newsticker/"&gt;jQuery SVN&lt;/a&gt; doesn't have this functionality, but should work fine in IE7.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2092239472338554803?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2092239472338554803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2092239472338554803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2092239472338554803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2092239472338554803'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/12/jquery-newsticker-demo-page.html' title='jQuery newsticker Demo Page'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7094892725798907563</id><published>2008-12-18T18:18:00.002Z</published><updated>2008-12-18T18:18:01.118Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Validation Plugin Tip: Highlight Field</title><content type='html'>&lt;p&gt;The &lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/"&gt;validation plugin&lt;/a&gt; for jQuery is a very useful plugin for validating forms before they are submitted. This tip shows you how you can highlight the field if there is an error with it.&lt;/p&gt;
&lt;pre&gt;var validator = $("#myform").validate({
 onblur: function(el)
 {
  if(validator.check(el))
   $(el).removeClass(validator.settings.errorClass);
  else
   $(el).addClass(validator.settings.errorClass);
 },
 onkeyup: function(el)
 {
  if(validator.check(el))
   $(el).removeClass(validator.settings.errorClass);
  else
   $(el).addClass(validator.settings.errorClass);
 }
});&lt;/pre&gt;
&lt;p&gt;This adds the errorClass (normally 'error') to the field being validated, which can then be styled via CSS:&lt;/p&gt;
&lt;pre&gt;input.error { border: 1px solid #c00; background: #fee }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7094892725798907563?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7094892725798907563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7094892725798907563' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7094892725798907563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7094892725798907563'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/12/jquery-validation-plugin-tip-highlight.html' title='jQuery Validation Plugin Tip: Highlight Field'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-53572565537671534</id><published>2008-12-15T18:47:00.003Z</published><updated>2008-12-15T18:54:02.145Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='array'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery appendToArray plugin</title><content type='html'>&lt;p&gt;With jQuery, I found no real way of grouping elements together (other than using a class, and using filter), so I thought about adding jQuery objects to an array (or multiple arrays), which can then be iterated over with &lt;code&gt;jQuery.each&lt;/code&gt;. I tried appendTo (on the off chance that it would work with plain arrays), but no such luck. So I created a simple plugin:&lt;/p&gt;
&lt;pre&gt;jQuery.fn.appendToArray = function()
{
 var a = arguments;
 for(var i = 0; i &lt; arguments.length; i++) a[i][a[i].length] = this;
 return this;
}&lt;/pre&gt;
&lt;p&gt;Through using &lt;code&gt;arguments&lt;/code&gt;, it can be appending to multiple arrays at the same time:&lt;/p&gt;
&lt;pre&gt;
var ar1 = [];
var ar2 = [];
var $field1 = $("[name='field1']").appendToArray(ar1, ar2);
var $field2 = $("[name='field2']").appendToArray(ar1);
var $field3 = $("[name='field3']").appendToArray(ar1, ar2);
var $field4 = $("[name='field4']").appendToArray(ar2);
var $field5 = $("[name='field5']").appendToArray(ar2);&lt;/pre&gt;
&lt;p&gt;You can then loop through the arrays, with specific functions applied:&lt;/p&gt;
&lt;pre&gt;$.each(ar1, function()
 {
  console.log(this.attr("name") + " is in ar1");
 }
);

$.each(ar2, function()
 {
  console.log(this.attr("name") + " is in ar2");
 }
);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-53572565537671534?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/53572565537671534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=53572565537671534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/53572565537671534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/53572565537671534'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/12/jquery-appendtoarray-plugin.html' title='jQuery appendToArray plugin'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1629836220154695747</id><published>2008-12-15T17:57:00.003Z</published><updated>2008-12-16T09:42:26.527Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='code generation'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Code generation with jQuery</title><content type='html'>&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;: changed post title (content still same)&lt;/p&gt;
&lt;p&gt;Sometimes, when you are developing in javascript, you need to reference many form inputs on a page, which can be time consuming (typing each one out). With jQuery, you can reduce the time by using jQuery to write the code (which you then copy and paste). For example (simplified, as you probably would not have fields named field1, field2, field3 etc):&lt;/p&gt;
&lt;pre&gt;var $field1 = $("[name='field1']");
var $field2 = $("[name='field2']");
var $field3 = $("[name='field3']");
var $field4 = $("[name='field4']");
var $field5 = $("[name='field5']");
var $field6 = $("[name='field6']");
var $field7 = $("[name='field7']");
var $field8 = $("[name='field8']");
var $field9 = $("[name='field9']");&lt;/pre&gt;
&lt;p&gt;This simple script can be used to create the aforementioned code. Includes an ASP.NET fix (if you don't want names like &lt;code&gt;$ctl00$Content1$Field1&lt;/code&gt;)&lt;/p&gt;
&lt;pre&gt;$(
 function()
 {
  var $inputs = $(&amp;quot;:input&amp;quot;);
  var $textarea = $(&amp;quot;&amp;lt;textarea&amp;gt;&amp;quot;).css({width: &amp;quot;100%&amp;quot;, height: &amp;quot;200px&amp;quot;});
  $inputs.each(
   function()
   {
    // $textarea.append(&amp;quot;var $&amp;quot; + this.name + &amp;quot; = $(\&amp;quot;[name=&amp;#39;&amp;quot; + this.name + &amp;quot;&amp;#39;]\&amp;quot;);\n&amp;quot;);
    // ASPNET fix to get the name as set server side
    $textarea.append(&amp;quot;var $&amp;quot; + ASPNETFix(this.name) + &amp;quot; = $(\&amp;quot;[name$=&amp;#39;&amp;quot; + ASPNETFix(this.name) + &amp;quot;&amp;#39;]\&amp;quot;);\n&amp;quot;);
   }
  );
  $(&amp;quot;body&amp;quot;).append($textarea);
 }
)

function ASPNETFix(name)
{
 return name.split(&amp;quot;$&amp;quot;).pop();
}&lt;/pre&gt;
&lt;p&gt;Simply save this into a separate JavaScript file (tweaking as needed), include on your page, then copy the text generated in the textarea at the bottom of the page.&lt;/p&gt;
&lt;p&gt;This could also save time in other languages, as you control the output (could be C#, VB.NET, PHP, Python etc).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1629836220154695747?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1629836220154695747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1629836220154695747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1629836220154695747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1629836220154695747'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/12/reduce-development-typing-with-jquery.html' title='Code generation with jQuery'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6823346960738628039</id><published>2008-12-15T17:48:00.000Z</published><updated>2008-12-15T17:48:09.086Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='html 5'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>HTML 5 Basic Template</title><content type='html'>&lt;p&gt;Since &lt;a href="http://whatwg.org/html5"&gt;HTML 5&lt;/a&gt; is likely to be in common use at some time in the future (taking advantage of current/future web browsers standards rendering mode) and the W3C validation service now validates HTML 5.&lt;/p&gt;
&lt;pre&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html;charset=utf-8&amp;quot;&amp;gt;
 &amp;lt;title&amp;gt;Site | Page 1&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;div id=&amp;quot;outer&amp;quot;&amp;gt;
  &amp;lt;div id=&amp;quot;top&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div id=&amp;quot;inner&amp;quot;&amp;gt;
   &amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;&amp;lt;h1&amp;gt;Page 1&amp;lt;/h1&amp;gt;&amp;lt;/div&amp;gt;
   &amp;lt;div id=&amp;quot;navigation&amp;quot;&amp;gt;
    &amp;lt;ul&amp;gt;
     &amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Page 1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
     &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Page 2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
     &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Page 3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
   &amp;lt;/div&amp;gt;
   &amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;
    &amp;lt;p&amp;gt;Lorem ipsum dolor sit amet...&amp;lt;/p&amp;gt;
   &amp;lt;/div&amp;gt;
   &amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#top&amp;quot;&amp;gt;Top of page&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div id=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;p&gt;Note: the Content-Type meta element has to be the first element under the head element to validate. In HTML elements can be optionally self closing (so &lt;code&gt;&amp;lt;br /&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; are both valid.&lt;/p&gt;
&lt;p&gt;Notice that there are 'top' and 'bottom' elements in the markup? They are used to allow the margin-top/bottom for the 'inner' &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; to work in Firefox. 'top' also functions as an anchor to get back to the top of the page.&lt;/p&gt;
&lt;p&gt;Example of CSS that can be used with this template:&lt;/p&gt;
&lt;pre&gt;body {
 color: #000;
 background: #fff;
 margin: 0;
 padding: 10px
}

#outer {
 width: 960px;
 margin: 0 auto;
 background: #eee
}

#top {
 padding-bottom: 1px; margin-bottom: -1px /* force #inner margin-top to take effect in Firefox/WebKit */
}

#inner {
 margin: 3px; /* margin: 0 3px 3px 0; for drop shadow effect */
 border: 1px solid #009;
 background: #fff
}

#header { background: #eee }

#header h1 { margin: 0}


#navigation {
 background: #eef;
 width: 100%;
 overflow: hidden;
 border-width: 1px 0 1px 0;
 border-style: solid;
 border-color: #009
}

#navigation ul {
 margin: 0;
 padding: 0;
 list-style-type: none;
 float: right
}

#navigation ul li { float: left }

#navigation ul li a:link,
#navigation ul li a:visited {
 display: block;
 float: left;
 padding: 3px;
 zoom: 1 /* force hasLayout in IE */
}

#navigation ul li a:hover {
 background: #000;
 color: #fff
}

#navigation ul li a:active,
#navigation ul li.current a:link,
#navigation ul li.current a:visited,
#navigation ul li.current a:hover {
 background: #aaa;
 color: #ffe
}


#content { padding: 3px }

#footer {
 padding: 6px;
 border-top: 1px solid #009
}

#bottom {
 padding-top: 1px; margin-top: -1px /* force #inner margin-bottom to take effect in Firefox/WebKit */
}&lt;/pre&gt;
&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3FCqQs08qig/SUZI2xMLbuI/AAAAAAAAAAM/gUSJbJ2k6wM/s1600-h/page_overview.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 160px;" src="http://3.bp.blogspot.com/_3FCqQs08qig/SUZI2xMLbuI/AAAAAAAAAAM/gUSJbJ2k6wM/s320/page_overview.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5279987718893039330" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3FCqQs08qig/SUZJOtEGLWI/AAAAAAAAAAU/k30xbpWfRVM/s1600-h/page_close.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 236px; height: 183px;" src="http://1.bp.blogspot.com/_3FCqQs08qig/SUZJOtEGLWI/AAAAAAAAAAU/k30xbpWfRVM/s320/page_close.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5279988130102259042" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6823346960738628039?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6823346960738628039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6823346960738628039' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6823346960738628039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6823346960738628039'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/12/html-5-basic-template.html' title='HTML 5 Basic Template'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3FCqQs08qig/SUZI2xMLbuI/AAAAAAAAAAM/gUSJbJ2k6wM/s72-c/page_overview.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2965758786507409633</id><published>2008-12-03T17:44:00.002Z</published><updated>2008-12-03T17:44:00.551Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>DataBinding to an Enumeration / enum (C#, ASP.NET)</title><content type='html'>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc138362.aspx"&gt;Enumeration types in C#&lt;/a&gt; can be used for many purposes. One such use is to reduce repetitive typing as they can be bound to server controls (e.g. Repeaters).&lt;/p&gt;
&lt;p&gt;In code behind:&lt;/p&gt;
&lt;pre&gt;public enum WeekDays
{
 Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}&lt;/pre&gt;
&lt;p&gt;In your page:&lt;/p&gt;
&lt;pre&gt;&amp;lt;asp:Repeater runat="server" DataSource='&amp;lt;%# Enum.GetValues(typeof(WeekDays)) %&amp;gt;'&amp;gt;
 &amp;lt;HeaderTemplate&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;thead&amp;gt;
  &amp;lt;tr&amp;gt;
   &amp;lt;th&amp;gt;Day&amp;lt;/th&amp;gt;
   &amp;lt;th&amp;gt;Start Time&amp;lt;/th&amp;gt;
   &amp;lt;th&amp;gt;End Time&amp;lt;/th&amp;gt;
  &amp;lt;/tr&amp;gt;
 &amp;lt;/thead&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;/HeaderTemplate&amp;gt;
 &amp;lt;ItemTemplate&amp;gt;
  &amp;lt;tr&amp;gt;
   &amp;lt;td&amp;gt;&amp;lt;%# Container.DataItem %&amp;gt;&amp;lt;/td&amp;gt;
   &amp;lt;td&amp;gt;&amp;lt;%# GetStartTime(Container.DataItem) %&amp;gt;&amp;lt;/td&amp;gt;
   &amp;lt;td&amp;gt;&amp;lt;%# GetEndTime(Container.DataItem) %&amp;gt;&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
 &amp;lt;/ItemTemplate&amp;gt;
 &amp;lt;FooterTemplate&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;/FooterTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;GetStartTime&lt;/code&gt; and &lt;code&gt;GetEndTime&lt;/code&gt; are just examples (so would just need writing in the code behind).&lt;/p&gt;
&lt;pre&gt;protected string GetStartTime(object day)
{
....
}
protected string GetEndTime(object day)
{
....
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2965758786507409633?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2965758786507409633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2965758786507409633' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2965758786507409633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2965758786507409633'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/12/databinding-to-enumeration-enum-c.html' title='DataBinding to an Enumeration / enum (C#, ASP.NET)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7180170803321731218</id><published>2008-11-28T17:43:00.001Z</published><updated>2008-11-28T17:43:01.453Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Text Clips'/><category scheme='http://www.blogger.com/atom/ns#' term='PN2'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery 1.2.6 Text Clips for Programmer's Notepad 2</title><content type='html'>&lt;p&gt;&lt;a href="http://www.texotela.co.uk/pn2/textclips/"&gt;jQuery 1.2.6 Text Clips&lt;/a&gt; for &lt;a href="http://www.pnotepad.org"&gt;Programmer's Notepad 2&lt;/a&gt; are available along with my other text clips. If they don't show when you start PN2, close it and delete &lt;strong&gt;installClipCache.xml&lt;/strong&gt; that is stored within the &lt;strong&gt;%APPDATA%\Echo Software\PN2\&lt;/strong&gt; directory.&lt;/p&gt;
&lt;p&gt;Programmer's Notepad 2 is an open source application that supports syntax highlighting of many file types, project support (using its own project file type), autocompletion, text clips (snippets), automatic indenting &lt;a href="http://www.pnotepad.org/features/"&gt;among other features&lt;/a&gt;. It loads quickly (startup is faster than IDE's like Visual Studio, Eclipse and Komodo have), so is a good lightweight IDE that is also portable (save it on your portable hard drive / memory stick and run on many different PC's).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7180170803321731218?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7180170803321731218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7180170803321731218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7180170803321731218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7180170803321731218'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/11/jquery-126-text-clips-for-programmers.html' title='jQuery 1.2.6 Text Clips for Programmer&apos;s Notepad 2'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5299283087929616030</id><published>2008-11-14T17:55:00.003Z</published><updated>2008-11-18T12:40:41.478Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><category scheme='http://www.blogger.com/atom/ns#' term='guides'/><category scheme='http://www.blogger.com/atom/ns#' term='guidelines'/><category scheme='http://www.blogger.com/atom/ns#' term='script-fu'/><title type='text'>GIMP Repeating Guidelines</title><content type='html'>&lt;p&gt;&lt;strong&gt;Update (18 Nov):&lt;/strong&gt; bug fix - guides go up to both edges, if width/height is a multiple of the separation distance. &lt;code&gt;max&lt;/code&gt; was set to height (if vertical guide) when it should have been width and vice versa for vertical.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.gimp.org"&gt;The GIMP&lt;/a&gt; photo/image manipulation program allows you to add guides as an aid to image editing. It is fairly simple to add them - &lt;strong&gt;Image &amp;gt; Guides &amp;gt; New Guide&lt;/strong&gt; or click on one of the rulers and drag onto the canvas. However, this can be time consuming if you need to add multiple guides, equally spaced.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.gimp.org/en/gimp-using-script-fu-tutorial.html"&gt;Script-Fu&lt;/a&gt; however, allows you to do this via scripting. First of all, create a scm file (e.g. &lt;strong&gt;guides-repeat.scm&lt;/strong&gt;) in your script folder (on Windows this would be &lt;strong&gt;C:\Program Files\GIMP-2.0\share\gimp\2.0\scripts&lt;/strong&gt; (all users) or &lt;strong&gt;%USERPROFILE%\.gimp-2.6\scripts&lt;/strong&gt;, then paste in the following code (use a plain text editor like Notepad)&lt;/p&gt;
&lt;pre&gt;(define (script-fu-guide-repeat image
                             drawable
                             direction
                             separation)
  (let* (
        (width (car (gimp-image-width image)))
        (height (car (gimp-image-height image)))
  (position 0)
  )
 ; set maximum otherwise the guides will be added indefinitely
 (if (= direction 0)
   (set! max height)
   (set! max width)
 )
 ; while the position is less than the maximum
 (while (&amp;lt;= position max)

  (if (= direction 0)
   ;; check position is inside the image boundaries
   (if (&amp;lt;= position height) (gimp-image-add-hguide image position))
   (if (&amp;lt;= position width) (gimp-image-add-vguide image position))
  )
  
 ; increment position by defined separation 
 (set! position (+ position separation)))
 (gimp-displays-flush)
  )
)

(script-fu-register "script-fu-guide-repeat"
  _"R_epeating Guide"
  _"Add multiple guides separated by specified number of pixels"
  "Sam Collett"
  "Sam Collett"
  "2008-11-18"
  "*"
  SF-IMAGE      "Image"      0
  SF-DRAWABLE   "Drawable"   0
  SF-OPTION     _"Direction" '(_"Horizontal" _"Vertical")
  SF-ADJUSTMENT _"Separation"  (list 40 1 MAX-IMAGE-SIZE 1 10 0 1)
)

(script-fu-menu-register "script-fu-guide-repeat"
                         "&amp;lt;Image&amp;gt;/Image/Guides")
&lt;/pre&gt;
&lt;p&gt;After saving the script, either restart GIMP or &lt;strong&gt;Filters &amp;gt; Script-Fu &amp;gt; Refresh Scripts&lt;/strong&gt; (GIMP 2.6, earlier versions use Xtns instead of Filters). &lt;strong&gt;Repeating Guides&lt;/strong&gt; should now appear under &lt;strong&gt;Image &amp;gt; Guides&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5299283087929616030?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5299283087929616030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5299283087929616030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5299283087929616030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5299283087929616030'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/11/gimp-repeating-guidelines.html' title='GIMP Repeating Guidelines'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1546875158563859545</id><published>2008-11-07T17:35:00.001Z</published><updated>2008-11-07T17:35:00.780Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='code search'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='indexing service'/><title type='text'>Searching Indexing Service (ASP.NET C#)</title><content type='html'>&lt;p&gt;Windows has an Indexing Service that can be used to index files on the server it is hosted on. Here is a simple way to query any catalogues (in this example, one called &lt;code&gt;Data&lt;/code&gt;) you create and display the results in a repeater.&lt;/p&gt;&lt;p&gt;First of all, create a new page (in Visual Studio or Web Developer 2005), e.g. &lt;code&gt;search.aspx&lt;/code&gt;. Create the search box and repeater within a &lt;code&gt;form runat="server"&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&amp;lt;form id="form1" runat="server"&amp;gt;
&amp;lt;div&amp;gt;
 &amp;lt;asp:TextBox runat="server" ID="Search" /&amp;gt;
 &amp;lt;asp:Button runat="server" Text="Search" OnClick="SearchDocuments" /&amp;gt;
 &amp;lt;asp:Repeater ID="ResultsRepeater" runat="server"&amp;gt;
  &amp;lt;HeaderTemplate&amp;gt;
   &amp;lt;table&amp;gt;
    &amp;lt;thead&amp;gt;
     &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;
       Filename
      &amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;
       Size
      &amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;
       Title
      &amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;
       Path
      &amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;
       Last Modified
      &amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;
       Rank
      &amp;lt;/th&amp;gt;
     &amp;lt;/tr&amp;gt;
    &amp;lt;/thead&amp;gt;
    &amp;lt;tbody&amp;gt;
  &amp;lt;/HeaderTemplate&amp;gt;
  &amp;lt;ItemTemplate&amp;gt;
   &amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;%# Eval("Filename") %&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;%# Eval("size") %&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;%# Eval("DocTitle") %&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;%# Eval("path") %&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;%# Eval("write") %&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
     &amp;lt;%# Eval("rank") %&amp;gt;
    &amp;lt;/td&amp;gt;
   &amp;lt;/tr&amp;gt;
  &amp;lt;/ItemTemplate&amp;gt;
  &amp;lt;FooterTemplate&amp;gt;
   &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt;&amp;lt;/FooterTemplate&amp;gt;
 &amp;lt;/asp:Repeater&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/form&amp;gt;&lt;/pre&gt;
&lt;p&gt;Then in your code behind (&lt;code&gt;search.aspx.cs&lt;/code&gt;) add:&lt;/p&gt;
&lt;pre&gt;protected void SearchDocuments(object sender, EventArgs e)
{
 String fileTypes = "\".doc\" OR \".rtf\"";
 String catalog = "Data";
 String q = Search.Text;
 q = q.Replace("'", "''");

 String query = "SELECT DocTitle,Filename,size,path,rank,write,vpath,url from SCOPE() WHERE FREETEXT('"+q+"') AND CONTAINS(Filename, '"+fileTypes+"') ORDER BY rank DESC, write DESC";

 OleDbConnection cn = new OleDbConnection("Provider=MSIDXS.1;Integrated Security .='';Data Source='Data'");

 OleDbDataAdapter cmd = new OleDbDataAdapter(query, cn);

 DataSet data = new DataSet();
 cmd.Fill(data);

 DataView results = new DataView(data.Tables[0]);

 ResultsRepeater.DataSource = results;
 ResultsRepeater.DataBind();

}&lt;/pre&gt;
&lt;p&gt;The results are sorted by rank (highest first), then date last modified (newest first). Only search Word documents (or more precisely, filenames containing .doc or .rtf) - but you can always add more types and refine the search further.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1546875158563859545?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1546875158563859545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1546875158563859545' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1546875158563859545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1546875158563859545'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/11/searching-indexing-service-aspnet-c.html' title='Searching Indexing Service (ASP.NET C#)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8960396385397101095</id><published>2008-10-15T17:10:00.003+01:00</published><updated>2008-10-15T17:20:33.251+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Link: jQuery + ASP.NET</title><content type='html'>&lt;p&gt;&lt;a href="http://encosia.com/category/jquery/"&gt;JQuery | Encosia&lt;/a&gt; has several articles related to the use of jQuery with ASP.NET. Microsoft AJAX can add quite a lot of overhead and so the use of jQuery can help reduce that.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8960396385397101095?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8960396385397101095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8960396385397101095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8960396385397101095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8960396385397101095'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/10/link-jquery-aspnet.html' title='Link: jQuery + ASP.NET'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-424800251537021024</id><published>2008-10-06T21:40:00.004+01:00</published><updated>2008-10-06T21:45:37.868+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='selectbox'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Select box manipulation with jQuery - update to removeOption, new selectedOptions</title><content type='html'>&lt;p&gt;Check the &lt;a href="http://jquery.com/plugins/project/selectboxes"&gt;Select Box Manipulation project page&lt;/a&gt; at the jQuery site for the latest download.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-424800251537021024?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/424800251537021024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=424800251537021024' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/424800251537021024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/424800251537021024'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/10/select-box-manipulation-with-jquery.html' title='Select box manipulation with jQuery - update to removeOption, new selectedOptions'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-433748645291229590</id><published>2008-09-25T18:17:00.000+01:00</published><updated>2008-09-25T18:17:00.167+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doodads'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Easy database querying with dOOdads (C#, .NET)</title><content type='html'>&lt;p&gt;Been some time since I posted about &lt;a href="http://www.mygenerationsoftware.com"&gt;MyGeneration&lt;/a&gt; and dOOdads. Still using it regularly, even though it is a few years old now. A few sites I do still use .NET 1.1, so it is still in use.&lt;/p&gt;
&lt;p&gt;A brief (re)introduction - MyGeneration is a tool that can generate code for you, through the use of templates (you can create your own, and there is a &lt;a href="http://www.mygenerationsoftware.com/templatelibrary/"&gt;template library&lt;/a&gt;). It comes bundled with the dOOdads data abstraction library, which allows you to update and query your database without knowing the intricacies of interacting with it (i.e. .NET classes to use, SQL to write etc). Both MyGeneration and dOOdads support multiple databases (SQL Server, MySQL, Oracle etc) and regeneration of code, changing the connection string is often all that is needed to move to another system.&lt;/p&gt;
&lt;p&gt;It was freeware initially, but is now &lt;a href="http://sourceforge.net/projects/mygeneration/"&gt;hosted on SourceForge&lt;/a&gt; and no longer actively maintained by the main developers.&lt;/p&gt;
&lt;p&gt;A basic example of a query would be:&lt;/p&gt;
&lt;pre&gt;Employees e = new Employees();
e.Where.EmployeeID.Value = 1;
if(e.Query.Load())
{
    SurnameTextBox.Text = e.Surname;
}&lt;/pre&gt;
&lt;p&gt;You can even select multiple employees with different EmployeeID's:&lt;/p&gt;
&lt;pre&gt;Employees e = new Employees();
e.Where.EmployeeID.Value = "1,3,7";
e.Where.EmployeeID.Operator = WhereParameter.Operand.In;
if(e.Query.Load())
{
    ....
}&lt;/pre&gt;
&lt;p&gt;For columns of type 'bit' (e.g. true, false), where you want to treat NULL as false, you use a TearOff:&lt;/p&gt;
&lt;pre&gt;Employees e = new Employees();
e.Query.OpenParenthesis();
e.Where.DrivingLicense.Value = false;
WhereParameter driving = e.Where.TearOff.DrivingLicense;
driving.Operator = WhereParameter.Operand.IsNull;
// add conjunction and close parenthesis
driving.Conjuction = WhereParameter.Conj.Or;
e.Query.CloseParenthesis();
if(e.Query.Load())
{
    ....
}&lt;/pre&gt;
&lt;p&gt;Note: &lt;code&gt;driving.Conjuction&lt;/code&gt; is correct, it is a typo in dOOdads.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-433748645291229590?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/433748645291229590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=433748645291229590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/433748645291229590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/433748645291229590'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/09/easy-database-querying-with-doodads-c.html' title='Easy database querying with dOOdads (C#, .NET)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8973195371361205586</id><published>2008-09-25T17:49:00.001+01:00</published><updated>2008-09-25T17:49:03.438+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryUI'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='draggable'/><title type='text'>jQuery UI draggables - helper CSS class</title><content type='html'>&lt;p&gt;While working with &lt;a href="http://docs.jquery.com/UI/Draggables/draggable"&gt;jQuery UI draggables&lt;/a&gt;, I have noticed that there does not seem to be a class associated with the draggable helper, and so it is styled in the same way as the draggable you selected. As a result you have to resort to the &lt;code&gt;start&lt;/code&gt; function option to add the class dynamically:&lt;/p&gt;
&lt;pre&gt;$(".dragme").draggable({helper: "clone",
 start: function(e, ui)
 {
  $(ui.helper).addClass("ui-draggable-helper");
 }
});&lt;/pre&gt;
&lt;p&gt;Then just create a style for &lt;code&gt;ui-draggable-helper&lt;/code&gt;, e.g.&lt;/p&gt;
&lt;pre&gt;.ui-draggable-helper {
 border: 1px dotted #000;
 padding: 6px;
 background: #fff;
 font-size: 1.2em;
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8973195371361205586?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8973195371361205586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8973195371361205586' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8973195371361205586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8973195371361205586'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/09/jquery-ui-draggables-helper-css-class.html' title='jQuery UI draggables - helper CSS class'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6679463396810907509</id><published>2008-09-12T17:37:00.003+01:00</published><updated>2008-09-12T17:37:01.099+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Place JavaScript code at bottom of page</title><content type='html'>&lt;p&gt;Recently I've been placing scripts at the bottom of the page, instead if the top. However, I don't put all of them there - the key ones required by other scripts (e.g. libraries like jQuery) are still in the header. The pages can appear to load faster, and in some cases may save some (albeit not always that much) code, e.g.&lt;/p&gt;
&lt;pre&gt;....
&amp;lt;script src="js/jquery-1.2.6.min.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
$( function()
{
 $("a.foo").click(doSomething);
};
function doSomething()
{
 return confirm("About to visit " + this.href + ", continue?");
}
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
...
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Can instead be:&lt;/p&gt;
&lt;pre&gt;....
&amp;lt;script src="js/jquery-1.2.6.min.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
...
&amp;lt;script type="text/javascript"&amp;gt;
$("a.foo").click(doSomething);
function doSomething()
{
 return confirm("About to visit " + this.href + ", continue?");
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;p&gt;In some circumstances, the script may query the CSS of an element and so the script may run before the associated stylesheet has downloaded (at least, I have experienced this in Google Chrome).&lt;/p&gt;
&lt;p&gt;This does assume that you have not attached javascript functions inline (e.g. &lt;code&gt;a onclick="doSomething()"&lt;/code&gt; as these would fail if the user interacts with elements before the function is available.&lt;/p&gt;
&lt;p&gt;If you use 'DOM ready' events, then there is less benefit of doing this (as it should run when the page is ready anyway). As with any optimisations, it is always worth experimenting to reduce the time it takes for a page to be used and interacted with by visitors.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6679463396810907509?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6679463396810907509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6679463396810907509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6679463396810907509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6679463396810907509'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/09/place-javascript-code-at-bottom-of-page.html' title='Place JavaScript code at bottom of page'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2144027333707117055</id><published>2008-08-26T17:57:00.002+01:00</published><updated>2008-08-26T17:57:00.119+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Quick Tip: In general $(this).attr("attribute") = this.attribute</title><content type='html'>&lt;p&gt;jQuery is a very useful JavaScript library for manipulating you web pages. However, I have seen it used to get attribute values when it doesn't have to be, normally to get element attributes. For example, opening all links with a class &lt;code&gt;external&lt;/code&gt; and giving them a title (tooltip).&lt;/p&gt;
&lt;pre&gt;$("a.external").click( function()
  {
    window.open($(this).attr("href"));
    return false;
  }
).each( function()
  {
    $(this).attr("title", $(this).attr("title") + " External link: " + $(this).attr("href"));
  }
);
&lt;/pre&gt;
&lt;p&gt;Would be the same as&lt;/p&gt;
&lt;pre&gt;$("a.external").click( function()
  {
    window.open(this.href);
    return false;
  }
).each( function()
  {
    this.title += " External link: " + this.href;
  }
);
&lt;/pre&gt;
&lt;p&gt;There are some attributes that in JavaScript aren't the same as they are in html. The ones you may have issues with are listed below.&lt;/p&gt;
&lt;pre&gt;for          (htmlFor)
class        (className)
readonly     (readOnly)
maxlength    (maxLength)
cellspacing  (cellSpacing)&lt;/pre&gt;
&lt;p&gt;Doing this rather than using &lt;code&gt;attr&lt;/code&gt; cuts down on code size and may improve performance.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2144027333707117055?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2144027333707117055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2144027333707117055' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2144027333707117055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2144027333707117055'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/08/jquery-quick-tip-in-general.html' title='jQuery Quick Tip: In general $(this).attr(&quot;attribute&quot;) = this.attribute'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-3286809066789257291</id><published>2008-08-14T17:50:00.002+01:00</published><updated>2008-08-14T17:50:00.317+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlite'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pdo'/><title type='text'>Querying a SQLite 3 database using PHP</title><content type='html'>&lt;p&gt;Previously, I detailed a way of creating a database in &lt;a href="http://webdevel.blogspot.com/2008/08/basic-hit-counter-using-php-and-sqlite.html"&gt;A basic hit counter using PHP and SQLite 3&lt;/a&gt; using PHP Data Objects and PHP 5. For most web sites, SQLite would be fine, but for very high volume (as in many hundreds of thousands of hits per day), there are better options - &lt;a href="http://www.sqlite.org/whentouse.html"&gt;Appropriate Uses For SQLite&lt;/a&gt; (SQLite.org) has more details on when SQLite is a good option.&lt;/p&gt;
&lt;p&gt;Here is an example of how to query the data and display it on a page (to see which pages are popular for example).&lt;/p&gt;
&lt;pre&gt;&amp;lt;?
$dbfolder = $_SERVER["DOCUMENT_ROOT"]."/data/";
$dbname = $_SERVER["HTTP_HOST"]."_log.sq3";

$logdb = new PDO("sqlite:".$dbfolder.$dbname);

$starttable = "&amp;lt;table&amp;gt;
&amp;lt;tr&amp;gt;
 &amp;lt;th&amp;gt;Page&amp;lt;/th&amp;gt;
 &amp;lt;th&amp;gt;Counter&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;";
$endtable = "&amp;lt;/table&amp;gt;";
$tablecontents = "";
foreach ($logdb-&amp;gt;query("SELECT * FROM hits ORDER BY counter DESC") as $row)
{
 $tablecontents .= "
 &amp;lt;tr&amp;gt;
  &amp;lt;td&amp;gt;{$row['page']}&amp;lt;/td&amp;gt;
  &amp;lt;td&amp;gt;{$row['counter']}&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;";
}
echo $starttable.$tablecontents.$endtable;

// close connection
$logdb = null;
?&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-3286809066789257291?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/3286809066789257291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=3286809066789257291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3286809066789257291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3286809066789257291'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/08/querying-sqlite-3-database-using-php.html' title='Querying a SQLite 3 database using PHP'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1245153421126430963</id><published>2008-08-12T17:55:00.003+01:00</published><updated>2008-08-13T09:38:00.025+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlite'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pdo'/><title type='text'>A basic hit counter using PHP and SQLite 3</title><content type='html'>&lt;p&gt;&lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt; is a lightweight database engine that is bundled with &lt;a href="http://www.php.org"&gt;PHP&lt;/a&gt; 5. Using &lt;a href="http://uk.php.net/manual/en/book.pdo.php"&gt;PHP Data Objects&lt;/a&gt; (PDO) you can create and edit SQLite databases and tables. A SQLite databases is just a single file that is stored in a folder that has modify rights applied to it (otherwise you can't change it).&lt;/p&gt;
&lt;p&gt;This sample shows how to create a database, add a table to it and insert and update a record in it. By using PDO, you can easily change it to use different database engines (like MySQL, IBM DB2 etc [others, like MSSQL and Oracle are in a experimental stage though, check the PDO site (linked above) for more information]).&lt;/p&gt;&lt;p&gt;You can copy this code into a separate file and include it within pages that you want a counter on &lt;code&gt;&amp;lt? include("counter.php"); ?&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&amp;lt;?
// logging page hits
$dbfolder = $_SERVER["DOCUMENT_ROOT"]."/data/";
$dbname = $_SERVER["HTTP_HOST"]."_log.sq3";

// check if database file exists first
if(!file_exists($dbfolder.$dbname))
{
 $logdb = new PDO("sqlite:".$dbfolder.$dbname);
 $logdb-&amp;gt;exec("CREATE TABLE hits(page VARCHAR(255) PRIMARY KEY, counter INTEGER)");
}
else
{
 $logdb = new PDO("sqlite:".$dbfolder.$dbname);
}

$page = $_SERVER["SCRIPT_URL"];

// check if page is already in the hits table
$statement = $logdb-&amp;gt;query("SELECT counter FROM hits WHERE page='$page'");
$record = $statement-&amp;gt;fetchAll();

// if a record is found
if(sizeof($record) != 0)
{
 $counter = $record[0]['counter']++;
 $logdb-&amp;gt;exec("UPDATE hits SET counter=$counter WHERE page='$page'");
 echo "Counter: ".$counter;
}
else
{
 $logdb-&amp;gt;exec("INSERT INTO hits(page, counter) VALUES ('$page', 1)");
 echo "Counter: 1";
}

// close connection
$logdb = null;
?&amp;gt;&lt;/pre&gt;
&lt;p&gt;In writing this code, &lt;a href="http://www.litewebsite.com/"&gt;LiteWebsite&lt;/a&gt; was a valuable resource, containing many SQLite examples.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1245153421126430963?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1245153421126430963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1245153421126430963' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1245153421126430963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1245153421126430963'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/08/basic-hit-counter-using-php-and-sqlite.html' title='A basic hit counter using PHP and SQLite 3'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1912699093869700114</id><published>2008-07-23T17:50:00.002+01:00</published><updated>2008-07-23T17:50:01.176+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='timezone'/><category scheme='http://www.blogger.com/atom/ns#' term='Datejs'/><category scheme='http://www.blogger.com/atom/ns#' term='datepicker'/><category scheme='http://www.blogger.com/atom/ns#' term='date conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>JavaScript dates and timezone offsets</title><content type='html'>&lt;p&gt;Working with dates can be problematic when handling dates returned by a remote server. They were returned in GMT format, but when displayed on a page, the time was either ahead or behind (depending on which timezone you are in). For example, if you have the date returned via JSON:&lt;/p&gt;
&lt;pre&gt;var dates = {"StartDate": new Date(1216944000000),"EndDate": new Date(1217030399000)}&lt;/pre&gt;
&lt;p&gt;So the date now has the timezone offset added:&lt;/p&gt;
&lt;pre&gt;dates.StartDate = Fri Jul 25 2008 01:00:00 GMT+0100 (GMT Standard Time)
dates.EndDate = Sat Jul 26 2008 00:59:59 GMT+0100 (GMT Standard Time)&lt;/pre&gt;
&lt;p&gt;So now, to take into account the timezone offset, &lt;a href="http://www.w3schools.com/jsref/jsref_getTimezoneOffset.asp"&gt;&lt;code&gt;getTimezoneOffset()&lt;/code&gt;&lt;/a&gt; can be used, along with &lt;code&gt;&lt;a href="http://www.w3schools.com/jsref/jsref_setMinutes.asp"&gt;setMinutes()&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href="http://www.w3schools.com/jsref/jsref_getMinutes.asp"&gt;getMinutes()&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;dates.StartDate.setMinutes(dates.StartDate.getTimezoneOffset() + dates.StartDate.getMinutes());
dates.EndDate.setMinutes(dates.EndDate.getTimezoneOffset() + dates.EndDate.getMinutes());&lt;/pre&gt;
&lt;p&gt;For a useful JavaScript library for working with dates (it extends the native Date object), check out &lt;a href="http://www.datejs.com/"&gt;Datejs&lt;/a&gt;. 30kb download, under an MIT open source license.&lt;/p&gt;&lt;p&gt;There is also another library, a smaller download (so slightly less functionality) available with the jQuery &lt;a href="http://plugins.jquery.com/project/datepicker"&gt;datePicker plugin&lt;/a&gt; - &lt;a href="http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/datePicker/v2/demo/date.js"&gt;http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/datePicker/v2/demo/date.js&lt;/a&gt;, under a dual MIT / GPL license. For more localisations (as well as string and array manipulation), visit &lt;a href="http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/methods"&gt;http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/methods&lt;/a&gt;. Note: jQuery is not required for these libraries to work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1912699093869700114?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1912699093869700114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1912699093869700114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1912699093869700114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1912699093869700114'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/07/javascript-dates-and-timezone-offsets.html' title='JavaScript dates and timezone offsets'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1180532975700840346</id><published>2008-07-23T17:35:00.001+01:00</published><updated>2008-07-23T17:35:02.221+01:00</updated><title type='text'>GPL Compatible Licenses</title><content type='html'>&lt;p&gt;There is a useful diagram on the GNU site that lists what licences are compatible with the GNU GPL: &lt;a href="http://www.gnu.org/licenses/quick-guide-gplv3.html#new-compatible-licenses"&gt;A Quick Guide to GPLv3: New Compatible Licenses&lt;/a&gt;, plus a &lt;a href="http://www.gnu.org/licenses/license-list.html"&gt;comprehensive list&lt;/a&gt; with more detailed compatibility information.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1180532975700840346?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1180532975700840346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1180532975700840346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1180532975700840346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1180532975700840346'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/07/gpl-compatible-licenses.html' title='GPL Compatible Licenses'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1269740552453003361</id><published>2008-07-22T17:58:00.002+01:00</published><updated>2008-07-22T18:13:16.249+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html parser'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Link: HTML Agility Pack (.NET)</title><content type='html'>&lt;p&gt;The &lt;a href="http://www.codeplex.com/htmlagilitypack"&gt;HTML Agility Pack&lt;/a&gt; is an HTML parser for .NET, supporting XPATH and XSLT parsing. Basically the HTML equivalent of &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx"&gt;XmlDocument&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Example use (from site):&lt;/p&gt;
&lt;pre&gt;HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]")
{
    HtmlAttribute att = link["href"];
    att.Value = FixLink(att);
}
doc.Save("file.htm");&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1269740552453003361?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1269740552453003361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1269740552453003361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1269740552453003361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1269740552453003361'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/07/link-html-agility-pack-net.html' title='Link: HTML Agility Pack (.NET)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4463190436926960666</id><published>2008-07-15T17:58:00.001+01:00</published><updated>2008-07-15T17:58:00.199+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><title type='text'>Portable GIMP and fonts</title><content type='html'>&lt;p&gt;&lt;a href="http://www.gimp.org"&gt;GIMP&lt;/a&gt; (GNU Image Manipulation Program), the open source alternative to Photoshop can be downloaded as a &lt;a href="http://portableapps.com/apps/graphics_pictures/gimp_portable"&gt;portable version&lt;/a&gt;. However, due to being portable, the choice of fonts you can use is limited by what is on the operating system and part of the basic GIMP package, so if you use the font tool and choose a font that is not on another system, you may have problems. Thankfully, fonts are easy to copy (you can copy them from the Fonts applet in the control panel by just dragging them to another folder).&lt;/p&gt;
&lt;p&gt;To make your fonts available wherever you use GIMP Portable, you just copy them to &lt;code&gt;E:\PortableApps\GIMPPortable\App\gimp\share\gimp\2.0\fonts&lt;/code&gt; (where E: is the drive letter of your portable drive). Then you can go on any Windows PC (even without Office or OpenOffice installed) and still use your own fonts (those which you are licensed for).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4463190436926960666?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4463190436926960666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4463190436926960666' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4463190436926960666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4463190436926960666'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/07/portable-gimp-and-fonts.html' title='Portable GIMP and fonts'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8981145953245669012</id><published>2008-07-07T18:15:00.002+01:00</published><updated>2008-07-15T16:30:21.420+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='jsonml'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>JSON and JsonML</title><content type='html'>&lt;p&gt;&lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; (JavaScript Object Notation) is a data interchange format for transferring data between disparate systems. Unlike XML (which is also designed for this), it is far simpler and can be processed more easily by client applications (no validation, or other advanced features of XML) and easier to implement (no special parser needed like XML) - &lt;a href="http://www.json.org/fatfree.html"&gt;JSON: The Fat-Free Alternative to XML&lt;/a&gt;. There are examples of JSON messages (and the XML equivalent) on the &lt;a href="http://www.json.org/example.html"&gt;JSON Example page&lt;/a&gt;. You can validate JSON online using &lt;a href="http://www.jsonlint.com/"&gt;JSONLint&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While its name suggests that it is only for programmers using JavaScript, it is useful for other programming languages as well. The JSON site lists implementations and even hosts code for several languages, e.g. &lt;a href="http://www.json.org/js.html"&gt;JavaScript&lt;/a&gt;, &lt;a href="http://www.json.org/JSON_checker/"&gt;C&lt;/a&gt; and &lt;a href="http://www.json.org/java/index.html"&gt;Java&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jsonml.org/"&gt;JsonML&lt;/a&gt; is a way of transporting XML data by representing it in the JSON syntax. As a result, it can be be used for transmitting XHTML markup (represented as JSON rather than XHTML) which can then be added directly to the document (via the DOM, instead of innerHTML). For jQuery developers, there is a plugin for working with JsonML: 
&lt;a href="http://groups.google.com/group/jquery-dev/browse_thread/thread/976d14f882c5f483"&gt;JSONML Array to DOM - jQuery.ml&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8981145953245669012?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8981145953245669012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8981145953245669012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8981145953245669012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8981145953245669012'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/07/json-and-jsonml.html' title='JSON and JsonML'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4378690493129819179</id><published>2008-07-03T18:05:00.004+01:00</published><updated>2008-07-23T12:46:25.055+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='browser sniffing'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>An overview of jQuery.browser</title><content type='html'>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; jQuery.version should have been jQuery.browser.version. Added Firefox 3.0.1&lt;/p&gt;
&lt;p&gt;If you are a user of jQuery, you may be aware of the basic browser sniffer that comes with it. However, it may seem to return the wrong version number for certain browsers (Firefox and Safari in particular). This is because it returns the version number of the rendering engine (i.e. the part of the web browser that determines how a page should look and function). To help simplify things, I have created a table of common user agents and what jQuery returns:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Browser&lt;/th&gt;&lt;th&gt;jQuery.browser&lt;/th&gt;&lt;th&gt;jQuery.browser.version&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Internet Explorer 6&lt;/td&gt;&lt;td&gt;jQuery.browser.msie = true&lt;/td&gt;&lt;td&gt;6.0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Internet Explorer 7&lt;/td&gt;&lt;td&gt;jQuery.browser.msie = true&lt;/td&gt;&lt;td&gt;7.0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firefox 1.5 (first release)&lt;/td&gt;&lt;td&gt;jQuery.browser.mozilla = true&lt;/td&gt;&lt;td&gt;1.8 or 1.8.0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firefox 1.5.0.9&lt;/td&gt;&lt;td&gt;jQuery.browser.mozilla = true&lt;/td&gt;&lt;td&gt;1.8.0.9&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firefox 2.0 (first release)&lt;/td&gt;&lt;td&gt;jQuery.browser.mozilla = true&lt;/td&gt;&lt;td&gt;1.8.1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firefox 2.0.0.9&lt;/td&gt;&lt;td&gt;jQuery.browser.mozilla = true&lt;/td&gt;&lt;td&gt;1.8.1.9&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firefox 3.0&lt;/td&gt;&lt;td&gt;jQuery.browser.mozilla = true&lt;/td&gt;&lt;td&gt;1.9&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firefox 3.0.1&lt;/td&gt;&lt;td&gt;jQuery.browser.mozilla = true&lt;/td&gt;&lt;td&gt;1.9.0.1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Safari 2.0.2&lt;/td&gt;&lt;td&gt;jQuery.browser.safari = true&lt;/td&gt;&lt;td&gt;416.11 / 416.12&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Safari 2.0.4&lt;/td&gt;&lt;td&gt;jQuery.browser.safari = true&lt;/td&gt;&lt;td&gt;418.x - 419&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Safari 3.0.x&lt;/td&gt;&lt;td&gt;jQuery.browser.safari = true&lt;/td&gt;&lt;td&gt;522+, 522.x, 523.x&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Safari 3.1.x&lt;/td&gt;&lt;td&gt;jQuery.browser.safari = true&lt;/td&gt;&lt;td&gt;525.x, 526+&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Opera x&lt;/td&gt;&lt;td&gt;jQuery.browser.opera = true&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;I have listed Opera as 'Opera x' as the version number 'x' is always returned by jQuery.browser.version (so no extra work is required, unlike Firefox and Safari).&lt;/p&gt;
&lt;p&gt;This table is based on information from &lt;a href="http://www.useragentstring.com/"&gt;UserAgentString.com&lt;/a&gt;. There is a Firefox 1.5.0.12, but I am unsure of the version number, plus there are Safari versions with a slightly different rendering engine version number (i.e. 2.0.2 is not always 416.11). Basically, with Safari, if the version number returned is less than 418, it is Safari 2 or lower and if it is around 525/526 it is Safari 3.1.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4378690493129819179?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4378690493129819179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4378690493129819179' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4378690493129819179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4378690493129819179'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/07/overview-of-jquerybrowser.html' title='An overview of jQuery.browser'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4296111137567273651</id><published>2008-07-01T13:34:00.002+01:00</published><updated>2008-07-01T13:40:40.048+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='techbooks'/><title type='text'>Link: FreeTechBooks.com</title><content type='html'>&lt;p&gt;&lt;a href="http://www.freetechbooks.com/"&gt;FreeTechBooks.com&lt;/a&gt; is a site that offers many computing and engineering related text books (topics include Computer Science, Mathematics, Programming etc) available to download for free./p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4296111137567273651?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4296111137567273651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4296111137567273651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4296111137567273651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4296111137567273651'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/07/link-freetechbookscom.html' title='Link: FreeTechBooks.com'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6762661426450773766</id><published>2008-06-25T11:58:00.003+01:00</published><updated>2008-06-25T12:07:51.827+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icons'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><title type='text'>Link: IconsPedia</title><content type='html'>&lt;p&gt;&lt;a href="http://www.iconspedia.com/"&gt;IconsPedia&lt;/a&gt; is a site with many icons free for download. Check the license first to see if you can use it for the purpose you want it for (some have conditions - not for commercial use, and/or must attribute (give credit to) the author). You can also upload any icons that you have produced (as long as they are free).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6762661426450773766?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6762661426450773766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6762661426450773766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6762661426450773766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6762661426450773766'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/06/link-iconspedia.html' title='Link: IconsPedia'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5185708205777114077</id><published>2008-06-19T12:27:00.002+01:00</published><updated>2008-06-19T12:36:33.798+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cheat sheet'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Link: A list of .NET Cheat Sheets</title><content type='html'>&lt;p&gt;&lt;a href="http://john-sheehan.com/blog/index.php/net-cheat-sheets/"&gt;.NET Cheat Sheets&lt;/a&gt; includes ".NET Format String Quick Reference", "ASP.NET 2.0 Page Life Cycle &amp;amp; Common Events", "Visual Studio 2005 Built-in Code Snippets (C#)" as well as links to several more.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5185708205777114077?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5185708205777114077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5185708205777114077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5185708205777114077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5185708205777114077'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/06/link-list-of-net-cheat-sheets.html' title='Link: A list of .NET Cheat Sheets'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-3170224773471141560</id><published>2008-06-17T23:26:00.004+01:00</published><updated>2008-06-17T23:33:55.106+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tabs'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Tabs without JavaScript</title><content type='html'>&lt;p&gt;It is possible to implement a tabbing system without needing to use JavaScript. All you need is CSS and standard (X)HTML. The downside is that you won't get styling on the active tab to indicate that it is active.&lt;/p&gt;
&lt;p&gt;CSS:&lt;/p&gt;
&lt;pre&gt;div.tabcontainer {
 width: 500px;
 background: #eee;
 border: 1px solid #000000;
}
ul.tabnav {
 list-style-type: none;
 margin: 0;
 padding: 0;
 width: 100%;
 overflow: hidden;
}

ul.tabnav a {
 display: block;
 width: 100%;
}

ul.tabnav a:hover {
 background: #ccc;
}

ul.tabnav li {
 float: left;
 width: 125px;
 margin: 0;
 padding: 0;
 text-align: center;
}

div.tabcontents {
 height: 290px;
 background: #ccc;
 overflow: hidden;
 border-top: 1px solid #011;
 padding: 3px;
 
}

div.tabcontents div.content {
 float: left;
 width: 100%;
 height: 102%;
 overflow-y: auto;
}

div.tabcontents div.content h2 {
 margin-top: 3px;
}&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre&gt;&amp;lt;div class="tabcontainer"&amp;gt;
 &amp;lt;ul class="tabnav"&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#tab1"&amp;gt;Tab 1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#tab2"&amp;gt;Tab 2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#tab3"&amp;gt;Tab 3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#tab4"&amp;gt;Tab 4&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
 &amp;lt;div class="tabcontents"&amp;gt;
  &amp;lt;div class="content" id="tab1"&amp;gt;
   &amp;lt;h2&amp;gt;Tab 1&amp;lt;/h2&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class="content" id="tab2"&amp;gt;
   &amp;lt;h2&amp;gt;Tab 2&amp;lt;/h2&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class="content" id="tab3"&amp;gt;
   &amp;lt;h2&amp;gt;Tab 3&amp;lt;/h2&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class="content" id="tab4"&amp;gt;
   &amp;lt;h2&amp;gt;Tab 4&amp;lt;/h2&amp;gt;
  &amp;lt;/div&amp;gt; 
 &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://demos.texotela.co.uk/nojstabs.html"&gt;Demo page&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-3170224773471141560?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/3170224773471141560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=3170224773471141560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3170224773471141560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3170224773471141560'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/06/tabs-without-javascript.html' title='Tabs without JavaScript'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8134864336593730174</id><published>2008-06-13T19:07:00.006+01:00</published><updated>2008-06-13T19:39:23.610+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='list files'/><category scheme='http://www.blogger.com/atom/ns#' term='directory'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Recursive Directory Listing (PHP)</title><content type='html'>&lt;p&gt;In PHP, it is possible to get a list of files and folders and save them into an array: &lt;a href="http://www.laughing-buddha.net/jon/php/dirlist/"&gt;PHP: List files in a directory&lt;/a&gt;. Building on this, I have added recursion to the &lt;code&gt;dirList&lt;/code&gt; function detailed in the aforementioned link:&lt;/p&gt;
&lt;pre&gt;/**
* Return a list of all files within a directory
*
* @param string $directory The directory to search
* @param bool $recursive Go through child directories as well
* @return array
*/
function dirList($directory, $recursive = true) 
{
 // create an array to hold directory list
 $results = array();

 // create a handler for the directory
 $handler = opendir($directory);

 // keep going until all files in directory have been read
 while (false !== ($file = readdir($handler)))
 {
  // if $file isn't this directory or its parent, 
  // add it to the results array
  if ($file != '.' &amp;&amp; $file != '..')
  {
   // if the file is a directory
   // add contents of that directory
   if(is_dir($directory.DIRECTORY_SEPARATOR.$file) &amp;&amp; $recursive === true)
   {
    $results[] = array($file =&amp;gt; dirList($directory.DIRECTORY_SEPARATOR.$file));
   }
   else
   {
    $results[] = $file;
   }
  }
 }

 // tidy up: close the handler
 closedir($handler);

 // done!
 return $results;

}&lt;/pre&gt;
&lt;p&gt;Now you can build a list of files/folders generated with &lt;code&gt;dirList&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;/**
 * Return an unordered html list of all files within a directory
 *
 * @param string $directory The directory to search
 * @param array $fileTypes Which fileTypes to show. To list all files use htmlDirList("mydir", array("*"))
 * @param bool $recursive Search through child directories as well
 * @param string $listClassName The class name to apply to the &amp;lt;ul&amp;gt;
 * @param function $displayName A function to call on the file to determine how it is displayed (e.g. change _ to space)
 * @return array
 */
function htmlDirList($directory, $fileTypes = null, $recursive = true, $listClassName = null, $displayName = null)
{
 // defaults (if null)
 // restrict by fileTypes
 $fileTypes = (is_null($fileTypes) ? array("doc","rtf","pdf") : $fileTypes);
 // the class name to apply to the &amp;lt;ul&amp;gt;
 $listClassName = (is_null($listClassName) ? "documents" : $listClassName);
 // set a default function for displayName
 $displayName = (is_null($displayName) ? create_function('$fileName,$extension', 'return str_replace("_", " ", $fileName);') : $displayName);
 
 // get list of files / folders
 $list = dirList($directory, $recursive);
 
 // use an array for building up the string
 $results = array();
 // create the list
 $results[] = "&amp;lt;ul class=\"$listClassName\"&amp;gt;\n";
 foreach ( $list as $value )
 {
  // is a folder
  if(is_array($value))
  {
   $results[] = "&amp;lt;li class=\"directory\"&amp;gt;".$displayName(key($value),"")."\n".htmlDirList($directory.DIRECTORY_SEPARATOR.key($value), $fileTypes, $recursive, $listClassName, $displayName)."&amp;lt;/li&amp;gt;\n";
  }
  else
  {
   // the extension is after the last "."
   $extension = strtolower(array_pop(explode(".", $value)));
   // the file name is before the last "."
   $fileName = array_shift(explode(".", $value));
   // continue to next item if not one of the desired file types
   if(!in_array("*", $fileTypes) &amp;&amp; !in_array($extension, $fileTypes)) continue;
   // add the list item
   $results[] = "&amp;lt;li class=\"file $extension\"&amp;gt;&amp;lt;a href=\"".str_replace("\\", "/", $directory)."/$value\"&amp;gt;".$displayName($fileName, $extension)."&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;\n";
  }
 }
 $results[] = "\n&amp;lt;/ul&amp;gt;";
 
 // return the results as a string
 return implode("", $results);
}&lt;/pre&gt;
&lt;p&gt;So now you can get create documents within a folder and have a page listing all those documents, all linked to. In your PHP page:&lt;/p&gt;
&lt;pre&gt;&amp;lt;?php echo htmlDirList("documents") ?&amp;gt;&lt;/pre&gt;
&lt;p&gt;The generated code is not formatted, but doing so would add further complexity and be of no benefit (apart from readability).&lt;/p&gt;
&lt;pre&gt;&amp;lt;ul class="documents"&amp;gt;
&amp;lt;li class="file doc"&amp;gt;&amp;lt;a href="files/File1.doc"&amp;gt;File1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class="file pdf"&amp;gt;&amp;lt;a href="files/File_2.pdf"&amp;gt;File 2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class="file rtf"&amp;gt;&amp;lt;a href="files/File_3.rtf"&amp;gt;File 3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class="directory"&amp;gt;more
&amp;lt;ul class="documents"&amp;gt;
&amp;lt;li class="file doc"&amp;gt;&amp;lt;a href="files/File4.doc"&amp;gt;File4&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class="file pdf"&amp;gt;&amp;lt;a href="files/File_5.pdf"&amp;gt;File 5&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class="file rtf"&amp;gt;&amp;lt;a href="files/File_6.rtf"&amp;gt;File 6&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/pre&gt;
&lt;p&gt;There are also more options available, e.g. you may want an image listing:&lt;/p&gt;
&lt;pre&gt;&amp;lt;?php echo htmlDirList("images", array("jpg","gif","png"), true, "images") ?&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8134864336593730174?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8134864336593730174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8134864336593730174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8134864336593730174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8134864336593730174'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/06/recursive-directory-listing-php.html' title='Recursive Directory Listing (PHP)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2009469435182009131</id><published>2008-06-13T18:02:00.001+01:00</published><updated>2008-06-13T18:09:45.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='compress'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='compression'/><title type='text'>Simple JavaScript/CSS gzipping</title><content type='html'>&lt;p&gt;I'm sure some may already do this, but compressing textual content can save bandwidth but also make it easier to maintain (by just including a php file instead of a CSS or JavaScript one). For example, create a file &lt;code&gt;jquery.php&lt;/code&gt; in the same directory as JavaScript files:&lt;/p&gt;
&lt;pre&gt;&amp;lt;?php
ob_start("ob_gzhandler");
header("Content-Type: text/javascript");
include("jquery-1.2.6.min.js")
?&amp;gt;&lt;/pre&gt;
&lt;p&gt;Then include it instead of the normal JavaScript file:&lt;/p&gt;
&lt;pre&gt;&amp;lt;script type="text/javascript" src="/js/jquery.php"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;It's simple to maintain and could be improved (for example, some kind of caching). CSS files can also be used:&lt;/p&gt;
&lt;pre&gt;&amp;lt;?php
ob_start("ob_gzhandler");
header("Content-Type: text/css");
include("styles.css")
?&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2009469435182009131?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2009469435182009131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2009469435182009131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2009469435182009131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2009469435182009131'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/06/simple-javascriptcss-gzipping.html' title='Simple JavaScript/CSS gzipping'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8128944011668366403</id><published>2008-06-06T17:55:00.003+01:00</published><updated>2008-06-06T19:02:47.121+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thumbs.db'/><category scheme='http://www.blogger.com/atom/ns#' term='thumbnails'/><title type='text'>Delete all cached thumbnails (thumbs.db on Windows system)</title><content type='html'>&lt;p&gt;Not web related, but possibly of interest.&lt;/p&gt;
&lt;p&gt;thumbs.db is a file that caches the thumbnails of images stored within a folder. There are tools for deleting these files, but they are often through the use of an application to be downloaded or installed. There is an easy way to do this without resorting to that, just by using the command prompt.&lt;/p&gt;
&lt;pre&gt;del *thumbs.db /s /ah&lt;/pre&gt;
&lt;p&gt;This will delete all files (and folders) ending in thumbs.db (e.g. myappthumbs.db), so don't run this if you are unsure (or run it in a folder other than C:\). The /ah parameter searches hidden files and folders as well (so you may get access denied on C:\RECYCLER)&lt;/p&gt;
&lt;p&gt;Disclaimer: Be very careful with this as a typo could prove disastrous. Do not run this if you are not completely sure and don't have a backup if a mistake is made.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8128944011668366403?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8128944011668366403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8128944011668366403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8128944011668366403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8128944011668366403'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/06/delete-all-cached-thumbnails-thumbsdb.html' title='Delete all cached thumbnails (thumbs.db on Windows system)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5912140276200140784</id><published>2008-05-28T09:23:00.004+01:00</published><updated>2008-05-28T09:58:06.207+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mootools'/><category scheme='http://www.blogger.com/atom/ns#' term='script.aculo.us'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Google now hosting JavaScript libraries (jQuery, Prototype et al)</title><content type='html'>&lt;p&gt;Google now offers a service for hosting popular JavaScript libraries, so for any website this is used on the performance will be better (the user may have already downloaded the file on another site and it is cached) and it will reduce the bandwidth your server uses. So far it hosts jQuery, prototype, script.aculo.us, Mootools and Dojo. You can either load it via the &lt;a href="http://code.google.com/apis/ajax/"&gt;Google AJAX API&lt;/a&gt; or the &lt;code&gt;&amp;lt;script/&amp;gt;&lt;/code&gt; tag. The advantage of using the Google API is that it can be used for Google's services as well (like Maps, RSS/Atom Feeds and Search (Analytics is missing from the list though)).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ajaxian.com/archives/announcing-ajax-libraries-api-speed-up-your-ajax-apps-with-googles-infrastructure"&gt;Ajaxian &amp;raquo; Announcing AJAX Libraries API: Speed up your Ajax apps with Google&amp;#8217;s infrastructure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;Google AJAX Libraries API&lt;/a&gt;, &lt;a href="http://code.google.com/apis/ajaxlibs/documentation/"&gt;Developers Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5912140276200140784?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5912140276200140784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5912140276200140784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5912140276200140784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5912140276200140784'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/05/google-now-hosting-javascript-libraries.html' title='Google now hosting JavaScript libraries (jQuery, Prototype et al)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-717414289498429549</id><published>2008-04-17T17:20:00.003+01:00</published><updated>2008-04-21T18:26:04.702+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='rollover image'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Quick Tip: Rollover images with jQuery</title><content type='html'>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;a href="http://www.texotela.co.uk/code/jquery/rollover/"&gt;Demo page created&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are several sites that show you how to create rollover images with jQuery (just search Google, Ask, A9, Yahoo etc) for "rollover image jquery"), but they do sometimes have more code than needed (like using &lt;code&gt;$(this).attr("src")&lt;/code&gt; instead of &lt;code&gt;this.src&lt;/code&gt; for determining the image source. Here is another method that does not use jQuery unnecessarily (which may be faster if there are lots of images).&lt;/p&gt;
&lt;p&gt;Create two images, for the 'off' state (when mouse is not over it) and the 'on' state (on mouse over). Name them &lt;code&gt;button_off.gif&lt;/code&gt; and &lt;code&gt;button_on.jpg&lt;/code&gt; (the &lt;code&gt;button&lt;/code&gt; bit can be anything, as can the extension (&lt;code&gt;.gif&lt;/code&gt;) - the important bit is the &lt;code&gt;_off&lt;/code&gt; and &lt;code&gt;_on&lt;/code&gt; suffix.&lt;/p&gt;
&lt;p&gt;HTML code:&lt;/p&gt;
&lt;pre&gt;&amp;lt;a id="mylink" href="/go/somewhere/"&amp;gt;&amp;lt;img src="/images/button_off.gif" alt="" title="" border="0" width="100" height="30" /&amp;gt;&amp;lt;/a&amp;gt;&lt;/pre&gt;
&lt;p&gt;Then in your &lt;code&gt;$(document).ready&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;$("#mylink img").hover(
 function()
 {
  this.src = this.src.replace("_off","_on");
 },
 function()
 {
  this.src = this.src.replace("_on","_off");
 }
);&lt;/pre&gt;
&lt;p&gt;Due to its generic nature, it can be applied to multiple images, e.g. those with a class &lt;code&gt;.rollover&lt;/code&gt; set &lt;code&gt;$("img.rollover").hover...&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-717414289498429549?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/717414289498429549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=717414289498429549' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/717414289498429549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/717414289498429549'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/04/rollover-images-with-jquery.html' title='jQuery Quick Tip: Rollover images with jQuery'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6144340270204537411</id><published>2008-04-14T12:09:00.003+01:00</published><updated>2008-04-14T12:56:18.561+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='pastebin'/><category scheme='http://www.blogger.com/atom/ns#' term='code sharing'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='paste bin'/><title type='text'>pastebin sites</title><content type='html'>&lt;p&gt;A pastebin is a site that allows you to share text with other, most commonly source code, but could be anything else as well (like prose or poetry - e.g. you are writing a novel or poem and want to share what you write). They are useful if you do not have a web site to post what you have written and want to share it to get any feedback (like spotting any bugs or spelling mistakes).&lt;/p&gt;
&lt;p&gt;They allow you to post without registering or paying and the pastes normally expire after a set period (e.g after a month) so as to reclaim any lost disk space for the host. Source Code highlighting is often a feature of many as well. Some of them offer more than this, like comparison (e.g. &lt;a href="http://en.wikipedia.org/wiki/Diff"&gt;diff&lt;/a&gt;'s), password protection / encryption and notifications (to alert you of new pastes, or replies to pastes - normally through a chat system like IRC). The open nature of them could render them susceptible to spam though.&lt;/p&gt;
&lt;p&gt;The following is a list of pastebin's I am aware of. All offer syntax highlighting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pastebin.com/"&gt;pastebin.com&lt;/a&gt; - possibly the first site to do this, you can view recent pastes and search them&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pastebin.ca/"&gt;pastebin.ca&lt;/a&gt; - more features than pastebin.com: encryption, tags and description&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nopaste.info/"&gt;nopaste.info&lt;/a&gt; - description, name, tab width&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paste.pocoo.org/"&gt;LodgeIt!&lt;/a&gt; - very simple interface, powered by jQuery, reply to pastes, view diff's, remote queries (&lt;a href="http://en.wikipedia.org/wiki/XML-RPC"&gt;XML-RPC&lt;/a&gt;). You can't see recent pastes or perform a search though (although this probably mitigates spam somewhat)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pastie.caboo.se/"&gt;pastie&lt;/a&gt; - separate code into sections, mark as private, select a theme when viewing pastes&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dpaste.com/"&gt;dpaste&lt;/a&gt; - associate a title and your name / email&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6144340270204537411?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6144340270204537411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6144340270204537411' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6144340270204537411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6144340270204537411'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/04/pastebin-sites.html' title='pastebin sites'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5909498057111121728</id><published>2008-02-27T14:45:00.002Z</published><updated>2008-02-27T14:54:03.631Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Quick Tip: Select text on focus</title><content type='html'>&lt;p&gt;Just a quick tip on how to select all text when focus is given to a textarea or input (only if the value has not changed) .&lt;/p&gt;
&lt;pre&gt;$("input, textarea").focus(
 function()
 {
  // only select if the text has not changed
  if(this.value == this.defaultValue)
  {
   this.select();
  }
 }
)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5909498057111121728?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5909498057111121728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5909498057111121728' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5909498057111121728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5909498057111121728'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/02/jquery-quick-tip-select-text-on-focus.html' title='jQuery Quick Tip: Select text on focus'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1263533587293382057</id><published>2008-01-31T13:00:00.001Z</published><updated>2008-02-01T13:04:20.233Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><title type='text'>ASP.NET: Binding alphabet to dropdown list</title><content type='html'>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Added VB code.&lt;/p&gt;
&lt;p&gt;There may be some cases where you want a DropDownList to list all the letters in the alphabet (i.e. A - Z). Rather than add the letter individually (through using &lt;code&gt;&amp;lt;asp:ListItem&amp;gt;&lt;/code&gt;) you can create an ArrayList and bind to that.&lt;/p&gt;
&lt;p&gt;In your ASPX page:&lt;/p&gt;
&lt;pre&gt;&amp;lt;asp:DropDownList ID="Letters" DataSource='&amp;lt;%# Alphabet %&amp;gt;' runat="server" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;In your code behind. Create your &lt;code&gt;Alphabet&lt;/code&gt; property:&lt;/p&gt;
&lt;pre&gt;private ArrayList _Alphabet;
protected ArrayList Alphabet
{
 get
 {
  if (_Alphabet == null)
  {
   _Alphabet = new ArrayList();
   for (int i = 65; i &amp;lt; 91; i++)
   {
    _Alphabet.Add(Convert.ToChar(i));
   }
  }
  return _Alphabet;
 }
}&lt;/pre&gt;
&lt;pre&gt;Protected ReadOnly Property Alphabet() As ArrayList
 Get
  If _Alphabet Is Nothing Then
   _Alphabet = New ArrayList()
   For i As Integer = 65 To 91 - 1
    _Alphabet.Add(Convert.ToChar(i))
   Next
  End If
  Return _Alphabet
 End Get
End Property&lt;/pre&gt;
&lt;p&gt;Bind on Page_Load:&lt;/p&gt;
&lt;pre&gt;private void Page_Load(object sender, EventArgs e)
{
 if(!Page.IsPostBack)
 {
  DataBind();
 }
}&lt;/pre&gt;
&lt;pre&gt;Public Sub Page_Load() Handles MyBase.Load
 If Not Page.IsPostBack Then
  DataBind()
 End If
End Sub&lt;/pre&gt;
&lt;p&gt;This will show A - Z (capitals) in the dropdown. For a - z (lower case), change &lt;code&gt;65&lt;/code&gt; to &lt;code&gt;97&lt;/code&gt; and &lt;code&gt;91&lt;/code&gt; to &lt;code&gt;123&lt;/code&gt; in &lt;code&gt;Alphabet&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1263533587293382057?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1263533587293382057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1263533587293382057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1263533587293382057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1263533587293382057'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/01/aspnet-binding-alphabet-to-dropdown.html' title='ASP.NET: Binding alphabet to dropdown list'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4814942939704626182</id><published>2008-01-08T17:55:00.000Z</published><updated>2008-01-08T18:06:29.722Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='corner'/><title type='text'>Adding rounded corners to your web pages</title><content type='html'>&lt;p&gt;There are several ways of adding rounded corners to your web page. There is a large list of methods found at &lt;a href="http://css-discuss.incutio.com/?page=RoundedCorners"&gt;Rounded Corners - css-discuss&lt;/a&gt;, but also a few other ways using JavaScript (some using jQuery):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first (as far as I am aware) jQuery &lt;a href="http://methvin.com/jquery/jq-corner.html"&gt;corner plugin&lt;/a&gt; (Dave Methvin)&lt;/li&gt;
&lt;li&gt;An &lt;a href="http://www.malsup.com/jquery/corner/"&gt;improved version&lt;/a&gt; (Mike Alsup) of the above plugin&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.curvycorners.net/"&gt;curvyCorners&lt;/a&gt; - anti-aliased corners, supporting borders and background images&lt;/li&gt;
&lt;li&gt;A &lt;a href="http://www.aspcode.net/JQuery-Curvy-Corners.aspx"&gt;modified version&lt;/a&gt; of curvyCorners made to work with jQuery.&lt;/li&gt;
&lt;li&gt;The above plugin was rather big and couldn't be &lt;a href="http://dean.edwards.name/packer/"&gt;packed&lt;/a&gt;, so someone else made a &lt;a href="http://blue-anvil.com/archives/anti-aliased-rounded-corners-with-jquery"&gt;futher modification&lt;/a&gt; that reduced its size and enabled it to be packed.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://parkerfox.parkerfox.railsplayground.net/cornerz/"&gt;Cornerz&lt;/a&gt; - smooth, anti-aliased corners. Another jQuery plugin. Anti-aliased, but does not support backgrounds.&lt;/li&gt;
&lt;li&gt;Rounded corners &lt;a href="http://meerbox.nl/?page_id=4"&gt;using &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;&lt;/a&gt;. &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; is a way of drawing/manipulating images via scripting (e.g. draw vector images, transformation, compositing, animations etc). There is a &lt;a href="http://developer.mozilla.org/en/docs/Canvas_tutorial"&gt;tutorial available&lt;/a&gt; on how to use it. Firefox 1.5+, Opera 9+, Safari only - &lt;a href="http://excanvas.sourceforge.net/"&gt;excanvas&lt;/a&gt; adds support to Internet Explorer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Implementations are not always heavily tested within different layouts and CSS, so while a preferred one may not work as expected, there should still be a way to add the effect (even if it involves more code).&lt;/p&gt;
&lt;p&gt;A very light-weight way to do this would be via CSS 3 (as it supports multiple background images), but sadly only Safari supports this: &lt;a href="http://24ways.org/examples/rounded-corners-the-css3-way/rounded.html"&gt;demo&lt;/a&gt;. Could be some way off as the CSS 3 specification isn't finalized (but neither is CSS 2.1), although it is a useful feature that will likely not change (or be removed) and be adopted by newer versions of currently developed browsers (Firefox 3 and IE8 should hopefully have this).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4814942939704626182?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4814942939704626182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4814942939704626182' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4814942939704626182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4814942939704626182'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2008/01/adding-rounded-corners-to-your-web.html' title='Adding rounded corners to your web pages'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7212818742288183168</id><published>2007-12-04T14:51:00.000Z</published><updated>2007-12-04T15:23:38.543Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe reader'/><category scheme='http://www.blogger.com/atom/ns#' term='acrobat'/><category scheme='http://www.blogger.com/atom/ns#' term='speedup'/><title type='text'>Free Alternatives to Adobe Reader</title><content type='html'>&lt;p&gt;As the years have gone by, &lt;a href="http://www.adobe.com/products/acrobat/readstep2.html"&gt;Adobe Reader&lt;/a&gt; (formally Adobe Acrobat Reader) has got bigger (version 5.05 is 8.6MB and will probably still handle many PDF's OK, the latest, 8.1.1 is 22.3MB) and invariably slower with each release. Thankfully there are free alternatives, that are both a smaller download and much faster at opening PDF's.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.kowalczyk.info/software/sumatrapdf/"&gt;SumatraPDF&lt;/a&gt; (&amp;lt; 1MB, still in beta, open source)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.foxitsoftware.com/"&gt;Foxit Reader&lt;/a&gt; (around 2MB download)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.docu-track.com/"&gt;PDF XChange Viewer&lt;/a&gt; (13MB, but still smaller than Adobe Reader and supports comments/annotations, filling in forms and exporting text and images)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alternatively, you could still have Adobe Reader, and use a tool that disables the plugins that slow the startup - e.g. &lt;a href="http://software.bootblock.co.uk/?id=adobereaderspeedup"&gt;Adobe Reader SpeedUp&lt;/a&gt; or &lt;a href="http://www.acropdf.com/"&gt;PDF SpeedUp&lt;/a&gt; (although I haven't tested either of these).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7212818742288183168?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7212818742288183168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7212818742288183168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7212818742288183168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7212818742288183168'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/12/free-alternatives-to-adobe-reader.html' title='Free Alternatives to Adobe Reader'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1280703261363956696</id><published>2007-12-03T12:20:00.000Z</published><updated>2007-12-03T12:37:23.190Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='JSLint'/><category scheme='http://www.blogger.com/atom/ns#' term='YSlow'/><category scheme='http://www.blogger.com/atom/ns#' term='firebug'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Analyse performance of web pages with YSlow</title><content type='html'>&lt;p&gt;YSlow is a plugin for Firefox developed by Yahoo that analyses your web pages and reports back on any performance issues (plus gives a grade). There is a performance report (which shows you areas which can be improved), stats (overview of what is loaded, cached/uncached, cookies and number of HTTP requests), components (page, CSS/JS,JPG etc - expiry, if &lt;a href="http://en.wikipedia.org/wiki/Gzip"&gt;gzip&lt;/a&gt; used, response time, &lt;a href="http://en.wikipedia.org/wiki/HTTP_ETag"&gt;ETag&lt;/a&gt; and file sizes) and various tools (view all CSS/JavaScript and a &lt;a href="http://www.jslint.com/lint.html"&gt;JSLint&lt;/a&gt; report).&lt;/p&gt;
&lt;p&gt;This plugin depends on &lt;a href="http://www.getfirebug.com"&gt;Firebug&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1280703261363956696?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1280703261363956696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1280703261363956696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1280703261363956696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1280703261363956696'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/12/analyse-performance-of-web-pages-with.html' title='Analyse performance of web pages with YSlow'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2398483470678563179</id><published>2007-11-27T17:45:00.000Z</published><updated>2007-11-27T17:52:07.725Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fieldset'/><category scheme='http://www.blogger.com/atom/ns#' term='form layout'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Form Layout Using CSS</title><content type='html'>&lt;p&gt;I have created a &lt;a href="http://www.texotela.co.uk/code/css/fieldsetform/"&gt;sample for laying out fields&lt;/a&gt; within a fieldset (so that the labels are all lined up) - I use a fieldset as they are handy for grouping related fields together. Nothing too fancy, but it can be used as a basic for something better. Works with Internet Explorer 6 and 7, Firefox 2 and Opera 9.02.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2398483470678563179?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2398483470678563179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2398483470678563179' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2398483470678563179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2398483470678563179'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/11/form-layout-using-css.html' title='Form Layout Using CSS'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-3847558001979921446</id><published>2007-11-27T17:29:00.000Z</published><updated>2007-11-27T17:45:08.841Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='temporary files'/><category scheme='http://www.blogger.com/atom/ns#' term='rmdir'/><category scheme='http://www.blogger.com/atom/ns#' term='rd'/><category scheme='http://www.blogger.com/atom/ns#' term='cleanup'/><title type='text'>Clearing tempororary files</title><content type='html'>&lt;p&gt;Being a laptop user, disk space can be an issue and temporary files can be one of the things to clear out to free up some space. There are &lt;a href="http://www.snapfiles.com/Freeware/system/fwdiskclean.html"&gt;freeware applications&lt;/a&gt; that enable you do do this, but you can just use what is built into Windows to do the same thing. It is run from the command line and is the command &lt;code&gt;rd&lt;/code&gt; or &lt;code&gt;rmdir&lt;/code&gt;, which basically means 'remove directory'. It can be used to remove directories as well as its sub directories and files, by just typing &lt;code&gt;rd C:\MyFolder\ /s /q&lt;/code&gt; (the /s switch is to include sub directories and /q prevents the prompt to remove a directory tree).&lt;/p&gt;&lt;p&gt;At first, I thought that running it on the temporary folders directory would remove it and somehow break windows, but it doesn't. This is because there are files within that directory that are in use, and as a result, it can't be deleted. However, all the files and sub directories that aren't locked are removed, freeing up space. I use a simple batch file that cleans up the temporary folders, which can be set to run as a scheduled task (assuming you have the computer on at the time).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cleanup.cmd&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;@echo off
rem clean up windows temp directory
rd C:\Windows\Temp\ /s /q
rem clean up users temp directory
rd %temp% /s /q&lt;/pre&gt;
&lt;p&gt;The advantage of doing it in a batch file is that you can easily add any directories that also have temporary files, for instance, to clean up you Internet Explorer temporary files add in &lt;code&gt;rd "%homepath%\Local Settings\Temporary Internet Files\" /s /q&lt;/code&gt; (assuming you haven't moved the location of the temporary internet files folder).&lt;/p&gt;
&lt;p&gt;You can also use the Disk Cleanup tool that is built into Windows: Right Click desired drive in 'My Computer', select 'Properties', then click the 'Disk Cleanup' button. This also compresses files that you don't access often, but takes some time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-3847558001979921446?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/3847558001979921446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=3847558001979921446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3847558001979921446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3847558001979921446'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/11/clearing-tempororary-files.html' title='Clearing tempororary files'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2885580159917884228</id><published>2007-09-28T13:25:00.000+01:00</published><updated>2007-09-28T13:41:22.124+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sort files'/><category scheme='http://www.blogger.com/atom/ns#' term='FileComparer'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Sorting Files by Name, Date, FileSize etc (C#)</title><content type='html'>&lt;p&gt;It is simple to get a list of files in .NET, you simply do:&lt;/p&gt;
&lt;pre&gt;string folder = "c:\\windows\\";
string[] files = Directory.GetFiles(folder);&lt;/pre&gt;
&lt;p&gt;This will get all the files in &lt;strong&gt;C:\Windows&lt;/strong&gt; (does not include subdirectories). However, they are sorted by name (A-Z) and there aren't any options in the GetFiles method to return them in any other order. Luckily, the results are returned as an array and they can be sorted with a custom comparer. I have created a FileComparer class that can be used to sort the files (works in both .NET 1.1 and 2.0):&lt;/p&gt;
&lt;pre&gt;public class FileComparer : IComparer
{
 public enum CompareBy
 {
  Name /* a-z */,
  LastWriteTime /* oldest to newest */,
  CreationTime  /* oldest to newest */,
  LastAccessTime /* oldest to newest */,
  FileSize /* smallest first */
 }
 // default comparison
 int _CompareBy = (int)CompareBy.Name;
 
 public FileComparer()
 {
 }
 
 public FileComparer(CompareBy compareBy)
 {
  _CompareBy = (int)compareBy;
 }
 
 int IComparer.Compare( object x, object y )
 {
  int output = 0;
  FileInfo file1 = new FileInfo(x.ToString());
  FileInfo file2 = new FileInfo(y.ToString());
  switch(_CompareBy)
  {
   case (int)CompareBy.LastWriteTime:
    output = DateTime.Compare(file1.LastWriteTime, file2.LastWriteTime);
    break;
   case (int)CompareBy.CreationTime:
    output = DateTime.Compare(file1.CreationTime, file2.CreationTime);
    break;
   case (int)CompareBy.LastAccessTime:
    output = DateTime.Compare(file1.LastAccessTime, file2.LastAccessTime);
    break;
   case (int)CompareBy.FileSize:
    output = Convert.ToInt32(file1.Length - file2.Length);
    break;
   case (int)CompareBy.Name:
   default:
    output = (new CaseInsensitiveComparer()).Compare( file1.Name, file2.Name );
    break;
  }
  return output;
 }
}&lt;/pre&gt;
&lt;p&gt;To use it is fairly simple:&lt;/p&gt;
&lt;pre&gt;string folder = "c:\\windows\\";
string[] files = Directory.GetFiles(folder);
IComparer comp = new FileComparer(FileComparer.CompareBy.FileSize);
Array.Sort(files, comp);
foreach(string file in files)
{
 Console.WriteLine(file);
}&lt;/pre&gt;
&lt;p&gt;This will output a list of files in the &lt;strong&gt;C:\Windows&lt;/strong&gt; directory, sorted smallest to largest. If you want it the other way round, just call &lt;code&gt;Array.Reverse(files)&lt;/code&gt; after the sort.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2885580159917884228?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2885580159917884228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2885580159917884228' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2885580159917884228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2885580159917884228'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/09/sorting-files-by-name-date-filesize-etc.html' title='Sorting Files by Name, Date, FileSize etc (C#)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1269744071165082233</id><published>2007-09-18T17:15:00.000+01:00</published><updated>2007-09-18T17:22:14.504+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google code'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Google Code uses jQuery</title><content type='html'>&lt;p&gt;&lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt; is now another high profile site that uses jQuery. It is used to show Google Code Blog posts, featured projects and Google Tech Talks on the home page. It doesn't use jQuery's AJAX functionality to get the feeds though.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1269744071165082233?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1269744071165082233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1269744071165082233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1269744071165082233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1269744071165082233'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/09/google-code-uses-jquery.html' title='Google Code uses jQuery'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7472485369786160989</id><published>2007-09-12T14:21:00.000+01:00</published><updated>2007-09-12T14:23:59.430+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='selectbox'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Select box manipulation with jQuery - new plugin: selectedValues</title><content type='html'>&lt;p&gt;A new plugin has been added for getting the values of options selected in a select box. More details and download from the &lt;a href="http://jquery.com/plugins/project/selectboxes"&gt;Select Box Manipulation project page&lt;/a&gt; at the jQuery site.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7472485369786160989?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7472485369786160989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7472485369786160989' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7472485369786160989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7472485369786160989'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/09/select-box-manipulation-with-jquery-new.html' title='Select box manipulation with jQuery - new plugin: selectedValues'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-119686628031785677</id><published>2007-09-07T17:10:00.004+01:00</published><updated>2010-02-20T16:01:07.803Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebHandler'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='compress'/><category scheme='http://www.blogger.com/atom/ns#' term='compact'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CssCompact: A WebHandler for shrinking CSS files (ASP.NET)</title><content type='html'>&lt;p&gt;&lt;strong&gt;Update (20 Feb 2010)&lt;/strong&gt;: Static regular expression, compiled (performance improvement, but will be negligible for low volume sites). See &lt;a href="http://blog.crazybeavers.se/index.php/archive/compacting-css-on-the-fly/"&gt;Compacting CSS on-the-fly&lt;/a&gt; for an HttpHandler based on this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (08 July 2009)&lt;/strong&gt;: Check file extension is CSS.&lt;/p&gt;
&lt;p&gt;CssCompact is a simple WebHandler for sending smaller CSS files to the client. It simply removes linebreaks, tabs, spaces (before CSS properties) and comments. That way you can still have your commented CSS code, and also save bandwidth.&lt;/p&gt;
&lt;p&gt;Use is simple, just pass on the stylesheet as a parameter when loading your stylesheet:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add to &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&amp;lt;link rel="stylesheet" type="text/css" href="/style/CssCompact.ashx?stylesheet=/style/style.css" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&amp;lt;style type="text/css"&amp;gt; @import "/style/CssCompact.ashx?stylesheet=/style/style.css"; &amp;lt;/style&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Create &lt;code&gt;CssCompact.ashx&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&amp;lt;%@ WebHandler Language="C#" Class="CssCompact" %&amp;gt;

using System;
using System.Web;
using System.IO;
using System.Text.RegularExpressions;

public class CssCompact : IHttpHandler
{
 // remove linebreaks, whitespace and comments
 private static RemoveRegex = new Regex(@"^\s+|/\*([^*\\\\]|\*(?!/))+\*/|\r|\n|\t", RegexOptions.Multiline | RegexOptions.Compiled);
 public void ProcessRequest(HttpContext c)
 {
  string stylesheet = c.Request.QueryString["stylesheet"];
  c.Response.ContentType = "text/css";
  if (stylesheet != null)
  {
   string filename = c.Server.MapPath(stylesheet);
   FileInfo f = new FileInfo(filename);
   if(f.Extension == ".css" &amp;&amp; f.Exists)
   {
    c.Response.AddHeader("Last-Modified", f.LastWriteTime.ToString("U"));
    c.Response.Expires = 0;
    if(c.Request.HttpMethod != "HEAD")
    {
     using (StreamReader cssStream = f.OpenText())
     {
      string cssContent = cssStream.ReadToEnd();
      cssContent = RemoveRegex.Replace(cssContent, "");
      c.Response.Write(cssContent);
      c.Response.End();
     }
    }
   }
  }
  c.Response.Write("/* No valid style sheet selected */");
  c.Response.End();
 }

 public bool IsReusable
 {
  get
  {
   return false;
  }
 }

}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-119686628031785677?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/119686628031785677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=119686628031785677' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/119686628031785677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/119686628031785677'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/09/csscompact-webhandler-for-shrinking-css.html' title='CssCompact: A WebHandler for shrinking CSS files (ASP.NET)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6026312577822192959</id><published>2007-08-31T10:11:00.000+01:00</published><updated>2007-08-31T10:21:42.375+01:00</updated><title type='text'>Post update - Windows Scripting: Adding/removing network printers and drives</title><content type='html'>&lt;p&gt;&lt;a href="http://webdevel.blogspot.com/2007/06/windows-scripting-adding-removing.html"&gt;Windows Scripting: Adding/removing network printers and drives&lt;/a&gt; has been updated to show you how to add entries to the event log in case of an error, rather than show a message box.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6026312577822192959?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6026312577822192959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6026312577822192959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6026312577822192959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6026312577822192959'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/08/post-update-windows-scripting.html' title='Post update - Windows Scripting: Adding/removing network printers and drives'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-429104429538176698</id><published>2007-08-30T21:16:00.001+01:00</published><updated>2007-08-30T21:42:06.573+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='YUI Compressor'/><category scheme='http://www.blogger.com/atom/ns#' term='JSMin'/><category scheme='http://www.blogger.com/atom/ns#' term='Rhino'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo shrinksafe'/><category scheme='http://www.blogger.com/atom/ns#' term='JSLint'/><category scheme='http://www.blogger.com/atom/ns#' term='Packer'/><category scheme='http://www.blogger.com/atom/ns#' term='compression'/><title type='text'>The JavaScript CompressorRater</title><content type='html'>&lt;p&gt;&lt;a href="http://compressorrater.thruhere.net/"&gt;The JavaScript CompressorRater&lt;/a&gt; compares several popular tools used for compressing JavaScript. At the moment, it compares &lt;a href="http://crockford.com/javascript/jsmin"&gt;JSMin&lt;/a&gt;, &lt;a href="http://dojotoolkit.org/docs/shrinksafe"&gt;Dojo shrinksafe&lt;/a&gt;, &lt;a href="http://dean.edwards.name/packer/"&gt;Packer&lt;/a&gt; and the &lt;a href="http://www.julienlecomte.net/blog/2007/08/13/introducing-the-yui-compressor/"&gt;YUI Compressor&lt;/a&gt; (which has been recently been released and has very good results so far). Dojo shrinksafe and YUI Compressor require Java and &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt; installing. Packer can be run online and  JSMin is a command line tool (with code available in several languages for use within your own applications).&lt;/p&gt;
&lt;p&gt;Before using any of these tools, it is best to check your syntax is correct (adding the optional semi-colons and checking the code with &lt;a href="http://jslint.com/"&gt;JSLint&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;You can see the results of the compression with several popular JavaScript libraries: &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt;, &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt; and &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt;. &lt;a href="http://mootools.net/"&gt;Mootools&lt;/a&gt; and &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt; are missing from the comparison. Rather than using one tool to compress your code, it may be better to try several and use the one that gives you the best results.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-429104429538176698?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/429104429538176698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=429104429538176698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/429104429538176698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/429104429538176698'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/08/javascript-compressorrater.html' title='The JavaScript CompressorRater'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-3771348451170149137</id><published>2007-08-24T09:56:00.000+01:00</published><updated>2007-08-24T10:17:25.015+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>New Version of jQuery - 1.1.4</title><content type='html'>&lt;p&gt;A new version (1.1.4) of &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt; has been released - &lt;a href="http://jquery.com/blog/2007/08/24/jquery-114-faster-more-tests-ready-for-12/"&gt;jQuery 1.1.4: Faster, More Tests, Ready for 1.2&lt;/a&gt;. There are several notable features in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any name jQuery - so you can use multiple versions of jQuery on the same page (though I wouldn't recommend that if at all possible) - e.g. &lt;code&gt;myobj.jQuery = jQuery.noConflict(true)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;It is also faster (yet again) - although it is only slow if you call the same query a lot (hundreds) of times (e.g. &lt;code&gt;$("#myel").foo(); $("#myel").bar(); ...&lt;/code&gt; instead of &lt;code&gt;$myel = $("#myid"); $myel.foo(); $myel.bar(); ...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New features: &lt;code&gt;.slice()&lt;/code&gt; (works like the JavaScript array method &lt;a href="http://devguru.com/Technologies/ecmascript/QuickRef/string_slice.html"&gt;slice&lt;/a&gt;), &lt;code&gt;:has()&lt;/code&gt; (select element only if it has (an)other element(s) in it), recursive &lt;code&gt;.extend()&lt;/code&gt; and &lt;code&gt;.noConflict(true)&lt;/code&gt; (see first point)&lt;/li&gt;
&lt;li&gt;Deprecated methods are also detailed in the blog post - i.e. they won't be in jQuery 1.2, with one exception, XPath attribute selector (deprecated in 1.1.4 and 1.2 - &lt;code&gt;$("div[@attr]")&lt;/code&gt;)
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-3771348451170149137?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/3771348451170149137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=3771348451170149137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3771348451170149137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3771348451170149137'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/08/new-version-of-jquery-114.html' title='New Version of jQuery - 1.1.4'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-3897280922271752316</id><published>2007-08-20T20:34:00.000+01:00</published><updated>2007-08-20T20:42:55.671+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='cheat sheet'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Cheat Sheet (Excel and Google Spreadsheet)</title><content type='html'>&lt;p&gt;A cheat sheet for &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt; has recently been created by Matt Kruse and &lt;a href="http://groups.google.com/group/jquery-en/browse_frm/thread/18eff3afb5db51fc/7e47367e2ae1d71c#7e47367e2ae1d71c"&gt;posted&lt;/a&gt; on the jQuery discussion list. It is available in Excel format via &lt;a href="http://www.javascripttoolbox.com/jquery/"&gt;jQuery Tips (JavaScript Toolbox)&lt;/a&gt; or in &lt;a href="http://spreadsheets.google.com/pub?key=pmkgiRQf98ll4L1SSh9E0Dw"&gt;Google Spreadsheet format&lt;/a&gt; (the Excel sheet created by Matt was converted into this format by George Blouin). Being in a spreadsheet format means it is easily editable, to add your own 'cheats'.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-3897280922271752316?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/3897280922271752316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=3897280922271752316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3897280922271752316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/3897280922271752316'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/08/jquery-cheat-sheet-excel-and-google.html' title='jQuery Cheat Sheet (Excel and Google Spreadsheet)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4136538466359470476</id><published>2007-07-27T14:20:00.000+01:00</published><updated>2007-07-27T14:28:26.586+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='selectbox'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Select box manipulation with jQuery - update to removeOption</title><content type='html'>&lt;p&gt;The previous update to this collection of plugins introduced a cache when adding options (i.e. made it much faster if adding a lot of options). However, it was not cleared when remove options (causing possible conflicts). This is now done and an extra parameter has been added to removeOption (of boolean type), that when set to true, will only remove options if it matches any option(s) defined by the first parameter. More details and download from the &lt;a href="http://jquery.com/plugins/project/selectboxes"&gt;Select Box Manipulation project page&lt;/a&gt; at the jQuery site. &lt;a href="http://www.texotela.co.uk/code/jquery/select/"&gt;A demo&lt;/a&gt; is also available.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4136538466359470476?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4136538466359470476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4136538466359470476' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4136538466359470476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4136538466359470476'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/07/select-box-manipulation-with-jquery.html' title='Select box manipulation with jQuery - update to removeOption'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6785663766077929414</id><published>2007-07-12T15:17:00.000+01:00</published><updated>2007-07-12T15:47:39.359+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csv'/><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='tsv'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>FileHelpers - a library for worked with CSV files (.NET)</title><content type='html'>&lt;p&gt;Best described in the words on the &lt;a href="http://www.filehelpers.com"&gt;FileHelpers website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;The FileHelpers are a free and easy to use .NET library to import/export  data from fixed length or delimited records in files, strings or streams. &lt;/blockquote&gt;
&lt;p&gt;It is a library that can be used to work with flat text files (e.g. Comma Separated Value (CSV) or Tab Separated Values (TSV) etc). Available for commercial and non-commercial use (under the LGPL). They also have a &lt;a href="http://blog.filehelpers.com/"&gt;blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is also a CSV parser on CodeProject if you can't use a library licensed under the LGPL: &lt;a href="http://www.codeproject.com/cs/database/CsvReader.asp"&gt;A Fast CSV Reader&lt;/a&gt;. Not as powerful as FileHelpers but still good nonetheless.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6785663766077929414?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6785663766077929414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6785663766077929414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6785663766077929414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6785663766077929414'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/07/filehelpers-library-for-worked-with-csv.html' title='FileHelpers - a library for worked with CSV files (.NET)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5103387723754286538</id><published>2007-07-11T12:44:00.000+01:00</published><updated>2007-07-11T12:49:57.612+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Text Clips'/><category scheme='http://www.blogger.com/atom/ns#' term='PN2'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Text Clips for Programmers Notepad 2 (jQuery)</title><content type='html'>&lt;p&gt;I have not updated my jQuery Text Clips for &lt;a href="http://www.pnotepad.org"&gt;Programmer's Notepad 2&lt;/a&gt; for a while (since 1.0.2) so have added them for jQuery 1.1.2 @ &lt;a href="http://www.texotela.co.uk/pn2/textclips/"&gt;Text Clips for Programmer's Notepad 2&lt;/a&gt; (generated using the &lt;a href="http://www.texotela.co.uk/code/jquery/textclipgenerator/"&gt;jQuery Text Clip Generator&lt;/a&gt;).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5103387723754286538?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5103387723754286538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5103387723754286538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5103387723754286538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5103387723754286538'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/07/text-clips-for-programmers-notepad-2.html' title='Text Clips for Programmers Notepad 2 (jQuery)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4769506047376960092</id><published>2007-07-05T09:57:00.000+01:00</published><updated>2007-07-05T17:31:01.112+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smtp'/><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Sending emails with C#</title><content type='html'>&lt;p&gt;I'm sure many may already know how to do this, but for those that don't, sending an email using .NET is very easy and can be used in ASP.NET as well as Windows Forms or Console applications (assuming you have CDOSYS installed). This example also shows how to send an email to multiple recipients (requires you to import the namespace &lt;code&gt;System.Collections&lt;/code&gt;).&lt;/p&gt;
&lt;strong&gt;.NET 1.0 / 1.1 (import the namespace &lt;code&gt;System.Web.Mail&lt;/code&gt;)&lt;/strong&gt;
&lt;pre&gt;
MailMessage m;
SmtpMail.SmtpServer = "smtpservername";
ArrayList recipients = new ArrayList();
recipients.Add("fred@bloggs.com");
recipients.Add("jane@doe.com");
for (int i = 0;i &amp;lt; recipients.Count;i++)
{
 m = new MailMessage();
 m.To = recipients[i].ToString();
 m.From = "me@mysite.com";
 m.BodyFormat = MailFormat.Html;
 m.Subject = "Subject of the email";
 m.Body = String.Format(
  "&amp;lt;p style='font: 12px Arial'&amp;gt;Sending email to {0}&amp;lt;/p&amp;gt;",
  recipients[i]
 );
 SmtpMail.Send(m);
}
&lt;/pre&gt;
&lt;strong&gt;.NET 2.0+ (import the namespace &lt;code&gt;System.Net.Mail&lt;/code&gt;)&lt;/strong&gt;
&lt;pre&gt;
MailMessage m;
SmtpClient smtp = new SmtpClient("smtpservername");
ArrayList recipients = new ArrayList();
recipients.Add("fred@bloggs.com");
recipients.Add("jane@doe.com");
for (int i = 0;i &amp;lt; recipients.Count;i++)
{
 m = new MailMessage();
 m.To = recipients[i].ToString();
 m.From = "me@mysite.com";
 m.IsBodyHtml = true;
 m.Subject = "Subject of the email";
 m.Body = String.Format(
  "&amp;lt;p style='font: 12px Arial'&amp;gt;Sending email to {0}&amp;lt;/p&amp;gt;",
  recipients[i]
 );
 smtp.Send(m);
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4769506047376960092?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4769506047376960092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4769506047376960092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4769506047376960092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4769506047376960092'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/07/sending-emails-with-c.html' title='Sending emails with C#'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5935886800076029442</id><published>2007-06-15T13:09:00.000+01:00</published><updated>2007-08-31T10:19:55.314+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vbs'/><category scheme='http://www.blogger.com/atom/ns#' term='windows scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='vbscript'/><title type='text'>Windows Scripting: Adding/removing network printers and drives</title><content type='html'>&lt;p&gt;While I normally make posts related to web development, I may occasionally post something that isn't used in web development, but still has some kind of relationship (normally the underlying technology used) - for example: &lt;a href="http://webdevel.blogspot.com/2003/08/vbscript-set-homepage-msie-add-notepad.html"&gt;VBScript - Set Homepage (MSIE) / Add Notepad to Send To&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In this case, it is VB Scripting and is an example of how to perform several common tasks (related to printers and drives) that network/server administrators may want to do, through a simple script (could be via login script, or executed directly on the client) rather than using the Windows GUI. It also demonstrates how to do basic error handling. Just take the following code (tweak as needed) and paste it in a script file (e.g. login.vbs). Only been tested in Windows XP (for Windows 98, you have to also define the driver name as a second parameter for &lt;code&gt;AddWindowsPrinterConnection&lt;/code&gt;, it should work as is in Windows 2000).&lt;/p&gt;
&lt;pre&gt;Option Explicit
Dim WSHNetwork 
Dim WSHShell

On Error Resume Next

Set WSHNetwork = CreateObject("WScript.Network")
Set WSHShell = CreateObject("WScript.Shell")

rem Add a printer
WSHNetwork.AddWindowsPrinterConnection "\\HOSTNAME\PrinterShareName"
HandleError "Could Not Add Printer"

rem Set this as the default printer
WSHNetwork.SetDefaultPrinter "\\HOSTNAME\PrinterShareName"
HandleError "Could Not Set As Default Printer"

rem Remove an existing printer
WSHNetwork.RemovePrinterConnection "\\HOSTNAME\RemovePrinterShareName"
HandleError "Could Not Remove Printer / Printer Already Removed"

rem Map a drive
WSHNetwork.MapNetworkDrive "L:", "\\HOSTNAME\ShareName"
HandleError "Could Not Map Drive"

rem Remove a drive
WSHNetwork.RemoveNetworkDrive "M:"
HandleError "Could Not Remove Mapped Drive"


Function HandleError(Title)
 If Err.Number &amp;lt;&amp;gt; 0 Then
  rem Add to event log. First parameter can be:
  rem 0 (SUCCESS), 1 (ERROR), 2 (WARNING)
  rem 4 (INFORMATION), 8 (AUDIT_SUCCESS), 16 (AUDIT_FAILURE)
  WSHShell.LogEvent 1, "Error: " &amp; Title &amp; Chr(13) &amp; "Error Number: " &amp; Err.Number &amp; Chr(13) _
   &amp; "Description: " &amp; Err.Description
  Err.Clear
 End If
End Function&lt;/pre&gt;
&lt;p&gt;You can call this from a batch file (e.g. login.cmd)&lt;/p&gt;
&lt;pre&gt;@echo off
set wsh=no
rem Loop through folders in path and check if cscript.exe exists
for %%p in (%path%) do if exist %%p\cscript.exe set wsh=yes
if %wsh%==no goto wshno
:wshyes
cscript login.vbs
goto finally
:wshno
echo Windows Scripting Not Installed
:finally
rem script has finished&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5935886800076029442?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5935886800076029442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5935886800076029442' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5935886800076029442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5935886800076029442'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/06/windows-scripting-adding-removing.html' title='Windows Scripting: Adding/removing network printers and drives'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5351533951792076408</id><published>2007-06-05T09:38:00.000+01:00</published><updated>2007-06-05T11:03:38.730+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entity code'/><category scheme='http://www.blogger.com/atom/ns#' term='html entity'/><title type='text'>Link: HTML Entity Character Lookup</title><content type='html'>&lt;p&gt;&lt;a href="http://leftlogic.com/lounge/articles/entity-lookup/"&gt;HTML Entity Character Lookup&lt;/a&gt; is a useful web based tool for looking up HTML entities codes for characters that you have an idea what they look like (e.g. a 'c'), but not sure what the entity code 
(e.g &lt;code&gt;&amp;amp;copy;&lt;/code&gt; for &amp;copy;) to use is.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5351533951792076408?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5351533951792076408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5351533951792076408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5351533951792076408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5351533951792076408'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/06/link-html-entity-character-lookup.html' title='Link: HTML Entity Character Lookup'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4712043710429851479</id><published>2007-05-25T14:14:00.000+01:00</published><updated>2007-05-25T14:35:37.446+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Controlling browser scrollbars</title><content type='html'>&lt;p&gt;In Firefox, the vertical scrollbar only shows when the page contents do not go beyond the height of the browser window (i.e. you just have a simple 'Hello World' or very little content on your page). On the other hand, the scrollbar always shows if you are using Internet Explorer. For consistency across these (and possibly other browsers as well), you can apply a little bit of CSS.&lt;/p&gt;
&lt;p&gt;To make IE behave like Firefox (only show scrollbar when needed), just do this:&lt;/p&gt;
&lt;pre&gt;html {
   overflow-y: auto;
}
&lt;/pre&gt;
&lt;p&gt;To always show the scrollbar (to prevent the layout changing when more content-rich pages are loaded on your site):&lt;/p&gt;
&lt;pre&gt;html {
   overflow-y: scroll;
}
&lt;/pre&gt;
&lt;p&gt;I also use the same trick to only show scrollbars in &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;'s when needed:&lt;/p&gt;
&lt;pre&gt;textarea {
    overflow: auto;
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4712043710429851479?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4712043710429851479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4712043710429851479' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4712043710429851479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4712043710429851479'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/05/controlling-browser-scrollbars.html' title='Controlling browser scrollbars'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-7428047166362391945</id><published>2007-05-08T12:29:00.000+01:00</published><updated>2007-05-08T12:31:23.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='focusfields'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Plugin: focus fields</title><content type='html'>&lt;p&gt;&lt;a href="http://www.texotela.co.uk/code/jquery/focusfields/"&gt;focus fields&lt;/a&gt; is a plugin for jQuery that adds an outline and background colour to a text input when it is given focus.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-7428047166362391945?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/7428047166362391945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=7428047166362391945' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7428047166362391945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/7428047166362391945'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/05/jquery-plugin-focus-fields.html' title='jQuery Plugin: focus fields'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5833382977317754077</id><published>2007-04-27T17:50:00.000+01:00</published><updated>2007-04-27T17:56:05.217+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='newsticker'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Plugin update: newsticker</title><content type='html'>&lt;p&gt;I've updated my &lt;a href="http://www.texotela.co.uk/code/jquery/newsticker/"&gt;news ticker plugin&lt;/a&gt; to fix a few bugs. Also included on the page are some examples of adding content dynamically and applying it to the added content.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5833382977317754077?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5833382977317754077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5833382977317754077' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5833382977317754077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5833382977317754077'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/04/jquery-plugin-update-newsticker.html' title='jQuery Plugin update: newsticker'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6725619123433787552</id><published>2007-04-17T14:11:00.000+01:00</published><updated>2007-04-17T14:14:14.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='jQIR'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Plugin update: jQIR (jQuery Image Replacement)</title><content type='html'>&lt;p&gt;&lt;a href="http://www.texotela.co.uk/code/jquery/jQIR/"&gt;jQIR (jQuery Image Replacement&lt;/a&gt;) has been updated to take into account hyperlinks (i.e. it wraps the image with them). You can also run a function when the image has loaded.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6725619123433787552?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6725619123433787552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6725619123433787552' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6725619123433787552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6725619123433787552'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/04/jquery-plugin-update-jqir-jquery-image.html' title='jQuery Plugin update: jQIR (jQuery Image Replacement)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-4104315395603151465</id><published>2007-04-05T13:43:00.000+01:00</published><updated>2007-04-05T13:46:10.574+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Select box manipulation with jQuery - update and new plugin</title><content type='html'>&lt;p&gt;In my &lt;a href="http://www.texotela.co.uk/code/jquery/select/"&gt;plugins for working with select boxes&lt;/a&gt;, ajaxAddOption can now call a function after the options have been added. There is also a new plugin (containsOption) for checking if an option with a given value exists.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-4104315395603151465?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/4104315395603151465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=4104315395603151465' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4104315395603151465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/4104315395603151465'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/04/select-box-manipulation-with-jquery.html' title='Select box manipulation with jQuery - update and new plugin'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-8887257669892331204</id><published>2007-03-13T13:13:00.000Z</published><updated>2007-03-13T13:46:57.732Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='iframe'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Iframes and jQuery - Working with an iframe's parent</title><content type='html'>&lt;p&gt;As I stated in my &lt;a href="http://webdevel.blogspot.com/2007/03/iframes-and-jquery-working-with.html"&gt;last post about iframe's and jQuery&lt;/a&gt;, the load event was only fired once in Internet Explorer, so this may be a problem in some situations (for instance, when you go to a new page in the iframe (which is the only reason I can think of for using one instead of includes)). You can put the code into the iframe and work with the page that contains it instead. This actually may be more desirable as it is simpler and works in more browsers (Firefox, Internet Explorer, Opera 8.54+ tested)&lt;/p&gt;
&lt;pre&gt;$( function() {
   var p = parent;
   $("a").click( function() {
       p.$("#myinput").val("Anchor clicked: " + this.href);
       return false;
   })
})&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-8887257669892331204?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/8887257669892331204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=8887257669892331204' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8887257669892331204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/8887257669892331204'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/03/iframes-and-jquery-working-with-iframes.html' title='Iframes and jQuery - Working with an iframe&apos;s parent'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6977659877290720575</id><published>2007-03-13T12:28:00.000Z</published><updated>2007-03-13T13:12:34.137Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='iframe'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Iframes and jQuery - Working with an embedded iframe</title><content type='html'>&lt;p&gt;IFrames, while they can be bad for accessibility (i.e. bookmarking), can also be very handy.
&lt;/p&gt;
&lt;p&gt;What I found was that working with iframes proved troublesome. I initially thought it would be as simple as this:&lt;/p&gt;
&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;pre&gt;$( function() {
 $("#myiframe").load( function(){
  alert("Number of anchors: " + this.$("a").size());
  alert("Document title: " + this.document.title);
 });
});
&lt;/pre&gt;
&lt;strong&gt;HTML&lt;/strong&gt;
&lt;pre&gt;&amp;lt;iframe src="myiframe.html" id="myiframe" name="myiframe"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/pre&gt;
&lt;p&gt;However, this caused several errors: &lt;code&gt;this.document has no properties&lt;/code&gt; (i.e. &lt;code&gt;this.document&lt;/code&gt; is &lt;code&gt;undefined&lt;/code&gt;) and &lt;code&gt;this.$ is not a function&lt;/code&gt;, so I had to find another way. After some trial and error in Internet Explorer and Firebug in Firefox, I found a way (which also works in Opera 9 as well, unsure about Safari though).
&lt;/p&gt;
&lt;pre&gt;$( function() {
   var myiframe = $($.browser.msie ? frames["myiframe"] : "#myiframe");
   // doesn't work in Opera &amp;lt; 9
   myiframe.load( function() {
       var w = this.contentWindow;
       if(!w) w = myiframe[0]; // IE
       alert("Number of anchors: " + w.$("a").size());
       alert("Document title: " + w.document.title);
   })
})&lt;/pre&gt;&lt;p&gt;Several things to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Internet Explorer, if you navigate to a different page in the iframe, the load event is not fired again.&lt;/li&gt;
&lt;li&gt;The iframe needs the id and name attributes to both be present and the same.&lt;/li&gt;
&lt;li&gt;The iframe page also needs to include jQuery&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6977659877290720575?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6977659877290720575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6977659877290720575' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6977659877290720575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6977659877290720575'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/03/iframes-and-jquery-working-with.html' title='Iframes and jQuery - Working with an embedded iframe'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1440540036955166031</id><published>2007-02-22T12:21:00.000Z</published><updated>2007-02-22T12:23:58.979Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='PN2'/><category scheme='http://www.blogger.com/atom/ns#' term='portable'/><title type='text'>Registry-less Programmer's Notepad 2</title><content type='html'>&lt;p&gt;&lt;a href="http://pnotepad.org"&gt;Programmer's Notepad 2&lt;/a&gt; can be made to run without using the registry (i.e. make it portable, so you can use it on a removable hard drive / pen drive), but only with a development build. All it needs is a config.xml in its directory containing the following:&lt;/p&gt;
&lt;pre&gt;&amp;lt;config&amp;gt;
  &amp;lt;userSettings path="settings" /&amp;gt;
  &amp;lt;storeType value="Xml" /&amp;gt;
&amp;lt;/config&amp;gt;&lt;/pre&gt;
&lt;p&gt;Alternatively, this batch file can be used to create the file and copy over your settings. Create a batch file e.g. pn2local.cmd and paste in the following code:&lt;/p&gt;
&lt;pre&gt;@echo off
if exist config.xml goto copysettings
echo ^&amp;lt;config^&amp;gt; &amp;gt; config.xml
echo    ^&amp;lt;userSettings path="settings" ^/^&amp;gt; &amp;gt;&amp;gt; config.xml
echo    ^&amp;lt;storeType value="Xml" ^/^&amp;gt; &amp;gt;&amp;gt; config.xml
echo ^&amp;lt;^/config^&amp;gt; &amp;gt;&amp;gt; config.xml
:copysettings
md settings
xcopy "%AppData%\Echo Software\PN2\*.*" settings\ /D /Q&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1440540036955166031?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1440540036955166031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1440540036955166031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1440540036955166031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1440540036955166031'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/02/registry-less-programmers-notepad-2.html' title='Registry-less Programmer&apos;s Notepad 2'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5109409054904310800</id><published>2007-02-20T12:26:00.000Z</published><updated>2007-02-20T12:28:28.893Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='selectbox'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Remove multiple options with removeOption</title><content type='html'>&lt;p&gt;removeOption, a plugin available along with my other &lt;a href="http://www.texotela.co.uk/code/jquery/select/"&gt;select box manipulation ones&lt;/a&gt; can now take a regular expression as the parameter. This can be used to remove more than one option in one go (or even all of them).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5109409054904310800?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5109409054904310800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5109409054904310800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5109409054904310800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5109409054904310800'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/02/remove-multiple-options-with.html' title='Remove multiple options with removeOption'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-872806263484760652</id><published>2007-02-14T17:57:00.000Z</published><updated>2007-02-14T18:06:37.243Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='selectbox'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Select box manipulation with jQuery</title><content type='html'>&lt;p&gt;If you read the &lt;a href="http://jquery.com/discuss/"&gt;jQuery mailing list&lt;/a&gt;, you may be aware that I have updated my &lt;a href="http://www.texotela.co.uk/code/jquery/select/"&gt;plugins for working with select boxes&lt;/a&gt;. Summary of changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;addOption&lt;/strong&gt; replaces any options with the same value (so think of it as an add/replace options plugin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;selectOptions&lt;/strong&gt; selected options in addition to what was already selected, but there is now an option for it not to do this&lt;/li&gt;
&lt;li&gt;There are two new methods:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;copyOptions&lt;/strong&gt; which is for copying options between select boxes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ajaxAddOption&lt;/strong&gt; allows you to add options via AJAX (i.e. could be used for create options dynamically from a server script)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-872806263484760652?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/872806263484760652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=872806263484760652' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/872806263484760652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/872806263484760652'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/02/select-box-manipulation-with-jquery.html' title='Select box manipulation with jQuery'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-9173770930690913171</id><published>2007-02-05T17:12:00.000Z</published><updated>2007-02-06T09:21:08.099Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><title type='text'>Adding a WebControl before or after another one (ASP.NET C#)</title><content type='html'>&lt;p&gt;ASP.NET does not directly allow you to add a WebControl after another one (i.e. you can't do &lt;code&gt;MyRepeater.AddAfter(MyLiteral)&lt;/code&gt; to add &lt;code&gt;MyLiteral&lt;/code&gt; after &lt;code&gt;MyRepeater&lt;/code&gt;. These two simple functions allow you to do just that:&lt;/p&gt;
&lt;pre&gt;
public void AddControlBefore(Control beforeControl, Control controlToAdd)
{
 Control container = beforeControl.NamingContainer as Control;
 container.Controls.AddAt(container.Controls.IndexOf(beforeControl), controlToAdd);
}
  
public void AddControlAfter(Control afterControl, Control controlToAdd)
{
 Control container = afterControl.NamingContainer as Control;
 container.Controls.AddAt(container.Controls.IndexOf(afterControl) + 1, controlToAdd);
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-9173770930690913171?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/9173770930690913171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=9173770930690913171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9173770930690913171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/9173770930690913171'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/02/adding-webcontrol-before-or-after.html' title='Adding a WebControl before or after another one (ASP.NET C#)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-6409808782713851053</id><published>2007-01-30T13:12:00.000Z</published><updated>2007-01-30T13:14:05.633Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQIR - jQuery Image Replacement (updated)</title><content type='html'>&lt;p&gt;&lt;a href="http://www.texotela.co.uk/code/jquery/jQIR/"&gt;Get jQIR&lt;/a&gt; to replace contents of tags (e.g. headings) with images. Can now use class as well as id.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-6409808782713851053?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/6409808782713851053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=6409808782713851053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6409808782713851053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/6409808782713851053'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/01/jqir-jquery-image-replacement-updated.html' title='jQIR - jQuery Image Replacement (updated)'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1952393915441744743</id><published>2007-01-26T10:12:00.000Z</published><updated>2007-01-26T10:23:27.449Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='firebug'/><title type='text'>Firebug 1.0</title><content type='html'>&lt;p&gt;If you are a web developer and use Firefox, you are likely to have heard of Firebug. The final version of Firebug 1.0 is out, and offers a lot more than the previous version (0.4.1). So I would suggest you to &lt;a href="http://www.getfirebug.com"&gt;Get Firebug&lt;/a&gt; if you haven't already.&lt;/p&gt;&lt;p&gt;It is great for debugging as you can edit/inspect HTML and CSS on the live page and set breakpoints in JavaScript. If only Internet Explorer had something like this (I am aware of the Microsoft Script Editor (comes with Office and is activated within Word/Excel etc by pressing Alt+Shift+F11) and Visual Studio, but they are external applications and don't allow debugging while in the browser).&lt;/p&gt;
&lt;p&gt;Firebug is even handy for non-developers (if they are interested in moving into development) as you can see the scripts and CSS pages are using, as well as see what files are being downloaded by the browser (including those downloaded by Flash).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1952393915441744743?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1952393915441744743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1952393915441744743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1952393915441744743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1952393915441744743'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/01/firebug-10.html' title='Firebug 1.0'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5991369289453822350</id><published>2007-01-19T17:30:00.000Z</published><updated>2007-01-19T17:49:13.141Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Getting jQuery Version</title><content type='html'>&lt;p&gt;There is a way of getting the jQuery version, but it is not through using &lt;code&gt;jQuery.version&lt;/code&gt; as you may expect.&lt;/p&gt;
&lt;pre&gt;
alert("jQuery version is: " + jQuery().jquery);
&lt;/pre&gt;
&lt;p&gt;Here is a basic function that can be used to grab more valuable information from this.&lt;/p&gt;
&lt;pre&gt;function jQueryVersion()
{
 var ver = (new jQuery()).jquery;
 // if there are two .'s it is a bug fix release
 if(ver.match(/\./g).length == 2)
 {
  return {
   "version" : ver,
   "major" : ver.substr(0, ver.indexOf(".")),
   "minor" : ver.substr(ver.indexOf(".") + 1, ver.lastIndexOf(".") - ver.indexOf(".") - 1),
   "revision" : ver.substr(ver.lastIndexOf(".") + 1)
  }
 }
 // otherwise it is an initial release
 else
 {
  return {
   "version" : ver,
   "major" : ver.substr(0, ver.indexOf(".")),
   "minor" : ver.substr(ver.indexOf(".") + 1),
   "revision" : 0
  }
 }
}&lt;/pre&gt;
&lt;p&gt;This could be handy when developing plugins, as they could alert the user if they are using a version of jQuery not supported.&lt;/p&gt;
&lt;pre&gt;
jQuery.fn.myplugin = function()
{
  var version = jQueryVersion();
  if(parseInt(version.minor) &lt; 1)
  {
    alert("jQuery version 1.1 or higher is required for myplugin");
    return this;
  }
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5991369289453822350?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5991369289453822350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5991369289453822350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5991369289453822350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5991369289453822350'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/01/getting-jquery-version.html' title='Getting jQuery Version'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-1073209805586225808</id><published>2007-01-18T13:05:00.000Z</published><updated>2007-01-18T13:09:50.322Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Link: Sites Using jQuery</title><content type='html'>&lt;p&gt;Several high profile sites use jQuery. The jQuery Wiki has a page listing those sites: &lt;a href="http://docs.jquery.com/Sites_Using_jQuery"&gt;Sites Using jQuery&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-1073209805586225808?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/1073209805586225808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=1073209805586225808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1073209805586225808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/1073209805586225808'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/01/link-sites-using-jquery.html' title='Link: Sites Using jQuery'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-819845595168308996</id><published>2007-01-16T17:42:00.000Z</published><updated>2007-01-16T17:47:11.009Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Checkbox manipulation with jQuery</title><content type='html'>&lt;p&gt;Updated my plugins for working with checkboxes
&lt;a href="http://www.texotela.co.uk/code/jquery/checkboxes/"&gt;http://www.texotela.co.uk/code/jquery/checkboxes/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Toggle, check, uncheck and make them behave like radio buttons.&lt;/p&gt;
&lt;p&gt;Works with jQuery 1.0 and 1.1.&lt;/p&gt;
&lt;p&gt;You supply the container, and optionally return the check items (if
using toggleCheckboxes or checkCheckboxes) or unchecked items
(unCheckCheckBoxes):&lt;/p&gt;

&lt;pre&gt;$("#mycontainer").toggleCheckboxes().doSomethingWithMyContainer();
$("#mycontainer").toggleCheckboxes("[@name=foo]", true).doSomethingWithCheckedBoxes();&lt;/pre&gt;
&lt;p&gt;For turning a checkbox group --&amp;gt; radio style selection:&lt;/p&gt;
&lt;pre&gt;$.radioCheckboxGroup("fieldname")&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-819845595168308996?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/819845595168308996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=819845595168308996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/819845595168308996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/819845595168308996'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/01/checkbox-manipulation-with-jquery.html' title='Checkbox manipulation with jQuery'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-2669364350521973424</id><published>2007-01-15T17:20:00.000Z</published><updated>2007-02-24T09:43:28.788Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery Documentation</title><content type='html'>&lt;p&gt;&lt;strong&gt;Update 24 Feb 2007&lt;/strong&gt;: Link to Sean O's jQueryHelp
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update 23 Feb 2007&lt;/strong&gt;: Added links for PDF's of API&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 29 Jan 2007&lt;/strong&gt;: Jörn Zaefferer's API browser is no longer a draft. Link below. &lt;strong&gt;22:10&lt;/strong&gt; it also is printer friendly and can be downloaded for offline viewing. Visual jQuery 1.1.1 is also now available (and can also be downloaded).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 18 Jan 2007&lt;/strong&gt;: A PDF Version of the documentation is available. To download, go to &lt;a href="http://corky.net/dotan/log/2007/01/jquery-documentation-in-pdf.html"&gt;JQuery documentation in PDF&lt;/a&gt;. Only for the latest version of jQuery (1.1), although those with experience with Java will probably be able to check out an older version to generate the documentation.&lt;/p&gt;
&lt;p&gt;If you are a user of jQuery, it is likely that you are aware of Visual jQuery, which is an alternative reference for the jQuery API. What you may not know, is that on the site is documentation for other versions as well (so if you still use an older 1.0.x version, you can still see it on the site). Here are the links (that I know of) to the documentation of the various versions. Also included is the blog post announcing the release of each version, with details of bugs fixed, feature changes etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.visualjquery.com/1.0.2.html"&gt;Visual jQuery 1.0.2&lt;/a&gt; (&lt;a href="http://jquery.com/blog/2006/10/09/jquery-102/"&gt;jQuery blog post&lt;/a&gt;, &lt;a href="http://jquery.com/blog/2006/10/13/minor-api-change-in-102/"&gt;minor API changes&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.visualjquery.com/1.0.3.html"&gt;Visual jQuery 1.0.3&lt;/a&gt; (&lt;a href="http://jquery.com/blog/2006/10/27/jquery-103/"&gt;jQuery blog post&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.visualjquery.com/1.0.4.html"&gt;Visual jQuery 1.0.4&lt;/a&gt; (&lt;a href="http://jquery.com/blog/2006/12/12/jquery-104/"&gt;jQuery blog post&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.visualjquery.com/1.1.html"&gt;Visual jQuery 1.1&lt;/a&gt; (jQuery blog post: &lt;a href="http://jquery.com/blog/2007/01/08/jquery-11a/"&gt;1.1a&lt;/a&gt;, &lt;a href="http://jquery.com/blog/2007/01/11/jquery-11b/"&gt;1.1b&lt;/a&gt;, &lt;a href="http://jquery.com/blog/2007/01/14/jquery-birthday-11-new-site-new-docs/"&gt;1.1 final&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.visualjquery.com/1.1.1.html"&gt;Visual jQuery 1.1.1&lt;/a&gt; (jQuery blog post: &lt;a href="http://jquery.com/blog/2007/01/22/jquery-111/"&gt;1.1.1 bug fix release&lt;/a&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also several other places that have their own version of the API documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jquery.com/api/"&gt;jQuery API&lt;/a&gt; (the original API page, hopefully it will still be kept up to date when new versions come out)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.jquery.com/Main_Page"&gt;jQuery Documentation Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;&lt;a href="http://joern.jquery.com/api-draft/cat.xml"&gt;Draft API&lt;/a&gt;&lt;/strike&gt; &lt;a href="http://jquery.bassistance.de/api-browser/"&gt;jQuery API Browser&lt;/a&gt; by Jörn Zaefferer (one of the key developers of jQuery)
There is also an application you can download (no install required) that allows you to look up a function in this API browser by simply highlighting it and pressing Ctrl-Shift-J - &lt;a href="http://www.sean-o.com/jquery/jqueryhelp/"&gt;Sean O's jQueryHelp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gotapi.com/"&gt;gotapi.com&lt;/a&gt; also has it (version 1.0.3), but unfortunately the jQuery API page on the site can't be bookmarked, so it has to be clicked on in the centre frame&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also available in PDF format:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.bennadel.com/blog/544-Printing-The-Entire-jQuery-API-As-A-PDF-Using-CFDocument-And-XML-Parsing-.htm"&gt;Generated via ColdFusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://corky.net/dotan/log/2007/01/jquery-documentation-in-pdf.html"&gt;Generated through Java from Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rip747.wordpress.com/2006/11/30/jquery-cheat-sheets/"&gt;As Cheat Sheets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are probably more that I have missed which I will hopefully be able to add to this post.&lt;/p&gt;
&lt;p&gt;What I have not seen yet, is a &lt;strike&gt;PDF or&lt;/strike&gt; a CHM (HTML Help) version of the documentation. &lt;strike&gt;Both&lt;/strike&gt; &lt;ins&gt;It&lt;/ins&gt; would be valuable for browsing offline (although I doubt many web developers now are offline very often) and searching can be easier and faster. Thankfully there is an XML version of the documentation (available on the jQuery API page and in the post announcing 1.1) that could be used to generate a &lt;strike&gt;PDF or&lt;/strike&gt; CHM file. I am not sure if the XML files for the older versions (i.e. 1.0.x) are still available though.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-2669364350521973424?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/2669364350521973424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=2669364350521973424' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2669364350521973424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/2669364350521973424'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/01/jquery-documentation.html' title='jQuery Documentation'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5613510.post-5318953678293819189</id><published>2007-01-03T11:52:00.000Z</published><updated>2007-01-03T13:46:27.345Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='associative array'/><title type='text'>Associative Arrays in JavaScript</title><content type='html'>&lt;p&gt;Some developers misuse the &lt;code&gt;Array&lt;/code&gt; constructor to create an associative array. However, this is not a good way of doing this as all the methods/properties available to an array (length, index, sort etc) will not work.&lt;/p&gt;
&lt;pre&gt;var foo = []; // [] is the same as 'new Array()'
foo["bar"] = "baz";
alert(foo.length);&lt;/pre&gt;
&lt;p&gt;When the alert fires, it will return '0' instead of '1'.&lt;/p&gt;
&lt;p&gt;As it doesn't function as a proper array, you may as well use an object instead:&lt;/p&gt;
&lt;pre&gt;var foo = {}; // {} is the same as 'new Object()'
foo["bar"] = "baz";&lt;/pre&gt;
&lt;p&gt;However, you can't see how many items there are without looping through the object. I have written a simple class that can be used that offers this (through the function 'getSize()' as well as a few other methods). As a result, you can't have anything with the keys 'getSize', 'remove', 'toString' and 'toArray'.&lt;/p&gt;
&lt;pre&gt;var AssociativeArray = function()
{
 if(arguments.length == 1 &amp;&amp; arguments[0].constructor == Object)
 {
  for(var item in arguments[0])
  {
   this[item] = arguments[0][item];
  }
 }
 this.getSize = function()
 {
  var length = 0;
  for(var item in this)
  {
   if(item in new this.constructor === false)
   {
    length++;
   }
  }
  return length;
 }
 this.remove = function(item)
 {
  if(item in new this.constructor === false)
  {
   delete this[item];
  }
 }
 this.toString = function()
 {
  return this.toArray().toString();
 }
 this.toArray = function()
 {
  var output = [];
  for(var item in this)
  {
   if(item in new this.constructor === false)
   {
    output[output.length] = item + "=" + this[item];
   }
  }
  return output;
 }
}&lt;/pre&gt;
&lt;p&gt;To use this is pretty simple:&lt;/p&gt;
&lt;pre&gt;var foo = new AssociativeArray();
foo["one"] = 1;
foo["two"] = new Date();
foo["three"] = "A string";
// the above can also be done like this:
// var foo = new AssociativeArray({"one":1,"two":new Date(),"three":"A string"});
alert(foo); // alerts a comma separated string containing the items added
alert(foo.getSize()); // alerts the size (i.e. 3)
foo.remove("one"); // remove item 'one'
alert(foo.getSize()); // alerts the new size (i.e. 2)
var ar = foo.toArray().sort(); // sorted array (by key)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5613510-5318953678293819189?l=webdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevel.blogspot.com/feeds/5318953678293819189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5613510&amp;postID=5318953678293819189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5318953678293819189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5613510/posts/default/5318953678293819189'/><link rel='alternate' type='text/html' href='http://webdevel.blogspot.com/2007/01/associative-arrays-in-javascript.html' title='Associative Arrays in JavaScript'/><author><name>Sam</name><uri>http://www.blogger.com/profile/02893826272363336564</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
