<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*"
    width="850" height="100%" viewSourceURL="srcview/index.html"> 
    
    <mx:Style source="main.css"/>
    
    <mx:Script>  
        <![CDATA[
            import org.osflash.thunderbolt.Logger;
            import events.WhiteboardEvent;
            import events.CustomMapEvent;
            import events.ChatEvent;
            import model.SOModel;

            import model.NCConnect;

            [Bindable]
            private var userName:String;

            [Bindable]
            private var roomName:String;

            private var nc:NCConnect;
            private var soModel:SOModel;


            private function joinRoom():void
            {
                userName = connectPanel.userName;
                roomName = connectPanel.roomName;
                
                nc = new NCConnect();
                nc.addEventListener( NetStatusEvent.NET_STATUS, netStatusHandler ); 
                // connect to server
                nc.connectRTMP( userName, roomName );
            }
            
            private function init():void
            {
                // hook up SharedObject
                soModel = new SOModel();
                soModel.addEventListener( ChatEvent.CHAT, onChatMsgIn );
                soModel.addEventListener( CustomMapEvent.MAP, onMapSyncIn );
                soModel.addEventListener( WhiteboardEvent.WB, onWBSyncIn );
                soModel.connectSO( nc );
                // listen to chat event
                chatPanel.addEventListener( ChatEvent.CHAT, onChatMsgOut );
                
                mapArea.addEventListener( CustomMapEvent.MAP, onMapSyncOut );
                
                // listen to whiteboard for outgoing data
                mapArea.addEventListener( WhiteboardEvent.WB, onWBSyncOut );
                
                vs.selectedIndex = 1;
                
                // if roomname was passed via flashvars, use it
                if (Application.application.parameters.roomname)
                    roomName = Application.application.parameters.roomname;
            }
            
            private function netStatusHandler( e:NetStatusEvent ):void
            {
                trace(e.info.code)
                
                var msg:String;
                
                switch ( e.info.code ) 
                {
                    
                    case "NetConnection.Connect.Success":
                        init();
                        break;
                        
                    case "NetConnection.Connect.Rejected":    
                        //
                        break;
                        
                    case "NetConnection.Connect.Failed":
                        //
                        break;
                        
                    case "NetConnection.Connect.Closed":
                        //
                        break;
                }                
            }
            
            private function onWBSyncOut( e:WhiteboardEvent ):void
            {
                Logger.info("onWBSyncOut");
                soModel.sendWBSync( e );
            }
            
            private function onWBSyncIn( e:WhiteboardEvent ):void
            {
                Logger.info("onWBSyncIn");
                mapArea.wb.messageHandler( e );
            }
            
            private function onMapSyncIn( e:CustomMapEvent ):void
            {
                trace("onMapSyncIn");
                mapArea.messageHandler( e );
            }
            
            private function onMapSyncOut( e:CustomMapEvent ):void
            {
                trace("onMapSyncOut");
                soModel.sendMapSync( e );
            }
            
            private function onChatMsgIn( e:ChatEvent ):void
            {
                // only show messages that we haven;t sent ourself since they are already shown
                if (userName != e.data.userName)
                    chatPanel.displayMessage( e.data.userName, e.data.msg );
            }
            
            private function onChatMsgOut( e:ChatEvent ):void
            {
                //trace("onChatMsgOut");
                soModel.sendMsg( e );
            }
             
        ]]>  
    </mx:Script>  

    <mx:ViewStack id="vs" width="100%" height="100%" creationPolicy="all">
        <ConnectPanel id="connectPanel" joinRoom="joinRoom()"/>
        <mx:VBox width="100%" height="100%">
            <MapArea id="mapArea" userName="{userName}" roomName="{roomName}" height="500"/>
            <ChatPanel id="chatPanel" height="100%" userName="{userName}"/>
        </mx:VBox>    
    </mx:ViewStack>    

</mx:Application>