// ブラウザ判定
var ua = navigator.userAgent.toLowerCase();
var isIE      = (ua.indexOf("msie")    != -1) ? true : false;
var isFF      = (ua.indexOf("firefox") != -1) ? true : false;
var isChrome  = (ua.indexOf("chrome")  != -1) ? true : false;
var isSafari  = (ua.indexOf("safari")  != -1) ? true : false;
var isOpera   = (ua.indexOf("opera")   != -1) ? true : false;

// OS判定
var platform = navigator.platform.toLowerCase();
var isWin    = (platform.indexOf("win") != -1) ? true : false;

var ctrl       = null;
var status     = 0;
var loadingFlg = false;
var loginTimer = null
var loginLocation = "Ahsh2&161&86&21";

var account  = null;
var selfName = null;

// プラグイン設定
var setting = {};
setting["RequireVersion"]    = "1.3.3.0";
setting["LoginMode"]         = "hide";
setting["ShaderLevel"]       = "low";
setting["DrawSea"]           = "false";
setting["DrawTerrain"]       = "false";
setting["DrawSky"]           = "true";
setting["DrawMenu"]          = "false";
setting["WorldTime"]         = "12:00:00";
setting["CameraFOV"]         = "0.7";
setting["CameraMinDistance"] = "1.0";
setting["CameraMaxDistance"] = "4.5";
setting["CameraOffsetY"]     = "1.45";
setting["WorldAmbientColor"] = "1.0,1.0,1.0";
setting["DHTMLRelationEnable"] = "true";
setting["CameraKeyWalkingDistance"] = "3.0";
setting["SetStandUpIcon"]="true";

// レイヤー定義
var layer = new Array(4);
layer[0] = "viewer";
layer[1] = "login";
layer[2] = "busy";
layer[3] = "install";
layer[4] = "info";
layer[5] = "loading";

//メニューレイヤー定義
var menu = new Array(4);
menu[0] = "menu_status_def";
menu[1] = "menu_status_chapel";
menu[2] = "menu_status_garden";
menu[3] = "menu_status_banquet";

// アングルレイヤー定義
var angle = new Array(4);
angle[0] = "def";
angle[1] = "angle_chapel";
angle[2] = "angle_garden";
angle[3] = "angle_banquet";

// キャプションレイヤー定義
var caption = new Array(4);
caption[0] = "guide_def";
caption[1] = "guide_chapel";
caption[2] = "guide_garden";
caption[3] = "guide_banquet";

//音楽再生設定
soundlist = ['rrh_chapel.mp3','rrh_crown.mp3','rrh_kiri.mp3'] ;
path = './mp3/' ; // ファイルのあるディレクトリのパス
var place_no = 1;

// タッチオブジェクト
var UUID = "2ae35dbb-4ce1-4904-8290-d62a9e76d8b5";

// バックグラウンド通信の初期化
var httpRequest = false;

if (window.ActiveXObject) {
	try {
		var httpRequest = new ActiveXObject('Msxml2.XMLHTTP');
	} catch (e) {
		var httpRequest = new ActiveXObject('Microsoft.XMLHTTP');
	}

} else if (window.XMLHttpRequest) {
	var httpRequest = new XMLHttpRequest();
	httpRequest.overrideMimeType('text/plain');
}


/**
 * 初期化
 * 
 * @return void
 */
