
// SERVER SETTINGS ----------------------------------------------------------

var appServer = "206.225.132.55";

var smileyServer = "karaoke.datviet.com";
var karaokeVideoServer = "karaoke.datviet.com";
var karaokeTrackServer = "karaoke.datviet.com";
var karaokeThumbServer = "karaoke.datviet.com";
var zingServer = "karaoke.datviet.com";
var mp3Server = "karaoke.datviet.com";

var karaokeStreamingServers = ["karaoke.datviet.com:9935", "206.225.132.51"];
var karaokeRecordingServer = "karaoke.diepkhuc.com:9935";
var webcamServer = karaokeStreamingServers[0];



// INITIALIZATION ----------------------------------------------------------

var userList = new Object();
var roomLists = null;
var currentRoomList = 0;
var selectedRoomList = 0;
var currentRoomIndex = 0;
var currentRoomType = "karaoke";
var enableWebcams = 1;

var me = new Object();
me.userId = String(new Date().getTime());
me.nick = "guest" + (me.userId % 10000);


var pChatAgent;
var pChatTabs;
var pChatLog;
var pChatNick;
var pChatEntry;	//form input
var pUserList;
var pRoomList;
var pWebcams;
var pServiceList;

function init(roomType, chatAgent, chatTabsElem, chatLog, chatNick, chatEntry, userList, roomList, webcams, serviceList) {
	currentRoomType = roomType;
	pChatAgent = chatAgent;
	pChatTabs = chatTabsElem;
	pChatLog = chatLog;
	pChatNick = chatNick;
	pChatEntry = chatEntry;
	pUserList = userList;
	pRoomList = roomList;
	pWebcams = webcams;
	pServiceList = serviceList;

	currentRoomList = getDefaultRoomList(currentRoomType);

	var query = window.location.search;
	if (query != "") {
		var params = query.substr(1).split("&");
		for (var i=0; i<params.length; i++) {
			var tokens = params[i].split("=");
			if (tokens[0] == "room")
				currentRoomIndex = Number(tokens[1]);
			else if (tokens[0] == "roomList")
				currentRoomList = Number(tokens[1]);
			else if (tokens[0] == "webcams")
				enableWebcams = tokens[1];
		}
	}

	selectedRoomList = currentRoomList;

	loadUserInfo();
	me.host = window.location.hostname;
	pChatNick.innerHTML = "<span onclick='editNick()'>" + me.nick + "</span>";

	updateChatTabs();
	pChatLog.appendChild(chatTabs[0].content);
	pUserList.appendChild(document.createElement("ul"));
	connect();
}

function connect() {
	try {
		pChatAgent.connect(me);
		pChatAgent.joinRoom(currentRoomList, currentRoomIndex);
		if (pWebcams != null) {
			pWebcams.registerCallbacks("myWebcamInfoUpdate");
			pWebcams.connect();
		}
	}
	catch (err) {
		setTimeout("connect()", 500);
	}
}


// ROOM FUNCTIONS ------------------------------------------------------

function getDefaultRoomList(roomType) {
	switch (roomType) {
		case "karaoke":		return 0;
		case "tienlen":
		case "caro":
		case "cchess":
		case "chess":
		case "tetris":		return 2;
		case "books":		return 3;
		case "music":		return 4;
		case "videos":		return 5;
	}
	return 0;
}

function joinRoom(roomIndex, roomType) {
	if (roomType != currentRoomType) {
		window.location.href = (roomType + ".html?room=" + roomIndex + "&roomList=" + selectedRoomList);
	}
	else if (selectedRoomList != currentRoomList || roomIndex != currentRoomIndex) {
		chatTabs[0].content.innerHTML = "";
		pUserList.lastChild.innerHTML = "";
		userList = new Object();
		currentRoomList = selectedRoomList;
		currentRoomIndex = roomIndex;
		pChatAgent.joinRoom(currentRoomList, currentRoomIndex);
		updateRoomList();
	}
}

var createRoomDialog = null;

