// 名前空間
var CHK = {};

CHK.operationType;       //プロジェクトタイプ 0:リストコンテンツ 1:図面コンテンツ 2:360コンテンツ 3:PDFコンテンツ
CHK.isCms = false;           //true:CMSモード
CHK.isWeb = false;           //true:Web表示モード
CHK.isAndroid = false;
CHK.isIOS = false;
CHK.reportMode = "1";              //報告モード default1で、定期点検で変更される
CHK.debug;                   //1:デバッグモード
CHK.isMobile;           //1:モバイル対応で表示
CHK.isRFIDBarcodeScan;           //1:RFID,バーコードスキャン使用
CHK.reportType;       //0:報告(Type1) 1:定期点検(Type2) 2:報告・回答(Type3) 3:複数工程(Type4)
CHK.useKrpano = true;        //true:krpanoを使用 false:krpanoを使用しない
CHK.lookHotspot;             //移動先ホットスポット保持用
CHK.saveAttachedDataUrl;     //添付ファイルBase64文字列保持
CHK.content;                 //コンテンツJSON
CHK.taskHotspot;             //ホットスポットJSON
CHK.taskReport;              //作業報告JSON
CHK.workingGroup;             //作業者グループマスタJSON
CHK.taskReportSuggest;       //作業報告入力補完JSON
CHK.taskReportQuestion;      //作業報告設問情報JSON
CHK.routineTask;          //定期点検情報JSON
CHK.setBigFontFlg;           //レポートフォント表示サイズを保存
CHK.taskTapMode = 1;       //タスク移動・報告モード 0:移動       1:報告(デフォルト)
CHK.appRelationVer = 1;    //アプリとの連携で行われた修正のバージョン
//絞り検索追加
CHK.questionApertureList;		//絞り検索グループ

CHK.groupTreeInfo;      //担当グループ参照用　ログインユーザーが所属しているグループ情報
CHK.operationGroup;    //担当グループ参照用　作業の報告担当グループ情報

// PDFプロジェクト対応
CHK.pdf_numPages;
CHK.pdf_pageNum;

CHK.deleteName;  //削除ホットスポット名保持用
CHK.reportBasePath = "./";		//	レポートデータのベースパス

CHK.operation;  //作業一覧データ
CHK.operationGroupMaster;  //カテゴリーデータ
CHK.operationGroupMasterRelation;  //作業・カテゴリー関係データ
CHK.pushMessage;  //コミュニケーションデータ

var pageLang; // ページ設定言語
var isSetCategory = true
var CATEGORY_HEIGHT; //カテゴリー描画用固定値（高さ）
var msgMap = { // velocity?
    all:{ja:"全て", ko:"전체", en:"All"},
    inputLoginInfo: {ja:"ログイン情報を入力してください", ko:"로그인 정보를 입력해주세요.", en:"Please enter your login information"},
    txtLoginAccPath: {ja:"アカウントパス", ko:"사업자경로", en:"Account path"},
    txtLoginId: {ja:"ログインID", ko:"아이디", en:"ID"},
    txtLoginPwd: {ja:"パスワード", ko:"패스워드", en:"Password"},
    txtLoginPwdRbr: {ja:"アカウントパスとログインIDを記憶する", ko:"사업자경로와 아이디를 저장", en:"Remember your account path and login ID"},
    dspLogin: {ja:"ログイン・伝送", ko:"로그인·전송", en:"Login·Transmission"},
    inputError: {ja:"アカウントパス、ログインID、パスワードは必須です。", ko:"사업자경로, 아이디, 패스워드는 필수입니다.", en:"Account path, login ID, password are mandatory."},
    loginError: {ja:"ユーザアカウントをご確認の上、再度ログインしてください。", ko:"로그인 정보를 확인한 후, 다시 로그인 해주세요.", en:"Please check your user account and login again."},
    doUpload: {ja:"アップロード中", ko:"업로드합니다.", en:"Upload."},
    uploadError: {ja:"アップロードに失敗しました。", ko:"파일업로드가 실패했습니다.", en:"Upload failed."},
    completeUpload: {ja:"登録が完了しました。<br/>右上の閉じるボタンをクリックし、画面を閉じてください。", ko:"등록했습니다. <br/>오른쪽 위의 닫기버튼을 클릭해, 화면을 닫아주세요.", en:"Registered. <br/>Please click the close button in the upper right and close the screen."},
    Yes: {ja:"はい", ko:"Yes", en:"Yes"},
    No: {ja:"いいえ", ko:"No", en:"No"},
    onlyRfid:{ja:"RFID又はバーコードが設定されています。<br/>該当コードを読み込んでください。", ko:"RFID또는 바코드가 설정되어있습니다. <br/>해당코드를 스캔해주십시오.", en:"RFID or barcode is set. <br/>Please scan the code."},
    notExistCode:{ja:"読み込んだコードと一致しません。<br/>コードを確認してもう一度お願いします。<br/>", ko:"스캔된코드와 일치하는 작업이 존재하지않습니다. <br/>코드를 확인하고 한번도 시도해주세요. <br/>", en:"No action exists that matches the scanned code. <br/>Please check the code and try it once. <br/>"},
    overwriteCheck: {ja:"未公開のバージョンの簡易帳票が存在します。<br/>上書きしますか？", ko:"미공개 버전의 간이 서류가 존재합니다. <br/>덮어 쓰시겠습니까？", en:"There is an unpublished version of the quick report. <br/>Do you want to overwrite?"},
    dateError: {ja:"検索日が不正です。", ko:"잘못된 검색일입니다.", en:"Please enter correct search date."},
};

// 言語取得
function getLang() {
    if (!pageLang) {
        if (localStorage["lang"]) {
            pageLang = localStorage["lang"];
        }
        else {
            pageLang = (window.navigator.languages && window.navigator.languages[0]) ||
                window.navigator.language ||
                window.navigator.userLanguage ||
                window.navigator.browserLanguage;
            localStorage["lang"] = pageLang;
        }
    }

    return pageLang;
}

// メッセージを取得
function getMsg(key) {
    lang = getLang();
    if (lang.split("-")[0] == "ja") {
        lang = "ja";
    } else if (lang.split("-")[0] == "ko") {
        lang = "ko";
    } else {
        lang = "en";
    }
    var msg = msgMap[key];
    if (!msg) {
        return "";
    }

    return msg[lang];
}

// 言語の変更処理
function changeLang(lang) {
    localStorage["lang"] = lang;
    pageLang = lang;

    if ($("#btnLogin").is(":visible")) {
        showMessage(getMsg("inputLoginInfo"));
    } else {
        showMessage(getMsg("completeUpload"));
    }

    $(".lang").each(function() {
        var key = $(this).attr("lang");
        if (key) {
            if ($(this).prop("tagName") == "input" && ($(this).attr("type") == "button" || $(this).attr("type") == "submit")) {
                $(this).val(getMsg(key));
            } else {
                $(this).html(getMsg(key));
            }
        }
    });
}

//JSONファイルパス
CHK.jsonPath = {
    operationList: "operationList.json", // 作業一覧JSONデータ
    operationGroupMasterList: "operationGroupMasterList.json", // カテゴリーJSONデータ
    operationGroupMasterRelationList: "operationGroupMasterRelationList.json", // 作業・カテゴリー関係JSONデータ
    pushMessageList: "pushMessageList.json" // コミュニケーションデータJSONデータ
};
//アプリ送信用コマンド
CHK.apiCmd = {
    finishInit: "finishInit",                   //初期化完了
    goRelationContent: "goRelationContent",     //関連資料
    goCommunication: "goCommunication",
    goSetting: "goSetting",                     //設定
    goOperation: "goOperation",                 //作業開始
    goPanoramaEdit: "goPanoramaEdit",           //パノラマ作業資料編集
    refreshContent: "refreshContent",           //新着更新
    resetSearch: "resetSearch",                 //検索条件初期化
    saveSortType: "saveSortType",               //並び替え保存
	editAttached: "editAttached",				//添付ファイル編集
	saveAttached: "saveAttached",               //添付ファイル保存
	insertReport: "insertTaskReport",           //作業報告保存
	updateReport: "updateTaskReport",           //作業報告更新
	moveHotspot: "moveHotspot",                 //ホットスポット移動
	cancelReport: "cancelTaskReport",           //作業報告キャンセル
	deleteReport: "deleteTaskReport",           //作業報告削除
	showReportOzd: "showReportOzd",             //作業報告レポート表示
	previewReportOzd: "previewReportOzd",       //作業報告ozdプレビュー
	getGpsInfo: "getGpsInfo",                   //GPS取得
	changeDisplayStatus: "changeDisplayStatus", //コンテンツ表示変更(ヘルプ表示用)
	showRelatedContent: "showRelatedContent",   //関連資料表示
	localSave: "localSaveTaskReport",           //ローカル保存
	changeReport: "changeTaskReport",            //報告レポート変更
	getGroupTreeInfo: "getGroupTreeInfo",   //担当グループ参照用　ログインユーザーが所属しているグループ取得
	deleteProcess: "deleteProcess",
	changeOperationGroupMaster: "changeOperationGroupMaster"
};
//CMS送信用コマンド
CHK.actCmd = {
	editAttached: "editAttached",				//添付ファイル編集
	getTaskReport: "getTaskReport",            //初期情報取得（作業報告）
	saveAttached: "saveAttached",              //添付ファイル保存
	insertReport: "actTaskReport",             //作業報告保存
	updateReport: "actTaskReport",             //作業報告更新
	saveRoutineTaskReport: "actRoutineTaskReport", //点検作業報告保存・更新
	moveHotspot: "actTaskReport",          //ホットスポット移動
	cancelReport: "cancelTaskReport",          //作業報告キャンセル
	deleteReport: "actTaskReport",          //作業報告削除
	deleteRoutineTaskReport: "actRoutineTaskReport", //点検作業報告保存・更新
};
//iOS送信用コマンド
const NATIVE_KEY_IOS = {
	getCachePath: "getCachePath",
	getOperationListJson: "getOperationListJson",
	getOperationGroupMasterListJson: "getOperationGroupMasterListJson",
	getOperationGroupMasterRelationListJson: "getOperationGroupMasterRelationListJson",
	getPushMessageListJson: "getPushMessageListJson",
	searchOperationList: "searchOperationList",
	getSortType: "getSortType"
};
// レポートファイル保存タイプ
CHK.REPORT_SAVE_TYPE = {
	OZD: "0",
	PDF: "1",
	HTML: "2",
	JPG: "3"
};
// OZDビューアポストメッセージ送信用コマンド
CHK.ozdCmd = {
	ozdSave: "ozdSave",
	ozdClear: "ozdClear",
	ozdOpened: "ozdOpened",
	close: "close",
	fixed: "fixed",
	unfixed: "unfixed"
};
//プロジェクトタイプ
CHK.OPERATION_TYPE = {
	LIST: "0",
	DRAWING: "1",
	VTOUR: "2",
    PDF: "3"
};
// 表示状態
CHK.DISPLAY_STATUS = {
	init: "0",           //初期表示
	showingForm: "1",    //報告入力
	previewing: "2",     //報告プレビュー
	showingList: "3"     //作業一覧
};

//プロジェクト報告タイプ
CHK.REPORT_TYPE = {
	REPORTONLY: "0",     //報告のみ
	INSPECT: "1",        //定期点検
	WITHREPLY: "2",      //報告・回答(チェーン)
	WORKFLOW: "3"        //複数工程（ワークフロー)
}

// タスクレポート追加区分
CHK.ADD_REPORT_FLG = {
	UNABLE: "0",
	ABLE: "1"
}

// 一時保存区分
CHK.LOCAL_SAVE_FLG = {
	UNABLE: "0",
	ABLE: "1"
}

// 権限区分
CHK.HAS_AUTHORITY = {
	FALSE: "0",
	TRUE: "1"
}

/**
 * タップモード
 *
 */
CHK.TAP_MODE = {
	MOVE : 0,                           //移動
	SHOW : 1                            //報告
}

// 表示・情報取得の基準となるタスクのベースチェーンNo(0)
CHK.BASE_TASK_REPLY_NO = 0;   //タイプに関係なく、基準となる報告のreplyNo
//タスク回答番号保存用
CHK.taskReplyNo = CHK.BASE_TASK_REPLY_NO;

// タスクレポート追加可能ユーザか判定
CHK.hasAddTaskAuthority = function() {
	// 追加されたタスクレポートがまだ存在しない、もしくはチェーンNoが0のタスクに権限がある場合タスク追加できるユーザだと判定する
	return CHK.reportType != CHK.REPORT_TYPE.WITHREPLY || CHK.taskReport.taskReport_0.length == 0
	|| CHK.taskReport.taskReport_0.some(function(taskReport, i) {
		if (taskReport.hasAuthority == CHK.HAS_AUTHORITY.TRUE) return true;
	});
};

// 共通初期処理
CHK.initCommon = function() {
	//JSON初期化
	//作業報告情報初期化
	CHK.taskReport = {taskReport_0: []};
	//作業報告入力補完初期化
	CHK.taskReportSuggest = {taskReportSuggest_0: []};
	//ホットスポット情報初期化
	CHK.taskHotspot = {hotspot: []};
	var urlParam = CHK.getUrlParameter();
	CHK.reportType = urlParam.report_type;
	CHK.isCms = urlParam.is_cms;
	CHK.isWeb = urlParam.is_web;
	CHK.isWindows = urlParam.app && urlParam.app == "windows"; // windowsアプリの対応追加 v1.1.0
	CHK.isAndroid = urlParam.app && urlParam.app == "android";
    CHK.isIOS = urlParam.app && urlParam.app == "ios";
    CHK.isRFIDBarcodeScan = urlParam.isRFIDBarcodeScan && urlParam.isRFIDBarcodeScan == "1";
    CHK.sortIndex = urlParam.sortIndex;
	// ウェブの場合、作業一覧の表示広さを変更
	if (CHK.isWeb) {
		$("#checkList").addClass("web");
    }
    // Windowsの場合、RFID未使用
    if (CHK.isWindows) {
        $("#rfidScanButton").hide();
    }

    // アンドロイド・IOSの場合スキャンオプションによってスキャン表示
    if (CHK.isIOS && CHK.isRFIDBarcodeScan) {
        $("#rfidScanButton").removeClass("d-none");
    }

	CHK.debug = urlParam.debug;
	CHK.isMobile = urlParam.mobile_flg && urlParam.mobile_flg == "1";
	if (CHK.isCms) {
		CHK.setBeforeunload();
	}
	if (CHK.isMobile != 1) {
		if (CHK.isFullScreen()) CHK.isMobile = 1;
	}
	// モバイルまたはリストの場合、フォーム・作業リストを全画面表示
	// 以外の場合、min-widthを400pxとして表示する
	if (CHK.isMobile == 1 || CHK.operationType == CHK.OPERATION_TYPE.LIST) {
		$("#checkInput").css("width", "calc(100% - 0px)");
		$("#checkList").css("width", "calc(100% - 2px)");
	} else {
		$("#checkInput").css("min-width", "400px");
		$("#checkList").css("min-width", "400px");
	}

}

