/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Shin SAITO, Hisashi MIYASHITA - initial API and implementation
 *******************************************************************************/
// boot_loader.as
import flash.external.ExternalInterface;

var Eclipse_ACTF_DEBUG:Boolean = false;
var Eclipse_ACTF_RANDOM_STRING_1 = "";

trace("SWF boot-loader ver 1.3.2 is loaded");

if (Eclipse_ACTF_DEBUG) {
    var Eclipse_ACTF_lc:LocalConnection = new LocalConnection();
    var mess:String = "";
    mess = "SWF bootloader ver 1.3.2" + newline + "this._url = " + this._url + newline;
}

if (_level53553.Eclipse_ACTF_is_available) {
    if (Eclipse_ACTF_DEBUG) {
        mess += "this is child SWF." + newline;
    }
    for (prop in this) {
        if (prop != "getSameDomainURL" && prop != "mess" && prop != "Eclipse_ACTF_lc" && prop != "$version" &&
            prop != "Eclipse_ACTF_DEBUG") {
            if (Eclipse_ACTF_DEBUG) {
                mess += " :"+prop + "=" + this[prop] + newline;
            }
            _global.Eclipse_ACTF_PROPERTIES[prop] = this[prop];
            Object.prototype[prop] = this[prop];
        }
    }
    if (Eclipse_ACTF_DEBUG) {
        Eclipse_ACTF_Util.send(mess);
    }
    this.loadMovie(this._url, "POST");
} else {
    if (Eclipse_ACTF_DEBUG) {
        mess += "this is root SWF." + newline;
    }
    _global.Eclipse_ACTF_PROPERTIES = new Object();
    // trace('registering getSwfVersion...');
    // ExternalInterface.addCallback('getSwfVersion', null, Eclipse_ACTF_Controller.getSwfVersion);
    // trace('done.');
    var getSameDomainURL = function(url:String, filename) {
        if (url.indexOf("http:")<0 && url.indexOf("https:")<0) {
            return filename;
        }
	var index = url.lastIndexOf("?");
	if (index >= 0){
	    url = url.substring(0,index);
	}
	index = url.lastIndexOf("/");
        if (url.charAt(index-1) == "/") {
            return url + "/" + filename; 
        } else {
            return url.substring(0, index+1)+filename;
        }
    }

    // --------------------------------------------------------------------------------
    _global.Eclipse_ACTF_Video = new Object();
    _global.Eclipse_ACTF_Video.streams = new Array();
    _global.Eclipse_ACTF_Video.register = function(target:Object, source:Object) {
        if ((!target) || (!source)) return;
        var ar:Array = _global.Eclipse_ACTF_Video.streams;
        var slot:Eclipse_ACTF_Stream;
        for (var i = 0; ; i++) {
            if (i == ar.length) {
                slot = new Eclipse_ACTF_Stream(target, source);
                ar.push(slot);
                break;
            }
            slot = ar[i];
            if (slot.equals(target)) {
                slot.update(source);
            }
        }
    }

    _global.Eclipse_ACTF_Video.attachVideo = Video.prototype.attachVideo;
    Video.prototype.attachVideo = function(source:Object) {
        // Eclipse_ACTF_Util.send("Video.attachVideo!!!");
        _global.Eclipse_ACTF_Video.register(this, source);
        _global.Eclipse_ACTF_Video.attachVideo.call(this, source);
    };

    // _global.Eclipse_ACTF_Video.soundp = new Object();
    // ASSetPropFlags(_global.Sound.prototype, "attachSound", 0, true);
    // _global.Eclipse_ACTF_Video.soundp.onLoad = Sound.prototype.onLoad;
    //Sound.prototype.attachSound = function() {
    //    Eclipse_ACTF_Util.send("Invoked: " + "attachSound");
    //    _global.Eclipse_ACTF_Video.register(this, this);
    //    return _global.Eclipse_ACTF_Video.soundp.attachSound.apply(this, arguments);
    //}
    // Eclipse_ACTF_Util.send("Init...");

    // --------------------------------------------------------------------------------

    for (prop in this) {
        if (prop != "getSameDomainURL"
            && prop != "mess"
            && prop != "Eclipse_ACTF_lc"
            && prop != "$version"
            && prop != "Eclipse_ACTF_DEBUG") {
            if (Eclipse_ACTF_DEBUG) {
                mess += " :"+prop + "=" + this[prop] + newline;
            }
            _global.Eclipse_ACTF_PROPERTIES[prop] = this[prop];
            Object.prototype[prop] = this[prop];
            ASSetPropFlags(Object.prototype, prop, 1);

            /*
              if (Object.prototype.setPropertyIsEnumerable) {
              Object.prototype.setPropertyIsEnumerable(prop, false);
              }
            */
        }
    }
    if (Eclipse_ACTF_DEBUG) {
        Eclipse_ACTF_lc.send("_testLC", "dump", mess);
    }

    // load the secret.

    var lv:LoadVars = new LoadVars();
    lv.onLoad = function(flag:Boolean) {
        if (flag) {
            _global.Eclipse_ACTF_SWF_CONTENT_ID = lv.contentid;
            _global.Eclipse_ACTF_SECRET = lv.secret;
            // load the original
            loadMovieNum(_root._url, 0, "POST");
   
            // load boot_bridge.swf
            loadMovieNum(getSameDomainURL(_root._url, "Eclipse-ACTF-SWF-Initialize-Bridge-Package-1082017309130187472.swf"), 53553);
        }
    };
    lv.load(getSameDomainURL(this._url, "http://localhost/Eclipse-ACTF-SWF-LoadVars-1082017309130187472.txt"));
}
