// ********** Common
var m_dStart;
var m_timAnime;
var m_iSpecLevel = 0;

// ********** Const
var m_strURL = '';
var m_strURLInit = 'title.xml';
var m_strURLSend = '/cgi-bin/generator/ochi.cgi';

var m_iInterval = 50;
var m_iRlMove = 200;
var m_iCvWt = 700;
var m_iCvHt = m_iCvWt / 4 * 3;
var m_iPathSize = 1000;
var m_iMargin = 0;
var m_iLineHeight = 1 / 14;

// ********** Draw
var m_astrArrayCv = new Array('G0','G1','WL','BS','NX','BD','EF','TT','BG');
var m_astrArrayNb = new Array('SS','SD','SN','RL');
var m_aelmCv = [];
var m_actxCv = [];
var m_aelmNb = [];
var m_astrNo = [];
var m_astrNn = [];

// Canvas / m_aelmCv , m_actxCv
// G0 : Back 0
// G1 : Back 1
// WL : Wall
// BS : Block (Static)
// NX : Next Block
// BD : Block (Dynamic)
// EF : Effect
// TT : Title
// BG : Bingo Template

// Text / m_aelmNb , m_astrNo , m_astrNn
// SS : Score (Static)
// SD : Score (Dynamic) / Info
// SN : Sound
// RL : Rule

var m_bDataLoaded = false;
var m_bTitleLoaded = false;
var m_elmPn;
var m_elmIt0;
var m_elmIt1;

var m_iState = 0;
var m_iGame = 0;
var m_iProc = 0;
var m_strMsg = '';

var m_iRuleDrawCnt = 0;
var m_iRuleDrawIdx = -1;

var m_iSpaceX = 0;
var m_iSpaceY = 0;
var m_iSpaceCol = 0;
var m_iSpaceRow = 0;
var m_aastrSpaceFIro = [];
var m_iBlockCol = 0;
var m_iBlockRow = 0;
var m_iBlockLine = 0;
var m_iBlockSize = 0;
var m_iWallMargin = 0;
var m_iInfoCnt = 0;
var m_iTextX = 0;
var m_iTextY = 0;
var m_iTextW = 0;
var m_iTextH = 0;

var m_iDropCnt = 0;
var m_iDySpeed = 0;
var m_iDyCombiNxt = 0;
var m_iDyCombiIdx = 0;
var m_iDyCnt = 0;
var m_iDyColAdd = 0;
var m_iDyRowAdd = 0;
var m_iDyRttAdd = 0;
var m_aiDyBlockNxt = [];
var m_aiDyBlockIdx = [];
var m_aaiStBlockOld = [];
var m_aaiStBlockNew = [];
var m_aiStHeight = [];

var m_iSub = 0;
var m_iBingoFlg = 0;
var m_iRensa = 0;

var m_iEffectCnt = 0;
var m_aiEffectCol = [];
var m_aiEffectRow = [];

var m_aiScoreRensa = [];
var m_iScoreRensaMem = 0;
var m_iScoreRensaMax = 0;
var m_iScore = 0;
var m_iScoreAdd = 0;

var m_aiGroundX0 = [];
var m_aiGroundY0 = [];
var m_aiGroundZ0 = [];
var m_aiGroundA0 = [];
var m_aiGroundX1 = [];
var m_aiGroundY1 = [];
var m_aiGroundZ1 = [];
var m_aiGroundA1 = [];

var m_iBingoOrderX = 0;

// ********** Adjust Data
var m_astrInit = [];

var m_iRuleCnt = 0;
var m_aiRuleO = [];
var m_aiRuleG = [];
var m_aiRuleX = [];
var m_aiRuleY = [];
var m_astrRuleHead = [];
var m_astrRuleText = [];
var m_astrRuleFIro = [];

var m_iBlockCnt = 0;
var m_astrBlockFIro = [];
var m_astrBlockPath = [];

var m_iGroundCnt = 0;
var m_astrGroundFIro = [];
var m_astrGroundPath = [];

var m_iTitleCnt = 0;
var m_astrTitleSIro = [];
var m_astrTitleFIro = [];
var m_astrTitlePath = [];

var m_iCombiCnt = 0;
var m_aaiCombiCol = [];
var m_aaiCombiRow = [];
var m_aiCombiColCnt = [];
var m_aiCombiRowCnt = [];

var m_iBingoCnt = 0;
var m_aaiBingoIdx = [];
var m_aaiBingoCol = [];
var m_aaiBingoRow = [];
var m_aiBingoColCnt = [];
var m_aiBingoRowCnt = [];
var m_iBingoColCnt = 0;
var m_iBingoRowCnt = 0;

var m_aiBingoOrder = [];

var m_astrSound = [];

window.onload = sbInit;

function sbInit() {
	var iIdx,strIdx;
	
	m_dStart = new Date();
	m_elmIt0 = document.getElementById('ochi_init0');
	m_elmIt1 = document.getElementById('ochi_init1');
	
	// Init Canvas
	m_elmPn = document.getElementById('ochi_pn');
	for (iIdx = 0; iIdx < m_astrArrayCv.length; iIdx++) {
		strIdx = m_astrArrayCv[iIdx];
		m_aelmCv[strIdx] = document.getElementById('ochi_cv' + iIdx);
		m_actxCv[strIdx] = m_aelmCv[strIdx].getContext('2d');
	}
	
	// Init Text
	for (iIdx = 0; iIdx < m_astrArrayNb.length; iIdx++) {
		strIdx = m_astrArrayNb[iIdx];
		m_aelmNb[strIdx] = document.getElementById('ochi_nb' + iIdx);
	}
	
	// Init
	document.getElementById('ochi').style.display = 'block';
	document.getElementById('ochi_req').focus();
	
	// Get Param
	var astrParam = [];
	astrParam = sbGetParam();
	var strReq = '';
	if ('n' in astrParam) {
		strReq = decodeURI(astrParam['n']);
	}
	
	document.getElementById('ochi_req').value = strReq;
//	if (strReq != '') {
		fnSend();
//	}
	
	// Start Timer
	m_timAnime = setInterval('sbAnime()',m_iInterval);
}

