<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>0xDECAFBAD - Tag: outliners</title>
    <link href="http://decafbad.com/blog/atom.xml" rel="self"/>
    <link href="http://decafbad.com/blog"/>
    <updated>2011-11-16T16:29:50+00:00</updated>
    <id></id>
    <author>
        <name></name>
        <email>l.m.orchard@pobox.com</email>
    </author>
    

    <entry>
        <title>HTML5 drag and drop in Firefox 3.5</title>
        <link href="http://decafbad.com/blog/2009/07/15/html5-drag-and-drop"/>
        <updated>2009-07-15T15:26:40+00:00</updated>
        <id>http://decafbad.com/blog/2009/07/15/html5-drag-and-drop</id>
        <content type="html">&lt;p&gt;&lt;i&gt;
Oh hey, look! It's another blog post—and this one
&lt;a href=&quot;http://hacks.mozilla.org/2009/07/html5-drag-and-drop/&quot;&gt;is cross-posted on hacks.mozilla.com&lt;/a&gt;.
I won't say this is the start of a renewed blogging habit, but let's see what happens.
&lt;/i&gt;&lt;/p&gt;






&lt;div id=&quot;introduction&quot;&gt;
    &lt;p&gt;
        Drag and drop is one of the most fundamental interactions
        afforded by graphical user interfaces.  In one gesture, it
        allows users to pair the selection of an object with the
        execution of an action, often including a second object in the
        operation.  It's a simple yet powerful UI concept used to
        support copying, list reordering, deletion (ala the Trash / Recycle Bin),
        and even the creation of link relationships.
    &lt;/p&gt;&lt;p&gt;
        Since it's so fundamental, offering drag and drop in web
        applications has been a no-brainer ever since browsers first
        offered mouse events in DHTML.  But, although
        &lt;code&gt;mousedown&lt;/code&gt;, &lt;code&gt;mousemove&lt;/code&gt;, and
        &lt;code&gt;mouseup&lt;/code&gt; made it possible, the implementation has been
        limited to the bounds of the browser window.  Additionally,
        since these events refer only to the object being dragged,
        there's a challenge to find the subject of the drop when
        the interaction is completed.
    &lt;/p&gt;&lt;p&gt;

        Of course, that doesn't prevent most modern JavaScript
        frameworks from abstracting away most of the problems and
        throwing in some flourishes while they're at it.  But, wouldn't
        it be nice if browsers offered first-class support for drag and
        drop, and maybe even extended it beyond the window sandbox?
    &lt;/p&gt;&lt;p&gt;
        As it turns out, this very wish is answered by the HTML 5 specification 
        &lt;a target=&quot;_new&quot; href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#dnd&quot;&gt;section on new drag-and-drop events&lt;/a&gt;, and 
        &lt;a target=&quot;_new&quot; href=&quot;https://developer.mozilla.org/En/DragDrop/Drag_and_Drop&quot;&gt;Firefox 3.5 includes an implementation&lt;/a&gt; of those events.
    &lt;/p&gt;&lt;p&gt;
        If you want to jump straight to the code, I've put together 
        &lt;a target=&quot;_new&quot; target=&quot;_new&quot; target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/api-demos.html&quot;&gt;some simple demos&lt;/a&gt; 
        of the new events.  
    &lt;/p&gt;&lt;p&gt;

        I've even scratched an itch of my own and
        built &lt;a target=&quot;_new&quot; target=&quot;_new&quot; target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/outline.html&quot;&gt;the beginnings of an outline editor&lt;/a&gt;,
        where every draggable element is also a drop target—of which
        there could be dozens to hundreds in a complex document, something
        that gave me some minor hair-tearing moments in the past
        while trying to make do with plain old mouse events.
    &lt;/p&gt;&lt;p&gt;
        And, all the above can be downloaded or cloned from 
        &lt;a href=&quot;http://github.com/lmorchard/fx35-drag-and-drop&quot;&gt;a GitHub repository&lt;/a&gt;
        I've created especially for this article—which continues after the jump.
    &lt;/p&gt;
&lt;/div&gt;




&lt;!--more--&gt;




&lt;div id=&quot;events&quot;&gt;

    &lt;h2&gt;The New Drag and Drop Events&lt;/h2&gt;
    &lt;p&gt;
        So, with no further ado, here are the new drag and drop events,
        in roughly the order you might expect to see them fired:
    &lt;/p&gt;
    &lt;dl&gt;
        &lt;dt&gt;&lt;code&gt;dragstart&lt;/code&gt;&lt;/dt&gt;
        &lt;dd&gt;
            A drag has been initiated, with the dragged element as the
            event target.
        &lt;/dd&gt;

        &lt;dt&gt;&lt;code&gt;drag&lt;/code&gt;&lt;/dt&gt;
        &lt;dd&gt;
            The mouse has moved, with the dragged element as the event target.
        &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;dragenter&lt;/code&gt;&lt;/dt&gt;
        &lt;dd&gt;
            The dragged element has been moved into a drop listener,
            with the drop listener element as the event target.
        &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;dragover&lt;/code&gt;&lt;/dt&gt;

        &lt;dd&gt;
            The dragged element has been moved over a drop listener,
            with the drop listener element as the event target.  Since
            the default behavior is to cancel drops, returning
            &lt;code&gt;false&lt;/code&gt; or calling &lt;code&gt;preventDefault()&lt;/code&gt; in
            the event handler indicates that a drop is allowed here.
        &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;dragleave&lt;/code&gt;&lt;/dt&gt;
        &lt;dd&gt;
            The dragged element has been moved out of a drop listener,
            with the drop listener element as the event target.
        &lt;/dd&gt;

        &lt;dt&gt;&lt;code&gt;drop&lt;/code&gt;&lt;/dt&gt;
        &lt;dd&gt;
            The dragged element has been successfully dropped on a drop
            listener, with the drop listener element as the event
            target.
        &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;dragend&lt;/code&gt;&lt;/dt&gt;
        &lt;dd&gt;
            A drag has been ended, successfully or not, with the
            dragged element as the event target.
        &lt;/dd&gt;
    &lt;/dl&gt;

    &lt;p&gt;
        Like the mouse events of yore, listeners can be attached to
        elements using &lt;code&gt;addEventListener()&lt;/code&gt; 
        directly or by way of your favorite JS library.  
    &lt;/p&gt;&lt;p&gt;
        Consider the following example using jQuery, 
        &lt;a target=&quot;_new&quot; target=&quot;_new&quot; target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/api-demos.html#newschool&quot;&gt;also available as a live demo&lt;/a&gt;:
    &lt;/p&gt;
    &lt;pre lang=&quot;javascript&quot; line=&quot;1&quot;&gt;
&lt;div id=&quot;newschool&quot;&gt;
    &lt;div class=&quot;dragme&quot;&gt;Drag me!&lt;/div&gt;
    &lt;div class=&quot;drophere&quot;&gt;Drop here!&lt;/div&gt;
&lt;/div&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
    $(document).ready(function() {
        $('#newschool .dragme')
            .attr('draggable', 'true')
            .bind('dragstart', function(ev) {
                var dt = ev.originalEvent.dataTransfer;
                dt.setData(&quot;Text&quot;, &quot;Dropped in zone!&quot;);
                return true;
            })
            .bind('dragend', function(ev) {
                return false;
            });
        $('#newschool .drophere')
            .bind('dragenter', function(ev) {
                $(ev.target).addClass('dragover');
                return false;
            })
            .bind('dragleave', function(ev) {
                $(ev.target).removeClass('dragover');
                return false;
            })
            .bind('dragover', function(ev) {
                return false;
            })
            .bind('drop', function(ev) {
                var dt = ev.originalEvent.dataTransfer;
                alert(dt.getData('Text'));
                return false;
            });
    });