/**
 * 初期処理
 *
 */
CHK.init = function() {
	//共通処理
	CHK.initCommon();

	//VR設定
	krpano.call("set(content[def].useVr, false);");

	if (!CHK.operationType) CHK.operationType = CHK.OPERATION_TYPE.VTOUR;
	if (CHK.operationType == CHK.OPERATION_TYPE.VTOUR) {
		//360
		CHK_V.init();
		$("#sceneName").text(krpano.get("scene[get(xml.scene)].title"));
		if ($("#topnav").length > 0) {
			$("#sceneName").css("margin", "45px 10px");
		}
	} else if (CHK.operationType == CHK.OPERATION_TYPE.DRAWING) {
		//図面
		CHK_Z.init();
		$("#sceneName").hide();
	}

	// 表示状態変更通知
	CHK.sendDisplayStatus($("#checkList").is(':visible')? CHK.DISPLAY_STATUS.showingList : CHK.DISPLAY_STATUS.init);

	$(window).bind("resize", function() {
		if (krpano.get("isOpen") == "1") {
			krpano.call("toggleAllTaskLayerOnMap()");
			setTimeout(function() {
				krpano.call("update_scale()");
				krpano.call("delayedcall(0.5, toggleAllTaskLayerOnMap();)");
			}, 1000);
		}
		$(".ui-dialog").css("top", "calc(50%)");
	});
	if (CHK.isWeb) {
		// OZDビューワのリサイズ処理
		$(window).bind("resize", function() {
			if ($("#report_dialog").is(":visible")) {
				$(".noTitleDialog:visible").width("80%").height(window.innerHeight*0.9).position({my: 'center', at: "center", of: window});
				$("#report_dialog").height($(".noTitleDialog:visible").height() - 100);
			}
		});
    }
}

/**
 * 全画面判定
 *
 */
CHK.isFullScreen = function() {
	if (CHK.isWeb) return false;
	var minSize = 550;
	console.log("innerWidth:" + window.innerWidth);
	console.log("innerHeight:" + window.innerHeight);
	return window.innerWidth < minSize || window.innerHeight < minSize;
}

/**
 * 作業報告初期処理
 *
 * @param callback コールバック
 */
CHK.initReport = function(callback) {
	console.log("initReport start");
	if (!CHK.reportMode) {
		//報告モード切り替えボタンを表示
		$("#editHeader").show();
		CHK.changeReportMode("1");
	}

	if (CHK.isWeb) {
		CHK.initReportWeb(callback);
	} else {
		CHK.initReportApp(callback);
	}

}

/**
 * 作業報告初期処理、アプリ
 *
 * @param callback コールバック
 */
CHK.initReportApp = function (callback) {
    CHK.isSearched = false;
    CHK.operationGroupMasterId = 0;
    // 作業一覧JSONデータ
    CHK.loadJson(CHK.jsonPath.operationList, function (json) {
		CHK.operation = json;
        $('#operationTable').empty();
        CHK.operation.searchOperationList = json.operationList;
		//作業一覧描画
		CHK.createOperationList(CHK.operation.operationList);
		//カテゴリー高さ固定
		if(isSetCategory){
			CATEGORY_HEIGHT = $('main').height();
			console.log(CATEGORY_HEIGHT);
			isSetCategory = false
		}
		$('#category-menu').height(CATEGORY_HEIGHT);
		$('#overlayDiv').height(CATEGORY_HEIGHT);
    });

    // カテゴリーJSONデータ
    CHK.loadJson(CHK.jsonPath.operationGroupMasterList, function (json) {
		CHK.operationGroupMaster = json;
		//カテゴリー設定
		CHK.createCategory(CHK.operationGroupMaster.operationGroupMasterList);
    });

    // 作業・カテゴリー関係JSONデータ
    CHK.loadJson(CHK.jsonPath.operationGroupMasterRelationList, function (json) {
        CHK.operationGroupMasterRelation = json;
    });

    // コミュニケーションデータJSONデータ
    CHK.loadJson(CHK.jsonPath.pushMessageList, function (json) {

    });
}

/**
 * 作業報告初期処理、Web
 *
 * @param callback コールバック
 */
CHK.initReportWeb = function(callback) {

	CHK.cmsAjax(CHK.getActionUrl(CHK.actCmd.getTaskReport), "", function(json) {
		CHK.updateReportJsonWeb(json, callback);
	});

}

/**
 * 作業報告「登録、更新、削除」の後、json更新
 *
 * @param json CMSから貰った物
 * @param callback コールバック
 */
CHK.updateReportJsonWeb = function(json, callback) {
	console.log(json);
	//JSON初期化
	CHK.taskReport = {taskReport_0: []};
	// オペレーションタイプが報告・回答の場合、念のためtaskReport_1のオブジェクトを作成しておく
	if (CHK.reportType == CHK.REPORT_TYPE.WITHREPLY) {
		CHK.taskReport.taskReport_1 = [];
	}
	CHK.taskReportSuggest = {taskReportSuggest_0: {}};
	CHK.taskHotspot = {hotspot: []};
	CHK.workingGroup = {taskGroup_0: []};
	json.taskReport_0.forEach(function(task) {
		task.taskHotspotInfo.taskId = task.taskId;
		//ホットスポット情報をロード
		CHK.taskHotspot.hotspot.push(task.taskHotspotInfo);
		//作業報告情報をロード
		if (task.taskReportInfo) {
			task.taskReportInfo.hasAuthority = task.hasAuthority;
			CHK.taskReport.taskReport_0.push(task.taskReportInfo);
		}
	});
	json.taskReport_1.forEach(function(task) {
		task.taskHotspotInfo.taskId = task.taskId;
		//作業報告情報をロード
		if (task.taskReportInfo) {
			task.taskReportInfo.hasAuthority = task.hasAuthority;
			CHK.taskReport.taskReport_1.push(task.taskReportInfo);
		}
	});

	//絞り検索
	if( CHK.questionApertureList == null){
		CHK.questionApertureList = json.apertureMaster;
	}

	if (callback) callback();

	//作業者グループマスタをロード
	json.workingGroup.taskGroup_0.forEach(function(workingGroup) {
		CHK.workingGroup.taskGroup_0.push(workingGroup)
	});
	//作業報告入力補完情報をロード
	CHK.taskReportSuggest = json.taskReportSuggest;
	//作業報告設問情報をロード
	CHK.taskReportQuestion = json.taskReportQuestion;
	//コンテンツ情報をロード
	CHK.content = json.content;
}

/**
 * JSONファイルをロード
 *
 * @param fileName JSONファイル名
 * @param callback コールバック
 */
CHK.loadJson = function(fileName, callback) {
	if (CHK.isAndroid) {
	    fileName = android.getCachePath() + "/" + fileName;
	} else if (CHK.isIOS) {
	} else {
	    //キャッシュ対応
	    fileName = fileName + "?" + new Date().getTime().toString(16);
	}

	if (CHK.isIOS) {
		if (fileName == CHK.jsonPath.operationList) {
			json = CHK_iOS.getOperationListJson();
			callback(json);
		} else if (fileName == CHK.jsonPath.operationGroupMasterList) {
			json = CHK_iOS.getOperationGroupMasterListJson();
			callback(json);
		} else if (fileName == CHK.jsonPath.operationGroupMasterRelationList) {
			json = CHK_iOS.getOperationGroupMasterRelationListJson();
			callback(json);
		} else if (fileName == CHK.jsonPath.pushMessageList) {
			json = CHK_iOS.getPushMessageListJson();
			callback(json);
		}
		return;
	}

	$.getJSON(fileName, function(json) {
		console.log("load json file", fileName, json);
		callback(json);
    }).error(function(jqXHR, textStatus, errorThrown) {
        console.log("エラー：" + textStatus);
        console.log("テキスト：" + jqXHR.responseText);
    });
}

/**
 * JSONファイルを再ロード
 *
 * @param fileName JSONファイル名
 */
CHK.reloadJson = function(fileName) {
	CHK.loadJson(fileName, function(json) {
		for (var key in CHK.jsonPath) {
			if (CHK.jsonPath[key] == fileName) {
				CHK[key] = json;
			}
		}
	});
}

/**
 * ダイアログを表示
 *
 * @param message 表示メッセージ
 * @param ok OKボタン押下時の処理
 * @param cancel キャンセルボタン押下時の処理
 * @param isError true:エラーダイアログ
 */
CHK.showDialog = function(message, ok, cancel, isError, callback) {
	// メッセージがなく、ok時の処理があるとok処理を実行し、その以外は何もせずに処理を止める（ダイアログ表示しない）
	if (!message) {
		if (ok) ok();
		else CHK.closeLoading();
		return;
	}
	var okButton = {
		text: "OK",
		class: "dialog_okButton",
		click: function() {
			if (CHK.operationType == CHK.OPERATION_TYPE.PDF) $("body").css("overflow", "visible"); // スクロール制御
			if (ok) ok();
			$("#check_dialog").dialog('close');
		}
	}
	var buttons = { OK: okButton };
	if (!isError) {
		buttons[getMsg("cancel")] = {
			text: getMsg("cancel"),
			class: "dialog_cancelButton",
			click: function() {
				if (CHK.operationType == CHK.OPERATION_TYPE.PDF) $("body").css("overflow", "visible"); // スクロール制御
				if (cancel) cancel();
				$("#check_dialog").dialog('close');
			}
		};
	}
	$("#check_dialog").dialog({
		dialogClass: 'noTitleDialog ui-dialog-titlebar dialogNoBorder',
		autoOpen: false,
		resizable: false,
		modal: true,
		width: CHK.isMobile == 1 ? "90%" : "auto",
		height: 'auto',
		title: ' ',
		buttons: buttons,
		open: function(e) {
			if (CHK.operationType == CHK.OPERATION_TYPE.PDF) $("body").css("overflow", "hidden"); // スクロール制御
			$(e.target).parent().css('background-color', 'rgba(128,128,128)');
			$(e.target).parent().css('position', 'absolute');
			$(e.target).parent().css('top', 'calc(50% + ' + $(document).scrollTop() + 'px)');
			$(e.target).parent().css('left', 'calc(50% + ' + $(document).scrollLeft() + 'px)');
			$(e.target).parent().css('transform', 'translateY(-50%) translateX(-50%)');
			$(e.target).parent().css('-webkit- transform', 'translateY(-50%) translateX(-50%)');
			$(e.target).parent().children(".ui-dialog-buttonpane").css('background-color', 'rgba(128,128,128)').css('border', 'none');
			$("#checkDialogMessage").html(message);

			if (callback) callback();
	    },
		close: function() {}
	});
	$("#check_dialog").dialog('open');
}

/**
 * ローディングを表示
 *
 * @param message 表示メッセージ
 */
CHK.showLoading = function(message) {
	$("#check_loading").dialog({
		dialogClass: 'noTitleDialog ui-dialog-titlebar dialogNoBorder',
		autoOpen: false,
		resizable: false,
		modal: true,
		width: "40%",
		height: 'auto',
		title: ' ',
		open: function(e) {
			$(e.target).parent().css('background-color', 'rgba(128,128,128)');
			$(e.target).parent().css('position', 'absolute');
			$(e.target).parent().css('top', '50%');
			$(e.target).parent().css('left', '50%');
			$(e.target).parent().css('transform', 'translateY(-50%) translateX(-50%)');
			$(e.target).parent().css('-webkit- transform', 'translateY(-50%) translateX(-50%)');
			$(e.target).parent().children(".ui-dialog-buttonpane").css('background-color', 'rgba(128,128,128)').css('border', 'none');
			$("#checkLoadingMessage").html(message);
		},
		close: function() {}
	});
	$("#check_loading").dialog('open');
}

/**
 * ローディングを閉じる
 *
 */
CHK.closeLoading = function() {
	if ($("#check_loading").hasClass("ui-dialog-content")) {
		$("#check_loading").dialog('close');
	}
}


/**
 * 作業報告フォームを表示
 *
 * @param name ホットスポット名
 * @param taskKey taskKey
 * @param lookto true:視点移動する
 */