// ********************************************************************************
function sbInitGame() {
	var iIdx,strIdx;
	var iTemp,iTemp2,iTemp3;
	var strTemp;
	var iSpaceMax;
	var iX,iY,iW,iH;
	
	// ********** Init
	m_iSpecLevel = 0;
	m_iState = 0;
	
	m_iBlockLine = m_iBlockRow;
	m_iSpaceCol = m_astrInit['gm_itsw'];
	m_iSpaceRow = m_astrInit['gm_itsh'] + m_iBlockLine;
	iSpaceMax = (m_iSpaceCol > m_iSpaceRow ? m_iSpaceCol : m_iSpaceRow);
	
	document.getElementById('ochi_footer').style.display = 'block';
	
	// ********** Resize Canvas
	m_elmPn.style.width  = m_iCvWt + 'px';
	m_elmPn.style.height = m_iCvHt + 'px';
	for (iIdx = 0; iIdx < m_astrArrayCv.length; iIdx++) {
		strIdx = m_astrArrayCv[iIdx];
		m_aelmCv[strIdx].width  = m_iCvWt;
		m_aelmCv[strIdx].height = m_iCvHt;
	}
	
	// ********** Clear And Hidden
	sbClearAll('G0,G1,WL,NX,BS,BD,EF,TT,BG','SS,SD,SN,RL');
	sbViewLayer('','');
	
	// ********** Draw Back
	m_actxCv['G0'].fillStyle = fnGetLinearGradient(m_actxCv['G0'],m_astrInit['al_clpt'],m_astrInit['al_clpb']);
	m_actxCv['G0'].fillRect(0,0,m_iCvWt,m_iCvHt);
	
	// ********** Calc Layout
	m_iWallMargin = m_iCvHt * 0.02;
	
	var iSpaceW = (m_iCvHt - m_iWallMargin * 4) * (m_iSpaceCol / iSpaceMax);
	var iSpaceH = (m_iCvHt - m_iWallMargin * 4) * (m_iSpaceRow / iSpaceMax);
	var iWallW = iSpaceW + m_iWallMargin * 2;
	var iWallH = iSpaceH + m_iWallMargin * 2;
	var iInfoW = m_iCvWt - m_iCvHt - m_iWallMargin;
	m_iTextW = iInfoW - m_iWallMargin * 2;
	m_iTextH = m_iTextW * 0.12;
	var iInfoH = (m_iTextH * 2 + m_iWallMargin * 5) * 2 + m_iWallMargin;
	iInfoH = (iInfoH < iWallH ? iWallH : iInfoH);
	m_iInfoCnt = Math.floor((iInfoH - (m_iTextH * 2 + m_iWallMargin * 5)) / (m_iTextH + m_iWallMargin * 3));
	m_iInfoCnt = (m_iInfoCnt > 2 ? m_iInfoCnt - 1 : m_iInfoCnt);
	
	m_iBlockSize = iSpaceH / m_iSpaceRow;
	
	var iWallX = m_iCvWt * 0.5 - (iWallW + iInfoW + m_iWallMargin) * 0.5;
	var iWallY = m_iCvHt * 0.5 - iWallH * 0.5;
	m_iSpaceX = iWallX + m_iWallMargin;
	m_iSpaceY = iWallY + m_iWallMargin;
	var iInfoX = iWallX + iWallW + m_iWallMargin;
	var iInfoY = m_iCvHt * 0.5 - iInfoH * 0.5;
	m_iTextX = iInfoX + m_iWallMargin;
	m_iTextY = iInfoY + m_iWallMargin;
	
	// ***** Wall
	m_actxCv['WL'].fillStyle = fnGetLinearGradient(m_actxCv['WL'],m_astrInit['gm_clwt'],m_astrInit['gm_clwb']);
	m_actxCv['WL'].fillRect(iWallX,iWallY,iWallW,iWallH);
	
	// ***** Space
	for (iX = 0; iX < m_iSpaceCol; iX++) {
		m_aastrSpaceFIro[iX] = [];
		for (iY = 0; iY < m_iSpaceRow; iY++) {
			m_aastrSpaceFIro[iX][iY] = (iY < m_iBlockLine ? m_astrInit['gm_clwt'] : (((iX + (iY % 2 == 0 ? 0 : 1)) % 2 == 0) ? m_astrInit['gm_clbt'] : m_astrInit['gm_clbb']));
			m_actxCv['WL'].fillStyle = m_aastrSpaceFIro[iX][iY];
			sbFillBlock('WL',iX,iY,1);
		}
	}
	
	// ***** Info
	m_actxCv['WL'].fillStyle = fnGetLinearGradient(m_actxCv['WL'],m_astrInit['gm_clwt'],m_astrInit['gm_clwb']);
	m_actxCv['WL'].fillRect(iInfoX,iInfoY,iInfoW,iInfoH);
	
	m_astrNn['SS'] = '';
	for (iIdx = 0; iIdx < m_iInfoCnt; iIdx++) {
		iTemp = (m_iTextH + m_iWallMargin * 3) * iIdx + (iIdx < 1 ? 0 : m_iTextH + m_iWallMargin * 2);
		
		if (iIdx < 2) {
			m_actxCv['WL'].fillStyle = m_astrInit['gm_clit'];
			sbFillRect('WL',m_iTextX,iTemp + m_iTextY,m_iTextW,m_iTextH + m_iWallMargin * 2,1);
			strText = m_astrInit[(iIdx == 0 ? 'gm_sti0' : 'gm_str0')];
			m_astrNn['SS'] += sbDrawLabel(m_iTextX,iTemp + m_iTextY + m_iWallMargin,m_iTextW,m_iTextH,'c',m_iTextH,m_astrInit['gm_cli0'],strText);
		}
		m_actxCv['WL'].fillStyle = m_astrInit['gm_clib'];
		sbFillRect('WL',m_iTextX,iTemp + m_iTextY + m_iTextH + m_iWallMargin * 2,m_iTextW,m_iTextH + m_iWallMargin * 2,1);
	}
	
	// ********** View Text
	sbViewText();
	
	// ********** Others
	sbReCalcGround();
	sbReCalcGround();
	
	strTemp = window.location.href
	iTemp = strTemp.indexOf('?');
	if (iTemp >= 0) {
		strTemp = strTemp.substring(0,iTemp);
	}
	if (m_astrInit['al_stnm'] != '') {
		strTemp += '?n=' + encodeURI(m_astrInit['al_stnm']);
	}
	strTemp = '<a href="' + strTemp + '">' + strTemp + '</a>';
	document.getElementById('ochi_url').value = strTemp;
	document.getElementById('ochi_ctrl').focus();
	m_elmIt0.style.display = 'block';
	m_elmIt1.style.display = 'none';
	
	m_actxCv['NX'].globalAlpha = 0.7;
	m_actxCv['TT'].lineJoin = 'round';
	m_actxCv['TT'].lineCap = 'round';
	m_actxCv['TT'].lineWidth = Math.floor((m_iCvHt / m_iTitleCnt) * 0.25);
	m_actxCv['BG'].lineJoin = 'round';
	m_actxCv['BG'].lineCap = 'round';
	m_actxCv['BG'].lineWidth = Math.floor((m_iCvHt / m_iTitleCnt) * 0.1);
}