function createRoom() {
	var form = document["create-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 roomInfo = new Object();
		roomInfo.type = "karaoke";
		roomInfo.name = form.roomName.value;
		roomInfo.description = form.roomDescription.value;
		roomInfo.hostPass = form.hostPass.value;
		roomInfo.emceePass = form.emceePass.value;
		roomInfo.singPass = form.singPass.value;
		pChatAgent.createRoom(roomInfo);
		createRoomDialog.dialog('close');
	}
}

function openCreateRoomForm() {
	if (createRoomDialog == null) {
		createRoomDialog = $("<div></div>").dialog({
			autoOpen: false,
			width: 500,
			title: "Create Room"
		});
		$.get("include/createKaraokeRoom.html", function(data) {
			createRoomDialog.html(data);
		});
	}
	createRoomDialog.dialog('open');
}


// CHAT FUNCTIONS ----------------------------------------------------------

var lastSent = 0;

function chatEntry_keyPressed(e) {
	var keynum;
	if (window.event) keynum = e.keyCode;
	else if (e.which) keynum = e.which;

	if (keynum == 13) {
		if (pChatEntry.value != "") {
			if (new Date().getTime()-lastSent >= 1000) {
				var message = pChatEntry.value.substring(0, 160);
				if (message.length > 0 && message.charAt(0) == '/') {
					if (message == "/abuse") {
						document.getElementById("abuse-view").innerHTML = "<iframe src='abuse.html' frameborder='0' width='100%' height='500px'></iframe>";
					}
					else {
						if (activeChatTabIndex != 0 && (message.match("^/ban") || message.match("^/kick")))
							message += " " + chatTabs[activeChatTabIndex].target;
						pChatAgent.runCmd(message);
					}
				}
				else {
					if (activeChatTabIndex != 0) {
						pChatAgent.privateMessage(chatTabs[activeChatTabIndex].target, message);
						appendChatMessage(activeChatTabIndex, me.userId, me.nick, message);
					}
					else {
						pChatAgent.broadcast(message);
					}
				}
				pChatEntry.value = "";
				lastSent = new Date().getTime();
			}
		}
		return false;
	}
	return true;
}

function editNick(e) {
	pChatNick.innerHTML = "<input type='text' id='nickInput' value='" + me.nick + "'/>";
	var nickInput = document.getElementById("nickInput");
	nickInput.select();
	nickInput.focus();
}

function nickChanged() {
	var nickInput = document.getElementById("nickInput");
	if (nickInput.value.match(/\S/) != null) {
		me.nick = nickInput.value.substring(0, 50);
		pChatAgent.setUserInfo(me);
		pChatNick.innerHTML = "<span onclick='editNick()'>" + me.nick + "</span>";
		saveUserInfo();
	}
}

function loadUserInfo() {
	var userInfo = getCookie("me");
	if (userInfo != "") {
		me = decodeObject(userInfo);
		me.userId = String(me.userId);
	}
	else {
		var nick = getCookie("nick");
		if (nick != "") {
			me.nick = nick;
			saveUserInfo();
		}
	}
}

function saveUserInfo() {
	setCookie("me", encodeObject(me), 30);
}

var nickPalette = ["#FF0000", "#00FF00", "#0000FF", "#FF6600", "#00FF66", "#FF0066", "#66FF00", "#0066FF", "#6600FF"];

function getNickColor(userId) {
	return nickPalette[userId % nickPalette.length];
}

var handleCallback = function(method, args) {
	if (method == 'chatHistory')
		chatCb.chatHistory(args[0]);
	else if (method == 'chatMessage')
		chatCb.chatMessage(args[0], args[1]);
	else if (method == 'privateMessage')
		chatCb.privateMessage(args[0], args[1]);
	else if (method == 'serverMessage')
		chatCb.serverMessage(args[0]);
	else if (method == 'userList')
		chatCb.userList(args[0]);
	else if (method == 'userAdd')
		chatCb.userAdd(args[0]);
	else if (method == 'userRemove')
		chatCb.userRemove(args[0]);
	else if (method == 'userUpdate')
		chatCb.userUpdate(args[0]);
	else if (method == 'roomLists')
		chatCb.roomLists(args[0]);
	else if (method == 'roomInfo')
		chatCb.roomInfo(args[0]);
	else if (method == 'roomStats')
		chatCb.roomStats(args[0]);
	else {
		alert("No handler for callback: " + method);
		return false;
	}
	return true;
};


