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

<!DOCTYPE html>

<html> 
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>${title}</title>
    
    <style type="text/css"> 
        body { margin: 0; padding: 0; }   
        object:focus { outline: none; }
        #flashContent { display: none; }
        #${application} { border: 1px solid #172647; }
    </style>
    
    <!-- 
        SWFObject v2.2 <http://code.google.com/p/swfobject/> 
        is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
    -->
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
    
    <script type="text/javascript">
        /* use strict */
        
        var swfVersionStr, params, attributes;
        
        function displayType() {
            if ((window.top != window.self) && window.parent)
                return window.name;
                
            return "";
        }
        
        function init() {
            var prefix, theElement, theHeight, theWidth, widget;
            
    		if (displayType() != "") {
	    		if (typeof window.innerWidth === 'number') {
	    			theHeight = window.innerHeight;
	    			theWidth = window.innerWidth;
	    		} else {
	        		theElement = window.document.documentElement;
	
	    			theHeight = theElement.clientHeight;
	    			theWidth = theElement.clientWidth;
	    		}
	
	            widget = document.getElementById("${application}");
	            widget.style.height = (theHeight - 2) + "px";
	            widget.style.width = (theWidth - 2) + "px";
	        }
        }
        
        swfVersionStr = "${version_major}.${version_minor}.${version_revision}";
        flashVars = { serviceURL: "http://flex.apache.org/" };
        params = { quality: "high", bgcolor: "${bgcolor}", allowscriptaccess: "sameDomain",
            allowfullscreen: "true" };
        attributes = { id: "${application}", name: "${application}" };
        
        swfobject.embedSWF("${swf}.swf", "flashContent", "300", "300", 
            swfVersionStr, "", flashVars, params, attributes);
        
        swfobject.createCSS("#flashContent", "display: block;");
    </script>
    
</head>
<body onload="init();">
    <div id="flashContent">
        <script type="text/javascript"> 
            var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); 
            document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 
                            + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); 
        </script> 
    </div>
</body>
</html>