// ********************************************************************************
function sbAnime() {
	var iSecSt = (+new Date());
	var iSecDiff = 0;
	var iPar;
	var iTemp,iTemp2,iTemp3,iTemp4,iCnt,strTemp;
	var iIdx,iIdx2,iIdx3;
	var iX,iY,iZ,iW,iH,iA,iCol,iRow,iCol2,iRow2;
	var aiBad = [];
	var strText = '';
	
	m_iProc = (m_iProc + 1) % m_iRlMove;
	iPar = (m_iProc + 1) / m_iRlMove;
	
	if (! m_bDataLoaded) {
		return false;
	}
	
	// ********************************************************************************
	if (0 == 1) {
	} else if (m_iState == 0) {
		// **************************************** Title Start
		sbClearAll('BS,BD,EF','SD,SN');
		sbViewLayer('G0,TT,BG','RL');
		m_elmIt0.style.display = 'block';
		m_elmIt1.style.display = 'none';
		
		// Set RuleText
		m_astrNn['RL'] = '';
		m_iRuleDrawIdx = -1;
		
		// Set Bingo Template
		m_actxCv['BG'].clearRect(0,0,m_iCvWt,m_iCvHt);
		m_iBingoOrderX = 0;
		
		m_iState = 1;
		m_bTitleLoaded = false;
	} else if (m_iState == 1) {
		// **************************************** Title Loop
		// Draw Title
		iTemp4 = m_astrInit['tt_itla'];
		iTemp = 0.8;
		iTemp2 = 0.05;
		iTemp3 = (m_iCvWt * iTemp) / m_iTitleCnt;
		
		if (iTemp4 != 0 || !m_bTitleLoaded) {
			m_actxCv['TT'].clearRect(0,0,m_iCvWt,m_iCvHt);
			for (iIdx = 0; iIdx < m_iTitleCnt; iIdx++) {
				for (iIdx2 = 0; iIdx2 < 2; iIdx2++) {
					if        (iTemp4 == 0) { iRow = 0; iRow2 = 0;
					} else if (iTemp4 == 1) { iRow = -1; iRow2 = 1;
					} else if (iTemp4 == 2) { iRow = (iIdx % 2 == 0 ? -1 : 1); iRow2 = (iIdx % 2 == 0 ? 1 : -1);
					} else if (iTemp4 == 3) { iRow = (m_iTitleCnt - iIdx) / m_iTitleCnt * 2 - 1; iRow2 = (iIdx + 1) / m_iTitleCnt * 2 - 1;
					}
					
					iX = m_iCvWt * (1 - iTemp) * 0.5 + iTemp3 * iIdx;
					iY = (m_iCvHt - m_iCvHt * m_iLineHeight * (m_iTitleCnt - 1)) * 0.5 - iTemp3 * 0.5;
					iY += m_iCvHt * fnCos(iRow,iRow2,1,iPar) * iTemp2;
					iZ = 1.7;
					sbDrawLine(m_actxCv['TT'],iX,iY,iTemp3,iTemp3,m_astrTitlePath[iIdx],iZ,(iIdx2 == 0 ? m_astrTitleSIro[iIdx] : m_astrTitleFIro[iIdx]),(iIdx2 == 1));
				}
			}
			m_bTitleLoaded = true;
		}
		
		// Set RuleText
		if (m_iProc % 30 == 0 && m_iRuleDrawIdx <= m_iRuleDrawCnt) {
			m_astrNn['RL'] = '';
			iW = 0;
			iH = m_iCvHt * m_iLineHeight;
			for (iIdx = 0; iIdx < m_iRuleCnt; iIdx++) {
					strText = '';
					if (m_aiRuleO[iIdx] <= m_iRuleDrawIdx || m_aiRuleO[iIdx] < m_iRuleDrawCnt) {
						strText += m_astrRuleHead[iIdx];
					}
					if (m_aiRuleO[iIdx] <= m_iRuleDrawIdx) {
						strText += '<span style="font-size: ' + Math.round(m_iCvHt * 0.04) +  'px;">' + m_astrRuleText[iIdx] + '</span>';
					}
					iX = m_iCvHt * (0.04 * (m_aiRuleX[iIdx] + 2)) + m_aiRuleG[iIdx] * m_iCvWt * 0.5;
					iY = m_iCvHt - m_iCvHt * m_iLineHeight * (m_aiRuleY[iIdx] + 2);
					m_astrNn['RL'] += sbDrawLabel(iX,iY,iW,iH,'l',m_iCvHt * m_iLineHeight,m_astrRuleFIro[iIdx],strText);
			}
			
			// Set Bingo Template
			iW = m_iCvWt * 0.9 / m_iBingoColCnt;
			iH = m_iCvHt * 0.2 / m_iBingoRowCnt;
			iTemp = (iW < iH ? iW : iH);
			for (iIdx3 = 0; iIdx3 < m_iBingoCnt; iIdx3++) {
				if (m_aiBingoOrder[iIdx3] == m_iRuleDrawIdx) {
					iTemp3 = 0;
					for (iIdx = 0; iIdx < m_aaiBingoCol[iIdx3].length; iIdx++) {
						if (m_aaiBingoIdx[iIdx3][iIdx] > 1) {
							iX = m_aaiBingoCol[iIdx3][iIdx];
							iY = m_aaiBingoRow[iIdx3][iIdx];
							for (iIdx2 = 0; iIdx2 < 2; iIdx2++) {
								sbDrawLine(m_actxCv['BG'],m_iCvWt * (1 - 0.05) - m_iBingoColCnt * iTemp + (m_iBingoOrderX + iX) * iTemp,m_iCvHt * 0.45 + iY * iTemp,iTemp,iTemp,m_astrBlockPath[iIdx3 % m_iBlockCnt],1,(iIdx2 == 0 ? m_astrInit['al_clpb'] : m_astrInit['al_clpt']),(iIdx2 == 1));
							}
							iTemp3 = (iX + 1 > iTemp3 ? iX + 1 : iTemp3);
						}
					}
					if (iTemp3 > 0) {
						m_iBingoOrderX += iTemp3 + 1;
					}
				}
			}
			
			m_iRuleDrawIdx++;
		}
	} else if (m_iState == 10) {
		// **************************************** Game Start
		sbViewLayer('G0,G1,WL,NX,BS,BD,EF','SS,SD,SN');
		m_elmIt0.style.display = 'none';
		m_elmIt1.style.display = 'block';
		
		for (iCol = 0; iCol < m_iSpaceCol; iCol++) {
			m_aiStHeight[iCol] = 0;
			m_aaiStBlockOld[iCol] = [];
			m_aaiStBlockNew[iCol] = [];
			for (iRow = 0; iRow < m_iSpaceRow; iRow++) {
				m_aaiStBlockOld[iCol][iRow] = -1;
				m_aaiStBlockNew[iCol][iRow] = -1;
			}
		}
		
		// Next
		m_iDyCombiNxt = Math.floor(Math.random() * m_iCombiCnt);
		for (iIdx = 0; iIdx < m_aaiCombiCol[m_iDyCombiNxt].length; iIdx++) {
			m_aiDyBlockNxt[iIdx] = Math.floor(Math.random() * m_iBlockCnt);
		}
		
		// Score
		m_iScoreRensaMax = 0;
		m_iScore = 0;
		for (iIdx = 1; iIdx <= m_iScoreRensaMem; iIdx++) {
			m_aiScoreRensa[iIdx] = 0;
		}
		sbViewScore();
		
		// Init
		m_iDropCnt = 0;
		m_iGame = 0;
		m_iState = 11;
	} else if (m_iState == 11) {
		// **************************************** Game Loop
			if (0 == 1) {
			} else if (m_iGame == 0) {
				// ******************** Start
				m_iDyCombiIdx = m_iDyCombiNxt;
				m_iDyCnt = m_aaiCombiCol[m_iDyCombiIdx].length;
				for (iIdx = 0; iIdx < m_iDyCnt; iIdx++) {
					m_aiDyBlockIdx[iIdx] = m_aiDyBlockNxt[iIdx];
				}
				m_iDyColAdd = Math.round(m_iSpaceCol / 2);
				m_iDyRowAdd = m_iBlockLine - Math.round((m_aiCombiRowCnt[m_iDyCombiIdx] + 1) / 2) + 1;
				m_iDyRttAdd = 0;
				
				// Next
				m_actxCv['NX'].clearRect(0,0,m_iCvWt,m_iCvHt);
				m_iDyCombiNxt = Math.floor(Math.random() * m_iCombiCnt);
				for (iIdx = 0; iIdx < m_aaiCombiCol[m_iDyCombiNxt].length; iIdx++) {
					m_aiDyBlockNxt[iIdx] = Math.floor(Math.random() * m_iBlockCnt);
					sbFillShape('NX',m_iDyColAdd + Math.floor(m_aaiCombiCol[m_iDyCombiNxt][iIdx]),m_iBlockLine - Math.round((m_aiCombiRowCnt[m_iDyCombiNxt] + 1) / 2) + 1 + Math.floor(m_aaiCombiRow[m_iDyCombiNxt][iIdx]),0.7,m_astrBlockPath[m_aiDyBlockNxt[iIdx]],m_astrBlockFIro[m_aiDyBlockNxt[iIdx]]);
				}
				
				m_iDropCnt++;
				m_iRensa = 0;
				m_iControl = -1;
				m_iDySpeed = m_iDropCnt * 0.01;
				m_iDySpeed = (m_iDySpeed < 0.1 ? 0.1 : (m_iDySpeed > 2 ? 2 : m_iDySpeed));
				m_iGame = 1;
			} else if (m_iGame == 1 || m_iGame == 3) {
				// ******************** Drop
				m_iDyRowAdd += (m_iGame == 1 ? m_iDySpeed : 0.5);
				
				iY = -1;
				for (iIdx3 = 0; iIdx3 < 2; iIdx3++) {
					aiBad[iIdx3] = 0;
					if (m_iGame == 1) {
						if (iIdx3 == 0) {
							if        (m_iControl == -1) {
							} else if (m_iControl ==  2) { m_iDyRowAdd += 2;
							}
						} else if (iIdx3 == 1) {
							if        (m_iControl == -1) {
							} else if (m_iControl ==  0) { m_iDyRttAdd = (m_iDyRttAdd + 1) % 4;
							} else if (m_iControl ==  1) { m_iDyColAdd++;
							} else if (m_iControl ==  3) { m_iDyColAdd--;
							}
						}
					}
					
					for (iIdx = 0; iIdx < m_iDyCnt; iIdx++) {
						iCol = fnGetCol(iIdx) + m_iDyColAdd;
						iRow = fnGetRow(iIdx) + m_iDyRowAdd;
						iIdx2 = m_aiStHeight[iCol] + (iRow - m_iDyRowAdd) + 1;
						if (iCol < 0 || iCol > m_iSpaceCol - 1 || m_iDyRowAdd >= m_iSpaceRow - iIdx2) {
							aiBad[iIdx3] = 1;
							if (iIdx3 == 0) {
								iY = (iY > iIdx2 ? iY : iIdx2);
							}
						}
					}
				}
				if (aiBad[1] == 1) {
					if (m_iGame == 1) {
						if        (m_iControl ==  0) { m_iDyRttAdd--; if (m_iDyRttAdd < 0) { m_iDyRttAdd = 3; }
						} else if (m_iControl ==  1) { m_iDyColAdd--;
						} else if (m_iControl ==  3) { m_iDyColAdd++;
						}
					}
					if (aiBad[0] == 1) {
						m_iGame = 2;
					}
				}
				if (m_iControl !=  2) {
					m_iControl = -1;
				}
				
				if (m_iGame == 2) {
					iY = Math.round(iY);
					m_iDyRowAdd = m_iSpaceRow - iY;
				}
				
				m_actxCv['BD'].clearRect(0,0,m_iCvWt,m_iCvHt);
				for (iIdx = 0; iIdx < m_iDyCnt; iIdx++) {
					iCol = fnGetCol(iIdx) + m_iDyColAdd;
					iRow = fnGetRow(iIdx) + m_iDyRowAdd;
					sbFillShape('BD',iCol,iRow,fnCos(1.2,1.4,10,iPar),m_astrBlockPath[m_aiDyBlockIdx[iIdx]],m_astrBlockFIro[m_aiDyBlockIdx[iIdx]]);
				}
			} else if (m_iGame == 2) {
				// ******************** Adjust
				for (iIdx = 0; iIdx < m_iDyCnt; iIdx++) {
					iCol = fnGetCol(iIdx) + m_iDyColAdd;
					iRow = fnGetRow(iIdx) + m_iDyRowAdd;
					m_aaiStBlockNew[iCol][iRow] = m_aiDyBlockIdx[iIdx];
				}
				
				m_iDyCnt = 0;
				m_aiCombiColCnt[m_iCombiCnt] = 0;
				m_aiCombiRowCnt[m_iCombiCnt] = 0;
				for (iCol = 0; iCol < m_iSpaceCol; iCol++) {
					iTemp = 0;
					for (iRow = m_iSpaceRow - 1; iRow >= 0; iRow--) {
						if (m_aaiStBlockNew[iCol][iRow] > -1) {
							if (m_iSpaceRow - iRow - 1 != iTemp) {
								m_aiDyBlockIdx[m_iDyCnt] = m_aaiStBlockNew[iCol][iRow];
								m_aaiCombiCol[m_iCombiCnt][m_iDyCnt] = iCol;
								m_aaiCombiRow[m_iCombiCnt][m_iDyCnt] = iRow;
								m_aiCombiColCnt[m_iCombiCnt] = (m_aiCombiColCnt[m_iCombiCnt] > iCol + 1 ? m_aiCombiColCnt[m_iCombiCnt] : iCol + 1);
								m_aiCombiRowCnt[m_iCombiCnt] = (m_aiCombiRowCnt[m_iCombiCnt] > iRow + 1 ? m_aiCombiRowCnt[m_iCombiCnt] : iRow + 1);
								m_iDyCnt++;
								m_aaiStBlockNew[iCol][iRow] = -1;
							}
							iTemp++;
						}
					}
				}
				
				// Draw Static Block
				for (iCol = 0; iCol < m_iSpaceCol; iCol++) {
					for (iRow = 0; iRow < m_iSpaceRow; iRow++) {
						iX = m_iSpaceX + iCol * m_iBlockSize;
						iY = m_iSpaceY + iRow * m_iBlockSize;
						if (m_aaiStBlockOld[iCol][iRow] > -1 && m_aaiStBlockNew[iCol][iRow] == -1) {
							m_actxCv['BS'].fillStyle = m_aastrSpaceFIro[iCol][iRow];
							sbFillBlock('BS',iCol,iRow,0);
						} else if (m_aaiStBlockOld[iCol][iRow] <  0 && m_aaiStBlockNew[iCol][iRow] > -1) {
							sbFillShape('BS',iCol,iRow,1,m_astrBlockPath[m_aaiStBlockNew[iCol][iRow]],m_astrBlockFIro[m_aaiStBlockNew[iCol][iRow]]);
							m_actxCv['BS'].globalAlpha = 0.2;
							sbFillShape('BS',iCol,iRow,0.8,m_astrBlockPath[m_aaiStBlockNew[iCol][iRow]],'#333');
							m_actxCv['BS'].globalAlpha = 1;
						}
					}
				}
				m_actxCv['BD'].clearRect(0,0,m_iCvWt,m_iCvHt); //@
				
				for (iCol = 0; iCol < m_iSpaceCol; iCol++) {
					m_aiStHeight[iCol] = 0;
					for (iRow = 0; iRow < m_iSpaceRow && m_aiStHeight[iCol] == 0; iRow++) {
						if (m_aaiStBlockNew[iCol][iRow] > -1) {
							m_aiStHeight[iCol] = m_iSpaceRow - iRow;
						}
					}
				}
				
				for (iCol = 0; iCol < m_iSpaceCol; iCol++) {
					for (iRow = 0; iRow < m_iSpaceRow; iRow++) {
						m_aaiStBlockOld[iCol][iRow] = m_aaiStBlockNew[iCol][iRow];
					}
				}
				
				if (m_iDyCnt > 0) {
					m_iDyCombiIdx = m_iCombiCnt;
					m_iDyColAdd = 0;
					m_iDyRowAdd = 0;
					m_iDyRttAdd = 0;
					m_iGame = 3;
				} else {
					m_iSub = 0;
					m_iBingoFlg = 0;
					m_iGame = 4;
				}
			} else if (m_iGame == 4) {
				// ******************** Check Bingo
				m_iDyCnt = 0;
				for (iRow = 0; iRow < m_iSpaceRow - m_aiBingoRowCnt[m_iSub] + 1; iRow++) {
					for (iCol = 0; iCol < m_iSpaceCol - m_aiBingoColCnt[m_iSub] + 1; iCol++) {
						iTemp2 = 0;
						iTemp3 = -2;
						for (iIdx = 0; iIdx < m_aaiBingoCol[m_iSub].length && iTemp2 == 0; iIdx++) {
							if (m_aaiStBlockOld[iCol + m_aaiBingoCol[m_iSub][iIdx]][iRow + m_aaiBingoRow[m_iSub][iIdx]] == iTemp3 || iTemp3 == -2) {
								iTemp3 = m_aaiStBlockOld[iCol + m_aaiBingoCol[m_iSub][iIdx]][iRow + m_aaiBingoRow[m_iSub][iIdx]];
							} else {
								iTemp2 = 1;
							}
						}
						if (iTemp2 == 0) {
							for (iIdx = 0; iIdx < m_aaiBingoCol[m_iSub].length; iIdx++) {
								if (m_aaiStBlockNew[iCol + m_aaiBingoCol[m_iSub][iIdx]][iRow + m_aaiBingoRow[m_iSub][iIdx]] > -1) {
									m_aaiStBlockNew[iCol + m_aaiBingoCol[m_iSub][iIdx]][iRow + m_aaiBingoRow[m_iSub][iIdx]] = -2;
									m_iBingoFlg++;
								}
							}
						}
					}
				}
				
				m_iSub++;
				if (m_iSub >= m_iBingoCnt) {
					if (m_iBingoFlg > 0) {
						m_iEffectCnt = 0;
						for (iRow = 0; iRow < m_iSpaceRow; iRow++) {
							for (iCol = 0; iCol < m_iSpaceCol; iCol++) {
								if (m_aaiStBlockNew[iCol][iRow] == -2) {
									m_aaiStBlockNew[iCol][iRow] = -1;
									m_aiEffectCol[m_iEffectCnt] = iCol;
									m_aiEffectRow[m_iEffectCnt] = iRow;
									m_iEffectCnt++;
								}
							}
						}
						m_iRensa++;
						m_iSub = 0;
						m_iGame = 5;
					} else {
						m_iGame = 6;
					}
				}
			} else if (m_iGame == 5) {
				// ******************** Effect
				iTemp = 8;
				
				if (m_iSub == 0) {
					m_iScoreAdd = Math.pow(m_iRensa,2) * m_iEffectCnt;
				}
				m_astrNn['SN'] = '';
				m_astrNn['SN'] += sbDrawLabel(0,m_iCvHt * (0.4 -  0.02 * m_iSub),0,m_iCvHt * 0.1,'c',m_iCvHt * 0.1,m_astrInit['gm_clr2'],m_astrSound[(m_iRensa - 1 < m_astrSound.length ? m_iRensa - 1 : m_astrSound.length - 1)]);
				m_astrNn['SN'] += sbDrawLabel(0,m_iCvHt * (0.5 -  0.01 * m_iSub),0,m_iCvHt * 0.1,'c',m_iCvHt * 0.1,m_astrInit['gm_clr0'],m_astrInit['gm_str1'].replace('%0%',m_iRensa));
				m_astrNn['SN'] += sbDrawLabel(0,m_iCvHt * (0.6 - 0.005 * m_iSub),0,m_iCvHt * 0.1,'c',m_iCvHt * 0.1,m_astrInit['gm_clr1'],m_astrInit['gm_sti1'].replace('%0%',m_iScoreAdd));
				if (m_iSub < 6) {
					m_actxCv['EF'].clearRect(0,0,m_iCvWt,m_iCvHt);
					m_actxCv['EF'].fillStyle = m_astrInit['gm_clrs'];
					m_actxCv['EF'].globalAlpha = 0.5;
					m_actxCv['EF'].fillRect(0,0,m_iCvWt,m_iCvHt);
					m_actxCv['EF'].globalAlpha = 1;
					if (m_iSub % 2 == 0) {
						for (iIdx = 0; iIdx < m_iEffectCnt; iIdx++) {
							sbFillShape('EF',m_aiEffectCol[iIdx],m_aiEffectRow[iIdx],1 + (m_iSub / iTemp) * 3,m_astrBlockPath[m_aaiStBlockOld[m_aiEffectCol[iIdx]][m_aiEffectRow[iIdx]]],m_astrInit['gm_clef']);
						}
					}
				}
				m_iSub++;
				if (m_iSub >= iTemp) {
					
					// Score
					m_iScoreRensaMem = (m_iScoreRensaMem > m_iRensa ? m_iScoreRensaMem : m_iRensa);
					m_iScoreRensaMax = (m_iScoreRensaMax > m_iRensa ? m_iScoreRensaMax : m_iRensa);
					if (isNaN(m_aiScoreRensa[m_iRensa])) {
						m_aiScoreRensa[m_iRensa] = 1;
					} else {
						m_aiScoreRensa[m_iRensa] ++;
					}
					if (m_iRensa > 1) {
						m_aiScoreRensa[m_iRensa - 1] --;
					}
					m_iScore += m_iScoreAdd;
					
					//Draw
					m_actxCv['EF'].clearRect(0,0,m_iCvWt,m_iCvHt);
					m_astrNn['SN'] = '';
					sbViewScore();
					
					m_iGame = 2;
				}
			} else if (m_iGame == 6) {
				// ******************** Check Over
				iTemp = 0;
				for (iRow = 0; iRow < m_iBlockLine && iTemp == 0; iRow++) {
					for (iCol = 0; iCol < m_iSpaceCol && iTemp == 0; iCol++) {
						if (m_aaiStBlockOld[iCol][iRow] != -1) {
							iTemp = 1;
						}
					}
				}
				m_iGame = 0;
				if (iTemp == 1) {
					m_iSub = 0;
					m_iState = 20;
				}
			}
	} else if (m_iState == 20) {
		// **************************************** Over Start
		iTemp = 30;
		if (m_iSub == 0) {
			m_actxCv['EF'].fillStyle = m_astrInit['ov_clos'];
		}
		m_iSub++;
		
		iTemp2 = m_iSub / (iTemp * 0.3);
		iTemp2 = (iTemp2 > 1 ? 1 : iTemp2);
		iTemp3 = m_iCvHt * iTemp2;
		m_actxCv['EF'].clearRect(0,0,m_iCvWt,m_iCvHt);
		m_actxCv['EF'].globalAlpha = fnCos(0,0.7,0.5,iTemp2);
		m_actxCv['EF'].fillRect(0,m_iCvHt - iTemp3,m_iCvWt,iTemp3);
		
		if (m_iSub >= iTemp) {
			m_actxCv['EF'].globalAlpha = 1;
			m_iState = 21;
		}
	} else if (m_iState == 21) {
		// **************************************** Over Loop
		m_astrNn['SN'] = '';
		m_astrNn['SN'] += sbDrawLabel(0,m_iCvHt * fnCos(0.20,0.25,2,iPar),0,m_iCvHt * 0.1,'c',m_iCvHt * 0.1,m_astrInit['ov_clo0'],m_astrInit['al_stnm']);
		m_astrNn['SN'] += sbDrawLabel(0,m_iCvHt * fnCos(0.43,0.47,8,iPar),0,m_iCvHt * 0.1,'c',m_iCvHt * 0.1,m_astrInit['ov_clo1'],m_astrInit['gm_stov']);
		m_astrNn['SN'] += sbDrawLabel(0,m_iCvHt * fnCos(0.65,0.70,3,iPar),0,m_iCvHt * 0.1,'c',m_iCvHt * 0.1,m_astrInit['ov_clo2'],m_astrInit['gm_sti1'].replace('%0%',m_iScore));
	}
	//@
	if (1 == 0) {
		strTemp = '';
		for (iRow = 0; iRow < m_iSpaceRow; iRow++) {
			strTemp += '|';
			for (iCol = 0; iCol < m_iSpaceCol; iCol++) {
				strTemp += '' + (m_aaiStBlockOld[iCol][iRow] == -1 ? '.' : m_aaiStBlockOld[iCol][iRow]) + '';
			}
			strTemp += '|';
			strTemp += '<br />';
		}
		m_astrNn['SS'] = sbDrawLabel(0,100,200,200,'l',12,'#000',strTemp);
	}
	//@
	
	// ********************************************************************************
	// Draw Back
	if (m_iSpecLevel < 10) {
		if (m_iState == 11) {
			m_actxCv['G1'].clearRect(0,0,m_iCvWt,m_iCvHt);
			for (iIdx = 0; iIdx < m_iGroundCnt; iIdx++) {
				iX = fnCos(m_aiGroundX0[iIdx],m_aiGroundX1[iIdx],0.5,iPar);
				iY = fnCos(m_aiGroundY0[iIdx],m_aiGroundY1[iIdx],0.5,iPar);
				iZ = fnCos(m_aiGroundZ0[iIdx],m_aiGroundZ1[iIdx],0.5,iPar);
				iA = fnCos(m_aiGroundA0[iIdx],m_aiGroundA1[iIdx],0.5,iPar);
				m_actxCv['G1'].globalAlpha = iA;
				sbDrawLine(m_actxCv['G1'],iX,iY,m_iCvWt,m_iCvWt,m_astrGroundPath[iIdx],iZ,m_astrGroundFIro[iIdx],true);
			}
			if (iPar == 1) {
				sbReCalcGround();
			}
		}
	}
	
	iSecDiff = (+new Date()) - iSecSt;
	if (m_iState == 11) {
		if (iSecDiff > m_iInterval * 0.7 && m_iSpecLevel < 100) {
			m_iSpecLevel++;
		}
	}
	//@
	//m_astrNn['SD'] = sbDrawLabel(0,0,100,100,'l',12,'#000','[m_iDyCombiIdx:' + m_iDyCombiIdx + '][m_iState:' + m_iState + '][m_iGame:' + m_iGame + '][iSecDiff:' + iSecDiff + '][m_iSpecLevel:' + m_iSpecLevel + ']');
	//@
	
	// View Text
	sbViewText();
}

