// ********** Common
var m_dStart;
var m_bFocus = 0;

// ********** Const
var m_iLbMove = 5;
var m_iRlMove = 10;
var m_iCvWt = 480;
var m_iCvHt = 480;
var m_iLbWt = 120;
var m_iLbHt = 40;
var m_iRlWt = 60;
var m_iRlHt = 30;

// ********** Draw
var m_elmCv;
var m_ctxCv;
var m_elmNb;
var m_strText;

// ********** Render
var m_iAnime;
var m_timAnime;
var m_strDefine;
var m_astrLXpx = new Array();
var m_astrLYpx = new Array();
var m_astrLCol = new Array();
var m_astrLChr = new Array();
var m_astrJId1 = new Array();
var m_astrJId2 = new Array();
var m_astrJNm1 = new Array();
var m_astrJNm2 = new Array();
var m_iCntJoin = 0;
var m_strMode;
var m_aiIntiX = new Array();
var m_aiIntiY = new Array();

var m_strReq = '';

window.onload = sbInit;

function sbInit() {
	var iIdx;
	var strLink;
	var strImg;
	var strAlt;
	var iRand;
	var bNewWindow;
	
	// Init Canvas
	m_elmCv = document.getElementById('sokan_cv');
	m_ctxCv = m_elmCv.getContext('2d');
	m_ctxCv.lineWidth = 1;
	
	// Create NameBox
	m_elmNb = document.getElementById('sokan_nb');
	
	m_strMode = document.getElementById('sokan_mode').value;
	
	m_iAnime = -1;
	
	if (m_strMode == 'i') {
		document.getElementById('sokan_res').value = '~80,280~220,220~def,ddd~Sokanzu,Generator~0~1~000~~';
		
		m_aiIntiX[ 2] = new Array(330,30);
		m_aiIntiX[ 3] = new Array(330,180,30);
		m_aiIntiX[ 4] = new Array(330,330,30,30);
		m_aiIntiX[ 5] = new Array(330,330,180,30,30);
		m_aiIntiX[ 6] = new Array(330,330,330,30,30,30);
		m_aiIntiX[ 7] = new Array(330,330,330,180,30,30,30);
		m_aiIntiX[ 8] = new Array(330,330,330,330,30,30,30,30);
		m_aiIntiX[ 9] = new Array(330,330,330,330,30,30,30,30,180);
		m_aiIntiX[10] = new Array(330,330,330,330,30,30,30,30,180,180);
		m_aiIntiX[11] = new Array(330,330,330,330,30,30,30,30,180,180,180);
		m_aiIntiY[ 2] = new Array(220,220);
		m_aiIntiY[ 3] = new Array(120,320,120);
		m_aiIntiY[ 4] = new Array(120,320,320,120);
		m_aiIntiY[ 5] = new Array(40,220,400,220,40);
		m_aiIntiY[ 6] = new Array(40,220,400,400,220,40);
		m_aiIntiY[ 7] = new Array(40,160,280,400,280,160,40);
		m_aiIntiY[ 8] = new Array(40,160,280,400,400,280,160,40);
		m_aiIntiY[ 9] = new Array(40,160,280,400,400,280,160,40,160);
		m_aiIntiY[10] = new Array(40,160,280,400,400,280,160,40,160,280);
		m_aiIntiY[11] = new Array(40,160,280,400,400,280,160,40,100,220,340);
		
		m_iRlMove = 20;
		
		// Start Timer
		m_timAnime = setInterval('sbAnime()',100);
	} else {
		// Start Timer
		m_timAnime = setInterval('sbAnime()',200);
	}
}

