
var pKaraoke;
var pPublisher;

function initKaraoke(karaoke, publisher) {
	pKaraoke = karaoke;
	pPublisher = publisher;
}

function openSong(song) {
	pPublisher.loadVideo(Number(song.id), "", Number(song.kChannel));
	var performance = {
		userId: me.userId,
		nick: me.nick,
		songId: song.id,
		songName: song.name,
		kChannel: song.kChannel,
		mediaServer: karaokeStreamingServers[0]
	};
	pKaraoke.raiseHand(performance);
}

function openZingSong(song) {
	pPublisher.loadVideo(Number(song.id+100000), String(song.mp3Link), 1);
	var performance = {
		userId: me.userId,
		nick: me.nick,
		songId: song.id+100000,
		songName: song.title,
		kChannel: 1,
		zingMp3Link: song.mp3Link,
		mediaServer: karaokeStreamingServers[0]
	};
	pKaraoke.raiseHand(performance);
}

function openSanNhacSong(song) {
	pPublisher.loadVideo(Number(song.id+200000), String(song.linkSWF), 1);
	var performance = {
		userId: me.userId,
		nick: me.nick,
		songId: song.id+200000,
		songName: song.name,
		kChannel: 1,
		linkSWF: song.linkSWF,
		mediaServer: karaokeStreamingServers[0]
	};
	pKaraoke.raiseHand(performance);
}

var enterSongDialog = null;

function enterSong() {
	if (enterSongDialog == null) {
		enterSongDialog = $("<div></div>")
			.html(
				"<p>T\u00EAn B\u00E0i H\u00E1t:</p>" +
				"<p><form name='enter-song-form' action='javascript:songEntered()'>" +
				"<input type='text' name='songName'/>" +
				"<input type='submit' value=' OK '/></form></p>"
			)
			.dialog({
				autoOpen: false,
				title: "H&#x00E1;t Nh&#x1EA1;c Ngo&#x00E0;i DiepKhuc.com"
			});
	}
	enterSongDialog.dialog('open');
}

function songEntered() {
	var songName = document['enter-song-form'].songName.value;
	if (songName != '') {
		pPublisher.loadVideo(0, songName, 0);
		var performance = {
			userId: me.userId,
			nick: me.nick,
			songId: 0,
			songName: songName,
			kChannel: 0,
			mediaServer: karaokeStreamingServers[0]
		};
		pKaraoke.raiseHand(performance);
		enterSongDialog.dialog('close');
	}
}

var editRoomDialog = null;

function editRoomInfo() {
	var form = document["edit-room-form"];
	if (form.roomName.value == '')
		$('#create-room-errors').html("T&#x00ea;n room kh&#x00f4;ng th&#x1ec3; b&#x1ecf; tr&#x1ed1;ng");
	else if (form.hostPass.value == '')
		$('#create-room-errors').html("M&#x1ead;t kh&#x1ea9;u ch&#x1ee7; room kh&#x00f4;ng th&#x1ec3; b&#x1ecf; tr&#x1ed1;ng");
	else if (form.emceePass.value == '')
		$('#create-room-errors').html("M&#x1ead;t kh&#x1ea9;u cho EMCEE kh&#x00f4;ng th&#x1ec3; b&#x1ecf; tr&#x1ed1;ng");
	else if (form.roomDescription.value.length > 200)
		$('#create-room-errors').html("Gi&#x1edb;i thi&#x1ec7;u room kh&#x00f4;ng th&#x1ec3; h&#x01a1;n 200 k&#x00fd; t&#x1ef1;");
	else {
		var noChange = "[Kh\u00f4ng thay \u0111\u1ed5i]";
		var roomInfo = new Object();
		if (form.roomName.value != noChange)
			roomInfo.name = form.roomName.value;
		if (form.roomDescription.value != noChange)
			roomInfo.description = form.roomDescription.value;
		if (form.hostPass.value != noChange)
			roomInfo.hostPass = form.hostPass.value;
		if (form.emceePass.value != noChange)
			roomInfo.emceePass = form.emceePass.value;
		if (form.singPass.value != noChange)
			roomInfo.singPass = form.singPass.value;
		pKaraoke.editRoomInfo(roomInfo);
		editRoomDialog.dialog('close');
	}
}

function openEditRoomDialog() {
	if (editRoomDialog == null) {
		editRoomDialog = $("<div></div>").dialog({
			autoOpen: false,
			width: 500,
			title: "Edit Room"
		});
		$.get("include/editKaraokeRoom.html", function(data) {
			editRoomDialog.html(data).dialog('open');
			resetEditRoomForm();
		});
	}
	else {
		editRoomDialog.dialog('open');
		resetEditRoomForm();
	}
}

function resetEditRoomForm() {
	var form = document["edit-room-form"];
	form.roomName.value = 
	form.roomDescription.value = 
	form.emceePass.value = 
	form.singPass.value = "[Kh\u00f4ng thay \u0111\u1ed5i]";
	form.hostPass.value = "";
}

var banUserDialog = null;

