<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="955" minHeight="600" 
               xmlns:components="components.*" 
               height="400" width="377" creationComplete="init()" currentState="Menu" xmlns:panels="components.panels.*" viewSourceURL="srcview/index.html">
    
    
    <!--  States -->
    
    <s:states>
        <s:State name="Menu"/>
        <s:State name="EditWord"/>
        <s:State name="Search"/>
        <s:State name="Test"/>
    </s:states>
    
    
    <!--  Styles -->
    
    <fx:Style source="styles.css"/>
    
    
    <!--  Script -->
    
    <fx:Script>
        <![CDATA[
            import com.EditWord;
            import com.MenuSrs;
            import com.Search;
            import com.Test;
            import com.networking.AmfPhpConnection;
            import com.utils.Util;
            import com.word.Language;
            import com.word.Word;
            
            import components.panels.PanelEditWord;
            import components.popups.PopUpInfo;
            import components.popups.PopUpLoading;
                        
            
            //-- variables --            
            public static var amf:AmfPhpConnection;
            
            public static var languages:Array = new Array();
            public static var allDecks:Array = new Array();
            public static var decksByLanguage:Object;
            public static var words:Array = new Array();
            
            public static var popUpInfo:PopUpInfo = new PopUpInfo();
            public static var popUpLoading:PopUpLoading = new PopUpLoading();
            
            private var menu:MenuSrs;
            private var editWord:EditWord;
            private var search:Search;
            private var test:Test;
            
            
            //-- methods --
            
            private function init():void
            {    
                AmfPhpConnection.isLocal = false;
                amf = new AmfPhpConnection(this);
                
                Security.allowDomain("https://www.googleapis.com");
                
                initData();
            }
            
            /** init data with amfphp - calls asynchronous methods */
            private function initData():void
            {
                Util.showPopUpLoading(this, true);
                
                amf.updateLanguages(initDecks);
            }
            
            /** updates data DeckList 
             *  asynchronous : calls Php and listens result */
            private function initDecks(_event:Event=null):void
            {
                amf.updateDecks(initMenu);
            }
            
            /** init Menu panel */
            private function initMenu(_event:Event=null):void
            {
                if(menu == null){
                    menu = new MenuSrs(panelMenu);
                    menu.addEventListener(MenuSrs.EDIT_WORD, goToEditWord);
                    menu.addEventListener(MenuSrs.SEARCH, goToSearch);
                    menu.addEventListener(MenuSrs.TEST, goToTest);
                    
                    Util.removePopUpLoading();
                }
                menu.init();
            }
            
            /** init Creation panel */
            private function initEditWord(_word:Word=null):void
            {
                if(editWord == null){
                    editWord = new EditWord(panelCreation);
                    editWord.addEventListener(MenuSrs.MENU, goToMenu);
                    editWord.addEventListener(MenuSrs.SEARCH, goToSearch);
                }
                editWord.init(_word);
            }
            
            /** init Search panel */
            private function initSearch(updateSearch:Boolean=false):void
            {
                if(search == null){
                    search = new Search(panelSearch);
                    search.addEventListener(MenuSrs.MENU, goToMenu);
                    search.addEventListener(MenuSrs.EDIT_WORD, goToEditWord);
                }
                search.init(updateSearch);
            }
            
            /** init Test panel */
            private function initTest():void
            {
                if(test == null){
                    test = new Test(panelTest);
                    test.addEventListener(MenuSrs.MENU, goToMenu);
                }
                test.init();
            }
            
            /** go to state menu */
            private function goToMenu(_event:Event):void
            {
                currentState = "Menu";
                initMenu();
            }
            
            /** go to state creation */
            private function goToEditWord(_event:Event=null):void
            {
                var word:Word = null;
                if(currentState == "Search")
                    word = search.word;
                
                currentState = "EditWord";
                initEditWord(word);
            }
            
            /** go to state search */
            private function goToSearch(_event:Event):void
            {
                var updateSearch:Boolean = false;
                if(currentState == "EditWord")
                    updateSearch = true;
                
                currentState = "Search";
                initSearch(updateSearch);
            }
            
            /** go to state test */
            private function goToTest(_event:Event):void
            {
                currentState = "Test";
                initTest();
            }
            
        ]]>
    </fx:Script>
    
    
    
    <!-- UIComponents -->
    
    <panels:PanelMenu id="panelMenu" includeIn="Menu" x="10" y="10">
    </panels:PanelMenu>
    <panels:PanelEditWord id="panelCreation" includeIn="EditWord" x="10" y="10">
    </panels:PanelEditWord>
    <panels:PanelSearch id="panelSearch" includeIn="Search" x="10" y="10">
    </panels:PanelSearch>
    <panels:PanelTest id="panelTest" includeIn="Test" x="10" y="10">
    </panels:PanelTest>
    
</s:Application>