function sbAnime() {
	var strDefine;
	strDefine = '' + document.getElementById('sokan_res').value;
	
	// Start Animation
	if (strDefine != '' && strDefine != m_strDefine) {
		m_iAnime = 0;
		m_strDefine = strDefine;
		
		
		// Init
		var astrDefine;
		astrDefine = strDefine.split('~');
		m_astrLXpx = astrDefine[1].split(',');
		m_astrLYpx = astrDefine[2].split(',');
		m_astrLCol = astrDefine[3].split(',');
		m_astrLChr = astrDefine[4].split(',');
		m_astrJId1 = astrDefine[5].split(',');
		m_astrJId2 = astrDefine[6].split(',');
		m_astrJCol = astrDefine[7].split(',');
		m_astrJNm1 = astrDefine[8].split(',');
		m_astrJNm2 = astrDefine[9].split(',');
		
		// Count Relation
		if (astrDefine[5] == '') {
			m_iCntJoin = 0;
		} else {
			m_iCntJoin = m_astrJId1.length;
		}
		
		m_elmCv.style.backgroundColor = '#ffffcc';
		
		// ********** Time
		m_dStart = new Date();
	}
	if (m_bFocus == 0) {
		document.getElementById('sokan_wait').style.display = 'none';
		document.getElementById('sokan_all').style.display = 'block';
		if (document.getElementById('sokan_req') != null) {
			document.getElementById('sokan_req').focus();
		} else {
			document.getElementById('sokan_req0').focus();
		}
		m_bFocus = 1;
	}
	
	var iIdx;
	var iPar;
	var iBlockNumSt,iXSt,iYSt;
	var iBlockNumEd,iXEd,iYEd;
	if (m_iAnime >= 0 && m_iAnime <= m_iLbMove + m_iRlMove * m_iCntJoin) {
		// Clear Canvas
		m_ctxCv.clearRect(0,0,480,480);
		m_elmNb.innerHTML = '';
		m_strText = '';
		
		if (m_strMode == 'i') {
			iBlockNumSt = Math.floor((m_iAnime - m_iLbMove - 1) / m_iRlMove) + 2;
			iBlockNumEd = iBlockNumSt + 1;
			iBlockNumSt = (iBlockNumSt < 2) ? 2 : ((iBlockNumSt > m_astrLXpx.length) ? m_astrLXpx.length : iBlockNumSt);
			iBlockNumEd = (iBlockNumEd < 2) ? 2 : ((iBlockNumEd > m_astrLXpx.length) ? m_astrLXpx.length : iBlockNumEd);
			iPar = ((m_iAnime - m_iLbMove) / m_iRlMove) % 1;
			iPar = (iPar == 0) ? 1 : ((iPar < 0) ? 0 : iPar);
			iPar = (iPar < 0.7 ? 0 : (iPar - 0.7) / 0.3)
			for (iIdx = 0; iIdx < m_astrLXpx.length; iIdx++) {
				iXSt = m_aiIntiX[iBlockNumSt][(iIdx >= m_aiIntiX[iBlockNumSt].length - 1 ? m_aiIntiX[iBlockNumSt].length - 1 : iIdx)];
				iYSt = m_aiIntiY[iBlockNumSt][(iIdx >= m_aiIntiX[iBlockNumSt].length - 1 ? m_aiIntiX[iBlockNumSt].length - 1 : iIdx)];
				iXEd = m_aiIntiX[iBlockNumEd][(iIdx >= m_aiIntiX[iBlockNumEd].length - 1 ? m_aiIntiX[iBlockNumEd].length - 1 : iIdx)];
				iYEd = m_aiIntiY[iBlockNumEd][(iIdx >= m_aiIntiX[iBlockNumEd].length - 1 ? m_aiIntiX[iBlockNumEd].length - 1 : iIdx)];
				m_astrLXpx[iIdx] = iXSt + (iXEd - iXSt) * iPar;
				m_astrLYpx[iIdx] = iYSt + (iYEd - iYSt) * iPar;
			}
			
			// Draw Join
			iIdx = 0;
			for (iIdx = 0; iIdx < m_iCntJoin; iIdx++) {
				iPar = (m_iAnime - m_iLbMove - iIdx * m_iRlMove) / m_iRlMove;
				iPar = (iPar < 0) ? 0 : ((iPar > 1) ? 1 : iPar);
				sbDrawJoin(m_astrLXpx[m_astrJId1[iIdx]],m_astrLYpx[m_astrJId1[iIdx]],m_astrJNm1[iIdx],m_astrLXpx[m_astrJId2[iIdx]],m_astrLYpx[m_astrJId2[iIdx]],m_astrJNm2[iIdx],m_astrJCol[iIdx],iPar,0);
			}
			
			// Draw Label
			for (iIdx = 0; iIdx < m_astrLXpx.length; iIdx++) {
				if (iIdx == 0 || iIdx == m_astrLXpx.length - 1) {
					iPar = m_iAnime * m_iLbMove;
					iPar = (iPar > 1) ? 1 : iPar;
				} else {
					iPar = (m_iAnime - m_iLbMove - iIdx * m_iRlMove) / m_iRlMove;
					iPar = (iPar >= 0) ? 1 : 0;
				}
				if (iPar > 0) {
					sbDrawLabel(m_astrLXpx[iIdx],m_astrLYpx[iIdx],m_astrLCol[iIdx],m_astrLChr[iIdx],iPar);
				}
			}
			
			// Draw Join
			iIdx = 0;
			for (iIdx = 0; iIdx < m_iCntJoin; iIdx++) {
				iPar = (m_iAnime - m_iLbMove - iIdx * m_iRlMove) / m_iRlMove;
				iPar *= 3;
				iPar = (iPar < 0) ? 0 : ((iPar > 1) ? 1 : iPar);
				if (iPar == 1) {
					// View Label
					sbDrawJoin(m_astrLXpx[m_astrJId1[iIdx]],m_astrLYpx[m_astrJId1[iIdx]],m_astrJNm1[iIdx],m_astrLXpx[m_astrJId2[iIdx]],m_astrLYpx[m_astrJId2[iIdx]],m_astrJNm2[iIdx],m_astrJCol[iIdx],iPar,1);
					
					// View TextBox
					if (m_astrJNm2[iIdx] != '') {
						m_strText += m_astrLChr[m_astrJId1[iIdx]] + '--[' + m_astrJNm1[iIdx] + ']--[' + m_astrJNm2[iIdx] + ']--' + m_astrLChr[m_astrJId2[iIdx]] + "\n";
					} else if (m_astrJNm1[iIdx] != '') {
						m_strText += m_astrLChr[m_astrJId1[iIdx]] + '--[' + m_astrJNm1[iIdx] + ']--' + m_astrLChr[m_astrJId2[iIdx]] + "\n";
					} else {
						m_strText += m_astrLChr[m_astrJId1[iIdx]] + '--' + m_astrLChr[m_astrJId2[iIdx]] + "\n";
					}
				}
			}
		} else {
			// Draw Join
			iIdx = 0;
			for (iIdx = 0; iIdx < m_iCntJoin; iIdx++) {
				iPar = (m_iAnime - m_iLbMove - iIdx * m_iRlMove) / m_iRlMove;
				iPar = (iPar < 0) ? 0 : ((iPar > 1) ? 1 : iPar);
				sbDrawJoin(m_astrLXpx[m_astrJId1[iIdx]],m_astrLYpx[m_astrJId1[iIdx]],m_astrJNm1[iIdx],m_astrLXpx[m_astrJId2[iIdx]],m_astrLYpx[m_astrJId2[iIdx]],m_astrJNm2[iIdx],m_astrJCol[iIdx],iPar,0);
			}
			
			// Draw Label
			for (iIdx = 0; iIdx < m_astrLXpx.length; iIdx++) {
				iPar = m_iAnime / m_iLbMove;
				iPar = (iPar < 0) ? 0 : ((iPar > 1) ? 1 : iPar);
				sbDrawLabel(m_astrLXpx[iIdx],m_astrLYpx[iIdx],m_astrLCol[iIdx],m_astrLChr[iIdx],iPar);
			}
			
			// Draw Join
			iIdx = 0;
			for (iIdx = 0; iIdx < m_iCntJoin; iIdx++) {
				iPar = (m_iAnime - m_iLbMove - iIdx * m_iRlMove) / m_iRlMove;
				iPar = (iPar < 0) ? 0 : ((iPar > 1) ? 1 : iPar);
				if (iPar == 1) {
					// View Label
					sbDrawJoin(m_astrLXpx[m_astrJId1[iIdx]],m_astrLYpx[m_astrJId1[iIdx]],m_astrJNm1[iIdx],m_astrLXpx[m_astrJId2[iIdx]],m_astrLYpx[m_astrJId2[iIdx]],m_astrJNm2[iIdx],m_astrJCol[iIdx],iPar,1);
					
					// View TextBox
					if (m_astrJNm2[iIdx] != '') {
						m_strText += m_astrLChr[m_astrJId1[iIdx]] + '--[' + m_astrJNm1[iIdx] + ']--[' + m_astrJNm2[iIdx] + ']--' + m_astrLChr[m_astrJId2[iIdx]] + "\n";
					} else if (m_astrJNm1[iIdx] != '') {
						m_strText += m_astrLChr[m_astrJId1[iIdx]] + '--[' + m_astrJNm1[iIdx] + ']--' + m_astrLChr[m_astrJId2[iIdx]] + "\n";
					} else {
						m_strText += m_astrLChr[m_astrJId1[iIdx]] + '--' + m_astrLChr[m_astrJId2[iIdx]] + "\n";
					}
				}
			}
		}
	}
	
	// End Animation
	document.getElementById('sokan_text').value = m_strText;
	if (m_iAnime == m_iLbMove + m_iRlMove * m_iCntJoin + 2) {
		m_elmCv.style.backgroundColor = '#ffffff';
	}
	
	// Add FrameCount
	if (m_iAnime >= 0 && m_iAnime <= m_iLbMove + m_iRlMove * m_iCntJoin + 2) {
		m_iAnime ++;
	}
}

