<?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="addPopUp()" >
	<s:layout><s:VerticalLayout/></s:layout>
	<fx:Declarations>

		<!-- Place non-visual elements (e.g., services, value objects) here -->

	</fx:Declarations>

	<fx:Script>

		<![CDATA[

			public var tw:SimpleTitleWindow;

			import mx.core.IFlexDisplayObject;

			import mx.managers.PopUpManager;

			import mx.events.FlexEvent;

			private function addPopUp():void

			{

				
				trace("*****************TITLEWINDOW********************");
				tw = new SimpleTitleWindow();

				tw.title="Simple TitleWindow";

				tw.width = 250;

				tw.x=30;

				tw.y=50;

				PopUpManager.addPopUp(tw,this,false);

				tw.addEventListener("creationComplete", handleTWCreationComplete);

				tw.addEventListener("close", closeHandler);

				

			}

			public function handleTWCreationComplete(e:FlexEvent):void

			{

				

				e.currentTarget.removeEventListener("creationComplete", handleTWCreationComplete);

				SimpleTitleWindow(e.currentTarget).closeButton.enabled=true;

			}

			private function closeHandler(event:Event):void

			{

				event.target.removeEventListener("close", closeHandler);

				PopUpManager.removePopUp(event.target as IFlexDisplayObject);

			}

		]]>

	</fx:Script>

	

</s:Module>

