<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>Edelman Technologies Blog</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/" />
   <link rel="self" type="application/atom+xml" href="http://blog.edelmantech.com/atom.xml" />
   <id>tag:blog.edelmantech.com,2010://2</id>
   <updated>2009-03-21T23:13:28Z</updated>
   <subtitle>Practical tips for small business techs.</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.31-en</generator>


<entry>
   <title>60 Minute Project: CheapCarKeys.com</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2009/03/60_minute_project_cheapcarkeyscom.php" />
   <id>tag:blog.edelmantech.com,2009://2.96</id>
   
   <published>2009-03-21T23:08:03Z</published>
   <updated>2009-03-21T23:13:28Z</updated>
   
   <summary>Last week, we helped a client create a website and Google AdWords campaign in under 60 minutes. His company creates replacement car keys on site for half the cost of going to a dealer. It&apos;s a cool niche and over...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Client Project" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[<p>Last week, we helped a client create a website and Google AdWords campaign in under 60 minutes. His company creates <a href="http://www.cheapcarkeys.com/">replacement car keys</a> on site for half the cost of going to a dealer. It's a cool niche and over the upcoming weeks we will find out if enough people search for car keys in his local area to make money. </p>

<p>Web development tools like the <a href="http://developer.yahoo.com/yui/">Yahoo! User Interface</a> Library have made deploying a simple, structurally sound website extraordinarily easy. At the same time, tools like AdWords have become easy to setup using a desktop application like the <a href="http://www.google.com/intl/en/adwordseditor/">AdWords Editor</a>. </p>]]>
      
   </content>
</entry>

<entry>
   <title>Firefox Web Developer Extension</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/firefox_web_developer_extension.php" />
   <id>tag:blog.edelmantech.com,2007://2.24</id>
   
   <published>2007-03-29T18:57:16Z</published>
   <updated>2007-03-29T19:18:16Z</updated>
   
   <summary>The Firefox Web Developer Extension is the best tool I&apos;ve adopted in 2007. It makes testing a websites functionality and interface a breeze. Here are my nine favorite features - all available in one click! View the CSS definitions that...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Software" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[The <a href="https://addons.mozilla.org/en-US/firefox/addon/60">Firefox Web Developer Extension</a> is the best tool I've adopted in 2007. It makes testing a websites functionality and interface a breeze. Here are my nine favorite features - all available in one click!

<ol><li>View the CSS definitions that are effecting any element on the page.</li>
<li>Outline every block on the page to quickly identify the important structures.</li>
<li>Quickly resize the window to see what it looks like at different screen resolutions.</li>
<li>See what cookies the site is setting.</li>
<li>Disable javascript and see how your site looks to a search engine, older browsers, most cell phone users, etc.</li>
<li>Disable external images. What would your site look like if the image server went down?</li>
<li>Display all "alt" tags. (Perfect for SEO!)</li>
<li>Disable a stylesheet or edit one in real-time.</li>
<li>Check the page in multiple popular validation services.</li></ol>
]]>
      
   </content>
</entry>

<entry>
   <title>Manage Content with Movable Type, RightFields Plugin</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/manage_content_with_movable_type_rightfields_plugin.php" />
   <id>tag:blog.edelmantech.com,2007://2.23</id>
   
   <published>2007-03-23T19:17:56Z</published>
   <updated>2007-03-23T19:28:42Z</updated>
   
   <summary>I&apos;m a big fan of Movable Type, an inexpensive blogging platform with a large user base. With a variety of plugins and some creative thinking, you can make it organize and publish a stunning variety of information. At the same...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[I'm a big fan of <a href="http://www.movabletype.com">Movable Type</a>, an inexpensive blogging platform with a large user base. With a variety of plugins and some creative thinking, you can make it organize and publish a stunning variety of information. At the same time, it has such an easy-to-use administrative interface that a computer novice can learn how to post with minimal instruction. This make it an excellent content management tool for small businesses with limited I.T. budgets. 

<a href="http://www.staggernation.com/mtplugins/RightFields/">RightFields</a>, a plugin by Movable Type guru, Kevin Shay, enables you to customize the entry screen to include custom fields. You can use these custom fields to solicit consistent information from the poster, validate the data, and then display and sort the results in templates however you would like. 

For an example of RightFields in action, see our apartment rental page for <a href="http://www.ridgefieldmgmt.com">Ridgefield Management</a>. We used the RightFields plugin to gather the apartment building, apartment type, rent, deposit, and rental term. In the time that it took to write this entry, the administrator of the site posted all of her available apartments and re-published the site!]]>
      
   </content>
