<?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.

-->
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" remove="unloadIllustration();">
	
	<mx:Script>
	<![CDATA[
		import mx.controls.Alert;
		import mx.core.Application;
		import mx.core.FlexGlobals;
		import mx.modules.ModuleLoader;
		
		public var downloadPath:String = "";
		public var illustrationURL:String = "";
		public var autoExpand:Boolean = false;

		public function setLocation(path:String, isModule:String):void
		{			
			//mx.core.Application.application.button_expand.enabled = true;
			FlexGlobals.topLevelApplication.button_expand.enabled = true;
			
			if(isModule.toLowerCase() == "true")
			{
				this.removeChild(html_illustration);
				module_swfs.url = path;
				illustrationURL = "";
				FlexGlobals.topLevelApplication.button_browser.enabled = false;
			}
			else
			{				
				this.removeChild(module_swfs);
				html_illustration.location = path;
				illustrationURL = path;
				FlexGlobals.topLevelApplication.button_browser.enabled = true;

			}			
		}
		
		public function unloadIllustration():void {
			if (this.contains(html_illustration)) 
			{
				html_illustration.htmlText = ""; // hack - GAW
 				this.removeChild(html_illustration); // hack - GAW				
			} 
			else
			{	
				module_swfs.unloadModule();
 			}
		}
		
	]]>
	</mx:Script>
	
	<mx:Parallel id="arrowShow">
		<mx:Fade alphaFrom="0.5" alphaTo="1.0" duration="500"/>
	</mx:Parallel>

	<mx:Parallel id="arrowDim">	
		<mx:Fade alphaFrom="1.0" alphaTo="0.5" duration="500"/>
	</mx:Parallel>
		
	<mx:HTML id="html_illustration" width="100%" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off" />
	<mx:ModuleLoader id="module_swfs" height="100%" width="100%" backgroundColor="#323232" horizontalAlign="center" verticalAlign="middle" />

</mx:Canvas>
