var Lang = {};
Lang.Error = {};
Lang.Status = {};
Lang.Helper = {};

Lang.MinionName				= "미니온";
Lang.UserListTitle			= "접속자";
Lang.PrivChannel			= "개인채널";
Lang.UserListTotalTitle		= "채널접속자";
Lang.UserCountText			= "명";
Lang.Me						= "나";
Lang.HideUser				= "접속자목록 숨기기";
Lang.ShowUser				= "접속자목록 보이기";
Lang.Login					= "로그인/닉네임변경";
Lang.LoginFormTitle			= "미니온 로그인";
Lang.LoginFormID			= "아이디";
Lang.LoginFormPassword		= "패스워드";
Lang.NickFormTitle			= "닉네임 변경하기";
Lang.NickFormNickname		= "닉네임";
Lang.NickFormNicknameText	= "변경하실 닉네임을 입력하세요.";
Lang.NickFormNotSupport		= "닉네임변경을 지원하지 않는 채널입니다.";
Lang.NickFormInsertError	= "닉네임을 입력하여 주십시오.";
Lang.NickFormNickError		= "닉네임에 포함되어서는 안되는 특수문자가 있습니다.";
Lang.PopupError				= "팝업이 차단되었습니다.\n팝업허용을 하신 후 다시 시도하여 주십시오.";
Lang.Setup					= "미니온설정";
Lang.TextDefault			= "글꼴초기화";
Lang.ChangeNickname			= "닉네임변경";
Lang.ScrollLock				= "스크롤고정";
Lang.ScrollUnLock			= "자동스크롤";
Lang.WindowEmpty			= "화면비우기";
Lang.Help					= "도움말";
Lang.DeleteLog				= "채팅로그삭제";
Lang.Command				= "명령어";
Lang.Info					= "안내";

Lang.UserJoin				= '{nickname}님이 참여하셨습니다.';
Lang.UserOut				= '{nickname}님이 종료하셨습니다.';
Lang.UserNickChange			= '{nickname}님이 닉네임을 {newnick}으로 변경하셨습니다.';
Lang.UserStatus				= '{nickname}님이 상태를 {status}으로 변경하셨습니다.';

Lang.InvitePrivChannel		= "개인채널초대";
Lang.InviteChannel			= "이 채널로 초대";
Lang.BanTalk				= "대화차단";
Lang.BanTalkConfirm			= "해당유저의 대화를 차단 하시겠습니까?";
Lang.BanTalkError			= "이미 등록된 유저입니다.";
Lang.BanTalkOK				= "{nickname}님의 대화는 앞으로 차단됩니다.";
Lang.BanTalkLimit			= "일시차단은 30명까지만 가능합니다.";

Lang.Call					= "호출하기";
Lang.CallOK					= "{nickname}님을 호출하였습니다.";
Lang.Whisper				= "귓속말보내기";

Lang.AdminBanTalk			= "대화일시차단";
Lang.AdminBanTalkConfirm	= "3분간 채팅을 할 수 없도록 차단합니다.\n해당회원은 3분간 대화를 볼 수만 있습니다.";
Lang.AdminBanTalkOK			= "{nickname}님에게 앞으로 3분간 채팅을 하지못하도록 설정하였습니다.";

Lang.ShowIP					= "IP보기";
Lang.BanIP					= "IP차단";

Lang.Emoticon				= "이모티콘";
Lang.LastTalk				= "마지막대화";

Lang.Accept					= "수락하기";
Lang.Reject					= "거절하기";

Lang.ScrollLockText			= "채팅내용이 자동으로 스크롤되지 않게 고정합니다.";
Lang.ScrollUnLockText		= "채팅내용이 자동으로 스크롤되게 합니다.";
Lang.DeleteLogText			= "최근에 이루어진 15줄의 대화기록을 삭제하여, 더이상 노출되지 않습니다.";
Lang.InviteMessage			= "{nickname}님이 개인대화채널에 초대하셨습니다.";
Lang.InviteErrorText		= "{nickname}님은 이미 이 채널에 참여중입니다.";
Lang.InviteText				= "{nickname}님을 이 채널로 초대하였습니다.";
Lang.BanMessage				= "{nickname}님을 영구차단하였습니다.";
Lang.ShowIPMessage			= "{nickname}님은 {ip}에서 접속중입니다.";
Lang.CallMessage			= "{nickname}님이 호출하셨습니다.";
Lang.WhisperKick			= "{nickname}님은 귓속말거부상태이거나, 회원님을 차단한 상태입니다.";
Lang.WhisperWait			= "{nickname}님은 자리비움/다른용무중으로 응답하지 않을 수 있습니다.";

