// ********** Common
var m_dStart;
var m_bFocus = 0;

// ********** Const
var m_iWait = 10;
var m_iMargin = 150;
var m_iRlMove = 50;
var m_iCvWt = 620;
var m_iCvHt = 280;
var m_iToshi = 2000;
var m_iMovePar1 = 0.45;
var m_iMovePar2 = 0.53;

var m_iPcW;
var m_iPcH;
var m_iPcP;

// ********** Draw
var m_elmNb1;
var m_elmCv1;
var m_ctxCv1;
var m_elmNb2;
var m_elmCv2;
var m_ctxCv2;

var m_iAnime;
var m_timAnime;
var m_strDefine;
var m_astrText = new Array();
var m_aiX = new Array();
var m_aiY = new Array();
var m_aiZ = new Array();
var m_aiYR = new Array();
var m_aiYS = new Array();

// ********** Render
var m_aiPieceX = new Array();
var m_aiPieceY = new Array();
var m_aiPieceP = new Array();
var m_astrPieceC = new Array();
var m_aiStageX = new Array();
var m_aiStageY = new Array();
var m_aiStageGraYS = new Array();
var m_aiStageGraYE = new Array();
var m_astrStageCS = new Array();
var m_astrStageCE = new Array();

var m_iStageR;
var m_iStPiece;

// ********** Control
var m_iCtlXS;
var m_iCtlYS;
var m_iCtlZPlus;
var m_iCtlAddXS;
var m_iCtlAddYS;
var m_iCtlAddZPlus;

var m_strReq = '';

window.onload = sbInit;

function sbInit() {
	// ********** Init Canvas
	m_elmNb1 = document.getElementById('sokumen_nb');
	m_elmCv1 = document.getElementById('sokumen_cv');
	m_ctxCv1 = m_elmCv1.getContext('2d');
	m_ctxCv1.lineWidth = 1;
	m_elmNb2 = document.getElementById('sokumen_nb2');
	m_elmCv2 = document.getElementById('sokumen_cv2');
	m_ctxCv2 = m_elmCv2.getContext('2d');
	m_ctxCv2.lineWidth = m_ctxCv1.lineWidth;
	
	// ********** Start Timer
	m_timAnime = setInterval('sbAnime()',50);
}

