// ********** Const
// ***** Timer
var m_iAnimeMilliSec = 40;

// ********** Common
var m_dStart;
var m_bFocus = 0;

// ********** Const
var m_strURLSend = '/cgi-bin/generator/bio.cgi';

var m_iRlMove = 10;
var m_iStatusCnt = 3;
var m_iPathSize = 1000;

var m_iMargin = 40;
var m_iCvWt = 720;
var m_iCvHt = 280;
var m_iFont = Math.floor(m_iMargin * 0.3);

var m_iSep = 72;

var m_aiFrameLineY = new Array(6,1,1);
var m_strForeColor = '#fff';
var m_strBackColor = '#222';
var m_iLineWidth = 1;

// ********** Draw
var m_iAnimeIdx;
var m_iAnimeMax = 0;
var m_timAnime;
var m_elmBody;
var m_strDefine;
var m_iPatnCnt;
var m_iNameCnt;
var m_astrInit = [];
var m_astrColor = [];
var m_astrGraph = [];
var m_astrText = [];
var m_astrVal = [];
var m_aiLabelY = [];

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);
	}
	
	sbInitGame();
	
	// 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;
	
	// ********** 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;
	}
	
	// ********** Draw Static
	sbClearAll('cvst','lbst');
	m_actxCv['cvst'].clearRect(0,0,m_iCvWt,m_iCvHt);
	m_actxCv['cvst'].strokeStyle = '#aaaaaa';
	
	m_actxCv['cvst'].beginPath();
	m_actxCv['cvst'].moveTo(m_iMargin * 2,m_iCvHt * 0.5);
	m_actxCv['cvst'].lineTo(m_iCvWt - m_iMargin,m_iCvHt * 0.5);
	m_actxCv['cvst'].stroke();
	
	m_actxCv['cvst'].beginPath();
	m_actxCv['cvst'].moveTo(m_iMargin,m_iMargin);
	m_actxCv['cvst'].lineTo(m_iCvWt - m_iMargin,m_iMargin);
	m_actxCv['cvst'].stroke();
	
	m_actxCv['cvst'].beginPath();
	m_actxCv['cvst'].moveTo(m_iMargin,m_iCvHt - m_iMargin);
	m_actxCv['cvst'].lineTo(m_iCvWt - m_iMargin,m_iCvHt - m_iMargin);
	m_actxCv['cvst'].stroke();
	
	for (iIdx = 0; iIdx < m_iSep + 1; iIdx++) {
		iX1 = m_iMargin * 2 + ((m_iCvWt - m_iMargin * 3) / (m_iSep)) * iIdx;
		
		m_actxCv['cvst'].beginPath();
		m_actxCv['cvst'].moveTo(iX1,m_iCvHt * 0.5 - (iIdx % (m_iSep / 12) == 0 ? 10 : 3));
		m_actxCv['cvst'].lineTo(iX1,m_iCvHt * 0.5 + (iIdx % (m_iSep / 12) == 0 ? 10 : 3));
		m_actxCv['cvst'].stroke();
	}
	for (iIdx = 0; iIdx < 12; iIdx++) {
		m_astrNn['lbst'] += sbDrawLabel(m_iMargin * 2 + (m_iCvWt - m_iMargin * 3) / 12 * iIdx,(m_iCvHt * 0.5),(m_iCvWt - m_iMargin * 2) / 12,m_iMargin * 0.5,'c',m_iFont,'#aaaaaa','' + (iIdx + 1) + '月');
	}
	
	// ********** Init Value
	m_strDefine = '';
}

