<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" pageTitle="Flex2 &amp; AMFPHP" creationComplete="init()">
    <mx:Script>
        <![CDATA[
            import mx.managers.CursorManager;
            import mx.events.TreeEvent;
            private var conn:NetConnection;

            [Bindable]
            private var treeData:XML;
            private var currItem:XML;

            /**
             * Initialize the connection using NetConnection
             * and assign the default dataProvider
             * to the Tree component
             */
            private function init():void
            {
                conn = new NetConnection();
                conn.objectEncoding = ObjectEncoding.AMF0;
                conn.connect("http://alessandro-pc/amfphp/gateway.php");

                treeData =
                    <node label="root" data="" loaded="false">
                        <node label="" data="" loaded="false" />
                    </node>;
            }

            /**
             * Responder for all the tree events
             */
            private function treeHandler(e:Event):void
            {
                // if item opening event
                if(e.type == TreeEvent.ITEM_OPENING)
                {
                    var evt:TreeEvent = TreeEvent(e);
                    // save a reference to the current opening item
                    currItem = XML(evt.item);
                    // call the remote server method only if
                    // the current folder has not been already parsed
                    if(evt.item.@loaded == "false")
                    {
                        // create a responder for the remote method
                        // and assign a result handler and fault handler
                        var resp:Responder = new Responder(getList_result, onFault);
                        evt.item.node.@label = "Loading...";
                        // make a remoting call
                        conn.call("org.sepy.test.FolderBrowser.getList", resp, String(evt.item.@data));
                        CursorManager.setBusyCursor()
                    }
                }
            }

            /**
             * getList remote server method responder
             */
            private function getList_result(e:*):void
            {
                CursorManager.removeBusyCursor();
                if(e is Array)
                {
                    if(e.length)
                    {
                        delete currItem.node[0];
                        var node:XML;
                        for each(var item:Object in e)
                        {
                            currItem.@loaded = "true";
                            node = XML("<node label='"+item.name+"' loaded='false' data='"+currItem.@data+"/"+item.name+"'></node>");
                            if(item.is_dir)
                            {
                                node.node = <node label="" data="" loaded="false"></node>
                            }
                            currItem.node += node
                        }
                    } else {
                        delete currItem.node[0];
                        currItem.@loaded = "true";
                        tree.setItemIcon(currItem, tree.getStyle("folderOpenIcon"), tree.getStyle("folderClosedIcon"));
                    }
                }
                setTimeout(tree.validateNow, 100)
            }

            /**
             * Default error handler for remote server calls
             */
            private function onFault(e:*):void
            {
                for each(var s:String in e) trace(s, e[s]);
            }

        ]]>
    </mx:Script>
    <mx:Panel x="10" y="10" width="617" height="548" layout="absolute" title="Folder Browser..." paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
        <mx:VBox x="0" y="0" width="100%" height="100%" horizontalAlign="right" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
        <mx:Text width="100%" height="49" fontSize="12">
            <mx:htmlText>
                <![CDATA[Browse directories using <u><b><a href='http://www.amfphp.org'>AMFPHP</a></b></u>. Evey time you open a folder leaf amfphp will return the folder contents to flash ]]>
            </mx:htmlText>
        </mx:Text>
        <mx:Tree
            width="100%"
            height="100%"
            id="tree"
            labelField="@label"
            dataProvider="{treeData}"
            itemOpening="treeHandler(event)"
            disclosureOpenIcon="@Embed(source='/assets/assets.swf#Tree_disclosureOpenIcon')"
            disclosureClosedIcon="@Embed(source='/assets/assets.swf#Tree_disclosureClosedIcon')"
            openDuration="0"
        ></mx:Tree>
        </mx:VBox>

    </mx:Panel>
</mx:Application>