&lt;/script&gt;
    &lt;/pre&gt;
    &lt;p&gt;
        Thanks to the new events and jQuery, this example is both short
        and simple—but it packs in a lot of functionality, as the rest
        of this article will explain.  
    &lt;/p&gt;&lt;p&gt;
        Before moving on, there are at least three things about the above
        code that are worth mentioning:
    &lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;

            &lt;p&gt;
                Drop targets are enabled by virtue of having
                listeners for drop events.  But, 
                &lt;a target=&quot;_new&quot; href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#drag-and-drop-processing-model&quot;&gt;per the HTML 5 spec&lt;/a&gt;,
                draggable elements need an
                attribute of &lt;code&gt;draggable=&quot;true&quot;&lt;/code&gt;, set either in
                markup or in JavaScript.  
            &lt;/p&gt;
            &lt;p&gt;
                Thus, &lt;code&gt;$('#newschool&amp;nbsp;.dragme').attr('draggable', 'true')&lt;/code&gt;.
            &lt;/p&gt;

        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;
                The original DOM event (as opposed to jQuery's event
                wrapper) offers a property called &lt;code&gt;dataTransfer&lt;/code&gt;.
                Beyond just manipulating elements, the new drag and drop
                events accomodate the transmission of user-definable data
                during the course of the interaction.  
            &lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;p&gt;

                Since these are first-class events, you can apply 
                &lt;a target=&quot;_new&quot; href=&quot;http://icant.co.uk/sandbox/eventdelegation/&quot;&gt;the technique of Event Delegation&lt;/a&gt;.
            &lt;/p&gt;&lt;p&gt;
                What's that?  Well, imagine you have a list of 1000
                list items—as part of a deeply-nested outline document,
                for instance.  Rather than needing to attach listeners
                or otherwise fiddle with all 1000 items, simply attach
                a listener to the parent node (eg. the
                &lt;code&gt;&lt;ul&gt;&lt;/code&gt; element) and all events from
                the children will propagate up to the single parent listener.
                As a bonus, all new child elements added after page
                load will enjoy the same benefits.
            &lt;/p&gt;&lt;p&gt;
                &lt;a target=&quot;_new&quot; target=&quot;_new&quot; target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/api-demos.html#delegated&quot;&gt;Check out this demo&lt;/a&gt;, 
                and 
                &lt;a target=&quot;_new&quot; target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/js/drag-delegated.js&quot;&gt;the associated JS code&lt;/a&gt; 
                to see more about these events and Event Delegation.
            &lt;/p&gt;

        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;




&lt;div id=&quot;datatransfer&quot;&gt;
    &lt;h2&gt;Using dataTransfer&lt;/h2&gt;
    &lt;p&gt;
        As mentioned in the last section, the new drag and drop events
        let you send data along with a dragged element.  But, it's even
        better than that:  Your drop targets can receive data
        transferred by content objects dragged into the window from 
        other browser windows, and even &lt;i&gt;other applications&lt;/i&gt;.
    &lt;/p&gt;&lt;p&gt;

        Since the example is a bit longer,  
        &lt;a target=&quot;_new&quot; target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/api-demos.html#data_transfer&quot;&gt;check out the live demo&lt;/a&gt;
        and 
        &lt;a target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/js/drag-datatransfer.js&quot;&gt;associated code&lt;/a&gt;
        to get an idea of what's possible with &lt;code&gt;dataTransfer&lt;/code&gt;.
    &lt;/p&gt;&lt;p&gt;
        In a nutshell, the stars of this show are the
        &lt;code&gt;setData()&lt;/code&gt; and &lt;code&gt;getData()&lt;/code&gt; methods of
        the &lt;code&gt;dataTransfer&lt;/code&gt; property exposed by the Event object.
    &lt;/p&gt;

    &lt;p&gt;
        The &lt;code&gt;setData()&lt;/code&gt; method is typically called in the 
        &lt;code&gt;dragstart&lt;/code&gt; listener, loading &lt;code&gt;dataTransfer&lt;/code&gt;
        up with one or more strings of content with associated
        &lt;a href=&quot;https://developer.mozilla.org/En/DragDrop/Recommended_Drag_Types#link&quot;&gt;recommended content types&lt;/a&gt;.
    &lt;/p&gt;

    &lt;p&gt;
        For illustration, here's a quick snippet from the example code:
    &lt;/p&gt;
    &lt;pre lang=&quot;javascript&quot; line=&quot;1&quot;&gt;
var dt = ev.originalEvent.dataTransfer;    
dt.setData('text/plain', $('#logo').parent().text());
dt.setData('text/html', $('#logo').parent().html());
dt.setData('text/uri-list', $('#logo')[0].src);
    &lt;/pre&gt;
    &lt;/p&gt;&lt;p&gt;
        On the other end, &lt;code&gt;getData()&lt;/code&gt; allows you to query
        for content by type (eg. &lt;code&gt;text/html&lt;/code&gt; followed by
        &lt;code&gt;text/plain&lt;/code&gt;).  This, in turn, allows you to decide
        on acceptable content types at the time of the
        &lt;code&gt;drop&lt;/code&gt; event or even during &lt;code&gt;dragover&lt;/code&gt;

        to offer feedback for unacceptable types during the drag.
    &lt;/p&gt;&lt;p&gt;
        Here's another example from the receiving end of the example code:
    &lt;/p&gt;
    &lt;pre lang=&quot;javascript&quot; line=&quot;1&quot;&gt;
var dt = ev.originalEvent.dataTransfer;    
$('.content_url .content').text(dt.getData('text/uri-list'));
$('.content_text .content').text(dt.getData('text/plain'));
$('.content_html .content').html(dt.getData('text/html'));
    &lt;/pre&gt;
    &lt;p&gt;
        Where &lt;code&gt;dataTransfer&lt;/code&gt; really shines, though, is that
        it allows your drop targets to receive content from 
        sources outside your defined draggable elements and even from
        outside the browser altogether.  Firefox accepts such drags, 
        and attempts to populate &lt;code&gt;dataTransfer&lt;/code&gt; with
        appropriate content types extracted from the external object.
    &lt;/p&gt;&lt;p&gt;

        Thus, you could select some text in a word processor window and
        drop it into one of your elements, and at least expect to find
        it available as &lt;code&gt;text/plain&lt;/code&gt; content.  
    &lt;/p&gt;&lt;p&gt;
        You can also select content in 
        another browser window, and expect to see &lt;code&gt;text/html&lt;/code&gt;
        appear in your events.  Check out the 
        &lt;a target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/outline.html&quot;&gt;outline editing demo&lt;/a&gt;
        and see what happens when you try dragging various elements 
        (eg. images, tables, and lists) and highlighted content from
        other windows onto the items there.
    &lt;/p&gt;

&lt;/div&gt;




&lt;div id=&quot;dragfeedback&quot;&gt;
    &lt;h2&gt;Using Drag Feedback Images&lt;/h2&gt;
    &lt;p&gt;
       An important aspect of the drag and drop interaction is a
       representation of the thing being dragged.  By default in
       Firefox, this is a &quot;ghost&quot; image of the dragged element itself.  But,
       the &lt;code&gt;dataTransfer&lt;/code&gt; property of the original Event
       object exposes the method &lt;code&gt;setDragImage()&lt;/code&gt; for use
       in customizing this representation.
    &lt;/p&gt;&lt;p&gt;

        There's
        &lt;a target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/api-demos.html#feedback_image&quot;&gt;a live demo&lt;/a&gt; of this feature, as well as
        &lt;a target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/js/drag-feedback-images.js&quot;&gt;associated JS code&lt;/a&gt; 
        available.  The gist, however, is sketched out in these code snippets:
    &lt;/p&gt;
    &lt;pre lang=&quot;javascript&quot; line=&quot;1&quot;&gt;
var dt = ev.originalEvent.dataTransfer;    

dt.setDragImage( $('#feedback_image h2')[0], 0, 0);

dt.setDragImage( $('#logo')[0], 32, 32); 

var canvas = document.createElement(&quot;canvas&quot;);
canvas.width = canvas.height = 50;

var ctx = canvas.getContext(&quot;2d&quot;);
ctx.lineWidth = 8;
ctx.moveTo(25,0);
ctx.lineTo(50, 50);
ctx.lineTo(0, 50);
ctx.lineTo(25, 0);
ctx.stroke();

dt.setDragImage(canvas, 25, 25);
    &lt;/pre&gt;
    &lt;p&gt;
        You can supply a DOM node as the first parameter to 
        &lt;code&gt;setDragImage()&lt;/code&gt;, which includes everything from
        text to images to &lt;code&gt;canvas&lt;/code&gt; elements.  The
        second two parameters indicate at what left and top offset
        the mouse should appear in the image while dragging.
    &lt;/p&gt;&lt;p&gt;

        For example, since the &lt;code&gt;#logo&lt;/code&gt; image is 64x64,
        the parameters in the second &lt;code&gt;setDragImage()&lt;/code&gt;
        method places the mouse right in the center of the image.
        On the other hand, the first call positions the feedback
        image such that the mouse rests in the upper left corner.
    &lt;/p&gt;&lt;p&gt;
    &lt;/p&gt;
