キャリアアップ
※ダミーデータで表示中
直近で開催するイベントがないため、「一昨日」「昨日」「今日」「明日」「明後日」のいずれかを開催日としてランダムで設定しています。
受付時間がここに表示されます。
ローカルファイルとして保存する場合、下のHTMLソースをテキストエディタ(メモ帳など)で、
拡張子を「.html」または「.htm」として保存してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>イベントタイムテーブル</title> <script type="text/javascript"><!-- // 表示するタイムスパン(分) var timeSpan = 60; // イベント情報 var info = { name: "ラッドシティ収穫祭", date: [2011, 10, 30], times: { "【南瓜行列】": [[ 9, 0, 18, 0]], "バトルダンス": [[ 9, 0, 9, 20], [10, 0, 10, 20], [11, 0, 11, 20], [13, 0, 13, 20], [14, 0, 14, 20], [15, 0, 15, 20], [16, 0, 16, 20], [17, 0, 17, 20], [18, 0, 18, 20]], "グルメキング": [[ 9, 0, 10, 30], [10, 30, 12, 0], [12, 0, 13, 30], [13, 30, 15, 0], [15, 0, 16, 30], [16, 30, 18, 0]], "事件": [[ 9, 25, 9, 55], [10, 25, 10, 55], [11, 25, 11, 55], [13, 25, 13, 55], [14, 25, 14, 55], [15, 25, 15, 55], [16, 25, 16, 55], [17, 25, 17, 55]], "メイズ": [[ 9, 30, 11, 20], [11, 30, 13, 20], [13, 30, 15, 20], [15, 30, 17, 20], [17, 30, 18, 20]] } }; // ここまでイベント情報 // 以下、基幹部分なので書き換えないでください var current = new Date(); var cutOff = new Date(); if (isNaN(timeSpan) || timeSpan == 0){timeSpan = 60;} if (timeSpan < 0){timeSpan *= -1;} cutOff.setMinutes(cutOff.getMinutes()+timeSpan); var timePattern = /^\s*(\d+):(\d+)〜(\d+):(\d+)\s*(\S+?)[12345678901234567890]*\s*$/ function parseTimeTable(_value, _resultId) { if (!_value){return;} var lines = _value.split("\n"); var tables = {}; var key = null; for (var i=0, l=lines.length; i<l; i++) { matcher = lines[i].match(timePattern); if (!matcher){continue;} key = matcher[5]; if (!tables[key]){tables[key] = [];}; tables[key].push("[" + parseInt(matcher[1], 10) + ", " + parseInt(matcher[2], 10) + ", " + parseInt(matcher[3], 10) + ", " + parseInt(matcher[4], 10) + "]"); } var results = []; for (key in tables) { results.push("\"" + key + "\": [" + tables[key].join(", ") + "]"); } document.getElementById(_resultId).value = ( "info = {\n" +"name: \"リアルタイムイベント\",\n" +"date: [" + current.getFullYear() + ", " + (current.getMonth()+1) + ", " + current.getDate() + "],\n" +"times: {\n" + results.join(",\n") + "\n}" +"\n};" ); } function isOpened(_date, _obj) { if (!_obj || !_date){return false;} var hour = _date.getHours(); var objHour = _obj[0]; return (!(objHour > hour || (objHour == hour && _obj[1] > _date.getMinutes()))); } function isClosed(_date, _obj) { if (!_obj || !_date){return false;} var hour = _date.getHours(); var objHour = _obj[2]; return (objHour < hour || (objHour == hour && _obj[3] < _date.getMinutes())); } function getTimeSpan(_date, _hour, _min) { var dHour = _date.getHours(); var dMin = _date.getMinutes(); var spanValue = Math.abs((dHour - _hour) * 60 + (dMin - _min)); var spanText = (spanValue > 60 ? (Math.floor(spanValue/60)+"時間") : "") + (spanValue%60) + "分"; return spanText; } function loadEventTable(_elmId) { var times = info.times; var onBooking = ["今受付中のイベント"]; var spanHour = Math.floor(timeSpan/60); var spanMin = Math.floor(timeSpan%60); var nextBooking = [(spanHour>0?(spanHour+"時間"):"")+(spanMin>0?(spanMin+"分"):"")+"以内に受け付けるイベント"]; var tmp = null; var hotInfo = null; var warmInfo = null; for (var key in times) { tmp = times[key]; if (tmp.length == 0){continue;} var hotInfo = tmp[0]; if (isOpened(current, hotInfo) && !isClosed(current, hotInfo)) { onBooking.push(key + "(" + hotInfo[2] + ":" + hotInfo[3] + "まで:あと" + getTimeSpan(current, hotInfo[2], hotInfo[3]) +"で終了)"); } // 次の受付時間 if (!isOpened(current, hotInfo) && isOpened(cutOff, hotInfo)) { nextBooking.push(key + "(" + hotInfo[0] + ":" + hotInfo[1] + "から:あと" + getTimeSpan(cutOff, hotInfo[0], hotInfo[1]) +"で開始)"); } else if ((warmInfo = tmp[1]) && isOpened(cutOff, warmInfo)) { nextBooking.push(key + "(" + warmInfo[0] + ":" + warmInfo[1] + "から:あと" + getTimeSpan(cutOff, warmInfo[0], warmInfo[1]) +"で開始)"); } } var results = ""; if (onBooking.length>1) { results += onBooking.join("<br> ") + "<br>"; } if (nextBooking.length>1) { results += nextBooking.join("<br> ") + "<br>"; } document.getElementById(_elmId).innerHTML = current.getHours() + "時" + current.getMinutes() + "分時点<br>" + (results || "受け付けているイベントがありません。"); } function arrayRemoveAt(_array, _index, _size) { if (_index === undefined){return [];} var size = (_size === undefined ? (_array.length - _index) : _size); return _array.splice(_index, size); } (function() { var cYear = current.getFullYear(); var cMonth = current.getMonth() + 1; var cDate = current.getDate(); var xDay = info.date; var xYear = xDay[0]; var xMonth = xDay[1]; var xDate = xDay[2]; if (xYear < cYear || (xYear == cYear && xMonth < cMonth) || (xYear == cYear && xMonth == cMonth && xDate < cDate)) { loadEventTable = function(_elmId){document.getElementById(_elmId).innerHTML = ("『" + info.name + "』は受付を終了しています。");}; return; } else if (xYear > cYear || (xYear == cYear && xMonth > cMonth) || (xYear == cYear && xMonth == cMonth && xDate > cDate)) { var spanMilliSec = (new Date(info.date[0], info.date[1]-1, info.date[2]).getTime() - new Date(current.getFullYear(), current.getMonth(), current.getDate()).getTime()) / (1000*60*60*24); loadEventTable = function(_elmId){document.getElementById(_elmId).innerHTML = ("『" + info.name + "』はまだ開催していません。<br>" + (spanMilliSec) + "日後に開催します。");}; return; } else { var currentHour = current.getHours(); var currentMinutes = current.getMinutes(); var times = info.times; var tmp = null; var i = len = 0; for (var key in times) { tmp = times[key]; for (i=tmp.length-1; i>=0; i--) { if (isClosed(current, tmp[i])) { arrayRemoveAt(tmp, 0, i+1); break; } } } } })(); // --></script> </head> <body> <div id="time_table">受付時間がここに表示されます。</div> <script type="text/javascript"><!-- loadEventTable("time_table"); // --></script> <hr> <textarea rows="5" cols="30" onfocus="this.select();" onchange="parseTimeTable(this.value, 'time_json');">タイムテーブルを貼り付けてください</textarea> <textarea rows="5" cols="60" onfocus="this.select();" id="time_json">管理オブジェクト(「info=」の右側)と差し換えてください</textarea> </body> </html>