/**************************************** CallbackManager ***************************************************/

/* Modified to work with SWFObject 2.1 object based flash insertion, and remove some duplicated calls - NWH: AKQA 29/03/2010 */

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) {
       	setTimeout(function() { callback(rsp); }, 0);
       //delete CallbackManager.callbacks[id][this.callbackIndexes[id]];
        return;
    } 
}

if(typeof f4a_js_flash!="function")
{
	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.id+'_f4a';
	  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.f4a_js_id + "flashcontent");
	  }
	  
	  this.checkFlash = function()
	  {
  			// confirm that the Flash Storage is running
			if(typeof this.getFlash() !='undefined' && typeof this.getFlash().ping == "function" && this.getFlash().ping()=="pong")
				return true;
			return false;
	  }
	
	  this.createSwfObject = function() {
	 	//var so = new SWFObject(this.swfuri, this.flashobj_id, "1", "1", "8", "#ffffff");  
	 	//var so = new SWFObject(this.swfuri, this.flashobj_id, "800", "600", "8", "#0000ff");  
		//so.addParam('allowScriptAccess', 'always');
		//so.addParam('swliveconnect', 'true');
		//so.write(this.f4a_js_id+'flashcontent');
		
		var flashvars = {};
		
		var params = {};
		params.id = this.flashobj_id;
		params.allowscriptaccess = "always";
		params.swliveconnect = "true";
		
		var attributes = {};
		swfobject.embedSWF(this.swfuri, this.f4a_js_id + "flashcontent", "1", "1", "8", false, flashvars, params, attributes);
		
	  }
	  
	  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'];
	  	if(contenttype){
        	headers.push('Content-Type');
            headers.push(contenttype);
        }
	    var fs = this.getFlash();
	    
		var cb = CallbackManager.registerCallback(this.id,onready);
		
		var call=function()
		{
			if(!fs || typeof fs.xmlhttp!="function")
			{
				setTimeout(call, 10);
				return false;
			}
	    	fs.xmlhttp(url, cb, meth, data, headers);
	    };
	    call();
	  }
	}
}