</entry>

<entry>
   <title>Promote Google CSEs with Open Search, Javascript, and Cookies</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/promote_google_cses_with_open_search_javascript_and_cookies.php" />
   <id>tag:blog.edelmantech.com,2007://2.22</id>
   
   <published>2007-03-23T16:23:59Z</published>
   <updated>2007-03-23T19:51:07Z</updated>
   
   <summary>For the past few months, I&apos;ve been falling in love with Google Custom Search Engines. So far I&apos;ve built two sites, both of which have seen steadily growing traffic. Diabetes Web Search indexes 250 of the most relevant diabetes organizations,...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Javascript" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="Search" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[For the past few months, I've been falling in love with <a href="http://google.com/coop/cse/">Google Custom Search Engines</a>. So far I've built two sites, both of which have seen steadily growing traffic. <a href="http://search.diabetesdaily.com">Diabetes Web Search</a> indexes 250 of the most relevant diabetes organizations, government sites, forums and blogs. <a href="http://www.searchandcure.com">Search and Cure Diabetes</a> uses the entire Google index but donates all ad profits to diabetes-related organizations. 

<strong>Create an Open Search Plugin</strong>
One of the keys to promoting a custom search engine is letting users easily add it to their browser in Firefox 2 and Internet Explorer 7. To do this, you first need to create a simple XML file that tells the browser about your search engine. Here's the one I'm using for SearchAndCure.com. It's called opensearch.xml and I placed it in my root directory.

bc.. <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
                       xmlns:moz="http://www.mozilla.org/2006/browser/search/">
