﻿/*
	abstract : ActiveX를 동적으로 로드하고 자동으로 실행한다. 
	Parameters : 
		startGameID - 현재 함수를 호출한 게임 페이지의 게임 아이디 min length:4 이상
		sessKey - 사용자의 세션키 값 min length:16 이상 max length:32
		userNick - 사용자의 통합별명 min length:2 이상
		autoStart - ActiveX 로드 시 자동 실행 기능 ("true":실행, null 또는 다른 값은 무시)
	Return :
		0 : 정상 실행
		1 : 실행 실패
		2 : 잘못된 startGameID 
		3 : 잘못된 sessKey
		4 : ActiveX가 없습니다. 
		5 : ActiveX 버전이 다릅니다.

		Caustion : 호출하는 HTML에 <div id="_id_hiddenLauncher"></div> tag 반드시 있어야 한다.
*/

var SUCCESS_RUN = 0;
var FAIL_RUN = 1;
var WRONG_STARTGAMEID = 2;
var WRONG_SESSKEY = 3;
var NOT_EXIST_ACTIVEX = 4;
var WRONG_VERSION = 5;

var PLAYNC_ID = 0;
var YAHOO_ID = 1;
var DAUM_ID = 5;


var param_startGameID = "";
var param_gameID = "";
var param_sessKey = "";
var param_userNick = "";
var param_companyID = "";
var param_user = "";

var LoaderInfoStruct = {
	name:"NCLoader.NCLoaderCtl",
	version:"1,0,0,8",
	codeBase:"https://wstatic.plaync.co.kr/common/UniUpdate/NCLoader.8.cab#version=",
	addr:"F127ES4SKn45GFFqaoJC8MYcplQcnDXoP7b8L/vQOfQrOnkIIvTTs8GQ9CzD0Dh0tvkfPcMODuCFOp0WgHdUdw==",
	folder:"F0C35+cB2n+CQIoRI0cr5FFtkKcLHDREz0ZW2tcYacjNHOL8RV7Qi/XsDDWRCIMILbAZWIjZmJf8A+WuKTQqsA=="
};

var LauncherInfoStruct = {
	name:"XtcOlJ/V0SEEXj/v2jFdOUCa0kIFAvyZZ+OTjuVeU8BpNMb5UpCyjzStxRmrjeaHWuPbzN15x7DHnwus9PVM6w==",
	file:"j3aEIV/j1qh2K73MFFD0uD3WAu+LFNveOpVAEpVvkeZbRB/f4mahtGipqM/SfQnVlfaZUrNc4do9+Pp+c/IBaQ==",
	LUpdateAddr:"Tq7V80OmO8P5juke0Ccag9HXJmzl1GD0M+cg9MtGJondLtXaSSTmzu5N5CA6HnokgLUH7chPa3HdEVB3MtrCdg==",
	FileUpdateAddr:"F127ES4SKn45GFFqaoJC8MYcplQcnDXoP7b8L/vQOfQrOnkIIvTTs8GQ9CzD0Dh0tvkfPcMODuCFOp0WgHdUdw==",
	size:1320160,
	crc:2553633520
};

var KeyGenInfoStruct = {
	name:"ugt9amy/ntQ2zknX9aohJjIt2VJU2srwhWUO1okSRy/ytlMG6mZtrUVD0MTftR1EXrWoDtVzX6bqLkd3jnmilw==",
	file:"WbXUM4q3L/uWrukqsliVSL6S1DjeEK2Z9jxvw2A+qgPOmdlXCHhEtxbKFblRiMwlZ8Jtx+1bVIoqe1ILKnA4Uw==",
	size:603360,
	crc:4190983852
};

function GetServiceFolder(companyID)
{
	var ret = 'PlayNC';
	if (companyID == YAHOO_ID)
	{
		ret = 'Yahoo!';
	}
	if (companyID == DAUM_ID)
	{
		ret = 'Daum';
	}
	return ret;
}

function GetSetupMng(companyID)
{
	var ret = 'NCSetupMng';
	if (companyID == YAHOO_ID)
	{
		ret = 'SetupMng';
	}
	if (companyID == DAUM_ID)
	{
		ret = 'DaumSetupMng';
	}
	return ret;
}

function GetLauncher(companyID)
{
	var ret = 'PlayNCLauncher';
	if (companyID == YAHOO_ID)
	{
		ret = 'GameLauncher';
	}
	if (companyID == DAUM_ID)
	{
		ret = 'DaumGameLauncher';
	}
	return ret;
}

function GetSingleLauncher(companyID)
{
	var ret = 'playncSingleLauncher';
	if (companyID == YAHOO_ID)
	{
		ret = 'GameSingleLauncher';
	}
	if (companyID == DAUM_ID)
	{
		ret = 'playncSingleLauncher';
	}
	return ret;
}