//callbacks: chat

var chatCb = new Object();

chatCb.chatHistory = function(chatHistory) {
	for (var i in chatHistory) {
		var userInfo = chatHistory[i][0];
		appendChatMessage(0, userInfo.userId, userInfo.nick, chatHistory[i][1]);
	}
}

chatCb.chatMessage = function(userId, msg) {
	if (typeof(userList[userId]) != 'undefined')
		appendChatMessage(0, userId, userList[userId].nick, msg);
	else
		appendChatMessage(0, userId, "[unknown]", msg);
}

chatCb.privateMessage = function(userInfo, msg) {
	var obj = userInfo;
	var index = findChatTab(obj.userId);
	if (index != -1) {
		appendChatMessage(index, obj.userId, obj.nick, msg);
		if (index != activeChatTabIndex)
			flashNoticeChatTab(index);
	}
	else {
		index = createChatTab(obj.userId, obj.nick);
		appendChatMessage(index, obj.userId, obj.nick, msg);
		selectChatTab(index);
		pChatAgent.playSound("sounds/chimedwn.mp3");
	}
}

chatCb.serverMessage = function(msg) {
	appendChatLog(activeChatTabIndex, "<div style='color: #808080'>*" + mutate(msg) + "</div>");
}

function appendChatMessage(chatTabIndex, userId, nick, message) {
	var html = new StringBuilder();
	html.append("<a style='color:").append(getNickColor(userId)).append("' href='javascript:openPrivateChat2(").append(userId).append(",\"").append(nick).append("\")'>");
	html.append(mutate(nick));
	html.append("</a>: ");
	html.append(mutate(message));
	appendChatLog(chatTabIndex, html);
}

function appendChatLog(chatTabIndex, msg) {
	var node = document.createElement("div");
	node.innerHTML = msg;
	var chatLog = chatTabs[chatTabIndex].content;
	chatLog.appendChild(node);
	if (chatLog.childNodes.length > 20)
		chatLog.removeChild(chatLog.firstChild);
	if (chatTabIndex == activeChatTabIndex)
		pChatLog.scrollTop = pChatLog.scrollHeight;
}

function mutate(msg) {
	msg = msg.replace(/</g, "&#x003C;");
	msg = msg.replace(/>/g, "&#x003E;");
	msg = msg.replace(/\[img:(.*?)\]/g, "<img src='http://" + smileyServer + "/smileys/$1'/>");
	
	var countUpper = 0;
	for (var i=0; i<msg.length; i++)
		if (msg.charCodeAt(i) > 64 && msg.charCodeAt(i) < 91)
			countUpper++;
	if (countUpper > msg.length/2)
		msg = msg.toLowerCase();
	return msg;
}


//callbacks: user info

chatCb.userList = function(users) {
	for (var i in users)
		this.userAdd(users[i]);
}

chatCb.userAdd = function(userInfo) {
	var obj = userInfo;
	if (typeof(userList[obj.userId]) == 'undefined') {
		userList[obj.userId] = obj;
		var elem = document.createElement("li");
		elem.innerHTML = getUserListElemHTML(obj);
		elem.userId = obj.userId;
		pUserList.lastChild.appendChild(elem);
	}
}

chatCb.userRemove = function(userId) {
	if (typeof(userList[userId]) != 'undefined') {
		delete userList[userId];
		var elem = findUserListElem(userId);
		if (elem != null)
			pUserList.lastChild.removeChild(elem);
	}
}

chatCb.userUpdate = function(userInfo) {
	var obj = userInfo;
	if (typeof(userList[obj.userId]) != 'undefined') {
		userList[obj.userId] = obj;
		var elem = findUserListElem(obj.userId);
		if (elem != null)
			elem.innerHTML = getUserListElemHTML(obj);
		if (pWebcams != null)
			pWebcams.updateWebcamInfo(encodeObject(obj));
	}
}

