/////////////////////////////////////////////////////////////////////////
//
//	【solitaire】
//
//	Browser		InternetExplore5.5(SP2)
//	Language	JavaScript 1.x
//	Author		K.Satou(MikBug)
//	Programing	Start	2002.03.01
//	Version		1.00
//
//	[History]
//
//	   Date   | Version |
//	----------+---------+---------------------------------
//	2002.03.01|   0.00  |Programing Start
//	2002.03.16|   1.00  |
//	          |         |
//	          |         |
//	          |         |
//	          |         |
//	          |         |
//
//
//	・ソースの改編、配布は自由ですが、配布する時はオリジナルのソースも合わせて
//	配布してください。又、その際は下記連絡先まで一言頂けるとありがたく思います。
//	・不具合や要望等も下記連絡先にお願いします。
//
//	連絡先：MikBug	e-mail:mik@yo.rim.or.jp
//
/////////////////////////////////////////////////////////////////////////

	matrix = 7;			//	格子の行、列数
	ball_num = 32;		//	玉数
	gameover = 0;		//	0：ゲーム中 1：ゲームオーバー
	clkstat = 0;		//	マウスクリック状態
	clkpos_x = -1;		//	前回クリック位置X座標
	clkpos_y = -1;		//	前回クリック位置Y座標

	//	画像ファイル名格納配列の確保と初期化
	//	49マスで3パターン
	image = new Array();
	for (j = 0; j < 49; j++) {
		image[j] = new Array();
			image[j][0] = "brd" + j + ".jpg";
			image[j][1] = "blu" + j + ".jpg";
			image[j][2] = "sel" + j + ".jpg";
	}

	//	盤の状態格納配列の確保と初期化
	mtxstat = new Array();
	for (i = 0; i < matrix; i++) {
		mtxstat[i] = new Array();
		for (j = 0; j < matrix; j++) {
			mtxstat[i][j] = 1;
		}
	}

	mtxstat[3][3] = 0;
	mtxstat[0][0] = 2;mtxstat[0][1] = 2;mtxstat[1][0] = 2;mtxstat[1][1] = 2;
	mtxstat[5][0] = 2;mtxstat[5][1] = 2;mtxstat[6][0] = 2;mtxstat[6][1] = 2;
	mtxstat[0][5] = 2;mtxstat[0][6] = 2;mtxstat[1][5] = 2;mtxstat[1][6] = 2;
	mtxstat[5][5] = 2;mtxstat[5][6] = 2;mtxstat[6][5] = 2;mtxstat[6][6] = 2;

	//	パラメータ初期化処理
	function initial () {
		ball_num = 32;		//	玉数
		gameover = 0;
		clkstat = 0;
		clkpos_x = -1;
		clkpos_y = -1;

		//	盤の状態格納配列の初期化
		for (i = 0; i < matrix; i++) {
			for (j = 0; j < matrix; j++) {
				mtxstat[i][j] = 1;
			}
		}
		//	0:玉無し 1:玉有り 2:玉無し（玉は置けない）
		mtxstat[3][3] = 0;
		mtxstat[0][0] = 2;mtxstat[0][1] = 2;mtxstat[1][0] = 2;mtxstat[1][1] = 2;
		mtxstat[5][0] = 2;mtxstat[5][1] = 2;mtxstat[6][0] = 2;mtxstat[6][1] = 2;
		mtxstat[0][5] = 2;mtxstat[0][6] = 2;mtxstat[1][5] = 2;mtxstat[1][6] = 2;
		mtxstat[5][5] = 2;mtxstat[5][6] = 2;mtxstat[6][5] = 2;mtxstat[6][6] = 2;

		//	ゲーム盤の表示を初期化
		for (i = 0; i < matrix; i++) {
			for (j = 0; j < matrix; j++) {
				if (mtxstat[i][j] == 1) {
					setimg (i + matrix * j, 1);
				} else {
					setimg (i + matrix * j, 0);
				}
			}
		}
	}

	//	表示切替処理
	//	num	= x + matrix * y	玉の位置情報
	//	imgstat					状態0:玉無し 1:玉有り 2:玉選択
	//	documentのmyIMGxxが配列に置けると冗長さが無くなるんですが、
	//	方法がわからないのでこのままにしておきます。
	function setimg(num, imgstat) {
		switch (num) {
			case 0:document.myIMG0.src = image[num][imgstat];break;
			case 1:document.myIMG1.src = image[num][imgstat];break;
			case 2:document.myIMG2.src = image[num][imgstat];break;
			case 3:document.myIMG3.src = image[num][imgstat];break;
			case 4:document.myIMG4.src = image[num][imgstat];break;
			case 5:document.myIMG5.src = image[num][imgstat];break;
			case 6:document.myIMG6.src = image[num][imgstat];break;
			case 7:document.myIMG7.src = image[num][imgstat];break;
			case 8:document.myIMG8.src = image[num][imgstat];break;
			case 9:document.myIMG9.src = image[num][imgstat];break;
			case 10:document.myIMG10.src = image[num][imgstat];break;
			case 11:document.myIMG11.src = image[num][imgstat];break;
			case 12:document.myIMG12.src = image[num][imgstat];break;
			case 13:document.myIMG13.src = image[num][imgstat];break;
			case 14:document.myIMG14.src = image[num][imgstat];break;
			case 15:document.myIMG15.src = image[num][imgstat];break;
			case 16:document.myIMG16.src = image[num][imgstat];break;
			case 17:document.myIMG17.src = image[num][imgstat];break;
			case 18:document.myIMG18.src = image[num][imgstat];break;
			case 19:document.myIMG19.src = image[num][imgstat];break;
			case 20:document.myIMG20.src = image[num][imgstat];break;
			case 21:document.myIMG21.src = image[num][imgstat];break;
			case 22:document.myIMG22.src = image[num][imgstat];break;
			case 23:document.myIMG23.src = image[num][imgstat];break;
			case 24:document.myIMG24.src = image[num][imgstat];break;
			case 25:document.myIMG25.src = image[num][imgstat];break;
			case 26:document.myIMG26.src = image[num][imgstat];break;
			case 27:document.myIMG27.src = image[num][imgstat];break;
			case 28:document.myIMG28.src = image[num][imgstat];break;
			case 29:document.myIMG29.src = image[num][imgstat];break;
			case 30:document.myIMG30.src = image[num][imgstat];break;
			case 31:document.myIMG31.src = image[num][imgstat];break;
			case 32:document.myIMG32.src = image[num][imgstat];break;
			case 33:document.myIMG33.src = image[num][imgstat];break;
			case 34:document.myIMG34.src = image[num][imgstat];break;
			case 35:document.myIMG35.src = image[num][imgstat];break;
			case 36:document.myIMG36.src = image[num][imgstat];break;
			case 37:document.myIMG37.src = image[num][imgstat];break;
			case 38:document.myIMG38.src = image[num][imgstat];break;
			case 39:document.myIMG39.src = image[num][imgstat];break;
			case 40:document.myIMG40.src = image[num][imgstat];break;
			case 41:document.myIMG41.src = image[num][imgstat];break;
			case 42:document.myIMG42.src = image[num][imgstat];break;
			case 43:document.myIMG43.src = image[num][imgstat];break;
			case 44:document.myIMG44.src = image[num][imgstat];break;
			case 45:document.myIMG45.src = image[num][imgstat];break;
			case 46:document.myIMG46.src = image[num][imgstat];break;
			case 47:document.myIMG47.src = image[num][imgstat];break;
			case 48:document.myIMG48.src = image[num][imgstat];break;
		}
	}

	//	変数clk*を初期値に戻す
	function reset_clk () {
		clkstat = 0;
		clkpos_x = -1;
		clkpos_y = -1;
	}

	//	玉の移動と除去
	function ball_move (oldx, oldy, newx, newy) {
		if (mtxstat[newx][newy] == 2) {
			return 0;
		}

		if (oldy == newy) { 
			if (oldx + 2 == newx) {
				if (mtxstat[oldx + 1][oldy] == 1) {
					mtxstat[oldx + 1][oldy] = 0;
					setimg ((oldx + 1) + oldy * matrix, 0);
					ball_num--;
					return 1;
				} else {
					return 0;
				}
			}

			if (oldx - 2 == newx) {
				if (mtxstat[oldx - 1][oldy] == 1) {
					mtxstat[oldx - 1][oldy] = 0;
					setimg ((oldx - 1) + oldy * matrix, 0);
					ball_num--;
					return 1;
				} else {
					return 0;
				}
			}
		}
		if (oldx == newx) { 
			if (oldy + 2 == newy) {
				if (mtxstat[oldx][oldy + 1] == 1) {
					mtxstat[oldx][oldy + 1] = 0;
					setimg (oldx + (oldy + 1) * matrix, 0);
					ball_num--;
					return 1;
				} else {
					return 0;
				}
			}
			if (oldy - 2 == newy){
				if (mtxstat[oldx][oldy - 1] == 1) {
					mtxstat[oldx][oldy - 1] = 0;
					setimg (oldx + (oldy - 1) * matrix, 0);
					ball_num--;
					return 1;
				} else {
					return 0;
				}
			}
		}

		return 0;
	}

	//	盤状態の更新
	function chkmtxstat () {
		stat = 0;
		for (i = 0; i < matrix; i++) {
			for (j = 0; j < matrix; j++) {
				if (mtxstat[i][j] != 2) {
					if (j < matrix - 2) {
						if (mtxstat[i][j] == 1) {
							if (mtxstat[i][j + 1] == 1) {
								if (mtxstat[i][j + 2] == 0) {
									stat += 1;
								}
							}
						} else {
							if (mtxstat[i][j + 1] == 1) {
								if (mtxstat[i][j + 2] == 1) {
									stat += 1;
								}
							}
						}
					}
					if (i < matrix - 2) {
						if (mtxstat[i][j] == 1) {
							if (mtxstat[i + 1][j] == 1) {
								if (mtxstat[i + 2][j] == 0) {
									stat += 1;
								}
							}
						} else {
							if (mtxstat[i + 1][j] == 1) {
								if (mtxstat[i + 2][j] == 1) {
									stat += 1;
								}
							}
						}
					}
				}
			}
		}
		return stat;
	}

	//	マスをクリックした時の処理
	function change(x, y) {
		//	ゲームの状態判定
		if (gameover == 1) {
			gameovermsg ();
			return;
		}

		if (clkstat == 0) {
			//	移動元を選択
			if (mtxstat[x][y] == 2) {
				reset_clk ();
				return;
			}
			if (mtxstat[x][y] == 0) {
				reset_clk ();
				return;
			}
			setimg (x + matrix * y, 2);
			clkstat = 1;
			clkpos_x = x;
			clkpos_y = y;
		} else {
			//	移動先を選択
			if (mtxstat[x][y] == 2) {
				setimg (clkpos_x + matrix * clkpos_y, 1);
				reset_clk ();
				return;
			}
			if (mtxstat[x][y] == 1) {
				setimg (clkpos_x + matrix * clkpos_y, 1);
				reset_clk ();
				return;
			}
			if (ball_move (clkpos_x,clkpos_y, x, y) == 0) {
				setimg (clkpos_x + matrix * clkpos_y, 1);
				reset_clk ();
				return;
			}

			setimg (clkpos_x + matrix * clkpos_y, 0);
			setimg (x + matrix * y, 1);
			mtxstat[clkpos_x][clkpos_y] = 0;
			mtxstat[x][y] = 1;
				reset_clk ();
		}
		
		if (chkmtxstat () == 0) {
			gameover = 1;
			gameovermsg ();
		}

	}

	//	終了時のメッセージ
	//	アラート表示じゃないほうが良いのかもしれないけど
	function gameovermsg () {
		if (ball_num != 1) {
			//	玉が２個以上残った時
			alert ("Game Over");
		} else {
			//	玉を１個残して終わった時
			alert ("ゲームは、これからが本番だ。。。");
		}
	}