Lang.Error.ConnectFail		= "서버접속에 실패하였습니다.";
Lang.Error.ServerFail		= "서버와 통신할 수 없습니다.";
Lang.Error.Disconnect		= "서버접속이 끊어졌습니다.";
Lang.Error.OtherWindow		= "다른 창에서 접속하셨습니다.";
Lang.Error.NickFail			= "닉네임이 중복됩니다.";
Lang.Error.NotFoundUser		= "유저를 찾을 수 없습니다.";
Lang.Error.RegBanIp			= "IP차단에 따라 접속이 해제됩니다.";
Lang.Error.Banner			= "배너이미지를 로딩하는데 실패하였습니다.";
Lang.Error.BanConnect		= "서버접속이 거부당했습니다.";
Lang.Error.LongMessage		= "대화내용이 너무 길어 전송할 수 없습니다.";
Lang.Error.RepeatTalk		= "10초동안 {limit}회 도배로 앞으로 30초동안 대화할 수 없습니다.";
Lang.Error.BanTalk			= "앞으로 {second}초동안 대화할 수 없습니다.";
Lang.Error.WrongCommand		= "명령어가 잘못 사용되었습니다. /? 를 입력하여 도움말을 참고하세요.";
Lang.Error.CallUser			= "{nickname}님을 호출하였습니다.";
Lang.Error.AlreadyKick		= "이미 차단목록에 등록된 유저입니다.";
Lang.Error.Kick				= "{nickname}님의 대화, 귓속말, 호출, 개인채널초대를 앞으로 차단합니다.";
Lang.Error.KickLimit		= "대화차단등록은 30명까지만 가능합니다.";
Lang.Error.NotAdmin			= "권한이 없습니다.";
Lang.Error.Quiet			= "{nickname}님에 의해 앞으로 3분간 대화할 수 없습니다.";
Lang.Error.QuietUser		= "{nickname}님에게 3분간 대화를 하지 못하도록 설정하였습니다.";
Lang.Error.PrivChanRefuse	= "{nickname}님의 초대를 거절하였습니다.";
Lang.Error.InviteRefuse		= "{nickname}님이 초대를 거절하였습니다.";
Lang.Error.Timeout			= "접속허용시간이 초과되었습니다.";
Lang.Error.Security			= "보안코드가 일치하지 않습니다.";
Lang.Error.BanIp			= "접속하신 아이피는 해당채널의 차단IP목록에 등록되어 있습니다.";
Lang.Error.Login			= "로그인되었습니다.";
Lang.Error.NotFoundId		= "등록된 회원아이디를 찾을 수 없습니다.";
Lang.Error.NotRegId			= "해당채널에 등록된 아이디가 아닙니다.";
Lang.Error.Reconnect		= "{second}초후에 재접속합니다.";
Lang.Error.TryConnect		= "미니온서버에 접속을 시도합니다.";
Lang.Error.DoubleConnect	= "중복접속이 확인되어 기존접속을 해제중입니다.";
Lang.Error.ConnectOk		= "미니온서버에 접속하였습니다.";
Lang.Error.NotPrivChannel	= "개인대화채널에서만 사용가능합니다.";
Lang.Error.NotSupport		= "현재상태에서는 지원하지 않는 기능입니다.";

Lang.Status.online			= "온라인";
Lang.Status.wait			= "자리비움";
Lang.Status.busy			= "바쁨";
Lang.Status.otherwork		= "다른용무중";
Lang.Status.phone			= "전화중";
Lang.Status.eye				= "눈팅중";
Lang.Status.eat				= "식사중";
Lang.Status.sad				= "슬픔";
Lang.Status.work			= "삽질중";
Lang.Status.boom			= "건들면터짐";
Lang.Status.candle			= "...";
Lang.Status.offline			= "오프라인";

Lang.Helper.Help			= "/? : 도움말을 봅니다.";
Lang.Helper.Whisper			= "/w [닉네임] 할말 : [닉네임]유저에게 귓속말을 보냅니다.";
Lang.Helper.Call			= "/call [닉네임] : [닉네임]유저를 호출합니다.";
Lang.Helper.Myroom			= "/myroom : 개인대화채널을 개설합니다.";
Lang.Helper.Ban				= "/ban [닉네임] : [닉네임]유저의 대화를 차단합니다.";
Lang.Helper.Ip				= "/ip [닉네임] : [닉네임]유저의 IP를 확인합니다.";
Lang.Helper.IpBan			= "/ipban [닉네임] : [닉네임]유저의 IP를 영구차단합니다.";
Lang.Helper.Quiet			= "/quiet [닉네임] : [닉네임]유저를 30초동안 채팅금지 시킵니다.";
Lang.Helper.Invite			= "/invite [닉네임] : [닉네임]유저를 이 채널로 초대합니다.";
Lang.Helper.AutoMsg			= "입력창에 커서를 두고, 키보드의 방향키 위/아래 키를 누르면 이전 대화내역을 불러올 수 있습니다.";

var MinionUserListView = true;
var MinionUserListWidth = 180;
var MinionUserListHeight = 60;
var MinionFontSize = 11;
var MinionFontFamily = "dotum";
var MinionViewUserMessage = true;
var MinionUseAutoFocus = false;
var MinionSWFPath = "/flash/minion3.devarzz.swf?rnd="+Math.random();
var MinionFlashVars = "code="+MinionCode+"&nickname="+MinionNickname+"&nickcon="+MinionNickcon;