CHK.showTaskReportForm = function(name, taskKey, lookto, element) {
	// ウェブでの対応
	if (CHK.isWeb) {
		var formType = CHK.taskReplyNo == CHK.BASE_TASK_REPLY_NO? "instruct" : "report";
		element.setAttribute("src", CHK.getShopUrl() + "enqueteReply/" + formType + "/" + operationId + "/" + CHK.getTaskId(name, taskKey));
		$("#checkInput").css("top", "36px");
		$("#checkInput").css("height", "calc(100% - 36px)");
	}
	element.setAttribute("frameborder", "0");
	element.width = "100%";
	element.height = "100%";
	if (CHK.operationType == CHK.OPERATION_TYPE.LIST) {
		$("#checkInput").css("border", "none");
	}
	$("#checkInput").css("opacity", "0");
	CHK.showCheckInput(element, taskKey);

	if (lookto) {
		var fov = krpano.get("view.fov");
		krpano.call("looktohotspot(" + name + "," + fov + ")");
	}

	element.onload = function() {
		// 連続作業の場合申し送り部、承認部の生成
		if (CHK.reportType == CHK.REPORT_TYPE.WORKFLOW) {
			element.contentWindow.createProcessParts();
		}

		var taskReport = CHK.getTaskReport(name, taskKey);
		var isPreview = false;
		// 既存報告情報があるか確認
		if (taskReport && taskReport.task) {
			var baseReport = CHK.getRecentVersionReport(taskKey);
			var param = {name: name, taskKey: taskKey, pointNo: CHK.getPointNo(baseReport), taskProgress: CHK.getTaskProgress(name, taskKey), taskName: CHK.getTaskName(baseReport), mode: "1", attachedChangeFlag: "0"};
			var replyReportList;
			var createTaskBtnFlg;
			if (CHK.reportType == CHK.REPORT_TYPE.WITHREPLY) {
				replyReportList = CHK.getTaskReplyReportList(taskKey);
				if (replyReportList.length || CHK.taskReplyNo != CHK.BASE_TASK_REPLY_NO) createTaskBtnFlg = true;
			}
			// 報告権限がある場合は報告画面を、ない場合はプレビュー画面を表示する
			// Type1の場合はプレビューなし
			if (CHK.reportType == CHK.REPORT_TYPE.WITHREPLY && (taskReport.hasAuthority == CHK.HAS_AUTHORITY.FALSE || (CHK.isCms && CHK.taskReplyNo != CHK.BASE_TASK_REPLY_NO))) {
				var reportMode = CHK.reportMode == "1" ? 0 : 1;
				isPreview = true;
				element.contentWindow.createPreview(taskReport, CHK.taskReportQuestion, CHK.workingGroup, CHK.content, reportMode, replyReportList, param);
				if (createTaskBtnFlg) element.contentWindow.createTaskButton(name, taskKey, true);
				CHK.sendDisplayStatus(CHK.DISPLAY_STATUS.previewing, taskKey);
			} else {
				element.contentWindow.setCheckInitData(taskReport, CHK.taskReportQuestion, CHK.content, CHK.taskReportSuggest, param, replyReportList);
				if (createTaskBtnFlg) element.contentWindow.createTaskButton(name, taskKey);
				CHK.sendDisplayStatus(CHK.DISPLAY_STATUS.showingForm, taskKey);
			}
			//絞り検索追加: 初期化
			element.contentWindow.initSavedApertureSelectBox();
		} else {
			var param = {name: name, taskKey: taskKey, seqId: CHK.getNextSeqId(), mode: "0", attachedChangeFlag: "0"};
			if (CHK.reportType == CHK.REPORT_TYPE.WITHREPLY && CHK.taskReplyNo != CHK.BASE_TASK_REPLY_NO) {
				var baseReport = CHK.getRecentVersionReport(taskKey);
				param.pointNo = CHK.getPointNo(baseReport);
				param.taskName = CHK.getTaskName(baseReport);
				param.taskProgress = CHK.getTaskProgress(name, taskKey);
				element.contentWindow.createTaskButton(name, taskKey);
			}
			element.contentWindow.setCheckInitData(taskReport, CHK.taskReportQuestion, CHK.content, CHK.taskReportSuggest, param);
			CHK.sendDisplayStatus(CHK.DISPLAY_STATUS.showingForm, taskKey);
			//絞り検索追加: 初期化
			element.contentWindow.initApertureSelectBox();
		}
		//端末別に上段バーの選択
		if (CHK.isMobile || CHK.operationType != CHK.OPERATION_TYPE.LIST) {
			element.contentWindow.createDoubleHeader(isPreview);
		} else if (CHK.reportType == CHK.REPORT_TYPE.WORKFLOW) {
			//連続作業ならタブ表示
			element.contentWindow.initTab(false);
		}
		element.contentWindow.changeFontSize(CHK.setBigFontFlg);
	}
}

/**
 * iOS不具合対策
 * 報告フォームを一瞬再描画する
 * アプリとの連携で問題があったため、hide->showからheightの変更に修正
 *
 */
CHK.delayReportFormInit = function(closeLoading) {
	$("#checkInput").css("opacity", "0");
	$("#checkInput").height(0);
	$("#checkInput [id^='reportForm']").height(0);
	setTimeout(function() {
		var checkInputHeight = CHK.isWeb ? "calc(100% - 36px)" : "100%";
		$("#checkInput").height(checkInputHeight);
		// フォーム表示非表示設定
		if (closeLoading) {
			$("#checkInput [id^='reportForm']").each(function() {
				// 現在表示対象フォーム以外の高さを0に設定(リダイレクトの場合は常に100%)
				var reportFormDoc = this.contentWindow.document;
				if (this.id == "reportForm" + CHK.taskReplyNo || this.id == "reportForm") {
					$("body", reportFormDoc).show(); // IPAD対応
					$(this).height("100%");
					$("#checkInput").css("opacity", "1");
					$(".content", reportFormDoc).css("overflow", "hidden");
					$(".content", reportFormDoc).css("-webkit-overflow-scrolling", "none");
					setTimeout(function() {
						$(".content", reportFormDoc).css("overflow", "auto");
						$(".content", reportFormDoc).css("-webkit-overflow-scrolling", "touch");
						$("#whiteFrame").hide();
						CHK.closeLoading();
					}, 500);
				} else {
					$("body", reportFormDoc).hide(); // IPAD対応
				}
			});
		}
	}, 500);
}

/**
 * ホットスポットクリック時フォームを表示
 * TODO
 *
 * @param name ホットスポット名
 * @param taskKey taskKey
 * @param lookto true:視点移動する
 */
CHK.showReportForm = function(name, taskKey, lookto, replyNo, message) {
	CHK.showLoading(getMsg("Processing_w_dot"));
	// TODO 画面切り替え中に作業一覧を隠す
	if ($("#checkInput iframe[id^='reportForm']").length) {
		CHK.showWhiteFrame();
	}
	if (CHK.operationType == CHK.OPERATION_TYPE.PDF && !name) name = CHK.generateUuid(); // PDFタイプのみname値がない場合新規作成とする
	console.log({name: name});
	if (!taskKey) taskKey = CHK.getTaskKeyByName(name);
	if (!replyNo) replyNo = CHK.BASE_TASK_REPLY_NO; // replyNoの値が空の場合0を設定
	// グローバル変数として回答番号を設定
	CHK.taskReplyNo = replyNo;
	var element;
	// リダイレクトフラグがtrueの場合はiframeを1つ、以外の場合はiframeを2つ作って管理する
	if (CHK.isRedirectForm(taskKey)) {
		element = document.getElementById("reportForm");
		console.log(element);
		if (!element) {
			element = document.createElement("iframe");
			element.id = "reportForm";
			element.setAttribute("src", CHK.reportBasePath + "taskReport_" + replyNo + "/index.html?wmode=transparent");
			CHK.showTaskReportForm(name, taskKey, lookto, element);
		} else {
			CHK.showDialog(message, function() {
				$("#checkInput").hide();
				$("#checkInput").empty();
				CHK.changeReport(taskKey);
			}, function() {
				$("#whiteFrame").hide();
				CHK.closeLoading();
			});
		}
	} else {
		element = document.getElementById("reportForm" + replyNo);
		if (!element) {
			element = document.createElement("iframe");
			element.id = "reportForm" + replyNo;
			element.setAttribute("src", CHK.reportBasePath + "taskReport_" + replyNo + "/index.html?wmode=transparent");
			CHK.showTaskReportForm(name, taskKey, lookto, element);
			CHK.delayReportFormInit();
		} else {
			CHK.delayReportFormInit(true);
			element.contentWindow.changeFontSize(CHK.setBigFontFlg);
		}
	}
	CHK.closeLoading();
}

/**
 * 報告フォームを表示
 *
 * @param element 表示するHTML
 */
CHK.showCheckInput = function(element, taskKey) {
	// 新規・リダイレクト・初期表示の場合checkInputエレメントを空に設定する
	if (!taskKey || CHK.isRedirectForm(taskKey) || $("#unsupport_browser").length) {
		$("#checkInput").empty();
	}
	// checkInputに対象フォームが存在しない場合対象フォームを挿入する
	if (!$("#checkInput").has(element).length) {
		$("#checkInput").append(element);
	}

	// 表示処理を隠す
	CHK.showWhiteFrame();
	$("#checkInput").show();
	if (CHK.operationType == CHK.OPERATION_TYPE.VTOUR) {
		krpano.call("set(layer[skin_control_bar].visible,false);");
		krpano.call("skin_close_settings();");
		krpano.call("skin_hideskin();");
	}
}

/**
 * 作業報告フォームを非表示
 *
 */
CHK.hideReportForm = function() {
	// 作業追加区分なしの場合、画面を閉じる
	if (CHK.isWeb && addReportFlg == CHK.ADD_REPORT_FLG.UNABLE) {
		CHK.close();
	} else {
		$("#checkInput").hide();
		$("#checkInput").empty();
		if (CHK.useKrpano) {
			krpano.call("clear_blink()");
			krpano.call("clear_selected()");
			if (CHK.operationType == CHK.OPERATION_TYPE.VTOUR) {
				krpano.call("set(layer[skin_control_bar].visible,true);");
				krpano.call("skin_showskin();");
			}
		} else if (CHK.operationType == CHK.OPERATION_TYPE.PDF && CHK.isWeb) {
			CHK_P.showToolbar();
			CHK_P.selectedHsTaskKey = null;
			$("#checkList").css("visibility", "visible");
			$(".hotspot").removeClass("blinking");
		}
		// 表示状態変更通知
		CHK.sendDisplayStatus($("#checkList").is(':visible') ? CHK.DISPLAY_STATUS.showingList : CHK.DISPLAY_STATUS.init);
		// 回答番号を0に設定する
		CHK.taskReplyNo = CHK.BASE_TASK_REPLY_NO;
	}
	$("#whiteFrame").remove();
}


/**
 * 作業報告登録フォームの入力を保存
 *
 * @param param 入力パラメータ
 */
CHK.saveReportForm = function(param) {
	console.log(param);
	var inspect = CHK.reportType == CHK.REPORT_TYPE.INSPECT;
	var isInsert = false;

	var taskReport;
	// 定期点検対応
	if (inspect) {
		var routineTaskReport = CHK_I.getTaskReport(param.reportStartDate);
		if (routineTaskReport && routineTaskReport.task) {
			taskReport = routineTaskReport;
		}
	} else {
		taskReport = CHK.getTaskReport(null, param.taskKey);
	}
	// 更新・登録確認
	if (taskReport && taskReport.task) {
		taskReport.task = param.task;
		taskReport.taskReply = param.taskReply;
		taskReport.attached = param.attached;
		taskReport.suggest = param.suggest;
	} else {
		isInsert = true;
		param.mode = "0";
		var reportKey = "taskReport_" + CHK.taskReplyNo;
		taskReport = {};
		taskReport.taskKey = param.taskKey;
		taskReport.task = param.task;
		taskReport.taskReply = param.taskReply;
		taskReport.attached = param.attached;
		taskReport.suggest = param.suggest;
		if (CHK.reportType == CHK.REPORT_TYPE.WORKFLOW) {
			taskReport.processKey = CHK_PR.selectedProcessKey;
		}
		if (!CHK.taskReport[reportKey]) CHK.taskReport[reportKey] = [];
		if (CHK.debug == "1") CHK.taskReport[reportKey].push(taskReport); //DEBUG
	}
	// 報告（回答）の場合、バージョンを追加
	if (CHK.reportType == CHK.REPORT_TYPE.WITHREPLY) {
		var recentVersionNum = CHK.getRecentVersionNum(param.taskKey);
		console.log("recentVersionNum: " + recentVersionNum);
		taskReport.task.version = recentVersionNum + 1;
	}

	var callbackABookCheckApi = null;
	if (CHK.isWeb) {
		callbackABookCheckApi = function(json) {
			CHK.closeLoading();
			if (inspect) {
				CHK_I.updateInspectReportJsonWeb(json);
			} else {
				CHK.updateReportJsonWeb(json);
			}
			CHK.afterUpdateReport(param.taskKey);
		};
	}

	//アプリ・CMSに送信
	var apiParam = {};
	if (CHK.taskReplyNo == CHK.BASE_TASK_REPLY_NO) {
		var hotspot = CHK.getSaveHotspotParam(param);
		apiParam.hotspot = CHK.encodeParam(JSON.stringify(hotspot));
		apiParam.delFlag = 0;
	}
	apiParam.cmd = param.isLocalSave ? CHK.getCommand("localSave") : isInsert ? CHK.getCommand("insertReport") : CHK.getCommand("updateReport");
	apiParam.taskKey = param.taskKey;
	apiParam.taskReport = CHK.encodeParam(JSON.stringify(taskReport));
	apiParam.attachedChangeFlag = param.attachedChangeFlag;
	apiParam.taskReportLevel = CHK.taskReplyNo;
	apiParam.addReport = addReportFlg;
	// 定期点検対応
	if (inspect) {
		apiParam.taskReportId = param.taskReportId;
		apiParam.reportStartDate = CHK_I.getInspectIsoDate(new Date(param.reportStartDate));
		if (CHK.isWeb) {
			apiParam.reportStartDate = apiParam.reportStartDate.replace("T", " ");
			if (!apiParam.taskReportInfo) {
				apiParam.taskReportInfo = {};
			}
			apiParam.taskReportInfo.task = taskReport.task;
			apiParam.taskReportInfo.attached = taskReport.attached;
			apiParam.taskReportInfo = JSON.stringify(apiParam.taskReportInfo);
			if (!isInsert && param.taskReportInfoId) {
				apiParam.taskReportInfoId = param.taskReportInfoId;
			}
		}
	}
	// 連続作業対応
	if (CHK.reportType == CHK.REPORT_TYPE.WORKFLOW) {
		apiParam.phaseNo = CHK_PR.selectedPhaseInfo.phaseNo;
		apiParam.processKey = CHK_PR.selectedProcessKey;
		//連続作業の場合は保存後閉じさせない
		apiParam.addReport = CHK.ADD_REPORT_FLG.ABLE;
	}
	CHK.sendABookCheckApi(apiParam, callbackABookCheckApi);

	//DEBUG
	if (CHK.debug == "1") {
		CHK.closeLoading();
		CHK.afterUpdateReport(param.taskKey);
	}
}

/**
 * アプリにデータを送信
 *
 * @param param パラメータ
 */
CHK.sendABookCheckApi = function(param, callback) {
	if (CHK.isWeb) {
		var url = CHK.getActionUrl(param.cmd);
		CHK.cmsAjax(url, param, callback);
	} else if (CHK.isWindows) {
		// windowsアプリの場合の対応
		window.external.notify(JSON.stringify(param));
	} else if(CHK.isAndroid){
	    android.sendParam(JSON.stringify(param));
	} else if(CHK.isIOS){
		webkit.messageHandlers.sendParam.postMessage(JSON.stringify(param));
	} else {
		var query = "";
		for (var key in param) {
			if (!query) {
				query = "?" + key + "=" + param[key];
			} else {
				query = query + "&" + key + "=" + param[key];
			}
		}

		var uri = "abookcheck-api://" + query;
		console.log({uri: uri});
		if (CHK.debug != "1") {
			var link = document.createElement('a');
			link.href = uri;
			link.click();
		}
	}
}

/**
 * アプリに添付ファイル情報を送信
 *
 * @param taskKey taskKey
 * @param attachedKey 添付ファイルのkey値
 * @param fileName ファイル名
 * @param dataUrl 添付ファイルBase64文字列
 */
CHK.sendAttachedFileName = function(taskKey, attachedKey, fileName, dataUrl, editable) {
	var param = {};
	param.cmd = CHK.getCommand("saveAttached");
	param.taskKey = taskKey;
	param.attachedKey = attachedKey;
	param.filename = fileName;
	param.editable = editable;
	CHK.saveAttachedDataUrl = dataUrl;
	CHK.sendABookCheckApi(param);
	if (CHK.debug == "1") {
		CHK.closeLoading();
	}
}