<ShortName>Search and Cure Diabetes</ShortName>
<Description>All profits from this search engine support diabetes cure research.</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167%2B3t%2B9f7vOec5%2FzOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP%2FwBr28AAgBw1S4kEsfh%2F4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv%2BCpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH%2BOD%2BQ5%2Bbk4eZm52zv9MWi%2FmvwbyI%2BIfHf%2FryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3%2FldM9sJoFoK0Hr5i3k4%2FEAenqFQyDwdHAoLC%2B0lYqG9MOOLPv8z4W%2Fgi372%2FEAe%2Ftt68ABxmkCZrcCjg%2F1xYW52rlKO58sEQjFu9%2Bcj%2FseFf%2F2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R%2BW%2FQmTdw0ArIZPwE62B7XLbMB%2B7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv%2FmPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5%2BASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1%2BTSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q%2B0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw%2BS3FDrFiOJMCaIkUqSUEko1ZT%2FlBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC%2FpdLoJ3YMeRZfQl9Jr6Afp5%2BmD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA%2BYb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV%2Bjvl%2F9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1%2BrTfaetq%2B2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z%2Bo%2B02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y%2FDMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS%2BKc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw%2BlXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r%2B00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle%2B70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l%2Bs7pAz7GPgKfep%2BHvqa%2BIt89viN%2B1n6Zfgf8nvs7%2Bsv9j%2Fi%2F4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww%2BFUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX%2BX0UKSoyqi7qUbRTdHF09yzWrORZ%2B2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY%2BybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP%2BWDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D%2BmiGT0Z1xjMJT1IreZEZkrkj801WRNberM%2FZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c%2FPbFWyFTNGjtFKuUA4WTC%2BoK3hbGFt4uEi9SFrUM99m%2Fur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl%2FVfPV5bdra3kq3yu3rSOuk626s91m%2Fr0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e%2B2Sba1r%2Fdd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q%2F5n7duEd3T8Wej3ulewf2Re%2FranRvbNyvv7%2ByCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9%2BmfHvjUOihzsPcw83fmX%2B39QjrSHkr0jq%2Fdawto22gPaG97%2BiMo50dXh1Hvrf%2Ffu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1%2F3yfPe549d8Lxw9CL3Ytslt0utPa49R35w%2FeFIr1tv62X3y%2B1XPK509E3rO9Hv03%2F6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r%2Fy%2B2v3qB%2FoP6n%2B0%2FrFlwG3g%2BGDAYM%2FDWQ%2FvDgmHnv6U%2F9OH4dJHzEfVI0YjjY%2BdHx8bDRq98mTOk%2BGnsqcTz8p%2BVv9563Or59%2F94vtLz1j82PAL%2BYvPv655qfNy76uprzrHI8cfvM55PfGm%2FK3O233vuO%2B638e9H5ko%2FED%2BUPPR%2BmPHp9BP9z7nfP78L%2FeE8%2Fsl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn%2FAACA6QAAdTAAAOpgAAA6mAAAF2%2BSX8VGAAABP0lEQVR42mJkYJj5nwEPEBRkZ2BnZ2ZYUHbF2r2w4xi6PCMhA5CBje6bTd62H2dWTO3cRpYBMMDKysTw61cKI1YD7A2%2FMqjJ%2F2P4%2B4%2BRgYGBgYGZ6T%2FD3ceMDE9eMDDcesoDV9eQ%2BmhP%2FawWVwwDtvW%2FYLBVOIth662P2gzGCQpwvrrs52%2BHZu%2BRZcJ03j%2Bszlbjv8qwo%2B8eg6AgOwMDAwPDzce8XImT8t9iGPD7NxNOv1srXkfhb9v2iIGJgQLAxcVCmQEMDAyUGfDt2x8GogORgYGB4eh9TQwxFmID8dZHbQaPIgUGBoafcLHP67eyYBjQuYiXYb28HUZCOn9PGEVzW%2BpjdZ6AjX9JTsqCguwMQeZ3F8zZ3pSI1Qv4NDIwMDAc6drFrZWy9BvOMMClcW%2F7IWnD9LnPGBjiUeQBAwCRHmfgzVAdxAAAAABJRU5ErkJggg%3D%3D</Image>
<Url type="text/html" method="GET" template="http://www.searchandcure.com/?cx=009495457297745205407%3Apgbfdwvnygi&amp;q={searchTerms}&amp;sa=Search&amp;cof=FORID%3A9">
</Url>
<moz:SearchForm>searchFormURL</moz:SearchForm>
</OpenSearchDescription>

p.. The OpenSearchDescription, ShortName, Description, and InputEncoding should be fairly straightforward. The Image section includes the actual data for the PNG icon that I want associated with the search engine. To get this information, upload it to the <a href="http://software.hixie.ch/utilities/cgi/data/data">data: URI kitchen</a> with the base64 box checked. The Url type tells the browser how to format the search engine query and what page to direct it to. For a more detailed look at creating your own Open Search xml file, check out the <a href="http://developer.mozilla.org/en/docs/Creating_OpenSearch_plugins_for_Firefox">Mozilla developer network</a>.

Once you've created your Open Search plugin, you'll need to tell the user about it. To do this, reference it in the <head> section of your HTML file. This is done with one simple line:

bc.. <link rel="search" type="application/opensearchdescription+xml" title="searchTitle" href="pluginURL">

p.. So far, so good. We've created an Open Search plugin and told the browser how to access it. When a user visits your site using FF2 or IE7, your engine will now appear in the search engine drop-down box in the browser toolbar 