function sbAnime() {
	var iIdx;
	var iMaxX,iMaxY,iMaxZ;
	var strDefine;
	var astrDefine = new Array();
	var iPar;
	var iXS,iYS,iZPlus;
	
	strDefine = '' + document.getElementById('sokumen_res').value;
	
	// ********** Start Animation
	if (strDefine != '' && strDefine != m_strDefine) {
		m_iAnime = 0;
		m_strDefine = strDefine;
		
		document.getElementById('ctrlset').style.display = 'none';
		m_elmCv1.style.backgroundColor = '#000';
		m_elmCv2.style.backgroundColor = '#000';
		document.getElementById('sokumen_alert').innerHTML = 'Now loading ...<br />';
		
		// ********** Init
		astrDefine = strDefine.split('~');
		m_astrText = astrDefine[0].split(',');
		m_aiX = astrDefine[1].split(',');
		m_aiY = astrDefine[2].split(',');
		m_aiZ = astrDefine[3].split(',');
		
		// ********** Count Relation
		if (astrDefine[1] == '') {
			m_iStPiece = 0;
		} else {
			m_iStPiece = m_aiX.length;
		}
		
		// ********** Adjust & Search Label & Calc Node
		iMaxX = 0;
		iMaxY = 0;
		iMaxZ = 0;
		for (iIdx = 0; iIdx < m_iStPiece; iIdx++) {
			m_aiX[iIdx] = Number(m_aiX[iIdx]);
			m_aiY[iIdx] = Number(m_aiY[iIdx]);
			m_aiZ[iIdx] = Number(m_aiZ[iIdx]);
			iMaxX = (m_aiX[iIdx] > iMaxX) ? m_aiX[iIdx] : iMaxX;
			iMaxY = (m_aiY[iIdx] > iMaxY) ? m_aiY[iIdx] : iMaxY;
			iMaxZ = (m_aiZ[iIdx] > iMaxZ) ? m_aiZ[iIdx] : iMaxZ;
		}
		m_iPcW = (m_iCvWt - m_iMargin) / ((iMaxX > iMaxZ ? iMaxX : iMaxZ) + 1) / 2;
		m_iPcH = (m_iCvHt - m_iMargin) / (iMaxY + 1) / 2;
		m_iPcP = (m_iPcW < m_iPcH) ? m_iPcW : m_iPcH;
		
		for (iIdx = 0; iIdx < m_iStPiece; iIdx++) {
			m_aiX[iIdx] *= m_iPcP;
			m_aiY[iIdx] *= m_iPcP;
			m_aiZ[iIdx] *= m_iPcP;
			
			m_aiYR[iIdx] = Math.sqrt(Math.pow(m_aiX[iIdx],2) + Math.pow(m_aiZ[iIdx],2));
			m_aiYS[iIdx] = (Math.atan2(m_aiX[iIdx],m_aiZ[iIdx]) / Math.PI * 180 + 360) % 360;
		}
		m_iStageR = (iMaxX > iMaxZ ? iMaxX : iMaxZ) * m_iPcP * 1.6;
		
		// ********** Render
		for (iIdx = 0; iIdx <= m_iWait + m_iRlMove; iIdx++) {
			iPar = (iIdx - m_iWait) / (m_iRlMove);
			iPar = (iPar < 0 ? 0 : iPar);
			
			if (iPar <= m_iMovePar1) {
				iPar = iPar / m_iMovePar1;
				iXS = Math.round(Math.cos((30 +  60 * iPar) / 180 * Math.PI) * 90);
				iYS = Math.round(Math.cos((90 + 360 * iPar) / 180 * Math.PI) * 20);
				iZPlus = Math.round(Math.cos((90 * iPar) / 180 * Math.PI) * 1200);
			} else if (iPar > m_iMovePar1 && iPar <= m_iMovePar2) {
				iXS = 0;
				iYS = 0;
				iZPlus = 0;
			} else {
				iPar = (iPar - m_iMovePar2) / (1 - m_iMovePar2)
				iXS = Math.round(Math.cos((90 + 180 * iPar) / 180 * Math.PI) * -20);
				iYS = Math.round(Math.cos((90 + 90 * iPar) / 180 * Math.PI) * 90);
				iZPlus = Math.round(Math.cos((90 + 180 * iPar) / 180 * Math.PI) * -400);
			}
			
			// ********** Calc
			sbCalc(iIdx,iXS,iYS,iZPlus);
			document.getElementById('sokumen_alert').innerHTML = 'Now loading ... ' + Math.round(iIdx / (m_iWait + m_iRlMove) * 100) + '%<br />';
		}
		
		// ********** Draw
		m_elmCv1.style.backgroundColor = '#eee';
		m_elmCv2.style.backgroundColor = '#fff';
		sbDraw(m_ctxCv2,m_elmNb2,Math.round(m_iWait + m_iRlMove * m_iMovePar2),true);
		if (m_astrText.length > 1) {
			document.getElementById('sokumen_alert').innerHTML = '<span class="info">' + m_astrText[1] + '</span><br />';
		} else {
			document.getElementById('sokumen_alert').innerHTML = '<br />';
		}
		
		// ********** Time
		if (m_bFocus == 0) {
			document.getElementById('sokumen_wait').style.display = 'none';
			document.getElementById('sokumen_all').style.display = 'block';
			document.getElementById('sokumen_req').focus();
			m_bFocus = 1;
		}
		m_dStart = new Date();
	}
	
	// ********** Draw
	if (m_iAnime == 0 || (m_iAnime > m_iWait && m_iAnime <= m_iWait + m_iRlMove)) {
		sbDraw(m_ctxCv1,m_elmNb1,m_iAnime,(m_iAnime == m_iWait + m_iRlMove || (m_iAnime - m_iWait > m_iRlMove * m_iMovePar1 && m_iAnime - m_iWait <= m_iRlMove * m_iMovePar2)));
	}
	
	// ********** End Animation
	if (m_iAnime == m_iWait + m_iRlMove + 2) {
		m_elmCv1.style.backgroundColor = '#fff';
		if (m_astrText.length > 2) {
			document.getElementById('sokumen_alert').innerHTML = '<span class="info">' + m_astrText[2] + '</span><br />';
		}
		m_iCtlXS = 0;
		m_iCtlYS = -90;
		m_iCtlZPlus = 0;
		m_iCtlAddXS = 0;
		m_iCtlAddYS = 0;
		m_iCtlAddZPlus = 0;
		document.getElementById('ctrlset').style.display = 'block';
		
		// ********** Check Time
		dNow = new Date();
//		alert(parseInt((dNow.getTime() - m_dStart.getTime())));
	}
	
	// ********** Add FrameCount
	if (m_iAnime >= 0 && m_iAnime <= m_iWait + m_iRlMove + 2) {
		m_iAnime ++;
	} else {
		if (Math.abs(m_iCtlAddXS) > 0.1 || Math.abs(m_iCtlAddYS) > 0.1 || Math.abs(m_iCtlAddZPlus) > 0.1) {
			m_iCtlXS += m_iCtlAddXS;
			m_iCtlYS += m_iCtlAddYS;
			m_iCtlZPlus += m_iCtlAddZPlus;
			m_iCtlAddXS *= 0.99;
			m_iCtlAddYS *= 0.99;
			m_iCtlAddZPlus *= 0.99;
			
			m_iCtlXS = (m_iCtlXS < 0 ? 0 : (m_iCtlXS > 90 ? 90 : m_iCtlXS));
			m_iCtlYS = (m_iCtlYS < 0 ? (360 + m_iCtlYS) : (m_iCtlYS > 360 ? m_iCtlYS - 360 : m_iCtlYS));
			m_iCtlZPlus = (m_iCtlZPlus < -100 ? -100 : (m_iCtlZPlus > 1000 ? 1000 : m_iCtlZPlus));
			
			sbCalc(m_iWait + m_iRlMove + 1,m_iCtlXS,m_iCtlYS,m_iCtlZPlus);
			sbDraw(m_ctxCv1,m_elmNb1,m_iWait + m_iRlMove + 1,true);
		}
	}
}

