function SoundOpterWorker() {
	this.soundTakers = new Object();
	this.soundNeeders = new Array();
}

SoundOpterWorker.prototype = {
	
	registerOpter: function(name, lvl) {
		this.soundTakers[name] = lvl;
		if (window.console) {
			window.console.log("");	
		}
	},
	
	soundRequest: function(name) {
		giveVoice = false;
		if (this.soundNeeders.length >= 1) {
			for (i=this.soundNeeders.length-1; i >= 0; --i) {
				var cmp = this.soundNeeders[i];
				if (this.soundTakers[cmp] <= this.soundTakers[name]) {
					if (i == this.soundNeeders.length-1) {
						this.soundNeeders.push(name);
						giveVoice = true;
						break;
					} else {
						var bf = this.soundNeeders.slice(0,i);
						var af = this.soundNeeders.slice(i,this.soundNeeders.length+1);
						this.soundNeeders = bf.concat(new Array(name), af);
						break;
					}
				} else if (i == 0) {
					this.soundNeeders.unshift(name);
				}
			}
		} else {
			giveVoice = true;
			this.soundNeeders.push(name);
		}
		if (window.console) {
			window.console.log("Request -- Sound Needers: " + this.soundNeeders.join(", "));
			if (giveVoice) {
				window.console.log("Gave voice to " + name);
			} else {
				window.console.log("Did not give voice to " + name);
			}
		}
		if (giveVoice) {
			setTimeout("__AMD_SOUND_OPTER.notifySoundTakingToFlash('" + name + "');", 200);
		}
		return giveVoice;
	},
	
	soundRelease: function(name) {
		var oldVoice = this.soundNeeders[this.soundNeeders.length - 1];
		
		for (i=0; i < this.soundNeeders.length; ++i) {
			if (this.soundNeeders[i] == name) {
				if (i == 0) {
					this.soundNeeders.shift();
				} else if (i == this.soundNeeders.length - 1) {
					this.soundNeeders.pop();
				} else {
					var bf = this.soundNeeders.slice(0,i);
					var af = this.soundNeeders.slice(i+1,this.soundNeeders.length+1);
					this.soundNeeders = bf.concat(af);
				}
			}
		}
		if (window.console) {
			window.console.log("Release " + name + " -- Sound Needers: " + this.soundNeeders.join(", "));
		}
		if (this.soundNeeders.length != 0 && this.soundNeeders[this.soundNeeders.length - 1] != oldVoice) {
			var nm = this.soundNeeders[this.soundNeeders.length - 1];
			setTimeout("__AMD_SOUND_OPTER.notifySoundTakingToFlash('" + nm + "');", 200);
		}
	},
	
	notifySoundTakingToFlash: function(name) {
		this.notifyAllObjs(document.getElementsByTagName("object"), name);
		this.notifyAllObjs(document.getElementsByTagName("embed"), name);
	},
	
	notifyAllObjs: function(t, name) {
		for (i=0; i < t.length; ++i) {
			var id = t[i].getAttribute("id");
			if (id.substr(0,4) == "efp_" || id.substr(0,5) == "efjp_") {
				try {
					t[i].notifyVoiceTaking(name);
				} catch (ignored) {
					try {
						swfobject.getObjectById(id).notifyVoiceTaking(name);
					} catch (ignored) {
					}
				}
			}
		}
	}
	
};

var __AMD_SOUND_OPTER = new SoundOpterWorker();

// -- Flash Interface

function registerSoundOpter(name, lvl) {
	__AMD_SOUND_OPTER.registerOpter(name, lvl);
}

function requestSoundByOpter(name) {
	return __AMD_SOUND_OPTER.soundRequest(name);
}

function releaseSoundByOpter(name) {
	__AMD_SOUND_OPTER.soundRelease(name);
}

// Test Case
/*registerSoundOpter("app", 50);
registerSoundOpter("tot", 10);
registerSoundOpter("zza", 100);

requestSoundByOpter("app");
requestSoundByOpter("tot");
requestSoundByOpter("zza");

releaseSoundByOpter("app");
releaseSoundByOpter("zza");
releaseSoundByOpter("tot");*/