var FontInfoStruct = {
	name:"굴림",
	size:12,
	charset:129,
	textColor:0x32322A,
	backColor:0xFAFAD2,
	borderColor:0x000000,
	offsetX:10,
	offsetY:10
};

var WaitMessage = "서버에 접속 중입니다. 잠시 기다려 주십시오.";

function ErrorMessage(error)
{
	switch(error)
	{
		case 8:		// NCLOADER_ERROR_CANNOT_DOWNLOAD_CAB
			{
				alert("실행에 필요한 파일을 다운로드받지 못했습니다.");
				break;
			}
		case 9:		// NCLOADER_ERROR_CANNOT_WRITE_CAB
			{
				alert("실행에 필요한 파일을 저장하지 못했습니다.");
				break;
			}
		case 10:	// NCLOADER_ERROR_CANNOT_EXTRACT_CAB
			{
				alert("실행에 필요한 파일을 설치하지 못했습니다. 웹브라우저를 모두 닫은 후 다시 시도해 주십시오.");
				break;
			}
		case 11:	// NCLOADER_ERROR_CANNOT_CREATE_TEMP_DIRECTORY
			{
				alert("임시폴더 작성에 실패했습니다.");
				break;
			}
		case 12:	// NCLOADER_ERROR_CANNOT_COPY_DLL
			{
				alert("실행에 필요한 파일을 복사하는데 실패했습니다. 웹브라우저를 모두 닫은 후 다시 시도해 주십시오.");
				break;
			}
		case 13:	// NCLOADER_ERROR_CANNOT_RENAME_DLL
			{
				alert("실행에 필요한 파일을 복사하는데 실패했습니다. 웹브라우저를 모두 닫은 후 다시 시도해 주십시오.");
				break;
			}
		case 14:	// NCLOADER_ERROR_CANNOT_DELETE_DLL
			{
				alert("이전 버전의 파일을 삭제할 수 없습니다. 웹브라우저를 모두 닫은 후 다시 시도해 주십시오.");
				break;
			}
		case 15:	// NCLOADER_ERROR_INVALID_DLL
			{
				alert("NCLoader 파일 오류");
				break;
			}
		case 16:	// NCLOADER_ERROR_CANNOT_LOAD_DLL
			{
				alert("실행에 필요한 모듈을 읽어들이지 못했습니다.");
				break;
			}
		default:
			{
				alert("NCLoader 설정 오류 : " + error);
				break;
			}
	}
}

function ResultMessage(result)
{
	switch(result)
	{
		case "1":	// LAUNCH_ERROR_INVALID_PARAM
			{
				alert("스크립트 오류입니다.");
				break;
			}
		case "2":	// LAUNCH_ERROR_GGI_GET_FAILED
			{
				alert("업데이트 서버 접속에 실패했습니다.");
				break;
			}
		case "3":	// LAUNCH_ERROR_INVALID_GGI
			{
				alert("업데이트 정보 오류입니다.");
				break;
			}
		case "4":	// LAUNCH_ERROR_GGI_RESULT_ZERO
			{
				alert("등록되어있지 않은 게임입니다.");
				break;
			}
		case "5":	// LAUNCH_ERROR_INVALID_SETUPMNG_INFO
			{
				alert("설치 관리자 정보 오류입니다.");
				break;
			}
		case "6":	// LAUNCH_ERROR_GGI_PARSE_FAILED
			{
				alert("업데이트 정보가 부족합니다.");
				break;
			}
		case "7":	// LAUNCH_ERROR_DOWNLOAD_FAILED
			{
				alert("업데이터를 다운받지 못했습니다.");
				break;
			}
		case "8":	// LAUNCH_ERROR_CANNOT_EXTRACT_CAB
			{
				alert("업데이터를 설치하지 못했습니다.");
				break;
			}
		case "9":	// LAUNCH_ERROR_INVALID_CAB_SIZE
			{
				alert("업데이터 파일이 손상되어있습니다.");
				break;
			}
		case "10":	// LAUNCH_ERROR_CANNOT_EXECUTE
			{
				alert("업데이터 실행 오류입니다.");
				break;
			}
		default:
			{
				alert("NCWebLauncher 오류 : " + result);
				break;
			}
	}
}

function Get_Cookie(strName)
{
	var strCookieName = strName + "=";
	var objCookie = document.cookie;

	if (objCookie.length > 0)
	{
		var nBegin = objCookie.indexOf(strCookieName);
		if (nBegin < 0)
		{
			return null;
		}

		nBegin += strCookieName.length;
		var nEnd = objCookie.indexOf(";", nBegin);
		if (nEnd == -1)
		{
			nEnd = objCookie.length;
		}
	}

	return unescape(objCookie.substring(nBegin, nEnd));
}

