<?xml version="1.0" encoding="utf-8"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" 
		  xmlns:s="library://ns.adobe.com/flex/spark" 
		  xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300"
		  creationComplete="init()">
	<s:layout><s:VerticalLayout/></s:layout>
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.events.FlexEvent;
			import mx.events.ModuleEvent;
			
			private var errMsg:String="";
			
			private function errorModuleHandler(e:ModuleEvent):void
			{
				e.currentTarget.removeEventListener(ModuleEvent.ERROR,errorModuleHandler);
				errMsg=e.errorText;
			}
			
			public function loadModule1():void
			{
				trace("**************************************************");
				trace(" : LOAD MODULE : loadModule1() ");
				trace("**************************************************");
				loadModule(subModuleLoader1, "assets/SimpleModuleWithLabel.swf");
			}
			
			private function loadModule(ml:spark.modules.ModuleLoader, moduleURL:String):void
			{
				this.lbl00.text="loading  module...";
				trace(' ************************************************** loading  module...');
				if (ml.url==null)
					ml.url = moduleURL;
				else ml.loadModule();
			}
			
			private function init():void
			{
				trace(' initializing subModuleLoader1 ...');
				lbl00.text ' initializing subModuleLoader1 ...';
				trace("*************************INIT*************************");
				trace(" : " + info.url + " : ");
				
				trace("*************************INIT*************************");
				subModuleLoader1.addEventListener(ModuleEvent.READY,handleModuleLoaded);
				subModuleLoader1.addEventListener(ModuleEvent.ERROR,errorModuleHandler);
				subModuleLoader1.addEventListener(ModuleEvent.UNLOAD,removeModuleLoaded);
			}
			
			public function handleModuleLoaded(e:ModuleEvent):void
			{
				trace('*****TESTTESTTEST***** moduleLoaded *****TESTTESTTEST*****');
				lbl00.text="ready? ";
				e.currentTarget.removeEventListener(ModuleEvent.READY, handleModuleLoaded);
				dispatchEvent(new FlexEvent("moduleLoaded"));
			}
			
			public function removeModuleLoaded(e:ModuleEvent):void
			{
				e.currentTarget.removeEventListener(ModuleEvent.UNLOAD, removeModuleLoaded);
				dispatchEvent(new FlexEvent("moduleRemoved"));
			}
			
			public function runmdBtn1():void
			{
				trace('*****TESTTESTTEST***** runmdBtn1 *****TESTTESTTEST*****');
				loadModule1()
			}
		]]>
	</fx:Script>
	
	<s:Label text="Module1" id="lbl00" />
	<s:Button id="mdBtn1" label="load SubModule1 Bill Sahlas" click="loadModule1()" />
	
	<s:Button id="mdBtn2" label="unload SubModule1" click="{subModuleLoader1.unloadModule(); subModuleLoader1.url=null;}" />
	<s:ModuleLoader id="subModuleLoader1" /> 
</s:Module>