&lt;/div&gt;




&lt;div id=&quot;dragfeedback&quot;&gt;

    &lt;h2&gt;Using Drop Effects&lt;/h2&gt;
    &lt;p&gt;
        As mentioned at the start of this article, the drag and drop
        interaction has been used to support actions such as copying,
        moving, and linking.  Accordingly, the HTML 5 specification 
        accomodates these operations in the form of the 
        &lt;code&gt;effectAllowed&lt;/code&gt; and &lt;code&gt;dropEffect&lt;/code&gt;
        properties exposed by the Event object.
    &lt;/p&gt;
    &lt;p&gt;

        For a quick fix, check out the
        &lt;a target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/api-demos.html#drag_effects&quot;&gt;a live demo&lt;/a&gt; 
        of this feature, as well as the
        &lt;a target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/js/drag-effects.js&quot;&gt;associated JS code&lt;/a&gt;.
    &lt;/p&gt;&lt;p&gt;
        The basic idea is that the &lt;code&gt;dragstart&lt;/code&gt; event
        listener can set a value for &lt;code&gt;effectAllowed&lt;/code&gt; like so:
    &lt;/p&gt;

    &lt;pre lang=&quot;javascript&quot; line=&quot;1&quot;&gt;
var dt = ev.originalEvent.dataTransfer;
switch (ev.target.id) {
    case 'effectdrag0': dt.effectAllowed = 'copy'; break;
    case 'effectdrag1': dt.effectAllowed = 'move'; break;
    case 'effectdrag2': dt.effectAllowed = 'link'; break;
    case 'effectdrag3': dt.effectAllowed = 'all'; break;
    case 'effectdrag4': dt.effectAllowed = 'none'; break;
}
    &lt;/pre&gt;
    &lt;p&gt;The choices available for this property include the following:&lt;/p&gt;
    &lt;dl&gt; 
        &lt;dt&gt;&lt;code&gt;none&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;no operation is permitted &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;copy&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;copy only &lt;/dd&gt;

        &lt;dt&gt;&lt;code&gt;move&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;move only &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;link&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;link only &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;copyMove&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;copy or move only &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;copyLink&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;copy or link only &lt;/dd&gt;
        &lt;dt&gt;&lt;code&gt;linkMove&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;link or move only &lt;/dd&gt;

        &lt;dt&gt;&lt;code&gt;all&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;copy, move, or link &lt;/dd&gt;
    &lt;/dl&gt;
    &lt;p&gt;
        On the other end, the &lt;code&gt;dragover&lt;/code&gt; event listener 
        can set the value of the
        &lt;code&gt;dropEffect&lt;/code&gt; property to indicate the expected effect
        invoked on a successful drop.  If the value does
        not match up with &lt;code&gt;effectAllowed&lt;/code&gt;, the drop will
        be considered cancelled on completion.
    &lt;/p&gt;&lt;p&gt;

        In the 
        &lt;a target=&quot;_new&quot; href=&quot;http://decafbad.com/2009/07/drag-and-drop/api-demos.html#drag_effects&quot;&gt;a live demo&lt;/a&gt;,
        you should be able to see that only elements with matching
        effects can be dropped into the appropriate drop zones.  This
        is accomplished with code like the following:
    &lt;/p&gt;
    &lt;pre lang=&quot;javascript&quot; line=&quot;1&quot;&gt;
var dt = ev.originalEvent.dataTransfer;
switch (ev.target.id) {
    case 'effectdrop0': dt.dropEffect = 'copy'; break;
    case 'effectdrop1': dt.dropEffect = 'move'; break;
    case 'effectdrop2': dt.dropEffect = 'link'; break;
    case 'effectdrop3': dt.dropEffect = 'all'; break;
    case 'effectdrop4': dt.dropEffect = 'none'; break;
}
    &lt;/pre&gt;
    &lt;p&gt;
        Although the OS itself can provide some feedback, you 
        can also use these properties to update your own visible 
        feedback, both on the dragged element and on the drop zone
        itself.
    &lt;/p&gt;

&lt;/div&gt;




&lt;div id=&quot;conclusion&quot;&gt;
    &lt;h2&gt;Conclusion&lt;/h2&gt;
    &lt;p&gt;
        The new first-class drag and drop events in HTML5 and Firefox
        make supporting this form of UI interaction simple, concise,
        and powerful in the browser.  But beyond the new simplicity of
        these events, the ability to transfer content between
        applications opens brand new avenues for web-based applications
        and collaboration with desktop software in general.
    &lt;/p&gt;&lt;p&gt;
    &lt;/p&gt;&lt;p&gt;
    &lt;/p&gt;
&lt;/div&gt;




&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090962&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://lmframework.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=03dc722b1852367f02b0b21f02b10675&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://lmframework.com&quot;&gt;David Semeria&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090962&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-16T17:56:52&quot;&gt;2009-07-16T17:56:52&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Wow - thanks for a great introduction to D+D in HTML 5, I'm really looking forward to giving it a thorough road test. &lt;/p&gt;

&lt;p&gt;The key part of the implementation are the target listeners, because, as I'm sure you're aware, onmouseover would historically never fire over the target element because the dragged item would always 'cover it up'. BTW, my proposed solution was to add an 'event transparency' property, which would have made the dragged item invisible from the point of view of selected events, eg onmouseover.&lt;/p&gt;

&lt;p&gt;This implementation is going to take a lot of pain away. You have no idea how many hoops I had to jump through to get a fully generic D+D implementation working without these new calls.&lt;/p&gt;

&lt;p&gt;If you're interested, you can see it working here: http://lmframework.com/page.php?id=vd_twig_short_2&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090964&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=cee7ac3f63d7e8c1367e170bec302c14&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Alex&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090964&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-17T00:13:23&quot;&gt;2009-07-17T00:13:23&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Hey,&lt;/p&gt;

&lt;p&gt;Looks great and useful article.  For dragging from external applications (such as the Desktop) is a normal webpage able to get the data from the drop?  I was just playing with it and seem to always get what seems to be a security error with getData or mozGetDataAt.  However, the documentation seems to state that on drop that data should be made available to the page.  Likewise, in the same way an image can be dragged off the page onto the desktop, can an arbitrary element be dragged onto the desktop with whatever file content to be saved?  Thanks for the help.&lt;/p&gt;

&lt;p&gt;Alex&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090966&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://paulisageek.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=b3bb70a4bace7f9bd49f48b149ab95f9&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://paulisageek.com/&quot;&gt;Paul Tarjan&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090966&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-17T04:52:54&quot;&gt;2009-07-17T04:52:54&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Very nice, I didn't know that FF 3.5 actually had this implemented. Time to start playing :)&lt;/p&gt;

&lt;p&gt;Also, how did you do your code posts? Was it just pasting in HTML or do you have a better setup?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090967&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=066d1e75c9b938053ee6b3d48b1c0f6a&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Animal&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090967&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-17T14:35:21&quot;&gt;2009-07-17T14:35:21&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Seems pretty pointless pressing ahead with this when you just can't write a web app to use it. There's no support. All a bunch of whizzy fun I'm sure, but sod-all use.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090969&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090969&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-17T16:23:10&quot;&gt;2009-07-17T16:23:10&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@Animal: Why can't you write a web app to use it?  It's in the HTML5 spec, works in Fx3.5 and Safari 4 / WebKit.  It doesn't have universal support yet, or course, but new standards never do.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090970&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.crearedesign.co.uk&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=87bf21798e390d9043dda7240c1b60f7&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.crearedesign.co.uk&quot;&gt;paul&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090970&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-21T08:08:26&quot;&gt;2009-07-21T08:08:26&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;very nice indeed! i like this, it has definitely opened up new avenues for interaction without using flash. but it will take time before people upgrade to the new browser. a lot of people who browse the web wont realise what the technology will bring and will use their current browser because it does the job!&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090971&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=04de859cfd6ef0b75e4ea3cbea143190&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Joel&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090971&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-21T14:36:04&quot;&gt;2009-07-21T14:36:04&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Excellent demos of the new features.&lt;/p&gt;