/**
 * アプリに編集したい添付ファイル情報を送信
 *
 * @param taskKey taskKey
 * @param fileName ファイル名
 * @param filePath ファイルパス
 */
CHK.editAttachedFile = function(taskKey, fileName, filePath) {
	var param = {};
	param.cmd = CHK.getCommand("editAttached");
	param.taskKey = taskKey;
	param.filename = fileName;
	param.filePath = filePath;
	CHK.sendABookCheckApi(param);
	if (CHK.debug == "1") {
		CHK.closeLoading();
	}
}

/**
 * 添付ファイルのBase64文字列を返却
 *
 */
CHK.getAttachedDataUrl = function() {
	var ret = CHK.saveAttachedDataUrl;
	CHK.saveAttachedDataUrl = "";
	return ret;
}

/**
 * アプリデータ送信結果コールバック
 *
 * @param cmd コマンド文字列
 * @param taskKey taskKey
 * @param result 処理結果(0:成功)
 * @param message エラーメッセージ
 * @param extParam 拡張パラメータ JSON形式
 */
CHK.afterABookCheckApi = function(cmd, taskKey, result, message, extParam) {
	console.log("afterABookCheckApi", cmd, taskKey, result, message, extParam);
	// 結果が成功じゃない場合
	if (result != "0") {
		if (cmd == CHK.apiCmd.getGpsInfo) {
			//手動取得時はエラーダイアログを表示
			var targetContentwindow;
			if ($("#checkInput").find("iframe#reportForm0").length) {
				targetContentwindow = $("#checkInput").find("iframe#reportForm" + CHK.taskReplyNo)[0].contentWindow;
			} else {
				targetContentwindow = $("#checkInput").find("iframe")[0].contentWindow;
			}
			if (targetContentwindow && targetContentwindow.isGpsManual()) {
				CHK.showDialog(getMsg("errorOccurred") + "<br>" + message, null, null, true);
			}
			$("#checkInput").find("iframe")[0].contentWindow.getGpsInfoAfter();
		} else if (addReportFlg == CHK.ADD_REPORT_FLG.UNABLE && (cmd == CHK.apiCmd.insertReport || cmd == CHK.apiCmd.updateReport)) {
			CHK.closeLoading();
		} else {
			CHK.showDialog(getMsg("errorOccurred") + "<br>" + message, null, null, true);
			if (cmd == CHK.apiCmd.saveAttached) {
				$("#checkInput").children()[0].contentWindow.deleteFile(extParam.key);
				CHK.closeLoading();
			} else if(cmd == CHK.apiCmd.editAttached) {
				$("#checkInput").children()[0].contentWindow.deleteFile(extParam.key);
				CHK.closeLoading();
			}
		}
		return;
	}
	//JSON再ロード
	switch (cmd) {
		case CHK.apiCmd.saveAttached: {
			CHK.closeLoading();
			break;
		}
		case CHK.apiCmd.editAttached: {
			CHK.closeLoading();
			break;
		}
		case CHK.apiCmd.insertReport:
		case CHK.apiCmd.updateReport: {
			CHK.closeLoading();
			//作業報告情報をロード
			CHK.loadJson(CHK.jsonPath.taskReport, function(taskReport) {
				CHK.taskReport = taskReport;
				//ホットスポット情報をロード
				CHK.loadJson(CHK.jsonPath.taskHotspot, function(jsonData) {
					CHK.taskHotspot = jsonData;
					CHK.afterUpdateReport(taskKey);
				});
			});
			//作業報告入力補完情報をロード
			CHK.reloadJson(CHK.jsonPath.taskReportSuggest);
			break;
		}
		case CHK.apiCmd.cancelReport: {
			CHK.afterCancelTask();
			break;
		}
		case CHK.apiCmd.deleteReport: {
			CHK.closeLoading();
			//作業報告情報をロード
			CHK.loadJson(CHK.jsonPath.taskReport, function(taskReport) {
				CHK.taskReport = taskReport;
				CHK.afterDeleteReport(taskKey);
			});
			break;
		}
		case CHK.apiCmd.moveHotspot: {
			//ホットスポット情報をロード
			CHK.loadJson(CHK.jsonPath.taskHotspot, function(jsonData) {
				CHK.taskHotspot = jsonData;
				var taskHotspot = CHK.getTaskHotspot(null, taskKey);
				var object = krpano.get("layer[" + taskHotspot.name + "]");
				//ウィンドウサイズ変更時の対応
				if (object) object.origin_x = taskHotspot.x;
				if (object) object.origin_y = taskHotspot.y;
			});
			break;
		}
		case CHK.apiCmd.getGpsInfo: {
			//GPS情報取得
			var gps = {};
			gps.latitude = extParam.latitude;
			gps.longitude = extParam.longitude;
			if ($("#checkInput").find("iframe#reportForm0").length) {
				$("#checkInput").find("iframe#reportForm" + CHK.taskReplyNo)[0].contentWindow.getGpsInfoAfter(gps);
			} else {
				$("#checkInput").find("iframe")[0].contentWindow.getGpsInfoAfter(gps);
			}
			break;
		}
		case CHK.apiCmd.localSave: {
			CHK.closeLoading();
			//作業報告情報をロード
			CHK.loadJson(CHK.jsonPath.taskReport, function(taskReport) {
				CHK.taskReport = taskReport;
				//ホットスポット情報をロード
				CHK.loadJson(CHK.jsonPath.taskHotspot, function(jsonData) {
					CHK.taskHotspot = jsonData;
					CHK.afterUpdateReport(taskKey, true);
				});
			});
			//作業報告入力補完情報をロード
			CHK.reloadJson(CHK.jsonPath.taskReportSuggest);
			break;
		}
		case CHK.apiCmd.changeReport: {
			// 添付ファイルの削除後レポート表示
			CHK.showReportForm(null, taskKey, null, CHK.taskReplyNo);
			break;
		}
		case CHK.apiCmd.getGroupTreeInfo: {
			// ログインユーザーの所属グループを保存
			CHK.groupTreeInfo = extParam;
		}
	}
}

/**
 * 作業報告更新後の処理
 *
 * @param taskKey taskKey
 */
CHK.afterUpdateReport = function(taskKey, isLocalSave) {
	// テキストを更新
	if (CHK.operationType == CHK.OPERATION_TYPE.PDF) {
		CHK.updateHotspotText(taskKey);
	} else if (CHK.operationType == CHK.OPERATION_TYPE.VTOUR) {
		var taskHotspot = CHK.getTaskHotspot(null, taskKey);
		var taskReport = CHK.getRecentVersionReport(taskKey);
		var pointNo = CHK.getPointNo(taskReport);
		CHK.changeTextColor(taskHotspot.name, pointNo);

	}
	// リスト更新、入力フォームをクローズ
	CHK.updateTaskList();
	if (!isLocalSave) CHK.hideReportForm();
	// 新規作成時削除対象になってあるため、クリア
	CHK.deleteName = null;
}

/**
 * 作業報告キャンセル後の処理
 *
 * @param taskKey taskKey
 */
CHK.afterCancelTask = function() {
	if (CHK.deleteName) {
		//ホットスポットを削除
		CHK.deleteHotspot(CHK.deleteName);
		CHK.deleteName = null;
	}
	CHK.hideReportForm();
}

/**
 * 作業報告削除後の処理
 *
 * @param taskKey taskKey
 */
CHK.afterDeleteReport = function(taskKey, json) {
	// 指示報告か回答報告かを確認
	if (CHK.taskReplyNo == CHK.BASE_TASK_REPLY_NO) {
		//ホットスポットを削除
		var targetHsName = taskKey;
		if (CHK.operationType != CHK.OPERATION_TYPE.PDF) {
			targetHsName = "hs" + CHK.getSceneId() + "-" + taskKey;
		}
		CHK.deleteHotspot(targetHsName);
		CHK.hideReportForm();
		if (CHK.isWeb) {
			//ホットスポット情報をロード
			CHK.updateReportJsonWeb(json);
			//ホットスポット一覧更新
			CHK.updateTaskList();
		} else {
			//ホットスポット情報をロード
			CHK.loadJson(CHK.jsonPath.taskHotspot, function(jsonData) {
				CHK.taskHotspot = jsonData;
				//ホットスポット一覧更新
				CHK.updateTaskList();
			});
		}
	} else {
		// テキストの色変更
		if (CHK.operationType != CHK.OPERATION_TYPE.PDF) {
			var taskHotspot = CHK.getTaskHotspot(null, taskKey);
			var taskReport = CHK.getRecentVersionReport(taskKey);
			var pointNo = CHK.getPointNo(taskReport);
			CHK.changeTextColor(taskHotspot.name, pointNo);
		}
		// リスト更新、入力フォームをクローズ
		CHK.updateTaskList();
		CHK.hideReportForm();
	}
}

/**
 * ホットスポットのテキストを更新
 *
 * @param taskKey taskKey
 */
CHK.updateHotspotText = function(taskKey) {
	var taskHotspot = CHK.getTaskHotspot(null, taskKey);
	var taskReport = CHK.getRecentVersionReport(taskKey);
	var pointNo = CHK.getPointNo(taskReport);

	if (CHK.operationType != CHK.OPERATION_TYPE.DRAWING && taskHotspot.sceneId != "0") {
		var layer = krpano.get("layer[" + taskHotspot.name + "_inner]");
		if (layer) layer.html = "[font size='4' color='#ffffff' style='border-style:solid;border-width:1px;border-color:#ffffff;padding:5px 15px;background-color:#ff7700;'][b]" + pointNo + "[/b][/font]";
	} else {
		var layer = krpano.get("layer[" + taskHotspot.name + "]");
		if (CHK.operationType == CHK.OPERATION_TYPE.DRAWING) {
			layer.html = "[font color='#ffffff' style='border-style:solid;border-width:1px;border-color:#ffffff;padding:5px 15px;background-color:#ff7700;'][b]" + pointNo + "[/b][/font]";
		} else {
			layer.html = "[font color='#ffffff' style='border-style:solid;border-width:1px;border-color:#ffffff;padding:5px 15px;background-color:#ff7700;'][b]" + pointNo + "[/b][/font]";
		}
	}
}

/**
 * ホットスポットのテキストカラーを変更
 *
 * @param name ホットスポット名
 * @param pointNo 指摘No
 */
CHK.changeTextColor = function(name, pointNo) {
	var isHotspot = true;
	var layer = krpano.get("layer[" + name + "_inner]");
	if (!layer) {
		isHotspot = false;
		layer = krpano.get("layer[" + name + "]");
		if (!layer) return;
	}
	layer.html = CHK.getHotspotHtml(name, isHotspot, pointNo);
}

/**
 * 作業報告を削除
 *
 * @param taskKey taskKey
 */
CHK.deleteReport = function(taskKey) {
	//アプリに作業報告の削除情報を送信
	var apiParam = {};
	apiParam.cmd = CHK.getCommand("deleteReport");
	apiParam.taskKey = taskKey;
	apiParam.delFlag = 1;
	apiParam.taskReportLevel = CHK.taskReplyNo;
	apiParam.addReport = addReportFlg;
	var callbackABookCheckApi = null;
	if(CHK.isWeb) {
		callbackABookCheckApi = function(json) {
			CHK.closeLoading();
			//作業報告情報をロード
			CHK.updateReportJsonWeb(json);
			CHK.afterDeleteReport(taskKey, json);
		};
	}

	CHK.sendABookCheckApi(apiParam, callbackABookCheckApi);

	//DEBUG
	if (CHK.debug == "1") {
		var taskReport = CHK.getTaskReport(null, taskKey);
		CHK.closeLoading();
		var index = 0;
		taskReport.some(function(report, i) {
			if (report.taskKey == taskKey) {
				index = i;
				return true;
			}
		});
		taskReport.splice(index, 1);
		CHK.afterDeleteReport(taskKey);
	}
}

/**
 * ホットスポットを削除
 *
 * @param name ホットスポット名
 */
CHK.deleteHotspot = function(name) {
	var isHotspot = krpano.get("hotspot[" + name + "]") != null;
	if (isHotspot) {
		krpano.call("removehotspot(" + name + ")");
		krpano.call("removelayer(" + name + "_inner)");
	} else {
		krpano.call("removelayer(" + name + ")");
	}
}

/**
 * 作業報告キャンセル処理
 *
 */
CHK.cancelTask = function(taskKey) {
	var apiParam = {};
	apiParam.cmd = CHK.getCommand("cancelReport");
	apiParam.taskKey = taskKey;
	apiParam.taskReportLevel = CHK.taskReplyNo;

	//連続作業の場合追加無しでも工程一覧に戻したい
	if (window.parent.CHK.reportType == window.parent.CHK.REPORT_TYPE.WORKFLOW) {
		apiParam.addReport = CHK.ADD_REPORT_FLG.ABLE;
	} else {
		apiParam.addReport = addReportFlg;
	}

	CHK.sendABookCheckApi(apiParam);
	if (CHK.debug == "1" || CHK.isWeb) {
		CHK.afterCancelTask();
	}
}

/**
 * 作業報告変更処理
 *
 */
CHK.changeReport = function(taskKey) {
	var apiParam = {};
	apiParam.cmd = CHK.getCommand("changeReport");
	apiParam.taskKey = taskKey;
	CHK.sendABookCheckApi(apiParam);
}

/**
 * 指摘No一覧の表示を切り替える
 *
 */
CHK.showTaskList = function() {
	// フォームが表示されてる場合は何もしない
	if (CHK.isShowingForm()) {
		return;
	}
	if ($("#checkListValues").css('display') != "none") {
		$("#checkListValues").hide();
		$("#checkListValues #checkListCount").hide();
		$("#checkListValues").height("0px");
		$("#checkList").height("0px");
		$("#checkList").hide();
		// 表示状態変更通知
		CHK.sendDisplayStatus(CHK.DISPLAY_STATUS.init);
	} else {
		$("#checkListValues").show();
		$("#checkListValues #checkListCount").show();
		if ($("#topnav").length > 0) {
			$("#checkList").css("top", "36px");
		}
		$("#checkListValues").height("100%");
		$("#checkList").height("100%");
		$("#checkList").show();
		// 表示状態変更通知
		CHK.sendDisplayStatus(CHK.DISPLAY_STATUS.showingList);
	}
}


/**
 * フォントサイズ調整
 *
 */
CHK.changeFontSize = function(flg) {
    if (flg) {
	    $(".fontBtn.small").removeClass("selected");
	    $(".fontBtn.big").addClass("selected");
	    $("#checkList").addClass("big");

    } else {
        $(".fontBtn.small").addClass("selected");
        $(".fontBtn.big").removeClass("selected");
        $("#checkList").removeClass("big");

    }
    CHK.setBigFontFlg = flg;
}




