== What Is the Flex AJAX Bridge? == The Flex AJAX Bridge (FABridge) is a small, unobtrusive code library that you can insert into an Apache® Flex application, a Flex component, or even an empty SWF file to expose it to scripting in the browser. It is being released to the community under the Apache Software Foundation, v2 license. See http://www.apache.org/licenses/LICENSE-2.0. To humbly borrow a page from the Ruby on Rails community, FABridge is built with the "don't repeat yourself" principle in mind. Rather than having to define new, simplified APIs to expose a graph of ActionScript objects to JavaScript, with FABridge you can make your ActionScript classes available to JavaScript without any additional coding. After you insert the library, essentially anything you can do with ActionScript, you can do with JavaScript. Adobe® Flash® Player has the native ability, through the External API (the ExternalInterface class), to call JavaScript from ActionScript, and vice versa. But ExternalInterface has some limitations: * The ExternalInterface class requires you, the developer, to write a library of extra code in both ActionScript and JavaScript, to expose the functionality of your Flex application to JavaScript, and vice versa. * The ExternalInterface class also limits what you can pass across the gap. Primitive types, arrays, and simple objects are legal, but user-defined classes, with associated properties and methods, are off-limits. * The ExternalInterface class enables you to define an interface so your JavaScript can call your ActionScript. FABridge essentially lets you write JavaScript instead of ActionScript. == When Should I Use the Flex AJAX Bridge? == The FABridge library is useful in the following situations: * You want to use a rich Flex component in an AJAX application but do not want to write a lot of Flex code. If you wrap the component in a FABridge-enabled stub application, you can script it entirely from JavaScript, including using eval()’d JavaScript generated remotely by the server. * You have only one or two people on your team who know Flex. Although I would strongly encourage everyone to grab a copy of Flex and try it out (you will love it, I promise!), the FABridge library lets everyone on your team use the work produced by one or two Flex specialists. * You are building an integrated rich Internet application (RIA) with both Flex and AJAX portions. While you could build the integration yourself using ExternalInterface, you might find it faster to start with the FABridge as a head start. == What Do I Need to Use It? == To use the FABridge library and samples, you must have the following: * AJAX Bridge, which is included in the following directory of the LiveCycle Data Services installation: installation_dir\resources\FABridge * Flex 2 SDK included in the LiveCycle Data Services installation * Flash Player 9 * Microsoft Internet Explorer, Mozilla Firefox, or Opera with JavaScript enabled * Any HTTP server to run the samples == Download and Installation == To run the sample files, follow these steps: 1. Copy the src and samples directories from the install_dir\resources\FABridge directory of the LiveCycle Data Services installation side by side on any HTTP server. 2. Open a web browser to /samples/FABridgeSample.html and samples/SimpleSample.html and follow the instructions there. Make sure you access the samples through http:// URLs and not file:// URLs. The Flash Player security sandbox may prevent them from working correctly if accessed as local files. == How Do I Use the Flex AJAX Bridge? == To use the FABridge library in your own Flex and AJAX applications, follow these steps: * Add the src folder to the ActionScript classpath of your Flex application. * If you are compiling from the command line, you can add the src folder to your application by specifying it using the --actionscript-classpath compiler option. * Add the following tag to your application file: ... Use the following code to access your application instance from JavaScript: function useBridge() { var flexApp = FABridge.flash.root(); } To get the value of a property, call it like a function; use the same syntax to access objects by id, as the following example shows: function getMaxPrice() { var flexApp = FABridge.flash.root(); var appWidth = flexApp.getWidth(); var maxPrice = flexApp.getMaxPriceSlider().getValue(); } To set the value of a property from JavaScript, call the function setPropertyName(), as the following example shows: function setMaxPrice(newMaxPrice) { var flexApp = FABridge.flash.root(); flexApp.getMaxPriceSlider().setValue(newMaxPrice); } You can call object methods directly, just as you would from ActionScript, as the following example shows: function setMaxPrice(newMaxPrice) { var flexApp = FABridge.flash.root(); flexApp.getShoppingCart().addItem("Antique Figurine", 12.99); } You can also pass functions, such as event handlers, from JavaScript to ActionScript, as the following example shows: function listenToMaxPrice() { var flexApp = FABridge.flash.root(); var maxPriceCallback = function(event) { document.maxPrice = event.getNewValue(); document.loadFilteredProducts(document.minPrice, document.maxPrice); } flexApp.getMaxPriceSlider().addEventListener("change", maxPriceCallback); } To run initialization code on a Flex file, you must wait for it to download and initialize first. Register a callback to be invoked when the movie is initialized, as the following example shows: function initMaxPrice(maxPrice) { var initCallback = function() { var flexApp = FABridge.flash.root(); flexApp.getMaxPriceSlider().setValue(maxPrice); } FABridge.addInitializationCallback("flash",initCallback); } To script multiple Flash applications on the same page, give them unique bridge names through the flashvars mechanism. Use the bridge name to access them from the bridge, and to register for initialization callbacks, as the following example shows: function initMaxPrice(maxPrice) { var initCallback = function() { var flexApp = FABridge.shoppingPanel.root(); flexApp.getMaxPriceSlider().setValue(maxPrice); } FABridge.addInitializationCallback("shoppingPanel",initCallback); } Automatic memory management The FABridge provides automatic memory management that uses a reference counting mechanism for all objects that are passed across the bridge. Objects created from the JavaScript side are kept in memory unless the memory is manually released. Events and other Actionscript-initiated objects are destroyed as soon as the corresponding JavaScript function that handles them directly completes its execution. You can manually call the addRef() for an object to have it remain available or call the release() method to decrease its reference counter. If you must break the function call chain by using the setTimeout() function in JavaScript, for example to act on an event later on as the following example shows, you must ensure that the event will still exist. Because the FABridge implements a reference counting mechanism to save memory, events thrown from ActionScript exist only for the duration of the dispatch function.
var flexApp = FABridge.flash.root();
flexApp.getMaxPriceSlider().addEventListener("change", maxPriceCallback );
function maxPriceCallback(event) {
    //when the doSomethingLater function is hit, the event is no longer available;
    //to make it work you would have to call
    //FABridge.addRef(event);
    //then, when you're done with it call FABridge.release(event);
    setTimeout(function() {doSomethingLater(event);},10);
}
Manually destroying objects You can manually destroy a specific object that has been passed across the bridge, regardless of its reference count by invoking the releaseNamedASObject(myObject) method from JavaScript. This invalidates the object over the bridge and any future calls to it or one of its methods will throw an error. Handling exceptions Exceptions that take place in the ActionScript of the bridge as a direct consequence of some JavaScript action are now thrown over the bridge into JavaScript. The mechanism works as follows: * When an exception is raised in the ActionScript section, it is caught in a try-catch block, serialized, and passed to JavaScript. * When the JavaScript part receives an answer from ActionScript, it checks for the exception serialization and, if found, throws a JavaScript error with the message received from ActionScript. Note: To catch and use the exception information, you must surround the code that calls into ActionScript with a try-catch block. You can handle the error in the catch(e) block. == What Are the Limitations? == The FABridge library is currently in a beta state. It has been tested on Mozilla Firefox 2 (Windows and Linux), Microsoft Internet Explorer 6, Opera 9, and Apple Safari 2.0.4. Exceptions thrown across the bridge into JavaScript depend on the user having installed Flash Debug Player to display the entire error description. Otherwise, only the error ID is thrown. For performance reasons, when an anonymous object is sent from ActionScript to JavaScript, the bridge assumes it contains only primitives, arrays, and other anonymous objects, and no strongly typed objects or methods. Instances or methods sent as part of an anonymous object are not bridged correctly. == Summary == You can use the FABridge library to automatically expose your Flex application to AJAX-based HTML applications. Using the bridge, you can easily embed rich Flex components in your applications, integrating them tightly with the rest of the page content. After a Flex application is enabled through the bridge, JavaScript developers have access to all of the functionality it provides.