var MinionID = "MinionConnector";
var MinionHTML = "";
var MinionInviteList = new Array();
var MinionTalk = true;
var MinionMySetting = new Array();
var MinionUserListBody = null;
var MinionChattingBody = null;
var MinionAutoScroll = true;
var MinionClock = null;

var MinionUserStore = new Ext.data.SimpleStore({
	fields:["nickname","nickcon","status","html"],
	data:[]
});
var MinionUserRecord = Ext.data.Record.create([{name:"nickname",type:"string"},{name:"nickcon",type:"string"},{name:"status",type:"string"},{name:"html",type:"string"}]);

if (Ext.isIE == true) {
	MinionHTML+= '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="180" height="80" id="'+MinionID+'" align="middle">';
	MinionHTML+= '<param name="allowScriptAccess" value="always" />';
	MinionHTML+= '<param name="flashVars" value="'+MinionFlashVars+'" />';
	MinionHTML+= '<param name="movie" value="'+MinionSWFPath+'" />';
	MinionHTML+= '<param name="quality" value="high" />';
	MinionHTML+= '<param name="wmode" value="transparent" />';
	MinionHTML+= '<embed src="'+MinionSWFPath+'" quality="high" wmode="transparent" style="width:180px; height:80px;" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+MinionFlashVars+'"></embed>';
	MinionHTML+= '</object>';
} else {
	MinionHTML+= '<embed id="'+MinionID+'" src="'+MinionSWFPath+'" quality="high" wmode="transparent" style="width:180px; height:80px;" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+MinionFlashVars+'"></embed>';
}

function MinionRoomPopup(mode,room,tonickname) {
	var width = 650;
	var height = 400;
	var windowLeft = (screen.width-width)/2;
	var windowTop = (screen.height-height)/2;
	windowTop = windowTop>20 ? windowTop-20 : windowTop;

	var info = document.getElementById(MinionID).info();
	var object = document.forms["popup"];
	object.nickname.value = info[0];
	object.room.value = room;
	object.mode.value = mode;
	object.tonickname.value = tonickname;

	var opener = window.open("/minion/openroom.php",room,"top="+windowTop+",left="+windowLeft+",width="+width+",height="+height+",scrollbars=0");

	if (opener) {
		opener.focus();
	} else {
		alert(Lang.PopupError);
	}
}

function MinionUserList(nickname,nickcon,status,html) {
	var list = new MinionUserRecord({nickname:nickname,nickcon:nickcon,status:status,html:html});
	MinionUserStore.add(list);
}

