﻿try{document.execCommand("BackgroundImageCache", false, true);}catch(e){}
var playbox = function(){//游戏盒子
	var cards = ['a','b','c','d','e','f','g','h','i','j'];//所有出现的卡片
	this.getRNDCard = function(n){//随机取n张卡片
		var ret = [],lcard = this.rows.length/2;lcard = lcard>cards.length?cards.length-1:lcard;
		while(n){ret.push(cards[Math.round(Math.random()*lcard)]),n--;}
		return ret.slice(0);
	};
	this.gameLevel = 1;//当前级别
	this.levelScore = [1000,3000,5000,7000,9000,12000,14000,16000,18000,20000];//级别分数
	this.score = 0;//得分
	this.tips = 3;//提示点数
	this.boomx = 0;//连爆次数
	this.startflag = false;//游戏开始标识
	this.actioning = false;//是否正在处理爆炸掉落
	this.gameTimer = null;//倒计时定时器
	this.remainTime = (this.levelScore.length-this.gameLevel)*60*1000;//剩余时间
	this.pasue = false;//是否暂停
	this.data = [];//游戏数据
	this.emptyCell = [];//爆后空的格子
	this.choosed = [];//单击后选中的格子
	this.downing = [];//正在掉落的格子
	this.chkTimer = null;//掉落后事件定时器
	this.startTimer = function(){//计时
		window.clearTimeout(this.gameTimer);
		var me = this;
		var innerfoo = function(){
			me.remainTime -= 1000;
			//document.title = '倒计时：'+me.remainTime;
			if(me.remainTime<=0){me.startflag = false;alert('嘿，时间到鸟~~````');return;}
			me.gameTimer = window.setTimeout(arguments.callee,1000);
		};
		innerfoo();
	};
	this.pasueTimer = function(){//暂停
		if(this.pasue){
			this.pasue = false;
			this.startflag = true;
			this.startTimer();
		}else{
			this.pasue = true;
			this.startflag = false;
			window.clearTimeout(this.gameTimer);
		}
	};
	this.setstop = function(r,c){this.rows[r].cells[c].stop=true;}
	this.setgroup = function(r,c,s){this.rows[r].cells[c].className=s;this.setstop(r,c);};
	this.afterdown = function(){//掉落后事件
		window.clearTimeout(this.chkTimer);
		var me = this;
		this.chkTimer = window.setTimeout(function(){me.checking();},150);
	};
	this.down = function(r,c,didx){//掉落
		var l = this.rows.length-1,data = this.data,drow = this.rows,me = this;
		var scls = drow[r].cells[c].className;
		if(scls==''){this.downing[didx] = 0;this.afterdown();return;}
		var innerfoo = function(){
			if(r>=l||drow[r+1].cells[c].stop){me.downing[didx] = 0;me.afterdown();return;}
			drow[r].cells[c].className = '';
			drow[r].cells[c].stop = false;
			data[r][c] = NaN;
			r++;
			drow[r].cells[c].className = scls;
			drow[r].cells[c].stop = true;
			data[r][c] = scls;
			window.setTimeout(arguments.callee,150);
		};
		innerfoo();
	};
	this.downafterboom = function(){//爆后掉落
		var l=this.rows.length;
		for(var c in this.emptyCell){
			for(var r=l-1;r>-1;r--){this.down(r,c,(r*10+c*1));}
		}
	};
	this.getsamelistfrommartix = function(list,r,minlength){//取行列相同数据
		r = r|0;
		var d = list.slice(0),l=d.length,c=d[0].length,iflag = new Array(c+1).join(1).split(''),ret = [];
		var pushrow = function(r0,c0,c1){var tmp=[];for(var i=c0;i<=c1;i++){tmp.push([r0,i]);}ret.push(tmp);};
		var pushcell = function(c0,r0,r1){var tmp=[];for(var i=r0;i<=r1;i++){tmp.push([i,c0]);}ret.push(tmp);};
		for(var i=r;i<l;i++){
			var nflag = 1;
			for(var n=0;n<c;n++){
				if(n<(c-1)&&d[i][n]==d[i][n+1]){nflag++;}else{if(nflag>=minlength){pushrow(i,(n-nflag+1),n);}nflag = 1;}
				if(i<(l-1)&&d[i][n]==d[i+1][n]){iflag[n]++;}else{if(iflag[n]>=minlength){pushcell(n,(i-iflag[n]+1),i);}iflag[n] = 1;}
			}
		}
		return ret.slice(0);
	};
	this.getmatch = function(list,r){//取可交换数据
		r = r|0;
		var d = list.slice(r),lr = d.length,lc = d[0].length;
		var din = null,ret = [];
		for(var i=0;i<lr;i++){
			for(var n=0;n<lc;n++){
			din = d[i][n];
			try{if(din==d[i+1][n+1]&&din==d[i+2][n]){ret.push([(i+r+1),(n+1)]);}}catch(e){}
			try{if(din==d[i+1][n-1]&&din==d[i+2][n]){ret.push([(i+r+1),(n-1)]);}}catch(e){}
			try{if(din==d[i-1][n+1]&&din==d[i][n+2]){ret.push([(i+r-1),(n+1)]);}}catch(e){}
			try{if(din==d[i+1][n+1]&&din==d[i][n+2]){ret.push([(i+r+1),(n+1)]);}}catch(e){}
			try{if(din==d[i+1][n+1]&&din==d[i+1][n+2]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i-1][n+1]&&din==d[i-1][n+2]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i+1][n-1]&&din==d[i+1][n-2]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i-1][n-1]&&din==d[i-1][n-2]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i][n+2]&&din==d[i][n+3]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i][n-2]&&din==d[i][n-3]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i-1][n+1]&&din==d[i-2][n+1]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i+1][n+1]&&din==d[i+2][n+1]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i-1][n-1]&&din==d[i-2][n-1]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i+1][n-1]&&din==d[i+2][n-1]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i+2][n]&&din==d[i+3][n]){ret.push([i+r,n]);}}catch(e){}
			try{if(din==d[i-2][n]&&din==d[i-3][n]){ret.push([i+r,n]);}}catch(e){}
			}
		}
		return ret.slice(0);
	};
	this.showtips = function(){//提示
		if(!this.tips){return;}
		this.tips--;
		var dtips = this.getmatch(this.data,this.rows.length/2);
		if(!dtips.length){return;}
		var r = dtips[0][0],c = dtips[0][1],s = this.rows[r].cells[c].className;
		this.rows[r].cells[c].className = s+' choosed';
	};
	this.boom = function(bd){//爆
		var r,c,lbd = bd.length,l = this.rows.length-1,lscore = 0,me = this;
		for(var i=0;i<lbd;i++){
			for(var n=0;n<bd[i].length;n++){
				r = bd[i][n][0],c = bd[i][n][1];
				this.emptyCell[c] = 1;
				this.rows[r].cells[c].stop = false;
				this.rows[r].cells[c].className = 'boom';
				this.data[r][c] = NaN;
				lscore++;
				for(var r2=l;r2>-1;r2--){this.downing[r2*10+c*1] = 1;}
			}
		}
		if(this.startflag){
			var bx = this.boomx;
			this.score += lscore*bx*10;
			this.remainTime += lscore*bx*100;
			if(bx>1){this.tips += (bx-1);}
			if(this.score>this.levelScore[this.gameLevel-1]){
				this.tips += this.gameLevel;
				if(++this.gameLevel>this.levelScore.length){this.pauseGame();alert('祝贺你，完成了所有级别的游戏！^_^');}
				this.remainTime = (this.levelScore.length-this.gameLevel)*60*1000;
			}
		}
		window.setTimeout(function(){me.clearboom(bd.slice(0));},1000);
	};
	this.clearboom = function(bd){//清除爆炸样式
		var r,c,lbd = bd.length,me = this;
		for(var i=0;i<lbd;i++){
			for(var n=0;n<bd[i].length;n++){
				r = bd[i][n][0],c = bd[i][n][1];
				this.rows[r].cells[c].className = '';
			}
		}
		window.setTimeout(function(){me.downafterboom();},150);
	}
	this.checking = function(){//结果检测
		for(var d in this.downing){if(this.downing[d]==1){this.actioning = true;return;}}
		this.actioning = true;
		this.downing = [];
		//补充hide区域的空格
		var l = parseInt(this.rows.length/2),lc = this.rows[0].cells.length;
		var tmpds = null,newCards = this.getRNDCard(l*lc);
		for(var t=0;t<l;t++){
			tmpds = newCards.splice(0,lc);
			this.data.splice(t,1,tmpds.slice(0));
			for(var m=0;m<lc;m++){
				this.setgroup(t,m,tmpds[m]);
			}
		}
		var samedata = this.getsamelistfrommartix(this.data,l,3),lsd = samedata.length;
		if(!lsd){
			this.actioning = false;
			this.boomx = 0;
			if(!this.startflag){this.pasueTimer();}
			this.emptyCell = [];
			if(!this.getmatch(this.data,l).length){alert('囧,木有可以继续消除的元素鸟，我帮你刷一下 >_<');this.startgame();}
			return;
		}
		this.boomx++;
		this.boom(samedata.slice(0));
		return true;
	};
	this.init = function(){//初始化参数
		this.gameLevel = 1;
		this.score = 0;
		this.tips = 3;
		this.remainTime = (this.levelScore.length-1)*60*1000;
	};
	this.startgame = function(){//开始
		this.pasueTimer();
		this.data.length = 0;
		var lr = this.rows.length,lc = this.rows[0].cells.length,cardList = this.getRNDCard(lr*lc),tmpds = null;
		for(var i=0;i<lr;i++){
			tmpds = cardList.splice(0,lc);
			this.data.push(tmpds.slice(0));
			for(var n=0;n<lc;n++){
				this.setgroup(i,n,tmpds[n]);
			}
		}
		this.checking();
	};
	this.swapbox = function(){//交换
		if(this.choosed.length<2){return;}
		var da = this.choosed[0],db = this.choosed[1];
		var s1 = da[0],r1 = da[1],c1 = da[2],s2 = db[0],r2 = db[1], c2 = db[2];
		this.rows[r1].cells[c1].className = s1;
		this.rows[r2].cells[c2].className = s2;
		var ba = Math.abs(r1-r2),bb = Math.abs(c1-c2);
		if(!(ba==0&&bb==1||ba==1&&bb==0)||(!ba&&!bb)){this.choosed.length = 0;return;}
		var d1 = this.data[r1][c1],d2 = this.data[r2][c2];
		this.rows[r1].cells[c1].className = s2;
		this.rows[r2].cells[c2].className = s1;
		this.data[r1][c1] = d2;
		this.data[r2][c2] = d1;
		var bcheck = this.checking();
		if(!bcheck){
			this.rows[r1].cells[c1].className = s1;
			this.rows[r2].cells[c2].className = s2;
			this.data[r1][c1] = d1;
			this.data[r2][c2] = d2;
		}
		this.choosed.length = 0;
	};
	this.onclick = function(e){//单击事件
		if(!this.startflag||this.actioning){return;}
		e = e||window.event;
		var dtarget = e.target||e.srcElement,stag = dtarget.tagName.toLowerCase();
		if(stag!='td'){return;}
		this.boomx = 0;
		var r = dtarget.parentNode.rowIndex,c = dtarget.cellIndex,s = dtarget.className.replace(/\s?choosed/i,'');
		this.choosed.push([s,r,c]);
		dtarget.className = s+' choosed';
		this.swapbox();
	};
};
var swapGame = function(dmodule,row,cell){//游戏外包装
	if(!dmodule){return;}
	dmodule.className = 'swapxgame';
	this.dmodule = dmodule;
	this.getTable = function(r,c){//生成表格
		r = r|0,c = c|0;r = (r<4)?4:r;c = (c<4)?4:c;
		var td = new Array(c+1).join('<td>&nbsp;</td>');
		var tr = new Array(r+1).join('<tr class="hide">'+td+'</tr>');
		tr += new Array(r+1).join('<tr>'+td+'</tr>');
		return '<table class="init" cellpadding="0" cellspacing="0"><caption><div class="info">F2：开始，P：暂停，A：提示(0)，级别：1，得分：0</div><div class="timer"><span></span></div></caption>'+tr+'</table><div class="inarow">&nbsp;</div>';
	};
	dmodule.innerHTML = this.getTable(row,cell);
	var dplaybox = dmodule.getElementsByTagName('table')[0];
	var dinfo = dplaybox.childNodes[0].childNodes[0];
	var dtimer = dplaybox.childNodes[0].childNodes[1].childNodes[0];
	var dxboom = dmodule.childNodes[1];
	var iw = parseInt(dmodule.clientWidth)/2,ih = parseInt(dmodule.clientHeight)/2,iwxb = parseInt(dxboom.clientWidth)/2;
	dxboom.style.left = (iw-iwxb)+'px';
	dxboom.style.top = ih+'px';
	dxboom.style.display = 'none';
	playbox.call(dplaybox);
	var uphide = function(t,ot){//向上渐隐
		var pa = parseInt(100/t*2);
		this.timer = null;
		this.uphide = function(x){
			window.clearTimeout(this.timer);
			this.style.display='none';
			this.style.top = ot+'px';
			this.style.backgroundPosition = '0px '+(0-(x-1)*60)+'px';
			this.style.display = 'block';
			var alpha = 100,it = ot,times = 0,dstyle = this.style,me = this;
			!function(){
				window.clearTimeout(me.timer);
				if(!alpha){dstyle.display='none';return;}
				if(parseInt(t/++times)<=2){
					alpha -= pa;
					var na = alpha/100;
					dstyle.opacity = na,dstyle.filter='Alpha(opacity='+alpha+')';
				}
				dstyle.top = (--it)+'px';
				me.timer = window.setTimeout(arguments.callee,0);
			}();
		};
	};
	uphide.call(dxboom,100,ih);
	var showinfo = function(){//显示游戏信息
		var tt = dplaybox.remainTime,lastRT = tt;
		var innerfoo = function(){
			if(dplaybox.startflag){
				var bx = dplaybox.boomx;
				if(bx>1){dxboom.uphide(bx-1);}
				var nrt = dplaybox.remainTime;
				if(nrt>lastRT){tt = nrt;}
				lastRT = nrt;
				var rt = (nrt/tt*100);
				if(rt<=0){return;}
				dtimer.style.width = rt+'%';
				dinfo.innerHTML = 'F2：开始，P：暂停，A：提示('+dplaybox.tips+')，级别：'+dplaybox.gameLevel+'，得分：'+dplaybox.score;
			}
			window.setTimeout(arguments.callee,1000);
		}
		innerfoo();
	};
	var showtips = function(){//提示
		dplaybox.showtips();
	};
	var pause = function(){//暂停
		dplaybox.pasueTimer();
	};
	var startgame = function(){//开始
		dplaybox.className = '';
		dplaybox.init();
		dplaybox.startgame();
		showinfo();
	}
	document.documentElement.onkeydown = function(e){//绑定按键
		e = e||window.event;
		var ec = e.which||e.keyCode;
		switch(ec){
			case 65:showtips();break;
			case 80:pause();break;
			case 113:if(confirm('要开始新的游戏吗？ ^_^')){startgame();}break;
			default:break;
		}
	};
};
