FlashInterface = Class.create();
FlashInterface.embed = null;
FlashInterface.loaded = false;
FlashInterface.loadTimer = null;
FlashInterface.swfFile = 'flashbridge.swf';
FlashInterface.startQueue = [];
FlashInterface.objects = [];

FlashInterface.startInterface = function() {
	if(FlashInterface.embed)
		return;
	
	var obj = document.createElement('div');
	
	obj.style.position = 'absolute';
	obj.style.left = '-500px';
	obj.style.top = '-500px';
	
	document.body.appendChild(obj);
	
	var flashHTML = '';
	flashHTML += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="__flashInterfaceBridge" align="middle">';
	flashHTML += '<param name="allowScriptAccess" value="sameDomain" />';
	flashHTML += '<param name="movie" value="' + FlashInterface.swfFile + '" />';
	flashHTML += '<param name="quality" value="high" />';
	flashHTML += '<param name="bgcolor" value="#ffffff" />';
	flashHTML += '<embed src="' + FlashInterface.swfFile + '" quality="high" bgcolor="#ffffff" width="550" height="400" name="__flashInterfaceBridge" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
	flashHTML += '</object>';
	
	obj.innerHTML = flashHTML;
	
	FlashInterface.embed = window['__flashInterfaceBridge'] || document['__flashInterfaceBridge'];
	FlashInterface.loadTimer = setInterval(FlashInterface.testLoad, 200);
};

FlashInterface.testLoad = function() {
	if(FlashInterface.embed.instanceClass) {
		clearInterval(FlashInterface.loadTimer);
		setTimeout(FlashInterface.runQueue, 200);
		
		return true;
	}
	
	return false;
};

FlashInterface.runQueue = function() {
	FlashInterface.loaded = true;
	
	while(FlashInterface.startQueue.length > 0) {
		var data = FlashInterface.startQueue.shift();
		
		data[0].apply(data[1], data[2]);
	}
};

FlashInterface.invoke = function(oid, evt, args) {
	args = args.replace(/(\r\n|\r|\n)/, "\\n");
	var obj = FlashInterface.objects[oid];
	
	if(!obj || !obj.events)
		return;
	
	var listener = obj.events[evt];
	
	if(listener)
		listener.fire.apply(listener, eval("(" + args + ")"));
};

Object.extend(FlashInterface.prototype, {
	initialize: function(className) {
		var args = $A(arguments);
		
		this.className = args.shift();
		this.events = {};
		this.oid = -1;
		
		var name = this.className.split(".").pop();
		
		if(FlashInterface.especialized[name])
			Object.extend(this, FlashInterface.especialized[name]);
		
		this.load.apply(this, args);
	},
	
	load: function() {
		if(!FlashInterface.loaded) {
			FlashInterface.startQueue.push([this.load, this, $A(arguments)]);
			return false;
		}
		
		this.oid = FlashInterface.embed.instanceClass(this.className, $A(arguments));
		
		if(this.oid == -1) {
			alert("Class " + this.className + " not found");
			return false;
		}
		
		FlashInterface.objects[this.oid] = this;
	},
	
	listen: function() {
		if(!FlashInterface.loaded) {
			FlashInterface.startQueue.push([this.listen, this, $A(arguments)]);
			return false;
		}
		
		if(this.oid == -1)
			return false;
		
		var args = $A(arguments);
		var evt = args.shift();
		
		if(!this.events[evt])
			this.events[evt] = new cEvent();
		
		this.events[evt].add.apply(this.events[evt], args);
		
		FlashInterface.embed.addClassListener(this.oid, evt);
	},
	
	callFlash: function() {
		if(!FlashInterface.loaded) {
			FlashInterface.startQueue.push([this.callFlash, this, $A(arguments)]);
			return false;
		}
		
		if(this.oid == -1)
			return false;
		
		var args = $A(arguments);
		var method = args.shift();
		
		return FlashInterface.embed.callClass(this.oid, method, args);
	}
});

FlashInterface.especialized = {};

Event.observe(window, 'load', FlashInterface.startInterface);
