« Return to Thread: Re: [pyamf-commits] r1155 - in examples/trunk: . google_appengine google_appengine/echo google_appengine/static google_appengine/static/swfobject google_appengine/static/swfobject/src google_appengine/templates

Re: [pyamf-commits] r1155 - in examples/trunk: . google_appengine google_appengine/echo google_appengine/static google_appengine/static/swfobject google_appengine/static/swfobject/src google_appengine/templates

by Nick Joyce :: Rate this Message:

Reply to Author | View in Thread

Hey Arnar,

How's it going? Hope you are still enjoying the course ..

Been on irc much? We moved server! irc://irc.collab.eu/collab

Thanks for the tip, committed in r1156.

Cheers,

Nick

On 10 Apr 2008, at 15:30, Arnar Birgisson wrote:
Hey Nick,

I think there's no need for the overhead of a script for
crossdomain.xml. Just use "static_files" in the app.yaml:

- url: /crossdomain.xml
 static_files: crossdomain.xml

Arnar

On Thu, Apr 10, 2008 at 2:25 PM, SVN commit logs for PyAMF
<commits@...> wrote:
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<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(
a.i
 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
eme
 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"
:"P
 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
==Z
 ){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){
i.a
 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
l=m
 ;D(i)})}}},getFlashPlayerVersion:function(){return{major:a.pv[0],minor:a.pv[1],release:a.pv[2]}},hasFlashPlayerVersion:O,createSWF:function(k,j,i){if(a.w3cdom&&S){return R(k,j,i)}else{return undefined}},createCSS:function(j,i){if(a.w3cdom){A(j,i)}},addDomLoadEvent:J,addLoadEvent:M,getQueryParamValue:function(m){var l=g.location.search||g.location.hash;if(m==null){return l}if(l){var k=l.substring(1).split("&");for(var j=0;j<k.length;j++){if(k[j].substring(0,k[j].indexOf("="))==m){return k[j].substring((k[j].indexOf("=")+1))}}}return""},expressInstallCallback:function(){if(C&&L){var i=c(K);if(i){i.parentNode.replaceChild(L,i);if(T){X(T,true);if(a.ie&&a.win){L.style.display="block"}}L=null;T=null;C=false}}}}}();
\ No newline at end of file

Added: examples/trunk/google_appengine/static/swfobject/test.swf
===================================================================
(Binary files differ)


Property changes on: examples/trunk/google_appengine/static/swfobject/test.swf
___________________________________________________________________
Name: svn:executable
  + *
Name: svn:mime-type
  + application/octet-stream

Added: examples/trunk/google_appengine/templates/base.html
===================================================================
--- examples/trunk/google_appengine/templates/base.html                         (rev 0)
+++ examples/trunk/google_appengine/templates/base.html 2008-04-10 14:25:48 UTC (rev 1155)
@@ -0,0 +1,13 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+       <title>{% block title %}{% endblock %}</title>
+       {% block head %}{% endblock %}
+</head>
+<body>
+       {% block body %}
+       {% endblock %}
+</body>
+</html>

Added: examples/trunk/google_appengine/templates/swf.html
===================================================================
--- examples/trunk/google_appengine/templates/swf.html                          (rev 0)
+++ examples/trunk/google_appengine/templates/swf.html  2008-04-10 14:25:48 UTC (rev 1155)
@@ -0,0 +1,16 @@
+{% extends "base.html" %}
+
+{% block title %}PyAMF Echo Test Demo{% endblock %}
+
+{% block head %}
+<script type="text/javascript" src="/static/swfobject/swfobject.js"></script>
+<script type="text/javascript">
+    swfobject.embedSWF("{{ swf_url }}", "swf", "{{ width }}", "{{ height }}", "{{ flash_ver }}");
+</script>
+{% endblock %}
+
+{% block body %}
+<div id="swf">
+
+</div>
+{% endblock %}
\ No newline at end of file

_______________________________________________
PyAMF commits mailing list - commits@...
http://lists.pyamf.org/mailman/listinfo/commits

_______________________________________________
PyAMF dev mailing list - dev@...
http://lists.pyamf.org/mailman/listinfo/dev

 « Return to Thread: Re: [pyamf-commits] r1155 - in examples/trunk: . google_appengine google_appengine/echo google_appengine/static google_appengine/static/swfobject google_appengine/static/swfobject/src google_appengine/templates