&lt;p&gt;When using a feedback image on a zoomed in page, should the image not also be scaled up automatically?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090973&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=41708&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=6d3bf986abdbb431991c3b02eb6e2335&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=41708&quot;&gt;RenegadeX&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090973&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-22T04:13:46&quot;&gt;2009-07-22T04:13:46&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Dragging &amp;amp; dropping &lt;em&gt;is&lt;/em&gt; as you say, a &quot;one of the most fundamental interations&quot; that users of computer graphical interfaces have come to know, and expect.&lt;/p&gt;

&lt;p&gt;It therefore completes dumbfounds me how it is that we &lt;em&gt;still&lt;/em&gt; can not natively drag &amp;amp; scroll (&amp;amp; then drop) in Firefox. We can only drag &amp;amp; drop an item within the currently visible portion of a Firefox webpage or tab, no further up, no further down.&lt;/p&gt;

&lt;p&gt;That is should be limited makes absolutely no sense. Microsoft built the function into their Windows 3.x (file) Explorer, and then when visual browsers came along, naturally carried it through into Internet Explorer. &lt;/p&gt;

&lt;p&gt;Firefox Bug 41708, &quot;Should be able to scroll in the viewport while dragging&quot; was opened in June, 2000 (yes, 9 years ago!) and remains open, and is disregarded by Firefox developers as little more than a trivial little annoyance, and therefore is and should be treated as a low-importance 'enhancement' rather than as the 'standard feature' it should really be.&lt;/p&gt;

&lt;p&gt;If it weren't for the extension 'DragToScroll', which has been around for 3-1/2 years now (not updated in a long time but still works if you override version compatibility), I would have dumped Firefox and switched to a different browser (Maxthon 3, most likely).&lt;/p&gt;

&lt;p&gt;So, I'm wondering (and hoping) -- does the new HTML5 drag and drop specification include anything that if implemented properly would make it possible to scroll &amp;amp; drag?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090974&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090974&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-22T13:57:42&quot;&gt;2009-07-22T13:57:42&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@RenegadeX: Ugh.  I don't work on the browser itself, but I noticed that unexpected behavior on drag &amp;amp; drop.  The window really should scroll when you get toward the top or bottom while dragging - and, in fact, most pre-HTML5 JS frameworks do that in their own drag &amp;amp; drop abstractions.  &lt;/p&gt;

&lt;p&gt;Until / unless Firefox gets this fixed, the same sort of auto-scrolling could be hacked in to HTML5 drag and drop.  Not perfect, but it's doable.  That is, in the drag event, you can check if the mouse is near the upper or lower edge of the viewport - and if so, start scrolling appropriately. That's pretty much how the JS frameworks do it with old-school D&amp;D&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090975&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.copperbot.net&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=df48b2c2a3a2be51b1e15f10c5fb05da&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.copperbot.net&quot;&gt;CopperBot&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090975&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-23T21:41:07&quot;&gt;2009-07-23T21:41:07&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Very cool article! Thanks for sharing. HTML5 really is going to change everything about how we use and develop for the web. Pretty awesome!&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090976&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.AmnesiaGames.cl&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=14ad888c23e28c85c222a73b6c633570&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.AmnesiaGames.cl&quot;&gt;Alexos&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090976&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-26T05:05:44&quot;&gt;2009-07-26T05:05:44&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Hi, would DD work for uploading files? How can I display a progress bar?
Thanks! 
I've been looking for that several days, and found only applets which I can't use in my proyect :-)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090977&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.sjlwebdesign.co.uk&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=185cd965e0e8ccd15df2f90977cbeaf3&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.sjlwebdesign.co.uk&quot;&gt;Sam&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090977&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-28T13:54:26&quot;&gt;2009-07-28T13:54:26&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Looks fantastic, going to try it out now (once I have upgraded my FF)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090978&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.dankantor.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=60fc8331f617fc905fd682bc4f41ce8d&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.dankantor.com&quot;&gt;Dan Kantor&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090978&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-07-30T03:10:25&quot;&gt;2009-07-30T03:10:25&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Looks like effectAllowed and dropEffect are not working for FF 3.5 on the Mac. I see effects on Windows and Safari 4 on Mac. I've been playing around with adding borders to the drop target, but the + icon for copy really helps a lot. Hopefully Mozilla will fix this next update.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090979&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.thecssninja.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=8677c9f7c0f6d947bf318c1430d00bfd&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.thecssninja.com/&quot;&gt;Ryan&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090979&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-09-01T02:33:06&quot;&gt;2009-09-01T02:33:06&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Great article it's good to see developments in this area. I wrote an article on the further extensions Firefox 3.6 has done with the dataTransfer method by adding the file attribute so you can access local files and upload them without the need for file inputs. http://www.thecssninja.com/javascript/drag-and-drop-upload&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090982&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=1ed4bbef573bfc014d32356d53103ca2&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;phil swenson&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090982&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-09-03T22:58:36&quot;&gt;2009-09-03T22:58:36&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Why not a first class WYSIWYG rich text editor with copy from clipboard image support?  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;NO ONE&lt;/em&gt; has built a decent text editor in JavaScript - At least not that I've seen.  And browsers don't allow image paste for reasons I don't understand.  &lt;/p&gt;

&lt;p&gt;And by decent I mean just like you'd get in textmate or another editor.  Have the standard text editor features everyone expects:  tab, select indent/select unindent, resize image, home, end, duplicate line, delete line, styling, etc.&lt;/p&gt;

&lt;p&gt;would push the browser to the next level in killing the desktop.  non-techies hate wikis.  They want a real editor.  I do too actually.... would be great for forums, bug tracking system (imagine pasting screen shots in line with your bug desc), email, etc.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090983&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=deed51cddc830e162557b8f01383a057&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Jean-Denis&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090983&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-09-04T00:23:39&quot;&gt;2009-09-04T00:23:39&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Francisco Tomalski wrote up a nice piece on HTML 5 drag'n drop at http://www.alertdebugging.com/2009/08/16/on-html-5-drag-and-drop/&lt;/p&gt;

&lt;p&gt;where he uncovers that the proposed standard is partially broken. Any comment on his piece?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090984&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://html5tutorial.net/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=3876e030a3fc69a8b59a8c55829fb510&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://html5tutorial.net/&quot;&gt;Lisa&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090984&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-09-09T07:33:08&quot;&gt;2009-09-09T07:33:08&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;This is a great move forward no more relying on 3rd party apps and extensions to play video or audio, i have been reading up on HTML 5 at the &lt;a href=&quot;http://html5tutorial.net/&quot; title=&quot;HTML tutorials&quot; rel=&quot;nofollow&quot;&gt;HTML 5 Tutorials&lt;/a&gt; website, i am now playing around with one of the free templates and was wondering how to embed audio, so thanks a lot, great information, lets hope more people lean towards HTML 5 and SOON!!!&lt;/p&gt;

&lt;p&gt;The drag and drop feature i did not notice was already working in FF 3.5, i was told to get Safari to see HTML 5 in action. Thanks for a great post&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090985&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.useragentman.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=9a579fa051b35266678735c8a3751771&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.useragentman.com&quot;&gt;Zoltan Hawryluk&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090985&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-01-11T15:14:48&quot;&gt;2010-01-11T15:14:48&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;A million thank yous!  This article was great introduction to HTML5 D+D.  With it, I was able to extend it to other browsers.  It was a little painful at first because the browser implementations diverge in significant, but manageable ways.&lt;/p&gt;

&lt;p&gt;If you are interested, check out my article at http://www.useragentman.com/blog/2010/01/10/cross-browser-html5-drag-and-drop/ if you are interested in my results.&lt;/p&gt;

&lt;p&gt;I noticed you haven't blogged in a while - I hope you haven't stopped totally and continue to share with the webdev community.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090986&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.lingua-franka.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e65f416e42c12571ba1c86ae2dadd99f&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.lingua-franka.com&quot;&gt;Raul&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090986&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-04-26T23:56:02&quot;&gt;2011-04-26T23:56:02&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Hi, Leslie. I've just come across a problem that's driving me nuts. I'm not fully comfortable with D&amp;amp;D, but managed to move a crosshairs image over a map to very precisely controlled positions. It worked great on FF 3.6 and FF 4. After a couple of days of successful testing, the image suddenly refused to de dropped after being dragged (it rather flew back to its previous position). Do you know if there is a bug in FF that might cause this? &lt;/p&gt;

