123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- /*
- Macromedia(r) Flash(r) JavaScript Integration Kit License
- Copyright (c) 2005 Macromedia, inc. All rights reserved.
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
- 3. The end-user documentation included with the redistribution, if any, must
- include the following acknowledgment:
- "This product includes software developed by Macromedia, Inc.
- (http://www.macromedia.com)."
- Alternately, this acknowledgment may appear in the software itself, if and
- wherever such third-party acknowledgments normally appear.
- 4. The name Macromedia must not be used to endorse or promote products derived
- from this software without prior written permission. For written permission,
- please contact devrelations@macromedia.com.
- 5. Products derived from this software may not be called "Macromedia" or
- "Macromedia Flash", nor may "Macromedia" or "Macromedia Flash" appear in their
- name.
- THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MACROMEDIA OR
- ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGE.
- --
- This code is part of the Flash / JavaScript Integration Kit:
- http://www.macromedia.com/go/flashjavascript/
- Created by:
- Christian Cantrell
- http://weblogs.macromedia.com/cantrell/
- mailto:cantrell@macromedia.com
- Mike Chambers
- http://weblogs.macromedia.com/mesh/
- mailto:mesh@macromedia.com
- Macromedia
- */
- /**
- * Create a new Exception object.
- * name: The name of the exception.
- * message: The exception message.
- */
- function Exception(name, message)
- {
- if (name)
- this.name = name;
- if (message)
- this.message = message;
- }
- /**
- * Set the name of the exception.
- */
- Exception.prototype.setName = function(name)
- {
- this.name = name;
- }
- /**
- * Get the exception's name.
- */
- Exception.prototype.getName = function()
- {
- return this.name;
- }
- /**
- * Set a message on the exception.
- */
- Exception.prototype.setMessage = function(msg)
- {
- this.message = msg;
- }
- /**
- * Get the exception message.
- */
- Exception.prototype.getMessage = function()
- {
- return this.message;
- }
- /**
- * Generates a browser-specific Flash tag. Create a new instance, set whatever
- * properties you need, then call either toString() to get the tag as a string, or
- * call write() to write the tag out.
- */
- /**
- * Creates a new instance of the FlashTag.
- * src: The path to the SWF file.
- * width: The width of your Flash content.
- * height: the height of your Flash content.
- */
- function FlashTag(src, width, height)
- {
- this.src = src;
- this.width = width;
- this.height = height;
- this.version = '7,0,14,0';
- this.id = null;
- this.bgcolor = 'ffffff';
- this.flashVars = null;
- }
- /**
- * Sets the Flash version used in the Flash tag.
- */
- FlashTag.prototype.setVersion = function(v)
- {
- this.version = v;
- }
- /**
- * Sets the ID used in the Flash tag.
- */
- FlashTag.prototype.setId = function(id)
- {
- this.id = id;
- }
- /**
- * Sets the background color used in the Flash tag.
- */
- FlashTag.prototype.setBgcolor = function(bgc)
- {
- this.bgcolor = bgc;
- }
- /**
- * Sets any variables to be passed into the Flash content.
- */
- FlashTag.prototype.setFlashvars = function(fv)
- {
- this.flashVars = fv;
- }
- /**
- * Get the Flash tag as a string.
- */
- FlashTag.prototype.toString = function()
- {
- var ie = (navigator.appName.indexOf ("Microsoft") != -1) ? 1 : 0;
- var flashTag = new String();
- if (ie)
- {
- flashTag += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ';
- if (this.id != null)
- {
- flashTag += 'id="'+this.id+'" ';
- }
- flashTag += 'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version='+this.version+'" ';
- flashTag += 'width="'+this.width+'" ';
- flashTag += 'height="'+this.height+'">';
- flashTag += '<param name="movie" value="'+this.src+'"/>';
- flashTag += '<param name="quality" value="high"/>';
- flashTag += '<param name="bgcolor" value="#'+this.bgcolor+'"/>';
- if (this.flashVars != null)
- {
- flashTag += '<param name="flashvars" value="'+this.flashVars+'"/>';
- }
- flashTag += '</object>';
- }
- else
- {
- flashTag += '<embed src="'+this.src+'" ';
- flashTag += 'quality="high" ';
- flashTag += 'bgcolor="#'+this.bgcolor+'" ';
- flashTag += 'width="'+this.width+'" ';
- flashTag += 'height="'+this.height+'" ';
- flashTag += 'type="application/x-shockwave-flash" ';
- if (this.flashVars != null)
- {
- flashTag += 'flashvars="'+this.flashVars+'" ';
- }
- if (this.id != null)
- {
- flashTag += 'name="'+this.id+'" ';
- }
- flashTag += 'pluginspage="http://www.macromedia.com/go/getflashplayer">';
- flashTag += '</embed>';
- }
- return flashTag;
- }
- /**
- * Write the Flash tag out. Pass in a reference to the document to write to.
- */
- FlashTag.prototype.write = function(doc)
- {
- doc.write(this.toString());
- }
- /**
- * The FlashSerializer serializes JavaScript variables of types object, array, string,
- * number, date, boolean, null or undefined into XML.
- */
- /**
- * Create a new instance of the FlashSerializer.
- * useCdata: Whether strings should be treated as character data. If false, strings are simply XML encoded.
- */
- function FlashSerializer(useCdata)
- {
- this.useCdata = useCdata;
- }
- /**
- * Serialize an array into a format that can be deserialized in Flash. Supported data types are object,
- * array, string, number, date, boolean, null, and undefined. Returns a string of serialized data.
- */
- FlashSerializer.prototype.serialize = function(args)
- {
- var qs = new String();
- for (var i = 0; i < args.length; ++i)
- {
- switch(typeof(args[i]))
- {
- case 'undefined':
- qs += 't'+(i)+'=undf';
- break;
- case 'string':
- qs += 't'+(i)+'=str&d'+(i)+'='+escape(args[i]);
- break;
- case 'number':
- qs += 't'+(i)+'=num&d'+(i)+'='+escape(args[i]);
- break;
- case 'boolean':
- qs += 't'+(i)+'=bool&d'+(i)+'='+escape(args[i]);
- break;
- case 'object':
- if (args[i] == null)
- {
- qs += 't'+(i)+'=null';
- }
- else if (args[i] instanceof Date)
- {
- qs += 't'+(i)+'=date&d'+(i)+'='+escape(args[i].getTime());
- }
- else // array or object
- {
- try
- {
- qs += 't'+(i)+'=xser&d'+(i)+'='+escape(this._serializeXML(args[i]));
- }
- catch (exception)
- {
- throw new Exception("FlashSerializationException",
- "The following error occurred during complex object serialization: " + exception.getMessage());
- }
- }
- break;
- default:
- throw new Exception("FlashSerializationException",
- "You can only serialize strings, numbers, booleans, dates, objects, arrays, nulls, and undefined.");
- }
- if (i != (args.length - 1))
- {
- qs += '&';
- }
- }
- return qs;
- }
- /**
- * Private
- */
- FlashSerializer.prototype._serializeXML = function(obj)
- {
- var doc = new Object();
- doc.xml = '<fp>';
- this._serializeNode(obj, doc, null);
- doc.xml += '</fp>';
- return doc.xml;
- }
- /**
- * Private
- */
- FlashSerializer.prototype._serializeNode = function(obj, doc, name)
- {
- switch(typeof(obj))
- {
- case 'undefined':
- doc.xml += '<undf'+this._addName(name)+'/>';
- break;
- case 'string':
- doc.xml += '<str'+this._addName(name)+'>'+this._escapeXml(obj)+'</str>';
- break;
- case 'number':
- doc.xml += '<num'+this._addName(name)+'>'+obj+'</num>';
- break;
- case 'boolean':
- doc.xml += '<bool'+this._addName(name)+' val="'+obj+'"/>';
- break;
- case 'object':
- if (obj == null)
- {
- doc.xml += '<null'+this._addName(name)+'/>';
- }
- else if (obj instanceof Date)
- {
- doc.xml += '<date'+this._addName(name)+'>'+obj.getTime()+'</date>';
- }
- else if (obj instanceof Array)
- {
- doc.xml += '<array'+this._addName(name)+'>';
- for (var i = 0; i < obj.length; ++i)
- {
- this._serializeNode(obj[i], doc, null);
- }
- doc.xml += '</array>';
- }
- else
- {
- doc.xml += '<obj'+this._addName(name)+'>';
- for (var n in obj)
- {
- if (typeof(obj[n]) == 'function')
- continue;
- this._serializeNode(obj[n], doc, n);
- }
- doc.xml += '</obj>';
- }
- break;
- default:
- throw new Exception("FlashSerializationException",
- "You can only serialize strings, numbers, booleans, objects, dates, arrays, nulls and undefined");
- break;
- }
- }
- /**
- * Private
- */
- FlashSerializer.prototype._addName= function(name)
- {
- if (name != null)
- {
- return ' name="'+name+'"';
- }
- return '';
- }
- /**
- * Private
- */
- FlashSerializer.prototype._escapeXml = function(str)
- {
- if (this.useCdata)
- return '<![CDATA['+str+']]>';
- else
- return str.replace(/&/g,'&').replace(/</g,'<');
- }
- /**
- * The FlashProxy object is what proxies function calls between JavaScript and Flash.
- * It handles all argument serialization issues.
- */
- /**
- * Instantiates a new FlashProxy object. Pass in a uniqueID and the name (including the path)
- * of the Flash proxy SWF. The ID is the same ID that needs to be passed into your Flash content as lcId.
- */
- function FlashProxy(uid, proxySwfName)
- {
- this.uid = uid;
- this.proxySwfName = proxySwfName;
- this.flashSerializer = new FlashSerializer(false);
- }
- /**
- * Call a function in your Flash content. Arguments should be:
- * 1. ActionScript function name to call,
- * 2. any number of additional arguments of type object,
- * array, string, number, boolean, date, null, or undefined.
- */
- FlashProxy.prototype.call = function()
- {
- if (arguments.length == 0)
- {
- throw new Exception("Flash Proxy Exception",
- "The first argument should be the function name followed by any number of additional arguments.");
- }
- var qs = 'lcId=' + escape(this.uid) + '&functionName=' + escape(arguments[0]);
- if (arguments.length > 1)
- {
- var justArgs = new Array();
- for (var i = 1; i < arguments.length; ++i)
- {
- justArgs.push(arguments[i]);
- }
- qs += ('&' + this.flashSerializer.serialize(justArgs));
- }
- var divName = '_flash_proxy_' + this.uid;
- if(!document.getElementById(divName))
- {
- var newTarget = document.createElement("div");
- newTarget.id = divName;
- document.body.appendChild(newTarget);
- }
- var target = document.getElementById(divName);
- var ft = new FlashTag(this.proxySwfName, 1, 1);
- ft.setVersion('6,0,65,0');
- ft.setFlashvars(qs);
- target.innerHTML = ft.toString();
- }
- /**
- * This is the function that proxies function calls from Flash to JavaScript.
- * It is called implicitly.
- */
- FlashProxy.callJS = function()
- {
- var functionToCall = eval(arguments[0]);
- var argArray = new Array();
- for (var i = 1; i < arguments.length; ++i)
- {
- argArray.push(arguments[i]);
- }
- functionToCall.apply(functionToCall, argArray);
- }
|