// デバッグ用フラグ // コミット時には必ず false に設定すること const DEBUG_FLG = false; // アプリID const APP_ID = "sp179"; // 汎用APIの戻り値:正常終了 const STATUS_CODE_OK = "00"; // 入力可能文字数:ニックネーム const MAX_LENGTH_NICKNAME = 10; // 入力可能文字数:作品タイトル const MAX_LENGTH_TITLE = 15; // 入力可能文字数:作品ひとこと説明 const MAX_LENGTH_DESCRIPTION = 200; // アップロード可能最大サイズ const MAX_UPLOAD_SIZE = 25 * 1024 * 1024; // ログインログを送信したかどうかをクッキーで管理するためのクッキー名 const SEND_LOGIN_LOG = "send_login_log"; // kagaku.jsを使用しているイマクリの画面のロード時に現在のURLをクッキーに保存する // この情報はScratch画面で遷移元の画面に戻る際に使用される window.addEventListener("DOMContentLoaded", function() { var currentUrl = encodeURIComponent(window.location.href); document.cookie = "imakuri_referer=" + currentUrl + "; path=/" + ((DEBUG_FLG) ? "" : " ;secure"); }, {once: true}); // 認証クッキーから会員番号を取得する // 取得できない場合は、nullを返す function getKaiinNo() { var authCookieValue = null; var r = document.cookie.split(';'); r.forEach(function(value) { var content = value.split('='); if ("fnssso_https_key" == content[0].trim()) { authCookieValue = content[1]; } }); if (authCookieValue == null) { return null; } r = window.atob(decodeURIComponent(authCookieValue)).split(':'); return r[0]; } // 講座情報Jsonから指定された学年、月の // データを返す // 取得に失敗、解析に失敗した場合は、エラー画面へ遷移する function getKozaJson(callback, grade, month) { if (isNullOrEmpty(grade) || isAllSpace(grade)) { moveError("Error-0001"); return; } if (isNullOrEmpty(month) || isAllSpace(month)) { moveError("Error-0001"); return; } getKozaJsonList(function(result, kozaJson) { if (!result) { moveError("Error-0001"); return; } try { var kozaInfos = kozaJson.koza_info; for (var i = 0; i < kozaInfos.length; i++) { var kozaInfo = kozaInfos[i]; if (kozaInfo.grade == grade && kozaInfo.month == month) { callback(true, kozaInfo, kozaJson.login_base_url); return; } } moveError("Error-0001"); return; } catch (err) { moveError(); return; } }); } // 講座情報Jsonファイルの中身をすべて取得して、JSONオブジェクトとして返す // 返却はコールバック関数で行う // 取得に失敗、解析に失敗した場合は、エラー画面へ遷移する function getKozaJsonList(callback) { // キャッシュされないよう設定 $.ajaxSetup({ cache: false, timeout: 30000, }); var kozaJsonPath = getKozaJsonPath(); $.getJSON(kozaJsonPath) .done(function(json){ callback(true, json); }) .fail(function(){ moveError("Error-0001"); }); } // エラー画面へ遷移する // 引数が無い場合はデフォルトで Error-0999 が設定される function moveError(errorCode) { var param = (typeof errorCode === "undefined" || errorCode == null) ? "Error-0999" : errorCode; var protocol = location.protocol; var host = location.host; window.location.href = protocol + "//" + host + "/op/kagaku/app/all/html/error.html?err_code=" + param; } // 講座情報のJsonファイルのURLを返す function getKozaJsonPath() { var protocol = location.protocol; var host = location.host; return protocol + "//" + host + "/op/kagaku/app/l" + getLine() + "/contents/koza_info.json"; } // コンテンツが格納されているディレクトリまでのURLを返す function getContentsPath() { var protocol = location.protocol; var host = location.host; return protocol + "//" + host + "/op/kagaku/app/l" + getLine() + "/contents/"; } // URLパラメータから月号を取得する function getMonth() { const month = location.search.match(/month=(.*?)(&|$)/); return (month) ? decodeURIComponent(month[1]) : null; } // URLパラメータから学年を取得する function getGrade() { const grade = location.search.match(/grade=(.*?)(&|$)/); return (grade) ? decodeURIComponent(grade[1]) : null; } // 現在のURLからラインを取得する function getLine() { var s = location.href.split("/"); return s[6].replace("l", ""); } // 各月号ごとのコンテンツディレクトリを返す // http://localhost:81/op/kagaku/app/l10/contents/grade_3/month_08/ // のようなURL function getContentsDirURL(grade, month) { var protocol = location.protocol; var host = location.host; return protocol + "//" + host + "/op/kagaku/app/l" + getLine() + "/contents/grade_" + grade + "/month_" + month + "/"; } // ごほうび用SB3ファイルが格納されているディレクトリURLを返す function getSb3ContentsDirURL() { var protocol = location.protocol; var host = location.host; return protocol + "//" + host + "/member/kagaku/app/l" + getLine() + "/sb3-contents/"; } // 発表会HTML格納URLを返す function getAwardURL() { var protocol = location.protocol; var host = location.host; return protocol + "//" + host + "/op/kagaku/app/l" + getLine() + "/award/"; } // Scratch画面URLを返す function getScratchURL() { var protocol = location.protocol; var host = location.host; return protocol + "//" + host + "/member/kagaku/app/all/scratch/build/index.html"; } // 投稿フォーム画面URLを返す function getToukouFormURL(grade, month) { var protocol = location.protocol; var host = location.host; return protocol + "//" + host + "/member/kagaku/app/l" + getLine() + "/servlet/toukou_form/init?grade=" + getGrade() + "&month=" + getMonth(); } // 指定された値がNULLか空文字かを返す function isNullOrEmpty(val) { if (val == null) { return true; } if (val == "") { return true; } return false; } // 指定された値が全半角スペースのみかを返す function isAllSpace(val) { val = val.split(' ').join(''); val = val.split(' ').join(''); if (val == "") { return true; } } // 後方一致の判定結果を返す function isBackwardMatch(target, str){ var user = window.navigator.userAgent.toLowerCase(); if (user.indexOf('msie') != -1 || user.indexOf('trident') != -1 ) { // IEがendsWithに対応していないので正規表現で代用 var reg = new RegExp("^.*" + str + "$"); return target.match(reg); } else { // IE以外はendsWithを使う return target.endsWith(str); } } // KVS利用時のデータ名称を返す function getKVSDataName() { return "l" + getLine() + "_" + getGrade() + "_" + getMonth(); } // KVSへの投稿有無を返す function chkToukou(line, grade, month, kaiinNo, callback) { if (line == null || line.lengh == 0) { moveError("Error-0005"); return; } if (grade == null || grade.lengh == 0) { moveError("Error-0005"); return; } if (month == null || month.lengh == 0) { moveError("Error-0005"); return; } if (kaiinNo == null || kaiinNo.lengh == 0) { moveError("Error-0005"); return; } var dataName = "l" + line + "_" + grade + "_" + month; var json = {}; json.app_id = APP_ID; json.user_key = kaiinNo; var keyValues = []; var keyValue = {}; keyValue.data_name = dataName; keyValues.push(keyValue); json.key_values = keyValues; kvslib.get(json, function(status, out, req) { if ((status == STATUS_CODE_OK && req.status == 200) || out.errors[0].error_code == "WE07-0111-R024") { try { if (out.key_values.length == 0) { callback(false); } else { callback(true); } return; } catch(e) { } callback(false); } else { moveError("Error-0006"); } }); } // KVSへの投稿を行なう function registToukou(kaiinNo, line, grade, month, nickName, title, discription, fileName, toukouDate) { if (kaiinNo == null || kaiinNo.lengh == 0) { moveError("Error-0004"); return; } if (line == null || line.lengh == 0) { moveError("Error-0004"); return; } if (grade == null || grade.lengh == 0) { moveError("Error-0004"); return; } if (month == null || month.lengh == 0) { moveError("Error-0004"); return; } if (nickName == null || nickName.lengh == 0) { moveError("Error-0004"); return; } if (title == null || title.lengh == 0) { moveError("Error-0004"); return; } if (discription == null || discription.lengh == 0) { moveError("Error-0004"); return; } if (fileName == null || fileName.lengh == 0) { moveError("Error-0004"); return; } if (toukouDate == null || toukouDate.lengh == 0) { moveError("Error-0004"); return; } var dataName = "l" + line + "_" + grade + "_" + month; var json = {}; json.app_id = APP_ID; json.user_key = kaiinNo; var keyValues = []; var item = {}; item.data_name = dataName; var keyValue = {}; keyValue.line = line; keyValue.grade = grade; keyValue.month = month; keyValue.nickname = nickName; keyValue.title = title; keyValue.description = discription; keyValue.sb3_file_name = fileName; keyValue.posted_time = toukouDate; item.key_value = keyValue; keyValues.push(item); json.key_values = keyValues; kvslib.post(json, function(status, out, req) { if (status == STATUS_CODE_OK && req.status == 200) { return; } else if (out.errors[0].error_code == "WE07-0111-C023") { kvslib.put(json, function(status, out, req) { if (status == STATUS_CODE_OK && req.status == 200) { return; } else { moveError("Error-0003"); } }); } else { moveError("Error-0002"); } }); } // ログインログを送信する function sendLoginLog(line, screenId) { var alreadySend = false; var r = document.cookie.split(';'); r.forEach(function(value) { var content = value.split('='); if (SEND_LOGIN_LOG == content[0].trim()) { alreadySend = true; } }); if (!alreadySend) { document.cookie = SEND_LOGIN_LOG + "=true; path=/; secure"; var json = createSendLogJson(line, screenId, "login", null); sendLog(json); } } /** * 日付をフォーマットする * @param {Date} date 日付 * @param {String} [format] フォーマット * @return {String} フォーマット済み日付 */ var formatDate = function (date, format) { if (!format) { format = 'YYYY-MM-DD hh:mm:ss.SSS'; } format = format.replace(/YYYY/g, date.getFullYear()); format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2)); format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2)); format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2)); format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2)); format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2)); if (format.match(/S/g)) { var milliSeconds = ('00' + date.getMilliseconds()).slice(-3); var length = format.match(/S/g).length; for (var i = 0; i < length; i++) { format = format.replace(/S/, milliSeconds.substring(i, i + 1)); } } return format; }; // 操作ログ送信用のJSONを返す function createSendLogJson(line, screenId, action, toukouInfo) { var logsItem = {}; logsItem.date = formatDate(new Date()); logsItem.user_key = getKaiinNo(); logsItem.line = "20" + line; logsItem.app_id = APP_ID; logsItem.screen_id = screenId; logsItem.action = action; if (toukouInfo != null) { logsItem.tags = "toukou_info=" + toukouInfo; } var logsArray = []; logsArray.push(logsItem); var logs = {}; logs.logs = logsArray; var json = {}; json.app_id = APP_ID; json.params = logs; return json; } // 操作ログを送信する function sendLog(json) { loglib.add(json, function(status, out, req) { if (status == STATUS_CODE_OK && req.status == 200) { return; } else { // エラーでもエラー画面へは遷移しない return; } }); }