Hello Stefan,<br><br>(Like I said, I'm not an expert on this, but....)&nbsp; For a specific issue... One thing that comes to mind is &quot;Ruby&quot; in the Japanese language.<br><br><div><span class="gmail_quote">On 10/25/06, 
<b class="gmail_sendername">Stefan Haustein</b> &lt;<a href="mailto:sh@kobjects.org">sh@kobjects.org</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Charles Iliya Krempeaux wrote:<br>&gt; I believe it starts to gets more complex when you get into<br>&gt; globalization.&nbsp;&nbsp;(Not that I'm an expert on that, but....)&nbsp;&nbsp;More<br>&gt; thought may be needed to be put into this to make this work in a
<br>&gt; global sense (and not just with roman-based alphabets like ours.)<br>Hi Charles,<br><br>what precisely are you suggesting? Are some characters missing from UTF?<br>Are the writing direction properties of CSS not sufficient to cover some
<br>writing directions?<br><br>To my knowledge concerning baseline/ascent/descent, non latin characters<br>are equal (kyrillic, greek) or simpler, but of course I may be<br>overlooking something, and I am always happy to learn anything new about
<br>I18N and foreign languages (if it is a bit more specific than &quot;I belive<br>there may be problems&quot;).<br><br>Best regards,<br>Stefan<br><br><br>&gt;<br>&gt; See ya<br>&gt;<br>&gt; On 10/25/06, *Stefan Haustein* &lt;
<a href="mailto:sh@kobjects.org">sh@kobjects.org</a><br>&gt; &lt;mailto:<a href="mailto:sh@kobjects.org">sh@kobjects.org</a>&gt;&gt; wrote:<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; Hi David,<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; of course adding only textStyle and drawText() is much better than
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; nothing at all! :)<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; However, I would still prefer an API design that keeps it simple<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; to add<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; those methods later. Perhaps they could be included and simply return<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; null if the requested information is not available (e.g. for a<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; dumb EPS<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; render target?). Also, if we do not have access to font metrics, I<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; think<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; we need an additional parameter for drawText() that specifies the
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; alignment of the text relative to the reference point, as<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; illustrated in<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; the image below:<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.developer.com/img/articles/2002/12/26/03fig12.jpg">http://www.developer.com/img/articles/2002/12/26/03fig12.jpg
</a><br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<a href="http://www.developer.com/img/articles/2002/12/26/03fig12.jpg">http://www.developer.com/img/articles/2002/12/26/03fig12.jpg</a>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; Best regards,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; Stefan<br>&gt;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; David Hyatt wrote:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt; I'm very reluctant to expose font metrics and information (yet).&nbsp;&nbsp;I<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt; think once you start getting into specifying fonts, you open up<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; a can<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt; of worms that would make this sort of API addition a lot harder.
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt; dave<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt; On Oct 24, 2006, at 4:05 PM, Stefan Haustein wrote:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; Hi David,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; I think it is very important to be able to determine the rendered
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; size of the text. Otherwise, there is no reliable way to make sure<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; things do not overlap. Also, some kinds of applications (flash-like<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; effects, labels expressing weight or distance, WYSIWYG text
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; editors)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; may require variable font sizes or styles.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; What do you think about<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; context.textStyle = &quot;barchart&quot;; // style by reference
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; context.textStyle = {&nbsp;&nbsp;// set style directly<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&nbsp;&nbsp;&quot;font-size&quot;: &quot;8px&quot;,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&nbsp;&nbsp;&quot;font-family&quot;: &quot;Monaco, monospace&quot;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; }<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; context.drawText(x,y,string); context.getFontAscent();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; context.getFontDescent();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; context.getFontLeading ();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; 
context.getTextWidth(string);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; Best regards,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; Stefan<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; David Hyatt wrote:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; I think a drawText method would be extremely useful.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; Rather than specifying stylistic information explicitly (via a
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; font<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; object), I'd use a special parenthetical pseudo-element. thus<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; allowing the author to specify the style as for any other<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; element on<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; a page.... something like this...
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; canvas::canvas-text(barchart)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp; font-size: 8px;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp; font-family: Monaco, monospace;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; }
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; and then the API would be something like:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; drawText(y-coord of baseline, &quot;barchart&quot;, myText)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; and letter-spacing/word-spacing would work, small-caps would<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; work,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; text-shadow would work, etc. etc.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; fitTextToPath might be an interesting API too.
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; dave<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; (<a href="mailto:hyatt@apple.com">hyatt@apple.com</a> &lt;mailto:<a href="mailto:hyatt@apple.com">hyatt@apple.com</a>&gt;)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; On Oct 23, 2006, at 4:07 PM, Stefan Haustein wrote:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; Gervase Markham wrote:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; Stefan Haustein wrote:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; I think drawElement(elem) opens up a whole new can of worms:
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - how would an application determine the size of the text box?<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - where is the baseline position, needed for exact axis label
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; positioning?<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - there are probably issues with dynamically calculated<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; text values<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - code with lots of cross references to elements will be
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; difficult to read<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - it needs to be specified whether css properties are inherited<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; from the parent element of &quot;elem&quot;.
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - how much horizontal/vertical space is drawElement<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; permitted to<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; use for rendering?<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; The answer to all of these things is that the browser
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; renders all<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; the elements in the page as it would if the &lt;canvas&gt; were not<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; supported and the alternate content were being used. It then<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; basically screenshots the area corresponding to the element<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; (yes,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; I know this needs careful definition) and draws that into<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; the canvas.
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; I do not see how your statement answers any of my questions<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; except<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; from the last one. You can specify some CSS constraints, but<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; how do<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; you determine the actual rendering height of a text box with a<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; specific width? How do you determine the pixel position of the<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; baseline? The cross reference and the dynamic text issues are not
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; addressed at all.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; Like I said, we want to leverage the browser's deep and complex<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; knowledge of text rendering as much as possible, and just
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; take the<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; resulting pixel output as it would be shown to the user.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - the implementation in actual browsers may be more complex<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; than
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; it seems because of problems with internal data structures for<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; rendering hints and implicitly introducing the ability to<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; render<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; the same element twice.
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; - what happens with contained plugins, canvas elements,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; self-references... all this stuff needs to be well-defined<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; Indeed. I know it's easy to state and there are edge cases.
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; But we<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; could put limits on it like e.g. no plugins, no &lt;object&gt;, and<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; still have something very useful for rendering text.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; So I assume we agree that the element rendering proposal would
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; still need significant specification work and is probably<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; much more<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; difficult to implement. The element rendering approach may make<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; working with bulk text simpler, but this case is already handled
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; quite fine by HTML outside the Canvas element. By asking for too<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; much, we may end up with nothing at all.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; Andrew has provided a clear and simple proposal that can
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; easily be<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; implemented without too much consideration of side effects.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; Putting<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; labels on maps, precise text positioning, starwars-like 3d<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; scrolling text, labels for game characters or in physics<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; simulations, all the stuff that could only be done in a canvas<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; element, is trivial to implement with the drawText()
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; approach, but<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; seems much more complex or impossible with the element rendering<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; approach.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; Moreover, drawElement() would not solve the drawText
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; problem for<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt;&gt; non-browser environments such as Rhino.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; How are we anticipating &lt;canvas&gt; might be used in a non-browser<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;&gt; context?
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; Canvas and some other parts of the spec (e.g. connections)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; may make<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; a lot of sense for Javascript outside of the browser<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; context.&nbsp;&nbsp;This<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; may be outside of the scope of WHATWG, but if we can take out<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; some<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; building blocks and use them somewhere else, this is at least a<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; sign of good and modular API design.
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; Best regards,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&gt; Stefan<br></blockquote></div><br><br clear="all"><br>-- <br>&nbsp;&nbsp;&nbsp;&nbsp;Charles Iliya Krempeaux, B.Sc.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;charles @ <a href="http://reptile.ca">
reptile.ca</a><br>&nbsp;&nbsp;&nbsp;&nbsp;supercanadian @ <a href="http://gmail.com">gmail.com</a><br><br>&nbsp;&nbsp;&nbsp;&nbsp;developer weblog: <a href="http://ChangeLog.ca/">http://ChangeLog.ca/</a><br><br>