<?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:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
		xmlns:s="library://ns.adobe.com/flex/spark" title="{data.title}" viewActivate="init(event)" viewDeactivate="deactivate(event)">
	<fx:Script>
		<![CDATA[
			import mx.core.FlexGlobals;
			
			import spark.events.ViewNavigatorEvent;
			
			private var myStageWebView:StageWebView;		
			private var currentFlexScalingFactor:Number = FlexGlobals.topLevelApplication.runtimeDPI/FlexGlobals.topLevelApplication.applicationDPI;
			
			protected function init(event:ViewNavigatorEvent):void
			{
				NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;
				
				myStageWebView = new StageWebView(true);
				myStageWebView.viewPort = new Rectangle(myRect.x, myRect.y*currentFlexScalingFactor+FlexGlobals.topLevelApplication.navigator.actionBar.height*currentFlexScalingFactor, myRect.width*currentFlexScalingFactor, myRect.height*currentFlexScalingFactor);
				myStageWebView.stage = this.stage;
				myStageWebView.loadURL("http://www.youtube.com/embed/"+data.url);
				myRect.addEventListener(Event.RESIZE, resizeWebView);
			}
			
			protected function deactivate(event:ViewNavigatorEvent):void
			{
				NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.NORMAL;
				myStageWebView.dispose();
				myRect.removeEventListener(Event.RESIZE, resizeWebView);
			}
			
			private function resizeWebView(event:Event):void{
				
				myStageWebView.viewPort = new Rectangle(myRect.x, myRect.y*currentFlexScalingFactor+FlexGlobals.topLevelApplication.navigator.actionBar.height*currentFlexScalingFactor, myRect.width*currentFlexScalingFactor, myRect.height*currentFlexScalingFactor);
			}
			
		]]>
	</fx:Script>

	
	<s:Spacer id="myRect" left="10" right="10" top="10" bottom="10"/>
	
	<s:navigationContent>
		<s:Button click="navigator.popView()">
			<s:icon>
				<s:MultiDPIBitmapSource source160dpi="@Embed('assets/icons/160/1_navigation_previous_item.png')"
										source240dpi="@Embed('assets/icons/240/1_navigation_previous_item.png')"
										source320dpi="@Embed('assets/icons/320/1_navigation_previous_item.png')"/>
			</s:icon>
		</s:Button>
	</s:navigationContent>
</s:View>