function sbReCalcGround() {
	var iIdx;
	for (iIdx = 0; iIdx < m_iGroundCnt; iIdx++) {
		m_aiGroundX0[iIdx] = m_aiGroundX1[iIdx];
		m_aiGroundY0[iIdx] = m_aiGroundY1[iIdx];
		m_aiGroundZ0[iIdx] = m_aiGroundZ1[iIdx];
		m_aiGroundA0[iIdx] = m_aiGroundA1[iIdx];
		m_aiGroundX1[iIdx] = Math.floor(Math.random() * m_iCvHt) - m_iCvHt / 2;
		m_aiGroundY1[iIdx] = Math.floor(Math.random() * m_iCvHt) - m_iCvHt / 2;
		m_aiGroundZ1[iIdx] = Math.random() * (m_astrInit['al_prz1'] - m_astrInit['al_prz0']) + m_astrInit['al_prz0'];
		m_aiGroundA1[iIdx] = Math.random() * (m_astrInit['al_pra1'] - m_astrInit['al_pra0']) + m_astrInit['al_pra0'];
	}
}

function sbViewScore() {
	var iHit;
	var iIdx,iIdx2,iY,iMax;
	
	m_astrNn['SD'] = '';
	iMax = m_iScoreRensaMax;
	for (iIdx = 0; iIdx < m_iInfoCnt; iIdx++) {
		if (iIdx == 0) {
			strText = m_astrInit['gm_sti1'].replace('%0%',m_iScore);
		} else {
			iHit = -1;
			for (iIdx2 = iMax; iIdx2 >= 1 && iHit == -1; iIdx2--) {
				if (m_aiScoreRensa[iIdx2] > 0) {
					iMax = iIdx2 - 1;
					iHit = iIdx2;
				}
			}
			strText = '';
			if (iHit > 0) {
				strText += m_astrInit['gm_str1'].replace('%0%',iHit);
				if (m_aiScoreRensa[iHit] > 1) {
					strText += m_astrInit['gm_str2'].replace('%0%',m_aiScoreRensa[iHit]);
				}
			}
		}
		iY = (m_iTextH + m_iWallMargin * 3) * iIdx + (iIdx < 1 ? 0 : m_iTextH + m_iWallMargin * 2);
		m_astrNn['SD'] += sbDrawLabel(m_iTextX,iY + m_iTextY + m_iTextH + m_iWallMargin * 3,m_iTextW,m_iTextH,'c',m_iTextH,m_astrInit['gm_cli1'],strText);
	}
}

