
function f4a_bind(fn, scope) {
		var scope = scope || window;
		var args = [];
		for (var i=2, len = arguments.length; i < len; ++i) {
			args.push(arguments[i]);
		};
		return function() {
			fn.apply(scope, args);
		};
	  }

function f4a_js_flash(props) {
  this.f4a_js_id = props['id'];
  this.id = this.f4a_js_id+'f4a_js_flash';
  this.flashobj_id = this.f4a_js_id + 'flashcontent';
  this.swfname = props['swfname'];
  this.swfuri = props['swfuri'];
  this.height = 1;
  this.width = 1;
  this.mostRecentResponse = '';


  if (window.log==undefined) log = function(txt) {
	try{console.log(txt)} catch (e) {}
  }
  
  this.getFlash = function() {
      return document.getElementById(this.flashobj_id);
  }
  
  this.checkFlash = function() {  // confirm that the Flash Storage is running
      try {
          return (this.getFlash().ping() == "pong");
      } catch (e) { log(e);return false; }
  }


  this.createSwfObject = function() {
 	var params = { 'allowScriptAccess' : 'always',
			'swliveconnect': true
			}

	swfobject.embedSWF(this.swfuri, this.flashobj_id, "1", "1", "8", "#ffffff", params);  
  }
  
  this.open = function(args) {
    var meth = args['meth'];
    var url = args['url'];
    var async = args['async'];
    var user = args['user'];
    var password = args['password'];  
    var headers = args['headers'] ? args['headers'] : [];
    var contenttype = args['contenttype'] ? args['contenttype'] : null;
    var data = args['data'];
    var onready = args['onready'];
  
    var fs = this.getFlash();
    
	var cb = CallbackManager.registerCallback(this.id,onready);
    fs.xmlhttp(url, cb, meth, data, headers);
  }
}

/**************************************** CallbackManager ***************************************************/


var CallbackManager = new Object();
CallbackManager.callbacks = {};
CallbackManager.callbackIndexes = {};

// assigns and returns a unique callback name for the input callback
CallbackManager.registerCallback = function(id, callback) {

  if (!this.callbacks[id]) {
    this.callbacks[id] = [];
    this.callbackIndexes[id] = 0;
  } 

    // todo: could be improved (look for the first available spot in the callbacks table, if necessary, expand it)
    var length = this.callbacks[id].push(function(rsp) {f4a_bind(selfDeleteCallback,this,id,callback,rsp)()});

    this.callbackIndexes[id] = length - 1;
    return 'CallbackManager.callbacks[\''+id+'\']['+this.callbackIndexes[id]+']';
    
    function selfDeleteCallback(id,callback,rsp) {
        //delete CallbackManager.callbacks[id][this.callbackIndexes[id]];
       	setTimeout(function() { callback(rsp); }, 0);
        return;
    } 
}

