/*-- from f4a --*/
function f4aBind(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) {f4aBind(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;
	}
}