function fnGet3DX(iXi,iZi) {
	return Math.round(m_iCvWt / 2 + iXi * ((m_iToshi - iZi) / m_iToshi));
}
function fnGet3DY(iYi,iZi) {
	return Math.round(m_iCvHt / 2 + iYi * ((m_iToshi - iZi) / m_iToshi));
}
function fnGet3DS(iZi) {
	return ((m_iToshi - iZi) / m_iToshi);
}

function sbCalc(iAnime,iXS,iYS,iZPlus) {
	var iX,iY,iZ;
	var iR,iS;
	var iXi,iYi,iSi;
	var iCi;
	var strCol;
	var iGraYMin,iGraYMax
	var iGraZMin,iGraZMax
	var iTempZ = new Array();
	
	// ********** Stage
	m_aiStageX[iAnime] = new Array();
	m_aiStageY[iAnime] = new Array();
	for (iIdx = 0; iIdx < 4; iIdx++) {
		// ********** Spin Y
		iX = Math.cos((-(iIdx * 90 + 45) + iYS + 90) / 180 * Math.PI) * m_iStageR;
		iY = m_iPcP * 8;
		iZ = Math.sin((-(iIdx * 90 + 45) + iYS + 90) / 180 * Math.PI) * m_iStageR;
		
		// ********** Spin X
		iR = Math.sqrt(Math.pow(iZ,2) + Math.pow(iY,2));
		iS = (Math.atan2(iZ,iY) / Math.PI * 180 + 360) % 360;
		iY = Math.cos((iS + iXS) / 180 * Math.PI) * iR;
		iZ = Math.sin((iS + iXS) / 180 * Math.PI) * iR;
		
		// ********** Zoom Z
		iZ += iZPlus;
		
		// ********** 3D to 2D
		iXi = fnGet3DX(iX,iZ);
		iYi = fnGet3DY(iY,iZ);
		
		// ********** Stock
		m_aiStageX[iAnime][iIdx] = iXi;
		m_aiStageY[iAnime][iIdx] = iYi;
		
		iGraYMin = (iIdx == 0 || iYi < iGraYMin ? iYi : iGraYMin);
		iGraYMax = (iIdx == 0 || iYi > iGraYMax ? iYi : iGraYMax);
		iGraZMin = (iIdx == 0 || iZ < iGraZMin ? iZ : iGraZMin);
		iGraZMax = (iIdx == 0 || iZ > iGraZMax ? iZ : iGraZMax);
	}
	
	m_aiStageGraYS[iAnime] = iGraYMin;
	m_aiStageGraYE[iAnime] = iGraYMax;
	
	iCi = (m_iStageR * 0.5 + iGraZMax) / (m_iStageR);
	iCi = (iCi < 0 ? 0 : (iCi > 1 ? 1 : iCi));
	iCi = Math.round(96 + 127 * iCi);
	strCol = iCi.toString(16);
	strCol = ('0'.substr(0,2 - strCol.length)) + strCol;
	m_astrStageCS[iAnime] = '#' + strCol + strCol + strCol;
	
	iCi = (m_iStageR * 0.5 + iGraZMin) / (m_iStageR);
	iCi = (iCi < 0 ? 0 : (iCi > 1 ? 1 : iCi));
	iCi = Math.round(96 + 127 * iCi);
	strCol = iCi.toString(16);
	strCol = ('0'.substr(0,2 - strCol.length)) + strCol;
	m_astrStageCE[iAnime] = '#' + strCol + strCol + strCol;
	
	// ********** Piece
	m_aiPieceX[iAnime] = new Array();
	m_aiPieceY[iAnime] = new Array();
	m_aiPieceP[iAnime] = new Array();
	m_astrPieceC[iAnime] = new Array();
	for (iIdx = 0; iIdx < m_iStPiece; iIdx++) {
		// ********** Spin Y
		iX = Math.cos((-m_aiYS[iIdx] + iYS + 90) / 180 * Math.PI) * m_aiYR[iIdx];
		iY = m_aiY[iIdx];
		iZ = Math.sin((-m_aiYS[iIdx] + iYS + 90) / 180 * Math.PI) * m_aiYR[iIdx];
		
		// ********** Spin X
		iR = Math.sqrt(Math.pow(iZ,2) + Math.pow(iY,2));
		iS = (Math.atan2(iZ,iY) / Math.PI * 180 + 360) % 360;
		iY = Math.cos((iS + iXS) / 180 * Math.PI) * iR;
		iZ = Math.sin((iS + iXS) / 180 * Math.PI) * iR;
		
		// ********** Zoom Z
		iZ += iZPlus;
		
		// ********** 3D to 2D
		iXi = fnGet3DX(iX,iZ);
		iYi = fnGet3DY(iY,iZ);
		iSi = fnGet3DS(iZ);
		
		// ********** Stock
		iCi = (m_iStageR * 0.5 + iZ) / (m_iStageR);
		iCi = (iCi < 0 ? 0 : (iCi > 1 ? 1 : iCi));
		iCi = Math.round(127 * iCi);
		strCol = iCi.toString(16);
		strCol = ('0'.substr(0,2 - strCol.length)) + strCol;
		
		m_astrPieceC[iAnime][iIdx] = '#' + strCol + strCol + strCol;
		m_aiPieceX[iAnime][iIdx] = iXi;
		m_aiPieceY[iAnime][iIdx] = iYi;
		iTempZ[iIdx] = -iZ;
		m_aiPieceP[iAnime][iIdx] = m_iPcP * iSi * 0.7;
	}
	
	sbSort(iTempZ,iAnime,0,m_iStPiece - 1)

}
function sbSort(data,iAnime,iStIdx,iEdIdx) {
	var iHalf = data[Math.floor((iStIdx + iEdIdx) / 2)];
	var iSt = iStIdx;
	var iEd = iEdIdx;
	var varTemp;
	while (true) {
		while (data[iSt] < iHalf) iSt++;
		while (iHalf < data[iEd]) iEd--;
		if (iSt >= iEd) break;
		
		varTemp = data[iSt];
		data[iSt] = data[iEd];
		data[iEd] = varTemp;
		
		varTemp = m_astrPieceC[iAnime][iSt];
		m_astrPieceC[iAnime][iSt] = m_astrPieceC[iAnime][iEd];
		m_astrPieceC[iAnime][iEd] = varTemp;
		
		varTemp = m_aiPieceX[iAnime][iSt];
		m_aiPieceX[iAnime][iSt] = m_aiPieceX[iAnime][iEd];
		m_aiPieceX[iAnime][iEd] = varTemp;
		
		varTemp = m_aiPieceY[iAnime][iSt];
		m_aiPieceY[iAnime][iSt] = m_aiPieceY[iAnime][iEd];
		m_aiPieceY[iAnime][iEd] = varTemp;
		
		varTemp = m_aiPieceP[iAnime][iSt];
		m_aiPieceP[iAnime][iSt] = m_aiPieceP[iAnime][iEd];
		m_aiPieceP[iAnime][iEd] = varTemp;
		
		iSt++;
		iEd--; 
	}
	if (iStIdx < iSt - 1) sbSort(data,iAnime,iStIdx,iSt - 1);
	if (iEd + 1 < iEdIdx) sbSort(data,iAnime,iEd + 1,iEdIdx);
}
function sbDraw(ctxCv,elmNb,iAnime,bFill) {
	var lgTemp;
	
	elmNb.innerHTML = '';
	ctxCv.clearRect(0,0,m_iCvWt,m_iCvHt);
	lgTemp = ctxCv.createLinearGradient(0,m_aiStageGraYS[iAnime],0,m_aiStageGraYE[iAnime]);
	lgTemp.addColorStop(0,m_astrStageCS[iAnime]);
	lgTemp.addColorStop(1,m_astrStageCE[iAnime]);
	
	ctxCv.fillStyle = lgTemp;
	ctxCv.beginPath();
	for (iIdx = 0; iIdx < 4; iIdx++) {
		if (iIdx == 0) {
			ctxCv.moveTo(m_aiStageX[iAnime][iIdx],m_aiStageY[iAnime][iIdx]);
		} else {
			ctxCv.lineTo(m_aiStageX[iAnime][iIdx],m_aiStageY[iAnime][iIdx]);
		}
	}
	ctxCv.closePath();
	ctxCv.fill();
	
	for (iIdx = 0; iIdx < m_iStPiece; iIdx++) {
		if (bFill) {
			ctxCv.fillStyle = m_astrPieceC[iAnime][iIdx];
			ctxCv.beginPath();
			ctxCv.arc(m_aiPieceX[iAnime][iIdx],m_aiPieceY[iAnime][iIdx],m_aiPieceP[iAnime][iIdx],0 * Math.PI / 180,0.1 * Math.PI / 180,1);
			ctxCv.fill();
		} else {
			ctxCv.strokeStyle = m_astrPieceC[iAnime][iIdx];
			ctxCv.beginPath();
			ctxCv.arc(m_aiPieceX[iAnime][iIdx],m_aiPieceY[iAnime][iIdx],m_aiPieceP[iAnime][iIdx],0 * Math.PI / 180,0.1 * Math.PI / 180,1);
			ctxCv.stroke();
		}
	}
//	var iX,iY;
//	for (iIdx = 0; iIdx < m_iStPiece; iIdx++) {
//		iX = m_aiPieceX[iAnime][iIdx] - m_aiPieceP[iAnime][iIdx] - 1;
//		iY = m_aiPieceY[iAnime][iIdx] - m_aiPieceP[iAnime][iIdx] - 8;
//		if (iX >= 0 && iX <= m_iCvWt - m_aiPieceP[iAnime][iIdx] * 2 && iY >= 0 && iY <= m_iCvHt - m_aiPieceP[iAnime][iIdx] * 2) {
//			elmNb.innerHTML += '<span style="left:' + iX + 'px; top:' + iY + 'px; width: ' + (m_aiPieceP[iAnime][iIdx] * 2) + 'px;height: ' + (m_aiPieceP[iAnime][iIdx] * 2) + 'px;font-size: ' + (m_aiPieceP[iAnime][iIdx] * 2) + 'px;color:' + m_astrPieceC[iAnime][iIdx] + ';">' + (bFill ? '@' : 'O') + '</span>';
//		}
//	}
}
function fnSend_anosokumen() {
	var strReq;
	strReq = '';
	strReq += 'nm=' + EscapeEUCJP(document.getElementById('sokumen_req').value);
	strReq += '&mode=' + document.getElementById('sokumen_mode').value;
	if (m_iAnime > m_iWait + m_iRlMove + 2 || strReq != m_strReq) {
		m_iAnime = -1;
		document.getElementById('sokumen_alert').innerHTML = '<br />';
		fnGetValue_anosokumen(strReq,'sokumen_res');
		m_strReq = strReq;
	}
	return false;
}
function fnViewText_anosokumen() {
	var elmText = document.getElementById('sokumen_pn2');
	elmText.style.display = (elmText.style.display == 'block') ? 'none' : 'block';
	return false;
}

