';}
function startRhythmTest(){if(rhythmTest.running)return;rhythmTest={running:true,interval:null,beatTime:0,count:0,errors:[]};document.getElementById('rhythm-start-btn').disabled=true;document.getElementById('rhythm-count').textContent='0';var target=document.getElementById('rhythm-target');var bpm=60;var interval=60000/bpm;target.addEventListener('click',handleRhythmTap);rhythmTest.interval=setInterval(function(){if(rhythmTest.count>=20){finishRhythmTest();return;}rhythmTest.beatTime=Date.now();target.classList.add('mkhcas-beat');setTimeout(function(){target.classList.remove('mkhcas-beat');},100);},interval);}
function handleRhythmTap(){if(!rhythmTest.running||rhythmTest.beatTime===0)return;var tapTime=Date.now();var error=Math.abs(tapTime-rhythmTest.beatTime);rhythmTest.errors.push(error);rhythmTest.count++;var target=document.getElementById('rhythm-target');var feedback=document.getElementById('rhythm-feedback');target.classList.add('mkhcas-tap');setTimeout(function(){target.classList.remove('mkhcas-tap');},100);document.getElementById('rhythm-count').textContent=rhythmTest.count;if(error=20){finishRhythmTest();}}
function finishRhythmTest(){rhythmTest.running=false;clearInterval(rhythmTest.interval);var target=document.getElementById('rhythm-target');target.removeEventListener('click',handleRhythmTap);var avgError=rhythmTest.errors.reduce(function(a,b){return a+b;},0)/rhythmTest.errors.length;var score=Math.max(0,Math.min(100,Math.round(100-avgError/2)));MKHCAS_STATE.testResults.ma=score;MKHCAS_STATE.scores.ma=score;document.querySelector('[data-test="ma"]').classList.add('mkhcas-completed');document.getElementById('rhythm-feedback').textContent='スコア: '+score+'点(平均誤差: '+Math.round(avgError)+'ms)';document.getElementById('rhythm-start-btn').disabled=false;document.getElementById('rhythm-start-btn').textContent='再テスト';checkAllTestsComplete();}
function renderPatternTest(container){container.innerHTML='
パターン再現テスト
表示されるパターンを記憶し、同じ順番でタップしてください
ボタンを押して開始
';}
function startPatternTest(){patternTest={running:true,pattern:[],userPattern:[],level:3,phase:'show',correct:0};document.getElementById('pattern-start-btn').disabled=true;nextPatternRound();}
function nextPatternRound(){patternTest.pattern=[];patternTest.userPattern=[];patternTest.phase='show';for(var i=0;i=patternTest.pattern.length){clearInterval(showInterval);patternTest.phase='input';document.getElementById('pattern-status').textContent='同じ順番でタップしてください';enablePatternInput();return;}var cell=cells[patternTest.pattern[idx]];cell.style.background='#0891b2';setTimeout(function(){cells.forEach(function(c){c.style.background='#e5e7eb';});},400);idx++;},700);}
function enablePatternInput(){var cells=document.querySelectorAll('.mkhcas-pattern-cell');cells.forEach(function(cell){cell.onclick=function(){if(patternTest.phase!=='input')return;var idx=parseInt(this.getAttribute('data-idx'));patternTest.userPattern.push(idx);this.style.background='#06b6d4';var self=this;setTimeout(function(){self.style.background='#e5e7eb';},200);var pos=patternTest.userPattern.length-1;if(patternTest.userPattern[pos]!==patternTest.pattern[pos]){finishPatternTest();return;}if(patternTest.userPattern.length===patternTest.pattern.length){patternTest.correct++;patternTest.level++;if(patternTest.level>8){finishPatternTest();}else{document.getElementById('pattern-status').textContent='正解!次のレベル...';setTimeout(nextPatternRound,1000);}}};});}
function finishPatternTest(){patternTest.running=false;var score=Math.min(100,Math.round((patternTest.level-1)*12.5));MKHCAS_STATE.testResults.kata=score;MKHCAS_STATE.scores.kata=score;document.querySelector('[data-test="kata"]').classList.add('mkhcas-completed');document.getElementById('pattern-status').textContent='スコア: '+score+'点(最高レベル: '+(patternTest.level-1)+')';document.getElementById('pattern-start-btn').disabled=false;document.getElementById('pattern-start-btn').textContent='再テスト';checkAllTestsComplete();}
function renderBalanceTestDiag(container){container.innerHTML='
バランス制御テスト
スマートフォンを腰付近に固定し、30秒間片脚立ちを維持してください
センサー準備中...
30
―
動揺面積
';checkSensorAvailability('balance-test');}
function checkSensorAvailability(prefix){if(window.DeviceMotionEvent){if(typeof DeviceMotionEvent.requestPermission==='function'){document.getElementById(prefix+'-sensor-text').textContent='タップして許可';}else{document.getElementById(prefix+'-sensor').classList.add('mkhcas-active');document.getElementById(prefix+'-sensor-text').textContent='センサー利用可能';}}else{document.getElementById(prefix+'-sensor-text').textContent='センサー非対応';}}
function startBalanceTestDiag(){if(balanceTestDiag.running)return;if(typeof DeviceMotionEvent!=='undefined'&&typeof DeviceMotionEvent.requestPermission==='function'){DeviceMotionEvent.requestPermission().then(function(response){if(response==='granted'){runBalanceTestDiag();}});}else if(window.DeviceMotionEvent){runBalanceTestDiag();}else{alert('このデバイスではモーションセンサーを利用できません');}}
function runBalanceTestDiag(){balanceTestDiag={running:true,data:[],interval:null,countdown:30};document.getElementById('balance-test-btn').disabled=true;document.getElementById('balance-test-sensor').classList.add('mkhcas-active');document.getElementById('balance-test-sensor-text').textContent='計測中...';var dot=document.getElementById('balance-test-dot');function handleMotion(e){if(!balanceTestDiag.running)return;var x=e.accelerationIncludingGravity.x||0;var y=e.accelerationIncludingGravity.y||0;balanceTestDiag.data.push({x:x,y:y,t:Date.now()});var dotX=100+x*8;var dotY=100+y*8;dotX=Math.max(8,Math.min(192,dotX));dotY=Math.max(8,Math.min(192,dotY));dot.style.left=dotX+'px';dot.style.top=dotY+'px';}window.addEventListener('devicemotion',handleMotion);balanceTestDiag.interval=setInterval(function(){balanceTestDiag.countdown--;document.getElementById('balance-test-timer').textContent=balanceTestDiag.countdown;if(balanceTestDiag.countdown=10){var sumX=0,sumY=0;data.forEach(function(d){sumX+=d.x;sumY+=d.y;});var avgX=sumX/data.length;var avgY=sumY/data.length;var variance=0;data.forEach(function(d){variance+=Math.pow(d.x-avgX,2)+Math.pow(d.y-avgY,2);});variance/=data.length;score=Math.max(0,Math.min(100,Math.round(100-variance*5)));}MKHCAS_STATE.testResults.hara=score;MKHCAS_STATE.scores.hara=score;document.querySelector('[data-test="hara"]').classList.add('mkhcas-completed');document.getElementById('balance-test-area').textContent=score+'点';document.getElementById('balance-test-btn').disabled=false;document.getElementById('balance-test-btn').textContent='再テスト';document.getElementById('balance-test-sensor-text').textContent='計測完了';checkAllTestsComplete();}
function renderPhaseTest(container){var html='
';container.innerHTML=html;}
function submitPhaseTest(){var scores={shu:0,ha:0,ri:0};var allAnswered=true;PHASE_QUESTIONS.forEach(function(q,qIdx){var selected=document.querySelector('input[name="phase-q'+qIdx+'"]:checked');if(selected){scores[selected.value]++;}else{allAnswered=false;}});if(!allAnswered){alert('すべての質問に回答してください');return;}var phase='shu';if(scores.ri>=scores.ha&&scores.ri>=scores.shu)phase='ri';else if(scores.ha>=scores.shu)phase='ha';MKHCAS_STATE.testResults.phase=phase;MKHCAS_STATE.phase=phase;document.querySelector('[data-test="phase"]').classList.add('mkhcas-completed');checkAllTestsComplete();}
function checkAllTestsComplete(){var complete=MKHCAS_STATE.testResults.ma!==null&&MKHCAS_STATE.testResults.kata!==null&&MKHCAS_STATE.testResults.hara!==null&&MKHCAS_STATE.testResults.phase!==null;if(complete){showDiagnosticResult();}}
function showDiagnosticResult(){var resultArea=document.getElementById('mkhcas-diagnostic-result');resultArea.style.display='block';var phaseNames={shu:'守',ha:'破',ri:'離'};var phaseDescs={shu:'基礎固めの段階です。型を忠実に学び、基本的な神経回路を構築しましょう。',ha:'カオスの縁に立っています。意図的なゆらぎを導入し、自己組織化を促進しましょう。',ri:'高い統合レベルにあります。無心の状態で創発的なパフォーマンスを発揮できます。'};document.getElementById('mkhcas-result-phase').textContent=phaseNames[MKHCAS_STATE.phase];document.getElementById('mkhcas-result-phase-name').textContent=phaseNames[MKHCAS_STATE.phase]+'フェーズ';document.getElementById('mkhcas-result-desc').textContent=phaseDescs[MKHCAS_STATE.phase];document.getElementById('mkhcas-ma-score').textContent=MKHCAS_STATE.scores.ma;document.getElementById('mkhcas-kata-score').textContent=MKHCAS_STATE.scores.kata;document.getElementById('mkhcas-hara-score').textContent=MKHCAS_STATE.scores.hara;document.getElementById('mkhcas-ma-bar').style.width=MKHCAS_STATE.scores.ma+'%';document.getElementById('mkhcas-kata-bar').style.width=MKHCAS_STATE.scores.kata+'%';document.getElementById('mkhcas-hara-bar').style.width=MKHCAS_STATE.scores.hara+'%';renderRadarChart();renderRecommendations();updateStatusBar();resultArea.scrollIntoView({behavior:'smooth'});}
function renderRadarChart(){var container=document.getElementById('mkhcas-radar-chart');var centerX=160,centerY=130,radius=100;var angles=[-90,150,30];var labels=['間','腹','型'];var values=[MKHCAS_STATE.scores.ma,MKHCAS_STATE.scores.hara,MKHCAS_STATE.scores.kata];var points=values.map(function(v,i){var angle=angles[i]*Math.PI/180;var r=radius*(v/100);return{x:centerX+r*Math.cos(angle),y:centerY+r*Math.sin(angle)};});var svg='';container.innerHTML=svg;}
function renderRecommendations(){var list=document.getElementById('mkhcas-recommendations');var recs=[];if(MKHCAS_STATE.phase==='shu'){recs=['基本姿勢確立(腹の安定化)','型の反復練習(メトロノーム60BPM)','閉眼バランスで固有感覚強化','GETTA L1-L3プロトコル'];}else if(MKHCAS_STATE.phase==='ha'){recs=['リズム変調トレーニング','制約操作による創発的解決','デュアルタスクで型の自動化確認','GETTA L4-L6プロトコル'];}else{recs=['自由即興でフロー状態を体験','ゲーム形式での実践','瞑想的動作で腹からの動きを体得','GETTA L7-L8プロトコル'];}if(MKHCAS_STATE.scores.ma'+r+'';}).join('');}
function updateStatusBar(){var phaseNames={shu:'守',ha:'破',ri:'離'};document.getElementById('mkhcas-phase-display').textContent=MKHCAS_STATE.phase?phaseNames[MKHCAS_STATE.phase]:'―';var casScore=Math.round((MKHCAS_STATE.scores.ma+MKHCAS_STATE.scores.kata+MKHCAS_STATE.scores.hara)/3);document.getElementById('mkhcas-cas-score').textContent=casScore||'―';}
function renderTrainingList(){var container=document.getElementById('mkhcas-training-list');var filtered=MKHCAS_STATE.trainingFilter==='all'?TRAINING_DATA:TRAINING_DATA.filter(function(t){return t.phase===MKHCAS_STATE.trainingFilter;});container.innerHTML=filtered.map(function(t){var phaseClass='mkhcas-'+t.phase;var phaseLabel={shu:'守',ha:'破',ri:'離'}[t.phase];return '
'+phaseLabel+''+t.name+'
⏱ '+t.duration+'🎯 '+t.focus+'
'+t.desc+'
';}).join('');}
function filterTraining(filter){MKHCAS_STATE.trainingFilter=filter;['all','shu','ha','ri'].forEach(function(f){var btn=document.getElementById('filter-'+f);if(f===filter){btn.classList.remove('mkhcas-btn-secondary');}else{btn.classList.add('mkhcas-btn-secondary');}});renderTrainingList();}
function selectTraining(id){MKHCAS_STATE.selectedTraining=TRAINING_DATA.find(function(t){return t.id===id;});var items=document.querySelectorAll('.mkhcas-training-item');items.forEach(function(item){item.classList.remove('mkhcas-active');});event.currentTarget.classList.add('mkhcas-active');var detail=document.getElementById('mkhcas-training-detail');detail.style.display='block';document.getElementById('training-detail-title').textContent=MKHCAS_STATE.selectedTraining.name;document.getElementById('training-detail-content').innerHTML='
'+MKHCAS_STATE.selectedTraining.detail+'
所要時間
'+MKHCAS_STATE.selectedTraining.duration+'
フォーカス
'+MKHCAS_STATE.selectedTraining.focus+'
';detail.scrollIntoView({behavior:'smooth'});}
function startTrainingSession(){if(!MKHCAS_STATE.selectedTraining)return;MKHCAS_STATE.sessions++;document.getElementById('mkhcas-sessions').textContent=MKHCAS_STATE.sessions;showSection('practice');showTool('timer');alert(MKHCAS_STATE.selectedTraining.name+' を開始します。タイマーを使って練習時間を計測してください。');}
function renderGettaProtocols(){var container=document.getElementById('mkhcas-getta-protocols');container.innerHTML=GETTA_PROTOCOLS.map(function(p){var phaseClass='mkhcas-'+p.phase;return '
L'+p.level+'
'+p.name+' '+ {shu:'守',ha:'破',ri:'離'}[p.phase]+'
'+p.desc+' ('+p.duration+')
';}).join('');}
function selectGetta(level){MKHCAS_STATE.selectedGetta=GETTA_PROTOCOLS.find(function(p){return p.level===level;});var items=document.querySelectorAll('.mkhcas-getta-level');items.forEach(function(item){item.classList.remove('mkhcas-active');});event.currentTarget.classList.add('mkhcas-active');var detail=document.getElementById('mkhcas-getta-detail');detail.style.display='block';document.getElementById('getta-detail-title').textContent='L'+MKHCAS_STATE.selectedGetta.level+': '+MKHCAS_STATE.selectedGetta.name;document.getElementById('getta-detail-content').innerHTML='
';detail.scrollIntoView({behavior:'smooth'});}
function startGettaSession(){if(!MKHCAS_STATE.selectedGetta)return;MKHCAS_STATE.sessions++;document.getElementById('mkhcas-sessions').textContent=MKHCAS_STATE.sessions;showSection('practice');showTool('timer');alert('GETTA L'+MKHCAS_STATE.selectedGetta.level+': '+MKHCAS_STATE.selectedGetta.name+' を開始します。');}
function showTool(toolName){var tools=document.querySelectorAll('.mkhcas-tool-content');var btns=document.querySelectorAll('.mkhcas-tool-btn');tools.forEach(function(t){t.classList.remove('mkhcas-active');});btns.forEach(function(b){b.classList.remove('mkhcas-active');});document.getElementById('tool-'+toolName).classList.add('mkhcas-active');document.querySelector('[data-tool="'+toolName+'"]').classList.add('mkhcas-active');MKHCAS_STATE.currentTool=toolName;if(toolName==='balance'){checkSensorAvailability('mkhcas');}}
function timerStart(){if(MKHCAS_STATE.timer.running)return;MKHCAS_STATE.timer.running=true;MKHCAS_STATE.timer.interval=setInterval(function(){if(MKHCAS_STATE.timer.mode==='up'){MKHCAS_STATE.timer.seconds++;}else{MKHCAS_STATE.timer.seconds--;if(MKHCAS_STATE.timer.seconds0?'down':'up';updateTimerDisplay();}
function timerPreset(seconds){timerPause();MKHCAS_STATE.timer.target=seconds;MKHCAS_STATE.timer.seconds=seconds;MKHCAS_STATE.timer.mode='down';updateTimerDisplay();}
function updateTimerDisplay(){var mins=Math.floor(MKHCAS_STATE.timer.seconds/60);var secs=MKHCAS_STATE.timer.seconds%60;document.getElementById('mkhcas-timer-display').textContent=String(mins).padStart(2,'0')+':'+String(secs).padStart(2,'0');}
function updateBPM(value){MKHCAS_STATE.metronome.bpm=parseInt(value);document.getElementById('mkhcas-bpm-display').textContent=value;if(MKHCAS_STATE.metronome.running){toggleMetronome();toggleMetronome();}}
function toggleMetronome(){var btn=document.getElementById('mkhcas-metro-btn');var visual=document.getElementById('mkhcas-metro-visual');if(MKHCAS_STATE.metronome.running){clearInterval(MKHCAS_STATE.metronome.interval);MKHCAS_STATE.metronome.interval=null;MKHCAS_STATE.metronome.running=false;btn.textContent='開始';}else{var interval=60000/MKHCAS_STATE.metronome.bpm;MKHCAS_STATE.metronome.running=true;btn.textContent='停止';function tick(){playClick();visual.classList.add('mkhcas-beat');setTimeout(function(){visual.classList.remove('mkhcas-beat');},100);}tick();MKHCAS_STATE.metronome.interval=setInterval(tick,interval);}}
function playClick(){try{var ctx=new(window.AudioContext||window.webkitAudioContext)();var osc=ctx.createOscillator();var gain=ctx.createGain();osc.connect(gain);gain.connect(ctx.destination);osc.frequency.value=800;osc.type='sine';gain.gain.setValueAtTime(0.3,ctx.currentTime);gain.gain.exponentialRampToValueAtTime(0.01,ctx.currentTime+0.1);osc.start(ctx.currentTime);osc.stop(ctx.currentTime+0.1);}catch(e){}}
function playBeep(){try{var ctx=new(window.AudioContext||window.webkitAudioContext)();var osc=ctx.createOscillator();var gain=ctx.createGain();osc.connect(gain);gain.connect(ctx.destination);osc.frequency.value=440;osc.type='sine';gain.gain.setValueAtTime(0.5,ctx.currentTime);osc.start(ctx.currentTime);osc.stop(ctx.currentTime+0.5);}catch(e){}}
function toggleBreathing(){var btn=document.getElementById('mkhcas-breath-btn');var circle=document.getElementById('mkhcas-breath-circle');var phaseText=document.getElementById('mkhcas-breath-phase');if(MKHCAS_STATE.breathing.running){clearTimeout(MKHCAS_STATE.breathing.interval);MKHCAS_STATE.breathing.interval=null;MKHCAS_STATE.breathing.running=false;btn.textContent='開始';circle.className='mkhcas-breath-circle';circle.textContent='準備';phaseText.textContent='ボタンを押して開始';}else{MKHCAS_STATE.breathing.running=true;MKHCAS_STATE.breathing.phase=0;btn.textContent='停止';var pattern=BREATH_PATTERNS[MKHCAS_STATE.breathing.pattern];function nextPhase(){var p=pattern.phases[MKHCAS_STATE.breathing.phase];circle.textContent=p.name;phaseText.textContent=pattern.name+'呼吸 - '+p.name;circle.classList.remove('mkhcas-inhale','mkhcas-hold');if(p.name==='吸う')circle.classList.add('mkhcas-inhale');else if(p.name==='止める')circle.classList.add('mkhcas-hold');MKHCAS_STATE.breathing.phase=(MKHCAS_STATE.breathing.phase+1)%pattern.phases.length;MKHCAS_STATE.breathing.interval=setTimeout(nextPhase,p.duration);}nextPhase();}}
function setBreathPattern(pattern){MKHCAS_STATE.breathing.pattern=pattern;if(MKHCAS_STATE.breathing.running){toggleBreathing();toggleBreathing();}}
function startBalanceTest(){var btn=document.getElementById('mkhcas-balance-btn');if(MKHCAS_STATE.balance.running){MKHCAS_STATE.balance.running=false;btn.textContent='計測開始';return;}if(typeof DeviceMotionEvent!=='undefined'&&typeof DeviceMotionEvent.requestPermission==='function'){DeviceMotionEvent.requestPermission().then(function(response){if(response==='granted'){runBalanceMeasurement();}});}else if(window.DeviceMotionEvent){runBalanceMeasurement();}else{alert('このデバイスではモーションセンサーを利用できません');}}
function runBalanceMeasurement(){MKHCAS_STATE.balance.running=true;MKHCAS_STATE.balance.data=[];MKHCAS_STATE.balance.startTime=Date.now();document.getElementById('mkhcas-balance-btn').textContent='計測中...';document.getElementById('mkhcas-sensor-dot').classList.add('mkhcas-active');document.getElementById('mkhcas-sensor-text').textContent='計測中';var dot=document.getElementById('mkhcas-balance-dot');var visual=document.getElementById('mkhcas-balance-visual');var centerX=visual.offsetWidth/2;var centerY=visual.offsetHeight/2;function handleMotion(e){if(!MKHCAS_STATE.balance.running)return;var x=e.accelerationIncludingGravity.x||0;var y=e.accelerationIncludingGravity.y||0;MKHCAS_STATE.balance.data.push({x:x,y:y,t:Date.now()});var dotX=centerX+x*10;var dotY=centerY+y*10;dotX=Math.max(8,Math.min(visual.offsetWidth-8,dotX));dotY=Math.max(8,Math.min(visual.offsetHeight-8,dotY));dot.style.left=dotX+'px';dot.style.top=dotY+'px';if(Date.now()-MKHCAS_STATE.balance.startTime>10000){MKHCAS_STATE.balance.running=false;window.removeEventListener('devicemotion',handleMotion);calculateBalanceResults();}}window.addEventListener('devicemotion',handleMotion);}
function calculateBalanceResults(){var data=MKHCAS_STATE.balance.data;document.getElementById('mkhcas-balance-btn').textContent='計測開始';document.getElementById('mkhcas-sensor-text').textContent='計測完了';if(data.lengthまだ記録がありません';return;}container.innerHTML=MKHCAS_STATE.journal.slice(0,5).map(function(e){return '