function sbAnime() {
	var iIdx,iIdx2,strIdx,iTemp;
	var iX,iY,iZ,iW,iH;
	var strDefine;
	var astrDefine = [];
	var iConstDefine = 2;
	var strTemp;
	
	var iX1,iY1;
	var iX2,iY2;
	
	strDefine = '' + document.getElementById('gen_res').value;
	
	// ********** Start Animation
	if (strDefine != '' && strDefine != m_strDefine) {
		// ********** Init
		astrDefine = strDefine.split('~');
		m_astrInit  = astrDefine[0].split(';');
		m_astrColor = astrDefine[1].split(';');
		m_astrGraph = astrDefine[2].split(';');
		m_astrText  = astrDefine[3].split(',');
		
		// ********** Time
		if (m_bFocus == 0) {
			document.getElementById('gen_wait').style.display = 'none';
			document.getElementById('gen_all').style.display = 'block';
			m_bFocus = 1;
		}
		m_dStart = new Date();
		
		// ********** Clear And Hidden
		sbClearAll('cvdm','lbdm');
		sbViewLayer('cvst,cvdm','lbst,lbdm');
		
		// ********** Init Value
		for (iIdx = 0; iIdx < m_astrGraph.length; iIdx++) {
			m_astrVal[iIdx] = new Array();
			m_astrVal[iIdx] = m_astrGraph[iIdx].split(',');
			for (iIdx2 = 0; iIdx2 < m_astrVal[iIdx].length; iIdx2++) {
				m_astrVal[iIdx][iIdx2] = Number(m_astrVal[iIdx][iIdx2]);
			}
		}
		
		m_iAnimeIdx = 0;
		m_iAnimeMax = m_iSep * m_astrVal.length;
		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 iStatusIdx;
	var iDay;
	
	if (m_iAnimeIdx >= 0 && m_iAnimeIdx < m_iAnimeMax) {
		iDay = m_iAnimeIdx % m_iSep;
		iStatusIdx = Math.floor(m_iAnimeIdx / m_iSep);
		iX1 = m_iMargin * 2 + ((m_iCvWt - m_iMargin * 3) / m_iSep) * iDay;
		iY1 = m_iCvHt * 0.5 - ((m_iCvHt * 0.5 - m_iMargin) / 100) * m_astrVal[iStatusIdx][((iDay + m_iSep- 1) % m_iSep)];
		iX2 = m_iMargin * 2 + ((m_iCvWt - m_iMargin * 3) / m_iSep) * (iDay + 1);
		iY2 = m_iCvHt * 0.5 - ((m_iCvHt * 0.5 - m_iMargin) / 100) * m_astrVal[iStatusIdx][iDay];
		
		m_actxCv['cvdm'].strokeStyle = m_astrColor[iStatusIdx].split(',')[0];
		
		m_actxCv['cvdm'].beginPath();
		m_actxCv['cvdm'].moveTo(iX1,iY1);
		m_actxCv['cvdm'].lineTo(iX2,iY2);
		m_actxCv['cvdm'].stroke();
		
		m_actxCv['cvdm'].beginPath();
		m_actxCv['cvdm'].arc(iX2,iY2,2,0 * Math.PI / 180,1 * Math.PI / 180,1);
		m_actxCv['cvdm'].closePath();
		m_actxCv['cvdm'].stroke();
		
		if (iStatusIdx == 2 && m_astrText[iDay] != '') {
			m_astrNn['lbdm'] += sbDrawLabel(iX2 - m_iMargin,(m_astrVal[iStatusIdx][iDay] < 0 ? m_iCvHt - m_iMargin : 0),m_iMargin * 2,m_iMargin,'c',m_iFont,m_astrColor[iStatusIdx].split(',')[0],m_astrText[iDay]);
		}
		if (iDay == 0) {
			m_aiLabelY[iStatusIdx] = iY1 - m_iMargin * 0.5;
			for (iIdx = 0; iIdx < iStatusIdx * iStatusIdx; iIdx++) {
				if (m_aiLabelY[iStatusIdx] > m_aiLabelY[iIdx % iStatusIdx] - m_iMargin * 0.5 && m_aiLabelY[iStatusIdx] < m_aiLabelY[iIdx % iStatusIdx] + m_iMargin * 0.5) {
					m_aiLabelY[iStatusIdx] = m_aiLabelY[iIdx % iStatusIdx] + m_iMargin * 0.5;
				}
			}
			m_astrNn['lbdm'] += sbDrawLabel(0,m_aiLabelY[iStatusIdx],m_iMargin * 1.8,m_iMargin,'r',m_iFont,m_astrColor[iStatusIdx].split(',')[0],m_astrColor[iStatusIdx].split(',')[1]);
		}
	}
	
	// ********** End Animation
	if (m_iAnimeIdx == m_iAnimeMax) {
		sbViewLayer('cvst,cvdm','lbst,lbdm');
		
		// ********** Check Time
		dNow = new Date();
	}
	
	// ********** Add FrameCount
	if (m_iAnimeIdx >= 0 && m_iAnimeIdx <= m_iAnimeMax) {
		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 || 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 = '#ffffff';
	elmTemp.select();
}

function sbBlur(elmTemp){
	elmTemp.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="border:1px solid black;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>';
		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];
		}
	}
}


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;
	}
}