<strong>Include an "Add My Search Engine" Feature</strong> 
Below is a great piece javascript code by <a href="http://www.hunlock.com/blogs/Integrating_Site_Search_Into_Firefox_and_IE7">Patrick Hunlock</a> that distinguishes between the users browser and prompts them to add your search engine. I've modified it so that it sets a cookie when the user adds the search engine to the the browser toolbar. This way I can use a conditional and only display the "Add Search Engine to Browser" link if the user has not yet added it.

In order for this to work in Firefox, you'll need to follow Hunlock's instructions (see link above) and create a .src file for your search engine. The Firefox way is actually better because when the user adds your engine by using the script below, the browser will regularly check the .src file for updates. If the user adds it from the browser drop-down or in IE7, they must delete and re-add the search engine in order for any changes you make to take effect (e.g. changing the icon or the query parameters). 

bc[javascript].. <script type="text/javascript">
function addEngine()
{
  if ((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function"))
  {
      window.sidebar.addSearchEngine(
          "http://www.searchandcure.com/searchandcure.src",  /* engine URL */
          "http://www.searchandcure.com/searchandcure.png",  /* icon URL */
          "Search and Cure Diabetes!",                       /* engine name */
          "Cure" );                                          /* category name */
      setCookie("addedengine","true",3650);
  } else {
     if (window.external.AddSearchProvider) {
        window.external.AddSearchProvider('http://www.searchandcure.com/opensearch.xml');
      setCookie("addedengine","true",3650);
     }
  }
}
</script>

p.. Here's the simple setCookie script I used. You can use a more advanced one or your own if your prefer or not set a cookie at all.

bc[javascript].. <script type="text/javascript">
 function setCookie(name, value, days)
{
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    }
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
  var ca = document.cookie.split(';');
  var nameEQ = name + "=";
  for(var i=0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
  return null;
}

function eraseCookie(name)
{
  createCookie(name, "", -1);
}
</script>

p.. Now you're almost done. If you'd like, you can simply put an onClick="addEngine()" event in a link your page and call it a day. I chose to go one step further and use a <a href="http://techpatterns.com/downloads/php_browser_detection.php">browser detection script</a> and cookie check to make sure I only show this to those whose browser supports Open Search and have not yet added the search engine. This will only work on a .php web page.

bc[php].. <?php 
  $browser = browser_detection('full');
  $addedengine = $_COOKIE['addedengine'];
  if ($addedengine != "true" && (($browser[0] == 'moz' && $browser[1] >= '1.8') || ($browser[0] == 'ie' && $browser[1] >= '8')))
  {
?>

<div id="addengine"><a href="" onClick="addEngine();">Add this search engine to your web browser!</a></div>

<?php
  }
?>

p.. Thats it! You now have an easy way to promote your custom search engine to your visitors. If you'd like a more in depth explanation of any section, please ask in the comments.  ]]>
      
   </content>
</entry>

<entry>
   <title>Move a Firefox Tab to a New Window</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/move_firefox_tab_to_new_window.php" />
   <id>tag:blog.edelmantech.com,2007://2.15</id>
   
   <published>2007-03-12T21:06:03Z</published>
   <updated>2007-03-12T21:11:52Z</updated>
   
   <summary>If you spend all day working with Firefox tabs, you will love the Tab To Window extension. Price CTRL-SHIFT-N to move your tab to a new window or CTRL-ALT-N to copy it to a new window. I find this especially...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Software" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[If you spend all day working with Firefox tabs, you will love the <a href="http://sogame.awardspace.com/ttwindow.php">Tab To Window</a> extension. Price CTRL-SHIFT-N to move your tab to a new window or CTRL-ALT-N to copy it to a new window. I find this especially useful when I have a problem in one window and find the step-by-step solution in another. Rather than switching back and forth to execute each step, I copy the tab to a new window. It's even more useful if you use two monitors!]]>
      
   </content>
</entry>

<entry>
   <title>My Favorite, Free Programming Tools</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/my_favorite_free_programming_tools.php" />
   <id>tag:blog.edelmantech.com,2007://2.14</id>
   
   <published>2007-03-10T22:38:08Z</published>
   <updated>2007-03-10T22:51:48Z</updated>
   
   <summary>Selecting the write software programs to code and interact with your servers can save you a tremendous amount of time and headaches. Here are my current favorites: Text Editing: PSPad PSPad is a lightweight text editor with a tabbed interface,...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Software" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[Selecting the write software programs to code and interact with your servers can save you a tremendous amount of time and headaches. Here are my current favorites:

<strong>Text Editing: <a href="http://www.pspad.com/">PSPad</a></strong>
PSPad is a lightweight text editor with a tabbed interface, contextual code highlighting, and a built-in FTP server. The ftp server is especially useful for working directly on a remote server. 

<strong>FTP: <a href="http://filezilla.sourceforge.net/">FileZilla</a> and <a href="http://fireftp.mozdev.org/">FireFTP</a></strong>
FileZilla is hands down the best open source client. It's easy to use and does what it's supposed to. FireFTP is a plug-in for Firefox that is easy to keep open in a tab during an extended coding session. 

<strong>SCP: <a href="http://winscp.net/">WinSCP3</a></strong>
SCP is a secure copying protocol. You can use it to login to your server as root and, unlike ftp, you can transfer to and from the root directory.   

<strong>Shell Access: <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTy</a></strong>
PuTTy is a simple program for logging directly into your linux server's shell. ]]>
      
   </content>
</entry>

<entry>
   <title>Free Javascript Contact Forms</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/javascript_contact_forms.php" />
   <id>tag:blog.edelmantech.com,2007://2.13</id>
   
   <published>2007-03-10T22:28:29Z</published>
   <updated>2007-03-12T21:05:38Z</updated>
   
   <summary>I&apos;m always on the lookout for easy-to-use contact forms. Lately, I&apos;ve been using the two below as my starting point. Dodo&apos;s Mail is an easy-to-implement and customize javascript contact form. You can add as many fields as you want and...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="AJAX" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="Javascript" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[I'm always on the lookout for easy-to-use contact forms. Lately, I've been using the two below as my starting point.

<a href="http://regretless.com/scripts/scripts.php#dodosmail">Dodo's Mail</a> is an easy-to-implement and customize javascript contact form. You can add as many fields as you want and it will automatically insert them in an email. This makes it very quick to deploy. 

Dustin Diaz has a more complex, <a href="http://www.dustindiaz.com/ajax-contact-form/">Ajax-based contact form</a>. We use a highly modified version of it on our <a href="http://edelmantech.com">homepage</a>. This one requires some significant editing to adjust, so make sure you're comfortable editing the javascript before using it.

Neither of these is a the holy grail of contact forms. But they are good starting points if you want to implement your own. ]]>
      
   </content>
</entry>

<entry>
   <title>Add www to Domain Using .htaccess</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/add_www_to_root_domain_using_htaccess.php" />
   <id>tag:blog.edelmantech.com,2007://2.12</id>
   
   <published>2007-03-08T17:30:45Z</published>
   <updated>2007-03-08T18:28:51Z</updated>
   
   <summary>Is your website accessible at example.com and www.example.com? If so, then you&apos;re not optimized for search engines! Think of every link your site receives as a vote. If you get five links to example.com and five links to www.example.com, you...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="SEO" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[Is your website accessible at example.com and www.example.com? If so, then you're not optimized for search engines!

Think of every link your site receives as a vote. If you get five links to example.com and five links to www.example.com, you have two separate web pages with five votes. It would be much better if you could tell Google to use one of those pages and give it a ranking of ten. On an Apache server, you can using .htaccess and mod_rewrite. 

Simply place this .htaccess file in the root of your site and change example to your web address:  

bc.. RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*) http://www.example.com/$1 [QSA,L,R=301]

p. <strong>RewriteEngine on</strong> tells Apache's mod_rewrite module to review each address and check it against the rules that follow. 

<strong>RewriteCond</strong> tells mod_rewrite what pattern to look for. In this case, it's anything that starts with "example.com". The dollar sign tells mod_rewrite to store all information after that point for later use. 

<strong>RewriteRule</strong> tells mod_rewrite what to do with the pattern it matched above (everything after the dollar sign). In this case, it says make the url "http://www.example.com/" and then append everything after the first (and in this case only) dollar sign here.   

The <strong>R=301</strong> part is important. This tells the search engine that the page has permanently moved from example.com to www.example.com and it should transfer all of the votes there. Without this directive, Google would assume it's just a temporary move. 

<h3>For More Information</h3>
<a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html">Apache's mod_rewrite Documentaton</a>
<a href="http://www.javascriptkit.com/howto/htaccess.shtml">An .htaccess Overview</a>]]>
      
   </content>