/**
 * 指摘No一覧を更新
 *
 * @param searchWord 検索文
 */
CHK.updateTaskList = function(searchWord) {
	$("#checkListValues").empty();
	$("#fontBtnDiv").clone().appendTo($("#checkListValues"));
	$("#checkListValues #fontBtnDiv").css("display", "flex");
	$("#closeBtn").clone().appendTo($("#checkListValues"));
	$("#checkListValues #closeBtn").show();
	var ckeckList = [];
	CHK.taskHotspot.hotspot.forEach(function(hotspot) {
		var taskReport = CHK.getRecentVersionReport(hotspot.name, hotspot.taskKey);
		ckeckList.push({
			sceneId: hotspot.sceneId,
			name: hotspot.name? hotspot.name : hotspot.taskKey,
			pointno: CHK.getPointNo(taskReport),
			hotspot: hotspot.sceneId != "0"
		});
	});
	ckeckList.sort(function(a, b) {
		if (a.sceneId != "0" && b.sceneId == "0") return -1;
		if (a.sceneId == "0" && b.sceneId != "0") return 1;
		if (a.sceneId < b.sceneId) return -1;
		if (a.sceneId > b.sceneId) return 1;
		if (a.pointno < b.pointno) return -1;
		if (a.pointno > b.pointno) return 1;
		return 0;
	});
	var count = 0;
	var sceneId = "";
	if (!searchWord) searchWord = "";
	$("#searchWord").val(searchWord);
	$("#checkListSearch").clone().appendTo($("#checkListValues"));
	$("#checkListSearch").css("display", "flex");
	$("#checkListCount").clone().appendTo($("#checkListValues"));
	$("#checkListCount").show();
	$("#checkListValues").append("<div id='values'></div>");

	var sceneCnt = CHK.operationType == CHK.OPERATION_TYPE.PDF? CHK.pdf_numPages : krpano.get("scene").count;
	if (CHK.operationType != CHK.OPERATION_TYPE.PDF && krpano.get("layer[map].url")) {
		sceneCnt += 1;
	}
	// シーンから追加
	if (CHK.operationType == CHK.OPERATION_TYPE.VTOUR) {
		for (var i = 0; i < sceneCnt; i++) {
			var scene = krpano.get("scene[" + i + "]");
			if (!scene) {
				sceneId = "0";
			} else {
				sceneId = scene.name.substring(5);
			}

			var checkListSceneDiv = $("<div/>", {class:"checkListSceneDiv"});
			checkListSceneDiv.append($("<div/>", {class:"checkListScene", onclick:"CHK.clickTaskList(" + sceneId + ")"}).append($("<div/>").text(CHK.getSceneName(sceneId))));
			checkListSceneDiv.append($("<div/>", {id:sceneId+"_accordionBtn", class:"accordionBtn"}).append($("<p/>").text("▽")));
			$("#values").append(checkListSceneDiv);
			$("#values").append($("<div/>", {id: sceneId + "_values", class:"sceneValues"}));

			// 表示中のシーンの作業リストはオープンするため、ボタンのスタイルを設定
			if (searchWord || krpano.get("xml.scene") == "scene" + sceneId) {
				$("#" + sceneId + "_accordionBtn >p").css({transform: "rotate(180deg)", zIndex: "1"});
			}

			// 作業がないシーンの表示
			$("#nullValue").clone().appendTo($("#" + sceneId + "_values"));
			$("#nullValue").show();
		}
	} else if (CHK.operationType == CHK.OPERATION_TYPE.DRAWING) {
		$("#values").css("margin-top", "20px");
		$("#nullValue").clone().appendTo($("#values"));
		$("#nullValue").show();
	} else if (CHK.operationType == CHK.OPERATION_TYPE.PDF) {
		for (var i = 1; i <= sceneCnt; i++) {
			sceneId = i;

			var checkListSceneDiv = $("<div/>", {class:"checkListSceneDiv"});
			checkListSceneDiv.append($("<div/>", {class:"checkListScene", onclick:"CHK.clickTaskList(" + sceneId + ")"}).append($("<div/>").text(sceneId + getMsg("page"))));
			checkListSceneDiv.append($("<div/>", {id:sceneId+"_accordionBtn", class:"accordionBtn"}).append($("<p/>").text("▽")));
			$("#values").append(checkListSceneDiv);
			$("#values").append($("<div/>", {id: sceneId + "_values", class:"sceneValues"}));

			// 表示中のシーンの作業リストはオープンするため、ボタンのスタイルを設定
			if (searchWord || CHK.pdf_pageNum == sceneId) {
				$("#" + sceneId + "_accordionBtn >p").css({transform: "rotate(180deg)", zIndex: "1"});
			}

			// 作業がないシーンの表示
			$("#nullValue").clone().appendTo($("#" + sceneId + "_values"));
			$("#nullValue").show();
		}
	}

	// 検索文の英文字と数字を半角、小文字に設定
	var convertedSearchWord = CHK.kataToHira(CHK.fullwidthTohalfwidth(searchWord)).toLowerCase();

	// 作業をシーンごとに配置・表示
	for (var i = 0; i < ckeckList.length; i++) {
		var ckeck = ckeckList[i];
		var taskReport = CHK.getRecentVersionReport(ckeck.name, ckeck.taskKey);
		var taskName = CHK.getTaskName(taskReport);
		sceneId = ckeck.sceneId;
		if (CHK.hasSearchWord(taskName, convertedSearchWord)) {
			var color = CHK.getTextColor(ckeck.name);
			var targetList = CHK.operationType == CHK.OPERATION_TYPE.DRAWING ? $("#values"): $("#" + sceneId + "_values");
			var onclickAction = CHK.operationType == CHK.OPERATION_TYPE.PDF ? "CHK.clickTaskList('" + sceneId + "', '" + ckeck.name + "')" : "CHK.clickTaskList('" + sceneId + "', '" + ckeck.name + "', " + ckeck.hotspot + ")";
			var checkListValue = $("<div/>", {class:'checkListValue', style:"color:" + color, onclick: onclickAction});
			checkListValue.append($("<div/>").append($("<span/>").text(ckeck.pointno)).append($("<div/>").text(taskName)));
			targetList.append(checkListValue);
			// 表示中のシーン以外の作業はクローズ
			var isOtherScene = CHK.operationType == CHK.OPERATION_TYPE.PDF ? CHK.pdf_pageNum != sceneId : krpano.get("xml.scene") != "scene" + sceneId;
			if (!searchWord && isOtherScene) {
				$("#" + sceneId + "_values").hide();
			}
			// 作業があるシーンの表示
			if ($("#" + sceneId + "_values #nullValue")) { // 360
				$("#" + sceneId + "_values #nullValue").remove();
				$("#" + sceneId + "_accordionBtn").css({ 'color': '#0068CB', 'background-color': '#fff', 'border': '1px solid #0068CB', 'cursor': 'pointer' });
			}
			if ($("#values > #nullValue")) { // 図面
				$("#values > #nullValue").remove();
			}
			// 合計作業数(検索結果)
			count++;
		}
	}
	$("#checkListNum").text(count);
	// 作業一覧が表示されてる状態でシーン移動すると、該当シーンの作業一覧にスクロール移動する
	if (!searchWord && CHK.operationType != CHK.OPERATION_TYPE.DRAWING) {
		var idx = CHK.operationType == CHK.OPERATION_TYPE.PDF? CHK.pdf_pageNum-1 : krpano.get("scene[get(xml.scene)].index");
		$("#values").scrollTop($($(".checkListSceneDiv")[idx]).position().top+$("#values").scrollTop()-$("#values").position().top);
	}
	// アコーディオンボタンクリックイベント
	$(".accordionBtn").on("click", function() {
		var panel = $(this).parent().next();
		if ($(panel.children()[0]).attr("id") == "nullValue") return;
		var btnImg = $($(this).children()[0]);
		if (panel.is(':visible') && $("#" + $(panel[0]).prop("id") + " .checkListValue").length > 0) {
			btnImg.animate({zIndex:0}, {duration:500, step:function(now){ btnImg.css({transform:'rotate(' + now * 180 + 'deg)'}); }, complete:function(){ }}); // アコーディオンボタンのイメージアニメーション
			panel.animate({zIndex:1}, {duration:500, step:function(now){ panel.css("max-height", 100-(now*100) + "%"); }, complete:function(){ panel.hide(); panel.css("max-height", ""); }}); // パネルを閉めるアニメーション
		} else {
			panel.show();
			btnImg.animate({zIndex:1}, {duration:500, step:function(now){ btnImg.css({transform:'rotate(' + now * 180 + 'deg)'}); }, complete:function(){ }}); // アコーディオンボタンのイメージアニメーション
			panel.animate({zIndex:1}, {duration:500, step:function(now){ panel.css("max-height", now*100 + "%"); }, complete:function(){ panel.css("max-height", ""); }}); // パネルを開くアニメーション
			$(this).parent().parent().animate({scrollTop: $(this).parent().position().top+$("#values").scrollTop()-$("#values").position().top }, 600, "swing"); // 作業一覧のスクロール移動アニメーション
		}
	});

	if (CHK.operationType == CHK.OPERATION_TYPE.PDF) {
		$("#checkList .checkListSceneDiv").css({"color": "#FFF"});
	}
}

/**
 * 文章のカタカナをひらがなに変換
 *
 * @param str 変換対象文章
 */
CHK.kataToHira = function(str) {
	if (str) {
		return str.replace(/[\u30a1-\u30f6]/g, function(match) {
			var chr = match.charCodeAt(0) - 0x60;
			return String.fromCharCode(chr);
		});
	}
	return "";
}

/**
 * 文章の全角を半角に変換（英文字と数字のみ）
 *
 * @param str 変換対象文章
 */
CHK.fullwidthTohalfwidth = function(str) {
	if (str) {
		return str.replace(/[Ａ-Ｚａ-ｚ０-９]/g, function(match) {
			var chr = match.charCodeAt(0) - 0xFEE0;
			return String.fromCharCode(chr);
		});
	}
	return "";
}

/**
 * targetStrを変換し、convertedSearchStrと比較する
 * targetStrがconvertedSearchStrの文字を含んだ場合はtrueを返す
 *
 * @param targetStr 検索対象文
 * @param convertedSearchStr 検索文
 */
CHK.hasSearchWord = function(targetStr, convertedSearchStr) {
	return CHK.kataToHira(CHK.fullwidthTohalfwidth(targetStr)).toLowerCase().indexOf(convertedSearchStr) != -1;
}

/**
 * 作業検索処理
 *
 */
CHK.searchTask = function() {
	CHK.updateTaskList($("#searchWord").val() ? $("#searchWord").val() : "");
}

/**
 * シーン名を取得
 *
 * @param sceneId シーンID
 */
CHK.getSceneName = function(sceneId) {
	var ret = "";
	if (sceneId == "0") {
		ret = getMsg("radarmap");
	} else {
		var sceneArray = krpano.get("scene").getArray();
		sceneArray.some(function(scene) {
			if (scene.name.substring(5) == sceneId) {
				ret = scene.title;
				return true;
			}
		});
	}
	return ret;
}

/**
 * 指摘No一覧のクリック処理
 *
 * @param name ホットスポット名
 * @param isHotspot true:ホットスポット false:レイヤー
 */
CHK.clickTaskList = function(sceneId, name, isHotspot) {
	if (CHK.operationType != CHK.OPERATION_TYPE.DRAWING && sceneId != "0" && CHK.getSceneId() != sceneId) {
		krpano.call("loadSceneAction(" + "scene" + sceneId + ", null, " + krpano.get("skin_settings.loadscene_flags") + ")");
		if (isHotspot && name) {
			CHK.lookHotspot = name;
		}
		else {
			CHK.lookHotspot = null;
		}
	}
	// シーン名項目クリック時の処理
	if (!name) {
		if ((sceneId != "0" && krpano.get("isOpen") == "1") || (sceneId == "0")) {
			// レーダーマップ項目クリック時の処理
			if (sceneId == "0" && krpano.get("isOpen") != "1" && !$("#0_values").is(':visible')) {
				$("#0_accordionBtn").click();
			}
			krpano.call("togglemap()");
		}
		return;
	}
	if ((isHotspot && krpano.get("isOpen") == "1") || (!isHotspot && krpano.get("isOpen") != "1")) {
		krpano.call("togglemap()");
	}
	if (isHotspot && CHK.operationType != CHK.OPERATION_TYPE.DRAWING) {
		krpano.call("hs_onclick_action(" + name + ", null, " + isHotspot + ")");
	} else {
		krpano.call("ly_onclick_action(" + name + ", null, " + isHotspot + ")");
	}
}

/**
 * 作業ホットスポットを取得
 *
 * @param name ホットスポット名
 * @param taskKey taskKey
 */
CHK.getTaskHotspot = function(name, taskKey) {
	if (!taskKey) taskKey = CHK.getTaskKeyByName(name);
	var ret;
	CHK.taskHotspot.hotspot.some(function(taskHotspot) {
		if (taskHotspot.taskKey == taskKey) {
			ret = taskHotspot;
			return true;
		}
	});
	return ret;
}

/**
 * taskIdを取得
 *
 * @param name ホットスポット名
 * @param taskKey taskKey
 */
CHK.getTaskId = function(name, taskKey) {
	if (!taskKey) taskKey = CHK.getTaskKeyByName(name);
	var ret = -1;
	CHK.taskHotspot.hotspot.some(function(hotspot) {
		if (hotspot.taskKey == taskKey) {
			ret = hotspot.taskId;
			return true;
		}
	});
	return ret;
}

/**
 * 指摘Noを取得
 *
 * @param taskReport 作業報告内容
 */
CHK.getPointNo = function(taskReport) {
	var ret = "";
	if (taskReport && taskReport.task) {
		for (var key in taskReport.task) {
			if (key.indexOf("q_1_") != -1) {
				ret = taskReport.task[key];
			}
		}
	}
	return ret;
}

/**
 * 作業名を取得
 *
 * @param taskReport 作業報告内容
 */
CHK.getTaskName = function(taskReport) {
	var ret = "";
	if (taskReport && taskReport.task) {
		for (var key in taskReport.task) {
			if (key.indexOf("q_2_") != -1) {
				ret = taskReport.task[key];
			}
		}
	}
	return ret;
}

/**
 * 作業報告情報を取得
 *
 * @param name ホットスポット名
 */
CHK.getTaskReport = function(name, taskKey, replyNo) {
	if (!taskKey) taskKey = CHK.getTaskKeyByName(name);
	if (!replyNo && replyNo != 0) replyNo = CHK.taskReplyNo? CHK.taskReplyNo : 0;
	var ret;
	if (!CHK.taskReport["taskReport_" + replyNo] || CHK.taskReport["taskReport_" + replyNo].length == 0) return ret;
	CHK.taskReport["taskReport_" + replyNo].some(function(taskReport) {
		if (taskReport.taskKey == taskKey) {
			ret = taskReport;
			return true;
		}
	});
	return ret;
}