function openBanUserDialog() {
	if (banUserDialog == null) {
		banUserDialog = $("<div></div>").dialog({
			autoOpen: false,
			title: "Ban User"
		});
	}
	var sortedUserList = [];
	for (var i in userList)
		sortedUserList.push(userList[i]);
	sortedUserList.sort(function(a,b) {
		return a.nick.toLowerCase() <= b.nick.toLowerCase() ? -1 : 1;
	});
	var html = new StringBuilder();
	html.append("<form name='ban-user-form' action='javascript:banUser()'>");
	html.append("<select name='user-list' size='10' width='200' style='width: 200px'>");
	for (var i in sortedUserList)
		html.append("<option value='").append(sortedUserList[i].userId).append("'>").append(mutate(sortedUserList[i].nick)).append("</option>");
	html.append("</select>");
	html.append("<div class='vertical-clearing'></div>");
	html.append("<input name='time' value='1' size='3'/> ph&#x00fa;t ");
	html.append("<input type='submit' value=' Ban '/>");
	html.append("</form>");
	banUserDialog.html(html.toString()).dialog('open');
}

function banUser() {
	var banUserForm = document['ban-user-form'];
	pKaraoke.banUser(banUserForm['user-list'].value, Number(banUserForm.time.value));
}

var unbanUserDialog = null;

function openUnbanUserDialog() {
	if (unbanUserDialog == null) {
		unbanUserDialog = $("<div></div>").dialog({
			autoOpen: false,
			title: "Unban User"
		});
	}
	unbanUserDialog.dialog('open');
	pKaraoke.getBlackList();
}

function unbanUser() {
	pKaraoke.unbanUser(document['unban-user-form'].ip.value);
	pKaraoke.getBlackList();
}

var karaokePasswordDialog = null;

function openKaraokePasswordDialog() {
	if (karaokePasswordDialog == null) {
		karaokePasswordDialog = $("<div></div>").dialog({
			autoOpen: false,
			title: "M&#x1ead;t Kh&#x1ea9;u"
		});
		var html = new StringBuilder();
		html.append("<form name='karaoke-password-form' action='javascript:submitKaraokePassword()'>");
		html.append("<input type='text' name='password'/>");
		html.append("<input type='submit' value='Nh&#x1ead;p'/>");
		html.append("</form>");
		karaokePasswordDialog.html(html.toString());
	}
	karaokePasswordDialog.dialog('open');
}

function submitKaraokePassword() {
	var form = document["karaoke-password-form"];
	if (form.password.value != '') {
		pKaraoke.enterPassword(form.password.value);
		karaokePasswordDialog.dialog('close');
	}
}

var movePerformanceDialog = null;

function openMovePerformanceDialog() {
	if (movePerformanceDialog == null) {
		movePerformanceDialog = $("<div></div>").dialog({
			autoOpen: false,
			title: "Thay &#x0111;&#x1ed5;i th&#x1ee9; t&#x1ef1; ca s&#x1ef9;"
		});
		$.get("include/movePerformanceDialog.html", function(data) {
			movePerformanceDialog.html(data);
		});
	}
	movePerformanceDialog.dialog('open');
}

function movePerformance() {
	var success = pKaraoke.movePerformance(Number(document['move-performance-form']['new-position'].value)-1);
	if (!success)
		alert("B\u1ea1n ph\u1ea3i ch\u1ecdn ca s\u1ef9 trong list tr\u01b0\u1edbc khi click Submit");
}

var roomControlPanel = null;

function openRoomControlPanel() {
	if (roomControlPanel == null) {
		roomControlPanel = $("<div></div>").dialog({
			autoOpen: false,
			title: "Control Panel"
		});
	}
	roomControlPanel.dialog('open');
}

function updateRoomControlPanel() {
	if (roomControlPanel != null) {
		roomControlPanel.dialog('option', 'title', 'Control Panel');
		roomControlPanel.html('');
	}
	var currentRoom = roomLists[currentRoomList].roomsInfo[currentRoomIndex];
	if (typeof(userList[me.userId].karaokeRole) != 'undefined') {
		if (userList[me.userId].karaokeRole == 'host') {
			openRoomControlPanel();
			roomControlPanel.dialog('option', 'title', 'B&#x1ea1;n l&#x00e0; ch&#x1ee7; ph&#x00f2;ng');
			roomControlPanel.html(
				"<form action='javascript:pKaraoke.skipPerformance()'><input type='submit' value=' Cho qua b&#x00e0;i n&#x00e0;y '/></form>" +
				"<form action='javascript:pKaraoke.reserveChat()'><input type='submit' value=' D&#x00e0;nh chatroom cho Host v&#x00e0; MC '/></form>" +
				"<form action='javascript:openMovePerformanceDialog()'><input type='submit' value=' Thay &#x0111;&#x1ed5;i th&#x1ee9; t&#x1ef1; ca s&#x1ef9; '/></form>" +
				"<form action='javascript:openBanUserDialog()'><input type='submit' value=' Ban User '/></form>" +
				"<form action='javascript:openUnbanUserDialog()'><input type='submit' value=' Unban IP '/></form>" +
				"<form action='javascript:openEditRoomDialog()'><input type='submit' value=' Edit Room '/></form>"
			);
		}
		else if (userList[me.userId].karaokeRole == 'emcee') {
			openRoomControlPanel();
			roomControlPanel.dialog('option', 'title', 'B&#x1ea1;n l&#x00e0; EMCEE');
			roomControlPanel.html("<form action='javascript:emcee_raiseHand()'><input type='submit' value=' Xin microphone '/></form>");
		}
	}
}