function IsInstalledActiveX()
{
	var result = FAIL_RUN;
	try
	{
		result = NOT_EXIST_ACTIVEX;

		var axObj = new ActiveXObject(LoaderInfoStruct.name);
		if (axObj == null)
		{
			return result;
		}

		var ctl = document.getElementById("NCLoaderCtl");
		if(ctl == null)
		{
			return result;
		}
		
		if (typeof(ctl.GetHandle) == "undefined")
		{
			return WRONG_VERSION;
		}
		else
		{
			return SUCCESS_RUN;
		}
	}
	catch(e)
	{
		return result;
	}

	return result;
}

function CheckParameter(startGameID, sessKey)
{
	if (startGameID == null || startGameID.length < 4)
	{
		return WRONG_STARTGAMEID;
	}
	if (sessKey == null || sessKey.length < 16)
	{
		return WRONG_SESSKEY;
	}
	return SUCCESS_RUN;
}

function LoadActiveX()
{
	var launcherHTML = '\
	<object ID="NCLoaderCtl" CLASSID="CLSID:60F33B36-3E89-48EF-BE77-ACC23A366C2A"\n\
			codebase="' + LoaderInfoStruct.codeBase + LoaderInfoStruct.version + '" style="visibility: hidden">\n\
	</object>';

	var hiddenLauncher = document.getElementById('_id_hiddenLauncher')
	if (hiddenLauncher) 
	{
		document.getElementById('_id_hiddenLauncher').innerHTML = '';
		hiddenLauncher.innerHTML = launcherHTML;
	}
	else
	{
		return FAIL_RUN;
	}
	return SUCCESS_RUN;
}

function InitActiveX()
{
	try
	{
		var ctl = document.getElementById("NCLoaderCtl");
		if(ctl == null)
		{
			return NOT_EXIST_ACTIVEX;
		}

		var error;
		ctl.SetDefaultDllInfo(LoaderInfoStruct.addr, LoaderInfoStruct.folder);
		error = ctl.CheckError();
		if (error != 0)
		{
			ErrorMessage(error);
			return FAIL_RUN;
		}

		ctl.SetDllInfo(KeyGenInfoStruct.name, KeyGenInfoStruct.file, KeyGenInfoStruct.size, KeyGenInfoStruct.crc);
		error = ctl.CheckError();
		if (error != 0)
		{
			ErrorMessage(error);
			return FAIL_RUN;
		}

		ctl.LoadDll(KeyGenInfoStruct.name);
		error = ctl.CheckError();
		if (error != 0)
		{
			ErrorMessage(error);
			return FAIL_RUN;
		}
	}
	catch(e)
	{
		return NOT_EXIST_ACTIVEX;
	}

	return SUCCESS_RUN;
}

function SetMultiModeParam(startGameID, sessKey, userNick, companyID)
{
	param_startGameID = startGameID;
	param_gameID = GetLauncher(companyID);
	if (sessKey == "" || sessKey == null)
	{
		param_sessKey = "0";
	}
	else
	{
		param_sessKey = sessKey;
	}
	param_userNick = userNick;
	param_companyID = companyID;
}

function SetSingleModeParam(startGameID, sessKey, userNick, companyID)
{
	param_startGameID = startGameID;
	param_gameID = GetSingleLauncher(companyID);
	if (sessKey == "" || sessKey == null)
	{
		param_sessKey = "0";
	}
	else
	{
		param_sessKey = sessKey;
	}
	param_userNick = userNick;
	param_companyID = companyID;
}

function SetUserParam(userParam)
{
	param_user = userParam;
}

/* 호환성을 위해서 남겨놓은 함수 */
function LoadActiveXInMultiMode(startGameID, sessKey, userNick, companyID)
{
	if (SUCCESS_RUN != LoadActiveX())
		return FAIL_RUN;

	SetMultiModeParam(startGameID, sessKey, userNick, companyID);

	return SUCCESS_RUN;
}

/* 호환성을 위해서 남겨놓은 함수 */
function LoadActiveXInSingleMode(startGameID, sessKey, userNick, companyID)
{
	if (SUCCESS_RUN != LoadActiveX())
		return FAIL_RUN;

	SetSingleModeParam(startGameID, sessKey, userNick, companyID);

	return SUCCESS_RUN;
}

/* 호환성을 위해서 남겨놓은 함수 */
function SetParam(Params)
{
	SetUserParam(Params);

	return SUCCESS_RUN;
}