function init() {

	// ローディング画像のパスを設定する
	var tmp = "";
	var bufPath = location.pathname.split("/");
	for (var i = 0; i < bufPath.length - 1; i++) {
		tmp += "/" + bufPath[i];
	}
	var plusSlash = (tmp == "" || tmp.substr(tmp.length - 1) != "/") ? "/" : "";
	tmp += plusSlash + "image/opv_loading.jpg";
	setting["LoginBackgroundURL"] = "http://" + location.hostname + tmp;

	// 動作環境説明画面を生成する
	information();

	var plugin = opvw.Plugin;

	// イベントリスナーを設定する
	var listener = {

		/* ステータスが更新された時のイベント */
		OnStateChanged : function (state) {

			// ログイン処理が完了したらローディング画面を外す
			if (loadingFlg && state == 5) {
				loadingFlg = false;
				changeLayer(0);
			}

			// ログイン失敗時は混雑レイヤーを表示する
			if (state == 9) changeLayer(2);

			// ステータス更新
			status = state;
		},

		/* チャットメッセージ受信時のイベント */
		OnReceivedMessage : function (uuid, avatarName, message) {

			var txtColor   = (selfName.toLowerCase() == avatarName) ? "#33f" : "#3f3";
			var wk         = avatarName.split(" ");
			avatarName     = wk[0].charAt(0).toUpperCase() + wk[0].substr(1) + " " + wk[1].charAt(0).toUpperCase() + wk[1].substr(1);
			var newMessage = '<span style="color:' + txtColor + ';">' + avatarName + ": " + escape_html_tag(message) + '</span><br />';

			var _txt = document.getElementById("history");
			_txt.innerHTML = newMessage + _txt.innerHTML;
		},

		OnAvatarPicked : function (json) {},
		OnTouched : function (uuid) {
			if (uuid == UUID){
				MM_openBrWindow('https://ss1.coressl.jp/www.weddingsim.com/rihga_osaka/form_tokuten/index.html','contents','status=yes, toolbar=no, location=no, menubar=no, scrollbars=yes, resizable=yes,width=700,height=800');			}
		},
		OnTeleport : function (regionName, x, y, z) {},
		OnTeleported : function (uuid, avatarName, x, y, z) {},
		OnWindowOpen : function (target, uri) {},
		OnVoiceStateChanged :  function(state) {},
		OnVoicePrivateChatStateChanged : function (pstate) {}
	};

	plugin.setAllEvents(listener);
	plugin.loadAllAPI();
}


/**
 * 動作環境説明画面を生成する
 * 
 * @return void
 */
function information() {

	var ua = navigator.userAgent.toLowerCase();
	var message = "";

	// OS判定
	if (!isWin) {
		message += "※本サービスは、Windows XP、Windows Vista、Windows 7 でご利用いただけます。<br />";

	} else {

		// IEの場合のプラグインインストール表示
		if (isIE) {

			// プラグインが見つからなければインストール案内を表示する
			if (!hasPlugin()) {

				// 通常IEの場合
				if (ua.indexOf("msie 6") != -1 || ua.indexOf("msie 7") != -1 || ua.indexOf("msie 8") != -1) {
					document.getElementById("isInstall").style.display = "block";

				// タブブラウザ等の場合
				} else {
					message += "※3Di OpenViewerは、Internet Exploler 6.0以降に対応しています。<br />恐れ入りますが、Internet Exploler 6.0以降で開いた上でインストールを開始してください。<br />";
				}

			} else {
				changeLayer(1);
				return;
			}

		// Firefoxの場合のプラグインインストール表示
		} else if (isFF) {

			// プラグインが見つからなければインストール案内を表示する
			if (!hasPlugin()) {

				// 通常Firefoxの場合
				if (ua.indexOf("firefox/3.0") != -1 || ua.indexOf("firefox/3.5") != -1) {
					document.getElementById("isInstall").style.display = "block";

				// タブブラウザ等の場合
				} else {
					message += "※3Di OpenViewerは、Firefox 3.0/3.5に対応しています。<br />恐れ入りますが、Firefox3.0/3.5で開いた上でインストールを開始してください。<br />";
				}

			} else {
				changeLayer(1);
				return;
			}

		// 未対応ブラウザの場合
		} else {
			message += "※お客様がご利用中のブラウザは、本サイトに対応しておりません。上記の環境でご利用ください。<br />";
		}

		// .NETがインストールされているかチェックする
		if (isIE && ua.indexOf(".net clr 2") == -1 && ua.indexOf(".net clr 3.5") == -1) {
			message += '<br />※お客様のパソコンにはMicrosoft .NET Framework 3.5が入っていません。<br />3Di OpenViewerをご利用になるには、Microsoft .NET Framework 3.5が必要です。<br />恐れ入りますが、下記リンクからMicrosoftホームページへアクセスし、ダウンロードしてください。<br /><br /><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=333325FD-AE52-4E35-B531-508D977D32A6&displaylang=ja">Microsoft .NET Framework 3.5　ダウンロードページはこちら</a><br />';
		}
	}

	document.getElementById("message").innerHTML = message;

	changeLayer(3);
}


/**
 * プラグインインストール
 * 
 * @return void
 */
function opvInstall() {

	if (isIE) {
		window.open().location.href = "http://3di-opensim.com/openviewer/ie_install.html";
	} else if (isFF) {
		window.open().location.href = "http://3di-opensim.com/openviewer/ff_install.html";
	}
}


/**
 * プラグインが利用可能かチェックする
 * 
 * @return void
 */
