////////////////////////////////////////////////////////////////////////////////
//
//  ADOBE SYSTEMS INCORPORATED
//  Copyright 2005-2006 Adobe Systems Incorporated
//  All Rights Reserved.
//
//  NOTICE: Adobe permits you to use, modify, and distribute this file
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

package mx.events
{

import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLRequest;

/**
 *  The RSLEvent class represents an event object used by the 
 *  DownloadProgressBar class when an RSL is being downloaded by the Preloader class. 
 *
 *  @see mx.preloaders.DownloadProgressBar
 *  @see mx.preloaders.Preloader
 *  
 *  @langversion 3.0
 *  @playerversion Flash 9
 *  @playerversion AIR 1.1
 *  @productversion Flex 3
 */
public class RSLEvent extends ProgressEvent
{
    include "../core/Version.as";

    //--------------------------------------------------------------------------
    //
    //  Class constants
    //
    //--------------------------------------------------------------------------

    /**
     *  The <code>RSLEvent.RSL_ADD_PRELOADED</code> constant defines the value of the
     *  <code>type</code> property of the event object for an 
     *  <code>rslAddPreloaded</code> event. This event is dispatched from an 
     *  IFlexModuleFactory after a child IFlexModuleFactory preloads an RSL
     *  into its application domain. 
     *
     *  <p>The properties of the event object have the following values:</p>
     *  <table class="innertable">
     *     <tr><th>Property</th><th>Value</th></tr>
     *     <tr><td><code>bubbles</code></td><td>false</td></tr>
     *     <tr><td><code>cancelable</code></td><td>false</td></tr>
     *     <tr><td><code>currentTarget</code></td><td>The Object that defines the
     *       event listener that handles the event. For example, if you use
     *       <code>myButton.addEventListener()</code> to register an event listener,
     *       myButton is the value of the <code>currentTarget</code>. </td></tr>
     *     <tr><td><code>loaderInfo</code></td><td>The LoaderInfo instance 
     *     associated with this RSL.</td></tr>
     *     <tr><td><code>target</code></td><td>The Object that dispatched the event;
     *       it is not always the Object listening for the event.
     *       Use the <code>currentTarget</code> property to always access the
     *       Object listening for the event.</td></tr>
     *  </table>
     *
     *  @eventType rslAddPreloaded
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.5
     */
    public static const RSL_ADD_PRELOADED:String = "rslAddPreloaded";
    
    /**
     *  Dispatched when the RSL has finished downloading.   
     *  The <code>RSLEvent.RSL_COMPLETE</code> constant defines the value of the 
     *  <code>type</code> property of the event object for a <code>rslComplete</code> event.
     *
     *  <p>The properties of the event object have the following values:</p>
     *  <table class="innertable">
     *     <tr><th>Property</th><th>Value</th></tr>
     *     <tr><td><code>bubbles</code></td><td>false</td></tr>
     *     <tr><td><code>bytesLoaded</code></td><td>The number of bytes loaded.</td></tr>
     *     <tr><td><code>bytesTotal</code></td><td>The total number of bytes to load.</td></tr>
     *     <tr><td><code>cancelable</code></td><td>false</td></tr>
     *     <tr><td><code>currentTarget</code></td><td>The Object that defines the 
     *       event listener that handles the event. For example, if you use 
     *       <code>myButton.addEventListener()</code> to register an event listener, 
     *       myButton is the value of the <code>currentTarget</code>. </td></tr>
     *     <tr><td><code>errorText</code></td><td>Empty</td></tr>
     *     <tr><td><code>isResourceModule</code></td><td>True if we loaded a resourceModule
     *        instead of an RSL</td></tr>
     *     <tr><td><code>rslIndex</code></td><td>The index number of the RSL 
     *       currently being downloaded. </td></tr>
     *     <tr><td><code>rslTotal</code></td><td>The total number of RSLs 
     *       being downloaded. </td></tr>
     *     <tr><td><code>target</code></td><td>The Object that dispatched the event; 
     *       it is not always the Object listening for the event. 
     *       Use the <code>currentTarget</code> property to always access the 
     *       Object listening for the event.</td></tr>
     *     <tr><td><code>url</code></td><td>The URLRequest object that represents 
     *       the location of the RSL being downloaded.</td></tr>
     *  </table>
     *
     *  @eventType rslComplete
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public static const RSL_COMPLETE:String = "rslComplete";
    
    /**
     *  Dispatched when there is an error downloading the RSL.
     *  The <code>RSLEvent.RSL_ERROR</code> constant defines the value of the 
     *  <code>type</code> property of the event object for a <code>rslError</code> event.
     *
     *  <p>The properties of the event object have the following values:</p>
     *  <table class="innertable">
     *     <tr><th>Property</th><th>Value</th></tr>
     *     <tr><td><code>bubbles</code></td><td>false</td></tr>
     *     <tr><td><code>bytesLoaded</code></td><td>Empty</td></tr>
     *     <tr><td><code>bytesTotal</code></td><td>Empty</td></tr>
     *     <tr><td><code>cancelable</code></td><td>false</td></tr>
     *     <tr><td><code>currentTarget</code></td><td>The Object that defines the 
     *       event listener that handles the event. For example, if you use 
     *       <code>myButton.addEventListener()</code> to register an event listener, 
     *       myButton is the value of the <code>currentTarget</code>. </td></tr>
     *     <tr><td><code>errorText</code></td>An error message.<td></td></tr>
     *     <tr><td><code>isResourceModule</code></td><td>True if we loaded a resourceModule
     *        instead of an RSL</td></tr>
     *     <tr><td><code>rslIndex</code></td><td>The index number of the RSL 
     *       currently being downloaded. </td></tr>
     *     <tr><td><code>rslTotal</code></td><td>The total number of RSLs 
     *       being downloaded. </td></tr>
     *     <tr><td><code>target</code></td><td>The Object that dispatched the event; 
     *       it is not always the Object listening for the event. 
     *       Use the <code>currentTarget</code> property to always access the 
     *       Object listening for the event.</td></tr>
     *     <tr><td><code>url</code></td><td>The URLRequest object that represents 
     *       the location of the RSL being downloaded.</td></tr>
     *  </table>
     *
     *  @eventType rslError
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public static const RSL_ERROR:String = "rslError";

    /**
     *  Dispatched when the RSL is downloading.
     *  The <code>RSLEvent.RSL_PROGRESS</code> constant defines the value of the 
     *  <code>type</code> property of the event object for a <code>rslProgress</code> event.
     *
     *  <p>The properties of the event object have the following values:</p>
     *  <table class="innertable">
     *     <tr><th>Property</th><th>Value</th></tr>
     *     <tr><td><code>bubbles</code></td><td>false</td></tr>
     *     <tr><td><code>bytesLoaded</code></td><td>The number of bytes loaded.</td></tr>
     *     <tr><td><code>bytesTotal</code></td><td>The total number of bytes to load.</td></tr>
     *     <tr><td><code>cancelable</code></td><td>false</td></tr>
     *     <tr><td><code>currentTarget</code></td><td>The Object that defines the 
     *       event listener that handles the event. For example, if you use 
     *       <code>myButton.addEventListener()</code> to register an event listener, 
     *       myButton is the value of the <code>currentTarget</code>. </td></tr>
     *     <tr><td><code>errorText</code></td>Empty<td></td></tr>
     *     <tr><td><code>isResourceModule</code></td><td>True if we loaded a resourceModule
     *        instead of an RSL</td></tr>
     *     <tr><td><code>rslIndex</code></td><td>The index number of the RSL 
     *       currently being downloaded. </td></tr>
     *     <tr><td><code>rslTotal</code></td><td>The total number of RSLs 
     *       being downloaded. </td></tr>
     *     <tr><td><code>target</code></td><td>The Object that dispatched the event; 
     *       it is not always the Object listening for the event. 
     *       Use the <code>currentTarget</code> property to always access the 
     *       Object listening for the event.</td></tr>
     *     <tr><td><code>url</code></td><td>The URLRequest object that represents 
     *       the location of the RSL being downloaded.</td></tr>
     *  </table>
     *
     *  @eventType rslProgress
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public static const RSL_PROGRESS:String = "rslProgress"; 
    
    //--------------------------------------------------------------------------
    //
    //  Constructor
    //
    //--------------------------------------------------------------------------

    /**
     *  Constructor.
     * 
     *  @param type The type of the event. Possible values are:
     *  <ul>
     *     <li>"rslProgress" (<code>RSLEvent.RSL_PROGRESS</code>);</li>
     *     <li>"rslComplete" (<code>RSLEvent.RSL_COMPLETE</code>);</li>
     *     <li>"rslError" (<code>RSLEvent.RSL_ERROR</code>);</li>
     *  </ul>
     *
     *  @param bubbles  Determines whether the Event object participates in the bubbling stage of the event flow.
     *
     *  @param cancelable Determines whether the Event object can be cancelled.
     *
     *  @param bytesLoaded The number of bytes loaded at the time the listener processes the event.
     *
     *  @param bytesTotal The total number of bytes that will ultimately be loaded if the loading process succeeds.
     *
     *  @param rslIndex The index number of the RSL relative to the total. This should be a value between 0 and <code>total - 1</code>.
     *
     *  @param rslTotal The total number of RSLs being loaded.
     *
     *  @param url The location of the RSL.
     *
     *  @param errorText The error message of the error when type is RSLEvent.RSL_ERROR.
     *
     *  @param isResourceModule True if the event occurred when loading a ResourceModule.
     *
     *  @param loaderInfo The LoaderInfo object associated with this event.
     *
     *  @tiptext Constructor for <code>RSLEvent</code> objects.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */ 
    public function RSLEvent(type:String,  bubbles:Boolean = false,
                             cancelable:Boolean = false,
                             bytesLoaded:int = -1, bytesTotal:int = -1,
                             rslIndex:int = -1, rslTotal:int = -1,
                             url:URLRequest = null, errorText:String = null,
                             isResourceModule:Boolean = false,
                             loaderInfo:LoaderInfo = null)
    {
        super(type, bubbles, cancelable, bytesLoaded, bytesTotal);
        
        this.rslIndex = rslIndex;
        this.rslTotal = rslTotal;
        this.url = url;
        this.errorText = errorText;
        this.isResourceModule = isResourceModule;
        this.loaderInfo = loaderInfo;
    }
    
    //--------------------------------------------------------------------------
    //
    //  Properties
    //
    //--------------------------------------------------------------------------

    //----------------------------------
    //  errorText
    //----------------------------------

    /**
     *  The error message if the type is RSL_ERROR; otherwise, it is null;
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var errorText:String;
    
    //----------------------------------
    //  isResourceModule
    //----------------------------------

    /**
     *  True if the event is for loading a resourceModule instead of an RSL
     */
    public var isResourceModule:Boolean;
    
    //----------------------------------
    //  loaderInfo
    //----------------------------------
    
    /**
     *  The LoaderInfo object associated with this event. This is only set in the 
     *  RSLEvent.RSL_COMPLETE event. Otherwise loaderInfo will be null.
     */
    public var loaderInfo:LoaderInfo;

    //----------------------------------
    //  rslIndex
    //----------------------------------

    /**
     *  The index number of the RSL currently being downloaded.
     *  This is a number between 0 and <code>rslTotal - 1</code>.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var rslIndex:int;

    //----------------------------------
    //  rslTotal
    //----------------------------------

    /**
     *  The total number of RSLs being downloaded by the preloader
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var rslTotal:int;
    
    //----------------------------------
    //  url
    //----------------------------------

    /**
     *  The URLRequest object that represents the location
     *  of the RSL being downloaded.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var url:URLRequest;
    
    //--------------------------------------------------------------------------
    //
    //  Overridden properties: Event
    //
    //--------------------------------------------------------------------------

    /**
     *  @private
     */
    override public function clone():Event
    {
        return new RSLEvent(type, bubbles, cancelable,
                            bytesLoaded, bytesTotal, rslIndex,
                            rslTotal, url, errorText, isResourceModule,
                            loaderInfo);
    }
}

}