/**
 * 作業の進捗を取得
 *
 */
CHK.getTaskProgress = function(name, taskKey) {
	var ret = "0";
	if (!taskKey) taskKey = CHK.getTaskKeyByName(name);
	var taskReport = CHK.getRecentVersionReport(taskKey);
	if (taskReport && taskReport.task) {
		for (var key in taskReport.task) {
			if (key.indexOf("q_3_") != -1) {
				ret = taskReport.task[key];
			}
		}
	}
	return ret;
}

/**
 * ホットスポットに設定するhtmlを取得
 *
 * @param name ホットスポット名
 * @param isHotspot true:ホットスポット false:レイヤー
 * @param value 表示する値
 */
CHK.getHotspotHtml = function(name, isHotspot, value) {
	//新規追加時
	if (!value) return "[img src=" + TARGET_IMAGE + " style='width:50px;height:50px;pointer-events:none;'][/img]";

	var color = CHK.getTextColor(name);
	if (isHotspot) {
		return "[font size='4' color='#ffffff' style='border-style:solid;border-width:1px;border-color:#ffffff;padding:5px 15px;background-color:" + color + ";'][b]" + value + "[/b][/font]";
	} else {
		if (CHK.operationType == CHK.OPERATION_TYPE.DRAWING) {
			return "[font color='#ffffff' style='border-style:solid;border-width:1px;border-color:#ffffff;padding:5px 15px;background-color:" + color + ";'][b]" + value + "[/b][/font]";
		} else {
			return "[font color='#ffffff' style='border-style:solid;border-width:1px;border-color:#ffffff;padding:5px 15px;background-color:" + color + ";'][b]" + value + "[/b][/font]";
		}
	}
}

/**
 * ホットスポットの文字色を取得
 *
 * @param name ホットスポット名
 */
CHK.getTextColor = function(name) {
	var ret = "#ff7700";
	//作業報告時は作業進捗によって文字色を判定
	var progress = CHK.getTaskProgress(name);
	if (progress == "999") ret = "#1b1bd2";
	return ret;
}

/**
 * ホットスポット名からtaskKeyを取得
 *
 * @param name ホットスポット名
 */
CHK.getTaskKeyByName = function(name) {
	if (name.indexOf("hs") != 0) return name; // PDFの場合、taskKeyをnameとして送る
	return name.substring(name.indexOf("-") + 1);
}

/**
 * seqIdを採番
 *
 */
CHK.getNextSeqId = function() {
	var seqId = 0;
	CHK.taskHotspot.hotspot.forEach(function(hotspot) {
		if (Number(hotspot.seqId) > seqId) {
			seqId = Number(hotspot.seqId);
		}
	});
	return seqId + 1;
}

/**
 * シーンIDを取得
 *
 */
CHK.getSceneId = function() {
	var scene = krpano.get("xml.scene");
	return scene.substring(5);
}

/**
 * 特定のホットスポットへ視点を移動
 *
 * @param name ホットスポット名
 */
CHK.lookToHotspot = function(name) {
	var fov = krpano.get("view.fov");
	krpano.call("looktohotspot(" + name + "," + fov + ")");
}

/**
 * UUIDを生成
 *
 */
CHK.generateUuid = function() {
	var chars = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("");
	for (var i = 0, len = chars.length; i < len; i++) {
		switch (chars[i]) {
			case "x":
				chars[i] = Math.floor(Math.random() * 16).toString(16);
				break;
			case "y":
				chars[i] = (Math.floor(Math.random() * 4) + 8).toString(16);
				break;
		}
	}
	return chars.join("");
}

/**
 * URLパラメータを取得
 *
 */
CHK.getUrlParameter = function() {
	var ret;
	if (location.search) {
		var param = {};
		location.search.substring(1).split('&').forEach(function(val) {
			var kv = val.split('=');
			param[kv[0]] = kv[1];
		});
		ret = param;
	}
	console.log({ret: ret});
	return ret;
}

/**
 * get command of API or Action
 *
 * @param command name
 */
CHK.getCommand = function(cmd) {
	if(CHK.isWeb) {
		return CHK.actCmd[cmd];
	} else {
		return CHK.apiCmd[cmd];
	}
}

/**
 * get URL for CMS action
 * @param action
 */
CHK.getActionUrl = function(action) {
	return CHK.getShopUrl() + "taskVtour/" + action + "/" + operationId + "/";
}

/**
 * get shop URL
 */
CHK.getShopUrl = function() {
	return baseUrl + "/shop/";
}

/**
 * 作業報告初期処理、CMS
 *
 * @param callback コールバック
 */
