<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"
>

<channel>
	<title>High Earth Orbit &#187; Javascript</title>
	<atom:link href="http://highearthorbit.com/category/technology/programming/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://highearthorbit.com</link>
	<description>Transmitting ideas, observations, and images from 42,000 km.</description>
	<lastBuildDate>Thu, 27 Oct 2011 17:23:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9-rare</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CSS &amp; JS Solar System</title>
		<link>http://highearthorbit.com/css-js-solar-system/</link>
		<comments>http://highearthorbit.com/css-js-solar-system/#comments</comments>
		<pubDate>Fri, 25 Aug 2006 20:44:08 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Space]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/css-js-solar-system/</guid>
		<description><![CDATA[For your Friday Enjoyment: CSS Solar System (is that CSS again as a recursive Acronym?)
This was done with the increasingly popular jQuery, an up-and-coming javascript framework/library. (via Dr. Nic)
Tags: css, javascript, jquery, ]]></description>
			<content:encoded><![CDATA[<p>For your Friday Enjoyment: <a href='http://www.willjessup.com/sandbox/jquery/solar_system/rotator.html' title='CSS Solar System'>CSS Solar System</a> (is that CSS again as a recursive Acronym?)</p>
<p>This was done with the increasingly popular <a href='http://www.visualjquery.com/' title='Visual JQuery homepage'>jQuery</a>, an up-and-coming javascript framework/library. (via <a href='http://drnicwilliams.com/2006/08/23/ajax-on-rails-prototype-vs-jquery/' title="Dr. Nic's Weblog">Dr. Nic</a>)</p>
<p class="tags">Tags: <a href="http://technorati.com/tag/css" title="See the Technorati tag page for 'css'." rel="tag">css</a>, <a href="http://technorati.com/tag/javascript" title="See the Technorati tag page for 'javascript'." rel="tag">javascript</a>, <a href="http://technorati.com/tag/jquery" title="See the Technorati tag page for 'jquery'." rel="tag">jquery</a>, <a href="http://technorati.com/tag/" title="See the Technorati tag page for ''." rel="tag"></a></p>]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/css-js-solar-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby and Mapstraction</title>
		<link>http://highearthorbit.com/ruby-and-mapstraction/</link>
		<comments>http://highearthorbit.com/ruby-and-mapstraction/#comments</comments>
		<pubDate>Wed, 26 Jul 2006 18:21:00 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/ruby-and-mapstraction/</guid>
		<description><![CDATA[Wow, Guilhem has been busy. He recently announced YM4R for Mapstraction. Now you can embed Mapstraction maps into your Ruby on Rails projects. 
In case you didn&#8217;t know, Mapstraction is a Javascript library that encapsulates the API&#8217;s for GoogleMaps, YahooMaps, and Microsoft Virtual Earth maps. You can write once, but switch between any of the [...]]]></description>
			<content:encoded><![CDATA[<p>Wow, <a href='http://thepochisuperstarmegashow.com' title="Guilhem's blog">Guilhem</a> has been busy. He recently <a href='http://thepochisuperstarmegashow.com/2006/07/22/ym4rgm-update-ym4rmapstraction/'>announced YM4R for Mapstraction</a>. Now you can embed <a href='http://www.mapstraction.com'>Mapstraction</a> maps into your Ruby on Rails projects. </p>
<p>In case you didn&#8217;t know, <a href='http://www.mapstraction.com'>Mapstraction</a> is a Javascript library that encapsulates the API&#8217;s for <a href='http://www.google.com/apis/maps'>GoogleMaps</a>, <a href='http://developer.yahoo.com/maps'>YahooMaps</a>, and <a href='http://www.viavirtualearth.com/VVE/Dashboard/Default.ashx'>Microsoft Virtual Earth</a> maps. You can write once, but switch between any of the map types.</p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/ruby-and-mapstraction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging in Safari</title>
		<link>http://highearthorbit.com/debugging-in-safari/</link>
		<comments>http://highearthorbit.com/debugging-in-safari/#comments</comments>
		<pubDate>Thu, 20 Jul 2006 22:16:52 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/debugging-in-safari/</guid>
		<description><![CDATA[I picked up a lot of great tips at BarCamp Chicago, and I&#8217;m trying to pour through them in a decently methodical way, unlike my bookmarking problems. Therefore, I&#8217;ll be recapping interesting bits on several upcoming posts.
The first one, which has become immediately pertinent, is Drosera. I wrote about using the web-browser as a development [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://webkit.opendarwin.org/blog/wp-content/drosera.png' align='right' hspace='5px' vspace='5px'/>I picked up a lot of great tips at <a href="http://highearthorbit.com/barcamp-chicago-episode-the-second/" title="HighEarthOrbit: BarCamp Chicago" rel="me">BarCamp Chicago</a>, and I&#8217;m trying to pour through them in a decently methodical way, unlike my bookmarking problems. Therefore, I&#8217;ll be recapping interesting bits on several upcoming posts.</p>
<p>The first one, which has become immediately pertinent, is <a href="http://webkit.opendarwin.org/blog/?p=61">Drosera</a>. I wrote about <a href="http://highearthorbit.com/developing-websites-in-a-proper-dev-environments/" title="High Earth Orbit: Developing websites and web applications in a proper dev environments" rel="me">using the web-browser as a development environment</a> before, but the tools for working in Safari were not nearly as nice as those in Firefox. <a href="http://webkit.opendarwin.org/blog/?p=61">Drosera</a> looks really nice, has the ability to pause and debug. When attached, however, it makes <a href="http://webkit.opendarwin.org" title="Webkit blog">Webkit</a> run rather slow, which is too bad. <a href="'http://www.joehewitt.com/software/firebug/'">Firebug</a> leaves <a href="'http://www.mozilla.com/firefox/'">Firefox</a> running pretty much unchanged.</p>
<p>Of course, it could also use a nice little icon.</p>
<p>Thanks to <a href="http://www.visicswire.com/" title="Visicswire Homepage" rel="collaboratesWith">Walker Hamilton</a> for the tip.</p>
<p><!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/debugging" rel="tag">debugging</a>, <a href="http://www.technorati.com/tag/javascript" rel="tag">javascript</a>, <a href="http://www.technorati.com/tag/mac os x" rel="tag">mac os x</a>, <a href="http://www.technorati.com/tag/macosx" rel="tag">macosx</a>, <a href="http://www.technorati.com/tag/drosera" rel="tag">drosera</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/debugging-in-safari/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hijacking site functionality</title>
		<link>http://highearthorbit.com/hijacking-site-functionality/</link>
		<comments>http://highearthorbit.com/hijacking-site-functionality/#comments</comments>
		<pubDate>Tue, 16 May 2006 02:38:00 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/hijacking-site-functionality/</guid>
		<description><![CDATA[A couple of days ago I mentioned some Greasemonkey scripts I wrote. One of them, which I didn&#8217;t discuss, is particularly devious.
What happens when users have the ability to hijack sites and how they expect to be used? For example, there are scripts to provide mapping functionality within Flickr!, or to compare book prices on [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago I <a href='http://highearthorbit.com/greaseroute-mapping-the-web/'>mentioned</a> some Greasemonkey scripts I wrote. One of them, which I didn&#8217;t discuss, is particularly devious.</p>
<p>What happens when users have the ability to hijack sites and how they expect to be used? For example, there are scripts to provide mapping functionality within Flickr!, or to <a href='http://userscripts.com/scripts/show/1311'>compare book prices</a> on Amazon.com with other vendors.</p>
<p><img src='http://highearthorbit.com/wp-images/MapThis.png' alt='MapThis' align='right' hspace='5px' vspace='5px'/><a href='http://userscripts.org/scripts/show/4019'>MapThis!</a> overrides the &#8220;Map This!&#8221; link that shows up in GMail when an address is detected. Instead of linking to just a plain-ol&#8217; googlemap, the link is &#8220;hijacked&#8221; to provide routing directions from the user&#8217;s geolocated position (using <a href='http://hostip.info'>HostIP</a>) to the address in the email.</p>
<p>This is useful, for example, if a friend sends you the address of their house, or that cool roller-rink with disco ball that you&#8217;re meeting up at and you want to quickly get directions.</p>
<p>It also demonstrates how a user isn&#8217;t limited by the interface a site-designer supplied, allowing them to customize and use the site as they wan. </p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/hijacking-site-functionality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GreaseRoute &#8211; Mapping the web</title>
		<link>http://highearthorbit.com/greaseroute-mapping-the-web/</link>
		<comments>http://highearthorbit.com/greaseroute-mapping-the-web/#comments</comments>
		<pubDate>Tue, 02 May 2006 02:22:24 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/greaseroute-mapping-the-web/</guid>
		<description><![CDATA[I&#8217;ve been fairly quiet for the past couple of weeks. I&#8217;ve been focused on some projects, including entries to the MapQuest OpenAPI developers&#8217; competition. 
One of my entries, which may or may not actually be considered a &#8220;mashup&#8221;, is a Firefox GreaseMonkey script called GreaseRoute that creates map and route icons for an Microformat formatted [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://code.highearthorbit.com/greaseroute/FlockRoute_thumb.png' align='right' hspace='5px;' vspace='5px'/>I&#8217;ve been fairly quiet for the past couple of weeks. I&#8217;ve been focused on some projects, including entries to the <a href='http://mapquest.com/openapi'>MapQuest OpenAPI</a> developers&#8217; competition. </p>
<p>One of my entries, which may or may not actually be considered a &#8220;mashup&#8221;, is a Firefox GreaseMonkey script called <a href='http://code.highearthorbit.com/greaseroute/'>GreaseRoute</a> that creates map and route icons for an <a href='http://microformats.org'>Microformat</a> formatted <a href='http://microformats.org/wiki/adr'>adr</a> or <a href='http://microformats.org/wiki/geo'>geo</a> locations. These are often used in an <a href='http://microformats.org/wiki/hcard'>hcard</a>.</p>
<p>One of the cooler parts is that the extension automatically determines the location of the person viewing the page. Using the <a href='http://hostip.info'>HostIP</a> IP-to-Location database, the user&#8217;s location is automatically entered as the starting location. So when a user is viewing the webpage of, for example, a store or business, they can click the &#8220;route&#8221; link and get turn-by-turn directions to that location. No more copy &#038; pasting street/city/state to a form or asking the person next to you &#8220;where are we?&#8221;</p>
<p><a href='http://microformats.org'>Microformats</a> are a stepping stone on the way to the semantic web. They are a simple way to encode useful information for viewing and mining by users and other applications (ala mashups).</p>
<h3>Example adr</h3>
<p>The proper format of the <em>adr</em> is as follows:</p>
<pre>
&lt;div class=&quot;adr&quot;&gt;
 &lt;div class=&quot;street-address&quot;&gt;1517 N. Main St.&lt;/div&gt;
 &lt;div class=&quot;extended-address&quot;&gt;Box 203&lt;/div&gt;
 &lt;span class=&quot;locality&quot;&gt;Royal Oak&lt;/span&gt;,
 &lt;span class=&quot;region&quot;&gt;MI&lt;/span&gt;
 &lt;span class=&quot;postal-code&quot;&gt;48067&lt;/span&gt;
 &lt;div class=&quot;country-name&quot;&gt;US&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>which will then be displayed as:</p>
<div class="adr">
<div class="street-address">1517 N. Main St.</div>
<div class="extended-address">Box 203</div>
<p> <span class="locality">Royal Oak</span>,<br />
 <span class="region">MI</span><br />
 <span class="postal-code">48067</span></p>
<div class="country-name">US</div>
</div>
<h3>Example geo</h3>
<p>Instead of an address, one can instead just encode the latitude and longitude:</p>
<div class="geo">
<abbr class="latitude" title="37.408183">N 37° 24.491</abbr><br />
<abbr class="longitude" title="-122.13855">W 122° 08.313</abbr>
</div>
<h2>The Result</h2>
<p><a href='http://code.highearthorbit.com/greaseroute/'>GreaseRoute</a> has 2 version, the <em>lite</em> version and the <em>embed</em> version. The <em>lite</em> version displays a map and route icon next to the addresses found on the webpage:</p>
<p><img src='http://code.highearthorbit.com/greaseroute/FlockhCard.png' align='right' hspace='5px;' vspace='5px'/></p>
<p>The <em>embed</em> version displays a &#8220;route&#8221; link. When clicked, a pop-up map is displayed between the users location and the encoded address. </p>
<p>Give <a href='http://code.highearthorbit.com/greaseroute/'>GreaseRoute</a> a try and let me know what you think.</p>
<p>You can also go over to <a href='http://userscripts.org'>Userscripts.org</a>, the GreaseMonkey script repository, and rate them and leave comments.</p>
<ul>
<li><a href='http://userscripts.org/scripts/show/4017'>UserScripts.org: GreaseRoute</a></li>
<li><a href='http://userscripts.org/scripts/show/4018'>UserScripts.org: GreaseRouteEmbed</a></li>
<li><a href='http://userscripts.org/scripts/show/4019'>UserScripts.org: MapThis!</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/greaseroute-mapping-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating inline (embedded) PNG images</title>
		<link>http://highearthorbit.com/creating-inline-embedded-png-images/</link>
		<comments>http://highearthorbit.com/creating-inline-embedded-png-images/#comments</comments>
		<pubDate>Sun, 23 Apr 2006 14:55:53 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/creating-inline-embedded-png-images/</guid>
		<description><![CDATA[Sometimes it&#8217;s necessary, or nice, to be able to directly embed an image in code. Like a modern form of ASCII art, you then don&#8217;t have to distribute icons and images with your source, because the image is in the source itself. The method uses Base64 encoding. See the RFC for Data URI.

&#8220;Base64&#8243; format used [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes it&#8217;s necessary, or nice, to be able to directly embed an image <em>in code</em>. Like a modern form of ASCII art, you then don&#8217;t have to distribute icons and images with your source, because the image is in the source itself. The method uses Base64 encoding. See the <a href='http://www.ietf.org/rfc/rfc2397.txt'>RFC for Data URI</a>.</p>
<blockquote><p>
&#8220;Base64&#8243; format used by MIME-encoded documents such as electronic mail messages with embedded images and audio files.
</p></blockquote>
<p>To convert a PNG (for example) image to Base64, you will need some utility. <a href='http://www.fourmilab.ch/webtools/base64/'>base64</a> is an open-source converter that does just this. </p>
<p>Do the configure, compile jig:</p>
<pre>
$ ./configure
$ make
$ sudo make install
</pre>
<p>Then encode your image:<br />
<code><br />
base64 -e my_image.png my_image.png.base64<br />
</code></p>
<p>Open the <code>my_image.png.base64</code> file in a text editor and then copy it into your code. An example is shown below, written in Javascript. </p>
<p><code></p>
<pre>
const png_image_src = 'data:image/png;base64,'+
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAANbY1E9YMgAAABl0' +
'RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGAUExURcDYv1C8WdPrtIDAeWqk' +
'Oqnd2VLWaOX0x7ftwZzZlIjGxr7gxanLkdfu1FumybHSsJ3Cutbyx4S9fm2paMrq0Lfo1L/a' +
'o6PHiozL11aZJpnW2oG0ZLTcm5zjvovbvM3qtcror2q5vUaIRHLGZWWkR0aQGSR/BYy5baHY' +
'imrbd/z+/HO9bPb69m29xHy8c2OeMUGJPZDThZPPi3ivdGazzZbBgCuCEd3x2jaICs7ksqLZ' +
'mTp/N6zwtWu/YLDWvZHHeqLS0affzKfvsWDYpn7CvJHJh0+cSGWbY6PQka/Xkvj894W2a4DQ' +
'qIrDhF+hQ8fexJDN24PYgYGzWnXJy6zXpp3Fm5jCg37NdI++dWejWmCwVnSrT6nuyTuLELvh' +
'pV2gO6DSwI3qnd3wv6rQxK/fz1OZxrTvtaLim3rRr+bv5TuCN+jw557FiK7NlWzRkHDGhHLd' +
'fnHWmm2zx7Xe1m21zW65z9Ts0HTHaHrGb3vJb3yvVbTaxVGUTITLtV6w0////94DUpYAAACA' +
'dFJOU///////////////////////////////////////////////////////////////////' +
'////////////////////////////////////////////////////////////////////////' +
'//////////////////////////////8AOAVLZwAAAQxJREFUeNpiqAcCc87wcuVKTl4Qm6G+' +
'XstKOU6eu9ouxNbICySgZajBzluWUuzgkOyqpwMUsNJIEuQVYWUNkOCysxeqZzBXZk+z4RCV' +
'kiopquVUcPNn4JSRd4oRkZAwUSwsKPAQN2YIZ0pPFBUpNQnWZGNj0xOrYShPCtSUdeTTlXNm' +
'0WcUtjRgUE4Kz5Plq0vVzWAJkoy0zGKokDeU4+JjYWHRr+KJVhVTYjDylMn34WPJzeXhiRBX' +
'sXBnKIti0tZW1M9VV/eWlg6LV2Oo943wZHaR5BEXz/EOUzHTYajXEfZWSJBUVY2NN1UxywR5' +
'TsfYIFRAQIDfws8sG+xbICGsZG2tpKamBWQDBBgAU049f2kd9aAAAAAASUVORK5CYII=';

var my_link = document.createElement('a');
my_link.title = "Go to example.com"
my_image = document.createElement('img');
my_image.src = png_image_src;
route_image.border = 0;
my_link.href  = "http://example.com";
my_link.appendChild(my_image);

document.body.insertBefore(my_link, document.body.lastChild);
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/creating-inline-embedded-png-images/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Javascript XML parsing for GML and you</title>
		<link>http://highearthorbit.com/javascript-xml-parsing-for-gml-and-you/</link>
		<comments>http://highearthorbit.com/javascript-xml-parsing-for-gml-and-you/#comments</comments>
		<pubDate>Sun, 23 Apr 2006 14:11:15 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/javascript-xml-parsing-for-gml-and-you/</guid>
		<description><![CDATA[You find the need to determine the locations of your visitors, and you wonder how to do this? Surely it&#8217;s impossible. Alas, it is not. Services like HostIP provide the ability to locate your users given their IP address. The slick way to do this is via javascript. Unfortunately, the HostIP API doesn&#8217;t provide a [...]]]></description>
			<content:encoded><![CDATA[<p>You find the need to determine the locations of your visitors, and you wonder how to do this? Surely it&#8217;s impossible. Alas, it is not. Services like <a href="http://hostip.info">HostIP</a> provide the ability to locate your users given their IP address. The slick way to do this is via javascript. Unfortunately, the HostIP API doesn&#8217;t provide a <a href='http://www.json.org/'>JSON</a> interface.</p>
<p>But of course, the response is in XML, so you&#8217;re also wondering how to parse this XML response for something meaningful? The answer is the <code>DOMParser</code> and namespaces. There is a really nice function, <code>getElementsByTagNameNS</code> that allows you to parse out elements given a namespace. I kept trying <code>getElementsByTagNameNS("gml","name")</code>, which didn&#8217;t work. The answer seems to be that you need to include a valid uri for the namespace.</p>
<p><code></p>
<pre>
var dom = new DOMParser ( ) .parseFromString ( responseText,
                            "application/xml" ) ;

var location = dom.getElementsByTagNameNS (
   "http://www.opengis.net/gml", "name" ) [1].firstChild.data
    if location == " ( Unknown city ) "
        return "";
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/javascript-xml-parsing-for-gml-and-you/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Developing websites and web applications in a proper dev environments</title>
		<link>http://highearthorbit.com/developing-websites-in-a-proper-dev-environments/</link>
		<comments>http://highearthorbit.com/developing-websites-in-a-proper-dev-environments/#comments</comments>
		<pubDate>Tue, 18 Apr 2006 12:43:04 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/developing-websites-in-a-proper-dev-environments/</guid>
		<description><![CDATA[When developing a website using Ajax, Javascript, and DOM manipulation, debugging is often relegated to just hitting Refresh to see if it worked. Your node doesn&#8217;t update, something times out, and you&#8217;re not sure what caused it. Putting in alert() everywhere has gotten you tired of hitting enter a hundred times on every page refresh. [...]]]></description>
			<content:encoded><![CDATA[<p>When developing a website using <a href='http://ajaxian.com'>Ajax</a>, Javascript, and DOM manipulation, debugging is often relegated to just hitting <em>Refresh</em> to see <em>if it worked</em>. Your node doesn&#8217;t update, something times out, and you&#8217;re not sure what caused it. Putting in <code>alert()</code> everywhere has gotten you tired of hitting <em>enter</em> a hundred times on every page refresh. </p>
<p>Enter some really nice web application development tools. Most of these use <a href='http://www.mozilla.com/firefox/'>Firefox</a>, and modify the <em>user</em>-centric application into a <em>developer</em>&#8217;s tool. </p>
<p>The <a href='http://chrispederick.com/work/webdeveloper/'>Web Developer Firefox Extension</a> is probably the most well known/common. It adds a toolbar that allows you to quickly and easily inspect a webpage&#8217;s layout, disable cookies, view source, modify the css on the fly, or do browser teting. It&#8217;s indispensable for developing your own site&#8217;s layout as well as understanding how other site layouts are handled. </p>
<p>Firefox comes with the <a href='http://www.mozilla.org/projects/inspector/'>DOM Inspector</a>, which is a separate window you can pull up to select and inspect DOM elements of a page, traverse the tree, and dynamically change node attributes and values. This is nice if you want to check out what the class or ID is of a page element, especially with dynamically added elements (i.e. via Javascript) where they aren&#8217;t visible in the page&#8217;s source. </p>
<p>For checking CSS errors, Javascript errors, and POST/GET requests returned to your browser, check out <a href='http://www.joehewitt.com/software/firebug/'>Firebug</a> (via <a href='http://times.usefulinc.com/2006/01/22-firebug'>Behind the Times</a>). It sits in the bottom menu-bar of Firefox and shows a counter of errors on a per-page basis (rather than the Javascript Debugger which is built into Firefox, which shows all errors received to the entire Firefox application, not just the current page). Firebug is very useful for watching incoming Ajax requests. Just be careful, this can eat up a lot of memory when left active on sites with lots of errors (e.g. <a href='http://gmail.com'>GMail</a>, which typically runs up in the thousands of errors very quickly)</p>
<p>Even heavier application development and debugging may lead you to the <a href='http://www.mozilla.org/projects/venkman/'>Venkman Javascript Debugger</a>. It is a full Javascript development and debugging environment where you can pull up all of the javascript files, view variables, set breakpoints, run an interactive console, etc. It&#8217;s pretty big and complex, so you probably want to check out tutorials like <a href='http://www.svendtofte.com/code/learning_venkman/'>Learning Venkman</a>.</p>
<p>The last tool is not Firefox specific, but is a special build of Apple&#8217;s Safari and KHTML engine which provides a very nice DOM inspector: <a href='http://webkit.opendarwin.org/blog/?p=41'>Safari/Webkit Web Inspector</a>.</p>
<p>Happy debugging!</p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/developing-websites-in-a-proper-dev-environments/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Favicon as quick status</title>
		<link>http://highearthorbit.com/favicon-as-quick-status/</link>
		<comments>http://highearthorbit.com/favicon-as-quick-status/#comments</comments>
		<pubDate>Mon, 20 Mar 2006 16:13:16 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/favicon-as-quick-status/</guid>
		<description><![CDATA[Here is a tutorial on how to use javascript to change a site&#8217;s favicon (via Ajaxian). 
The favicon shows up in your bookmarks, in the address bar, and on the tabs of loaded pages in a tabbable-browser. Being able to dynamically switch the favicon on  a page promotes the favicon to the ability to [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a tutorial on <a href='http://www.ajaxify.com/run/favicon/cycle/'>how to use javascript to change a site&#8217;s favicon</a> (via <a href='http://ajaxian.com/archives/dynamic-favicons'>Ajaxian</a>). </p>
<p>The favicon shows up in your bookmarks, in the address bar, and on the tabs of loaded pages in a tabbable-browser. Being able to dynamically switch the favicon on  a page promotes the favicon to the ability to be used as a &#8220;Status Monitor&#8221; of a webpage. For example, I am uploading a bunch of files to a website, the favicon can show an &#8220;uploading&#8221; icon, and then a green &#8220;complete&#8221; icon when it&#8217;s done. I can then return to the page to carry on whatever I was doing now that the upload is complete.</p>
<p>Or perhaps I have a webpage open to my weblog stats, or server statistics. The color of the icon can be updated to alert me to notifications and messages. A news site could change the icon when there is a new and pertinent story that I may want to read. </p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/favicon-as-quick-status/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yahoo! surprises (hence the exclamation point)</title>
		<link>http://highearthorbit.com/yahoo-surprises-hence-the-exclamation-point/</link>
		<comments>http://highearthorbit.com/yahoo-surprises-hence-the-exclamation-point/#comments</comments>
		<pubDate>Tue, 14 Feb 2006 12:56:37 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/yahoo-surprises-hence-the-exclamation-point/</guid>
		<description><![CDATA[Personally, when I think Yahoo! I think &#8220;Bubble-Yum Bubble Gum&#8221;. It&#8217;s good in an AOL kind of way. A useful portal for general populace, but it&#8217;s always too icky, overloaded, and feature-poor for my tastes. This is in-spite of the fact that the president and CEO is a fellow Alum.
However, Yahoo! has really suprised me [...]]]></description>
			<content:encoded><![CDATA[<p>Personally, when I think Yahoo! I think &#8220;Bubble-Yum Bubble Gum&#8221;. It&#8217;s good in an AOL kind of way. A useful portal for general populace, but it&#8217;s always too icky, overloaded, and feature-poor for my tastes. This is in-spite of the fact that the president and CEO is a <a href='http://www.cs.virginia.edu/misc/news-vef-koogle.html'>fellow Alum</a>.</p>
<p>However, Yahoo! has really suprised me and released some very cool developer resources. </p>
<ul>
<li><a href='http://developer.yahoo.net/ypatterns/'>Design Patterns</a> &#8211; numerous UI concepts, descriptions, and implementations for various application tasks</li>
<li><a href='http://developer.yahoo.net/yui/'>User Interface Library</a> &#8211; collection of JS, DHTML, site elements for websites</li>
<li><a href='http://www.yuiblog.com/'>Yahoo! User Interface Blog</a> (<a href='http://feeds.yuiblog.com/YahooUserInterfaceBlog'>rss</a>)</li>
<li><a href='http://developer.yahoo.net/yui/articles/gbs/gbs_browser-chart.html'>Browser grading chart</a> for following standards</li>
</ul>
<p>- via <a href='http://www.vanderwal.net/random/entrysel.php?blog=1794'>vanderwal.net</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/yahoo-surprises-hence-the-exclamation-point/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GeoRSS to GoogleMaps</title>
		<link>http://highearthorbit.com/georss-to-googlemaps/</link>
		<comments>http://highearthorbit.com/georss-to-googlemaps/#comments</comments>
		<pubDate>Thu, 02 Feb 2006 13:00:03 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/georss-to-googlemaps/</guid>
		<description><![CDATA[Mikel Maron wrote up a small Javascript class to parse a GeoRSS marked XML file and display the points with GoogleMaps. You can see MGeoRSS here. It currently just handles the W3C format for RSS (example of usage for earthquakes).

-21.1765169.5617

In response to his posting to the GeoRSS mailing list, I added a
GeoRSS Simple parsing class. [...]]]></description>
			<content:encoded><![CDATA[<p>Mikel Maron wrote up a small Javascript class to parse a <a href='http://georss.org'>GeoRSS</a> marked XML file and display the points with GoogleMaps. You can see <a href='http://brainoff.com/gmaps/mgeorss.html'>MGeoRSS</a> here. It currently just handles the W3C format for RSS (example of usage for <a href='http://earthquake.usgs.gov/recenteqsww/catalogs/eqs7day-M5.xml'>earthquakes).</p>
<pre>
<geo :lat>-21.1765</geo><geo :long>169.5617</geo>
</pre>
<p>In response to his posting to the GeoRSS mailing list, I added a<br />
</a><a href='http://highearthorbit.com/projects/map/mgeorss.html'>GeoRSS Simple parsing</a> class. </p>
<pre>
<georss :point>45.256 -71.92</georss>
</pre>
<p>Still need to add the full <a href='http://georss.org/gml.html'>GML</a> spec which calls out boxes, polygons, lines, etc. In addition, the ability to automatically detect and parse the correct format (Atom, RSS 0.92, RSS 1.0, RSS 2.0; GML, Simple, W3C) would be really nice. </p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/georss-to-googlemaps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacTech Article: Adding Ajax to a Website</title>
		<link>http://highearthorbit.com/mactech-article-adding-ajax-to-a-website/</link>
		<comments>http://highearthorbit.com/mactech-article-adding-ajax-to-a-website/#comments</comments>
		<pubDate>Tue, 17 Jan 2006 13:41:04 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Article]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/mactech-article-adding-ajax-to-a-website/</guid>
		<description><![CDATA[The month is half over and I have failed to mention that you can go to your local (geeky) news stand and pick up the January issue of MacTech Magazine featuring my article &#8220;Adding Ajax to a Website&#8221;. 
The article covers how to simply implement Ajax on a website and understand the basic principles behind [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://highearthorbit.com/wp-images/MacTechCover_January2006.jpg' alt='MacTech January 2006 cover' target="_blank"><img src='http://highearthorbit.com/wp-images/thumb-MacTechCover_January2006.jpg' alt='MacTech January 2006 cover' align='right' hspace='10px' vspace='10px'/></a>The month is half over and I have failed to mention that you can go to your local (geeky) news stand and pick up the January issue of <a href='http://www.mactech.com/misc/about_mt.html'>MacTech Magazine</a> featuring my article &#8220;Adding Ajax to a Website&#8221;. </p>
<p>The article covers how to simply implement Ajax on a website and understand the basic principles behind the Asyncronous communications. Hopefully it can shed some light to developers new to writing Ajax supporting sites and then move on to the more advanced frameworks (such as <a href="http://prototype.conio.net/">prototype</a>, <a href='http://openrico.org/'>Rico</a>, or <a href='http://www.xajaxproject.org/'>xajax</a> and others).</p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/mactech-article-adding-ajax-to-a-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to create geolocated posts in Blogger</title>
		<link>http://highearthorbit.com/how-to-create-geolocated-posts-in-blogger/</link>
		<comments>http://highearthorbit.com/how-to-create-geolocated-posts-in-blogger/#comments</comments>
		<pubDate>Tue, 10 Jan 2006 13:38:48 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/how-to-create-geolocated-posts-in-blogger/</guid>
		<description><![CDATA[I&#8217;m helping out on a project, GreenerEarth, which is a location companion site to the GreenerMagazine set of environmental weblogs. 
For various reasons, they&#8217;re using Blogger to currently run their weblogs since it&#8217;s free, easy to setup, and easy to use for non-technical people. 
The goal of GreenerEarth was to create a companion weblog that [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://highearthorbit.com/wp-images/Greenermaps2.JPG' alt='GreenerMaps screenshot' target="_blank"><img src='http://highearthorbit.com/wp-images/thumb-Greenermaps2.JPG' alt='GreenerMaps screenshot' align="right" hspace="10px"/></a>I&#8217;m helping out on a project, <a href='http://greenerearth.blogspot.com/'>GreenerEarth</a>, which is a location companion site to the <a href='http://greenermagazine.blogspot.com/'>GreenerMagazine</a> set of environmental weblogs. </p>
<p>For various reasons, they&#8217;re using <a href='http://blogger.com'>Blogger</a> to currently run their weblogs since it&#8217;s free, easy to setup, and easy to use for non-technical people. </p>
<p>The goal of <a href='http://greenerearth.blogspot.com/'>GreenerEarth</a> was to create a companion weblog that provided maps and locations to the various articles that will appear on GreenerEarth. The difficulty resides in the severe restrictions using an hosted blogging tool places on creating a dynamically generated maps. I wanted to allow the writers to easiliy create new posts, put in locations, and then just &#8216;post&#8217;. The actual page would handle parsing the post for the location data and then creating the resulting map.</p>
<p>The only access you have in Blogger (at least) is the main template page, and post templates. Therefore, the solution calls for a marked-up post with lots of tags, and heavy Javascripting of the DOM to dynamically create an array of locations and put these on a GoogleMap.</p>
<p>The result is the ability for any blog author to write a post using the template and the resulting post to have a map with the multiple (or single) locations and article body. As the user clicks on locations in the map, the detailed description shows itself and a bubble shows the summary and link to the site&#8217;s homepage. </p>
<h2>The nitty-gritty</h2>
<p>The post template looks like this:</p>
<pre><code>
<div class="location" lat="" long="">
<div class="summary"></div>
<div class="detail"></div>
<div class="link"><a href="http://"></a></div>
<div class="geo_name"></div>
<div class="geo_city"></div>
<div class="geo_region"></div>
<div class="geo_country"></div>
</div>
<div id="article"> </div>

</code></pre>
<p>The fields should be pretty self-explanatory. The <a href='http://georss.org'>GeoRSS</a> microformat is still being standardized, and hasn&#8217;t yet been defined for marking up XHTML content. So I made an ad-hoc solution. A filled out post would then look like so:</p>
<pre><code>
<div class="location" lat="64.30" long="-110.17">
<div class="summary">Sustainable Diamaonds</div>
<div class="detail">
  Diavik diamond mines are sustainable Mines
   located in the Northwest Territories.
  </div>
<div class="link"><a href="http://http://www.diavik.ca/">homepage</a></div>
<div class="geo_name">Diavik diamond mine</div>
<div class="geo_city">Lac de Gras</div>
<div class="geo_region">Northwest Territories</div>
<div class="geo_country">Canada</div>
</div>
<div id="article">
  Some Interesting information
  about Diamond mines</div>

</code></pre>
<p>If you have multiple locations, copy the template before the
<div id="article"> and paste it below the previous location (or in the desired order). You can add as many locations as you want. Each location will show up as locations with connecting lines on the map. </p>
<p>Somewhere in your template you should add the following to actually <em>place</em> your map. You can vary the size as desired here. </p>
<pre><code>
<div id="map" style="width: 450px; height: 450px"></div>

</code></pre>
<h3>the nitty-gritty</h3>
<p>To grab the code below in a simple form, download <a href="http://highearthorbit.com/projects/map/GreenerMaps_code.txt">the source code here</a>.</p>
<p>The following Javascript goes at the bottom of the Blogger template. What it does is search through the DOM (the post) and pulls out all of the <em>location</em> elements and then creates an array of the latitude and longitude values of the location. The <em>summary</em> and link are placed within the GoogleMaps popup window and then the rest of the actual location information shows or hides itself in the right-hand sidebar. </p>
<pre><code>
<script type="text/javascript">
//
// Returns an array of elements with the given class
//
function getElementsByClass(elem, classname) {
    var classes = new Array();
    var alltags = document.getElementsByTagName(elem);
    var pattern = new RegExp("(^|\s)"+classname+"(\s|$)");
    for (i=0; i<alltags .length; i++)
    {
       if (pattern.test(alltags[i].className))
            classes[classes.length] = alltags[i];
    }
    return classes;
}
function createMarker(point, index, html, element) {
  // Create a lettered icon for this point using our icon class from above
  var letter = String.fromCharCode("A".charCodeAt(0) + index);
  var icon = new GIcon(baseIcon);
  icon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
  var marker = new GMarker(point, icon);

  // Show this marker's index in the info window when it is clicked
  GEvent.addListener(marker, "click", function() {
	hideLocations();
    marker.openInfoWindowHtml(html);
    element.className = "location";
  });

  return marker;
}

function hideLocations()
{
    var mapLocation = getElementsByClass("div","location");

    for(var i = 0; i < mapLocation.length; i++)
    {
        mapLocation[i].className =  "location hidden";
    }
}

function placeArticle()
{
  var article = document.getElementById("article");
  var postbody = document.getElementById("post-body");
  if(postbody != null)
      postbody.appendChild(article);

}
if(GBrowserIsCompatible())
{
     placeArticle();
       // Create a base icon for all of our markers that specifies the shadow, icon
       // dimensions, etc.
       var baseIcon = new GIcon();
       baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
       baseIcon.iconSize = new GSize(20, 34);
       baseIcon.shadowSize = new GSize(37, 34);
       baseIcon.iconAnchor = new GPoint(9, 34);
       baseIcon.infoWindowAnchor = new GPoint(9, 2);
       baseIcon.infoShadowAnchor = new GPoint(18, 25);

       var map = new GMap(document.getElementById("map"));
       map.addControl(new GLargeMapControl());
       map.addControl(new GMapTypeControl());
       map.centerAndZoom(new GPoint(0,0), 4);
       var mapLocation = getElementsByClass("div","location");
       var locationPoints = [];
       for(var i = 0; i < mapLocation.length; i++)
       {
            var locDiv = mapLocation[i].childNodes;
            mapLocation[i].className = "location hidden";

            var loc_lat = mapLocation[i].getAttribute("lat");
            var loc_lon = mapLocation[i].getAttribute("long");
            for(var j = 0; j < locDiv.length; j++)
            {
                if((locDiv[j] != null))
                {                   
		            var locClass = locDiv[j].className;
                    if(locClass  == "geo_name")
                    {
                        var loc_name = locDiv[j];
                    }
                    if(locClass == "geo_city")

                       var loc_city = locDiv[j];
                    if(locClass == "geo_region")
                       var loc_region = locDiv[j];
                    if(locClass == "geo_country")
                       var loc_country = locDiv[j];

                    if(locClass == "summary")
                    {
                       var loc_summary = locDiv[j];
                    }
                    if(locClass == "link")
                       var loc_link = locDiv[j];            
                }
                if((locDiv[j].nodeName == "BR") || (locDiv[j].nodeName == "br"))
                    locDiv[j].style.display = "none";
            }
            locationPoints.push(new GPoint(parseFloat(loc_lon),parseFloat(loc_lat)));

            var html = "
<div class='mapMarker'>
              See source code (code doesn't display well in blog)
            </alltags></script></code></pre>
</div>
<p>&#8220;;</p>
<p>            var marker = createMarker(locationPoints[locationPoints.length-1], i, html, mapLocation[i]);</p>
<p>            map.addOverlay(marker);</p>
<p>       }<br />
       map.addOverlay(new GPolyline(locationPoints));<br />
       map.centerAndZoom(locationPoints[0], 4);</p>
<p>}</p>
<p>Finally, the appropriate CSS markup also needs to be placed in the template. Modify it as you want to make it match the rest of your blog. </p>
<pre><code>
#map {
    float: left;
    text-color: black;
    font-size: 12px;
    }
#map .mapMarker{
  color: black;
  width: 250px;
}

#map .mapMarkerMore {
  text-align:right;
}
.location {
    font-size: 12px;
    border: 1px solid white;
    background-color: gray;
    padding-left: 5px;
    }
.location .summary {
    color: white;
    font-size: 16px;
    border-bottom: 1px solid white;
    background-color: #9ad;
    margin-left: -5px;
    padding-left: 5px;
    display:block;
    }
.location .detail {
	display: inline;
    }
.geo_name {
    font-size: 11px;
    border-bottom: 1px;
    }

.geo_city, .geo_region, .geo_country {
    display: inline;
    margin-top: 4px;
    padding-right: 3px;
    font-size: 9px;
    border-top: 1px solid white;
    text-align: right;
    }

.greenNav {
	display: inline;
	list-style-type: none;
	padding-right: 5px;
	margin: 0px;
    }
.greenNav li {
	display: inline;
	list-style-type: none;
	border-right: 1px solid gray;
	padding-right: 5px;
    }
.hidden {
    display: none;
     }
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/how-to-create-geolocated-posts-in-blogger/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Javascript Controls</title>
		<link>http://highearthorbit.com/javascript-controls/</link>
		<comments>http://highearthorbit.com/javascript-controls/#comments</comments>
		<pubDate>Thu, 05 Jan 2006 03:26:38 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/javascript-controls/</guid>
		<description><![CDATA[Earlier I discussed Web-based Desktop Interfaces which do lots of various tricks in lots of various ways to provide a consistent (at least with respect to computer users&#8217;) user experience. How do they do that you ask?
Here is a very nice javascript slider. It&#8217;s released under various licenses including GPL, a non-commerical free license, and [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier I <a href="http://highearthorbit.com/web-based-os-desktops/">discussed Web-based Desktop Interfaces</a> which do lots of various tricks in lots of various ways to provide a consistent (at least with respect to computer users&#8217;) user experience. How do they do that you ask?</p>
<p>Here is a very nice <a href="http://webfx.eae.net/dhtml/slider/slider.html">javascript slider</a>. It&#8217;s released under various licenses including GPL, a non-commerical free license, and a commerical $ license. </p>
<p>It&#8217;s very simple to use, requires including 3 javascript files (24k) and a css file. Check the docs out for more info. While there, checkout their other cool UI elements such as collapsable trees, sortable columns, and very good articles on a host of web development technologies.</p>
<p>The same developers also produce <a href='http://www.bindows.net/'>Bindows</a>, which is a full, desktop type set of user interface elements usable to create an entire application interface. It&#8217;s a little on the expensive side for a commercial license. However, doing these elements on your own dev time, and making them fast and cross-browser compatible is <em>not</em> going to be easy.</p>
<p>You can also check out the <a href='http://script.aculo.us/'>Script.aculo.us</a> &#8211; the modern, cool Javascript library built on <a href='http://prototype.conio.net/'>Prototype</a> <a href='http://wiki.script.aculo.us/scriptaculous/show/SliderDemo'>SliderDemo</a>Other Javascript interface libraries:</p>
<ul>
<li><a href="http://jsui.sourceforge.net/">Javascript User Interface</a>  &#8211; a fairly old library</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/javascript-controls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MapBuilder &#8211; Open-source GIS</title>
		<link>http://highearthorbit.com/mapbuilder-open-source-gis/</link>
		<comments>http://highearthorbit.com/mapbuilder-open-source-gis/#comments</comments>
		<pubDate>Mon, 05 Dec 2005 02:56:34 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/mapbuilder-open-source-gis/</guid>
		<description><![CDATA[mapbuilder-lib is a browser based (AJAX) web mapping client for Open GIS Services. The tool set allows developers to provide map interfaces of arbitrary datasets without requiring the now infamous online maps). It also supports time series maps (such as for weather, migration, travels) 
The underlying server is available in both PHP and JSP, depending [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://mapbuilder.sourceforge.net/'>mapbuilder-lib</a> is a browser based (AJAX) web mapping client for Open GIS Services. The tool set allows developers to provide map interfaces of arbitrary datasets without requiring the now <a href='http://maps.google.com'>infamous</a> <a href='http://maps.yahoo.com'>online maps</a>). It also supports <a href='http://mapbuilder.sourceforge.net/mapbuilder-lib-1.0-rc1/demo/timeSeries/index.html'>time series</a> maps (such as for weather, migration, travels) </p>
<p>The underlying server is available in both PHP and JSP, depending on your particularly preferred flavor. Hrm &#8211; no Ruby support. They could probably get a better headline if they provided the new programming language of the month(s). </p>
<p>I think having invigorated, open-source, web-based mapping tools is excellent. I also really like the time-series maps. I think I am going to try and use it for displaying GPS tracks from my bluelogger.</p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/mapbuilder-open-source-gis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IndigoWidget v1.1 &#8211; now with Preferences!</title>
		<link>http://highearthorbit.com/indigowidget-v11-now-with-preferences/</link>
		<comments>http://highearthorbit.com/indigowidget-v11-now-with-preferences/#comments</comments>
		<pubDate>Wed, 16 Nov 2005 15:22:27 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Dashboard]]></category>
		<category><![CDATA[Home Automation]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/indigowidget-v11-now-with-preferences/</guid>
		<description><![CDATA[Since remote access via the IndigoWidget was such a popular feature &#8211; and not everyone is a programmer, I have moved setting remote control via the IndigoWidget as a preference on the backside of the widget.
You can download the new version from the software page. There is also an included Readme that discusses setting up [...]]]></description>
			<content:encoded><![CDATA[<p>Since remote access via the IndigoWidget was such a popular feature &#8211; and not everyone is a programmer, I have moved setting remote control via the IndigoWidget as a preference on the backside of the widget.</p>
<p>You can download the new version from <a href='http://highearthorbit.com/software/indigowidget/'>the software page</a>. There is also an included Readme that discusses setting up your widget over to work over the internet back to your house or office.</p>
<p>I hope you enjoy! </p>
<p><img src='http://highearthorbit.com/wp-images/IndigoWidget_Backside.jpg' alt='IndigoWidget backside'/></p>
<h2>troglogdyte speak</h2>
<p>For those interested, coding up preferences for a Dashboard widget are actually impressively straight-forward and easy. </p>
<p>The only two lines of code that are <em>special</em> are the following which get and set the preference for the widget:</p>
<pre><code>
    var IndigoServerIP  = widget.preferenceForKey("serverIP");
    if(IndigoServerIP  != '')
        getObj("serverIP").value = IndigoServerIP;  

    widget.setPreferenceForKey(getObj("serverIP").value, "serverIP");
</code></pre>
<p>Assumedly these are stored by the name of the widget (e.g. com.highearthorbit.widget.Indigo).</p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/indigowidget-v11-now-with-preferences/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Firefox as a web-development environment</title>
		<link>http://highearthorbit.com/firefox-as-a-web-development-environment/</link>
		<comments>http://highearthorbit.com/firefox-as-a-web-development-environment/#comments</comments>
		<pubDate>Mon, 31 Oct 2005 16:12:11 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/firefox-as-a-web-development-environment/</guid>
		<description><![CDATA[So you&#8217;re developing a website/page/app/service/extension/widget/doodad that makes heavy use of Javascript/XHTML/XML/HTTP/DOM/XUL/hoomajooba and you&#8217;re slowly, but surely, tearing your hair out from finding small bugs with little to no help on where these bugs are. 
Web development using the newest technologies is obviously a newly emerged, and quickly developing, field. Fortunately, open-source toolsets promote developers and [...]]]></description>
			<content:encoded><![CDATA[<p>So you&#8217;re developing a website/page/app/service/extension/widget/doodad that makes heavy use of Javascript/XHTML/XML/HTTP/DOM/XUL/hoomajooba and you&#8217;re slowly, but surely, tearing your hair out from finding small bugs with little to no help on <b>where</b> these bugs are. </p>
<p>Web development using the newest technologies is obviously a newly emerged, and quickly developing, field. Fortunately, open-source toolsets promote developers and users <em>of</em> these technologies to build and release tools <em>for</em> these technologies. </p>
<h3>Tools are our friends</h3>
<p><a href='http://lesliefranke.com/'>Leslie Frank&#8217;s</a> <a href='http://lesliefranke.com/sandbox/presentations/firefoxwdev/firefoxwdev.htm'>Firefox Web Development Tools Presentation</a> is a good run through of about a dozen tools you should use, or at leat consider using, for your development environemnt. <a href='http://www.bytefarmers.com/log/2005/09/03/extending-firefox-for-web-developers/'>Extending Firefox for web developers</a> has some more useful tools, including a reference to <a href='http://www.hacksrus.com/~ginda/venkman/'>Venkman</a>, a powerful Javascript development environment.</p>
<h3>The power lies within</h3>
<p>about:config is a very powerful, and little used, configuration option for tweaking the underpinnings of Firefox. </p>
<p>via <a href='http://www.borngeek.com/firefox/tutorial/part_07.html'>Born Geek</a>:</p>
<blockquote><p>
There are two browser settings that can make your debugging life much easier. Both can be set through the standard about:config preferences mechanism, and both affect the output sent to the JavaScript console.</p>
<p>The first preference, javascript.options.showInConsole, will log any errors in your chrome XUL files to the JavaScript console when set to true. By default, this option is set to false, so you will need to change the value. The second preference, javascript.options.strict, will display strict JavaScript warnings in the JavaScript console. Again, this is set to false by default. Since many developers do not turn this preference on while developing, you will most likely see a number of errors and warnings with their code (so they can be safely ignored).
</p></blockquote>
<h3>The future is now&#8230;</h3>
<p>For you extension developers, there is also a very exciting feature available in Firefox 1.5, <a href='http://kb.mozillazine.org/Getting_started_with_extension_development'>Dynamic Development</a>, which allows an extension to refer to a set of files locally on a disk without the need to repackage and reinstall the XPI during development. Changes are loaded each time, at runtime. </p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/firefox-as-a-web-development-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GoogleMaps geocode lookup</title>
		<link>http://highearthorbit.com/googlemaps-geocode-lookup/</link>
		<comments>http://highearthorbit.com/googlemaps-geocode-lookup/#comments</comments>
		<pubDate>Wed, 26 Oct 2005 23:30:20 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/googlemaps-geocode-lookup/</guid>
		<description><![CDATA[GoogleMaps API officially states that they don&#8217;t provide a geocoder or route lookup via their API. A geocoder is a service that translates a name into geo coordinates like latitude and longitude. 
The most popular and well-known geocoders are geocoder.us and Mikel Maron&#8217;s geocoder.
However, you can actually do a geocode query on GoogleMaps:


http://maps.google.com/maps?output=js&#038;q=northville+mi


The result is [...]]]></description>
			<content:encoded><![CDATA[<p><a href='www.google.com/apis/maps'>GoogleMaps API</a> officially states that they don&#8217;t provide a geocoder or route lookup via their API. A geocoder is a service that translates a <em>name</em> into geo coordinates like <em>latitude</em> and <em>longitude</em>. </p>
<p>The most popular and well-known geocoders are <a href='http://geocoder.us'>geocoder.us</a> and Mikel Maron&#8217;s <a href='http://brainoff.com/geocoder/'>geocoder</a>.</p>
<p>However, you can actually do a geocode query on GoogleMaps:</p>
<pre>
<code>
http://maps.google.com/maps?output=js&#038;q=northville+mi
</code>
</pre>
<p>The result is an HTML page containing javascript with the location (and nearby locations). You can then parse this output to retrieve the latitude &#038; longitude.</p>
<pre>
<code>
<locations>
  <location infoStyle="/maps?file=li&amp;hl=en" id="A">        
<point lat="42.426245" lng="-83.479355"/>
  <icon class="noicon"/>
  <info>        
<address>
<line>Northville, MI 48167</line>
      </address>

      <description></description>
  </info>
  </location>
</locations>
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/googlemaps-geocode-lookup/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gaze into my Aja(x)</title>
		<link>http://highearthorbit.com/gaze-into-my-ajax/</link>
		<comments>http://highearthorbit.com/gaze-into-my-ajax/#comments</comments>
		<pubDate>Wed, 19 Oct 2005 18:21:12 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/gaze-into-my-ajax/</guid>
		<description><![CDATA[I wanted to make the Gaze lookup service an Asynchronous call (AJAX
without the X), but the problem lies in not typically being allowed to
make async calls to a non-local host. Therefore, I wrapped up the Gaze
service in a little PHP code (gaze-rest.php) that has the same API as
the actual gaze service, but acts like a [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to make the Gaze lookup service an Asynchronous call (AJAX<br />
without the X), but the problem lies in not typically being allowed to<br />
make async calls to a non-local host. Therefore, I wrapped up the Gaze<br />
service in a little PHP code (gaze-rest.php) that has the same API as<br />
the actual gaze service, but acts like a &#8216;local service&#8217;.</p>
<p><a href='http://highearthorbit.com/projects/geocode/geocode.html'>http://highearthorbit.com/projects/geocode/geocode.html</a></p>
<p>The page then makes a Javascript call, which gets the values from the<br />
form and makes the async call. The returned value is put in the<br />
textarea.</p>
<p>Right now I hardcoded the US and GB, but plan on extending it to<br />
actually dynamically fill the options via a find_places_get_countries<br />
call to Gaze.</p>
<p>The source is available as a link at the bottom of the page.</p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/gaze-into-my-ajax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Does your browser evaluate the Javascript of innerHTML?</title>
		<link>http://highearthorbit.com/does-your-browser-evaluate-the-javascript-of-innerhtml/</link>
		<comments>http://highearthorbit.com/does-your-browser-evaluate-the-javascript-of-innerhtml/#comments</comments>
		<pubDate>Mon, 17 Oct 2005 11:13:37 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://highearthorbit.com/does-your-browser-evaluate-the-javascript-of-innerhtml/</guid>
		<description><![CDATA[While playing with some really slick asynchronous javascript stuff (no &#8211; not Ajax, there wasn&#8217;t any XML involved), I ran into an odd behavior that varied between the several browsers.
What I&#8217;m doing is passing back a table from an asynchronous call and placing it into a premade table elementId. The page supports interaction with either [...]]]></description>
			<content:encoded><![CDATA[<p>While playing with some really slick asynchronous javascript stuff (no &#8211; not Ajax, there wasn&#8217;t any XML involved), I ran into an odd behavior that varied between the several browsers.</p>
<p>What I&#8217;m doing is passing back a table from an asynchronous call and placing it into a premade table elementId. The page supports interaction with either javascript, if enabled, or straight href links if javascript is not enabled.</p>
<p>The problem occurs when my Async call returns a table with a &lt;script&gt; tag containing document.write() calls. </p>
<blockquote>
<pre>
<div id="myelement"></div>

<script>
document.getElementById("myelement").innerHTML = 
"</script><script> document.write('Hello'); 
< \/script>";
</script>
</pre>
</blockquote>
<p>Replace innerHTML with innerText and Safari renders the entire script source, Firefox &#038; Camino ignore it.</p>
<p>Hrm &#8211; so how to dynamically fill in script into the DOM of a page and have it executed?</p>
<p>The DOM inspector in Firefox correctly shows the Javascript being part of the element, but since the parser has already gone through that element, evaluated the Javascript later in the page, then it doesn&#8217;t seem to be re-executed.<br />
<em>Update</em></p>
<p>It seems as though there is promise in the <code>eval</code> function of Javascript. However, nothing seems apparent yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://highearthorbit.com/does-your-browser-evaluate-the-javascript-of-innerhtml/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