function fnGetCol(iIdx) {
	return Math.floor(((m_iDyRttAdd % 2 == 0 ? m_aaiCombiCol[m_iDyCombiIdx][iIdx] : m_aaiCombiRow[m_iDyCombiIdx][iIdx]) + (m_iDyRttAdd == 1 || m_iDyRttAdd == 2 ? 1.5 : 0))) * (m_iDyRttAdd == 1 || m_iDyRttAdd == 2 ? -1 : 1);
}
function fnGetRow(iIdx) {
	return Math.floor(((m_iDyRttAdd % 2 == 0 ? m_aaiCombiRow[m_iDyCombiIdx][iIdx] : m_aaiCombiCol[m_iDyCombiIdx][iIdx]) + (m_iDyRttAdd == 2 || m_iDyRttAdd == 3 ? 1.5 : 0))) * (m_iDyRttAdd == 2 || m_iDyRttAdd == 3 ? -1 : 1);
}

// ********************************************************************************************************************************************************
function fnSend() {
	var strName = document.getElementById('ochi_req').value;
	
	if (strName == m_astrInit['al_stnm']) {
		return false;
	}
	
	m_strURL = m_strURLSend;
	if (strName.length < 1) {
		m_strURL = m_strURLInit;
//		document.getElementById('ochi_req').focus();
//		return false;
	}
	
	var strReq;
	strReq = '';
	strReq += '&name=' + encodeURIComponent(strName);
	
	// Cache 
	var dNow = new Date();
	
	// Create Object
	var xmlhttp = fnCreateXMLHttp();
	if (xmlhttp) {
		xmlhttp.open('GET', m_strURL + '?time=' + dNow.getTime() + strReq);
		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
				strRes = xmlhttp.responseText;
				sbAdjustData(strRes)
			}
		}
		xmlhttp.send(null);
	}
	
	return false;
}