function StartLauncher()
{
	InitActiveX();
	try
	{
		var ctl = document.getElementById("NCLoaderCtl");
		if(ctl == null)
		{
			return NOT_EXIST_ACTIVEX;
		}

		var error;
		var result;

		ctl.SetDllInfo(LauncherInfoStruct.name, LauncherInfoStruct.file, LauncherInfoStruct.size, LauncherInfoStruct.crc);
		error = ctl.CheckError();
		if (error != 0)
		{
			ErrorMessage(error);
			return FAIL_RUN;
		}

		ctl.SetWaitMessageInfo(FontInfoStruct.name, FontInfoStruct.size, FontInfoStruct.charset, FontInfoStruct.textColor, FontInfoStruct.backColor, FontInfoStruct.borderColor, FontInfoStruct.offsetX, FontInfoStruct.offsetY);
		ctl.ShowWaitMessage(WaitMessage);

		ctl.LoadDll(LauncherInfoStruct.name);
		error = ctl.CheckError();
		if (error != 0)
		{
			ctl.HideWaitMessage();
			ErrorMessage(error);
			return FAIL_RUN;
		}

		// set param
		var param = param_user;
		param += " /GameID:\"" + param_gameID + "\"";
		param += " /StartGameID:\"" + param_startGameID + "\"";
		param += " /CompanyID:\"" + param_companyID + "\"";
		param += " /SessKey:\"" + param_sessKey + "\"";
		param += " /UserNick:\"" + param_userNick + "\"";
		param += " /LUpdateAddr:\"" + LauncherInfoStruct.LUpdateAddr + "\"";
		param += " /FileUpdateAddr:\"" + LauncherInfoStruct.FileUpdateAddr + "\"";
		param += " /ServiceFolder:\"" + GetServiceFolder(param_companyID) + "\"";
		param += " /SetupMng:\"" + GetSetupMng(param_companyID) + "\"";
		param += " /Handle:\"" + ctl.GetHandle() + "\"";
		param += " /UseJsp:\"0\"";
		param += " /GPVLU:\"" + Get_Cookie("GPVLU") + "\"";
		param += " /GPLLV:\"" + Get_Cookie("GPLLV") + "\"";
		param += " /BannerUrl:\"" + 'http://dbros.gscdn.com/luncher_html/pn_casual.html' + "\"";
		param += " /ReportCrashInfo:\"0\"";

		result = ctl.CallDllFunction(LauncherInfoStruct.name, "SetParam", param);
		error = ctl.CheckError();
		if (error != 0)
		{
			ctl.HideWaitMessage();
			ErrorMessage(error);
			return FAIL_RUN;
		}
		if (result != "0")
		{
			ctl.HideWaitMessage();
			ResultMessage(result);
			return FAIL_RUN;
		}

		result = ctl.CallDllFunction(LauncherInfoStruct.name, "StartGame", "");
		error = ctl.CheckError();
		if (error != 0)
		{
			ctl.HideWaitMessage();
			ErrorMessage(error);
			return FAIL_RUN;
		}
		if (result != "0")
		{
			ctl.HideWaitMessage();
			ResultMessage(result);
			return FAIL_RUN;
		}

		ctl.HideWaitMessage();
	}
	catch(e)
	{
		return NOT_EXIST_ACTIVEX;
	}

	return SUCCESS_RUN;
}

function GetUniqueKey()
{
	InitActiveX();
	try
	{
		var ctl = document.getElementById("NCLoaderCtl");
		if(ctl == null)
		{
			return null;
		}

		var error;
		var result;

		result = ctl.CallDllFunction(KeyGenInfoStruct.name, "GetUniqueKey", "");
		error = ctl.CheckError();
		if (error != 0)
		{
			ErrorMessage(error);
			return null;
		}

		return result;
	}
	catch(e)
	{
		return null
	}

	return null
}

function GetMacAddr()
{
	InitActiveX();
	try
	{
		var ctl = document.getElementById("NCLoaderCtl");
		if(ctl == null)
		{
			return null;
		}

		var error;
		var result;

		result = ctl.CallDllFunction(KeyGenInfoStruct.name, "GetMacAddr", "");
		error = ctl.CheckError();
		if (error != 0)
		{
			ErrorMessage(error);
			return null;
		}

		return result;
	}
	catch(e)
	{
		return null
	}

	return null
}

function GetIEHandle()
{
	InitActiveX();
	try
	{
		var ctl = document.getElementById("NCLoaderCtl");
		if(ctl == null)
		{
			return null;
		}

		return ctl.GetHandle();
	}
	catch(e)
	{
		return null
	}

	return null
}

function CheckInfected()
{
	InitActiveX();
	try
	{
		var ctl = document.getElementById("NCLoaderCtl");
		if(ctl == null)
		{
			return null;
		}

		var error;
		var result;

		result = ctl.CallDllFunction(KeyGenInfoStruct.name, "CheckInfected", "");
		error = ctl.CheckError();
		if (error != 0)
		{
			ErrorMessage(error);
			return null;
		}

		return result;
	}
	catch(e)
	{
		return null
	}

	return null
}