CHK.cmsAjax = function(url, param, callback) {
	$.ajax({
		type: "POST",
		url: url,
		data: param,
		dataType:"json",
		cache: false,
		success: function(result) {
			if (result.status == "200") {
				if(callback) callback(result);
			} else {
				CHK.showDialog(result.message, null, null, true);
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			CHK.showDialog(getMsg("errorOccurred"), null, null, true);
		}
	});
}

/**
 * ファイル情報のAPI送信処理
 *
 */
CHK.sendAttachedFile = function(taskKey, key, fileName, file, fileString, callback) {
	var url = CHK.getActionUrl(CHK.apiCmd.saveAttached);
	var formData = new FormData();

	formData.append('taskKey', taskKey);
	formData.append('attachedKey', key);
	formData.append('filename', fileName);
	// ファイル情報がstringかformか区別
	if (fileString) {
		formData.append('fileString', fileString);
	} else {
		formData.append('formFile', file, fileName);
	}

	CHK.sendEncodedFile(url, formData, callback);
}

/**
 * CMSでのOZDファイル編集後のTempファイル保存処理
 *
 * @param callback コールバック
 */
CHK.saveTempOzdForCms = function(type, taskKey, report, idx, callback) {
	var url = CHK.getActionUrl(CHK.apiCmd.saveAttached);
	var fileName = "taskReportOzd_" + idx;
	switch (type) {
		case CHK.REPORT_SAVE_TYPE.OZD:
			fileName += ".ozd";
			break;
		case CHK.REPORT_SAVE_TYPE.PDF:
			fileName += ".pdf";
			break;
		case CHK.REPORT_SAVE_TYPE.JPG:
			fileName += ".html";
			break;
	}
	var formData = new FormData();
	formData.append('taskKey', taskKey);
	formData.append('attachedKey', type);
	formData.append('filename', fileName);
	formData.append('ozdFileStr', report);
	formData.append('replyNo', CHK.taskReplyNo);

	CHK.sendEncodedFile(url, formData, callback);
}

/**
 * フォームデータのajaxでの送信処理
 *
 * @param callback コールバック
 */
CHK.sendEncodedFile = function(url, formData, callback) {
	jQuery.ajax({
		type: "POST",
		enctype: 'multipart/form-data',
		url: url,
		data: formData,
		processData: false,
		contentType: false,
		cache: false,
		timeout: 600000,
		success: function (result) {
			if (result.status == "200") {
				if (callback) {
					callback(result);
					if (callback.subCallback)
						callback.subCallback();
				}
			} else {
				CHK.showDialog(getMsg("errorOccurred") + "<br>" + result.message, null, null, true);
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			CHK.showDialog(getMsg("errorOccurred"), null, null, true);
		}
	});
}

/**
 * OZDレポートビューワ表示
 *
 * @param taskKey 作業タスクキー
 */
CHK.showOzdReport = function(taskKey, isPreview, saveMessage, replyNo, taskReportId, reportStartDate) {
	if (CHK.debug || CHK.isWeb) {
		// CMSでのOZDビューア表示処理
		// 保存、クリアボタンタップ時の対応
		$(window).off('message');
		$(window).on('message', function(e) {
			var jsonData = JSON.parse(e.originalEvent.data);
			var ozdAction = jsonData.action;
			switch (ozdAction) {
				case CHK.ozdCmd.ozdSave: {
					// OZD形式のファイル保存
					// 保存処理が完了すると、PDF保存処理をする
					CHK.saveTempOzdForCms(CHK.REPORT_SAVE_TYPE.OZD, taskKey, jsonData.report, replyNo, function() {
						$("#report_dialog").dialog('close');
						$("#report_dialog").empty();
						$("#checkInput").find("iframe")[0].contentWindow.setOzdAttachedInfo("taskReportOzd", replyNo);
						$("#checkInput").find("iframe")[0].contentWindow.saveTaskForReport();
						CHK.closeLoading();
					});
					break;
				}
				case CHK.ozdCmd.ozdOpened: {
					CHK.closeLoading();
					break;
				}
				case CHK.ozdCmd.fixed: {
					// 変更がある場合、OZD保存処理をする
					CHK.showLoading(saveMessage);
					// ダイアログの表示を待つ
					setTimeout(function(){
						var message = {action: CHK.ozdCmd.ozdSave};
						$("#reportViewer")[0].contentWindow.postMessage(JSON.stringify(message), "*");
					}, 500);
					break;
				}
				case CHK.ozdCmd.unfixed: {
					// 変更がない場合、閉じる処理のみ実行
					$("#report_dialog").dialog('close');
					$("#report_dialog").empty();
					CHK.closeLoading();
					break;
				}
			}
		});

		var src = CHK.getShopUrl() + "ozdViewer"
		+ "?taskId=" + CHK.getTaskId(null, taskKey)
		+ "&taskKey=" + taskKey
		+ "&operationId=" + operationId
		+ "&reportIdx=" + CHK.taskReplyNo;
		if (taskReportId && reportStartDate) {
			var taskReportInfoId = 0;
			var targetTaskReportInfo = CHK.taskReport.taskReport.filter(function(obj) {
				return obj.reportStartDate == reportStartDate;
			})[0];
			if (targetTaskReportInfo) taskReportInfoId = targetTaskReportInfo.taskReportInfoId;
			src += "&taskReportInfoId=" + taskReportInfoId;
		}

		$("#report_dialog").empty();
		var buttons = {};
		buttons[getMsg("Close")] = function() {
			// 閉じるボタンが押されたことをOZDビューアに通知(変更があるかを確認)
			if (isPreview) {
				$("#report_dialog").dialog('close');
				$("#report_dialog").empty();
				return;
			}
		};

		// index.htmlのreport_dialogにビューアを挿入
		$("#report_dialog").prepend("<iframe id='reportViewer' width='100%' height='100%' src='" + src + "' style='margin-top:5px;border-width:0px;' >"
				+ "</iframe>");

		$("#report_dialog").dialog({
			dialogClass: 'noTitleDialog ui-dialog-titlebar dialogNoBorder',
			autoOpen: false,
			resizable: false,
			modal: true,
			width: "80%",
			height: window.innerHeight*0.9,
			title: '',
			// 画面中央へ表示
			position: {
				my: 'center', at: "center", of: window
			},
			buttons: buttons,
			open: function(e) {
				$(e.target).parent().css('background-color', 'rgba(128,128,128)');
				$(e.target).parent().children(".ui-dialog-buttonpane").css('background-color', 'rgba(128,128,128)').css('border', 'none');
			},
			close: function() {
			}
		});

		$("#report_dialog").dialog('open');
		CHK.showLoading(getMsg("Processing_w_dot"));

	} else {
		// アプリへOZD表示コマンドを送信
		var apiParam = {};
		if (taskReportId) {
			apiParam.taskReportId = taskReportId;
			apiParam.reportStartDate = CHK_I.getInspectIsoDate(new Date(reportStartDate));
		}
		// 連続作業の場合
		if (window.parent.CHK.reportType == window.parent.CHK.REPORT_TYPE.WORKFLOW) {
			apiParam.phaseNo = CHK_PR.selectedPhaseInfo.phaseNo;
			apiParam.processKey = CHK_PR.selectedProcessKey;
			apiParam.addReport = addReportFlg; // REVIEW 定期点検や報告（回答）も対応させる場合は要動作確認
		}
		if (isPreview) {
			apiParam.cmd = CHK.getCommand("previewReportOzd");
			apiParam.taskKey = taskKey;
			apiParam.fileName = "taskReport_" + CHK.taskReplyNo + ".ozd";
			apiParam.taskReportLevel = CHK.taskReplyNo;
			CHK.sendABookCheckApi(apiParam);
		} else {
			var fileType = $("#checkInput").find("iframe")[0].contentWindow.getOzdFileTypeForApp();
			apiParam.cmd = CHK.getCommand("showReportOzd");
			apiParam.taskKey = taskKey;
			apiParam.fileName = "taskReport_" + CHK.taskReplyNo + "." + fileType.toLowerCase();
			apiParam.localSave = localSaveFlg;
			apiParam.addReport = addReportFlg;
			apiParam.taskReportLevel = CHK.taskReplyNo;
			CHK.sendABookCheckApi(apiParam);
		}
	}
}

/**
 * encode string
 *
 * @param str
 */
CHK.encodeParam = function(str) {
	if (CHK.isWeb) {
		return str;
	} else {
		return encodeURIComponent(str);
	}
}

/**
 * 自画面を閉じる
 *
 */
CHK.close = function() {
	if (CHK.isCms) {
		if (window.opener) {
			window.opener.location.href = reloadUrl;
		}
		CHK.unloadAuth();
		$(window).unbind("unload");
	}
	window.close();
	window.open('','_self').close(); // for chrome
}

/**
 * beforeunload処理を登録
 *
 */
CHK.setBeforeunload = function() {
	if (CHK.isCms) {
		$(window).bind("unload", function(eventObject) {
			CHK.unloadAuth();
			if (window.opener) {
				window.opener.location.href = reloadUrl;
			}
		});
	}
}

/**
 * ロック解除を依頼
 *
 * @param callback コールバック
 */
CHK.unloadAuth = function(callback) {
	$.ajax({
		async: false,
		url: CHK.getShopUrl() + "vtour/unloadAuth/" + contentId + "/",
		cache: false,
		success: function(result) {
			if (callback) callback();
		}
	});
}

/**
 * 拡大、縮小ボタン処理
 *
 */
CHK.changeZoom = function(flg) {
	if (CHK.operationType == CHK.OPERATION_TYPE.VTOUR) {
		//360
		CHK_V.changeZoom(flg);
	} else if (CHK.operationType == CHK.OPERATION_TYPE.DRAWING) {
		//図面
		CHK_Z.changeZoom(flg);
	}
}

/**
 * GPS情報を取得
 *
 * @param gpsType 1:自動 2:手動
 */
CHK.getGpsInfo = function(gpsType) {
	if (CHK.isWeb) {
		if (gpsType == "1") {
			// 自動の場合、web版で何も処理を行わないで処理中のダイアログを非表示にする
			CHK.closeLoading();
		} else {
			// 手動
			navigator.geolocation.getCurrentPosition(
				function (pos) {
					var gps = {};
					var crd = pos.coords;
					if (crd.latitude && crd.longitude) {
						gps.latitude = crd.latitude;
						gps.longitude = crd.longitude;
						$("#checkInput").find("iframe")[0].contentWindow.getGpsInfoAfter(gps);
					}
				},
				function (err) {
					console.log(err.message);
					CHK.closeLoading();
				},
				{
					enableHighAccuracy: true,
					timeout : 5000
				}
			);
		}
	} else {
		var apiParam = {};
		apiParam.cmd = CHK.getCommand("getGpsInfo");
		apiParam.gpsType = gpsType;
		apiParam.taskReportLevel = CHK.taskReplyNo;
		CHK.sendABookCheckApi(apiParam);
	}
	//DEBUG
	if (CHK.debug == "1") {
		var gps = {};
		gps.latitude = 35.658;
		gps.longitude = 139.754;
		$("#checkInput").find("iframe")[0].contentWindow.getGpsInfoAfter(gps);
	}
}

/**
 * アプリのヘルプ用に表示状態の変更を通知
 *
 * @param displayStatus 表示状態
 */
CHK.sendDisplayStatus = function(displayStatus, taskKey) {
	if (CHK.isWeb || !addReportFlg) return; // Webの場合とaddReportFlgがfalseの場合、通知不要
	var apiParam = {};
	apiParam.cmd = CHK.getCommand("changeDisplayStatus");
	apiParam.statusCode = displayStatus;
	apiParam.addReport = addReportFlg; // アプリで値が変わる場合があるため、ここでもパラメータ生成する
	if (taskKey && CHK.operationType == CHK.OPERATION_TYPE.PDF) apiParam.taskKey = taskKey;
	console.log(apiParam);
	CHK.sendABookCheckApi(apiParam);
}

/**
 * 作業報告書が表示中かどうかを返す
 *
 */
CHK.isShowingForm = function() {
	return $("#checkInput iframe").is(":visible");
}

/**
 * 関連資料ボタンタップ通知
 */
CHK.showRelatedContent = function(urlPath, contentId, pageNum) {
	var apiParam = {};
	if (!pageNum) pageNum = 1;
	var key = "";
	if (CHK.isWeb) {
		var url = CHK.getShopUrl() + "checkWebContent/onetimekey/" + contentId + "/"
		CHK.getOneTimeKey(url, function(key) {
			window.open("/acms/webvw/checkview.html?urlPath=" + urlPath + "&pageNo=" + pageNum + "&key=" + key);
		});
	} else {
		apiParam.cmd = CHK.getCommand("showRelatedContent");
		apiParam.contentId = contentId;
		apiParam.pageNum = pageNum;
		console.log(apiParam);
		CHK.sendABookCheckApi(apiParam);
	}
}


CHK.getOneTimeKey = function(url, callback) {
	$.ajax({
		type: "GET",
		url: url,
		cache: false,
		success: function(result) {
			if (callback) callback(result);
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			CHK.showDialog(getMsg("errorOccurred"), null, null, true);
		}
	});
}

/**
 * 全ホットスポットの表示・非表示ボタン処理
 *
 * @showFlg 処理後のホットスポット表示状態 false：非表示 true：表示
 */
CHK.toggleHotspotVisible = function(showFlg) {
	for (var hotspotIdx in CHK.taskHotspot.hotspot) {
		var hotspot = CHK.taskHotspot.hotspot[hotspotIdx];
		if (CHK.operationType == CHK.OPERATION_TYPE.PDF) {
			if (showFlg) {
				$(".hotspot[name=" + hotspot.taskKey +  "]").show();
			} else {
				$(".hotspot[name=" + hotspot.taskKey +  "]").hide();
			}
		} else {
			var target = CHK.operationType == CHK.OPERATION_TYPE.DRAWING? "layer" : "hotspot";
			krpano.call("set(" + target + "[" + hotspot.name + "].visible, " + showFlg + ")");
		}
	}
}

/**
 * アプリOZReport保存処理対応
 *
 */
CHK.saveOzReport = function() {
	$("#checkInput").find("iframe")[0].contentWindow.setOzdAttachedInfo("taskReport", CHK.taskReplyNo);
	// 連続作業の場合シンプルフォームに戻るため保存は行わない
	if (window.parent.CHK.reportType != window.parent.CHK.REPORT_TYPE.WORKFLOW) {
		$("#checkInput").find("iframe")[0].contentWindow.saveTaskForReport();
	}
}

/**
 * アプリOZReport一時保存処理対応
 *
 */
CHK.localSaveOzReport = function() {
	$("#checkInput").find("iframe")[0].contentWindow.setOzdAttachedInfo("taskReport", CHK.taskReplyNo);
	// 連続作業の場合シンプルフォームに戻るため保存は行わない
	if (window.parent.CHK.reportType != window.parent.CHK.REPORT_TYPE.WORKFLOW) {
		$("#checkInput").find("iframe")[0].contentWindow.saveTaskForReport(true);
	}
}

/**
 * アプリOZReportキャンセル処理対応
 *
 */
CHK.cancelOzReport = function() {
	// 連続作業の場合シンプルフォームに戻るためスキップ
	if (window.parent.CHK.reportType != window.parent.CHK.REPORT_TYPE.WORKFLOW) {
		$("#checkInput").find("iframe")[0].contentWindow.taskClose();
	}
}

/**
 * アプリOZReport削除処理対応
 *
 */
CHK.deleteOzReport = function() {
	$("#checkInput").find("iframe")[0].contentWindow.deleteTask();
}

/**
 * タスクの回答情報リストを取得
 *
 * @param taskKey taskKey
 */
CHK.getTaskReplyReportList = function(taskKey) {
	var taskReplyReportList = [];
	Object.keys(CHK.taskReport).forEach(function(key) {
		if (key != "taskReport_0") {
			CHK.taskReport[key].forEach(function(taskReport) {
				if (taskReport.taskKey == taskKey && (taskReport.task || taskReport.hasAuthority == CHK.HAS_AUTHORITY.TRUE)) {
					taskReplyReportList.push(taskReport);
					return false;
				}
			})
		}
	});
	return taskReplyReportList;
}

/**
 * タスクフォームの報告・回答転換時、リダイレクトするかしないかを判断
 *
 * @param taskKey taskKey
 */
CHK.isRedirectForm = function(taskKey) {
	var ret = true;
	if  (CHK.isCms || CHK.getTaskReport(null, taskKey, 1) && CHK.getTaskReport(null, taskKey, 0).hasAuthority != CHK.getTaskReport(null, taskKey, 1).hasAuthority) ret = false;
	return ret;
}

/**
 * OZレポート表示の場合、checkInputエレメントを透明に設定する
 *
 */
CHK.setTransparentCheckInput = function() {
	$("#checkInput").css("visibility", "hidden");
}

/**
 * 一番最近のバージョン値を取得
 *
 */
CHK.getRecentVersionNum = function(taskKey) {
	var ret = 0;
	Object.keys(CHK.taskReport).forEach(function(key) {
		CHK.taskReport[key].forEach(function(taskReport) {
			if (taskReport.taskKey == taskKey && taskReport.task && taskReport.task.version && taskReport.task.version > ret) {
				ret = taskReport.task.version;
			}
		});
	});
	return ret;
}

/**
 * 一番最近のバージョンのレポートを取得
 *
 */
CHK.getRecentVersionReport = function(name, taskKey) {
	var level;
	if (!taskKey) taskKey = CHK.getTaskKeyByName(name);
	var recentVersion = CHK.getRecentVersionNum(taskKey);
	Object.keys(CHK.taskReport).forEach(function(key) {
		CHK.taskReport[key].forEach(function(taskReport) {
			if (taskReport.taskKey == taskKey && taskReport.task && taskReport.task.version && taskReport.task.version == recentVersion) {
				level = key.split("_")[1];
				return false;
			}
		});
		if (level || level == "0") return false;
	});
	if (!level) level = 0;
	return CHK.getTaskReport(null, taskKey, level);
}
//絞り検索
CHK.getSelectDataJson = function(setIndex, itemIndex) {
	if(!CHK.questionApertureList){
		return;
	}
	//返還するjsonリストを生成する
	var returnList = new Array();

	var enqueteApertureJson;

	enqueteApertureJson =CHK.getEnqueteApertureJson(setIndex);


	if ( enqueteApertureJson != null){
		//子グループリスト取得
		Object.keys(enqueteApertureJson).forEach(function (key) {
			if(enqueteApertureJson[key].parent_id == itemIndex && enqueteApertureJson[key].parent_id != 0)
			{
				var itemObject = new Object();
				itemObject.id = enqueteApertureJson[key].item_id;
				itemObject.value = enqueteApertureJson[key].item_name;
				returnList.push(itemObject);
			}
		});
	}
	// ID順にソートして返却
    returnList.sort(function(a,b) {
        return a.id - b.id;
    });

	return returnList;
}

CHK.getEnqueteApertureJson = function(setIndex){
	var enqueteApertureJson = new Object();
	var apertureList = CHK.questionApertureList;
	var enqueteKey = "set_" + setIndex;

    Object.keys(apertureList).forEach(function (key) {
		if(key == enqueteKey)
		{
			enqueteApertureJson = apertureList[key];
		}
	});

    return enqueteApertureJson;
}

/**
* setからitemIdと同じparent＿idを持っているitemを探してListをreturnする
*/
CHK.getApertureSiblingList = function(setId, itemId) {

	var currentId = itemId;
	var itemDepth = -1;
	var returnList = new Array();

	var enqueteApertureJson = CHK.getEnqueteApertureJson(setId);
	var parent_id;
	if(currentId != "") {
		if(enqueteApertureJson != null) {
			Object.keys(enqueteApertureJson).forEach(function (key) {
				if(enqueteApertureJson[key].item_id == currentId)
				{
					itemDepth = enqueteApertureJson[key].depth;
					parent_id = enqueteApertureJson[key].parent_id;
				}
			});
		}
	}

	if(itemDepth != -1) {
		if(enqueteApertureJson != null){
			Object.keys(enqueteApertureJson).forEach(function (key){
				if(enqueteApertureJson[key].parent_id == parent_id && enqueteApertureJson[key].depth == itemDepth)
				{
					var itemObject = new Object();
					itemObject.id = enqueteApertureJson[key].item_id;
					itemObject.value = enqueteApertureJson[key].item_name;
					returnList.push(itemObject);
				}
			});
		}
	}
	// ID順にソートして返却
    returnList.sort(function(a,b) {
        return a.id - b.id;
    });

	return returnList;
}

/**
* 報告グループチェック時、報告グループ情報返還
* 絞り検索例外チェック処理追加
*/
CHK.getCheckResultGroupDataExist = function(setNo, itemId) {
	var result = new Object();
	result.saveFlag = false;
	result.group_id = 0;
	var enqueteApertureJson = CHK.getEnqueteApertureJson(setNo);

	if(CHK.workingGroup == null){
		return result;
	}

	Object.keys(enqueteApertureJson).forEach(function (key) {
 		if(enqueteApertureJson[key].item_id == itemId)
 		{
			if(enqueteApertureJson[key].group_flag)
			{
				if(Object.keys(CHK.workingGroup).length > 0)
				{
					Object.keys(CHK.workingGroup).forEach(function(taskGroup){
						var groupList = CHK.workingGroup[taskGroup];
						Object.keys(groupList).forEach(function(group){
							if(enqueteApertureJson[key].group_id == groupList[group].groupId)
							{
								result.group_id = groupList[group].groupId;
								result.saveFlag = true;
								result.groupName = groupList[group].groupName;
							}
						});
					});
				}
			}
 		}
 	});
	return result;
}

//#Bug 34466 関連対応
/**
 * Androidで修正したイメージのThumbnailを更新する。
 *
 * @param filename ファイル名
 * @param base64String base64ファイルデーター
 */
CHK.changeReportFormThumbnailImageForiOS = function(filename, base64String) {
	var targetContentwindow;
	if ($("#checkInput").find("iframe#reportForm0").length) {
		targetContentwindow = $("#checkInput").find("iframe#reportForm" + CHK.taskReplyNo)[0].contentWindow;
	} else {
		targetContentwindow = $("#checkInput").find("iframe")[0].contentWindow;
	}
	targetContentwindow.changeThumbnailTag(filename, base64String);
}

//#Bug 34466 関連対応
/**
 * Androidで修正したイメージのThumbnailを更新する。
 *
 * @param filePath ファイルパス
 * @param fileName ファイル名
 */
CHK.changeReportFormThumbnailImageForAnd = function(filename, filePath){
	var targetContentwindow;
	if ($("#checkInput").find("iframe#reportForm0").length) {
		targetContentwindow = $("#checkInput").find("iframe#reportForm" + CHK.taskReplyNo)[0].contentWindow;
	} else {
		targetContentwindow = $("#checkInput").find("iframe")[0].contentWindow;
	}
	targetContentwindow.changeThumbnailTagForAnd(filename, filePath);
}

/**
 * フォーム作成・切り替え時のフレーム表示処理
 * ロード終了時に非表示にする
 * フォームを閉じる時に削除
 *
 */
CHK.showWhiteFrame = function() {
	if (CHK.reportType == CHK.REPORT_TYPE.INSPECT) return;

	if ($("#whiteFrame").length == 0) {
		$("#checkInput").after($("<div/>", { id: "whiteFrame" }));
	}

	if (CHK.isWeb) {
		$("#whiteFrame").css("height", "calc(100% - 36px)");
		$("#whiteFrame").css("top", "36px");
	} else if (CHK.operationType == CHK.OPERATION_TYPE.PDF) {
		$("#whiteFrame").css("background-color", "#5c5c5c");
	}

	// リストではない場合フレームのサイズやオフセットを調整する
	if (CHK.operationType != CHK.OPERATION_TYPE.LIST) {
		$("#whiteFrame").width($("#checkInput").width());
		$("#whiteFrame").css("right", $("#checkInput").css("right"));
	}

	$("#whiteFrame").show();
}

/**
 * カテゴリー設定
 */
CHK.createCategory = function(operationGroupMasterList) {

    $('.group-category-list').remove();
    $("#groupMasterPath").empty();
    if (typeof CHK.operationGroupMasterId == 'undefined' || CHK.operationGroupMasterId == 0) {
        $("#groupMasterPath").append('<li class="breadcrumb-item"><a href="#" class="text-decoration-none text-dark">' + getMsg("all") + '</a></li>');
    } else {
        var groupMaster = operationGroupMasterList.filter(it => it.operationGroupMasterId == CHK.operationGroupMasterId)[0];
        var groupMasterPathIdlist = groupMaster.treePath.split('/');
        groupMasterPathIdlist.forEach( function (parentId){
            var pathOperationGroupMaster = operationGroupMasterList.filter(it => it.operationGroupMasterId == parentId)[0];
            $("#groupMasterPath").append('<li class="breadcrumb-item"><a onclick="CHK.changeOperationGroupMaster('
            + pathOperationGroupMaster.operationGroupMasterId + ');" class="text-decoration-none text-dark">'
            + pathOperationGroupMaster.operationGroupMasterName + '</a></li>');
        });
    }

	//サイドメニューカテゴリー構造作成
	operationGroupMasterList.sort((a, b) => (a.operationGroupMasterId > b.operationGroupMasterId) ? 1 : -1);
	var noCategory = $("<dl id='groupMasterId_0' class='group-category-list'><dt><a onclick='CHK.changeOperationGroupMaster(0);'>全て</a></dt></dl>");
	$('#category-menu').append(noCategory);
	//TODO operationGroupMasterId順番と深さの仕様確認要
	for (var i = 0; i < operationGroupMasterList.length; i++) {
	    if (operationGroupMasterList[i].operationGroupMasterLevel == 0 ){
	        var categoryParent = $("<dl id=groupMasterId_" + operationGroupMasterList[i].operationGroupMasterId
	            + " class='group-category-list' style='overflow-x:auto;'><dt class='menu-ttl'><a onclick='CHK.changeOperationGroupMaster("
	            + operationGroupMasterList[i].operationGroupMasterId + ");'>" + operationGroupMasterList[i].operationGroupMasterName
	            + "</a></dt></dl>");
            $('#category-menu').append(categoryParent);
	    } else {
	        var groupParents = '#groupMasterId_' + operationGroupMasterList[i].parentOperationGroupMasterId;
            if ($('#groupMasterId_'+ operationGroupMasterList[i].parentOperationGroupMasterId + '>ul').length > 0){
                categoryChild = $("<li  id='groupMasterId_" + operationGroupMasterList[i].operationGroupMasterId
                    + "' class=''><p class='category-li group-level-" + operationGroupMasterList[i].operationGroupMasterLevel
                    + "'><a class='category-a' onclick='CHK.changeOperationGroupMaster("
                    + operationGroupMasterList[i].operationGroupMasterId + ");'>" + operationGroupMasterList[i].operationGroupMasterName
                    + "</a></p></li>");
                $('#groupMasterId_' + operationGroupMasterList[i].parentOperationGroupMasterId + ' >ul').append(categoryChild);
            } else {
                $(groupParents + " > p").addClass("sub-menu-ttl");
                categoryChild = $("<ul style='display:none;' class=''><li class='' id='groupMasterId_" + operationGroupMasterList[i].operationGroupMasterId
                + "' class=''><p class='category-li group-level-"
                + operationGroupMasterList[i].operationGroupMasterLevel
                + "'><a class='category-a' onclick='CHK.changeOperationGroupMaster(" + operationGroupMasterList[i].operationGroupMasterId
                + ");'>" + operationGroupMasterList[i].operationGroupMasterName + "</a></p></li></ul>");
                $('#groupMasterId_' + operationGroupMasterList[i].parentOperationGroupMasterId).append(categoryChild);
            }
	    }
	}
	acdMenu();
};

/**
 * 保存したsortTypeから作業一覧を描画
 */
 CHK.createOperationListBySavedSortType = function() {
	let sortIndex = CHK_CONSTANT.SORT_TYPE.START_DATE_ASC;
	if (CHK.isIOS) {
		sortIndex = CHK_iOS.getSortType();
	} else if (CHK.isAndroid) {
        sortIndex = android.getSortType();
    } else if (CHK.isWindows) {
        if (CHK.sortIndex !== undefined) {
            console.log("CHK.sortIndex:" + CHK.sortIndex);
            sortIndex = CHK.sortIndex;
        }
    }
	let sortType = document.getElementsByClassName("sort-type")[sortIndex];
	CHK.changeSortType(sortType);
}

CHK.changeSortType = function(sortType) {
	$(".sort-type").removeClass("active");
	$(sortType).addClass("active");
	CHK.createOperationList(CHK.operation.operationList, true);
}

/**
 * 作業一覧描画
 */
CHK.createOperationList = function(operationList, isSearched = false) {
    $('#operationTable').empty();
    if (isSearched) {
        operationList = CHK.operation.searchOperationList;
    }
    if (operationList.length > 1) {
        var sortType = $(".sort-type.active").data("sort");
		if (isSearched) {
            if (CHK.isIOS) {
                webkit.messageHandlers.saveSortType.postMessage(sortType);
            } else if (CHK.isAndroid) {
                android.setSortType(sortType);
            } else {
                var param = {};
                param.cmd = CHK.getCommand("saveSortType");
                param.sortType = sortType;
                CHK.sendABookCheckApi(param);
			}
		}
        switch(sortType) {
            case CHK_CONSTANT.SORT_TYPE.NAME:
				operationList.sort(function(a,b) {
					if (a.operationName > b.operationName) return 1;
					if (a.operationName < b.operationName) return -1;
					return 0;
				});
                break;
            case CHK_CONSTANT.SORT_TYPE.START_DATE_DESC:
				operationList.sort(function(a,b) {
					if (setOperationDate(a.operationStartDate) < setOperationDate(b.operationStartDate)) return 1;
					if (setOperationDate(a.operationStartDate) > setOperationDate(b.operationStartDate)) return -1;
					return 0;
				});
                break;
            case CHK_CONSTANT.SORT_TYPE.START_DATE_ASC:
				operationList.sort(function(a,b) {
					if (setOperationDate(a.operationStartDate) > setOperationDate(b.operationStartDate)) return 1;
					if (setOperationDate(a.operationStartDate) < setOperationDate(b.operationStartDate)) return -1;
					return 0;
				});
                break;
            case CHK_CONSTANT.SORT_TYPE.TYPE:
				operationList.sort(function(a,b) {
					if (a.operationType < b.operationType) return 1;
					if (a.operationType > b.operationType) return -1;
					return 0;
				});
                break;
            case CHK_CONSTANT.SORT_TYPE.LAST_EDIT_DATE:
				operationList.sort(function(a,b) {
				    if (!a.operationOpenDate) {
				        a.operationOpenDate = "1900-01-01 09:00:00";
				    }
				    if (!b.operationOpenDate) {
                        b.operationOpenDate = "1900-01-01 09:00:00";
                    }
					if (a.operationOpenDate < b.operationOpenDate) return 1;
					if (a.operationOpenDate > b.operationOpenDate) return -1;
					return 0;
				});
                break;
        }
    }
    for (var i = 0; i < operationList.length; i++) {
	    var operationTR = $("<tr/>");
		//TODO aタグlist.html 転移処理
		var operationNameTd;
		if (operationList[i].permitCodeRequiredFlg == 1) {
		     operationNameTd = $("<td class='operationId_" + operationList[i].operationId
            		    + "'><a href=\"javascript:CHK.displayAlert('onlyRfid');\" class='d-block text-black text-decoration-none mb-1'>" + operationList[i].operationName
            		    + "</a><div class='fa-sm mobile_operation_date'><i class='far fa-clock fa-blue' style='color:blue;margin-right:10px'></i>"
            		    + setOperationDate(operationList[i].operationStartDate) + " ~ "
            		    + setOperationDate(operationList[i].operationEndDate) +"</div></td>");
		} else {
             operationNameTd = $("<td class='operationId_" + operationList[i].operationId
                        + "'><a href=\"javascript:CHK_L.sendAppCommand('goOperation', '"
                        + operationList[i].operationId + "', '" + operationList[i].contentId
                        + "');\" class='d-block text-black text-decoration-none mb-1'>" + operationList[i].operationName
                        + "</a><div class='fa-sm mobile_operation_date'><i class='far fa-clock fa-blue' style='color:blue;margin-right:10px'></i>"
                        + setOperationDate(operationList[i].operationStartDate) + " ~ "
                        + setOperationDate(operationList[i].operationEndDate) +"</div></td>");
		}

		var operationStartDateTd = $("<td/>", {class: "operationStartDate"}).text(setOperationDate(operationList[i].operationStartDate));
		var operationEndDateTd = $("<td/>", {class: "operationEndDate"}).text(setOperationDate(operationList[i].operationEndDate));

        var iconTd = operationList[i].operationType == CHK.OPERATION_TYPE.VTOUR ? $("<td class='p-2'> <button class='btn btn-outline-primary fs-8 py-2' onclick=\"javascript:CHK_L.sendAppCommand('goPanoramaEdit', '" + operationList[i].operationId + "', '" + operationList[i].contentId + "');\">VR</button> </td>") : $("<td class='p-2' />");

		operationTR.append(operationNameTd);
        operationTR.append(operationStartDateTd);
        operationTR.append(operationEndDateTd);
		operationTR.append(iconTd);

		$(".table tbody").append(operationTR);
	}
};

/**Oper
 * Date表示（yyyy/MM/dd）hh以下省略
 */
function setOperationDate(date){
	var operationDate = date.replace(/-/g, "/").substring(0,10);
	return operationDate;
};

/**
 * 作業一覧検索
 */
CHK.search = function() {
    var searchKeyword = $("#searchTaskName").val();
    var searchStartDate = $("#searchStartDate").val();
    var searchEndDate = $("#searchEndDate").val();
    var operationGroupMasterId = CHK.operationGroupMasterId;
    var searchResult;

	if((searchStartDate && searchEndDate) && (searchStartDate > searchEndDate)){
		CHK.displayAlert("dateError");
		return;
	}

    searchResult = CHK.operation.operationList.filter(function(operation) {
        var result = true;
        if (searchKeyword.length) {
            result = result * operation.operationName.includes(searchKeyword);
        }
        if (searchStartDate.length && !searchEndDate.length) {
            result = result * (operation.operationStartDate >= searchStartDate);
        }
        if (searchEndDate.length && !searchStartDate.length) {
            result = result * (operation.operationEndDate <= searchEndDate);
        }
        if (searchStartDate.length && searchEndDate.length) {
            result = result * ((operation.operationStartDate <= searchEndDate) && (operation.operationEndDate >= searchStartDate));
        }

        if (operationGroupMasterId != 0) {
            var operationGroupMasterIdList = CHK.operationGroupMasterRelation.operationGroupMasterRelationList.filter(function(operationGroupMasterRelation) {
                return operationGroupMasterRelation.operationId == operation.operationId;
            })
            result = result * operationGroupMasterIdList.filter(function(operationGroupMaster){
                return operationGroupMaster.operationGroupMasterId == operationGroupMasterId;
            }).length;
        }
        return result;
    })
    CHK.isSearched = true;
    CHK.operation.searchOperationList = searchResult;
    CHK.createOperationList(searchResult, CHK.isSearched);
};

/**
 * 検索条件をセット
 */
CHK.setSearchInfo = function(taskName, startDate, endDate) {
	$("#searchTaskName").val(taskName);
	$("#searchStartDate").val(startDate);
	$("#searchEndDate").val(endDate);
}

// カテゴリーのドロワーメニュー開閉
function acdMenu() {
    //デフォルトでアコーディオンの中身を非表示
    $(".drawer-menu dd").css("display", "none");
    $(".drawer-menu2 ul").css("display", "none");

    //第2階層のアコーディオン　
    $(".drawer-menu dt").on('click', function() {
        $(".sub-menu-ttl").removeClass("openAcd").next().slideUp("fast");
        $(".drawer-menu dt").not(this).removeClass("open").next().slideUp("fast");
        $(this).toggleClass("open").next().slideToggle("fast");
    });

    //第3階層のアコーディオン
    $(".sub-menu-ttl").on('click', function() {
        $(".sub-menu-ttl").not($(this)).not($(this).parents().siblings("p")).removeClass("openAcd").next().slideUp("fast");
        $(this).toggleClass("openAcd").next().slideToggle("fast");
    });
}

CHK.changeOperationGroupMaster = function(operationGroupMasterId) {
    if ($("#category-menu").hasClass("open")) {
         $('#category-toggle-button').click();
    }
    CHK.operationGroupMasterId = operationGroupMasterId;
    CHK.createCategory(CHK.operationGroupMaster.operationGroupMasterList);
    CHK.search();
}

CHK.startScan = function() {
    try {
      if (CHK.isAndroid) {
        android.startScan();
      } else if (CHK.isIOS) {
        webkit.messageHandlers.startScan.postMessage({});
      }
    } catch (e) {
      return;
    }
    $(".scan-overlay").removeClass("d-none");
    $(".scan-area").removeClass("d-none");
}

CHK.scanClose = function() {
    try {
      if (CHK.isAndroid) {
        android.stopScan();
      } else if (CHK.isIOS) {
        webkit.messageHandlers.stopScan.postMessage({});
      }
    } catch (e) {
      return;
    }
    $(".scan-overlay").addClass("d-none");
    $(".scan-area").addClass("d-none");
}

CHK.scanResult = function(scannedCode, scanType) {
    if (scannedCode == null || !(scannedCode.length)) {
        return;
    }
    CHK.scanClose();
    var operationList = CHK.operation.searchOperationList;
    var scannedOperation = operationList.filter(function(operation) {
        var resultCode =  scannedCode;
        if (scanType == 1)  {
            resultCode =  scannedCode.substring(4);
        }
        return operation.permitCode == resultCode;
    })[0];
    if (scannedOperation != null) {
        CHK.sendScanResult('goOperation', scannedOperation.operationId, scannedOperation.contentId, scanType);
    } else {
        CHK.displayAlert("notExistCode");
    }
}

CHK.sendScanResult = function (command, operationId, contentId, scanType) {
    var param = {};
    param.cmd = CHK.getCommand(command);
    param.operationId = operationId;
    param.contentId = contentId;
    param.scanType = scanType;
    CHK.sendABookCheckApi(param);
}


CHK.alertClose = function() {
    $(".alert-overlay").addClass("d-none");
    $(".alert-area").addClass("d-none");
	$("body").css("overflow", "visible");
}

CHK.displayAlert = function(msgCode) {
    $("#alertMsg").html(getMsg(msgCode));
    $(".alert-overlay").removeClass("d-none");
    $(".alert-area").removeClass("d-none");
	var positionY = $(document).scrollTop() + screen.height/8;
	var height = screen.height/4;

	$(".alert-area").css("top", positionY);
	$(".alert-area").css("min-height", height);
	$("body").css("overflow", "hidden");
}

CHK.resetSearch = function() {
    $('#searchTaskName').val('');
    $('#searchStartDate').val('');
    $('#searchEndDate').val('');
    CHK.changeSortType($('#defaultSort'));
}