function sbChangeSize(iW) {
	m_iCvWt = iW;
	m_iCvHt = m_iCvWt / 4 * 3;
	sbInitGame();
	return false;
}

function sbReset() {
	sbInitGame();
	return false;
}

function sbAdjustData(strData) {
	var astrLine = [];
	var astrCell = [];
	var astrTemp = [];
	var astrTemp2 = [];
	var astrTemp3 = [];
	var strType = '';
	var iCellCnt;
	var iLine = 0;
	var iError = 0;
	var iLineIdx
	var iIdx,iIdx2,iIdx3;
	var iX,iY,iW,iH,iZ,iRow,iCol;
	var iTemp;
	var strAlert = '';
	
	// ******************** Read Data
	strData = strData.replace(/\r/g,'');
	astrLine = strData.split("\n");
	
	for (iLineIdx = 1; iLineIdx < astrLine.length; iLineIdx++) {
		if (astrLine[iLineIdx].length > 1) {
			astrCell = astrLine[iLineIdx].split(';');
			iCellCnt = astrCell.length;
			if (astrCell[0] == '********************') {
				strType = astrCell[1];
				iLine = 0;
				if (strType == 'init') {
					m_iRuleDrawCnt = 0;
					m_iRuleCnt = 0;
					m_iBlockCnt = 0;
					m_iGroundCnt = 0;
					m_iTitleCnt = 0;
					m_iCombiCnt = 0;
					m_iBingoCnt = 0;
					m_iBlockCol = 0;
					m_iBlockRow = 0;
				}
			} else {
				if (0 == 1) {
				} else if (strType == 'init') {
					if (iCellCnt < 2) {
						iError ++;
					} else {
						m_astrInit[astrCell[0]] = astrCell[1];
						iLine ++;
					}
				} else if (strType == 'rule') {
					if (iCellCnt != 7) {
						iError ++;
					} else {
						m_aiRuleO[iLine] = Number(astrCell[0]);
						m_aiRuleG[iLine] = Number(astrCell[1]);
						m_aiRuleX[iLine] = Number(astrCell[2]);
						m_aiRuleY[iLine] = Number(astrCell[3]);
						m_astrRuleFIro[iLine] = astrCell[4];
						m_astrRuleHead[iLine] = astrCell[5];
						m_astrRuleText[iLine] = astrCell[6];
						m_iRuleDrawCnt = (m_aiRuleO[iLine] > m_iRuleDrawCnt ? m_aiRuleO[iLine] : m_iRuleDrawCnt);
						m_iRuleCnt++;
						iLine ++;
					}
				} else if (strType == 'block') {
					if (iCellCnt != 2) {
						iError ++;
					} else {
						m_astrBlockFIro[iLine] = astrCell[0];
						m_astrBlockPath[iLine] = [];
						m_astrBlockPath[iLine] = fnAdjustPath(astrCell[1].split(' '),m_iPathSize);
						m_iBlockCnt++;
						iLine ++;
					}
				} else if (strType == 'ground') {
					if (iCellCnt != 2) {
						iError ++;
					} else {
						m_astrGroundFIro[iLine] = astrCell[0];
						m_astrGroundPath[iLine] = [];
						m_astrGroundPath[iLine] = fnAdjustPath(astrCell[1].split(' '),m_iPathSize);
						m_iGroundCnt++;
						iLine ++;
					}
				} else if (strType == 'title') {
					if (iCellCnt != 3) {
						iError ++;
					} else {
						m_astrTitleSIro[iLine] = astrCell[0];
						m_astrTitleFIro[iLine] = astrCell[1];
						m_astrTitlePath[iLine] = [];
						m_astrTitlePath[iLine] = fnAdjustPath(astrCell[2].split(' '),m_iPathSize);
						m_iTitleCnt++;
						iLine ++;
					}
				} else if (strType == 'alert') {
					strAlert = (strAlert == '' ? '' : "\n") + astrCell[0];
				} else if (strType == 'memo') {
				} else {
					iError ++;
				}
			}
		}
	}
	
	// ******************** Error Check
	if (strAlert != '') {
		alert(strAlert);
		document.getElementById('ochi_req').focus();
		return false;
	}
	
	// ******************** Adjust Numeric
	m_astrInit['al_prz0'] = Number(m_astrInit['al_prz0']);
	m_astrInit['al_prz1'] = Number(m_astrInit['al_prz1']);
	m_astrInit['al_pra0'] = Number(m_astrInit['al_pra0']);
	m_astrInit['al_pra1'] = Number(m_astrInit['al_pra1']);
	m_astrInit['tt_itla'] = Number(m_astrInit['tt_itla']);
	m_astrInit['gm_itsw'] = Number(m_astrInit['gm_itsw']);
	m_astrInit['gm_itsh'] = Number(m_astrInit['gm_itsh']);
	if (navigator.userAgent.indexOf("MSIE") != -1) {
		m_astrInit['tt_itla'] = 0;
	}
	
	// ******************** Adjust gm_stsd
	m_astrSound = m_astrInit['gm_stsd'].split(',');
	
	// ******************** Adjust gm_stbg
	astrTemp = m_astrInit['gm_stbg'].split(':');
	m_iBingoCnt = astrTemp.length;
	m_iBingoColCnt = -1;
	m_iBingoRowCnt = 0;
	for (iLine = 0; iLine < m_iBingoCnt; iLine++) {
		m_aaiBingoCol[iLine] = [];
		m_aaiBingoRow[iLine] = [];
		m_aaiBingoIdx[iLine] = [];
		m_aiBingoColCnt[iLine] = 0;
		m_aiBingoRowCnt[iLine] = 0;
		
		astrTemp2 = astrTemp[iLine].split(' ');
		iIdx = 0;
		iTemp = 0;
		for (iRow = 0; iRow < astrTemp2.length; iRow++) {
			astrTemp3 = astrTemp2[iRow].split(',');
			for (iCol = 0; iCol < astrTemp3.length; iCol++) {
				if (Number(astrTemp3[iCol]) > 0) {
					m_aaiBingoCol[iLine][iIdx] = iCol;
					m_aaiBingoRow[iLine][iIdx] = iRow;
					m_aaiBingoIdx[iLine][iIdx] = Number(astrTemp3[iCol]);
					m_aiBingoColCnt[iLine] = (m_aiBingoColCnt[iLine] > iCol + 1 ? m_aiBingoColCnt[iLine] : iCol + 1);
					if (m_aaiBingoIdx[iLine][iIdx] == 2) {
						iTemp = 1;
					}
					iIdx++;
				}
			}
			m_aiBingoRowCnt[iLine] = (m_aiBingoRowCnt[iLine] > iRow + 1 ? m_aiBingoRowCnt[iLine] : iRow + 1);
		}
		if (iTemp > 0) {
			m_iBingoColCnt += m_aiBingoColCnt[iLine] + 1;
			m_iBingoRowCnt = (m_iBingoRowCnt > m_aiBingoRowCnt[iLine] ? m_iBingoRowCnt : m_aiBingoRowCnt[iLine]);
		}
	}
	
	m_aiBingoOrder = m_astrInit['gm_stbr'].split(':');
	
	// ******************** Adjust gm_stcb
	astrTemp = m_astrInit['gm_stcb'].split(':');
	m_iCombiCnt = astrTemp.length;
	for (iLine = 0; iLine < m_iCombiCnt; iLine++) {
		m_aaiCombiCol[iLine] = [];
		m_aaiCombiRow[iLine] = [];
		m_aiCombiColCnt[iLine] = 0;
		m_aiCombiRowCnt[iLine] = 0;
		
		astrTemp2 = astrTemp[iLine].split(' ');
		iIdx = 0;
		for (iRow = 0; iRow < astrTemp2.length; iRow++) {
			astrTemp3 = astrTemp2[iRow].split(',');
			for (iCol = 0; iCol < astrTemp3.length; iCol++) {
				if (Number(astrTemp3[iCol]) > 0) {
					m_aaiCombiCol[iLine][iIdx] = iCol;
					m_aaiCombiRow[iLine][iIdx] = iRow;
					iIdx++;
					m_aiCombiColCnt[iLine] = (m_aiCombiColCnt[iLine] > iCol + 1 ? m_aiCombiColCnt[iLine] : iCol + 1);
				}
			}
			m_aiCombiRowCnt[iLine] = (m_aiCombiRowCnt[iLine] > iRow + 1 ? m_aiCombiRowCnt[iLine] : iRow + 1);
		}
		for (iIdx = 0; iIdx < m_aaiCombiCol[iLine].length; iIdx++) {
			m_aaiCombiCol[iLine][iIdx] -= (m_aiCombiColCnt[iLine] / 2);
			m_aaiCombiRow[iLine][iIdx] -= (m_aiCombiRowCnt[iLine] / 2);
		}
		m_iBlockCol = (m_iBlockCol > m_aiCombiColCnt[iLine] ? m_iBlockCol : m_aiCombiColCnt[iLine]);
		m_iBlockRow = (m_iBlockRow > m_aiCombiRowCnt[iLine] ? m_iBlockRow : m_aiCombiRowCnt[iLine]);
	}
	m_aaiCombiCol[m_iCombiCnt] = [];
	m_aaiCombiRow[m_iCombiCnt] = [];
	
	// ******************** Error
	if (iError > 0) {
//		alert("Error : " + iError);
	}
	
	// ******************** Start
	sbInitGame();
	m_bDataLoaded = true;
}