&lt;p&gt;BTW, during the programming process I updated Firebug, which also is getting a little cranky.&lt;/p&gt;

&lt;p&gt;Thanks for your prompt answer, Raul&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-324410737&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://disqus.com/api/users/avatars/google-4014af7ac4ea5d00df95bef4503b78dd.jpg&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Alexander Plutov&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-324410737&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-10-01T11:51:12&quot;&gt;2011-10-01T11:51:12&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Good post about Drag &amp; Drop http://plutov.by/post/html5_drag_and_drop&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>XoxoOutliner and further outline addressing adventures</title>
        <link href="http://decafbad.com/blog/2006/11/15/xoxooutliner-and-further-outline-addressing-adventures"/>
        <updated>2006-11-15T08:07:12+00:00</updated>
        <id>http://decafbad.com/blog/2006/11/15/xoxooutliner-and-further-outline-addressing-adventures</id>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://decafbad.com/trac/changeset/779&quot;&gt;Revised the addressing code a bit&lt;/a&gt;, adding a few new kinds of addresses and getting ready to support sub-outline &lt;em&gt;updates&lt;/em&gt;.  That is, fetch a sub-branch of an outline and then later post a change to that sub-branch using the same address.  Needs more thought - ie. what happens if things move between fetch and update? - but here are a few more samples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First is a straight linear index counting down from the top of the outline:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://decafbad.com/2006/11/XoxoOutliner/outlines/README;index:4?format=xoxo&quot;&gt;http://decafbad.com/2006/11/XoxoOutliner/outlines/README;index:4?format=xoxo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Second is a navigation of outline structure, alternating numbers and letters:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://decafbad.com/2006/11/XoxoOutliner/outlines/README;level:3c4?format=xoxo&quot;&gt;http://decafbad.com/2006/11/XoxoOutliner/outlines/README;level:3c4?format=xoxo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That's all for now.  In my next round of enthusiasm, I may try stealing &lt;a href=&quot;http://blogs.opml.org/tommorris/2006/11/11#opathAToolToPopulariseAConcept&quot;&gt;Tom Morris' Opath idea&lt;/a&gt;...&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087323&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://vdm.cc/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=a4dae25fe0faeec4f9ff1ad769a52b36&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://vdm.cc/&quot;&gt;Vincent D Murphy&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087323&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-18T20:52:07&quot;&gt;2006-11-18T20:52:07&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I think (and said as much on Tom Morris' site) that a fragment identifier would be a better solution, in which case Opath would be a fragment identifier syntax for OPML and XOXO. At least it would be the best solution from a REST/web architecture point of view..&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087325&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087325&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-18T21:40:41&quot;&gt;2006-11-18T21:40:41&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;One reason I didn't use the #identifier URI syntax for suboutlines is because some gymnastics need to be done to get the hash through to the server from a browser.  Otherwise, it gets treated as an in-page anchor.  The semicolon syntax seems to work well for a set of path-segment parameters, and follows the standard (if I've read it correctly).  &lt;/p&gt;

&lt;p&gt;In either case, it works for me, and should be just fine in a REST context - the suboutline syntax here should always identify a single parent outline node as a resource, and will eventually work for GET / PUT / POST / DELETE.&lt;/p&gt;

&lt;p&gt;Now I just need to implement a solution for the &lt;a href=&quot;http://www.w3.org/1999/04/Editing/01&quot; rel=&quot;nofollow&quot;&gt;Lost Update Problem&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087328&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.dynamiclist.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=09eb19f1e84a7aaa63c86bd48c4d0f3d&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.dynamiclist.com/&quot;&gt;Michael Poremba&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087328&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2008-09-18T23:45:56&quot;&gt;2008-09-18T23:45:56&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Wondering if you ever completed your online outliner? Check out dynamiclist.com, a functioning but incomlete project I launched back in 2001. The editor is rich and works well. Been thinking of reviving now that all major browsers support the contentEditable tag.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>XoxoOutliner rewrite coming, now with event delegation</title>
        <link href="http://decafbad.com/blog/2006/11/06/xoxooutliner-rewrite-coming-now-with-event-delegation"/>
        <updated>2006-11-06T18:14:26+00:00</updated>
        <id>http://decafbad.com/blog/2006/11/06/xoxooutliner-rewrite-coming-now-with-event-delegation</id>
        <content type="html">&lt;p&gt;For what it's worth: I've answered my own &lt;a href=&quot;http://decafbad.com/blog/2006/10/31/event-delegation-based-dhtml-drag-and-drop&quot;&gt;question about event delegation based drag and drop&lt;/a&gt;.  It seems to work quite well on my machine, which is quite a bit beefier than my old machine.  I should try it out on there soon.  But, I'll hopefully be releasing it soon in the form of a mostly-rewritten &lt;a href=&quot;http://decafbad.com/trac/wiki/XoxoOutliner&quot;&gt;XoxoOutliner&lt;/a&gt; that will feature drag and drop outline items as well as keyboard navigation/control and in-place editing.  And, it should actually start to become useful, since I plan to also whip up a PHP-based server side bit that will handle loading and saving outlines, as well as possibly a client-side bit that can save outlines using local browser storage.  I have the technology - we'll see how far my ambitious plans take me during this hobbling sprint of development.&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087316&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://db79.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=db8059b0ce0b3cf393f4de0ad7af758f&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://db79.com&quot;&gt;Shawn Medero&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087316&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-07T11:01:11&quot;&gt;2006-11-07T11:01:11&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Great news Les! I had checked out the souce of XoxoOutliner and was thinking about playing around myself. Let me know if you'd like an additional tester. :)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087318&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://overstimulate.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=50d10a8864accf0b2522c326381a4702&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://overstimulate.com&quot;&gt;Jesse Andrews&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087318&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-08T18:18:11&quot;&gt;2006-11-08T18:18:11&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Is there a demo of the event delegation framework you are building posted?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087319&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087319&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-08T18:23:29&quot;&gt;2006-11-08T18:23:29&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Nope, nothing available or posted yet.  Soon, though - hoping to check the works in before the end of the week.  It's a bit in pieces right now&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087320&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://codinginparadise.org&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=96da1b3d8858bfa0306b7c55d3e48270&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://codinginparadise.org&quot;&gt;Brad Neuberg&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087320&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-29T09:57:04&quot;&gt;2006-11-29T09:57:04&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Les, very exciting that you're jumping back into the XoXoOutliner code! I can't wait to try to hook it up to HyperScope and play with it some more. It's the best open source DHTMLly outliner out there.&lt;/p&gt;

&lt;p&gt;Two things that might help you; for local storage, I just checked in a new storage provider for Dojo Storage that will use the native storage abilities in Firefox 2 if they are available, in an automagic way; if they aren't there, then it will revert to hidden Flash like it's worked in the past. This might be useful for you; don't know what you were thinking about for local storage. There's a page up with better docs on Dojo Storage now at http://manual.dojotoolkit.org/WikiHome/DojoDotBook/Book50&lt;/p&gt;

&lt;p&gt;The second thing is I just finished an HTML to OPML outline transformer; right now it adds in the line for the HyperScope XSLT stylesheet, but it can be used by any OPML hackers who want to play with bringing HTML into the OPML world, including for things like experimenting with the kind of OPath, deep linking, and inclusion work you've hinted about in other blog entries. A blog post on it is here: http://codinginparadise.org/weblog/2006/11/html-transformer-for-hyperscope-apply.html . Might be fun for you to use in your hacking.&lt;/p&gt;

&lt;p&gt;We still need to grab drinks some time! How is your leg healing up? Hope you had a great thanksgiving.&lt;/p&gt;