function findUserListElem(userId) {
	if (pUserList.lastChild.hasChildNodes()) {
		var child = pUserList.lastChild.firstChild;
		while (child != null) {
			if (child.userId == userId)
				return child;
			child = child.nextSibling;
		}
	}
	return null;
}

var getUserIconURL = function(userInfo) {
	if (typeof(userInfo.role) != 'undefined' && userInfo.role == 'moderator')
		return 'images/moderator_icon.jpg';
	else
		return 'images/smiley.png';
}

var getUserStatusMessage = function(userInfo) {
	return null;
}

function getUserListElemHTML(userInfo) {
	var html = new StringBuilder();
	html.append("<img src='").append(getUserIconURL(userInfo)).append("'/> ");
	html.append("<a style='color:").append(getNickColor(userInfo.userId)).append("' href='javascript:openPrivateChat(").append(userInfo.userId).append(")'>").append(mutate(userInfo.nick)).append("</a>");
	var statusMsg = getUserStatusMessage(userInfo);
	if (statusMsg != null)
		html.append(" ").append(statusMsg);
	return html.toString();
}


//callbacks: room info

chatCb.roomLists = function(data) {
	roomLists = data;
	updateRoomList();
	updateRoomListTabs();
}

chatCb.roomInfo = function(data) {
	var roomInfo = data;
	for (var i=0; i<roomInfo.length; i++) {
		for (var roomId in roomInfo[i])
			roomLists[i].roomsInfo[roomId] = roomInfo[i][roomId];
	}
	updateRoomList();
	updateRoomListTabs();
}

chatCb.roomStats = function(data) {
	var missingRooms = new Array();
	var hasMissingRooms = false;
	var roomStats = data;
	for (var i=0; i<roomLists.length; i++) {
		missingRooms[i] = [];
		roomLists[i].totalUserCount = roomStats[i].totalUserCount;
		if (typeof(roomStats[i].userCounts) != 'undefined') {
			for (var roomId in roomLists[i].roomsInfo) {
				//remove rooms that exist in roomList but not in roomStats
				if (typeof(roomStats[i].userCounts[roomId]) == 'undefined')
					delete roomLists[i].roomsInfo[roomId];
				else
					roomLists[i].roomsInfo[roomId][2] = roomStats[i].userCounts[roomId];
			}
			//get ids of rooms in roomStats but not roomList
			for (var roomId in roomStats[i].userCounts) {
				if (typeof(roomLists[i].roomsInfo[roomId]) == 'undefined') {
					missingRooms[i].push(Number(roomId));
					hasMissingRooms = true;
				}
			}
		}
	}
	if (hasMissingRooms)
		pChatAgent.getRoomInfo(missingRooms);
	updateRoomList();
	updateRoomListTabs();
}


//callbacks: webcam

function cb_setWebcamList(list) {
	if (pWebcams != null && enableWebcams == 1)
		pWebcams.setWebcamList(list, String(me.userId));
}

function myWebcamInfoUpdate(webcamInfo) {
	var obj = decodeObject(webcamInfo);
	for (var p in obj)
		me[p] = obj[p];
	pChatAgent.setUserInfo(me);
}


// ROOM LIST ---------------------------------------------------------------

function selectRoomList(index) {
	if (index == 3)
		window.location.href = "reading.html";
	else if (index == 4)
		window.location.href = "music.html";
	else if (index == 5)
		window.location.href = "videos.html";
	else if (index != selectedRoomList) {
		selectedRoomList = index;
		updateRoomListTabs();
		updateRoomList();
	}
}

function updateRoomListTabs() {
	var html = new StringBuilder();
	for (var i=0; i<roomLists.length; i++) {
		if (window.location.hostname.match("^games") && i != 2 && i != 3 && i != 4)
			continue;
		if (i == selectedRoomList)
			html.append("<span class='active'");
		else
			html.append("<span class='inactive'");
		html.append(" onMouseDown='selectRoomList(").append(i).append(")'>").append(roomLists[i].name);
		html.append(" (").append(roomLists[i].totalUserCount).append(")</span>");
	}
	pServiceList.innerHTML = html.toString();
}