// ********************************************************************************
function sbFillShape(strCv,iX,iY,iZ,strPath,strColor) {
	sbDrawLine(m_actxCv[strCv],m_iSpaceX + iX * m_iBlockSize,m_iSpaceY + iY * m_iBlockSize,m_iBlockSize,m_iBlockSize,strPath,iZ,strColor,true);
}
function sbFillBlock(strCv,iX,iY,iM) {
	sbFillRect(strCv,m_iSpaceX + iX * m_iBlockSize,m_iSpaceY + iY * m_iBlockSize,m_iBlockSize,m_iBlockSize,iM);
}
function sbFillRect(strCv,iX,iY,iW,iH,iM) {
	m_actxCv[strCv].fillRect(iX - iM * 0.5,iY - iM * 0.5,iW + iM,iH + iM);
}
// ********************************************************************************
function sbDrawLabel(iX,iY,iW,iH,strAlign,iFontSize,strColor,strText) {
	var strStyleAlign;
	var strTemp;
	var strHTML;
	
	iX = Math.round(iX);
	iY = Math.round(iY);
	iW = Math.round(iW);
	iH = Math.round(iH);
	iFontSize = Math.round(iFontSize);
	
	iW = (iW > 0 ? iW : m_iCvWt - iX);
	strStyleAlign = (strAlign == 'c' ? 'center' : (strAlign == 'r' ? 'right' : 'left'));
	
	strHTML = '';
	if (iX >= 0 && iY >= 0 && iX + iW <= m_iCvWt && iY + iH <= m_iCvHt) {
		strTemp = strText.replace(/#/g, '<br />');
		strHTML += '<table style="left:' + iX + 'px; top:' + iY + 'px; width:' + iW + 'px;height:' + iH + 'px; font-size:' + iFontSize + 'px; color:' + strColor + '; text-align:' + strStyleAlign + ';"><tr><td>' + strTemp + '</td></tr></table>';
	}
	return strHTML;
}

function sbViewLayer(strCv,strNb) {
	strCv = ',' + strCv + ',';
	strNb = ',' + strNb + ',';
	var iIdx,strIdx;
	
	for (iIdx = 0; iIdx < m_astrArrayCv.length; iIdx++) {
		strIdx = m_astrArrayCv[iIdx];
		m_aelmCv[strIdx].style.visibility = (strCv.indexOf(strIdx) >= 0 ? 'visible' : 'hidden');
	}
	for (iIdx = 0; iIdx < m_astrArrayNb.length; iIdx++) {
		strIdx = m_astrArrayNb[iIdx];
		m_aelmNb[strIdx].style.visibility = (strNb.indexOf(strIdx) >= 0 ? 'visible' : 'hidden');
	}
}

function sbClearAll(strCv,strNb) {
	strCv = ',' + strCv + ',';
	strNb = ',' + strNb + ',';
	var iIdx,strIdx;
	
	for (iIdx = 0; iIdx < m_astrArrayCv.length; iIdx++) {
		strIdx = m_astrArrayCv[iIdx];
		if (strCv.indexOf(strIdx) >= 0) {
			m_actxCv[strIdx].clearRect(0,0,m_iCvWt,m_iCvHt);
		}
	}
	for (iIdx = 0; iIdx < m_astrArrayNb.length; iIdx++) {
		strIdx = m_astrArrayNb[iIdx];
		if (strNb.indexOf(strIdx) >= 0) {
			m_astrNo[strIdx] = '';
			m_astrNn[strIdx] = '';
			m_aelmNb[strIdx].innerHTML = '';
		}
	}
}
function sbViewText() {
	var iIdx,strIdx;
	for (iIdx = 0; iIdx < m_astrArrayNb.length; iIdx++) {
		strIdx = m_astrArrayNb[iIdx];
		if (m_astrNn[strIdx] != m_astrNo[strIdx]) {
			m_astrNo[strIdx] = m_astrNn[strIdx];
			m_aelmNb[strIdx].innerHTML = m_astrNo[strIdx];
		}
	}
}
function fnGetLinearGradient(ctxTemp,strColor0,strColor1) {
	var lgTemp;
	lgTemp = ctxTemp.createLinearGradient(0,0,0,m_iCvHt);
	lgTemp.addColorStop(0,strColor0);
	lgTemp.addColorStop(1,strColor1);
	return lgTemp;
}

// ********************************************************************************
// EnterKey Event
var m_elmFocus;
function fnGetKeycode(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 fnKeyDown(e) {
	var iKey = fnGetKeycode(e)
	fnKeyEvent(iKey);
}

function fnKeyUp() {
	if (m_iControl ==  2) {
//	if (m_iControl !=  0) {
		m_iControl = -1;
	}
}

var m_bMouse = false;
function sbMouseOver(iKey) {
	if (m_bMouse) {
		fnKeyEvent(iKey);
	}
	m_bMouse = false;
}
function sbMouseOn() {
	m_bMouse = true;
}

var m_iControl = -1;
function fnKeyEvent(iKey) {
	if (m_strURL == m_strURLInit) {
		return;
	}
	
	if (0 == 1) {
	} else if (m_iState == 1) {
		if (0 == 1) {
		} else if (iKey == 32) { m_iState = 10;
//		} else { alert(iKey)
		}
	} else if (m_iState == 11) {
		if (0 == 1) {
		} else if (iKey == 37 || iKey ==  65 || iKey ==  97) {	m_iControl = 3;	// Left
		} else if (iKey == 39 || iKey ==  68 || iKey == 100) {	m_iControl = 1;	// Right
		} else if (iKey == 40 || iKey ==  88 || iKey == 120 || iKey == 122) {	m_iControl = 2;	// Down
		} else if (iKey == 38 || iKey ==  83 || iKey ==  87 || iKey == 115) { m_iControl = 0;	// Trun
		}
	} else if (m_iState == 21) {
		if (0 == 1) {
		} else if (iKey == 32) { m_iState = 0;
		}
	}
}

//document.onkeypress = fnKeyDown;
document.onkeydown = fnKeyDown;
document.onkeyup = fnKeyUp;

// ********************************************************************************
// Common

function fnAdjustPath(astrPath,iScale) {
	var aiTemp = [];
	var iZoomin = 1 / iScale;
	var iX,iY;
	var iIdx;
	var strPath;
	
	strPath = '';
	for (iIdx = 0; iIdx < astrPath.length; iIdx++) {
		if        (astrPath[iIdx].length == 0) {
		} else if (astrPath[iIdx].length == 1) {
			strPath += astrPath[iIdx] + ' ';
		} else {
			aiTemp = astrPath[iIdx].split(',');
			iX = Number(aiTemp[0]) * iZoomin;
			iY = Number(aiTemp[1]) * iZoomin;
			strPath += iX + ',' + iY + ' ';
		}
	}
	return strPath.split(' ');
}

function sbDrawLine(ctxCv,iBaseX,iBaseY,iBaseW,iBaseH,astrPath,iSize,strColor,bFill) {
	var iX,iY;
	var aiX = [];
	var aiY = [];
	var aiTemp = [];
	var aiCurve = [];
	var iCurve;
	var iIdx;
	var strMode;
	var iCol;
	
	if (bFill) {
		ctxCv.fillStyle = strColor;
	} else {
		ctxCv.strokeStyle = strColor;
	}
	
	iBaseX -= iBaseW * (iSize - 1) * 0.5;
	iBaseY -= iBaseH * (iSize - 1) * 0.5;
	iBaseW = iBaseW * iSize;
	iBaseH = iBaseH * iSize;
	
	strMode = '';
	iCol = 0;
	for (iIdx = 0; iIdx < astrPath.length; iIdx++) {
		if        (astrPath[iIdx].length == 0) {
		} else if (astrPath[iIdx].length == 1) {
			strMode = astrPath[iIdx];
			if        (strMode == 'M')  {
			} else if (strMode == 'C')  { iCurve = 0;
			} else if (strMode == 'L')  {
			} else if (strMode == 'z')  { (bFill ? ctxCv.fill() : ctxCv.stroke());
			} else if (strMode == "\n") {
			} else                      {
			}
		} else {
			aiTemp = astrPath[iIdx].split(',');
			iX = Number(aiTemp[0]);
			iY = Number(aiTemp[1]);
			
			iX = iBaseX + iX * iBaseW;
			iY = iBaseY + iY * iBaseH;
			
			if        (strMode == 'M') {
				iCol = (iCol + 1) % 2;
				ctxCv.beginPath();
				ctxCv.moveTo(iX,iY);
			} else if (strMode == 'C') {
				aiCurve[iCurve * 2 + 0] = iX;
				aiCurve[iCurve * 2 + 1] = iY;
				iCurve++;
				
				if (iCurve == 3)   {
					ctxCv.bezierCurveTo(aiCurve[0],aiCurve[1],aiCurve[2],aiCurve[3],aiCurve[4],aiCurve[5]);
				}
			} else if (strMode == 'L') { ctxCv.lineTo(iX,iY);
			} else if (strMode == 'z') {
			} else                     {
			}
		}
	}
}

function sbGetParam() {
	var iIdx,iTemp;
	var strKey,strVal;
	var astrParam = [];
	var strQuery = window.location.search.substring(1);
	var astrParam = strQuery.split('&');
	for (iIdx = 0; iIdx < astrParam.length; iIdx++) {
		var iTemp = astrParam[iIdx].indexOf('=');
		if (iTemp > 0) {
			strKey = astrParam[iIdx].substring(0,iTemp);
			strVal = astrParam[iIdx].substring(iTemp + 1);
			astrParam[strKey] = strVal;
		}
	}
	return astrParam;
}

function fnCreateXMLHttp() {
	if(window.ActiveXObject){
		try {
			return new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				return new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				return null;
	 		}
	 	}
	} else if(window.XMLHttpRequest){
		return new XMLHttpRequest();
	} else {
		return null;
	}
}

function fnCos(iMin,iMax,iNum,iPar) {
	return iMin + (iMax - iMin) * ((1 - Math.cos(iPar * (iNum * 2) * Math.PI)) / 2);
}
function fnSin(iMin,iMax,iNum,iPar) {
	return iMin + (iMax - iMin) * ((1 - Math.sin(iPar * (iNum * 2) * Math.PI)) / 2);
}
function fnRep(strMsg,strRep0,strRep1,strRep2) {
	return strMsg.replace('%0%',strRep0).replace('%1%',strRep1).replace('%2%',strRep2);
}

