/**
 * Mainのクラス
**/
Main = {
	ExecId: {},				// ラウンチするID
	A3tNode: [],
	CurrentPage: 1,			// 1: 第一階層, 2: 第二階層

	State: 0,				// 状態
	STATE_OPENING: 1,		// オープニング中
	STATE_NORMAL_TOP: 2,	// 第一階層定常状態
	STATE_NORMAL_SECOND: 3,	// 第二階層定常状態
	STATE_GOTO_SECOND: 4,	// 第一階層→第二階層へ遷移
	STATE_GOTO_TOP: 5,		// 第二階層→第一階層へ遷移
	STATE_EXEC_TOP: 6,		// 第一階層でラウンチする
	STATE_EXEC_SECOND: 7,	// 第二階層でラウンチする

	IdTop: 0,				// 押下したボタンのID (第一階層)
	IdSecond: 0,			// 押下したボタンのID (第二階層)

	/* オブジェクト */
	Opening: {},			// オープニング
	NormalTop: {},			// 第一階層定常状態
	NormalSecond: {},		// 第二階層定常状態
	GotoSecond: {},			// 第二階層へ遷移
	GotoTop: {},			// 第一階層へ遷移
	ExecTop: {},			// 第一階層でのラウンチ
	ExecSecond: {},			// 第二階層でのラウンチ
	Ext: {},				// 拡張オブジェクト
	
	/* メソッド */
	Initialize: Main_Init,
	onComandBtn: Main_onComandBtn,
	onClear: Main_onClear,
	onEnterFrame: Main_onEnterFrame
};

/**
 * オープニングのクラス
**/
Main.Opening = {
	StartFrame: 0,	// 開始フレーム
	EndFrame: 0,	// 終了フレーム
	Times: 1,		// 1回に進むフレーム
	A3tNode: [],	// A3Tのノード名
	currentFrame: 0
};

/**
 * 第一階層定常状態のクラス
**/
Main.NormalTop = {
	StartFrame: 0,	// 開始フレーム
	EndFrame: 0,	// 終了フレーム
	Times: 1,		// 1回に進むフレーム
	A3tNode: [],	// A3Tのノード名
	currentFrame: 0
};

/**
 * 第ニ階層定常状態のクラス
**/
Main.NormalSecond = {
	StartFrame: 0,	// 開始フレーム
	EndFrame: 0,	// 終了フレーム
	Times: 1,		// 1回に進むフレーム
	A3tNode: [],	// A3Tのノード名
	currentFrame: 0
};

/**
 * 第一階層→第ニ階層のクラス
**/
Main.GotoSecond = {
	StartFrame: 0,	// 開始フレーム
	EndFrame: 0,	// 終了フレーム
	Times: 1,		// 1回に進むフレーム
	A3tNode: [],	// A3Tのノード名
	currentFrame: 0
};

/**
 * 第ニ階層→第一階層のクラス
**/
Main.GotoTop = {
	StartFrame: 0,	// 開始フレーム
	EndFrame: 0,	// 終了フレーム
	Times: 1,		// 1回に進むフレーム
	A3tNode: [],	// A3Tのノード名
	currentFrame: 0
};

/**
 * 第一階層ラウンチのクラス
**/
Main.ExecTop = {
	StartFrame: 0,	// 開始フレーム
	EndFrame: 0,	// 終了フレーム
	Times: 1,		// 1回に進むフレーム
	A3tNode: [],	// A3Tのノード名
	ExecId: "",		// ラウンチするID
	currentFrame: 0
};

/**
 * 第ニ階層ラウンチのクラス
**/
Main.ExecSecond = {
	StartFrame: 0,	// 開始フレーム
	EndFrame: 0,	// 終了フレーム
	Times: 1,		// 1回に進むフレーム
	A3tNode: [],	// A3Tのノード名
	ExecId: "",		// ラウンチするID
	currentFrame: 0
};

/**
 * 初期化
**/
function Main_Init()
{
	// ノードの初期化
	ClearA3TtNode( Main.Opening );
	ClearA3TtNode( Main.NormalTop );
	ClearA3TtNode( Main.NormalSecond );
	ClearA3TtNode( Main.GotoSecond );
	ClearA3TtNode( Main.GotoTop );
	ClearA3TtNode( Main.ExecTop );
	ClearA3TtNode( Main.ExecSecond );
}

/**
 * ボタン押下時の処理
 * @param{Number} aId ボタンのID
**/
function Main_onComandBtn( aId )
{
	switch ( Main.State ) {
	case Main.STATE_NORMAL_TOP:
		// 第一階層でタッチ
		Main_CommandBtnTop( aId );
		break;
	case Main.STATE_NORMAL_SECOND:
		// 第ニ階層でタッチ
		Main_CommandBtnSecond( aId );
		break;
	default:
		break;
	}
}

/**
 * クリアキー押下時の処理
**/
function Main_onClear()
{
	//第2階層からCLEARキーボタンで戻る
	if( Main.State == Main.STATE_NORMAL_SECOND ){
		Main.State = Main.STATE_GOTO_TOP;
	}
}