&lt;p&gt;Best,
  Brad&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>Event Delegation based DHTML Drag and Drop?</title>
        <link href="http://decafbad.com/blog/2006/10/31/event-delegation-based-dhtml-drag-and-drop"/>
        <updated>2006-10-31T21:46:40+00:00</updated>
        <id>http://decafbad.com/blog/2006/10/31/event-delegation-based-dhtml-drag-and-drop</id>
        <content type="html">&lt;p&gt;So, as the urge to tinker rises again, I've started playing with &lt;a href=&quot;http://developer.yahoo.com/yui/&quot;&gt;YUI&lt;/a&gt; and cracked open some &lt;a href=&quot;http://decafbad.com/trac/wiki/XoxoOutliner&quot;&gt;XoxoOutliner&lt;/a&gt; code again.  One of the things that struck me like a bolt from the blue recently is the notion of &lt;a href=&quot;http://icant.co.uk/sandbox/eventdelegation/&quot;&gt;event delegation&lt;/a&gt;.  For the most part, I've treated event bubbling as a nuisance, except for where it came in handy in keyboard input handling.  But avoiding the need to individually track events on every list element on the page via instantiated objects and methods is &lt;em&gt;hot&lt;/em&gt; and &lt;em&gt;forehead-slappingly obvious&lt;/em&gt; once you've seen it working.  Just implement one set of event handlers on the outline root element (ie. UL or OL), and do the right thing as events come in from the list child elements.&lt;/p&gt;

&lt;p&gt;Thus, while I can do outline node expand/collapse with ease, my goal is to implement an &lt;a href=&quot;http://icant.co.uk/sandbox/eventdelegation/&quot;&gt;event delegation&lt;/a&gt; based approach to dragging outline nodes around.  Apropos of that, I've been poking at &lt;a href=&quot;http://yuiblog.com/sandbox/yui/v0114/examples/event/delegation.php&quot;&gt;how event delegation it works in YUI&lt;/a&gt;.  While there's nothing much special about it in general, I've run into a bit of a snag when it comes to drag-and-drop.&lt;/p&gt;

&lt;p&gt;See, YUI comes with a &lt;a href=&quot;http://developer.yahoo.com/yui/dragdrop/&quot;&gt;rather nice drag-and-drop abstraction&lt;/a&gt; that I'd like to use.  That abstraction, however, requires the instantiation of lots of little objects - one per outline node.  Definitely not delegation-based: The problem is that I'll be adding and removing outline nodes at whim throughout the lifetime of the page, which would require lots of care to ensure that I'm maintaining drag-and-drop wrapper objects.  I've done that a bit in &lt;a href=&quot;http://decafbad.com/trac/wiki/XoxoOutliner&quot;&gt;XoxoOutliner&lt;/a&gt;; it sucks.&lt;/p&gt;

&lt;p&gt;So, I was able to build part of a delegation-based drag tracker from scratch.  I'm sad to lose the other niceties that the YUI DnD offers, but it works.  The problem now, though, is the &lt;em&gt;drop&lt;/em&gt; part of the equation.  I can drag elements around the page until my heart's content, but I can never quite tell in what context I've dropped it.&lt;/p&gt;

&lt;p&gt;I poured through the source code for the YUI DnD implementation, as well as the implementation of a few other JS frameworks' DnD offerings.  The general solution seems to be calculating and caching the page coordinate regions for each element relevant in the drop operation.  In my case, that usually includes every outline node on the page.  That's easy when you have lots of little objects instantiated - you just iterate through them and match up regions with the coordinates where the drag stopped.  But, part of my win with event delegation was that I don't have to maintain a pile of objects.&lt;/p&gt;

&lt;p&gt;Oh yeah, and did I mention that I don't assign IDs to all the little list items making up my outline?  And that I don't particularly feel like doing so?  That also throws a monkey wrench in the YUI DnD paradigm.&lt;/p&gt;

&lt;p&gt;The only idea I have so far is that I need to at least build a cache mapping regions to outline nodes, and keep it fairly well maintained.  That should be lighterweight than a fleet of DOM event wrappers, but still annoying.  I could trigger a cache refresh when a drag first starts, but that will probably drag down UI response.  I could trigger it whenever the outline changes, but that's just moving the burden.  And then, who knows how I'll map ID-less elements to their respective regions, while ensuring I stay clear of memory leaks.  That's still semi-voodoo to me, and I feel ashamed of that.&lt;/p&gt;

&lt;p&gt;Eh, maybe it won't be as bad as I think.  But, to anyone who understands what I just spewed:  Any ideas?&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083066&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2d870e8df3af0d62fa636b336b17cd60&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Nick&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083066&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-01T00:19:27&quot;&gt;2006-11-01T00:19:27&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;You know, Marty and I were talking tonight about how some of your posts make NO sense to us.  She even said &quot;it's like he's talking another fucking language&quot;.&lt;/p&gt;

&lt;p&gt;Damn Programmers!!&lt;/p&gt;

&lt;p&gt;--nick&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083067&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://gandrew.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=de0d80e531fef9095048375a247d1149&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://gandrew.com&quot;&gt;Gareth Andrew&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083067&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-01T18:57:21&quot;&gt;2006-11-01T18:57:21&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I'm sure I've missed something obvious - why can't you simply use the same event delegation approach on the mouseUp event?  getTarget should return the node you've dropped on, what else do you need?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083074&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083074&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-01T19:18:52&quot;&gt;2006-11-01T19:18:52&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Gareth: Yup, the issue I have with the mouseUp is that getTarget gives me what was under the mouse when I let go of the button - namely, the element I've been dragging around, not the element under the thing being dragged.  In addition, for user feedback &lt;em&gt;during&lt;/em&gt; the drag (ie. at mouseMove time), I want to know what's under the dragged element - so I can highlight the potential landing spot, etc.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083075&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.fluffy.co.uk/stediting/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=a660afb8f1f22ce1b03ad3b532aa05b5&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.fluffy.co.uk/stediting/&quot;&gt;Ben&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083075&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-02T13:10:53&quot;&gt;2006-11-02T13:10:53&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I presume the problem is that, given a point on the screen, you want to find exactly what DOM element is beneath it.&lt;/p&gt;

&lt;p&gt;I found a solution for this in my proof-of-concept structured editor http://www.fluffy.co.uk/stediting/ -- you need to know where the mouse was clicked to insert the caret.&lt;/p&gt;