function updateRoomList() {
	switch (selectedRoomList) {
		case 0:
			showRoomList(4, 10, sortByRoomId);
			break;
		case 1:
			showRoomList(4, 0, sortByUserCount);
			break;
		case 2:
			showRoomList(5, 20, sortByRoomId);
			break;
	}
}

function showRoomList(numCols, colSize, sorter) {
	var roomList = roomLists[selectedRoomList].roomsInfo;
	var roomIds = getKeys(roomList).sort(sorter);
	if (colSize == 0)
		colSize = Math.ceil(roomIds.length/numCols);
	
	var html = new StringBuilder();
	html.append("<table><tr>");
	for (var col=0; col<numCols; col++) {
		html.append("<td valign='top'><ul>");
		for (var i=col*colSize; i<(col+1)*colSize && i<roomIds.length; i++) {
			var room = roomList[roomIds[i]];
			html.append("<li>");
			if (roomIds[i] == currentRoomIndex && selectedRoomList == currentRoomList) {
				html.append("<span class='room-title-selected'>");
				html.append(room[0]);
				html.append("</span> ");
			}
			else {
				if (room[2] < 150)
					html.append("<a href='javascript:joinRoom(").append(roomIds[i]).append(",\"").append(room[1]).append("\")'>");
				else
					html.append("<a>");
				html.append(room[0]);
				html.append("</a> ");
			}
			html.append("<span class='").append(room[2]>0 ? "user-count-nonzero" : "user-count").append("'>(");
			html.append(room[2]).append(")</span>");
			html.append("</li>");
			if (selectedRoomList == 1 && i+1 == roomIds.length)
				html.append("<li><a href='javascript:openCreateRoomForm()'>T&#x1ea1;o room...</a></li>");
		}
		if (selectedRoomList == 1 && 0 == roomIds.length && col == 0)
			html.append("<li><a href='javascript:openCreateRoomForm()'>T&#x1ea1;o room...</a></li>");
		html.append("</ul></td>");
	}
	html.append("</tr></table>");
	pRoomList.innerHTML = html;
}

function getKeys(obj) { 
	var keys = []; 
	for (var key in obj) 
		keys.push(key); 
	return keys; 
}

function sortByRoomId(a,b) {
	return a-b;
}

function sortByUserCount(a,b) {
	var roomList = roomLists[selectedRoomList].roomsInfo;
	return roomList[b][2]-roomList[a][2];
}


// CHAT TABS --------------------------------------------------------------

var chatTabs = [{title:"Room", content:document.createElement("div"), target:0, notice:0}];
var activeChatTabIndex = 0;

function updateChatTabs() {
	var html = new StringBuilder();
	html.append("<ul>");
	for (var i=0; i<chatTabs.length; i++) {
		if (i == activeChatTabIndex)
			html.append("<li class='chat-tab-selected'>");
		else
			html.append("<li class='chat-tab").append(chatTabs[i].notice==1 ? " notice" : "").append("' onclick='selectChatTab(").append(i).append(")'>");
		html.append(shortenChatTabTitle(chatTabs[i].title));
		if (i != 0)
			html.append("&nbsp;<img src='images/close.gif' onclick='closeChatTab(").append(i).append(")'/>");
		html.append("</li>");
	}
	html.append("</ul>");
	pChatTabs.innerHTML = html;
}

function shortenChatTabTitle(title) {
	if (title.length > 13)
		return title.substring(0, 10) + "...";
	else
		return title;
}

function selectChatTab(index) {
	if (index != activeChatTabIndex) {
		activeChatTabIndex = index;
		chatTabs[index].notice = 0;
		updateChatTabs();
		pChatLog.replaceChild(chatTabs[index].content, pChatLog.lastChild);
		pChatLog.scrollTop = pChatLog.scrollHeight;
	}
}

function closeChatTab(index) {
	if (index == activeChatTabIndex) {
		selectChatTab(0);
	}
	chatTabs.splice(index, 1);
	updateChatTabs();
}