function hasPlugin() {

	if (isIE) {
		try {
			var _obj = new ActiveXObject('OpenViewerAX.ActiveControl');
			return true;

		} catch (e) {
			return false;
		}

	} else if (isFF) {

		for (var i = 0; i < navigator.plugins.length; i++) {
			if (navigator.plugins[i].name == "3Di OpenViewer") {
				return true;
			}
		}
		return false;
	}

	return false;
}


/**
 * OpenSimログイン
 * 
 * @param  string type ログイン区分
 * @return void
 */
function opvEnter(type) {

	loadingFlg = true;

	// OpenViewerが起動していなければ初期化する
	if (!ctrl) {
		ctrl = opvw.Plugin.start("viewer", 800, 450, setting);
	}

	var mode = (type == "man") ? 1 : 2;

	// ログインする
	loginTimer = setInterval("opvLogin(" + mode + ")", 2000);
	//音楽を再生（チャペル）
	//soundStop();
	//soundSet(1);
	//soundPlay();
	//LogoutボタンをONに
	logoutStatus(1);
	//キャプションエリアをONに
	showCaption(1);
	//menuをONに（チャペル）
	changeMenu('1');
	//アングルボタンを有効化（チャペル）
	showAngle('1');
	//チャットエリアをONに
//	chatStatus('1');
}


/**
 * ログイン処理
 * 
 * @param  int  mode ログイン区分
 * @return void
 */
function opvLogin(mode) {

	if (!ctrl || status == "") return;

	// ログインが開始されたらタイマーを止める
	if (status > 2 && status < 8) {
		clearInterval(loginTimer);
		return;
	}

	// 空きアカウントからランダムにチョイスする
		if (!account) account = chooseAccount(mode);

		if (!account) {
			clearInterval(loginTimer);
			return;
		}

		var firstName = account[1];
		var lastName  = account[2];
		var password  = "ahsh0000";

	selfName = firstName + " " + lastName;

	var serverUri = "210.136.73.98:10001";
	var location  = "uri:" + loginLocation;

	document.getElementById("history").innerHTML = "";
	ctrl.Login(firstName, lastName, password, serverUri, location);
}


/**
 * ログアウト処理
 * 
 * @return void
 */
function opvLogout() {

	if (status == 5) {
		document.getElementById("history").innerHTML = "";
		document.getElementById("chatInput").value = "";
		account  = null;
		selfName = null;
		//音楽を停止
		//soundStop();
		//LogoutボタンをOffに
		logoutStatus(0);
		//キャプションエリアをOffに
		showCaption(0);
		//menuをOffに
		changeMenu('0');
		//アングルエリアを無効化
		showAngle('0');
		//チャットエリアを無効化
		//chatStatus('0');
		ctrl.Logout();
	}
}


/**
 * テレポートする
 * 
 * @param  int  x テレポート先X座標
 * @param  int  y テレポート先Y座標
 * @param  int  z テレポート先Z座標
 * @return void
 */
function teleport(x, y, z) {

	if (status == 5) {
		ctrl.TeleportTo(ctrl.GetRegionName(), x, y, z);
	}
}


/**
 * カメラ位置を設定する
 * 
 * @param  float selfX   カメラ位置X座標
 * @param  float selfY   カメラ位置Y座標
 * @param  float selfZ   カメラ位置Z座標
 * @param  float targetX 被写体位置X座標
 * @param  float targetY 被写体位置Y座標
 * @param  float targetZ 被写体位置Z座標
 * @return void
 */
function focusCamera(selfX, selfY, selfZ, targetX, targetY, targetZ) {

	if (status == 5) {
		ctrl.CameraLookAt(selfX, selfY, selfZ, targetX, targetY, targetZ);
	}
}


/**
 * 表示レイヤーを切り替える
 * 
 * @param  int  id レイヤーID
 * @return void
 */
function changeLayer(id) {

	for (var i = 0; i < layer.length; i++) {
		if (id == i) {
			document.getElementById(layer[i]).style.visibility = "visible";
		} else {
			document.getElementById(layer[i]).style.visibility = "hidden";
		}
	}
}

/**
 * 表示アングルレイヤーを切り替える
 * 
 * @param  int  id レイヤーID
 * @return void
 */
function showAngle(id){ 

	for (var i = 0; i < angle.length; i++) {
		if (id == i) {
			document.getElementById(angle[i]).style.visibility = "visible";
		} else {
			document.getElementById(angle[i]).style.visibility = "hidden";
		}
	}

}

/**
 * 表示キャプションレイヤーを切り替える
 * 
 * @param  int  id レイヤーID
 * @return void
 */