function sbDrawLabel(iX2,iY2,strColor,strCaption,iPar) {
	var iX1;
	var iY1;
	var iXi;
	var iYi;
	
	iX1 = Math.round(m_iCvWt / 2 - m_iLbWt / 2);
	iY1 = Math.round(m_iCvHt / 2 - m_iLbHt / 2);
	iX2 = Number(iX2);
	iY2 = Number(iY2);
	
	iXi = Math.round(iX1 + (iX2 - iX1) * iPar);
	iYi = Math.round(iY1 + (iY2 - iY1) * iPar);
	
	var lgLabel;
	lgLabel = m_ctxCv.createLinearGradient(iXi,iYi,iXi,iYi + m_iLbHt);
	lgLabel.addColorStop(0, '#fff');
	lgLabel.addColorStop(1, '#' + strColor);
	
	m_ctxCv.strokeStyle = '#000';
	m_ctxCv.fillStyle = lgLabel;
	m_ctxCv.fillRect(iXi,iYi,m_iLbWt,m_iLbHt);
	m_ctxCv.strokeRect(iXi,iYi,m_iLbWt,m_iLbHt);
	
	// Create NameBox
	if (iPar > 0.5) {
		m_elmNb.innerHTML += '<table style="left:' + iXi + 'px; top:' + iYi + 'px; width: ' + (m_iLbWt + 2) + 'px;height: ' + (m_iLbHt + 2) + 'px;"><tr><td class="lb">' + strCaption + '</td></tr></table>';
	}
}