function findChatTab(target) {
	for (var i=1; i<chatTabs.length; i++) {
		if (chatTabs[i].target == target)
			return i;
	}
	return -1;
}

function createChatTab(userId, nick) {
	chatTabs.push({title:nick, content:document.createElement("div"), target:userId, notice:0});
	appendChatLog(chatTabs.length-1, "\u0110ang n\u00F3i chuy\u1EC7n ri\u00EAng v\u1EDBi <span style='color:" + getNickColor(userId) + "'><u>" + nick + "</u></span>");
	return chatTabs.length-1;
}

function openPrivateChat(userId) {
	if (userId != me.userId) {
		var index = findChatTab(userId);
		if (index == -1)
			index = createChatTab(userId, userList[userId].nick);
		selectChatTab(index);
	}
}

function openPrivateChat2(userId, nick) {
	if (userId != me.userId) {
		var index = findChatTab(userId);
		if (index == -1)
			index = createChatTab(userId, nick);
		selectChatTab(index);
	}
}

function flashNoticeChatTab(index) {
	if (chatTabs[index].notice == 0) {
		chatTabs[index].notice = 1;
		updateChatTabs();
	}
}


// REPORT ABUSE -------------------------------------------------------------

var reportAbuseDialog = null;

function reportAbuse() {
	if (reportAbuseDialog == null) {
		reportAbuseDialog = $("<div></div>").dialog({
			autoOpen: false,
			title: "Report Abuse"
		});
		var html = new StringBuilder();
		html.append("<p>Xin cho bi\u1EBFt nick c\u1EE7a t\u00EAn kh\u1EE7ng b\u1ED1</p>");
		html.append("<p><form name='report-abuse-form' action='javascript:sendAbuseReport()'>");
		html.append("<input type='text' name='comment'/>");
		html.append("<input type='submit' value='Submit'/></form></p>");
		reportAbuseDialog.html(html.toString());
	}
	reportAbuseDialog.dialog('open');
}

function sendAbuseReport() {
	if (document['report-abuse-form'].comment.value != '') {
		$.post("/dkstudio/abuse", {
			userId: me.userId,
			nick: me.nick,
			room: roomLists[currentRoomList].roomsInfo[currentRoomIndex][0],
			comment: document['report-abuse-form'].comment.value
		});
		reportAbuseDialog.dialog('close');
	}
}


// SMILEYS -------------------------------------------------------------------

var pSmileyBrowser;
var pInsertTarget;	//form input

function initSmileys(smileyBrowser, insertTarget) {
	pSmileyBrowser = smileyBrowser;
	pInsertTarget = insertTarget;
	pSmileyBrowser.style.visibility = "hidden";
}

var smileys = null;

function loadSmileys() {
	$.get("include/smileys.txt", function(data) {
		smileys = new Object();
		smileys.items = new Array();
		var tokens = data.split("\n");
		for (var i=0; i<tokens.length; i++) {
			var item = new Object();
			item.path = tokens[i];
			smileys.items.push(item);
		}
		smileys.itemsPerPage = 20;
		smileys.numPages = Math.ceil(smileys.items.length / smileys.itemsPerPage);
		smileys.currentPage = 0;
		updateSmileyBrowser();
	});
	$("#smiley-browser").html("<span style='color:red'>Loading...</span>");
}

function updateSmileyBrowser() {
	var html = new StringBuilder();
	html.append("<div class='smiley-pager'>");
	for (var i=0; i<smileys.numPages; i++) {
		html.append("<a href='javascript:selectSmileyPage(").append(i).append(")'>").append(i+1).append("</a> ");
	}
	html.append("<a href='javascript:viewAllSmileys()'>T&#x1EA5;t c&#x1EA3;</a>");
	html.append("</div>");
	html.append("<div class='smiley-picker'>");
	for (var i=0; i<smileys.itemsPerPage; i++) {
		var index = smileys.itemsPerPage * smileys.currentPage + i;
		if (typeof(smileys.items[index]) != 'undefined') {
			html.append("<a href='javascript:selectSmiley(").append(index).append(")'>");
			html.append("<img src='http://").append(smileyServer).append("/smileys/").append(smileys.items[index].path).append("'/>");
			html.append("</a>");
		}
	}
	html.append("</div>");
	$("#smiley-browser").html(html.toString());
}