function showCaption(id){ 

	for (var i = 0; i < caption.length; i++) {
		if (id == i) {
			document.getElementById(caption[i]).style.visibility = "visible";
		} else {
			document.getElementById(caption[i]).style.visibility = "hidden";
		}
	}

}

/**
 * メニューを切り替える
 * 
 * @param  int  id レイヤーID
 * @return void
 */

function changeMenu(id){ 

	for (var i = 0; i < menu.length; i++) {
		if (id == i) {
			document.getElementById(menu[i]).style.visibility = "visible";
		} else {
			document.getElementById(menu[i]).style.visibility = "hidden";
		}
	}

}

/**
 * LogoutボタンのON/OFFを切り替える
 * 
 * @param  int  0:off 1:ON
 * @return void
 */

function logoutStatus(status){ 

		if (status == 1) {
			document.getElementById('logout').style.visibility = "visible";
		} else {
			document.getElementById('logout').style.visibility = "hidden";
		}


}

/**
 * チャットのON/OFFを切り替える
 * 
 * @param  int  0:off 1:ON
 * @return void
 */

function chatStatus(status){ 

		if (status == 1) {
			document.getElementById('chat_on').style.visibility = "visible";
			document.getElementById('chat_def').style.visibility = "hidden";
		} else {
			document.getElementById('chat_on').style.visibility = "hidden";
			document.getElementById('chat_def').style.visibility = "visible";
		}


}


/**
 * チャットメッセージを送信する
 * 
 * @return void
 */
function sendMessage() {

	if (status == 5) {
		var _txt = document.getElementById("chatInput");
		ctrl.SendChat(_txt.value, 1);
		_txt.value = "";
	}
}


/**
 * HTMLタグをエスケープする
 * 
 * @param  string text 変換元文字列
 * @return string      変換後文字列
 */
function escape_html_tag(text) {

	return text.replace(/[&<>"']/g, function(match) {
		return {
			"&" : "&amp;",
			"<" : "&lt;",
			">" : "&gt;",
			'"' : "&quot;"
		}[match];
	});
}


/**
 * ログインするアカウントを選択する
 * 
 * @param  int   type ログイン区分
 * @return array      アカウント情報
 */
function chooseAccount(type) {

	httpRequest.abort();
	httpRequest.open("GET", "getAccountList.php", false);
	httpRequest.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
	httpRequest.send(null);

	if (httpRequest.status == 200) {
		if (httpRequest.responseText != "") {

			var men   = new Array();
			var women = new Array();
			var list  = eval(httpRequest.responseText);

			for (var i = 0; i < list.length; i++) {
				if (list[i][1] == "MVKguestM") {
					men.push(list[i]);
				} else if (list[i][1] == "MVKguestF") {
					women.push(list[i]);
				}
			}

		} else {
			// エラー時は混雑レイヤーを表示する
			changeLayer(2);
			return false;
		}

	} else {
		// エラー時は混雑レイヤーを表示する
		changeLayer(2);
		return false;
	}

	// 男性アバターが選択された場合
	if (type == 1) {

		// 空きがなければ混雑レイヤーを表示する
		if (!men || men.length < 1) {
			changeLayer(2);
			return false;
		}

		// リストからランダムでアカウントをチョイスする
		var randNum = Math.floor(Math.random() * men.length + 1) - 1;
		return men[randNum];

	// 女性アバターが選択された場合
	} else {

		// 空きがなければ混雑レイヤーを表示する
		if (!women || women.length < 1) {
			changeLayer(2);
			return false;
		}

		// リストからランダムでアカウントをチョイスする
		var randNum = Math.floor(Math.random() * women.length + 1) - 1;
		return women[randNum];
	}
}

// 音楽再生
//function soundSet(n){
//	place_no = n;
//}

//function soundPlay() {
//var option = '"' ;
//option += ' autostart = "true"' ; // 自動再生
//option += ' loop = "true"' ; // ループ再生
//option += ' style = "position:absolute;bottom:100%;"' ; // スタイル
//document.getElementById('sound_on').style.backgroundImage = "url(./image/sound_on_ov.gif)";
//document.getElementById('player').innerHTML = '<embed src="' + path + soundlist[place_no-1] + option + ' />' ;
//document.getElementById('stopbutton').disabled = false ;
//}

//function soundStop() {
//document.getElementById('sound_on').style.backgroundImage = "url(./image/sound_on.gif)";
//document.getElementById('player').innerHTML = '' ;
//document.getElementById('stopbutton').disabled = true ;
//}