function sbDrawJoin(iX1,iY1,strCaption1,iX2,iY2,strCaption2,strColor,iPar,bName) {
	var iXi;
	var iYi;
	var iTempX;
	var iTempY;
	
	iX1 = Number(iX1);
	iY1 = Number(iY1);
	iX2 = Number(iX2);
	iY2 = Number(iY2);
	
	// Center XY
	iX1 = iX1 + m_iLbWt / 2;
	iY1 = iY1 + m_iLbHt / 2;
	iX2 = iX2 + m_iLbWt / 2;
	iY2 = iY2 + m_iLbHt / 2;
	
	// Current XY
	iXi = Math.round(iX1 + (iX2 - iX1) * iPar);
	iYi = Math.round(iY1 + (iY2 - iY1) * iPar);
	
	if (bName == 0) {
		m_ctxCv.strokeStyle = '#' + strColor;
		m_ctxCv.beginPath();
		m_ctxCv.moveTo(iX1,iY1);
		m_ctxCv.lineTo(iXi,iYi);
		m_ctxCv.stroke();
	} else {
		if (strCaption2 != '') {
			// Create NameBox
			iTempX = Math.round(iX1 + (iX2 - iX1) / 100 * 33.3 - m_iRlWt / 2);
			iTempY = Math.round(iY1 + (iY2 - iY1) / 100 * 33.3 - m_iRlHt / 2);
			m_ctxCv.strokeStyle = '#' + strColor;
			m_ctxCv.fillStyle = '#fff';
			m_ctxCv.fillRect(iTempX,iTempY,m_iRlWt,m_iRlHt);
			m_ctxCv.strokeRect(iTempX,iTempY,m_iRlWt,m_iRlHt);
			m_elmNb.innerHTML += '<table style="left:' + iTempX + 'px; top:' + iTempY + 'px; width: ' + (m_iRlWt + 2) + 'px;height: ' + (m_iRlHt + 2) + 'px;"><tr><td>' + strCaption1 + '</td></tr></table>';
			
			// Create NameBox
			iTempX = Math.round(iX1 + (iX2 - iX1) / 100 * 66.7 - m_iRlWt / 2);
			iTempY = Math.round(iY1 + (iY2 - iY1) / 100 * 66.7 - m_iRlHt / 2);
			m_ctxCv.strokeStyle = '#' + strColor;
			m_ctxCv.fillStyle = '#fff';
			m_ctxCv.fillRect(iTempX,iTempY,m_iRlWt,m_iRlHt);
			m_ctxCv.strokeRect(iTempX,iTempY,m_iRlWt,m_iRlHt);
			m_elmNb.innerHTML += '<table style="left:' + iTempX + 'px; top:' + iTempY + 'px; width: ' + (m_iRlWt + 2) + 'px;height: ' + (m_iRlHt + 2) + 'px;"><tr><td>' + strCaption2 + '</td></tr></table>';
		} else if (strCaption1 != '') {
			// Create NameBox
			iTempX = Math.round(iX1 + (iX2 - iX1) / 100 * 50 - m_iRlWt / 2);
			iTempY = Math.round(iY1 + (iY2 - iY1) / 100 * 50 - m_iRlHt / 2);
			m_ctxCv.strokeStyle = '#' + strColor;
			m_ctxCv.fillStyle = '#fff';
			m_ctxCv.fillRect(iTempX,iTempY,m_iRlWt,m_iRlHt);
			m_ctxCv.strokeRect(iTempX,iTempY,m_iRlWt,m_iRlHt);
			m_elmNb.innerHTML += '<table style="left:' + iTempX + 'px; top:' + iTempY + 'px; width: ' + (m_iRlWt + 2) + 'px;height: ' + (m_iRlHt + 2) + 'px;"><tr><td>' + strCaption1 + '</td></tr></table>';
		}
	}
}

