crossdomain.xml. Just use "static_files" in the app.yaml:
> Author: nick
> Date: 2008-04-10 16:25:48 +0200 (Thu, 10 Apr 2008)
> New Revision: 1155
>
> Added:
> examples/trunk/google_appengine/
> examples/trunk/google_appengine/app.yaml
> examples/trunk/google_appengine/crossdomain.py
> examples/trunk/google_appengine/echo/
> examples/trunk/google_appengine/echo/__init__.py
> examples/trunk/google_appengine/echo/__init__.pyc
> examples/trunk/google_appengine/echo/gateway.py
> examples/trunk/google_appengine/echo/index.py
> examples/trunk/google_appengine/index.html
> examples/trunk/google_appengine/index.py
> examples/trunk/google_appengine/static/
> examples/trunk/google_appengine/static/echo_test.swf
> examples/trunk/google_appengine/static/swfobject/
> examples/trunk/google_appengine/static/swfobject/expressInstall.swf
> examples/trunk/google_appengine/static/swfobject/index.html
> examples/trunk/google_appengine/static/swfobject/index_dynamic.html
> examples/trunk/google_appengine/static/swfobject/src/
> examples/trunk/google_appengine/static/swfobject/src/expressInstall.as
> examples/trunk/google_appengine/static/swfobject/src/expressInstall.fla
> examples/trunk/google_appengine/static/swfobject/src/swfobject.js
> examples/trunk/google_appengine/static/swfobject/swfobject.js
> examples/trunk/google_appengine/static/swfobject/test.swf
> examples/trunk/google_appengine/templates/
> examples/trunk/google_appengine/templates/base.html
> examples/trunk/google_appengine/templates/swf.html
> Log:
> Adding working EchoTest Google AppEngine example
>
>
> Property changes on: examples/trunk/google_appengine
> ___________________________________________________________________
> Name: svn:ignore
> + *.pyc
> pyamf
>
>
> Added: examples/trunk/google_appengine/app.yaml
> ===================================================================
> --- examples/trunk/google_appengine/app.yaml (rev 0)
> +++ examples/trunk/google_appengine/app.yaml 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,22 @@
> +application: pyamf
> +version: 1
> +runtime: python
> +api_version: 1
> +
> +handlers:
> +- url: /
> + script: index.py
> +
> +- url: /crossdomain.xml
> + script: crossdomain.py
> +
> +# Echo demo urls
> +
> +- url: /echo
> + script: echo/index.py
> +
> +- url: /gateway/echo
> + script: echo/gateway.py
> +
> +- url: /static
> + static_dir: static
> \ No newline at end of file
>
> Added: examples/trunk/google_appengine/crossdomain.py
> ===================================================================
> --- examples/trunk/google_appengine/crossdomain.py (rev 0)
> +++ examples/trunk/google_appengine/crossdomain.py 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,7 @@
> +print 'Content-Type: application/xml'
> +print
> +print """<?xml version="1.0"?>
> +<!DOCTYPE cross-domain-policy SYSTEM "
http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
> +<cross-domain-policy>
> + <allow-access-from domain="*" />
> +</cross-domain-policy>"""
> \ No newline at end of file
>
> Added: examples/trunk/google_appengine/echo/__init__.py
> ===================================================================
> --- examples/trunk/google_appengine/echo/__init__.py (rev 0)
> +++ examples/trunk/google_appengine/echo/__init__.py 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,111 @@
> +# -*- encoding: utf-8 -*-
> +#
> +# Copyright (c) 2007-2008 The PyAMF Project.
> +# See LICENSE for details.
> +
> +"""
> +Echo test core functionality. This module sets up the class
> +mappings related to the echo_test.swf client on the
> +U{EchoTest<
http://pyamf.org/wiki/EchoTest>} wiki page.
> +
> +@author: U{Nick Joyce<mailto:
nick@...>}
> +@since: 0.1.0
> +"""
> +
> +from pyamf import register_class
> +
> +ECHO_NS = 'org.red5.server.webapp.echo'
> +
> +class RemoteClass(object):
> + """
> + This Python class is mapped to the clientside ActionScript class.
> + """
> + pass
> +
> +class ExternalizableClass(object):
> + """
> + An example of an externalizable class.
> + """
> + def __readamf__(self, input):
> + """
> + This function is invoked when the C{obj} needs to be deserialized.
> +
> + @type obj: L{ExternalizableClass}
> + @param obj: The object in question.
> + @param input: The input stream to read from.
> + @type input L{DataInput<pyamf.amf3.DataInput>}
> + """
> + assert input.readBoolean() == True
> + assert input.readBoolean() == False
> + assert input.readByte() == 0
> + assert input.readByte() == -1
> + assert input.readByte() == 1
> + assert input.readByte() == 127
> + assert input.readByte() == -127
> + assert input.readDouble() == 1.0
> + assert input.readFloat() == 2.0
> + assert input.readInt() == 0
> + assert input.readInt() == -1
> + assert input.readInt() == 1
> + input.readMultiByte(7, 'iso-8859-1')
> + input.readMultiByte(14, 'utf8')
> + assert input.readObject() == [1, 'one', 1.0]
> + assert input.readShort() == 0
> + assert input.readShort() == -1
> + assert input.readShort() == 1
> + assert input.readUnsignedInt() == 0
> + assert input.readUnsignedInt() == 1
> + assert input.readUTF() == "Hello world!"
> + assert input.readUTFBytes(12) == "Hello world!"
> +
> + def __writeamf__(self, output):
> + """
> + This function is invoked when the C{obj} needs to be serialized.
> +
> + @type obj: L{ExternalizableClass}
> + @param obj: The object in question.
> + @param input: The output stream to write to.
> + @type input L{DataOutput<pyamf.amf3.DataOutput>}
> + """
> + output.writeBoolean(True)
> + output.writeBoolean(False)
> + output.writeByte(0)
> + output.writeByte(-1)
> + output.writeByte(1)
> + output.writeByte(127)
> + output.writeByte(-127)
> + output.writeDouble(1.0)
> + output.writeFloat(2.0)
> + output.writeInt(0)
> + output.writeInt(-1)
> + output.writeInt(1)
> + output.writeMultiByte(u"\xe4\xf6\xfc\xc4\xd6\xdc\xdf", 'iso-8859-1')
> + output.writeMultiByte(u"\xe4\xf6\xfc\xc4\xd6\xdc\xdf", 'utf8')
> + output.writeObject([1, 'one', 1])
> + output.writeShort(0)
> + output.writeShort(-1)
> + output.writeShort(1)
> + output.writeUnsignedInt(0)
> + output.writeUnsignedInt(1)
> + output.writeUTF("Hello world!")
> + output.writeUTFBytes("Hello world!")
> +
> +def echo(data):
> + """
> + Return data back to the client.
> +
> + @type data: C{mixed}
> + @param data: Decoded AS->Python data.
> + """
> + return data
> +
> +# Map ActionScript class to Python class
> +try:
> + register_class(RemoteClass, '%s.%s' % (ECHO_NS, 'RemoteClass'))
> +except ValueError:
> + pass
> +try:
> + register_class(ExternalizableClass, '%s.%s' % (ECHO_NS,
> + 'ExternalizableClass'), metadata=['external'])
> +except ValueError:
> + pass
>
> Added: examples/trunk/google_appengine/echo/__init__.pyc
> ===================================================================
> (Binary files differ)
>
>
> Property changes on: examples/trunk/google_appengine/echo/__init__.pyc
> ___________________________________________________________________
> Name: svn:mime-type
> + application/octet-stream
>
> Added: examples/trunk/google_appengine/echo/gateway.py
> ===================================================================
> --- examples/trunk/google_appengine/echo/gateway.py (rev 0)
> +++ examples/trunk/google_appengine/echo/gateway.py 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,17 @@
> +from pyamf.remoting.gateway.wsgi import WSGIGateway
> +from google.appengine.ext.webapp import util
> +
> +from echo import echo
> +
> +services = {
> + 'echo': echo,
> + 'echo.echo': echo
> +}
> +
> +def main():
> + gateway = WSGIGateway(services)
> +
> + util.run_wsgi_app(gateway)
> +
> +if __name__ == "__main__":
> + main()
> \ No newline at end of file
>
> Added: examples/trunk/google_appengine/echo/index.py
> ===================================================================
> --- examples/trunk/google_appengine/echo/index.py (rev 0)
> +++ examples/trunk/google_appengine/echo/index.py 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,10 @@
> +from google.appengine.ext.webapp import template
> +
> +print "Content-Type: text/html"
> +print
> +print template.render('../templates/swf.html', {
> + 'swf_url': '/static/echo_test.swf',
> + 'width': '100%',
> + 'height': '100%',
> + 'flash_ver': '9.0.0'
> +})
> \ No newline at end of file
>
> Added: examples/trunk/google_appengine/index.html
> ===================================================================
> --- examples/trunk/google_appengine/index.html (rev 0)
> +++ examples/trunk/google_appengine/index.html 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,11 @@
> +{% extends "templates/base.html" %}
> +
> +{% block title %}PyAMF/Google App Engine Demo Application{% endblock %}
> +
> +{% block body %}
> +<h1><a href="
http://pyamf.org">PyAMF</a>/<a href="">Google App Engine</a> Demo Application</h1>
> +<h2>Available demos:</h2>
> +<ul>
> + <li><a href="/echo">EchoTest</a> - Tests all parts of the AMF specification, including AMF0, AMF3 and RemoteObject</li>
> +</ul>
> +{% endblock %}
> \ No newline at end of file
>
> Added: examples/trunk/google_appengine/index.py
> ===================================================================
> --- examples/trunk/google_appengine/index.py (rev 0)
> +++ examples/trunk/google_appengine/index.py 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,5 @@
> +from google.appengine.ext.webapp import template
> +
> +print "Content-Type: text/html"
> +print
> +print template.render('index.html', {})
> \ No newline at end of file
>
> Added: examples/trunk/google_appengine/static/echo_test.swf
> ===================================================================
> (Binary files differ)
>
>
> Property changes on: examples/trunk/google_appengine/static/echo_test.swf
> ___________________________________________________________________
> Name: svn:mime-type
> + application/octet-stream
>
> Added: examples/trunk/google_appengine/static/swfobject/expressInstall.swf
> ===================================================================
> (Binary files differ)
>
>
> Property changes on: examples/trunk/google_appengine/static/swfobject/expressInstall.swf
> ___________________________________________________________________
> Name: svn:executable
> + *
> Name: svn:mime-type
> + application/octet-stream
>
> Added: examples/trunk/google_appengine/static/swfobject/index.html
> ===================================================================
> --- examples/trunk/google_appengine/static/swfobject/index.html (rev 0)
> +++ examples/trunk/google_appengine/static/swfobject/index.html 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,28 @@
> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> +<html xmlns="
http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
> + <head>
> + <title>SWFObject v2.0 sample page</title>
> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
> + <script type="text/javascript" src="swfobject.js"></script>
> + <script type="text/javascript">
> + swfobject.registerObject("myId", "9.0.0", "expressInstall.swf");
> + </script>
> + </head>
> + <body>
> + <div>
> + <object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120">
> + <param name="movie" value="test.swf" />
> + <!--[if !IE]>-->
> + <object type="application/x-shockwave-flash" data="test.swf" width="300" height="120">
> + <!--<![endif]-->
> + <div>
> + <h1>Alternative content</h1>
> + <p><a href="
http://www.adobe.com/go/getflashplayer"><img src="
http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
> + </div>
> + <!--[if !IE]>-->
> + </object>
> + <!--<![endif]-->
> + </object>
> + </div>
> + </body>
> +</html>
>
>
> Property changes on: examples/trunk/google_appengine/static/swfobject/index.html
> ___________________________________________________________________
> Name: svn:executable
> + *
>
> Added: examples/trunk/google_appengine/static/swfobject/index_dynamic.html
> ===================================================================
> --- examples/trunk/google_appengine/static/swfobject/index_dynamic.html (rev 0)
> +++ examples/trunk/google_appengine/static/swfobject/index_dynamic.html 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,17 @@
> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> +<html xmlns="
http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
> + <head>
> + <title>SWFObject v2.0 dynamic embed sample page</title>
> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
> + <script type="text/javascript" src="swfobject.js"></script>
> + <script type="text/javascript">
> + swfobject.embedSWF("test.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf");
> + </script>
> + </head>
> + <body>
> + <div id="myContent">
> + <h1>Alternative content</h1>
> + <p><a href="
http://www.adobe.com/go/getflashplayer"><img src="
http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
> + </div>
> + </body>
> +</html>
>
>
> Property changes on: examples/trunk/google_appengine/static/swfobject/index_dynamic.html
> ___________________________________________________________________
> Name: svn:executable
> + *
>
> Added: examples/trunk/google_appengine/static/swfobject/src/expressInstall.as
> ===================================================================
> --- examples/trunk/google_appengine/static/swfobject/src/expressInstall.as (rev 0)
> +++ examples/trunk/google_appengine/static/swfobject/src/expressInstall.as 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,76 @@
> +/* =============================
> + SWFObject v2.0 <
http://code.google.com/p/swfobject/>
> + Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
> + This software is released under the MIT License <
http://www.opensource.org/licenses/mit-license.php>
> + =============================
> + Express Install
> + Copyright (c) 2005-2007 Adobe Systems Incorporated and its licensors. All Rights Reserved.
> + =============================
> + AS1 version
> + =============================
> +*/
> +
> +System.security.allowDomain("fpdownload.macromedia.com");
> +
> +var cacheBuster = Math.random();
> +var updateSWF = "
http://fpdownload.macromedia.com/pub/flashplayer/update/current/swf/autoUpdater.swf?"+cacheBuster;
> +var bytes = loaderClip.getBytesTotal();
> +loaderClip.loadMovie(updateSWF);
> +
> +var time = 0;
> +var timeOut = 5; // expressed in seconds
> +var delay = 10; // expressed in milliseconds
> +var id = setInterval(checkLoaded, delay);
> +
> +function checkLoaded(){
> + if(loaderClip.startUpdate.toString() == "[type Function]"){
> + // updater has loaded successfully
> + clearInterval(id);
> + loadComplete();
> + return;
> + }
> + else if(time > timeOut){
> + // updater did not load in time, abort load and force alternative content
> + clearInterval(id);
> + loaderClip.unloadMovie();
> + loadTimeOut();
> + return;
> + }
> + time += delay/1000;
> +}
> +
> +function loadComplete(){
> + loaderClip.redirectURL = _root.MMredirectURL;
> + loaderClip.MMplayerType = _root.MMplayerType;
> + loaderClip.MMdoctitle = _root.MMdoctitle;
> + loaderClip.startUpdate();
> +}
> +
> +function loadTimeOut(){
> + callbackSWFObject();
> +}
> +
> +function installStatus(statusValue){
> + switch(statusValue){
> + case "Download.Complete":
> + // Installation is complete.
> + // In most cases the browser window that this SWF is hosted in will be closed by the installer or
> + // otherwise it has to be closed manually by the end user.
> + // The Adobe Flash installer will reopen the browser window and reload the page containing the SWF.
> + break;
> + case "Download.Cancelled":
> + // The end user chose "NO" when prompted to install the new player.
> + // By default the SWFObject callback function is called to force alternative content.
> + callbackSWFObject();
> + break;
> + case "Download.Failed":
> + // The end user failed to download the installer due to a network failure.
> + // By default the SWFObject callback function is called to force alternative content.
> + callbackSWFObject();
> + break;
> + }
> +}
> +
> +function callbackSWFObject(){
> + getURL("javascript:swfobject.expressInstallCallback();");
> +}
> \ No newline at end of file
>
>
> Property changes on: examples/trunk/google_appengine/static/swfobject/src/expressInstall.as
> ___________________________________________________________________
> Name: svn:executable
> + *
>
> Added: examples/trunk/google_appengine/static/swfobject/src/expressInstall.fla
> ===================================================================
> (Binary files differ)
>
>
> Property changes on: examples/trunk/google_appengine/static/swfobject/src/expressInstall.fla
> ___________________________________________________________________
> Name: svn:executable
> + *
> Name: svn:mime-type
> + application/octet-stream
>
> Added: examples/trunk/google_appengine/static/swfobject/src/swfobject.js
> ===================================================================
> --- examples/trunk/google_appengine/static/swfobject/src/swfobject.js (rev 0)
> +++ examples/trunk/google_appengine/static/swfobject/src/swfobject.js 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,631 @@
> +/*! SWFObject v2.0 <
http://code.google.com/p/swfobject/>
> + Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
> + This software is released under the MIT License <
http://www.opensource.org/licenses/mit-license.php>
> +*/
> +
> +var swfobject = function() {
> +
> + var UNDEF = "undefined",
> + OBJECT = "object",
> + SHOCKWAVE_FLASH = "Shockwave Flash",
> + SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
> + FLASH_MIME_TYPE = "application/x-shockwave-flash",
> + EXPRESS_INSTALL_ID = "SWFObjectExprInst",
> +
> + win = window,
> + doc = document,
> + nav = navigator,
> +
> + domLoadFnArr = [],
> + regObjArr = [],
> + timer = null,
> + storedAltContent = null,
> + storedAltContentId = null,
> + isDomLoaded = false,
> + isExpressInstallActive = false;
> +
> + /* Centralized function for browser feature detection
> + - Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
> + - User agent string detection is only used when no alternative is possible
> + - Is executed directly for optimal performance
> + */
> + var ua = function() {
> + var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF && typeof doc.appendChild != UNDEF && typeof doc.replaceChild != UNDEF && typeof doc.removeChild != UNDEF && typeof doc.cloneNode != UNDEF,
> + playerVersion = [0,0,0],
> + d = null;
> + if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
> + d = nav.plugins[SHOCKWAVE_FLASH].description;
> + if (d) {
> + d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
> + playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
> + playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
> + playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
> + }
> + }
> + else if (typeof win.ActiveXObject != UNDEF) {
> + var a = null, fp6Crash = false;
> + try {
> + a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
> + }
> + catch(e) {
> + try {
> + a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
> + playerVersion = [6,0,21];
> + a.AllowScriptAccess = "always"; // Introduced in fp6.0.47
> + }
> + catch(e) {
> + if (playerVersion[0] == 6) {
> + fp6Crash = true;
> + }
> + }
> + if (!fp6Crash) {
> + try {
> + a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
> + }
> + catch(e) {}
> + }
> + }
> + if (!fp6Crash && a) { // a will return null when ActiveX is disabled
> + try {
> + d = a.GetVariable("$version"); // Will crash fp6.0.21/23/29
> + if (d) {
> + d = d.split(" ")[1].split(",");
> + playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
> + }
> + }
> + catch(e) {}
> + }
> + }
> + var u = nav.userAgent.toLowerCase(),
> + p = nav.platform.toLowerCase(),
> + webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
> + ie = false,
> + windows = p ? /win/.test(p) : /win/.test(u),
> + mac = p ? /mac/.test(p) : /mac/.test(u);
> + /*@cc_on
> + ie = true;
> + @if (@_win32)
> + windows = true;
> + @elif (@_mac)
> + mac = true;
> + @end
> + @*/
> + return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac };
> + }();
> +
> + /* Cross-browser onDomLoad
> + - Based on Dean Edwards' solution:
http://dean.edwards.name/weblog/2006/06/again/> + - Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
> + */
> + var onDomLoad = function() {
> + if (!ua.w3cdom) {
> + return;
> + }
> + addDomLoadEvent(main);
> + if (ua.ie && ua.win) {
> + try { // Avoid a possible Operation Aborted error
> + doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors
> + var s = getElementById("__ie_ondomload");
> + if (s) {
> + s.onreadystatechange = function() {
> + if (this.readyState == "complete") {
> + this.parentNode.removeChild(this);
> + callDomLoadFunctions();
> + }
> + };
> + }
> + }
> + catch(e) {}
> + }
> + if (ua.webkit && typeof doc.readyState != UNDEF) {
> + timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10);
> + }
> + if (typeof doc.addEventListener != UNDEF) {
> + doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
> + }
> + addLoadEvent(callDomLoadFunctions);
> + }();
> +
> + function callDomLoadFunctions() {
> + if (isDomLoaded) {
> + return;
> + }
> + if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
> + var s = createElement("span");
> + try { // Avoid a possible Operation Aborted error
> + var t = doc.getElementsByTagName("body")[0].appendChild(s);
> + t.parentNode.removeChild(t);
> + }
> + catch (e) {
> + return;
> + }
> + }
> + isDomLoaded = true;
> + if (timer) {
> + clearInterval(timer);
> + timer = null;
> + }
> + var dl = domLoadFnArr.length;
> + for (var i = 0; i < dl; i++) {
> + domLoadFnArr[i]();
> + }
> + }
> +
> + function addDomLoadEvent(fn) {
> + if (isDomLoaded) {
> + fn();
> + }
> + else {
> + domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
> + }
> + }
> +
> + /* Cross-browser onload
> + - Based on James Edwards' solution:
http://brothercake.com/site/resources/scripts/onload/> + - Will fire an event as soon as a web page including all of its assets are loaded
> + */
> + function addLoadEvent(fn) {
> + if (typeof win.addEventListener != UNDEF) {
> + win.addEventListener("load", fn, false);
> + }
> + else if (typeof doc.addEventListener != UNDEF) {
> + doc.addEventListener("load", fn, false);
> + }
> + else if (typeof win.attachEvent != UNDEF) {
> + win.attachEvent("onload", fn);
> + }
> + else if (typeof win.onload == "function") {
> + var fnOld = win.onload;
> + win.onload = function() {
> + fnOld();
> + fn();
> + };
> + }
> + else {
> + win.onload = fn;
> + }
> + }
> +
> + /* Main function
> + - Will preferably execute onDomLoad, otherwise onload (as a fallback)
> + */
> + function main() { // Static publishing only
> + var rl = regObjArr.length;
> + for (var i = 0; i < rl; i++) { // For each registered object element
> + var id = regObjArr[i].id;
> + if (ua.pv[0] > 0) {
> + var obj = getElementById(id);
> + if (obj) {
> + regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
> + regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
> + if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
> + if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements
> + fixParams(obj);
> + }
> + setVisibility(id, true);
> + }
> + else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
> + showExpressInstall(regObjArr[i]);
> + }
> + else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
> + displayAltContent(obj);
> + }
> + }
> + }
> + else { // If no fp is installed, we let the object element do its job (show alternative content)
> + setVisibility(id, true);
> + }
> + }
> + }
> +
> + /* Fix nested param elements, which are ignored by older webkit engines
> + - This includes Safari up to and including version 1.2.2 on Mac OS 10.3
> + - Fall back to the proprietary embed element
> + */
> + function fixParams(obj) {
> + var nestedObj = obj.getElementsByTagName(OBJECT)[0];
> + if (nestedObj) {
> + var e = createElement("embed"), a = nestedObj.attributes;
> + if (a) {
> + var al = a.length;
> + for (var i = 0; i < al; i++) {
> + if (a[i].nodeName.toLowerCase() == "data") {
> + e.setAttribute("src", a[i].nodeValue);
> + }
> + else {
> + e.setAttribute(a[i].nodeName, a[i].nodeValue);
> + }
> + }
> + }
> + var c = nestedObj.childNodes;
> + if (c) {
> + var cl = c.length;
> + for (var j = 0; j < cl; j++) {
> + if (c[j].nodeType == 1 && c[j].nodeName.toLowerCase() == "param") {
> + e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
> + }
> + }
> + }
> + obj.parentNode.replaceChild(e, obj);
> + }
> + }
> +
> + /* Fix hanging audio/video threads and force open sockets and NetConnections to disconnect
> + - Occurs when unloading a web page in IE using fp8+ and innerHTML/outerHTML
> + - Dynamic publishing only
> + */
> + function fixObjectLeaks(id) {
> + if (ua.ie && ua.win && hasPlayerVersion("8.0.0")) {
> + win.attachEvent("onunload", function () {
> + var obj = getElementById(id);
> + if (obj) {
> + for (var i in obj) {
> + if (typeof obj[i] == "function") {
> + obj[i] = function() {};
> + }
> + }
> + obj.parentNode.removeChild(obj);
> + }
> + });
> + }
> + }
> +
> + /* Show the Adobe Express Install dialog
> + - Reference:
http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75> + */
> + function showExpressInstall(regObj) {
> + isExpressInstallActive = true;
> + var obj = getElementById(regObj.id);
> + if (obj) {
> + if (regObj.altContentId) {
> + var ac = getElementById(regObj.altContentId);
> + if (ac) {
> + storedAltContent = ac;
> + storedAltContentId = regObj.altContentId;
> + }
> + }
> + else {
> + storedAltContent = abstractAltContent(obj);
> + }
> + if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
> + regObj.width = "310";
> + }
> + if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
> + regObj.height = "137";
> + }
> + doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
> + var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
> + dt = doc.title,
> + fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
> + replaceId = regObj.id;
> + // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
> + // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
> + if (ua.ie && ua.win && obj.readyState != 4) {
> + var newObj = createElement("div");
> + replaceId += "SWFObjectNew";
> + newObj.setAttribute("id", replaceId);
> + obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
> + obj.style.display = "none";
> + win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
> + }
> + createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
> + }
> + }
> +
> + /* Functions to abstract and display alternative content
> + */
> + function displayAltContent(obj) {
> + if (ua.ie && ua.win && obj.readyState != 4) {
> + // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
> + // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
> + var el = createElement("div");
> + obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
> + el.parentNode.replaceChild(abstractAltContent(obj), el);
> + obj.style.display = "none";
> + win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
> + }
> + else {
> + obj.parentNode.replaceChild(abstractAltContent(obj), obj);
> + }
> + }
> +
> + function abstractAltContent(obj) {
> + var ac = createElement("div");
> + if (ua.win && ua.ie) {
> + ac.innerHTML = obj.innerHTML;
> + }
> + else {
> + var nestedObj = obj.getElementsByTagName(OBJECT)[0];
> + if (nestedObj) {
> + var c = nestedObj.childNodes;
> + if (c) {
> + var cl = c.length;
> + for (var i = 0; i < cl; i++) {
> + if (!(c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param") && !(c[i].nodeType == 8)) {
> + ac.appendChild(c[i].cloneNode(true));
> + }
> + }
> + }
> + }
> + }
> + return ac;
> + }
> +
> + /* Cross-browser dynamic SWF creation
> + */
> + function createSWF(attObj, parObj, id) {
> + var r, el = getElementById(id);
> + if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
> + attObj.id = id;
> + }
> + if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
> + var att = "";
> + for (var i in attObj) {
> + if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
> + if (i == "data") {
> + parObj.movie = attObj[i];
> + }
> + else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
> + att += ' class="' + attObj[i] + '"';
> + }
> + else if (i != "classid") {
> + att += ' ' + i + '="' + attObj[i] + '"';
> + }
> + }
> + }
> + var par = "";
> + for (var j in parObj) {
> + if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
> + par += '<param name="' + j + '" value="' + parObj[j] + '" />';
> + }
> + }
> + el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
> + fixObjectLeaks(attObj.id); // This bug affects dynamic publishing only
> + r = getElementById(attObj.id);
> + }
> + else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
> + var e = createElement("embed");
> + e.setAttribute("type", FLASH_MIME_TYPE);
> + for (var k in attObj) {
> + if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
> + if (k == "data") {
> + e.setAttribute("src", attObj[k]);
> + }
> + else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
> + e.setAttribute("class", attObj[k]);
> + }
> + else if (k != "classid") { // Filter out IE specific attribute
> + e.setAttribute(k, attObj[k]);
> + }
> + }
> + }
> + for (var l in parObj) {
> + if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
> + if (l != "movie") { // Filter out IE specific param element
> + e.setAttribute(l, parObj[l]);
> + }
> + }
> + }
> + el.parentNode.replaceChild(e, el);
> + r = e;
> + }
> + else { // Well-behaving browsers
> + var o = createElement(OBJECT);
> + o.setAttribute("type", FLASH_MIME_TYPE);
> + for (var m in attObj) {
> + if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
> + if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
> + o.setAttribute("class", attObj[m]);
> + }
> + else if (m != "classid") { // Filter out IE specific attribute
> + o.setAttribute(m, attObj[m]);
> + }
> + }
> + }
> + for (var n in parObj) {
> + if (parObj[n] != Object.prototype[n] && n != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
> + createObjParam(o, n, parObj[n]);
> + }
> + }
> + el.parentNode.replaceChild(o, el);
> + r = o;
> + }
> + return r;
> + }
> +
> + function createObjParam(el, pName, pValue) {
> + var p = createElement("param");
> + p.setAttribute("name", pName);
> + p.setAttribute("value", pValue);
> + el.appendChild(p);
> + }
> +
> + function getElementById(id) {
> + return doc.getElementById(id);
> + }
> +
> + function createElement(el) {
> + return doc.createElement(el);
> + }
> +
> + function hasPlayerVersion(rv) {
> + var pv = ua.pv, v = rv.split(".");
> + v[0] = parseInt(v[0], 10);
> + v[1] = parseInt(v[1], 10);
> + v[2] = parseInt(v[2], 10);
> + return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
> + }
> +
> + /* Cross-browser dynamic CSS creation
> + - Based on Bobby van der Sluis' solution:
http://www.bobbyvandersluis.com/articles/dynamicCSS.php> + */
> + function createCSS(sel, decl) {
> + if (ua.ie && ua.mac) {
> + return;
> + }
> + var h = doc.getElementsByTagName("head")[0], s = createElement("style");
> + s.setAttribute("type", "text/css");
> + s.setAttribute("media", "screen");
> + if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
> + s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
> + }
> + h.appendChild(s);
> + if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
> + var ls = doc.styleSheets[doc.styleSheets.length - 1];
> + if (typeof ls.addRule == OBJECT) {
> + ls.addRule(sel, decl);
> + }
> + }
> + }
> +
> + function setVisibility(id, isVisible) {
> + var v = isVisible ? "visible" : "hidden";
> + if (isDomLoaded) {
> + getElementById(id).style.visibility = v;
> + }
> + else {
> + createCSS("#" + id, "visibility:" + v);
> + }
> + }
> +
> + return {
> + /* Public API
> + - Reference:
http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation> + */
> + registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
> + if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
> + return;
> + }
> + var regObj = {};
> + regObj.id = objectIdStr;
> + regObj.swfVersion = swfVersionStr;
> + regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
> + regObjArr[regObjArr.length] = regObj;
> + setVisibility(objectIdStr, false);
> + },
> +
> + getObjectById: function(objectIdStr) {
> + var r = null;
> + if (ua.w3cdom && isDomLoaded) {
> + var o = getElementById(objectIdStr);
> + if (o) {
> + var n = o.getElementsByTagName(OBJECT)[0];
> + if (!n || (n && typeof o.SetVariable != UNDEF)) {
> + r = o;
> + }
> + else if (typeof n.SetVariable != UNDEF) {
> + r = n;
> + }
> + }
> + }
> + return r;
> + },
> +
> + embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
> + if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
> + return;
> + }
> + widthStr += ""; // Auto-convert to string to make it idiot proof
> + heightStr += "";
> + if (hasPlayerVersion(swfVersionStr)) {
> + setVisibility(replaceElemIdStr, false);
> + var att = (typeof attObj == OBJECT) ? attObj : {};
> + att.data = swfUrlStr;
> + att.width = widthStr;
> + att.height = heightStr;
> + var par = (typeof parObj == OBJECT) ? parObj : {};
> + if (typeof flashvarsObj == OBJECT) {
> + for (var i in flashvarsObj) {
> + if (flashvarsObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
> + if (typeof par.flashvars != UNDEF) {
> + par.flashvars += "&" + i + "=" + flashvarsObj[i];
> + }
> + else {
> + par.flashvars = i + "=" + flashvarsObj[i];
> + }
> + }
> + }
> + }
> + addDomLoadEvent(function() {
> + createSWF(att, par, replaceElemIdStr);
> + if (att.id == replaceElemIdStr) {
> + setVisibility(replaceElemIdStr, true);
> + }
> + });
> + }
> + else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
> + setVisibility(replaceElemIdStr, false);
> + addDomLoadEvent(function() {
> + var regObj = {};
> + regObj.id = regObj.altContentId = replaceElemIdStr;
> + regObj.width = widthStr;
> + regObj.height = heightStr;
> + regObj.expressInstall = xiSwfUrlStr;
> + showExpressInstall(regObj);
> + });
> + }
> + },
> +
> + getFlashPlayerVersion: function() {
> + return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
> + },
> +
> + hasFlashPlayerVersion:hasPlayerVersion,
> +
> + createSWF: function(attObj, parObj, replaceElemIdStr) {
> + if (ua.w3cdom && isDomLoaded) {
> + return createSWF(attObj, parObj, replaceElemIdStr);
> + }
> + else {
> + return undefined;
> + }
> + },
> +
> + createCSS: function(sel, decl) {
> + if (ua.w3cdom) {
> + createCSS(sel, decl);
> + }
> + },
> +
> + addDomLoadEvent:addDomLoadEvent,
> +
> + addLoadEvent:addLoadEvent,
> +
> + getQueryParamValue: function(param) {
> + var q = doc.location.search || doc.location.hash;
> + if (param == null) {
> + return q;
> + }
> + if(q) {
> + var pairs = q.substring(1).split("&");
> + for (var i = 0; i < pairs.length; i++) {
> + if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
> + return pairs[i].substring((pairs[i].indexOf("=") + 1));
> + }
> + }
> + }
> + return "";
> + },
> +
> + // For internal usage only
> + expressInstallCallback: function() {
> + if (isExpressInstallActive && storedAltContent) {
> + var obj = getElementById(EXPRESS_INSTALL_ID);
> + if (obj) {
> + obj.parentNode.replaceChild(storedAltContent, obj);
> + if (storedAltContentId) {
> + setVisibility(storedAltContentId, true);
> + if (ua.ie && ua.win) {
> + storedAltContent.style.display = "block";
> + }
> + }
> + storedAltContent = null;
> + storedAltContentId = null;
> + isExpressInstallActive = false;
> + }
> + }
> + }
> +
> + };
> +
> +}();
>
>
> Property changes on: examples/trunk/google_appengine/static/swfobject/src/swfobject.js
> ___________________________________________________________________
> Name: svn:executable
> + *
>
> Added: examples/trunk/google_appengine/static/swfobject/swfobject.js
> ===================================================================
> --- examples/trunk/google_appengine/static/swfobject/swfobject.js (rev 0)
> +++ examples/trunk/google_appengine/static/swfobject/swfobject.js 2008-04-10 14:25:48 UTC (rev 1155)
> @@ -0,0 +1,5 @@
> +/* SWFObject v2.0 <
http://code.google.com/p/swfobject/>
> + Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
> + This software is released under the MIT License <
http://www.opensource.org/licenses/mit-license.php>
> +*/
> +var swfobject=function(){var Z="undefined",P="object",B="Shockwave Flash",h="ShockwaveFlash.ShockwaveFlash",W="application/x-shockwave-flash",K="SWFObjectExprInst",G=window,g=document,N=navigator,f=[],H=[],Q=null,L=null,T=null,S=false,C=false;var a=function(){var l=typeof g.getElementById!=Z&&typeof g.getElementsByTagName!=Z&&typeof g.createElement!=Z&&typeof g.appendChild!=Z&&typeof g.replaceChild!=Z&&typeof g.removeChild!=Z&&typeof g.cloneNode!=Z,t=[0,0,0],n=null;if(typeof N.plugins!=Z&&typeof N.plugins[B]==P){n=N.plugins[B].description;if(n){n=n.replace(/^.*\s+(\S+\s+\S+$)/,"$1");t[0]=parseInt(n.replace(/^(.*)\..*$/,"$1"),10);t[1]=parseInt(n.replace(/^.*\.(.*)\s.*$/,"$1"),10);t[2]=/r/.test(n)?parseInt(n.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof G.ActiveXObject!=Z){var o=null,s=false;try{o=new ActiveXObject(h+".7")}catch(k){try{o=new ActiveXObject(h+".6");t=[6,0,21];o.AllowScriptAccess="always"}catch(k){if(t[0]==6){s=true}}if(!s){try{o=new ActiveXObject(h)}catch(k
> }}if(!s&&o){try{n=o.GetVariable("$version");if(n){n=n.split(" ")[1].split(",");t=[parseInt(n[0],10),parseInt(n[1],10),parseInt(n[2],10)]}}catch(k){}}}}var v=N.userAgent.toLowerCase(),j=N.platform.toLowerCase(),r=/webkit/.test(v)?parseFloat(v.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,i=false,q=j?/win/.test(j):/win/.test(v),m=j?/mac/.test(j):/mac/.test(v);/*@cc_on i=true;@if(@_win32)q=true;@elif(@_mac)m=true;@end@*/return{w3cdom:l,pv:t,webkit:r,ie:i,win:q,mac:m}}();var e=function(){if(!a.w3cdom){return }J(I);if(a.ie&&a.win){try{g.write("<script id=__ie_ondomload defer=true src=//:><\/script>");var i=c("__ie_ondomload");if(i){i.onreadystatechange=function(){if(this.readyState=="complete"){this.parentNode.removeChild(this);V()}}}}catch(j){}}if(a.webkit&&typeof g.readyState!=Z){Q=setInterval(function(){if(/loaded|complete/.test(g.readyState)){V()}},10)}if(typeof g.addEventListener!=Z){g.addEventListener("DOMContentLoaded",V,null)}M(V)}();function V(){if(S){return }if(
> e&&a.win){var m=Y("span");try{var l=g.getElementsByTagName("body")[0].appendChild(m);l.parentNode.removeChild(l)}catch(n){return }}S=true;if(Q){clearInterval(Q);Q=null}var j=f.length;for(var k=0;k<j;k++){f[k]()}}function J(i){if(S){i()}else{f[f.length]=i}}function M(j){if(typeof G.addEventListener!=Z){G.addEventListener("load",j,false)}else{if(typeof g.addEventListener!=Z){g.addEventListener("load",j,false)}else{if(typeof G.attachEvent!=Z){G.attachEvent("onload",j)}else{if(typeof G.onload=="function"){var i=G.onload;G.onload=function(){i();j()}}else{G.onload=j}}}}}function I(){var l=H.length;for(var j=0;j<l;j++){var m=H[j].id;if(a.pv[0]>0){var k=c(m);if(k){H[j].width=k.getAttribute("width")?k.getAttribute("width"):"0";H[j].height=k.getAttribute("height")?k.getAttribute("height"):"0";if(O(H[j].swfVersion)){if(a.webkit&&a.webkit<312){U(k)}X(m,true)}else{if(H[j].expressInstall&&!C&&O("6.0.65")&&(a.win||a.mac)){D(H[j])}else{d(k)}}}}else{X(m,true)}}}function U(m){var k=m.getEl
> ntsByTagName(P)[0];if(k){var p=Y("embed"),r=k.attributes;if(r){var o=r.length;for(var n=0;n<o;n++){if(r[n].nodeName.toLowerCase()=="data"){p.setAttribute("src",r[n].nodeValue)}else{p.setAttribute(r[n].nodeName,r[n].nodeValue)}}}var q=k.childNodes;if(q){var s=q.length;for(var l=0;l<s;l++){if(q[l].nodeType==1&&q[l].nodeName.toLowerCase()=="param"){p.setAttribute(q[l].getAttribute("name"),q[l].getAttribute("value"))}}}m.parentNode.replaceChild(p,m)}}function F(i){if(a.ie&&a.win&&O("8.0.0")){G.attachEvent("onunload",function(){var k=c(i);if(k){for(var j in k){if(typeof k[j]=="function"){k[j]=function(){}}}k.parentNode.removeChild(k)}})}}function D(j){C=true;var o=c(j.id);if(o){if(j.altContentId){var l=c(j.altContentId);if(l){L=l;T=j.altContentId}}else{L=b(o)}if(!(/%$/.test(j.width))&&parseInt(j.width,10)<310){j.width="310"}if(!(/%$/.test(j.height))&&parseInt(j.height,10)<137){j.height="137"}g.title=g.title.slice(0,47)+" - Flash Player Installation";var n=a.ie&&a.win?"ActiveX"
> lugIn",k=g.title,m="MMredirectURL="+G.location+"&MMplayerType="+n+"&MMdoctitle="+k,p=j.id;if(a.ie&&a.win&&o.readyState!=4){var i=Y("div");p+="SWFObjectNew";i.setAttribute("id",p);o.parentNode.insertBefore(i,o);o.style.display="none";G.attachEvent("onload",function(){o.parentNode.removeChild(o)})}R({data:j.expressInstall,id:K,width:j.width,height:j.height},{flashvars:m},p)}}function d(j){if(a.ie&&a.win&&j.readyState!=4){var i=Y("div");j.parentNode.insertBefore(i,j);i.parentNode.replaceChild(b(j),i);j.style.display="none";G.attachEvent("onload",function(){j.parentNode.removeChild(j)})}else{j.parentNode.replaceChild(b(j),j)}}function b(n){var m=Y("div");if(a.win&&a.ie){m.innerHTML=n.innerHTML}else{var k=n.getElementsByTagName(P)[0];if(k){var o=k.childNodes;if(o){var j=o.length;for(var l=0;l<j;l++){if(!(o[l].nodeType==1&&o[l].nodeName.toLowerCase()=="param")&&!(o[l].nodeType==8)){m.appendChild(o[l].cloneNode(true))}}}}}return m}function R(AE,AC,q){var p,t=c(q);if(typeof AE.id
> ){AE.id=q}if(a.ie&&a.win){var AD="";for(var z in AE){if(AE[z]!=Object.prototype[z]){if(z=="data"){AC.movie=AE[z]}else{if(z.toLowerCase()=="styleclass"){AD+=' class="'+AE[z]+'"'}else{if(z!="classid"){AD+=" "+z+'="'+AE[z]+'"'}}}}}var AB="";for(var y in AC){if(AC[y]!=Object.prototype[y]){AB+='<param name="'+y+'" value="'+AC[y]+'" />'}}t.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+AD+">"+AB+"</object>";F(AE.id);p=c(AE.id)}else{if(a.webkit&&a.webkit<312){var AA=Y("embed");AA.setAttribute("type",W);for(var x in AE){if(AE[x]!=Object.prototype[x]){if(x=="data"){AA.setAttribute("src",AE[x])}else{if(x.toLowerCase()=="styleclass"){AA.setAttribute("class",AE[x])}else{if(x!="classid"){AA.setAttribute(x,AE[x])}}}}}for(var w in AC){if(AC[w]!=Object.prototype[w]){if(w!="movie"){AA.setAttribute(w,AC[w])}}}t.parentNode.replaceChild(AA,t);p=AA}else{var s=Y(P);s.setAttribute("type",W);for(var v in AE){if(AE[v]!=Object.prototype[v]){if(v.toLowerCase()=="styleclass
> s.setAttribute("class",AE[v])}else{if(v!="classid"){s.setAttribute(v,AE[v])}}}}for(var u in AC){if(AC[u]!=Object.prototype[u]&&u!="movie"){E(s,u,AC[u])}}t.parentNode.replaceChild(s,t);p=s}}return p}function E(k,i,j){var l=Y("param");l.setAttribute("name",i);l.setAttribute("value",j);k.appendChild(l)}function c(i){return g.getElementById(i)}function Y(i){return g.createElement(i)}function O(k){var j=a.pv,i=k.split(".");i[0]=parseInt(i[0],10);i[1]=parseInt(i[1],10);i[2]=parseInt(i[2],10);return(j[0]>i[0]||(j[0]==i[0]&&j[1]>i[1])||(j[0]==i[0]&&j[1]==i[1]&&j[2]>=i[2]))?true:false}function A(m,j){if(a.ie&&a.mac){return }var l=g.getElementsByTagName("head")[0],k=Y("style");k.setAttribute("type","text/css");k.setAttribute("media","screen");if(!(a.ie&&a.win)&&typeof g.createTextNode!=Z){k.appendChild(g.createTextNode(m+" {"+j+"}"))}l.appendChild(k);if(a.ie&&a.win&&typeof g.styleSheets!=Z&&g.styleSheets.length>0){var i=g.styleSheets[g.styleSheets.length-1];if(typeof i.addRule==P){
> ddRule(m,j)}}}function X(k,i){var j=i?"visible":"hidden";if(S){c(k).style.visibility=j}else{A("#"+k,"visibility:"+j)}}return{registerObject:function(l,i,k){if(!a.w3cdom||!l||!i){return }var j={};j.id=l;j.swfVersion=i;j.expressInstall=k?k:false;H[H.length]=j;X(l,false)},getObjectById:function(l){var i=null;if(a.w3cdom&&S){var j=c(l);if(j){var k=j.getElementsByTagName(P)[0];if(!k||(k&&typeof j.SetVariable!=Z)){i=j}else{if(typeof k.SetVariable!=Z){i=k}}}}return i},embedSWF:function(n,u,r,t,j,m,k,p,s){if(!a.w3cdom||!n||!u||!r||!t||!j){return }r+="";t+="";if(O(j)){X(u,false);var q=(typeof s==P)?s:{};q.data=n;q.width=r;q.height=t;var o=(typeof p==P)?p:{};if(typeof k==P){for(var l in k){if(k[l]!=Object.prototype[l]){if(typeof o.flashvars!=Z){o.flashvars+="&"+l+"="+k[l]}else{o.flashvars=l+"="+k[l]}}}}J(function(){R(q,o,u);if(q.id==u){X(u,true)}})}else{if(m&&!C&&O("6.0.65")&&(a.win||a.mac)){X(u,false);J(function(){var i={};i.id=i.altContentId=u;i.width=r;i.height=t;i.expressInstal