var smileysDialog = null;

function viewAllSmileys() {
	toggleSmileyBrowser();
	if (smileysDialog == null)
		loadSmileysDialog();
	else
		smileysDialog.dialog("open");
}

function loadSmileysDialog() {
	smileysDialog = $('<div></div>').dialog({
		autoOpen: false,
		width: 400,
		title: "Smileys"
	});
	smileysDialog.dialog('open');
	$.get("include/smileyBrowser.html", function(data) {
		smileysDialog.html(data);
	});
}

function selectSmileyPage(page) {
	smileys.currentPage = page;
	updateSmileyBrowser();
}

function toggleSmileyBrowser() {
	if (pSmileyBrowser.style.visibility == "visible")
		pSmileyBrowser.style.visibility = "hidden";
	else {
		pSmileyBrowser.style.visibility = "visible";
		if (smileys == null)
			loadSmileys();
	}
}

function selectSmiley(index) {
	insertAtCursor(pInsertTarget, "[img:" + smileys.items[index].path + "]");
	pInsertTarget.focus();
	toggleSmileyBrowser();
}appServer += ":9935";

function insertAtCursor(myField, myValue) {
	//IE support
	if (document.selection) {
		myField.focus();
		sel = document.selection.createRange();
		sel.text = myValue;
	}
	//Mozilla/Firefox/Netscape 7+ support
	else if (myField.selectionStart && myField.selectionStart == '0') {
		var startPos = myField.selectionStart;
		var endPos = myField.selectionEnd;
		myField.value = myField.value.substring(0, startPos)+ myValue+ myField.value.substring(endPos, myField.value.length);
	}
	else {
		myField.value += myValue;
	}
}


	var smileyBrowser = new Object();
	
	function showCollection(collection, count) {
		smileyBrowser.currentCollection = collection;
		smileyBrowser.currentCount = count;
		smileyBrowser.pageSize = 20;
		smileyBrowser.numPages = Math.ceil(count/smileyBrowser.pageSize);
		smileyBrowser.currentPage = 0;
		updateSmileys();
	}

	function updateSmileys() {
		var start = smileyBrowser.currentPage*smileyBrowser.pageSize;
		var stop = Math.min(smileyBrowser.currentCount, (smileyBrowser.currentPage+1)*smileyBrowser.pageSize);
		var html = new StringBuilder();
		for (var i=start; i<stop; i++)
			html.append("<img src='http://").append(smileyServer).append("/smileys/").append(smileyBrowser.currentCollection).append("/").append(i+1).append(".gif' style='cursor: pointer' onclick='insertSmiley(").append(i+1).append(")'/>");
		$("#smileys").html(html.toString());
		
		html = "<select onChange='gotoSmileyPage(this.selectedIndex)'>";
		for (var i=0; i<smileyBrowser.numPages; i++) {
			if (i == smileyBrowser.currentPage)
				html += "<option selected>" + (i+1) + "</option>";
			else
				html += "<option>" + (i+1) + "</option>";
		}
		html += "</select>";
		$("#pageNumber").html(html.toString());
	}
	
	function insertSmiley(index) {
		insertAtCursor(pInsertTarget, "[img:" + smileyBrowser.currentCollection + "/" + index + ".gif]");
	}
	
	function gotoSmileyPage(index) {
		smileyBrowser.currentPage = index;
		updateSmileys();
	}
	
	function nextSmileyPage() {
		if ((smileyBrowser.currentPage+1)*smileyBrowser.pageSize < smileyBrowser.currentCount) {
			smileyBrowser.currentPage++;
			updateSmileys();
		}
	}
	
	function prevSmileyPage() {
		if (smileyBrowser.currentPage > 0) {
			smileyBrowser.currentPage--;
			updateSmileys();
		}
	}

