/*
Some of 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
***** Added 1/17/06 by Geoff Stearns (geoff@deconcept.com):
This version of the JS Integration kit requires swfobject 1.4.4 or later
Download SWFObject at http://blog.deconcept.com/swfobject/
the swfobject.js file must be linked before this file is linked.
SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
http://www.opensource.org/licenses/mit-license.php
*/
/**
* 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;
}
/**
* use encodeURIComponent() if the browser supports it, otherwise use escape()
*/
FlashSerializer.prototype.encodeVal = function(val){
if(document.encodeURIComponent) {
return encodeURIComponent(val);
}
return escape(val);
}
/**
* 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(val){
var result = new Array();
switch(typeof val){
case 'undefined':
result[0] = 'undef';
break;
case 'string':
result[0] = 'str';
result[1] = this.encodeVal(val);
break;
case 'number':
result[0] = 'num';
result[1] = val.toString();
break;
case 'boolean':
result[0] = 'bool';
result[1] = val.toString();
break;
case 'object':
if (val == null) {
result[0] = 'null';
} else if (val.getTime) {
result[0] = 'date';
result[1] = this.encodeVal(val.getTime());
} else { // array or object
try {
result[0] = 'xser';
result[1] = this.encodeVal(this._serializeXML(val));
}catch (e){}
}
break;
default:
// do nothing
}
return result;
}
/**
* Private
*/
FlashSerializer.prototype._serializeXML = function(obj)
{
var doc = new Object();
doc.xml = '';
this._serializeNode(obj, doc, null);
doc.xml += '';
return doc.xml;
}
/**
* Private
*/
FlashSerializer.prototype._serializeNode = function(obj, doc, name){
switch(typeof obj) {
case 'undefined':
doc.xml += '';
break;
case 'string':
doc.xml += ''+this._escapeXml(obj)+'';
break;
case 'number':
doc.xml += ''+obj+'';
break;
case 'boolean':
doc.xml += '';
break;
case 'object':
if (obj == null) {
doc.xml += '';
} else if (obj.getTime) {
doc.xml += ''+obj.getTime()+'';
} else if (obj.length != undefined) {
doc.xml += '';
for (var i = 0; i < obj.length; ++i) {
this._serializeNode(obj[i], doc, null);
}
doc.xml += '';
} else {
doc.xml += '';
for (var n in obj) {
if (typeof(obj[n]) == 'function') {
continue;
}
this._serializeNode(obj[n], doc, n);
}
doc.xml += '';
}
break;
default:
// do nothing
}
}
/**
* Private
*/
FlashSerializer.prototype._addName= function(name){
if (name != null) {
return ' name="'+name+'"';
}
return '';
}
/**
* Private
*/
FlashSerializer.prototype._escapeXml = function(str){
if (this.useCdata) {
return '';
} else {
return str.replace(/&/g,'&').replace(/ 1) {
for (var i=1; i 1) {
fo.addVariable('d'+(i-1), serialized[1]);
}
}
}
var divName = '_flash_proxy_' + this.uid;
if(!document.getElementById(divName)) {
var newTarget = document.createElement("div");
newTarget.id = divName;
document.body.appendChild(newTarget);
}
fo.write(divName);
}
/**
* This is the function that proxies function calls from Flash to JavaScript.
* It is called implicitly.
*/
deconcept.SWFObject.callJS = function(command, args){
var argsArray = eval(args);
var scope = deconcept.SWFObject.fpmap[argsArray.shift()].callbackScope;
if(scope && (command.indexOf('.') < 0)){
var functionToCall = scope[command];
functionToCall.apply(scope, argsArray);
}else{
var functionToCall = eval(command);
functionToCall.apply(functionToCall, argsArray);
}
}
/**
* This function gets called when a Flash function call is complete. It checks the
* queue and figures out whether there is another call to make.
*/
deconcept.SWFObject.callComplete = function(uid){
var fp = deconcept.SWFObject.fpmap[uid];
if (fp != null) {
fp.q.shift();
if (fp.q.length > 0) {
fp._execute(fp.q[0]);
}
}
}
deconcept.SWFObject.fpmap = new Object();