function emcee_raiseHand() {
	pPublisher.loadVideo(0, "Emcee gi\u1edbi thi\u1ec7u", 0);
	var performance = {
		userId: me.userId,
		nick: me.nick,
		songId: 0,
		songName: "Emcee gi\u1edbi thi\u1ec7u",
		kChannel: 0,
		mediaServer: karaokeStreamingServers[0]
	};
	pKaraoke.raiseHand(performance);
}

getUserIconURL = override(getUserIconURL, function(superHandler, userInfo) {
	if (typeof(userInfo.karaokeRole) != 'undefined') {
		if (userInfo.karaokeRole == 'host')
			return 'images/host_icon.png';
		else if (userInfo.karaokeRole == 'singer')
			return 'images/singer_icon.png';
		else if (userInfo.karaokeRole == 'emcee')
			return 'images/emcee_icon.png';
	}
	return superHandler(userInfo);
});

runCommand = override(runCommand, function(superHandler, cmd) {
	if (cmd == '/editRoom')
		openEditRoomDialog();
	else
		superHandler(cmd);
});


//chat agent callbacks -------------------------------------------

var karaokeCb = new Object();

handleCallback = override(handleCallback,
	function(superHandler, method, args) {
		if (method == 'userList')
			karaokeCb.userList(superHandler, args);
		else if (method == 'userUpdate')
			karaokeCb.userUpdate(superHandler, args);
		else if (method == 'serverMessage')
			karaokeCb.serverMessage(superHandler, args);
		else if (method == 'blackList')
			karaokeCb.blackList(superHandler, args)
		else
			return superHandler(method, args);
		return true;
	});

karaokeCb.userList = function(superHandler, args) {
	superHandler("userList", args);
	updateRoomControlPanel();
}

karaokeCb.userUpdate = function(superHandler, args) {
	superHandler("userUpdate", args);
	var userInfo = args[0];
	if (userInfo.userId == me.userId && typeof(userInfo.karaokeRole) != 'undefined')
		updateRoomControlPanel();
}

karaokeCb.serverMessage = function(superHandler, args) {
	var msg = args[0];
	if (msg == "Password required to sing")
		alert("B\u1ea1n ph\u1ea3i c\u00f3 m\u1eadt kh\u1ea9u \u0111\u1ec3 h\u00e1t trong room n\u00e0y");
	else if (msg == "Invalid password")
		alert("M\u1eadt kh\u1ea9u kh\u00f4ng \u0111\u00fang");
	else if (msg == "Nobody is singing")
		alert("C\u00f3 ai h\u00e1t \u0111\u00e2u m\u00e0 cho qua");
	else if (msg == "Invalid position")
		alert("V\u1ecb tr\u00ed kh\u00f4ng h\u1ee3p l\u1ec7");
	else if (msg == "Incorrect host password")
		alert("M\u1eadt kh\u1ea9u ch\u1ee7 room kh\u00f4ng \u0111\u00fang");
	else if (msg == "Chat disabled by host")
		superHandler("serverMessage", ["Ch&#x1ee7; room &#x0111;&#x00e3; kho&#x00e1; ch&#x1ee9;c n&#x0103;ng chat"]);
	else
		superHandler("serverMessage", args);
}

karaokeCb.blackList = function(superHandler, args) {
	var blackList = args[0];
	var html = new StringBuilder();
	html.append("<form name='unban-user-form' action='javascript:unbanUser()'>");
	html.append("<select name='ip' size='8' width='200' style='width: 200px'>");
	for (var i in blackList)
		html.append("<option value='").append(blackList[i]).append("'>").append(blackList[i]).append("</option>");
	html.append("</select>");
	html.append("<div class='vertical-clearing'></div>");
	html.append("<input type='submit' value=' Unban '/>");
	html.append("</form>");
	unbanUserDialog.html(html.toString());
}

function cb_perform() {
	pPublisher.perform(String(me.userId));
}


//publisher callbacks ----------------------------

function performanceFinished() {
	pKaraoke.returnMic();
}

function performanceStarted(mediaServer) {
	pKaraoke.takeMic(mediaServer);
}

function playerCallbackPublisher(method, args) {
	return pPublisher.playerCallback(method, args);
}

function PublisherInvokePlayer(method, args) {
	return pPublisher.invokePlayer(method, args);
}

function playerCallbackListener(method, args) {
	return pKaraoke.playerCallback(method, args);
}

function ListenerInvokePlayer(method, args) {
	return pKaraoke.invokePlayer(method, args);
}
