<?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/"
	>

<channel>
	<title>mindtrove &#187; Ideas</title>
	<atom:link href="http://mindtrove.info/category/ideas/feed/" rel="self" type="application/rss+xml" />
	<link>http://mindtrove.info</link>
	<description>Collecting ideas since 1980</description>
	<lastBuildDate>Thu, 01 Jul 2010 01:58:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Outfox in Greasemonkey revisited</title>
		<link>http://mindtrove.info/outfox-in-greasemonkey-revisited/</link>
		<comments>http://mindtrove.info/outfox-in-greasemonkey-revisited/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 02:39:30 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[outfox]]></category>
		<category><![CDATA[speech]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=219</guid>
		<description><![CDATA[There was some traffic in the Outfox group about my GMail announcer userscript failing in Outfox 0.3.x. The Outfox API has improved quite a bit since 0.1.0, so it's no surprise my script no longer works. Here's a new example script that does work with the latest Outfox 0.3.5 release. Instead of polluting the example [...]]]></description>
			<content:encoded><![CDATA[<p>There was some <a href="http://groups.google.com/group/outfox-discuss/browse_thread/thread/67c53a86a8814a2a">traffic in the Outfox group</a> about my <a href="http://mindtrove.info/outfoxing-gmail-with-greasemonkey/">GMail announcer userscript</a> failing in Outfox 0.3.x. The Outfox API has improved quite a bit since 0.1.0, so it's no surprise my script no longer works.</p>
<p>Here's a new example script that <em>does</em> work with the latest Outfox 0.3.5 release. Instead of polluting the example with all the complications of navigating the GMail DOM, I've picked a much simpler target. This script simply speaks the number of major sections (level 2 headings) in a Wikipedia article when the page loads. It's not as sexy, but the code is much easier to understand.</p>
<p>To try this script, make sure you have the Greasemonkey 0.8 and Outfox 0.3.5 extensions installed on Firefox 3.0 or 3.5. Then visit the following link to have GM install the script: <a href="/files/citation_announcer.user.js">citation_announcer.user.js</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// ==UserScript==</span>
<span style="color: #006600; font-style: italic;">// @name Sections count</span>
<span style="color: #006600; font-style: italic;">// @namespace http://www.mindtrove.info/</span>
<span style="color: #006600; font-style: italic;">// @description Speaks the number of h2 sections in a Wikipedia article</span>
<span style="color: #006600; font-style: italic;">// @include http://*.wikipedia.org/wiki/*</span>
<span style="color: #006600; font-style: italic;">// @require http://www.json.org/json2.js</span>
<span style="color: #006600; font-style: italic;">// @require http://outfox.googlecode.com/svn/trunk/js/outfox.js</span>
<span style="color: #006600; font-style: italic;">// ==/UserScript==</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// number of major sections</span>
<span style="color: #003366; font-weight: bold;">var</span> sections <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onOutfoxAudioInit<span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// say the number of main sections</span>
    outfox.<span style="color: #660066;">audio</span>.<span style="color: #660066;">say</span><span style="color: #009900;">&#40;</span>sections <span style="color: #339933;">+</span> <span style="color: #3366CC;">' main sections'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// return the parameter for other outfox deferred callbacks</span>
    <span style="color: #000066; font-weight: bold;">return</span> response<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onOutfoxInit<span style="color: #009900;">&#40;</span>version<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> content <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'bodyContent'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// count the number of main sections</span>
    sections <span style="color: #339933;">=</span> content.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'h2'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// take one back for the TOC heading if it's present</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'toc'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #339933;">--</span>sections<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #006600; font-style: italic;">// start the outfox audio service</span>
    <span style="color: #003366; font-weight: bold;">var</span> def <span style="color: #339933;">=</span> outfox.<span style="color: #660066;">startService</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'audio'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    def.<span style="color: #660066;">addCallback</span><span style="color: #009900;">&#40;</span>onOutfoxAudioInit<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// return the parameter for other outfox deferred callbacks</span>
    <span style="color: #000066; font-weight: bold;">return</span> version<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onDOMContentLoaded<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// create a node for outfox use</span>
    <span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>div<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// initialize outfox</span>
    <span style="color: #003366; font-weight: bold;">var</span> def <span style="color: #339933;">=</span> outfox.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span>div<span style="color: #339933;">,</span> JSON.<span style="color: #660066;">stringify</span><span style="color: #339933;">,</span> JSON.<span style="color: #660066;">parse</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    def.<span style="color: #660066;">addCallback</span><span style="color: #009900;">&#40;</span>onOutfoxInit<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// this event triggers execution of the GM script</span>
onDOMContentLoaded<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/outfox-in-greasemonkey-revisited/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Outfoxing Gmail with Greasemonkey</title>
		<link>http://mindtrove.info/outfoxing-gmail-with-greasemonkey/</link>
		<comments>http://mindtrove.info/outfoxing-gmail-with-greasemonkey/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 11:56:21 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[outfox]]></category>
		<category><![CDATA[pgo]]></category>
		<category><![CDATA[speech]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=97</guid>
		<description><![CDATA[NOTE: The code in this post is out-of-date and does not work with recent versions of Outfox. See http://mindtrove.info/outfox-in-greasemonkey-revisited/ for a simpler, more compatible example. If you do update the GMail announcer code so it works with Outfox again, drop me a line and I'll link to your script. Can you remember a time when [...]]]></description>
			<content:encoded><![CDATA[<p><strong>NOTE</strong>: The code in this post is out-of-date and does not work with recent versions of Outfox. See http://mindtrove.info/outfox-in-greasemonkey-revisited/ for a simpler, more compatible example. If you do update the GMail announcer code so it works with Outfox again, drop me a line and I'll link to your script.</p>
<hr />
<p>Can you remember a time when the title of this blog post might have landed me in a straight jacket? Can you believe that was just a few short years ago? Yea, I can't either.</p>
<p>Anyway, Gary's post <a href="http://wwwx.cs.unc.edu/~gb/wp/blog/2008/07/27/outfox-speech-sound-and-more-for-firefox/">Outfox: speech, sound, and more for Firefox</a> talks about a new Firefox extension. He's using it to create cross-platform, self-voicing Web apps for kids with disabilities using a pure JS API. He hopes to extend his work to support alternative input devices such as game pads and switches as the Outfox extension matures and grows more flexible.</p>
<p>One of the other potential uses listed on the <a href="http://code.google.com/p/outfox">Outfox homepage</a> is <i>Adding new I/O to web sites with Greasemonkey</i>. Interesting. It's one thing to include Outfox explicitly in a page, but can it possibly work when injected by GM? What about for a complex app like Gmail with multiple iframes, dynamic changes, refreshing, etc.?</p>
<p>To learn about Outfox (and for fun), I decided to write a quick GM script for Gmail that announces the senders and times of new messages (bold items) in the inbox. (I would have done subject and summary too, but Outfox 0.1.0 appears to have some unicode issues and balked at some of the Gmail separator characters. Less is more at this point.) The script makes the announcement when the Gmail interface first loads, any time Gmail automatically refreshes its inbox view, or when the user clicks the refresh link to check for new mail. It is smart enough to announce a given message only once, however, so you don't hear the same message over and over again on each refresh.</p>
<p>Yes. It does actually work.</p>
<p>To try this script, make sure you have the Greasemonkey 0.8 and Outfox 0.1 extensions installed on Firefox 3. (Or use the latest available version of each.) Then visit the following link to have GM install the script: <a href="/files/gmail_announcer.user.js">gmail_announcer.user.js</a>.</p>
<p>For reference, the entire script is listed below:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// ==UserScript==</span>
<span style="color: #006600; font-style: italic;">// @name Gmail Announcer</span>
<span style="color: #006600; font-style: italic;">// @namespace http://www.mindtrove.info/</span>
<span style="color: #006600; font-style: italic;">// @description Speaks new Gmail inbox messages using Outfox</span>
<span style="color: #006600; font-style: italic;">// @include https://mail.google.com/mail/*</span>
<span style="color: #006600; font-style: italic;">// @include http://mail.google.com/mail/*</span>
<span style="color: #006600; font-style: italic;">// @require http://outfox.googlecode.com/svn/trunk/js/outfox.js</span>
<span style="color: #006600; font-style: italic;">// ==/UserScript==</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> need_say <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> ids <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> sayMessages<span style="color: #009900;">&#40;</span>msgs<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>outfox.<span style="color: #660066;">defaults</span>.<span style="color: #660066;">config</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// outfox really needs a better way to detect ready ...</span>
	need_say <span style="color: #339933;">=</span> msgs<span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> header <span style="color: #339933;">=</span> <span style="color: #3366CC;">'New messages'</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> id <span style="color: #000066; font-weight: bold;">in</span> msgs<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// say all messages</span>
	<span style="color: #003366; font-weight: bold;">var</span> msg <span style="color: #339933;">=</span> msgs<span style="color: #009900;">&#91;</span>id<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> segs <span style="color: #339933;">=</span> msg.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Â»'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> sender <span style="color: #339933;">=</span> segs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> time <span style="color: #339933;">=</span> segs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span>segs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">search</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'â€¦'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>header<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    outfox.<span style="color: #660066;">say</span><span style="color: #009900;">&#40;</span>header<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    header <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	outfox.<span style="color: #660066;">say</span><span style="color: #009900;">&#40;</span>sender <span style="color: #339933;">+</span> <span style="color: #3366CC;">' at '</span> <span style="color: #339933;">+</span> time<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onOutfoxReady<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>need_say<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// say anything already queued</span>
	sayMessages<span style="color: #009900;">&#40;</span>need_say<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ids <span style="color: #339933;">=</span> need_say<span style="color: #339933;">;</span>
	need_say <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onTableChange<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> event.<span style="color: #660066;">target</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> trs <span style="color: #339933;">=</span> div.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> count <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> new_ids <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> curr_ids <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> trs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> tr <span style="color: #339933;">=</span> trs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>tr.<span style="color: #660066;">innerHTML</span>.<span style="color: #660066;">search</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&amp;lt;b&amp;gt;'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #006600; font-style: italic;">// marked as a new message</span>
	    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>ids<span style="color: #009900;">&#91;</span>tr.<span style="color: #660066;">id</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">// never announced</span>
		new_ids<span style="color: #009900;">&#91;</span>tr.<span style="color: #660066;">id</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tr.<span style="color: #660066;">textContent</span><span style="color: #339933;">;</span>
		<span style="color: #339933;">++</span>count<span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span>
	    <span style="color: #006600; font-style: italic;">// curr is announced + new</span>
	    curr_ids<span style="color: #009900;">&#91;</span>tr.<span style="color: #660066;">id</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tr.<span style="color: #660066;">textContent</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// report if we can</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>sayMessages<span style="color: #009900;">&#40;</span>new_ids<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	ids <span style="color: #339933;">=</span> curr_ids<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> 
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onDocumentChange<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">target</span>.<span style="color: #660066;">tagName</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'DIV'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> event.<span style="color: #660066;">target</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> tables <span style="color: #339933;">=</span> div.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'table'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> tables<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #003366; font-weight: bold;">var</span> table <span style="color: #339933;">=</span> tables<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>table.<span style="color: #660066;">id</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>table.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'role'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">// watch just table changes from now on</span>
		<span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> table.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span>
		div.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'DOMNodeInserted'</span><span style="color: #339933;">,</span> onTableChange<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		document.<span style="color: #660066;">removeEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'DOMNodeInserted'</span><span style="color: #339933;">,</span> 
					     onDocumentChange<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">// start outfox</span>
		<span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>div<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		outfox.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span>div<span style="color: #339933;">,</span> onOutfoxReady<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">// kick off initial read manually</span>
		onTableChange<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'target'</span> <span style="color: #339933;">:</span> table.<span style="color: #660066;">parentNode</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'DOMNodeInserted'</span><span style="color: #339933;">,</span> onDocumentChange<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/outfoxing-gmail-with-greasemonkey/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rich Audio MUDs</title>
		<link>http://mindtrove.info/rich-audio-muds/</link>
		<comments>http://mindtrove.info/rich-audio-muds/#comments</comments>
		<pubDate>Fri, 30 May 2008 01:44:15 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[games]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=55</guid>
		<description><![CDATA[Gary has mentioned that sound adventure games like Descent into Madness and The Last Crusade have served as effective rewards in some local schools. Kids with visual impairments work hard in order to earn time playing them. I've been brainstorming a bit about open-ended multi-user dungeons (MUDs) with rich sound and speech. Gary thinks it [...]]]></description>
			<content:encoded><![CDATA[<p>Gary has mentioned that sound adventure games like <a href="http://www.cs.unc.edu/Research/assist/et/2005/SoundsLikeFun.html">Descent into Madness</a>   and <a href="http://www.cs.unc.edu/Research/assist/et/projects/RPG/TheLastCrusade.htm">The Last Crusade</a> have served as effective rewards in some local schools. Kids with visual impairments work hard in order to earn time playing them.</p>
<p>I've been brainstorming a bit about open-ended multi-user dungeons (MUDs) with rich sound and speech. Gary thinks it would be beneficial to use the MUD for educational purposes, not just as a reward after the work is done. I tend to agree, as long as its easy for teachers, older students, parents, and so on to translate lessons into in-game puzzles and adventures.</p>
<p>Here are some ideas I think could go into such a system to make it fun and rewarding for the kids, and an interesting platform for games.</p>
<ul>
<li>Rooms and items. A simple setup including the entire dungeon, rooms with arbitrary connections, items in rooms, and users in rooms can should account for a large number of adventure game designs.</li>
<li>A basic command set. Take, drop, give, use, go, and a few other very simple commands can be supported everywhere to let the user navigate and interact with the environment.</li>
<li>An extensible parser. Items can define additional supported commands, even to the extent where the become...</li>
<li>In-world games. To go beyond exploring rooms, picking up items, and using items, items and rooms themselves can become full games. Imagine a puzzle game as an item or a room where everyone is participating in a guessing game.</li>
<li>Other input methods. Items can reconfigure the keyboard to support simpler methods of interaction. For example, an multiple choice game might require only use of the arrow keys instead of requiring the user to enter full sentences. A game might enable other devices too (e.g., DDR pad).
<li>A rich audio client. Most MUD clients are text-only. When used with a screen reader, the game experience is entirely spoken. With a custom client, the game logic can provide responses the client renders as speech and sound in any number of streams.</li>
<li>A client/server configuration over XMPP. The dungeon lives on a server, though not necessarily the same machine as the XMPP server. Instead, it's just another XMPP client with a well known JID. A bot of sorts. The rooms and items can be objects managed by that bot, or even become other bots themselves. The dungeon can exist across multiple machines.</li>
<li>Collaboration. Rooms in the dungeon are like chat rooms where some text entered in the client is broadcast to everyone, and other commands are addressed to items in rooms. Going beyond simple text, clients could implement XMPP Jingle to support voice chat.</li>
</ul>
<p>Is anyone working on a similar project? Heard of a similar project?</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/rich-audio-muds/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Accessibility Daily</title>
		<link>http://mindtrove.info/accessibility-daily/</link>
		<comments>http://mindtrove.info/accessibility-daily/#comments</comments>
		<pubDate>Mon, 19 May 2008 11:29:47 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[pgo]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=50</guid>
		<description><![CDATA[David informed me that he doesn't have the cycles to maintain his Accessible Planet site. As I've gotten some comments from people interested in an a11y news aggregator, I went on the hunt again for a solution. Gary came up with an interesting idea: create a shared Google Reader aggregate feed. The result is something very [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mindforks.blogspot.com/">David</a> informed me that he doesn't have the cycles to maintain his <a href="http://aplanet.atrc.utoronto.ca/">Accessible Planet</a> site. As I've gotten some comments from people interested in an a11y news aggregator, I went on the hunt again for a solution.</p>
<p><a href="http://wwwx.cs.unc.edu/~gb/wp/">Gary</a> came up with an interesting idea: create a shared Google Reader aggregate feed. The result is something very much like a Planet instance, but with Google doing the aggregation and hosting. I added most of the feed URLs from David's existing site, slapped a subdomain together to (partially) hide the big, ugly Google permalink, and voila: <a href="http://a11y.mindtrove.info">Accessibility Daily</a>.</p>
<p>I'd like to give it a test run as an alternative to a Planet for now. Feel free to subscribe to the Atom feed or visit the HTML page. If you'd like your site listed, post a comment or shoot me an email with a link to your feed (preferably one that includes accessibility related news only).</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/accessibility-daily/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Planet Accessibility</title>
		<link>http://mindtrove.info/planet-accessibility/</link>
		<comments>http://mindtrove.info/planet-accessibility/#comments</comments>
		<pubDate>Sat, 17 May 2008 04:18:55 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[pgo]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=48</guid>
		<description><![CDATA[Would anyone be interested in a Planet site specifically for accessibility blogs? I believe I would find it useful in keeping up with accessibility related development and news instead of hunting through mailing lists, newsgroups, blogs, and other Planets. But would anyone else benefit? Let me know if you're interested. I will volunteer time, effort, [...]]]></description>
			<content:encoded><![CDATA[<p>Would anyone be interested in a <a href="http://www.planetplanet.org/">Planet</a> site specifically for accessibility blogs? I believe I would find it useful in keeping up with accessibility related development and news instead of hunting through mailing lists, newsgroups, blogs, and other Planets. But would anyone else benefit?</p>
<p>Let me know if you're interested. I will volunteer time, effort, and maybe even hosting (if necessary) if public interest reaches some critical mass.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/planet-accessibility/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Oh! The places you&#8217;ll go!</title>
		<link>http://mindtrove.info/oh-the-places-youll-go/</link>
		<comments>http://mindtrove.info/oh-the-places-youll-go/#comments</comments>
		<pubDate>Mon, 18 Jun 2007 01:00:20 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Banter]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[accerciser]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[ibm]]></category>
		<category><![CDATA[lsr]]></category>

		<guid isPermaLink="false">http://pithy.tumblr.com/post/3722391</guid>
		<description><![CDATA[For those who read this, I’m not longer working on GNOME accessibility projects for IBM. I’ve been transfered to the QEDWiki project, and may or may not have accessibility duties in the long run, but possibly some in the short term. Nevertheless, I’m writing up some final documentation on LSR in hope that someone will [...]]]></description>
			<content:encoded><![CDATA[<p>For those who read this, I’m not longer working on GNOME accessibility projects for IBM. I’ve been transfered to the <a href="http://www.youtube.com/watch?v=ckGfhlZW0BY">QEDWiki</a> project, and may or may not have accessibility duties in the long run, but possibly some in the short term.</p>
<p>Nevertheless, I’m writing up some final documentation on LSR in hope that someone will find it useful:</p>
<ol>
<li>A <a href="http://www.gnome.org/~parente/lsr/pguide/">patterns document</a> stating ways to solve different problems using the existing Perk scripting sytem.</li>
<li>A <a href="http://www.gnome.org/~parente/lsr/retro">LSR in retrospect document</a> starting what I would change, if I were starting over again today</li>
</ol>
<p>I may work on making the latter changes myself in my spare time. I can see some usefulness is having a basic accessibility engine which I can use to script certain desktop actions or speech enable specific applications. For instance, maybe I want to listen to changes in a particular window (e.g. console with tail -f running, gaim chat window). Maybe I want some pre-recorded macros that perform a specific set of actions across applications that do not make their models public through dbus or another API. Or maybe I want a small toolbox window to augment an application with functions that aren’t immediately available in its toolbar.<br/>
<p>I still plan on contributing to GNOME accessibility. I have some patches outstanding for pygtk that will allow widgets drawn with pycairo to become visible to AT-SPI clients (e.g. Orca, Accerciser, GOK). I just have to find time to work on them.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/oh-the-places-youll-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
