The source code

    Ext.onReady(function(){
        Ext.Direct.addProvider(
            Ext.app.REMOTING_API,
            {
                type:'polling',
                url: 'php/poll.php'
            }
        );

        var out = new Ext.form.DisplayField({
            cls: 'x-form-text',
            id: 'out'
        });

        var text = new Ext.form.TextField({
            width: 300,
            emptyText: 'Echo input'
        });

        var call = new Ext.Button({
            text: 'Echo',
            handler: function(){
                TestAction.doEcho(text.getValue(), function(result, e){
                    var t = e.getTransaction();
                    out.append(String.format('Successful call to {0}.{1} with response:{2}',
                           t.action, t.method, Ext.encode(result)));
                    out.el.scroll('b', 100000, true);
                });
            }
        });

        var num = new Ext.form.TextField({
            width: 80,
            emptyText: 'Multiply x 8',
            style:  'text-align:left;'
        });

        var multiply = new Ext.Button({
            text: 'Multiply',
            handler: function(){
                TestAction.multiply(num.getValue(), function(result, e){
                    var t = e.getTransaction();
                    if(e.status){
                        out.append(String.format('Successful call to {0}.{1} with response:{2}',
                            t.action, t.method, Ext.encode(result)));
                    }else{
                        out.append(String.format('Call to {0}.{1} failed with message:{2}',
                            t.action, t.method, e.message));
                    }
                    out.el.scroll('b', 100000, true);
                });
            }
        });

        text.on('specialkey', function(t, e){
            if(e.getKey() == e.ENTER){
                call.handler();
            }
        });

    	num.on('specialkey', function(t, e){
            if(e.getKey() == e.ENTER){
                multiply.handler();
            }
        });

    	var p = new Ext.Panel({
            title: 'Remote Call Log',
            //frame:true,
    		width: 600,
    		height: 300,
    		layout:'fit',

    		items: [out],
            bbar: [text, call, '-', num, multiply]
    	}).render(Ext.getBody());

        Ext.Direct.on('message', function(e){
            out.append(String.format('{0}', e.data));
                    out.el.scroll('b', 100000, true);
        });
    });