<?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:VBox xmlns:fx="http://ns.adobe.com/mxml/2009"
		 xmlns:mx="library://ns.adobe.com/flex/mx"
		 width="100%" height="100%">

    <fx:Script>
        <![CDATA[

        import mx.rpc.events.ResultEvent;
        import mx.rpc.events.FaultEvent;
        import mx.controls.Alert;

		public var app:String;
			
        public function set source(file:String):void
        {
            label = file.substring(file.lastIndexOf("/")+1);
            srv.url = file;
            srv.send();
			ta.verticalScrollPosition = 19; // at end of header
        }

        private function resultHandler(event:ResultEvent):void
        {
            var str:String = String(event.result);
            var r:RegExp = new RegExp("\r\n", "gs");
            str = str.replace(r, "\r");
            ta.text = str;
        }

        private function faultHandler(event:FaultEvent):void
        {
            Alert.show("Error loading source file");
        }
			
		private function copyCode():void
        {
        	System.setClipboard(ta.text);
        }
		
		private function copyLink():void
        {
			var linkText:String = "http://flex.apache.org/tourdeflex/?app=" + app;
			
        	System.setClipboard(linkText);
        }
			
		private function viewInGitHub():void
		{
			var gitHubLink:String = "https://github.com/apache/flex-utilities/tree/master/TourDeFlex/TourDeFlex3/src/" + srv.url;
			var urlRequest:URLRequest = new URLRequest(gitHubLink);
			navigateToURL(urlRequest, "_blank");
		}

        ]]>
    </fx:Script>

	<fx:Declarations>
    	<mx:HTTPService id="srv" useProxy="false" resultFormat="text" result="resultHandler(event)" fault="faultHandler(event)"/>
	</fx:Declarations>
	
    <mx:TextArea id="ta" color="#0000A0" fontFamily="Courier" editable="false" wordWrap="false" width="100%" height="100%"/>
	<mx:HBox width="100%" paddingBottom="5" paddingRight="20">
		<mx:Spacer width="100%" />
		<mx:Button label="Copy" click="copyCode()" />
		<mx:Button label="Copy Link" click="copyLink()" />
		<mx:Button label="GitHub" click="viewInGitHub()" />
	</mx:HBox>
</mx:VBox>
