<?xml version="1.0"?>
<!--

  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:Application backgroundColor="0xFFFFFF"  xmlns:mx="http://www.adobe.com/2006/mxml" width="1200" height="800" xmlns="*"  >
    <mx:Script>
        <![CDATA[
            
            import mx.managers.PopUpManager;
            import mx.containers.TitleWindow;
            import flash.geom.Point;

            private var point1:Point = new Point();
            private function showWindow():void {
                var login:SimpleTitleWindowExample=SimpleTitleWindowExample(PopUpManager.createPopUp( this, SimpleTitleWindowExample , true));
                point1.x=0;
                point1.y=0;
                login.x=point1.x+100;
                login.y=point1.y+100;
                login.loginName=returnedName;
            }
        ]]>
    </mx:Script>
    <mx:Style source="assets/myStyles.css" />
    <mx:Style>
	@namespace "library://ns.adobe.com/flex/mx";
        TitleWindow
        {
            closeButtonSkin: ClassReference("comps.button_swfsymbol_embeded");
            closeButtonDisabledSkin: ClassReference(null);
            closeButtonDownSkin: ClassReference(null);
            closeButtonOverSkin: ClassReference(null);
            closeButtonUpSkin: ClassReference(null);
            icon: ClassReference("comps.icon_swfsymbol_embeded");

        }
    </mx:Style>

    <TitleWindowComp id="myTitleWindow_swfsymbol_embeded" />

    <mx:Text id="returnedName" text="" width="100%"/>

</mx:Application>