function fnCntrol3d_anosokumen(iCtlAddXS,iCtlAddYS,iCtlAddZPlus) {
	m_iCtlAddXS = iCtlAddXS * 4;
	m_iCtlAddYS = iCtlAddYS * 4;
	m_iCtlAddZPlus = iCtlAddZPlus * 20;
	if (iCtlAddXS != 0) {
		m_iCtlAddZPlus = iCtlAddXS * 40;
	}
}

// EnterKey Event
var m_elmFocus;
function fnFocus_anosokumen(elmNum){
	m_elmFocus = elmNum
	elmNum.style.backgroundColor = '#edf';
	elmNum.select();
}
function fnBlur_anosokumen(elmNum){
	elmNum.style.backgroundColor = '';
}
function fnGetKeycode_anosokumen(e){
	if (document.all) {
		return event.keyCode;
	} else if (document.getElementById) {
		return (e.keyCode!=0) ? e.keyCode : e.charCode;
	} else if(document.layers){
		return e.which;
	}
}
function fnKeyPress_anosokumen(e){
	if(fnGetKeycode_anosokumen(e) == 13) {
		if        (m_elmFocus.id == 'sokumen_send') { document.getElementById('sokumen_req').focus();  fnSend_anosokumen();
		} else if (m_elmFocus.id == 'sokumen_req')  { document.getElementById('sokumen_send').focus(); fnSend_anosokumen();
		}
		return false;
	}
}

document.onkeypress = fnKeyPress_anosokumen;