</entry>

<entry>
   <title>Clear Default Form Input with Javascript</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/clear_default_form_input_with_javascript.php" />
   <id>tag:blog.edelmantech.com,2007://2.9</id>
   
   <published>2007-03-02T21:47:25Z</published>
   <updated>2007-03-02T21:56:56Z</updated>
   
   <summary>The search box at the top of the page defaults to &quot;Search&quot;. However, when a user clicks on it, I want the box to become empty. Using Javascript, this is a piece of cake. First, add the following to the...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Javascript" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[The search box at the top of the page defaults to "Search". However, when a user clicks on it, I want the box to become empty. Using Javascript, this is a piece of cake. 

First, add the following to the head section of your page:

bc[javascript].. <script type="text/javascript">
function clearText(thefield){
if (thefield.defaultValue==thefield.value)
thefield.value = ""
} 
</script>

p. Good. Now you have a function called clearText() at your disposal. It simply checks to see if the current value of the field equals the default value. If it does, it will blank it out. 

Here's the syntax for using this script on an input box: 

bc[javacript]. <input type="text" value="Search" onFocus="clearText(this)" />

p. When you click on the box (i.e. onFocus), it will check if the box's currently value ("Search") is equal to the default value (still "Search") and make it empty. 

This script is simpler and better than most of this variety. If you type something into the search box and use your browser's back arrow, the last thing you typed will remain in the box. The text in the box because it will no longer be equal to the default value. Many script simply empty the box every time you click on it. This can be annoying if you've created a long search phrase and only want to change a word or add quotation marks. ]]>
      
   </content>