function fnSend_anosokan() {
	var strReq;
	strReq = '';
	if (m_strMode == 'i') { strReq +=  'nm=' + EscapeEUCJP(document.getElementById('sokan_req1').value) + ';' + EscapeEUCJP(document.getElementById('sokan_req0').value);
	} else                { strReq +=  'nm=' + EscapeEUCJP(document.getElementById('sokan_req').value.replace(/\n|\r/g,';'));
	}
	strReq += '&mode=' + m_strMode;
	if (m_iAnime > m_iLbMove + m_iRlMove * m_iCntJoin + 2 || strReq != m_strReq) {
		m_iAnime = -1;
		fnGetValue_anosokan(strReq,'sokan_res');
		m_strReq = strReq;
	}
	return false;
}
function fnSend_changemode() {
	var elmText = document.getElementById('sokan_text');
	var elmPn   = document.getElementById('sokan_pn');
	elmText.style.display = (elmText.style.display == 'block') ? 'none' : 'block';
	elmPn.style.display = (elmText.style.display == 'block') ? 'none' : 'block';
	return false;
}

// EnterKey Event
var m_elmFocus;
function fnFocus_anosokan(elmNum){
	m_elmFocus = elmNum
	elmNum.style.backgroundColor = '#ffffcc';
}
function fnBlur_anosokan(elmNum){
	elmNum.style.backgroundColor = '';
}
function fnGetKeycode_anosokan(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_anosokan(e){
	if(fnGetKeycode_anosokan(e) == 13) {
		if (m_strMode == 'i') {
			if        (m_elmFocus.id == 'sokan_send') { document.getElementById('sokan_req0').focus(); fnSend_anosokan(); return false;
			} else if (m_elmFocus.id == 'sokan_req0') { document.getElementById('sokan_req1').focus(); return false;
			} else if (m_elmFocus.id == 'sokan_req1') { document.getElementById('sokan_send').focus(); return false;
			}
		} else {
			if        (m_elmFocus.id == 'sokan_send') { document.getElementById('sokan_req').focus(); fnSend_anosokan(); return false;
			}
		}
		
	}
}
document.onkeypress = fnKeyPress_anosokan;