&lt;p&gt;It might be a start anyway.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083078&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.gibberish.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=d78a376f93e23dd093abe8d280198ebd&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.gibberish.com&quot;&gt;misuba&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083078&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-06T02:40:19&quot;&gt;2006-11-06T02:40:19&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I think the dragdrop stuff in scriptaculous would get you most of this... at least, it is good about draggable elements having handles you can specify (e.g. child elements of the thing you want to drag), and flexible about what sorts of targets you can land on.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083084&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083084&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-06T19:06:03&quot;&gt;2006-11-06T19:06:03&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;misuba: Nope, the Scriptaculous approach gives me problems too.  The first is that I don't like Prototype, unless they've stopped messing with Object.prototype since I last checked.  The second is that DnD in Scriptaculous involves juggling lots of little objects ilke most other DnD implementations I've found.  When I have an outline of 100's to 1000's of items, that really blows.  I think I've got an approach working now that's significantly lighter weight.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083085&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.gibberish.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=d78a376f93e23dd093abe8d280198ebd&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.gibberish.com&quot;&gt;misuba&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083085&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-11-06T22:26:55&quot;&gt;2006-11-06T22:26:55&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I'm interested to see your approach. (FWIW, Proto hasn't touched Object.prototype for a couple of versions now.)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083086&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://javascriptmvc.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=10b3282aac613831755e42ac74acbc41&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://javascriptmvc.com&quot;&gt;Justin Meyer&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083086&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2008-05-31T07:43:52&quot;&gt;2008-05-31T07:43:52&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I am working on the exact same issue for JavaScriptMVC.  If you haven't seen JavaScriptMVC, check out its trunk.  In the controller2 plugin, you'll find a really nice event delegation library.&lt;/p&gt;

&lt;p&gt;I've only thought of 1 way to do event delegation drops.  It's crazy, but it might work.&lt;/p&gt;

&lt;p&gt;First, style Drags so their z-Index is LOWER than the Drops.  You want your mouse to hit the droppable areas.&lt;/p&gt;

&lt;p&gt;Once a droppable is moused over by dragging a drag to it, it creates a transparent element in the exact same position as the Droppable.  It also lowers the droppable z-Index.  This gives the appearance that the draggable is over the droppable.&lt;/p&gt;

&lt;p&gt;To simulate movement, the transparent droppable's mouseovers are sent to the draggable.&lt;/p&gt;

&lt;p&gt;On mousing out of the transparent Droppable, it sets everything back to normal.&lt;/p&gt;

&lt;p&gt;I haven't tried this yet.  The biggest issue I see is that when you grab a draggable in the middle, half of it will be behind the droppable until the mouseover happens.  This isn't ideal, but maybe there is something that can be done about that.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083088&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=8f18d2579d5c8f2fb2a79c09a9234e6e&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Batiste&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083088&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2009-01-20T10:06:54&quot;&gt;2009-01-20T10:06:54&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;A jQuery solution for Drag and Drop with event delegation :&lt;/p&gt;

&lt;p&gt;http://batiste.dosimple.ch/blog/posts/2008-05-18-1/jquery-drag-and-drop-and-resize-event-delegation.html&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>Futility in alternate pasts and futures in human augmentation</title>
        <link href="http://decafbad.com/blog/2006/09/06/futility-in-alternate-pasts-and-futures-in-human-augmentation"/>
        <updated>2006-09-06T19:57:42+00:00</updated>
        <id>http://decafbad.com/blog/2006/09/06/futility-in-alternate-pasts-and-futures-in-human-augmentation</id>
        <content type="html">&lt;blockquote cite=&quot;http://www.adaptivepath.com/blog/2006/09/05/the-futility-of-designing-for-an-alternate-past/&quot;&gt;While it’s great to draw inspiration and ideas from the past, recreating the past in the hope that it becomes the future seems like a futile idea. Does anyone really want to return to a command-line interface to manipulate documents? It’s designing for a past that never happened, one where we all became computer scientists and enjoyed manipulating documents via arcane commands.&lt;br /&gt;...&lt;br /&gt;A better, more productive, use of time would have been to say, what inspiration can still be gained from Engelbart’s ideas? There’s still a lot to be gleaned from his 1962 (!) paper [Augmenting Human Intellect](http://www.bootstrap.org/augdocs/friedewald030402/augmentinghumanintellect/ahi62index.html). How might some of his thoughts on collaborative intelligence be implemented in our world now, in 2006, within the technology we have now? That’s the question waiting to be solved.&lt;/blockquote&gt;


&lt;div class=&quot;quotesource&quot;&gt;Source: &lt;a href=&quot;http://www.adaptivepath.com/blog/2006/09/05/the-futility-of-designing-for-an-alternate-past/&quot;&gt;adaptive path » blog » blog archive » The Futility of Designing for an Alternate Past&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Allow me to engage in some Devil's Advocacy here - although I really am an Engelbart sympathizer:&lt;/p&gt;

&lt;p&gt;Consider a program like Microsoft Word, with all its ribbons and toolbars and menus and animated assistance.  When you first started working with it, you probably spent time navigating these visual and guided parts of the user interface to get your job done.  But, after awhile, you probably discovered keyboard shortcuts and accellerators - CTRL-s to save, for instance.  These have likely been invaluable in speeding up your work and helping the application get out of your way.  So, having reached this point, do you ever really have a use for the &quot;user friendly&quot; bits anymore?  Or, have you graduated to &quot;manipulating documents via arcane commands&quot;?&lt;/p&gt;

&lt;p&gt;What if this application had never sugar-coated things and had instead optimized for efficiency and ergonomics in daily expert operation, trading an &quot;intuitive interface&quot; for an offer to incrementally train on its necessarily complex functionality?  After awhile, you'll have it all down, and be ready to shed the training wheels.&lt;/p&gt;

&lt;p&gt;What if - instead of a maze of menus and toolbar icons - your mouse just had dozens of easily-accessible buttons?  You're used to only having a left and a right click from which to choose.  If you've splurged, you might have the more expansive choices offered by a fancier pointing device.  But, what if you had a chording keyboard under your off-mouse hand, offering an order of magnitude more mouse pointer actions?&lt;/p&gt;

&lt;p&gt;For example, how about a &quot;delete word&quot; mouse button?  Or a &quot;copy sentence&quot; button?  Or maybe even a &quot;jump to the selected link with a custom view filter&quot; button?  The important part is that these commands act &lt;strong&gt;immediately&lt;/strong&gt;, &lt;em&gt;just like a mouse button&lt;/em&gt;, upon whatever's under the pointer.  There's no left-click then CTRL-x to Cut - no, you just point at a word, and say &quot;cut that&quot;.  There's a lot of power and efficiency here.&lt;/p&gt;

&lt;p&gt;These &quot;what if&quot; scenarios are not just wishful thinking, though.  They're what Doug Engelbart and crew implemented.  These are things I picked up after being invited to try a hands-on self-guided tour of &lt;a href=&quot;http://codinginparadise.org/weblog/2006/03/new-screencast-of-douglas-engelbarts.html&quot;&gt;Augment&lt;/a&gt;.  I only wish I'd had a chording keyboard to get the full experience.  The interface was like a mouse-heavy &lt;a href=&quot;http://www.vim.org/&quot;&gt;VIM&lt;/a&gt;, with verb-object command patterns and structured document interactions.  (Or, rather, &lt;a href=&quot;http://www.vim.org/&quot;&gt;VIM&lt;/a&gt; is like a mouse- and outline-deficient derivation of Augment.)&lt;/p&gt;

&lt;p&gt;The basic core of this facet of &lt;a href=&quot;http://codinginparadise.org/weblog/2006/03/new-screencast-of-douglas-engelbarts.html&quot;&gt;Augment&lt;/a&gt; is this:  Computers are powerful tools with great potential to augment human intellect.  As such, they offer a lot of complex functionality.  But, human beings are trainable, and can assimilate this functionality.  Once assimilated, it's best to squeeze out all the performance you can.  You don't see today's degree of computer &quot;user friendliness&quot; in chainsaws, tanks, jack-hammers, semi-trucks, or fighter jets.  These things are necessarily complex and require training.  Why should the most powerful of intelligence enhancement tools offered by computers be any different?  Of course, you generally won't lose a limb to a computer, but you might be mentally impaired or lose valuable work in the process.&lt;/p&gt;

&lt;p&gt;This is, I think, one of the still-relevant central facets of Doug Engelbart's ideas that could use some re-examination today.  It could just be because I'm an übernerd who thinks it's fun to self-train on things like &lt;a href=&quot;http://www.vim.org/&quot;&gt;VIM&lt;/a&gt; and &lt;a href=&quot;http://codinginparadise.org/weblog/2006/03/new-screencast-of-douglas-engelbarts.html&quot;&gt;Augment&lt;/a&gt;, but I also think that there's a lot of potential to be unlocked once you clear away expectations of &quot;intuitive interfaces&quot; that are &lt;a href=&quot;http://www.greenend.org.uk/rjk/2002/08/nipple.html&quot;&gt;decidedly not nipples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And, since I've &lt;a href=&quot;http://decafbad.com/blog/2006/09/06/world-of-warcraft-is-my-world-of-warcraft&quot;&gt;admitted my recently acquired semi-addiction&lt;/a&gt;, consider World of Warcraft as an expert application.  Advanced players could never succeed by navigating a complex yet &quot;friendly&quot; UI to invoke various spells and skills and in-game actions.  Just take a look at some of the customizations and UI revisions being offered at &lt;a href=&quot;http://ui.worldofwar.net/&quot;&gt;this site&lt;/a&gt;.  Some configurations of this game smack me as eerily similar to the principles of Augment.  In fact, just this weekend, I was considering blowing the dust off &lt;a href=&quot;http://www.avault.com/hardware/getreview.asp?review=msstratcom&quot;&gt;this keyset controller&lt;/a&gt; I used to use with Everquest, years ago.&lt;/p&gt;

&lt;p&gt;Then again, maybe it's a matter of intensity.  Coordinating with a 40-player guild to slay something from the molten bowels of the earth is a slightly different activity than composing a memo or even a few-dozen-page report.  On the other hand, I really would've liked to strip away most of the Word interface while writing my &lt;a href=&quot;#text-2&quot;&gt;two books&lt;/a&gt;.  And someday, who's to say that online interpersonal collaboration in the general case won't more closely resemble a World of Warcraft raid?  Having &lt;a href=&quot;http://decafbad.vox.com/library/post/reading-vernor-vinges-new-novel.html&quot;&gt;just read&lt;/a&gt; &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0312856849/0xdecafbad01-20&quot;&gt;Vernor Vinge's latest book Rainbows End&lt;/a&gt;, he makes a lot of intelligence augmentation and collaboration tasks look just like WoW.&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221085202&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://webseitz.fluxent.com/wiki&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=8157a5907b244071cda98ba5aa7a9635&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://webseitz.fluxent.com/wiki&quot;&gt;Bill Seitz&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221085202&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-09-06T21:58:26&quot;&gt;2006-09-06T21:58:26&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;The fighter-jet metaphor is interesting. Obviously a fighter has a narrower scope/focus than the general computer. But perhaps there's a narrower technique/practice of intelligence augmentation that warrants a more specialized/locally-optimized interface design.&lt;/p&gt;

&lt;p&gt;But then maybe the Engelbart work isn't focused &lt;em&gt;enough&lt;/em&gt; on a particular context and associated method-of-use?&lt;/p&gt;

&lt;p&gt;To relate this to a similar software offering, how important are the specific Compendium features compared to the process of IBIS?&lt;/p&gt;

&lt;p&gt;And a big factor in the ChangeFunction is how critical the problem/pain is being solved by the new offering. Can you convince people that there will be a pay-back for learning to use HyperScope that compensates for the investment, compared to other uses of your time?&lt;/p&gt;

&lt;p&gt;Let's put it this way: if you were picking between 2 start-ups to invest in, how much weight would you associate with 1 of the teams using HyperScope? How does this compare to betting on a dogfight where 1 party has an F-15 and the other a Cessna?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221085203&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.synaesmedia.net&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=248a3c4ba8f2972427222d46954f9c1c&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.synaesmedia.net&quot;&gt;phil jones&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221085203&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-09-07T22:22:40&quot;&gt;2006-09-07T22:22:40&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Very nice post. &lt;/p&gt;

&lt;p&gt;And Bill's comments too. They remind me of the LEO editor for Python which was always touted as having great productivity benefits if only your team would undergo the three month training required to use it properly. Not sure if it ever took off or could. But there's something nice about the idea that LEO empowered programmers could outperform the norm.&lt;/p&gt;

&lt;p&gt;I'm convinced that there are certainly productivity improvements available to power-users, beyond anything currently dreamed of, once we step away from the assumption that &quot;ease of use&quot; equals &quot;1-to-1 correspondance between functionality and UI objects&quot;.&lt;/p&gt;

&lt;p&gt;As every nerd knows, real (interesting) productivity, comes from higher levels of abstraction. And maybe what's really important about the outliner tradition (from HyperScope to MORE / UserLand / OPML to LEO) is that it remains loyal to this notion. When you collapse a block of text and ideas down to a single-line, you are essentially abstracting away from that detail and working with the higher-level description. &lt;/p&gt;

&lt;p&gt;OTOH, the Xerox Parc tradition of the GUI and direct manipulation, lost this core ideal. (At least as it was spread via Apple and Microsoft, although obviously you can probably do all sorts of powerful abstractions via a Smalltalk interface)&lt;/p&gt;

&lt;p&gt;I'm pretty sure that this insight is general. The really interesting innovations beyond HyperScope are going to be new ways of giving the power-users yet more abstract ways of manipulating their information. Either by folding more of it together as complex aggrogates, or allowing large-scale cross-cutting processing. (Maybe style-sheets in Word are the only other surviving popular example.)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221085205&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://harold.hotelling.net/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=5183bee2961385af94a500759bb7a372&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://harold.hotelling.net/&quot;&gt;Harold&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221085205&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-09-08T22:45:31&quot;&gt;2006-09-08T22:45:31&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Y'know - this is what it is like to be an Emacs user. I've come to the opinion that the set of document formats you can work with, and the set of commands you can perform on them, should be somewhat-to-completely separate from the UI.&lt;/p&gt;

&lt;p&gt;That way, you can have a learners/beginners UI to get people up to speed, then they graduate to the intermediate UI that assumes knowledge of things like C-s, C-o, C-q etc. And of course, if an application follows strong UI design guidelines, experienced computer users might be able to start a new program in the intermediate UI. Gosh! C-o opens a file in Excel too!&lt;/p&gt;

&lt;p&gt;Then, I think there should be a choice of expert-level UIs. For example, VIM and Emacs have both grown together (VIM started small, light and fast, and Emacs stared with everything AND the kitchen sink), so that they both represent reasonable choices for a power-user's text editor.&lt;/p&gt;

&lt;p&gt;This is also one of the problems that web developers are working on (or working around). Google and others have started introducing intermediate level UI features in web apps (like shortcut keys), but try building a site that looks and feels like WoW...&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221085206&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://mozdawg.blogspot.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2c2c2c8f9e42a145f54f257111c6e84d&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://mozdawg.blogspot.com&quot;&gt;Ben Tremblay&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221085206&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-09-12T20:35:09&quot;&gt;2006-09-12T20:35:09&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;What still catches me with systems like Augment (I would call Neuberg's new incarnation &quot;hyperScope&quot;.) is precisely the mousing.&lt;/p&gt;

&lt;p&gt;The war is long lost but I recall with fond pleasure how I blew a Word user away by using WP5.2 ... ^F6-P &lt;em&gt;boom&lt;/em&gt; And when I rolled out the functions I'd cobbled together with WP's lovely macro language? Sonic boom. The key in that situation was that I had a large number of unique tasks and a small very number of tasks carrying a huge workload (MILSPEC change management). So it was ideal for hot-keyed macros: like shooting fish in a barrel.&lt;/p&gt;

&lt;p&gt;For one thing, unless I'm reading passively or doing some flavour of CAD my hands are nowhere near the mouse. Or, to invert that, when I'm keyboarding I have to routinely suppress my resentment with reach, swivel, click, drag, select, click, select ... interminable menus and options bla-bla-blah, and nowhere muscle memory comes into play. But even with that aside, to have to right click and then select Delete from a menu /after/ having dragged to select a block ... I can outshoot that action stream using keystrokes anyday, if the app allowed me to.&lt;/p&gt;

&lt;p&gt;I don't disagree with the fundamental insight ... far from it. But we've just barely begun to implement the foundational cognitive ergonomics. (I was gratified to see in one thread that Brad explicated his having moved Help to the upper right ... cuz that's where it is most often. When it works it works cuz it works. Tradition is sometimes/often arbitrary; life's like that and we should sometimes just suck it up.)&lt;/p&gt;

&lt;p&gt;Harold's point about expert users is, I think, key. It's merely foolish to impose a system that makes good use of habituation onto a newly arrived visitor. I'm quite sure that attentive study shows a clustering or quantum of user intention and expertise ... until and unless we contrive some seamless continuum (a terrible distraction inspired by naive perfectionism) we should focus on differentiating expters from n00bs (no diss) and serve both well. &quot;Intermediate level&quot; sounds quite appropriate ... so long as this isn't just a maelstrum of fish/foul goat/sheep confounds.&lt;/p&gt;

&lt;p&gt;Alternatively we can always fall back on the old TRW concept of making people think more like machines. There might be funding for that.
;-P&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221085208&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://mozdawg.blogspot.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2c2c2c8f9e42a145f54f257111c6e84d&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://mozdawg.blogspot.com&quot;&gt;Ben Tremblay&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221085208&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-09-12T20:39:47&quot;&gt;2006-09-12T20:39:47&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Muscle memory just jumped up and reminded me of this: in a situation where I was doing Print Preview a gazillion times a day Shift-F7 6 was as effortless as breathing. &lt;em&gt;snap&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221085209&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://vielmetti.typepad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e377f3e2140297d32460ae9a4b38ff98&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://vielmetti.typepad.com&quot;&gt;Edward Vielmetti&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221085209&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-10-18T06:00:17&quot;&gt;2006-10-18T06:00:17&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I can speak as a former Emacs user and coder that the only reason I gave it up for vi was that it hurt my hands too much to make all of those funky keyboard chords, and it started to hurt my head to remember all of the time-saving things I had built.&lt;/p&gt;

&lt;p&gt;Classically there's a tradeoff between the ease of typing something and the amount of think time you have to put into remembering what to type.&lt;/p&gt;

&lt;p&gt;One thing I am annoyed by on too many blogs is the inability to tab from the comment field to the &quot;submit&quot; button, which forces a mouse event and a scroll event.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    
</feed>