/**
 * 再生の処理
**/
function Main_onEnterFrame()
{
	switch( Main.State ){
	case Main.STATE_OPENING:
		Main_AnimOepening();
		Main.Ext.AnimOepening();
		break;
	case Main.STATE_NORMAL_TOP:
		Main_AnimNormalTop();
		Main.Ext.AnimNormalTop();
		break;
	case Main.STATE_NORMAL_SECOND:
		Main_AnimNormalSecond();
		Main.Ext.AnimNormalSecond();
		break;
	case Main.STATE_GOTO_SECOND:
		Main_AnimGotoSecond();
		Main.Ext.AnimGotoSecond( Main.IdTop );
		break;
	case Main.STATE_GOTO_TOP:
		Main_AnimGotoTop();
		Main.Ext.AnimGotoTop( Main.IdSecond );
		break;
	case Main.STATE_EXEC_TOP:
		Main_AnimExecTop();
		Main.Ext.AnimExecTop( Main.IdTop );
		break;
	case Main.STATE_EXEC_SECOND:
		Main_AnimExecSecond( Main.IdSecond );
		Main.Ext.AnimExecSecond();
		break;
	default:
		break;
	}
}
/**
 * オープニングアニメーション
**/
function Main_AnimOepening()
{
	var anim_end = Main_SetAnim( Main.Opening );

	// アニメーション終了後、第一階層の定常状態へ遷移
	if( anim_end == true ){
		Main.Opening.currentFrame = 0;
		Main.State = Main.STATE_NORMAL_TOP;
	}
}

/**
 * 第一階層での定常状態
**/
function Main_AnimNormalTop()
{
	var anim_end = Main_SetAnim( Main.NormalTop );
	
	// ループする
	if( anim_end == true ){
		Main.NormalTop.currentFrame = 0;
	}
}

/**
 * 第ニ階層での定常状態
**/
function Main_AnimNormalSecond()
{
	var anim_end = Main_SetAnim( Main.NormalSecond );
	
	// ループする
	if( anim_end == true ){
		Main.NormalSecond.currentFrame = 0;
	}
}

/**
 * 第一階層から第二階層へ遷移
**/
function Main_AnimGotoSecond()
{
	if( Main.GotoSecond.EndFrame - Main.NormalSecond.StartFrame == 0 ){
		// フレーム数が0なら第一階層定常状態に戻す
		Main.State = Main.STATE_NORMAL_TOP;
	}
	
	var anim_end = Main_SetAnim( Main.GotoSecond );

	// アニメーション終了後、第ニ階層の定常状態へ遷移
	if( anim_end == true ){
		Main.GotoSecond.currentFrame = 0;
		Main.State = Main.STATE_NORMAL_SECOND;
	}
}

/**
 * 第ニ階層から第一階層へ遷移
**/
function Main_AnimGotoTop()
{
	var anim_end = Main_SetAnim( Main.GotoTop );

	// アニメーション終了後、第一階層の定常状態へ遷移
	if( anim_end == true ){
		Main.GotoTop.currentFrame = 0;
		Main.State = Main.STATE_NORMAL_TOP;
	}
}

/**
 * 第一階層でラウンチ
**/
function Main_AnimExecTop()
{
	var anim_end = Main_SetAnim( Main.ExecTop );

	// アニメーション終了後、第一階層の定常状態へ遷移
	if( anim_end == true ){
		Main.Ext.Exec( Main.ExecTop.ExecId );
		ClearA3TtNode( Main.ExecTop );
		Main.State = Main.STATE_NORMAL_TOP;
	}
}

/**
 * 第ニ階層でラウンチ
**/
function Main_AnimExecSecond()
{
	var anim_end = Main_SetAnim( Main.ExecSecond );

	// アニメーション終了後、第一階層の定常状態へ遷移
	if( anim_end == true ){
		Main.Ext.Exec( Main.ExecSecond.ExecId );
		ClearA3TtNode( Main.ExecSecond );
		Main.State = Main.STATE_NORMAL_SECOND;
	}
}

/**
 * 第一階層でのボタン押下処理
 * @param{Number} aId ID
**/
function Main_CommandBtnTop( aId )
{
	Main.IdTop = aId;

	if( Main.ExecId[ "Top" + aId ].Second0 != null ){
		// 第二階層へ遷移
		Main.State = Main.STATE_GOTO_SECOND;
	}
	else if( Main.ExecId[ "Top" + aId ] != null ){
		// 実行処理
		Main.ExecTop.ExecId = Main.ExecId[ "Top" + aId ];
		Main.State = Main.STATE_EXEC_TOP;
	}
	System.exec( "system.device.play_vibrator.30" );
}

/**
 * 第ニ階層でのボタン押下処理
 * @param{Number} aId ID
**/
function Main_CommandBtnSecond( aId )
{
	Main.IdSecond = aId;

	if( Main.ExecId[ "Top" + Main.IdTop ]["Second" + aId ] != null ){
		// 実行処理
		Main.ExecSecond.ExecId = Main.ExecId[ "Top" + Main.IdTop ]["Second" + aId ];
		Main.State = Main.STATE_EXEC_SECOND;
	}
	System.exec( "system.device.play_vibrator.30" );
}

/**
 * アニメーションをする
 * @param{Object} oObj オブジェクト
 * @return{Boolean} true 終了フレームを超える false 終了フレームを超えない
**/
function Main_SetAnim( oObj )
{
	var set_time = oObj.Times;
	oObj.currentFrame += set_time;
	var set_frame = oObj.currentFrame + oObj.StartFrame;
	var i = 0;
	while ( oObj.A3tNode[ i ] != null ) {
		page.a3t.a3itemSetTime( oObj.A3tNode[ i ], geta3tframetime( set_frame ) );
		i++;
	}

	if( ( set_frame > oObj.EndFrame && oObj.Times > 0 ) ||	// フレームが増える場合
		( set_frame < oObj.EndFrame && oObj.Times < 0 )	// フレームが減る場合
	){
		oObj.currentFrame = 0;
		return true;
	}
	else {
		return false;
	}
}