function MinionUserPrint() {
	MinionUserListBody = Ext.getCmp("MinionExtUserList").getLayoutTarget().dom;
	MinionUserStore.sort("nickname","ASC");

	Ext.getCmp("Minion").setTitle("<span style='cursor:pointer;' onclick='window.open(\"http://www.minion.kr\");'>"+Lang.MinionName+"</span> ("+MinionUserStore.getCount().toString()+Lang.UserCountText+")");
	var sHTML = "";

	if (Ext.getCmp("MinionExtUserList").hidden == true) return;

	for (var i=0, loop=MinionUserStore.getCount();i<loop;i++) {
		sHTML+= '<div style="background-image:url(/images/status/'+MinionUserStore.getAt(i).get("status")+'.gif);" class="MinionUserList" title="'+MinionUserStore.getAt(i).get("nickname").replace(/\'/g,"\\'")+'" onclick="MinionUserMenu(event)">';
		sHTML+= MinionUserStore.getAt(i).get("html");
		sHTML+= '</div>';
	}

	MinionUserListBody.innerHTML = sHTML;
}

function MinionUserJoin(nickname,nickcon,status,html) {
	var list = new MinionUserRecord({nickname:nickname,nickcon:nickcon,status:status,html:html});
	MinionUserStore.add(list);

	if (MinionViewUserMessage == true && nickname.match(/^Guest[0-9]{3}$/i) == null) MinionSystemMessage(Lang.UserJoin.replace('{nickname}','<b>'+nickname+'</b>'));
	if (Ext.getCmp("MinionExtUserList").hidden == true) return;
	MinionUserStore.sort("nickname","ASC");

	var idx = MinionUserStore.find("nickname",nickname,0,false,false);

	var rowObj = document.createElement("div");
	rowObj.title = nickname.replace(/\'/g,"\\'");
	rowObj.innerHTML = html;
	rowObj.className = "MinionUserList";
	rowObj.style.backgroundImage = "url(/images/status/"+status+".gif)";
	rowObj.onclick = MinionUserMenu;

	if (MinionUserListBody.getElementsByTagName("div").length == idx) {
		MinionUserListBody.appendChild(rowObj);
	} else {
		MinionUserListBody.insertBefore(rowObj,MinionUserListBody.getElementsByTagName("div")[idx]);
	}

	Ext.getCmp("Minion").setTitle("<span style='cursor:pointer;' onclick='window.open(\"http://www.minion.kr\");'>"+Lang.MinionName+"</span> ("+MinionUserStore.getCount().toString()+Lang.UserCountText+")");
}

function MinionUserQuit(nickname) {
	var idx = MinionUserStore.find("nickname",nickname,0,false,false);
	if (idx >= 0) {
		MinionUserStore.removeAt(idx);
		if (MinionViewUserMessage == true && nickname.match(/^Guest[0-9]{3}$/i) == null) MinionSystemMessage(Lang.UserOut.replace('{nickname}','<b>'+nickname+'</b>'));
		if (Ext.getCmp("MinionExtUserList").hidden == true) return;

		MinionUserListBody.removeChild(MinionUserListBody.getElementsByTagName("div")[idx]);
		Ext.getCmp("Minion").setTitle("<span style='cursor:pointer;' onclick='window.open(\"http://www.minion.kr\");'>"+Lang.MinionName+"</span> ("+MinionUserStore.getCount().toString()+Lang.UserCountText+")");
	}
}

function MinionUserMyNickname(nickname) {
	if (window.loginWidow) {
		window.loginWidow.CloseWindow();
	}
	Ext.getCmp("MinionExtMyButton").setText(nickname);
}

function MinionUserNickname(nickname,newnick,html) {
	var idx = MinionUserStore.find("nickname",nickname,0,false,false);
	if (idx >= 0) {
		MinionUserStore.getAt(idx).set("nickname",newnick);
		MinionUserStore.getAt(idx).set("html",html);

		MinionSystemMessage(Lang.UserNickChange.replace('{nickname}','<b>'+nickname+'</b>').replace('{newnick}','<b>'+newnick+'</b>'));
		if (Ext.getCmp("MinionExtUserList").hidden == true) return;

		var rowObj = MinionUserListBody.getElementsByTagName("div")[idx];
		rowObj.innerHTML = html;
		rowObj.title = newnick.replace(/\'/g,"\\'");

		MinionUserListBody.removeChild(MinionUserListBody.getElementsByTagName("div")[idx]);
		MinionUserStore.sort("nickname","ASC");

		var idx = MinionUserStore.find("nickname",newnick,0,false,false);

		if (MinionUserListBody.getElementsByTagName("div").length == idx) {
			MinionUserListBody.appendChild(rowObj);
		} else {
			MinionUserListBody.insertBefore(rowObj,MinionUserListBody.getElementsByTagName("div")[idx]);
		}
	}
}

function MinionUserStatus(nickname,status) {
	var idx = MinionUserStore.find("nickname",nickname,0,false,false);
	if (idx >= 0) {
		MinionUserStore.getAt(idx).set("status",status);
		MinionUserListBody.getElementsByTagName("div")[idx].style.backgroundImage = "url(/images/status/"+status+".gif)";
		MinionSystemMessage(Lang.UserStatus.replace('{nickname}','<b>'+nickname+'</b>').replace('{status}','<b>'+eval("Lang.Status."+status)+'</b>'));
	}
}

function MinionUserMenuList(nickname,e) {
	var info = document.getElementById(MinionID).info();
	var menu = new Ext.menu.Menu();

	var idx = MinionUserStore.find("nickname",nickname,0,false,false);

	if (idx == -1) {
		menu.add({
			text:"<b>"+nickname+"</b>",
			icon:(Ext.isIE6 ? "" : "/images/status/offline.gif")
		});
	} else {
		menu.add({
			text:"<b>"+nickname+"</b>",
			icon:(Ext.isIE6 ? "" : "/images/status/"+MinionUserStore.getAt(idx).get("status")+".gif")
		});
		menu.add(new Ext.menu.Separator({}));
		menu.add({
			text:Lang.InvitePrivChannel,
			icon:(Ext.isIE6 ? "" : "/images/icon/icon_application_key.png"),
			handler:function(item) {
				var timer = new Date().getTime();
				MinionRoomPopup('invite',timer,nickname);
			}
		});
		menu.add({
			text:Lang.BanTalk,
			icon:(Ext.isIE6 ? "" : "/images/icon/icon_lock.png"),
			handler:function(item) {
				if (confirm(Lang.BanTalkConfirm) == true) {
					var list = document.getElementById(MinionID).setup("get","kickuser").split(":#:");
					if (list.length <= 30) {
						for (var i=0,loop=list.length;i<loop;i++) {
							var temp = list[i].split("!");
							temp.pop();
							var thisnick = temp.join("!");
							if (nickname == thisnick) {
								alert(Lang.BanTalkError);
								return false;
							}
						}
						list.push(nickname+"!"+Math.ceil(new Date().getTime()/1000));
						document.getElementById(MinionID).setup("save","kickuser",list.join(":#:"));
						MinionSystemMessage(Lang.BanTalkOK.replace('{nickname}','<b>'+nickname+'</b>'));
					} else {
						alert(Lang.BanTalkLimit);
					}
				}
			}
		});
		menu.add({
			text:Lang.Call,
			icon:(Ext.isIE6 ? "" : "/images/icon/icon_bell.png"),
			handler:function(item) {
				document.getElementById(MinionID).send("CALL "+nickname);
				MinionSystemMessage(Lang.CallOK.replace('{nickname}','<b>'+nickname+'</b>'));
			}
		});
		menu.add({
			text:Lang.Whisper,
			icon:(Ext.isIE6 ? "" : "/images/icon/icon_comments.png"),
			handler:function(item) {
				Ext.getCmp("MinionInputMessage").focus(false);
				Ext.getCmp("MinionInputMessage").setValue("/w "+nickname+" ");
			}
		});
		if (info[3] == true) {
			menu.add(new Ext.menu.Separator({}));
			menu.add({
				text:Lang.AdminBanTalk,
				icon:(Ext.isIE6 ? "" : "/images/icon/icon_comment_delete.png"),
				handler:function(item) {
					if (confirm(Lang.AdminBanTalkConfirm) == true) {
						document.getElementById(MinionID).send("STOPMSG "+nickname);
						MinionSystemMessage(Lang.AdminBanTalkOK.replace('{nickname}','<b>'+nickname+'</b>'));
					}
				}
			});
			menu.add({
				text:Lang.ShowIP,
				icon:(Ext.isIE6 ? "" : "/images/icon/icon_application_key.png"),
				handler:function(item) {
					document.getElementById(MinionID).send("SHOWIP "+nickname);
				}
			});
			menu.add({
				text:Lang.BanIP,
				icon:(Ext.isIE6 ? "" : "/images/icon/icon_kick.png"),
				handler:function(item) {
					document.getElementById(MinionID).send("IPBAN "+nickname);
				}
			});
		}
	}
	menu.showAt(new Array(e.clientX,e.clientY));
}

function MinionUserMenu(event) {
	var e = event ? event : window.event;
	var object = e.target ? e.target : e.srcElement;
	var nickname = object.getAttribute("title");

	MinionUserMenuList(nickname,e);
}

function MinionSelectEmoticon(eno) {
	Ext.getCmp("MinionInputMessage").focus();
	Ext.getCmp("MinionInputMessage").setValue(Ext.getCmp("MinionInputMessage").getValue()+"[emo:"+eno+"]");
}

function MinionTalkMenu(event) {
	var e = event ? event : window.event;
	var object = e.target ? e.target : e.srcElement;
	var nickname = object.getAttribute("nickname");

	MinionUserMenuList(nickname,e);
}

function MinionWhisperMessage(rowHTML) {
	if (MinionChattingBody == null) {
		MinionChattingBody = document.getElementById("MinionBodyLayer").getElementsByTagName("DIV");
	}

	var object = document.createElement("DIV");
	object.style.color = "#FF00FF";
	object.innerHTML = rowHTML;
	document.getElementById("MinionBodyLayer").appendChild(object);

	if (MinionMySetting["viewrows"] > 0) {
		while (MinionChattingBody.length > parseInt(MinionMySetting["viewrows"])) {
			document.getElementById("MinionBodyLayer").removeChild(MinionChattingBody[0]);
		}
	}

	if (MinionAutoScroll == true) Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollTop = Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollHeight;
}

function MinionWhisperMessageError(type,nickname) {
	if (MinionChattingBody == null) {
		MinionChattingBody = document.getElementById("MinionBodyLayer").getElementsByTagName("DIV");
	}

	var object = document.createElement("DIV");
	object.style.color = "#FF00FF";
	if (type == "KICK") object.innerHTML = Lang.WhisperKick.replace('{nickname}','<b>'+nickname+'</b>');
	else object.innerHTML = Lang.WhisperWait.replace('{nickname}','<b>'+nickname+'</b>');
	document.getElementById("MinionBodyLayer").appendChild(object);

	if (MinionMySetting["viewrows"] > 0) {
		while (MinionChattingBody.length > parseInt(MinionMySetting["viewrows"])) {
			document.getElementById("MinionBodyLayer").removeChild(MinionChattingBody[0]);
		}
	}

	if (MinionAutoScroll == true) Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollTop = Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollHeight;
}

function MinionExtLastTalk(time) {
	if (Ext.getCmp("MinionExtLastTalk").hidden == false) {
		Ext.getCmp("MinionExtLastTalk").setText(Lang.LastTalk+" "+new Date(time).format("Y.m.d H:i:s"));
	}
}

function MinionMessage(rowHTML,isMyMsg) {
	if (MinionChattingBody == null) {
		MinionChattingBody = document.getElementById("MinionBodyLayer").getElementsByTagName("DIV");
	}

	var object = document.createElement("DIV");
	object.innerHTML = rowHTML;

	if (isMyMsg == true) {
		if (MinionMySetting["mymsg"] == "1") object.style.backgroundColor = "#EEEEEE";
		document.getElementById("MinionBodyLayer").appendChild(object);
	} else {
		document.getElementById("MinionBodyLayer").appendChild(object);
		if (MinionMySetting["viewrows"] > 0) {
			while (MinionChattingBody.length > MinionMySetting["viewrows"]) {
				document.getElementById("MinionBodyLayer").removeChild(MinionChattingBody[0]);
			}
		}
	}

	if (MinionAutoScroll == true) Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollTop = Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollHeight;
}

function MinionSystemMessage(msg) {
	if (MinionChattingBody == null) {
		MinionChattingBody = document.getElementById("MinionBodyLayer").getElementsByTagName("DIV");
	}

	var object = document.createElement("DIV");
	object.style.color = "green";
	object.innerHTML = msg;
	document.getElementById("MinionBodyLayer").appendChild(object);

	if (MinionMySetting["viewrows"] > 0) {
		while (MinionChattingBody.length > parseInt(MinionMySetting["viewrows"])) {
			document.getElementById("MinionBodyLayer").removeChild(MinionChattingBody[0]);
		}
	}

	if (MinionAutoScroll == true) Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollTop = Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollHeight;
}

function MinionInvite(from,room) {
	for (roomno in MinionInviteList) {
		if (roomno == room) delete MinionInviteList[roomno];
		if (from == MinionInviteList[roomno]) delete MinionInviteList[roomno];
	}

	MinionInviteList[room] = from;
	MinionMessageLayerPrint();
	MinionSystemMessage(Lang.InviteMessage.replace('{nickname}','<b>'+from+'</b>'));
}

function MinionIpBan(nickname,ip) {
	MinionSystemMessage(Lang.BanMessage.replace('{nickname}','<b>'+nickname+'('+ip+')</b>'));
}

function MinionShowIp(nickname,ip) {
	MinionSystemMessage(Lang.ShowIPMessage.replace('{nickname}','<b>'+nickname+'</b>').replace('{ip}','<b>'+ip+'</b>'));
}

function MinionMessageLayerPrint() {
	var sHTML = "";
	var printNum = 0;

	for (room in MinionInviteList) {
		if (MinionUserStore.find("nickname",MinionInviteList[room],0,false,false) >= 0) {
			printNum++;
			sHTML+= '<div style="cursor:pointer; padding:3px;" onclick="MinionMessageLayerMenu(event,\''+room+'\');">'+Lang.InviteMessage.replace('{nickname}','<b>'+MinionInviteList[room]+'</b>')+'</div>';
		}
	}

	document.getElementById("MinionMessageLayer").innerHTML = sHTML;

	if (printNum > 0) document.getElementById("MinionMessageLayer").style.display = "";
	else document.getElementById("MinionMessageLayer").style.display = "none";
}

function MinionMessageLayerMenu(e,room) {
	var menu = new Ext.menu.Menu();
	menu.add({
		text:Lang.Accept,
		icon:(Ext.isIE6 ? "" : "/images/icon/icon_accept.png"),
		handler:function(item) {
			var timer = room;
			MinionRoomPopup('join',room);
			delete MinionInviteList[room];
			MinionMessageLayerPrint();
		}
	});
	menu.add({
		text:Lang.Reject,
		icon:(Ext.isIE6 ? "" : "/images/icon/icon_cancel.png"),
		handler:function(item) {
			document.getElementById(MinionID).send("INVITEKICK "+MinionInviteList[room]+"!"+room);
			delete MinionInviteList[room];
			MinionMessageLayerPrint();
		}
	});
	menu.showAt(new Array(e.clientX,e.clientY));
}

function MinionCall(nickname) {
	MinionSystemMessage(Lang.CallMessage.replace('{nickname}','<b>'+nickname+'</b>'));
}

function MinionSetting(type,value) {
	var info = document.getElementById(MinionID).info();

	switch (type) {
		case "colorfont" :
			if (value == "ADMIN" || (value == "MEMBER" && info[2] == false)) {
				Ext.getCmp("MinionExtInput").getTopToolbar().hide();
			} else {
				Ext.getCmp("MinionExtInput").getTopToolbar().show();
				Ext.getCmp("MinionExtInput").setHeight(58);
				Ext.getCmp("MinionBtnBold").enable();
				Ext.getCmp("MinionBtnUnderline").enable();
				Ext.getCmp("MinionBtnItalic").enable();
				Ext.getCmp("MinionBtnColor").enable();
				Ext.getCmp("MinionBtnBgColor").enable();
			}

			if (info[3] == true) {
				Ext.getCmp("MinionExtInput").getTopToolbar().show();
				Ext.getCmp("MinionExtInput").setHeight(58);
				Ext.getCmp("MinionBtnBold").enable();
				Ext.getCmp("MinionBtnUnderline").enable();
				Ext.getCmp("MinionBtnItalic").enable();
				Ext.getCmp("MinionBtnColor").enable();
				Ext.getCmp("MinionBtnBgColor").enable();
			}

			Ext.getCmp("MinionComponent").doLayout();
		break;

		case "fontsetting" :
			var data = value.split(",");

			if (data[0] == "1") {
				Ext.getCmp("MinionInputMessage").getEl().dom.style.fontWeight = "bold";
				Ext.getCmp("MinionBtnBold").toggle(true);
			}
			if (data[1] == "1") {
				Ext.getCmp("MinionInputMessage").getEl().dom.style.textDecoration = "underline";
				Ext.getCmp("MinionBtnUnderline").toggle(true);
			}
			if (data[2] == "1") {
				Ext.getCmp("MinionInputMessage").getEl().dom.style.fontStyle = "italic";
				Ext.getCmp("MinionBtnItalic").toggle(true);
			}

			if (data[3] != "") {
				Ext.getCmp("MinionInputMessage").getEl().dom.style.color = "#"+data[3];
				Ext.getCmp("MinionInputColor").setValue("#"+data[3]);
			}
			if (data[4] != "") {
				Ext.getCmp("MinionInputMessage").getEl().dom.style.background = "#"+data[4];
				Ext.getCmp("MinionInputBgColor").setValue("#"+data[4]);
			}
		break;

		case "talk" :
			MinionTalk = value == "FALSE" ? false : true;
			if (value == "FALSE") Ext.getCmp("MinionInputMessage").disable();
		break;
	}
}

function MinionDisconnect() {
	MinionUserStore.removeAll();
	Ext.getCmp("MinionExtUserList").getLayoutTarget().dom.innerHTML = "";
	Ext.getCmp("Minion").setTitle("<span style='cursor:pointer;' onclick='window.open(\"http://www.minion.kr\");'>"+Lang.MinionName+"</span> (0명)");
	Ext.getCmp("MinionInputMessage").disable();
	Ext.getCmp("MinionExtMyButton").disable();
}

function MinionError(code,value) {
	switch (code) {
		case 101 :
			MinionSystemMessage(Lang.Error.ConnectFail);
			MinionDisconnect();
		break;

		case 102 :
			MinionSystemMessage(Lang.Error.ServerFail);
			MinionDisconnect();
		break;

		case 103 :
			MinionSystemMessage(Lang.Error.Disconnect);
			MinionDisconnect();
		break;

		case 202 :
			MinionSystemMessage(Lang.Error.OtherWindow);
		break;

		case 203 :
			if (window.loginWidow) {
				window.loginWidow.OpenMessage(Lang.Error.NickFail);
			} else {
				MinionSystemMessage(Lang.Error.NickFail);
			}
		break;

		case 204 :
			MinionSystemMessage(Lang.Error.NotFoundUser);
		break;

		case 205 :
			MinionSystemMessage(Lang.Error.RegBanIp);
		break;

		case 210 :
			MinionSystemMessage(Lang.Error.RepeatTalk.replace('{limit}','<b>'+value+'</b>'));
		break;

		case 211 :
			MinionSystemMessage(Lang.Error.BanTalk.replace('{second}','<b>'+value+'</b>'));
		break;

		case 212 :
			MinionSystemMessage(Lang.Error.WrongCommand);
		break;

		case 213 :
			MinionSystemMessage(Lang.Error.LongMessage);
		break;

		case 214 :
			MinionSystemMessage(Lang.Error.CallUser.replace('{nickname}','<b>'+value+'</b>'));
		break;

		case 215 :
			MinionSystemMessage(Lang.Error.Quiet.replace('{nickname}','<b>'+value+'</b>'));
		break;

		case 216 :
			MinionSystemMessage(Lang.Error.AlreadyKick);
		break;

		case 217 :
			MinionSystemMessage(Lang.Error.Kick.replace('{nickname}','<b>'+value+'</b>'));
		break;

		case 218 :
			MinionSystemMessage(Lang.Error.KickLimit);
		break;

		case 219 :
			MinionSystemMessage(Lang.Error.QuietUser.replace('{nickname}','<b>'+value+'</b>'));
		break;

		case 220 :
			MinionSystemMessage(Lang.Error.PrivChanRefuse.replace('{nickname}','<b>'+value+'</b>'));
		break;

		case 301 :
			MinionSystemMessage(Lang.Error.Banner);
		break;

		case 403 :
			MinionSystemMessage(Lang.Error.BanConnect);

			if (value == "TIMEOUT") MinionSystemMessage(Lang.Error.Timeout);
			if (value == "SECURITY") MinionSystemMessage(Lang.Error.Security);
			if (value == "IPBAN") MinionSystemMessage(Lang.Error.BanIp);
		break;

		case 500 :
			if (window.loginWidow) {
				window.loginWidow.CloseWindow();
			}

			MinionSystemMessage(Lang.Error.Login);
		break;

		case 505 :
			MinionSystemMessage(Lang.Error.NotAdmin);
		break;

		case 504 :
			if (value == "LOGINFAIL") {
					if (window.loginWidow) {
					window.loginWidow.OpenMessage(Lang.Error.NotFoundId);
				} else {
					MinionSystemMessage(Lang.Error.NotFoundId);
				}
			} else if (value == "NOTUSER") {
					if (window.loginWidow) {
					window.loginWidow.OpenMessage(Lang.Error.NotRegId);
				} else {
					MinionSystemMessage(Lang.Error.NotRegId);
				}
			}
		break;

		case 600 :
			MinionSystemMessage(Lang.Error.NotPrivChannel);
		break;

		case 991 :
			MinionSystemMessage(Lang.Error.Reconnect.replace('{second}','<b>'+value+'</b>'));
		break;

		case 992 :
			MinionSystemMessage(Lang.Error.TryConnect);
			MinionMySetting["viewnickcon"] = document.getElementById(MinionID).setup("get","viewnickcon");
			MinionMySetting["viewrows"] = parseInt(document.getElementById(MinionID).setup("get","viewrows"));
			MinionMySetting["fontset"] = document.getElementById(MinionID).setup("get","fontset");
			MinionMySetting["myfont"] = document.getElementById(MinionID).setup("get","myfont");
			MinionMySetting["mymsg"] = document.getElementById(MinionID).setup("get","mymsg");
		break;

		case 998 :
			MinionSystemMessage(Lang.Error.DoubleConnect);
		break;

		case 999 :
			MinionSystemMessage(Lang.Error.ConnectOk);
			if (MinionTalk == true) Ext.getCmp("MinionInputMessage").enable();
			var info = document.getElementById(MinionID).info();
			document.forms["popup"].nickname.value = info[0];
			document.forms["popup"].nickcon.value = info[1];
			Ext.getCmp("MinionExtMyButton").setText(info[0]);
			Ext.getCmp("MinionExtMyButton").setIconClass("MinionStatus-"+info[4]);
			Ext.getCmp("MinionExtMyButton").enable();
		break;
	}
}

function MinionShowProtocol(from,msg) {
	var a = document.createElement("div");
	a.innerHTML = msg;
//	parent.parent.document.getElementById("protocol").appendChild(a);
}

function PrintHelp() {
	var info = document.getElementById(MinionID).info();
	MinionSystemMessage("<b>"+Lang.Command+"</b>");
	MinionSystemMessage(Lang.Helper.Help);
	MinionSystemMessage(Lang.Helper.Whisper);
	MinionSystemMessage(Lang.Helper.Call);
	MinionSystemMessage(Lang.Helper.Myroom);
	MinionSystemMessage(Lang.Helper.Ban);
	if (info[3] == true) {
		MinionSystemMessage(Lang.Helper.Ip);
		MinionSystemMessage(Lang.Helper.Ipban);
		MinionSystemMessage(Lang.Helper.Quiet);
	}
	MinionSystemMessage("<b>"+Lang.Help+"</b>");
	MinionSystemMessage(Lang.Helper.AutoMsg);
}

document.onunload = function() { try { document.getElementById(MinionID).close() } catch(e) {} }
//document.onclick = function() { if (MinionUseAutoFocus == true && Ext.getCmp("MinionInputMessage")) Ext.getCmp("MinionInputMessage").focus(false); }
document.oncontextmenu = function(event) {
	var e = event ? event : window.event;
	var object = e.target ? e.target : e.srcElement;

	var info = document.getElementById(MinionID).info();
	var menu = new Ext.menu.Menu();
	menu.add({
		text:"<b>"+Lang.MinionName+"</b> 3.0",
		icon:(Ext.isIE6 ? "" : "/images/icon/icon_minion.png"),
		handler:function(item) {
			window.open("http://www.minion.kr");
		}
	});
	menu.add(new Ext.menu.Separator({}));
	menu.add({
		text:Lang.WindowEmpty,
		icon:(Ext.isIE6 ? "" : "/images/icon/icon_page_white.png"),
		handler:function(item) {
			document.getElementById("MinionBodyLayer").innerHTML = "";
		}
	});
	if (MinionAutoScroll == true) {
		menu.add({
			text:Lang.ScrollLock,
			icon:(Ext.isIE6 ? "" : "/images/icon/icon_anchor.png"),
			handler:function(item) {
				if (confirm(Lang.ScrollLockText) == true) {
					MinionAutoScroll = false;
				}
			}
		});
	} else {
		menu.add({
			text:Lang.ScrollUnLock,
			icon:(Ext.isIE6 ? "" : "/images/icon/icon_page_white_put.png"),
			handler:function(item) {
				if (confirm(Lang.ScrollUnLockText) == true) {
					MinionAutoScroll = true;
					Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollTop = Ext.getCmp("MinionExtBody").getLayoutTarget().dom.scrollHeight;
				}
			}
		});
	}
	menu.add({
		text:Lang.Setup,
		icon:(Ext.isIE6 ? "" : "/images/icon/icon_cog.png"),
		handler:function(item) {
			var width = 500;
			var height = 400;
			var windowLeft = (screen.width-width)/2;
			var windowTop = (screen.height-height)/2;
			windowTop = windowTop>20 ? windowTop-20 : windowTop;

			window.loginWidow = window.open("/minion/opensetup.php","setup","top="+windowTop+",left="+windowLeft+",width="+width+",height="+height+",scrollbars=0,resize=0");

			if (window.loginWidow) {
				window.loginWidow.focus();
			} else {
				alert(Lang.PopupError);
			}
		}
	});
	menu.add({
		text:Lang.Help,
		icon:(Ext.isIE6 ? "" : "/images/icon/icon_help.png"),
		handler:function(item) {
			PrintHelp();
		}
	});
	if (info[3] == true) {
		menu.add(new Ext.menu.Separator({}));
			menu.add({
			text:Lang.DeleteLog,
			icon:(Ext.isIE6 ? "" : "/images/icon/icon_page_delete.png"),
			handler:function(item) {
				document.getElementById(MinionID).send("CLEAR");
				MinionSystemMessage(Lang.DeleteLogText);
			}
		});
	}
//	menu.showAt(new Array(e.clientX,e.clientY));

//	return false;
}