// ********** Const
// ***** Timer
var m_iAnimeMilliSec = 66;

// ********** Common
var m_dStart;
var m_bFocus = 0;

// ********** Const
var m_strURLSend = '/cgi-bin/generator/heya.cgi';

var m_iWait = 10;
var m_iRlMove = 40;
//m_iWait = 0;
//m_iRlMove = 2;
var m_iPathSize = 1000;

var m_iCvWt = 640;
var m_iCvHt = 1;
var m_iRmWt = 1;
var m_iRmHt = 1;
var m_iBlockSize = 1;
var m_iFontSize = 11;
var m_iFontSizeZoom = 48;
var m_iFontSizeName = 14;
var m_iFontMargin = 4;

var m_strForeColor = '#000';
var m_iLineWidth = 0.5;

// ********** Draw
var m_iAnimeIdx;
var m_iAnimeMax = 0;
var m_timAnime;
var m_elmBody;
var m_strDefine;
var m_iNameCnt;
var m_iPartCnt;
var m_astrInit = [];
var m_astrName = [];
var m_aiP = [];
var m_aiX = [];
var m_aiY = [];
var m_aiW = [];
var m_aiH = [];
var m_aiR = [];
var m_astrColor = [];
var m_astrLabel = [];
var m_astrPath = [];

var m_bFeint;
var m_iFeintP;
var m_iFeintX;
var m_iFeintY;

var m_aiRoomX = [];
var m_aiRoomY = [];

var m_strReq = '';

// ********** Draw
var m_elmPn;

var m_astrArrayCv = new Array('cvst','cvdm');
var m_astrArrayNb = new Array('lbst','lbdm');
var m_aelmCv = [];
var m_actxCv = [];
var m_aelmNb = [];
var m_astrNo = [];
var m_astrNn = [];

window.onload = sbInit;

function sbInit() {
	m_elmBody = document.getElementsByTagName('body').item(0);
	
	// ********** Init Canvas
	// Init Canvas
	m_elmPn = document.getElementById('gen_pn');
	for (iIdx = 0; iIdx < m_astrArrayCv.length; iIdx++) {
		strIdx = m_astrArrayCv[iIdx];
		m_aelmCv[strIdx] = document.getElementById('gen_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('gen_nb' + iIdx);
	}
	
	// Get Param
	var astrParam = [];
	astrParam = sbGetParam();
	var strReq = '';
	if ('n' in astrParam) {
		strReq = decodeURI(astrParam['n']);
		if (strReq != '') {
			strReq = strReq.replace(/,/g,"\n");
			document.getElementById('gen_name').value = strReq;
			document.getElementById('gen_res').value = '';
			sbSend();
		}
	}
	
	// ********** Start Timer
	m_timAnime = setInterval('sbAnime()',m_iAnimeMilliSec);
}

// ********************************************************************************
function sbInitGame() {
	var iIdx,strIdx;
	var iX,iY;
	
	if (m_iNameCnt == 1) {
		m_iCvHt = m_iCvWt * (3 / 4);
		m_iRmWt = m_iCvWt;
		m_iRmHt = m_iCvHt;
	} else {
		m_iRmWt = m_iCvWt / 2;
		m_iRmHt = m_iRmWt * (3 / 4);
		m_iCvHt = Math.ceil(m_iNameCnt / (m_iCvWt / m_iRmWt)) * m_iRmHt;
	}
	m_iBlockSize = m_iRmWt / 8;
	
	// ********** 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;
		m_actxCv[strIdx].lineWidth = m_iLineWidth;
	}
	
	// ********** Clear And Hidden
	sbClearAll('cvst,cvdm','lbst,lbdm');
	sbViewLayer('cvst,cvdm','lbst,lbdm');
	
	// ********** Draw Back
	m_astrNn['lbst'] = '';
	var iSW = m_actxCv['cvst'].lineWidth * 3;
	for (iIdx = 0; iIdx < m_iNameCnt; iIdx++) {
		m_aiRoomX[iIdx] = (iIdx % 2) * m_iRmWt;
		m_aiRoomY[iIdx] = Math.floor(iIdx / 2) * m_iRmHt;
		
		m_astrNn['lbst'] += sbDrawLabel(m_aiRoomX[iIdx] + m_iFontMargin,m_aiRoomY[iIdx] + m_iFontMargin,m_iRmWt - m_iFontMargin * 2,m_iFontSizeName + m_iFontMargin * 2,'l',m_iFontSizeName,'#000000',m_astrName[iIdx]);
		m_actxCv['cvst'].strokeStyle = '#ddddaa';
		for (iX = 0; iX < 8; iX++) {
			for (iY = 0; iY < 6; iY++) {
//				m_actxCv['cvst'].strokeRect(m_aiRoomX[iIdx] + iX * m_iBlockSize,m_aiRoomY[iIdx] + iY * m_iBlockSize,m_iBlockSize,m_iBlockSize);
			}
		}
		m_actxCv['cvst'].strokeStyle = '#000000';
		m_actxCv['cvst'].strokeRect(m_aiRoomX[iIdx] + iSW,m_aiRoomY[iIdx] + iSW,m_iRmWt - iSW * 2,m_iRmHt - iSW * 2);
	}
	m_aelmCv['cvst'].style.backgroundColor = '#eeeebb';
}