</entry>

<entry>
   <title>Easy Active Tabs Using CSS and PHP</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/easy_active_tabs_using_css_and_php.php" />
   <id>tag:blog.edelmantech.com,2007://2.8</id>
   
   <published>2007-03-02T15:54:50Z</published>
   <updated>2007-03-02T21:45:53Z</updated>
   
   <summary>PHP includes make it easy to create and maintain a global navigation menu. Just change the included file and the entire site is instantly updated. Unfortunately, because there&apos;s only one file, it can be difficult to create an &quot;active tab&quot;...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="CSS" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="Site Layout" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[PHP includes make it easy to create and maintain a global navigation menu. Just change the included file and the entire site is instantly updated. Unfortunately, because there's only one file, it can be difficult to create an "active tab" effect like this:

<img alt="screeenshot_001.bmp" src="http://blog.edelmantech.com/content/2007/screeenshot_001.bmp" width="476" height="43" />

So how can you stylize the current page's navigation element? With PHP, it turns out it is quite simple! 

<h3>How to treat the active tab differently.</h2>

First, make sure that the destination for each one of your tabs is stored in a different directory. The name of the directory doesn't need to match the name of the link you will create. For example:

http://example.com/
http://example.com/<strong>section1</strong>/
http://example.com/<strong>section2</strong>/
http://example.com/<strong>section3</strong>/

Using a little PHP magic, you can pull out the section names.

bc[php].. <?php // identify the current directory
  $directory = basename(dirname($_SERVER['PHP_SELF']));
?> 

p. The <strong>$_SERVER['PHP_SELF']</strong> returns the directory and file of your current url. For example, at <strong>http://example.com/section1/index.php</strong>, it would return <strong>/section1/index.php</strong>. 

The <strong>dirname()</strong> directive returns the directory. It takes <strong>/section1/index.php</strong> and returns </strong>/section1</strong>.

Finally, the <strong>basename()</strong> directive returns the name of the current file or directory without extension or additional markup. For example, <strong>/section1</strong> becomes <strong>section1</strong>.

Here's what the code above would return on various pages in our example site:

<ul><li>If you are on the home page, this will return "".</li>
<li>If you are at http://example.com/section1/, this will return "section1".</li>
<li>If you are in http://example.com/section2/, this will return "section2".</li>
</ul>

Now, you can use a simple PHP conditional to make one of your tabs active:

bc[php].. <a href="/section1/"<?php if ($directory=="section1") { echo " class=\"selected\""; } ?>>Section 1</a>

p. If you are at http://example.com/section1/, the link above would be styled by the "selected" class in your CSS stylesheet. It's very easy to expand this to work with any number of tabs.

bc[php]..     <div id="topnav">
 
<?php // identify the current directory
  $directory = basename(dirname($_SERVER['PHP_SELF']));
?> 
    
      <ul id="nav">
        <li>
          <a href="/section1/"<?php if ($directory=="section1") { echo " class=\"selected\""; } ?>>Section 1</a>
        </li>
        <li>
          <a href="/section2/"<?php if ($directory=="section2") { echo " class=\"selected\""; } ?>>Section 2</a>
        </li>
        <li>
          <a href="/section3/"<?php if ($directory=="section3") { echo " class=\"selected\""; } ?>>Section 3</a>
        </li>
      </ul>
    </div>

p. To make the homepage active, simple set the $directory conditional equal to blank like this: 

bc[php]. <a href="/"<?php if ($directory=="") { echo " class=\"selected\""; } ?>>Home</a>

p. That's it! You can now use one include file and enjoy an active tab navigation system - <a href="http://edelmantech.com">just like we do on our homepage</a>.]]>
      
   </content>
</entry>

<entry>
   <title>Identify a Font</title>
   <link rel="alternate" type="text/html" href="http://blog.edelmantech.com/content/2007/03/identify_a_font.php" />
   <id>tag:blog.edelmantech.com,2007://2.7</id>
   
   <published>2007-03-01T21:37:50Z</published>
   <updated>2007-03-01T23:57:56Z</updated>
   
   <summary>Have you ever tried to re-create a document but were unable to identify the font? It&apos;s a tedious process of arrowing through dozens or hundreds of fonts. And in the end, you may not find something that work. A fantastic...</summary>
   <author>
      <name></name>
      
   </author>
   
      <category term="Graphic Design" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://blog.edelmantech.com/">
      <![CDATA[Have you ever tried to re-create a document but were unable to identify the font? It's a tedious process of arrowing through dozens or hundreds of fonts. And in the end, you may not find something that work. 

A fantastic website called <a href="http://www.identifont.com/">Identifont</a> can lead you straight to the answer free of charge! The site asks you a series of questions until it narrows the possibilities down to 20 fonts. For example, does the center of the M touch the baseline? Is the dot on the "i" a circle or a square? They make it easy by showing you an example for each answer. Simply click on the picture that looks closest to your font. 

For me, it took about five minutes and twenty questions for them to narrow it down from thousands of fonts to 10. That includes the time spent searching for a solution on Google. 

If you don't own the font, never fear. They offer links to buy them online.]]>
      
   </content>
</entry>

</feed>