function sbAnime() {
	var iIdx;
	var strDefine;
	var astrDefine = [];
	var astrTempPath = [];
	var strTemp;
	
	strDefine = '' + document.getElementById('gen_res').value;
	
	// ********** Start Animation
	if (strDefine != '' && strDefine != m_strDefine) {
		// ********** Init
		astrDefine = strDefine.split('~');
		m_astrInit    = astrDefine[0].split(';');
		m_astrName    = astrDefine[1].split(';');
		m_aiP         = astrDefine[2].split(';');
		m_aiX         = astrDefine[3].split(';');
		m_aiY         = astrDefine[4].split(';');
		m_aiW         = astrDefine[5].split(';');
		m_aiH         = astrDefine[6].split(';');
		m_aiR         = astrDefine[7].split(';');
		m_astrColor   = astrDefine[8].split(';');
		m_astrLabel   = astrDefine[9].split(';');
		astrTempPath  = astrDefine[10].split(';');
		
		m_iNameCnt = (astrDefine[1] == '' ? 0 : m_astrName.length);
		m_iPartCnt = (astrDefine[2] == '' ? 0 : m_aiP.length);
		for (iIdx = 0; iIdx < m_iPartCnt; iIdx++) {
			m_aiP[iIdx] = Number(m_aiP[iIdx]);
			m_aiX[iIdx] = Number(m_aiX[iIdx]);
			m_aiY[iIdx] = Number(m_aiY[iIdx]);
			m_aiW[iIdx] = Number(m_aiW[iIdx]);
			m_aiH[iIdx] = Number(m_aiH[iIdx]);
			m_aiR[iIdx] = Number(m_aiR[iIdx]);
			m_astrPath[iIdx] = fnAdjustPath(astrTempPath[iIdx],m_iPathSize,m_iPathSize,1000,1000,0);
		}
		
		sbInitGame();
		
		// ********** Time
		if (m_bFocus == 0) {
			document.getElementById('gen_wait').style.display = 'none';
			document.getElementById('gen_all').style.display = 'block';
			document.getElementById('gen_name').focus();
			m_bFocus = 1;
		}
		m_dStart = new Date();
		
		// ********** Init Value
		m_iAnimeIdx = 0;
		m_iAnimeMax = (m_iWait + m_iRlMove) * m_iPartCnt;
		m_strDefine = strDefine;
		
		// ********** Set Permalink 
		strTemp = window.location.href
		iTemp = strTemp.indexOf('?');
		if (iTemp >= 0) {
			strTemp = strTemp.substring(0,iTemp);
		}
		if (m_astrInit[1] != '') {
			strTemp = strTemp + '?n=' + encodeURI(m_astrInit[1]);
		}
		document.getElementById('gen_url').value = strTemp;
	}
	
	// ********** Draw
	var iAnime;
	var iSt;
	var iSize;
	var iPar,iPar2;
	var iX0,iY0,iX1,iY1,iX,iY,iW,iH,iF;
	
	if (m_iAnimeIdx >= 0 && m_iAnimeIdx < m_iAnimeMax) {
		// ***** Calc
		iAnime = m_iAnimeIdx - m_iWait - (m_iWait + m_iRlMove) * Math.floor(m_iAnimeIdx / (m_iWait + m_iRlMove));
		iSt = Math.floor(m_iAnimeIdx / (m_iWait + m_iRlMove));
		iPar = (iAnime % m_iRlMove) / (m_iRlMove - 1);
		
		if (iPar >= 0) {
			if (iPar == 0) {
				m_bFeint = (m_iNameCnt > 1 && iSt > m_iPartCnt * 0.7 && Math.random() < 0.3);
				if (m_bFeint) {
					m_iFeintP = Math.floor(Math.random() * m_iNameCnt);
					m_iFeintX = Math.floor(Math.random() * (8 - m_aiW[iSt]));
					m_iFeintY = Math.floor(Math.random() * (6 - m_aiH[iSt]));
				}
			}
			
			iPar2 = (iPar - 0.4) / 0.4;
			iPar2 = (iPar2 < 0) ? 0 : iPar2;
			iPar2 = (iPar2 > 1) ? 1 : iPar2;
			iSize = 2 - Math.sin(iPar2 * Math.PI * 0.5);
			m_actxCv['cvdm'].globalAlpha = (iPar < 0.4 ? 1 : 0.6);
			
			if (m_bFeint) {
				if (iPar < 0.8) {
					iX0 = m_iCvWt / 2 - m_iRmWt / 2;
					iY0 = m_iCvHt / 2 - m_iRmWt / 2;
					iX1 = (m_iFeintX + (m_aiW[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomX[m_iFeintP];
					iY1 = (m_iFeintY + (m_aiH[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomY[m_iFeintP];
				} else {
					iX0 = (m_iFeintX + (m_aiW[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomX[m_iFeintP];
					iY0 = (m_iFeintY + (m_aiH[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomY[m_iFeintP];
					iX1 = (m_aiX[iSt] + (m_aiW[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomX[m_aiP[iSt]];
					iY1 = (m_aiY[iSt] + (m_aiH[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomY[m_aiP[iSt]];
					iPar2 = (iPar - 0.8) / 0.1;
					iPar2 = (iPar2 < 0) ? 0 : iPar2;
					iPar2 = (iPar2 > 1) ? 1 : iPar2;
				}
			} else {
				iX0 = m_iCvWt / 2 - m_iRmWt / 2;
				iY0 = m_iCvHt / 2 - m_iRmWt / 2;
				iX1 = (m_aiX[iSt] + (m_aiW[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomX[m_aiP[iSt]];
				iY1 = (m_aiY[iSt] + (m_aiH[iSt] - 8) / 2) * m_iBlockSize + m_aiRoomY[m_aiP[iSt]];
			}
			iX = iX0 + (iX1 - iX0) * Math.sin(iPar2 * Math.PI * 0.5);
			iY = iY0 + (iY1 - iY0) * Math.sin(iPar2 * Math.PI * 0.5);
			
			sbClearAll('cvdm','lbdm');
			sbDrawLine(m_actxCv[(iPar == 1 ? 'cvst' : 'cvdm')],1000,1000,iX,iY,m_iRmWt,m_iRmWt,m_astrPath[iSt],m_astrPath[iSt],0,iSize,m_iLineWidth,'',m_astrColor[iSt]);
			
			if (iPar < 0.4) {
				iX = 0;
				iY = 0;
				iW = m_iCvWt;
				iH = m_iCvHt;
				iF = m_iFontSizeZoom;
			} else {
				iX = iX + (8 - m_aiW[iSt]) * m_iBlockSize / 2;
				iY = iY + (8 - m_aiH[iSt]) * m_iBlockSize / 2;
				iW = m_aiW[iSt] * m_iBlockSize;
				iH = m_aiH[iSt] * m_iBlockSize;
				iF = m_iFontSize;
			}
			m_astrNn[(iPar == 1 ? 'lbst' : 'lbdm')] += sbDrawLabel(iX,iY,iW,iH,'c',iF,'#000000',m_astrLabel[iSt]);
		}
	}
	// ********** End Animation
	if (m_iAnimeIdx == m_iAnimeMax + m_iWait) {
		m_aelmCv['cvst'].style.backgroundColor = '#ffffff';
		//Amazon
		if (m_astrInit.length > 2) {
//@
//			sbGetAmazon('links','robot00-22','',encodeURIComponent(m_astrInit[2]),'',280,1);
//@
		}
		
		// ********** Check Time
		dNow = new Date();
		//alert(parseInt((dNow.getTime() - m_dStart.getTime())));
	}
	
	// ********** Add FrameCount
	if (m_iAnimeIdx >= 0 && m_iAnimeIdx <= m_iAnimeMax + m_iWait) {
		m_iAnimeIdx ++;
	}
	
	// View Text
	sbViewText();
}

function sbSend() {
	var strReq;
	var strName;
	
	strName = document.getElementById('gen_name').value.replace(/\n|\r/g,';');
	
	strReq = '';
	strReq += '&name=' + encodeURIComponent(strName);
	strReq += '&plat=' + document.getElementById('gen_plat').value;
	strReq += '&lang=' + document.getElementById('gen_lang').value;
	
	// Cache 
	var dNow = new Date();
	
	if (m_iAnimeIdx > m_iAnimeMax + m_iWait || strReq != m_strReq) {
		m_strReq = strReq;
		
		// Create Object
		var xmlhttp = fnCreateXMLHttp();
		if (xmlhttp) {
			xmlhttp.open('GET', m_strURLSend + '?time=' + dNow.getTime() + strReq);
			xmlhttp.onreadystatechange = function() {
				if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
					document.getElementById('gen_res').value = xmlhttp.responseText;
				}
			}
			xmlhttp.send(null);
		}
	}
	return false;
}


// EnterKey Event
var m_elmFocus;
function sbFocus(elmTemp){
	m_elmFocus = elmTemp
	elmTemp.style.backgroundColor = '#ffc';
	elmTemp.select();
}

function sbBlur(elmNum){
	elmNum.style.backgroundColor = '';
}

// ********************************************************************************
// Common
// ********************************************************************************
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;
}

// ********************************************************************************
// Common Layer
// ********************************************************************************
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];
		}
	}
}

// ********************************************************************************
// Common Graphic
// ********************************************************************************
function fnAdjustPath(strPathCt,iScaleW,iScaleH,iCvWt,iCvHt,iMargin) {
	var astrPathCt = [];
	var aiTemp = [];
	var iTempW;
	var iTempH;
	var iZoomin;
	var iMarginX;
	var iMarginY;
	var iX,iY;
	var iIdx;
	var strPath;
	
	astrPathCt = strPathCt.split(' ');
	
	iTempW = (iCvWt - iMargin) / iScaleW;
	iTempH = (iCvHt - iMargin) / iScaleH;
	iZoomin = (iTempW < iTempH ? iTempW : iTempH)
	iMarginX = iCvWt / 2 - iScaleW * iZoomin / 2;
	iMarginY = iCvHt / 2 - iScaleH * iZoomin / 2;
	
	strPath = '';
	for (iIdx = 0; iIdx < astrPathCt.length; iIdx++) {
		if        (astrPathCt[iIdx].length == 0) {
		} else if (astrPathCt[iIdx].length == 1) {
			strPath += astrPathCt[iIdx] + ' ';
		} else {
			aiTemp = astrPathCt[iIdx].split(',');
			iX = Number(aiTemp[0]) * iZoomin + iMarginX;
			iY = Number(aiTemp[1]) * iZoomin + iMarginY;
			strPath += iX + ',' + iY + ' ';
		}
	}
	return strPath;
}

function sbDrawLine(ctxCv,iCvWt,iCvHt,iBaseX,iBaseY,iBaseW,iBaseH,strPathSt,strPathEd,iPar,iSize,iLineWidth,strColorStroke,strColorFill) {
	var iX,iY;
	var aiX = [];
	var aiY = [];
	var aiTemp = [];
	var aiCurve = [];
	var iCurve;
	var iIdx,iIdx2;
	var strMode;
	var iCol;
	var astrPathSt = [];
	var astrPathEd = [];
	var iIdx3;
	if (iPar == 1) {
		astrPathEd = strPathEd.split(' ');
	}
	if (iPar == 0) {
		astrPathSt = strPathSt.split(' ');
	}
	
	ctxCv.lineWidth = iLineWidth;
	ctxCv.strokeStyle = strColorStroke;
	ctxCv.fillStyle = strColorFill;
	
	iPar = (iPar < 0 ? 0 : (iPar > 1 ? 1 : iPar));
	
	var iLoopSt = (strColorStroke != '' ? 0 : 1);
	var iLoopEd = (strColorFill   != '' ? 2 : 1);
	
	for (iIdx3 = iLoopSt; iIdx3 < iLoopEd; iIdx3++) {
		strMode = '';
		iCol = 0;
		for (iIdx = 0; iIdx < astrPathSt.length; iIdx++) {
			if        (astrPathSt[iIdx].length == 0) {
			} else if (astrPathSt[iIdx].length == 1) {
				strMode = astrPathSt[iIdx];
				if        (strMode == 'M')  {
				} else if (strMode == 'C')  { iCurve = 0;
				} else if (strMode == 'L')  {
				} else if (strMode == 'z')  {
					if        (1 == 0)  {
					} else if (iIdx3 == 0 && strColorStroke != '') { ctxCv.stroke();
					} else if (iIdx3 == 1 && strColorFill   != '') { ctxCv.fill();
					}
				} else if (strMode == "\n") {
				} else                      {
				}
			} else {
				if (iPar == 0) {
					aiTemp = astrPathSt[iIdx].split(',');
					iX = Number(aiTemp[0]);
					iY = Number(aiTemp[1]);
				} else if (iPar == 1) {
					aiTemp = astrPathEd[iIdx].split(',');
					iX = Number(aiTemp[0]);
					iY = Number(aiTemp[1]);
				} else {
					for (iIdx2 = 0; iIdx2 <= 1; iIdx2++) {
						aiTemp = (iIdx2 == 0 ? astrPathSt[iIdx] : astrPathEd[iIdx]).split(',');
						aiX[iIdx2] = Number(aiTemp[0]);
						aiY[iIdx2] = Number(aiTemp[1]);
					}
					iX = Math.round(aiX[0] + (aiX[1] - aiX[0]) * iPar);
					iY = Math.round(aiY[0] + (aiY[1] - aiY[0]) * iPar);
				}
				
				iX = iX * iSize - iCvWt * iSize / 2 + iCvWt / 2;
				iY = iY * iSize - iCvHt * iSize / 2 + iCvHt / 2;
				
				iX = iBaseX + iX * (iBaseW / iCvWt);
				iY = iBaseY + iY * (iBaseH / iCvHt);
				
				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;
	}
}
