// pacman.fr www.pacman.fr

//if ((typeof self.opener != 'undefined') && (self.opener)) {
//	if ((document.referrer) && (document.referrer.indexOf('pacman.fr/')<0)) {
//		alert("You are entering the realms of http://www.pacman.fr\nThanks for visiting.");
//	}
//}

// cross browser api

var apiDOM=false;
var apiIE4=false;
var apiNS4=false;
var apiNS3=false;
var apiCompatible=false;

var setimg, setSprite, showLayer, hideLayer, moveLayer;
var divisions, pacimgs;
var oldkeyHandler = document.onkeypress;
var oldkeyIEFix=document.onkeydown;
function setimg(img,spr) {
	document.images[img].src=pacimgs[spr].src;
}
function setSprite_DOM(lr,img,spr) {
	document.images[img].src=pacimgs[spr].src;
}
function setSprite_NS4(lr,img,spr) {
	divisions[lr].document.images[img].src=pacimgs[spr].src;
}
function showLayer_NS4(lr) {
	divisions[lr].visibility='show';
}
function hideLayer_NS4(lr) {
	divisions[lr].visibility='hide';
}
function showLayer_DOM(lr) {
	divisions[lr].style.visibility='visible';
}
function hideLayer_DOM(lr) {
	divisions[lr].style.visibility='hidden';
}
function moveLayer_NS4(lr,x,y) {
	divisions[lr].moveTo(x,y);
}
function moveLayer_DOM(lr,x,y) {
	divisions[lr].style.left=x;
	divisions[lr].style.top=y;
}
function moveLayer_IE4(lr,x,y) {
	divisions[lr].style.pixelLeft=x;
	divisions[lr].style.pixelTop=y;
	}

function setAPI() {
	var divNames=new Array('gLr1','gLr2','gLr3','gLr4','gLr5','gLr6','pacLr','gameOver','bonusLr1','bonusLr2','bonusLr3','bonusLr4','bonusLr5','bonusLr6', 'loginForm', 'statistic','gameend', 'loading');
	divisions=new Array();
	if (document.images) apiNS3=true;
	if (document.getElementById) {
		apiDOM=true;
		for (var i=0; i<divNames.length; i++) divisions[divNames[i]]=document.getElementById(divNames[i]);
		setSprite=setSprite_DOM;
		showLayer=showLayer_DOM;
		hideLayer=hideLayer_DOM;
		moveLayer=moveLayer_DOM;
	}
	else if (document.all) {
		apiIE4=true;
		for (var i=0; i<divNames.length; i++) divisions[divNames[i]]=document.all[divNames[i]];
		setSprite=setSprite_DOM;
		showLayer=showLayer_DOM;
		hideLayer=hideLayer_DOM;
		moveLayer=moveLayer_IE4;
	}
	else if (document.layers) {
		apiNS4=true;
		for (var i=0; i<divNames.length; i++) divisions[divNames[i]]=document.layers[divNames[i]];
		setSprite=setSprite_NS4;
		showLayer=showLayer_NS4;
		hideLayer=hideLayer_NS4;
		moveLayer=moveLayer_NS4;
	}
	apiCompatible= ((apiDOM || apiIE4 || apiNS4));
	if (apiCompatible) {
		for (var i=0; i<divNames.length; i++) {
			if (divisions[divNames[i]] == null) return false;
		}
		return true;
	}
	else {
		alert('Sorry\nThis script is not compatible to your browser.\n');
		return false;
	}
}

function getMazePos() {
	var el='MazeTop';
	var x=0;
	var y=0;
	if (apiDOM) {
		// DOM
		var obj=document.getElementById(el);
		x=obj.offsetLeft;
		y=obj.offsetTop;
		while (obj.offsetParent) {
			obj=obj.offsetParent;
			x+=obj.offsetLeft;
			y+=obj.offsetTop;
		}
	}
	else if (apiIE4) {
		// MS IE 4/win5.0
		var obj=document.all[el];
		x=obj.offsetLeft;
		y=obj.offsetTop;
		if (obj.offsetParent) {
			// IE 5
			while (obj.offsetParent) {
				obj=obj.offsetParent;
				x+=obj.offsetLeft;
				y+=obj.offsetTop;
			}
		}
		else {
			// IE 4
			while (obj.parentElement) {
				obj=obj.parentElement;
				if (obj.offsetLeft) x+=obj.offsetLeft;
				if (obj.offsetTop) y+=obj.offsetTop;
			}
		}
	}
	else if (apiNS4) {
		var obj=document.layers.MazeTopLr;
		x=obj.pageX;
		y=obj.pageY;
	}
	mazeX=x+1;
	mazeY=y+3;
}

// preloading

function preLoad() {
	var imgpath='img/';
	var imgnames=new Array(
		'f1', 'f2', 'f3', 'l1', 'l2', 'l3', 'r1', 'r2', 'r3', 'x1', 'x2', 'x3', 'b1',
		'gk', 'n0', 'n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'nn',  'pp',
		'r1', 'on', 'off', 'pnt', 'pill', 'game_over', 'r0', 'gx',
		'newgame_hi', 'newgame_lo', 'bonus200', 'bonus400', 'bonus800', 'bonus1600',  'bonus3200', 'bonus6400',
		'congratulation', 'note', '1st', '2nd', '3th', 'goodgame', 'nN'
	);
	var i,k;
	pacimgs=new Array();
	for (i=0; i<21; i++) {
		var n='tile'+i;
		pacimgs[n]=new Image();
		pacimgs[n].src=imgpath+n+'.gif';
	}
	for (i=0; i<imgnames.length; i++) {
		var n=imgnames[i];
		pacimgs[n]=new Image();
		pacimgs[n].src=imgpath+n+'.gif';
	}
	for (i=1; i<=4; i++) {
		for (k=1; k<=2; k++) {
			var n='g'+i+k;
			pacimgs[n]=new Image();
			pacimgs[n].src=imgpath+n+'.gif';
		}
	}
	var gkeys=new Array('a','n');
	for (k=1; k<=2; k++) {
		for (i=0; i<gkeys.length; i++) {
			var n='g'+gkeys[i]+k;
			pacimgs[n]=new Image();
			pacimgs[n].src=imgpath+n+'.gif';
		}
	}
}

if (document.images) preLoad();

//-->
// pacman.fr  part 2

// constructors

function Ghost() {
	this.r= 0;
	this.c= 0;
	this.s= 0;
	this.d= 0;
	this.p= 0;
	this.z= 0;
	this.osx=0;
	this.osy=0;
	this.posx=0;
	this.posy=0;
	this.last=null;
}

function Pacman() {
	this.r= 0;
	this.c= 0;
	this.p= 0;
	this.pn= 0;
	this.dir= 0;
	this.md= 0;
	this.dx= 0;
	this.dy= 0;
	this.osx=0;
	this.osy=0;
	this.posx=0;
	this.posy=0;
}

// pac def

var g= new Array();
	for (var i=1; i<=6; i++) g[i]=new Ghost;
var pac= new Pacman();
var movedir=0;
var runThru=false;
var gameOn= false;
var pill= false;
var pillCnt= 0;
var food= 0;
var nLevel= 0;
var nLife=0;
var nScore=0;
var gStep;
var aSpeed=325;
var aStep=4;
var pillFactor=1.75;
var pillLength=25;
var initDir, fGStrat;
var useRandomMazes=false;

var mazeX=0;
var mazeY=0;

var aSpan= new Array();
var gSpan= new Array();
var pacStr= new Array();

pacStr[1]='r'; pacStr[2]='l';
pacStr[4]='b'; pacStr[8]='f';
pacStr[0]='f';

var mazes = [
	{
	mazeDir0:3,
	mazeCode :[
		"ahhhhhgxbhhdxehhhhhc",
		"vp    o      o    pv",
		"v lhm   lhhm   lhm v",
		"v     n      n     v",
		"v n n v ahhc v n n v",
		"d v o v vxxq v o v b",
		"x v   v vxxt v   v x",
		"c bhm o bhhr o lhd a",
		"v        x         v",
		"em lc am lm lc am lg",
		"v   v v      v v   v",
		"v k o o lhhm o o k v",
		"vp                pv",
		"bhhhhhcxahhcxahhhhhd"
		],
	mazeGrid: [
		"00000000000000000000",
		"01000205000060100020",
		"00000506000050600000",
		"05070605000060507060",
		"00000000000000000000",
		"00000000000000000000",
		"06030600000000504050",
		"00000000000000000000",
		"03700908700780900740",
		"00000000000000000000",
		"01820001800820001820",
		"00000000000000000000",
		"03080809000090808040",
		"00000000000000000000"
		]
	},
	{
	mazeDir0:11,
	mazeCode :[
		"ahhhdxbhhhhhhdxbhhhc",
		"v p              p v",
		"v k n lm lm lm n k v",
		"v   v          v   v",
		"ehm bhm ahhc lhd lhg",
		"d       vxxq       b",
		"x lhm n vxxt n lhm x",
		"c     v bhhr v     a",
		"ehhm lg  x   em lhhg",
		"v     o n lc o     v",
		"v ahc   v  v   ahc v",
		"v bhd n bm o n bhd v",
		"v p   v      v   p v",
		"bhhhcxehhhhhhgxahhhd"
		],
	mazeGrid: [
		"00000000000000000000",
		"01070900700700907020",
		"00000000000000000000",
		"03060307800870405040",
		"00000000000000000000",
		"01080706000050708020",
		"06000000000000000050",
		"03007400000000370040",
		"00000005070060000000",
		"01008200000000180020",
		"00000506032050600000",
		"00000000000000000000",
		"03000603008040500040",
		"00000000000000000000"
		]
	},
	{
	mazeDir0:3,
	mazeCode :[
		"ahdxbhihhhhhhihdxbhc",
		"vp    o      o    pv",
		"d aim   lhhm   lic b",
		"x bg  n      n  ed x",
		"c  o ag ahhc ec o  a",
		"em   bg vxxq ed   lg",
		"v  n  o vxxt o  n  v",
		"v lfm   bhhr   lfm v",
		"v     n  x   n     v",
		"d lhhid lhhm bihhm b",
		"x    o        o    x",
		"c lm   k lm k   lm a",
		"vp   n        n   pv",
		"bhcxafhhhhhhhhfcxahd"
		],
	mazeGrid: [
		"00000000000000000000",
		"01080201000020108020",
		"00000506000050600000",
		"06001405000060320050",
		"03200000000000000140",
		"00506000000000050600",
		"01403200000000140320",
		"00000506000050600000",
		"05000405000060300060",
		"00000000000000000000",
		"09002018700782010090",
		"00005060000005060000",
		"03074030800804037040",
		"00000000000000000000"
		]
	},
	{
	mazeDir0:3,
	mazeCode :[
		"nxaidxbhhgxbdxbhmxlc",
		"v bdp    v         v",
		"v     lm o lhm ahcpv",
		"v lhm          vkv v",
		"d     n ahhihm bhd b",
		"x ahc v vxxq       x",
		"c vkv v vxxt am lc a",
		"d bhd o bhhr v   o b",
		"x        x   o n   x",
		"c lhc lhhm n   o n a",
		"v   o      v n  pv v",
		"v n   n lm o bm ld v",
		"v ecp v            v",
		"oxbfcxehhcxacxahmxld"
		],
	mazeGrid: [
		"00000000000000000000",
		"00001900205008700820",
		"05008600000000000000",
		"00000507808000600000",
		"05000600000000000000",
		"06000000000010870090",
		"00000000000000000000",
		"00000000000000182000",
		"09000908007060005090",
		"00000000000050600000",
		"05020507006000374000",
		"00037600000000000000",
		"00003603009087080740",
		"00000000000000000000"
		]
	},
	{
	mazeDir0:3,
	mazeCode :[
		"ahhhdxbhhhhhhdxoxbhc",
		"v p                v",
		"v ahc ahhm lhc ahm v",
		"v bhd v      v v   v",
		"d     v ahhc o opn b",
		"x ahm o vxxq     v x",
		"c v     vxxt n lhd a",
		"d o ahc bhhr o     b",
		"x   vkv  x     n n x",
		"c n bhd lhhihm v o a",
		"v vp       v   v   v",
		"v bhm lhhm o k ehm v",
		"v              v   v",
		"bhhhcxahhhhhhcxvxahd"
		],
	mazeGrid: [
		"00000000000000000000",
		"01000900007000908020",
		"00000000000000000000",
		"00000001008020001060",
		"05000600000000000000",
		"06000000000050904050",
		"00010806000000000000",
		"00000000000000507060",
		"09060005000080600050",
		"00000000000000000000",
		"00030708002010603060",
		"00000000000000000000",
		"03000900008080601040",
		"00000000000000000000"
		]
	}
];

var tileRef= new Array(
	'h', 'tile3', 'v', 'tile12', 'a', 'tile9', 'b', 'tile5', 'c', 'tile10', 'd', 'tile6',
	'e', 'tile13', 'f', 'tile7', 'g', 'tile14', 'i', 'tile11', 'k', 'tile16', 't', 'tile18',
	'l', 'tile1', 'm', 'tile2', 'n', 'tile8', 'o', 'tile4', 'q', 'tile17', 'r', 'tile19',
	'x', 'tile0'
);
var tileCode= new Array();
for (var i=0; i<tileRef.length; i+=2) tileCode[tileRef[i]]=tileRef[i+1];

var f1= new Array();
	for (var i=1; i<=14; i++) f1[i]=new Array();
var f2= new Array();
	for (var i=1; i<=14; i++) f2[i]=new Array();

var t1= new Array();
t1[0]=0;
t1[1]= 9; // rd
t1[2]=10; // ld
t1[3]= 5; // ru
t1[4]= 6; // lu
t1[5]=13; // rdu
t1[6]=14; // ldu
t1[7]=11; // rld
t1[8]= 7; // rlu
t1[9]=15; // rlud

var tx= new Array();
var ty= new Array();
tx[0]=0;  ty[0]=0;
tx[1]=1;  ty[1]=0;  //r
tx[2]=-1; ty[2]=0;  //l
tx[4]=0;  ty[4]=-1; //u
tx[8]=0;  ty[8]=1;  //d

var t2 = new Array();
t2[0]= [0];
t2[1]= [1];
t2[2]= [2];
t2[4]= [4];
t2[8]= [8];
t2[3]= [1, 2];
t2[9]= [1, 8];
t2[10]=[2, 8];
t2[12]=[4, 8];
t2[5]= [1, 4];
t2[6]= [2, 4];
t2[7]= [1, 2, 4];
t2[11]=[1, 2, 8];
t2[13]=[1, 4, 8];
t2[14]=[2, 4, 8];
t2[15]=[1, 2, 4, 8];

var t3 = new Array();
t3[0]=0; t3[1]=2; t3[2]=1; t3[4]=8; t3[8]=4;

var gHomePos= new Array( [7,11], [6,11], [6,10], [7,10] );

var bonus=new Array();
var bonusTimer=new Array();
var bonusCnt=0;
var bonusVal=[200,400,800,1600,3200,6400];
var bonusScore=0;
var bonusLifeAt=7000;
var bonusDelay=120;
var bonusDuration=1800;

// setup

function buildMaze(a) {
	var m=mazes[a];
	food=0;
	initDir=m.mazeDir0;
	for (var r=1; r<=14; r++) {
		for (var c=1; c<=20; c++) {
			f1[r][c]=0;
			f2[r][c]=t1[parseInt(m.mazeGrid[r-1].charAt(c-1),10)];
			var z=m.mazeCode[r-1].charAt(c-1);
			if (z==' ') {
				setTile(r,c,'pnt');
				f1[r][c]=9;
				food++;
			}
			else if (z=='p') {
				setTile(r,c,'pill');
				f1[r][c]=8;
				food++;
			}
			else {
				setTile(r,c,tileCode[z]);
			}
		}
	}
}

function setSpan() {
	for (var n=1-aStep; n<aStep; n++) {
		if (n==0) aSpan[0]=0
		else {
			aSpan[n]=Math.round(n*27/aStep);
		}
	}
	gStep=Math.round(aStep*pillFactor);
	for (n=1-gStep; n<gStep; n++) {
		if (n==0) gSpan[0]=0
		else {
			gSpan[n]=Math.round(n*27/gStep);
		}
	}
	limitOffsets(pac, aStep);
	for (var i=1; i<=4; i++) {
		if ((pill) && (g[i].s==2)) limitOffsets(g[i], gStep)
		else limitOffsets(g[i], aStep);
	}
}

function limitOffsets(obj,limit) {
	if (obj.osx>=limit) obj.osx=limit-1;
	if (obj.osy>=limit) obj.osy=limit-1;
	if (obj.osx<=-limit) obj.osx=1-limit;
	if (obj.osy<=-limit) obj.osy=1-limit;
}

// display

function setTile(r,c,n) {
	setimg('r'+r+'c'+c, n);
}

// =========== game play

function newGame() {
	var ready=setAPI();
	if (ready==false) return;
	getMazePos();
	window.onresize=getMazePos;
	hideLayer('gameOver');
	hideLayer('statistic');
	//setSprite('gameOver','go_i','game_over');
	//Hide Login form
//    jQuery.get('/pacman/games/currentplayer', {}, function(data)
//            {
//                jQuery("#currentplayer").html(data);
//     } ); 
//	if(myCookie.get('pacman')==0||myCookie.get('pacman')==undefined)
//    {
//        //Hide
//    	hideLayer('loginForm');
//     
//    }
//    
//	else {
//		moveLayer('loginForm',mazeX+27*6+50,mazeY+27*0+50);
//		document.images['congratulation'].src=myCookie.get('imggame');
//		document.getElementById('Score').value=myCookie.get('Score');
//		showLayer('loginForm');
//		   //and set
//        myCookie.add('pacman=0')
//	}
	hideLayer('loginForm');
	setSprite('gameOver','go_i','game_over');
	// PPLong config 14.05.2008 - Call enableKeyboard Function when startGame
	var n = new Date();
    document.getElementById('GameStarttime').value=n.getFullYear()+"/"+(n.getMonth()+1)+"/"+n.getDate()+" "+n.getHours()+":"+n.getMinutes()+":"+n.getSeconds();
	//document.getElementById('GameStarttime').value=new Date();
	document.getElementById('note').value="";
	enableKeyboard();
	resetLevel();
	resetScore();
	nLife=3;
	nScore=0;
	addScore(0);
	bonusScore=0;
	setimg('life1','r1');
	setimg('life2','r1');
	setimg('life3','r1');
	setimg('life4','tile0');
	nLevel=0;
	pacTimer= setTimeout("doNull()",1000);
	clearTimeout(pacTimer);
	setimg('newgame','newgame_lo');
	startLevel();
}
/// i is Bonus
function startLevel() {
	gameOn=false;
	hideLayer('pacLr');
	for (var i=1; i<=6; i++) {
		hideLayer('gLr'+i);
		hideBonus(i);
	}
	runThru=false;
	nLevel++;
	fGStrat=Math.min(2+nLevel,6);
	showLevel();
	if ((useRandomMazes) || (nLevel>mazes.length)) buildRandomMaze()
	else buildMaze(nLevel-1);
	setSpan();
	for (var i=1; i<=4; i++) gHome(i);
	pHome();
	showLayer('pacLr');
	gameOn=true;
	// PPLong config 14.05.2008 - Call enableKeyboard Function when startLevel
	enableKeyboard();
	doMove();
}

function gHome(i) {
	with (g[i]) {
		for (var k=0; k<gHomePos.length; k++) {
			if (tileFree(i,gHomePos[k][0],gHomePos[k][1])) {
				r=gHomePos[k][0];
				c=gHomePos[k][1];
				break;
			}
		}
		osx=0; osy=0;
		s=0; p=1;
		z=0;
		setGhost(i,r,c,'g'+i+p);
	}
	showLayer('gLr'+i);
}

function pHome() {
	pill=false; pillCnt=0;
	movedir=0;
	with (pac) {
		r=9; c=10;
		osx=0; osy=0;
		md=0; dir= initDir;
		dx=0; dy=0;
		pn=1; p=1;
		if (nLife<5) setimg('life'+nLife, 'r0');
		setPac(r,c,'r1');
	}
}

function getRand(x) {
	return Math.floor(Math.random() * x);
}

function tileFree(n, r,c) {
	var tpx=27*(c-1);
	var tpy=27*(r-1);
	for (var i=1; i<=4; i++) {
		if ((i==n) || (g[i].s==3)) continue;
		if ((g[i].r==r) && (g[i].c==c)) return false;
		//if (isCollision(g[i].posx,g[i].posy, tpx,tpy, 15)) return false;
	}
	return true
}

function isCollision(x1,y1,x2,y2, radius) {
	return (Math.abs(x1-x2)+Math.abs(y1-y2)<radius);
}

function trunkBy(v,m) {
	v%=m;
	if (v==0) v=m;
	return v;
}


// =========== main

function move(x) {
	movedir=x;
}

function doMove() {
	clearTimeout(pacTimer);
	dateA=new Date();
	with (pac) {
		if (osx+osy==0) pMove();
		if (runThru) {
			osx+=dx;
			osy+=dy;
			if ((c+dx)%21==0) osx=0;
			if ((r+dy)%15==0) osy=0;
			osx%=aStep;
			osy%=aStep;
			if (osx==0) c=trunkBy(c+dx,20);
			if (osy==0) r=trunkBy(r+dy,14);
			p+=pn;
			if (p==3) pn=-1;
			if (p==1) pn=1;
			if (md==4) setPac(r,c,'b1')
			else setPac(r,c,pacStr[md]+p);
			if ((osx+osy==0) && (f2[r][c])) dir=f2[r][c];
		}
		if (f1[r][c]>=8) {
			setTile(r,c,'tile0');
			if (f1[r][c]==8) {
				if (pill==false) {
					pill=true;
					for (var i=1; i<=4; i++) translateGPos(i,false);
				}
				pillCnt=pillLength*aStep;
				bonusCnt=0;
				addScore(15);
			}
			else {
				addScore(5);
			}
			f1[r][c]=0;
			food--;
			if (food==0) {
				addScore(500);
				setTimeout("startLevel()",150);
				return;
			}
		}
	}
	gmove();
	testCrash("doMoveFinal()");
}

function doMoveFinal() {
	clearTimeout(pacTimer);
	if (pill) {
		pillCnt--;
		if (pillCnt==0) {
			pill=false;
			for (var i=1; i<=4; i++) translateGPos(i,true);
		}
	}
	if (gameOn) {
		dateB=new Date();
		mTO= dateA.getTime()-dateB.getTime();
		mTO+=Math.round(aSpeed/aStep);
		if (mTO<5) mTO=5;
		pacTimer=setTimeout("doMove()",mTO);
	}
}

// =========== Pacman

function pMove() {
	with (pac) {
		if (dir&movedir) md= dir&movedir
		else {
			md&=dir;
			if (md==0) runThru=false;
		}
		if (md) {
			runThru=true;
			dx=(md&3);
			dy=(md&12);
			if (dx) {
				dir=3;
				dx=tx[dx];
			}
			if (dy) {
				dir=12;
				dy=ty[dy];
			}
		}
	}
}

function setPac(r,c,s) {
	pac.posx=27*(c-1)+aSpan[pac.osx];
	pac.posy=27*(r-1)+aSpan[pac.osy];
	moveLayer('pacLr', mazeX+pac.posx, mazeY+pac.posy);
	setSprite('pacLr','pac_i',s);
}


// =========== Ghost

function gmove() {
	for (i=1; i<=4; i++) {
		if (gameOn) {
			with (g[i]) {
				p= ((p==1)? 2:1);
				if (s==2) gMove2(i)
				else if (s==3) gMove3(i)
				else if (s==1) gMove1(i)
				else gMove0(i);
			}
		}
		displayGhost(i);
	}
}

function displayGhost(i) {
	with (g[i]) {
		if (s==3) setGhost(i,r,c,'gx')
		else if ((pill) && (s>0)) setGhost(i,r,c,'g'+((pillCnt>4*aStep)? 'a':'n')+p)
		else setGhost(i,r,c,'g'+i+p);
	}
}

function setGhost(i,r,c,s) {
	var glr='gLr'+i;
	if ((pill) && (g[i].s==2)) {
		g[i].posx=27*(c-1)+gSpan[g[i].osx];
		g[i].posy=27*(r-1)+gSpan[g[i].osy];
	}
	else {
		g[i].posx=27*(c-1)+aSpan[g[i].osx];
		g[i].posy=27*(r-1)+aSpan[g[i].osy];
	}
	moveLayer(glr, mazeX+g[i].posx, mazeY+g[i].posy);
	setSprite(glr,'g_i'+i,s);
}

function gMove0(i) {
	with (g[i]) {
		if ((tileFree(i,7,12)) && ((pac.dx+pac.dy)!=0)) {
			if ((z>40) || (getRand(30)<1)) {
				s++;
				r=7; c=12;
				osx=0;
			}
			else z++;
		}
	}
}

function gMove1(i) {
	with (g[i]) {
		if (tileFree(i,7,13)) {
			if (osx==0) osx++
			else {
				osx++;
				if (osx==aStep) {
					c=13;
					osx=0;
					d=(getRand(2))? 8:4;
					s++;
				}
			}
		}
	}
}

function gMove2(i) {
	with (g[i]) {
		if (osx+osy==0) {
			var x= f2[r][c];
			if (x>0) {
				var gdm= x&(15^t3[d]);
				if (getRand(fGStrat)>0) gmoveStrat(i,gdm)
				else gmoveRand(i,gdm);
			}
			if (d>0) {
				if (tileFree(i,trunkBy(r+ty[d],14),trunkBy(c+tx[d],20))) gSet(i)
				else reverseStuck(i,x);
			}
		}
		else gSet(i);
	}
}

function gMove3(i) {
	with (g[i]) {
		if (osx+osy==0) {
			if ((r==7) && (c==13)) {
				hideLayer('gLr'+i);
				gHome(i);
				return
			}
			var x= f2[r][c];
			if (x>0) {
				var gdm= x&(15^t3[d]);
				var node='r'+r+'c'+c;
				if ((last[node]) && (t2[gdm].length>1) && (Math.random()>.3)) gdm &= 15^last[node];
				var desx=13-g[i].c;
				var desy=7-g[i].r;
				g[i].d=0;
				if (desx!=0) g[i].d= (desx>0)? 1:2;
				if (desy!=0) g[i].d|= (desy>0)? 8:4;
				g[i].d&=gdm;
				if (g[i].d>0) gmoveRand(i,g[i].d)
				else {
					var adx=(desx>0)? gdm&(15^2):gdm&(15^1);
					var ady=(desy>0)? gdm&(15^4):gdm&(15^1);
					if (adx) gmoveRand(i,adx)
					else if (ady) gmoveRand(i,ady)
					else gmoveRand(i,gdm);
				}
				last[node]=d;
			}
		}
		gSet(i);
	}
}

function gSet(i) {
	with (g[i]) {
		osy+=ty[d];
		osx+=tx[d];
		if ((pill) && (s==2)) {
			osx%=gStep;
			osy%=gStep;
		}
		else {
			osx%=aStep;
			osy%=aStep;
		}
		if (((c==1) && (tx[d]==-1)) || ((c==20) && (tx[d]==1))) osx=0;
		if (((r==1) && (ty[d]==-1)) || ((r==14) && (ty[d]==1))) osy=0;
		if (osx==0) c=trunkBy(c+tx[d],20);
		if (osy==0) r=trunkBy(r+ty[d],14);
	}
}

function gmoveRand(i,k) {
	g[i].d=t2[k][getRand(t2[k].length)];
}

function gmoveStrat(i,gdm) {
	var desx=pac.c-g[i].c;
	var desy=pac.r-g[i].r;
	if (pill) {
		desx=-desx;
		desy=-desy;
	}
	g[i].d=0;
	if (desx!=0) g[i].d= (desx>0)? 1:2;
	if (desy!=0) g[i].d|= (desy>0)? 8:4;
	g[i].d&=gdm;
	if (g[i].d>0) gmoveRand(i,g[i].d)
	else gmoveRand(i,gdm);
}

function reverseStuck(i,x) {
	with (g[i]) {
		if (x==0) {
			if (tileFree(i,trunkBy(r-ty[d],14),trunkBy(c-tx[d],20))) d=t3[d];
		}
		else {
			var vd= t2[x][getRand(t2[x].length)];
			if (tileFree(i,r+ty[vd],c+tx[vd])) {
				d=vd;
				gSet(i);
			}
		}
	}
}

function translateGPos(i,reset) {
	with (g[i]) {
		if ((reset) && (s==2)) {
			osx= Math.round(osx/pillFactor-tx[d]*.1);
			osy= Math.round(osy/pillFactor-ty[d]*.1);
			limitOffsets(g[i], aStep);
		}
		else if (s==2) {
			osx= Math.round(osx*pillFactor+tx[d]*.1);
			osy= Math.round(osy*pillFactor+ty[d]*.1);
			limitOffsets(g[i], gStep);
		}
	}
}

// =========== Crash

function testCrash(tos) {
	var crash=0;
	for (i=1; i<=6; i++) {
		if ((g[i].s==2) && (isCollision(g[i].posx,g[i].posy, pac.posx,pac.posy, 25))) {
			crash=i;
			if (pill) {
				setPac(pac.r,pac.c,'gk');
				setTimeout("showBonus("+i+")",bonusDelay);
			}
			else hideLayer('gLr'+i);
		}
	}
	if (crash>0) {
		if (pill) setTimeout("resetGhost("+crash+",\'"+tos+"\')",150)
		else resetPac(1);
	}
	else pacTimer= setTimeout(tos,1);
}

function resetGhost(i,tos) {
	setPac(pac.r,pac.c,pacStr[pac.md]+((pac.md==4)?1:pac.p));
	if (g[i].s==2) {
		translateGPos(i,true);
		g[i].s=3;
		g[i].last=new Array();
		setGhost(i,g[i].r,g[i].c,'gx');
		showLayer('gLr'+i);
	}
	else gHome(i);
	pacTimer= setTimeout(tos,1);
}

function resetPac(i) {
	if (i<4) {
		setPac(pac.r,pac.c,'x'+i);
		i++;
		if (i<=4) setTimeout("resetPac("+i+")","500");
	}
	else {
		if (nLife<5) setimg('life'+nLife,'tile0');
		nLife--;
		if (nLife>0) {
			for (k=1; k<=4; k++) gHome(k);
			pHome();
			doMove();
		}
		else gameOver();
	}
}

// =========== general2

function showLevel() {
	var lStr=''+nLevel;
	var lm=Math.min(lStr.length,3);
	for (var i=0; i<lm; i++) setimg('l'+i, 'n'+lStr.charAt(i));
}

function addScore(n) {
	nScore+=n;
	var sStr=''+nScore;
	var sm=Math.min(sStr.length,7);
	for (var i=0; i<sm; i++) setimg('s'+i, 'n'+sStr.charAt(i));
	bonusScore+=n;
	if (bonusScore>=bonusLifeAt) {
		bonusScore-=bonusLifeAt;
		if (nLife<5) {
			setimg('life'+nLife,'r1');
			nLife++;
			if (nLife<5) setimg('life'+nLife, 'r0');
		}
	}
	// Game not Over but Save data -- PP Long 03.06.08
	// document.getElementById('GameScore').value=nScore;
   // document.getElementById('Score').value=nScore;
   // document.getElementById('GameEndtime').value=Date();
}

function resetLevel() {
	for (var i=0; i<3; i++) setimg('l'+i, 'nn');
}

function resetScore() {
	for (var i=0; i<7; i++) setimg('s'+i, 'nn');
}

function showBonus(i) {
	if (bonus[i]) {
		clearTimeout(bonusTimer[i]);
	}
	
	addScore(bonusVal[bonusCnt]);
	var lr='bonusLr'+i;
	setSprite(lr,'bonus_i'+i,'bonus'+bonusVal[bonusCnt++]);
	moveLayer(lr, mazeX+g[i].posx, mazeY+g[i].posy);
	showLayer(lr);
	if (bonusCnt>5) bonusCnt=5;
	bonus[i]=true;
	bonusTimer[i]=setTimeout('hideBonus('+i+')',bonusDuration);
}

function hideBonus(i) {
	if ((bonus[i]) && (bonusTimer[i])) {
		clearTimeout(bonusTimer[i]);
	}
	hideLayer('bonusLr'+i);
	bonus[i]=false;
}
function displaynote(){
    var strdisplay="";
     strdisplay= document.getElementById('note').value;
     return strdisplay;
   }
function gameOver() {
	
	moveLayer('gameOver',mazeX+27*5+50,mazeY+27*0+1);
	document.getElementById('note').value=ordergame();
	//showLayer('gameOver');
	ordergame();
	disableKeyboard();
	// PP Long edit 16.05.2008
	document.getElementById('GameScore').value=nScore;
	document.getElementById('Score').value=nScore;
	var d = new Date();
	document.getElementById('GameEndtime').value=d.getFullYear()+"/"+(d.getMonth()+1)+"/"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
	if (document.getElementById('GameUsername').value!=''){
	 myCookie.add('Score='+document.getElementById('Score').value);
	 myCookie.add('imggame='+document.images['congratulation'].src);
	 // submit data 

    var data1 =  { 'data[Game][username]':  document.getElementById('GameUsername').value ,
                   'data[Game][score]':  document.getElementById('GameScore').value ,
                   'data[Game][starttime]':  document.getElementById('GameStarttime').value ,
                   'data[Game][endtime]': document.getElementById('GameEndtime').value ,
                   'data[Game][ipcomputer]': document.getElementById('GameIpcomputer').value 
                  };	              
	 jQuery.post('games/add', data1 , function(data)
            {
//            	jQuery.post('/pacman/games/gameover', {}, function(data)
//                  {
//                     jQuery("#loginForm").html(data);
//                     
//                  } ); 
                 showLayer('loginForm');             	
            	jQuery.get('games/toptendaily',{}, function(data)
                 {
                     jQuery("#ajaxcontentarea").html(data);
                  });
                jQuery.get('games/gameover',{}, function(data)
                 {
                     jQuery("#gameend").html(data);
                 });
                
           });

	} else{
	 setTimeout("document.getElementById('GameUsername').focus()",900);
   	 showLayer('loginForm');
	 }
	gameOn=false;
	nLevel=0;
	clearTimeout(pacTimer);

}
//Order position player
function ordergame(){
 var strnote="";
 if (nScore>= document.getElementById('1stday').value)
  // strnote="<b>Congratulation !!!</b><br> Your the 1<sup>st</sup> today";
  setimg('congratulation', '1st');
  else if (nScore>= document.getElementById('2ndday').value)
//  strnote="<b>Congratulation !!!</b> Your the 2<sup>nd</sup> today";
  setimg('congratulation', '2nd');
  else if (nScore>= document.getElementById('3thday').value)
 // strnote="<b>Congratulation !!!</b> Your the 3<sup>th</sup> today";
  setimg('congratulation', '3th');
 else //if (document.getElementById('sessiongame').value==1)
 //  strnote="Good game!!! <br><center> hubert!</center>";
   setimg('congratulation', 'goodgame');
 // else
 //  setimg('congratulation', 'note');
}
// Close game
function closegame(){
	hideLayer('loginForm');
	newGame();
}

function doPause() {
	if (gameOn) {
		gameOn=false;
		clearTimeout(pacTimer);
		resetLevel();
		setimg('l0','pp');
	}
	else {
		if (nLevel>0) {
			gameOn=true;
			showLevel();
			pacTimer= setTimeout("doMove()",100);
		}
	}
}

function setSpeed(nSpeed) {
	setimg('speed'+aSpeed,'off');
	aSpeed= nSpeed;
	setimg('speed'+aSpeed,'on');
}

function setSmoothness(nStep) {
	setimg('step'+aStep,'off');
	aStep= nStep;
	setSpan();
	setimg('step'+aStep,'on');
}

function setRMaze(randomize) {
	if (randomize) {
		setimg('rmaze0','off');
		setimg('rmaze1','on');
		useRandomMazes=true;
	}
	else {
		setimg('rmaze1','off');
		setimg('rmaze0','on');
		useRandomMazes=false;
	}
}


function doNull() {}

//-->

// random maze layout
// (c) N.pacman.fr 2004

// random maze

var rf= new Array();
for (var r=0; r<=15; r++) {
	rf[r]=new Array();
}

var rCageFrame= new Array(
	[5,9], [5,10], [5,11], [5,12],
	[6,9], [6,12], [7,9], [7,12],
	[8,9], [8,10], [8,11], [8,12]
);
var rStandardFree= new Array([9,9], [6,13], [7,13], [8,13], [9,11], [9,12], [9,13]);

var rOrdC=[2,19,3,18,4,17,5,16,6,15,7,14,8,13,9,12,10,11];
var rOrdR=[2,13,3,12,4,11,5,10,6,9,7,8];

var rSymLine= [2,3,4,10,11,12];

function buildRandomMaze() {
	window.status='Generating random maze layout ...';
	var edgelines=false;
	var sym=(Math.random()>.5);
	rMazeSetUp();
	var n=getRand(28)+18;
	// edge lines
	if (Math.random()>.5) {
		var k=getRand(10)+2;
		if ((sym) && (k>6)) k=6;
		for (var i=2; i<k; i++) {
			var z=getRand(4);
			if (z==0) {
				rEdgeLine(2, (sym)? getRand(3)+13:getRand(12)+4, 8);
			}
			else if (z==1) {
				rEdgeLine(13, (sym)? getRand(3)+13:getRand(12)+4, 4);
			}
			else if ((sym) || (z==2)) {
				rEdgeLine(getRand(6)+4,19,2);
			}
			else if (z==3) {
				rEdgeLine(getRand(6)+4,2,1);
			}
		}
		edgelines=true;
		n-=k;
	}
	// inner lines
	if (sym) {
		for (var i=0; i<n; i+=2) rLine(getRand(10)+3, getRand(9)+10, (Math.random()>.5)? 1:8);
		for (var i=0; i<rSymLine.length; i++) {
			var r=rSymLine[i];
			rf[r][10]=-1;
			if (rf[r+1][10]>=0) rf[r+1][10]&=14;
		}
		for (var r=2; r<14; r++) {
			for (var c=2; c<11; c++) {
				if (rf[r][21-c]>=0) rSet(r,c);
			}
		}
	}
	else {
		for (var i=0; i<n; i++) rLine(getRand(10)+3, getRand(16)+3, (Math.random()>.5)? 1:8);
	}
	if (edgelines) {
		for (var i=2; i<4; i++) {
			var r=rOrdR[i];
			for (var c=3; c<19; c++) rFillBag(r,c);
		}
		for (var r=3; r<13; r++) {
			for (var i=2; i<4; i++) rFillBag(r,rOrdC[i]);
		}
	}
	// fill grid
	rGrow(2);
	if (sym) {
		for (var r=2; r<14; r++) {
			for (var c=12; c<21; c++) {
				if ((r>5) && (r<9) && (c<13)) continue;
				var sc=21-c;
				if (rf[r][sc]>=0) rClear(r,sc);
				if (rf[r][c]>=0) rSet(r,sc);
			}
		}
	}
	rGrow(0);
	
	// teleports
	var m=getRand(2)+1;
	for (var i=0; i<m; i++) {
		var x=(sym)? getRand(8)+2 : getRand(18)+2;
		if ((rf[2][x]<0) && (rf[13][x]<0) && (rf[1][x-1]>=0) && (rf[1][x+1]>=0)) {
			if (sym) {
				var x2=21-x;
				if ((rf[2][x2]>=0) || (rf[13][x2]>=0) || (rf[1][x2-1]<0) || (rf[1][x2+1]<0)) return;
				rf[1][x2]=-3;
				rf[14][x2]=-3;
				rf[1][x2-1]&=14; rf[1][x2-1]|=4;
				rf[1][x2+1]&=13; rf[1][x2+1]|=4;
				rf[14][x2-1]&=14; rf[14][x2-1]|=8;
				rf[14][x2+1]&=13; rf[14][x2+1]|=8;
			}
			rf[1][x]=-3;
			rf[14][x]=-3;
			rf[1][x-1]&=14; rf[1][x-1]|=4;
			rf[1][x+1]&=13; rf[1][x+1]|=4;
			rf[14][x-1]&=14; rf[14][x-1]|=8;
			rf[14][x+1]&=13; rf[14][x+1]|=8;
			if (sym) break;
		}
	}
	m=getRand(3)+1;
	for (var i=0; i<m; i++) {
		var x=getRand(12)+2;
		if ((rf[x][2]<0) && (rf[x][19]<0) && (rf[x-1][1]>=0) && (rf[x+1][1]>=0)) {
			rf[x][1]=-3;
			rf[x][20]=-3;
			rf[x-1][1]&=7; rf[x-1][1]|=2;
			rf[x+1][1]&=11; rf[x+1][1]|=2;
			rf[x-1][20]&=7; rf[x-1][20]|=1;
			rf[x+1][20]&=11; rf[x+1][20]|=1;
		}
	}
	
	rClearWalls(sym);
	// parse grid & set tiles
	rParseGrid();
	// pill placement
	if (sym) {
		rSetPill(2,2,true);
		rSetPill(13,2,true);
	}
	else {
		rSetPill(2,2,false);
		rSetPill(2,19,false);
		rSetPill(13,2,false);
		rSetPill(13,19,false);
	}
	var x=getRand(12)+4;
	var y=getRand(6)+4;
	if ((rf[y][x]<0) && (f1[y][x]==9)) {
		f1[y][x]=8;
		setTile(y,x,'pill');
	}
	
	//pacHome 9/10
	initDir=1;
	if (rf[9][9]<0) initDir|=2;
	if (rf[10][10]<0) initDir|=8;
	window.status='done.';
}

function rMazeSetUp() {
	for (var r=0; r<15; r++) {
		for (var c=0; c<=20; c++) rf[r][c]=-1;
	}
	for (var c=1; c<21; c++) { rSet(1,c); rSet(14,c) }
	for (var r=2; r<14; r++) { rSet(r,1); rSet(r,20) }
	for (var i=0; i<gHomePos.length; i++) {
		var p=gHomePos[i];
		rf[p[0]][p[1]]=-3;
	}
	for (var i=0; i<rCageFrame.length; i++) {
		rSet(rCageFrame[i][0],rCageFrame[i][1]);
	}
	for (var i=0; i<rStandardFree.length; i++) {
		rf[rStandardFree[i][0]][rStandardFree[i][1]]=-2;
	}
	rf[9][10]=-3;
}

function rSet(r,c) {
	var d=0;
	if (rf[r+1][c]>=0) { rf[r+1][c]|=4; d|=8 }
	if (rf[r-1][c]>=0) { rf[r-1][c]|=8; d|=4 }
	if (rf[r][c+1]>=0) { rf[r][c+1]|=2; d|=1 }
	if (rf[r][c-1]>=0) { rf[r][c-1]|=1; d|=2 }
	rf[r][c]=d;
}

function rClear(r,c) {
	if (rf[r+1][c]>=0) rf[r+1][c]&=255^4;
	if (rf[r-1][c]>=0) rf[r-1][c]&=255^8;
	if (rf[r][c+1]>=0) rf[r][c+1]&=255^2;
	if (rf[r][c-1]>=0) rf[r][c-1]&=255^1;
	rf[r][c]=-1;
}

function rLine(r,c,d) {
	if (rf[r][c]!=-1) return;
	if ((rf[r+1][c]>=0) || (rf[r-1][c]>=0) || (rf[r][c+1]>=0) || (rf[r][c-1]>=0)) return;
	if ((rf[r+1][c+1]>=0) || (rf[r+1][c-1]>=0) || (rf[r-1][c+1]>=0) || (rf[r-1][c-1]>=0)) return;
	rSet(r,c);
	rLineDraw(r,c,d);
}

function rEdgeLine(r,c,d) {
	if (rf[r][c]!=-1) return;
	if (d&3) {
		if ((rf[r-1][c]>=0) || (rf[r-2][c]>=0) || (rf[r+1][c]>=0) || (rf[r+2][c]>=0) || (rf[r+3][c]>=0) || (rf[r-3][c]>=0)) return;
		if ((d==1) && ((rf[r][c+1]>=0) || (rf[r+1][c+1]>=0) || (rf[r-1][c+1]>=0))) return;
		if ((d==2) && ((rf[r][-1]>=0) || (rf[r+1][c-1]>=0) || (rf[r-1][c-1]>=0))) return;
	}
	else {
		if ((rf[r][c+1]>=0) || (rf[r][c+2]>=0) || (rf[r][c-1]>=0) || (rf[r][c-2]>=0) || (rf[r][c+3]>=0) || (rf[r][c-3]>=0)) return;
		if ((d==8) && ((rf[r+1][c]>=0) || (rf[r+1][c-1]>=0) || (rf[r+1][c+1]>=0))) return;
		if ((d==4) && ((rf[r-1][c]>=0) || (rf[r-1][c-1]>=0) || (rf[r-1][c+1]>=0))) return;
	}
	rSet(r,c);
	rLineDraw(r,c,d, true);
}

function rLineDraw(r,c,d, isEdge) {
	var l=(d&3)? getRand(12-r)+1 : getRand(18-r)+1;
	if ((isEdge)  && (d&12) && (l>6)) l==6;
	for (var k=0; k<l; k++) {
		r+=ty[d];
		c+=tx[d];
		if (rf[r][c]!=-1) return;
		if ((d&3) && ((rf[r+1][c]>=0) || (rf[r-1][c]>=0))) return;
		if ((d&12) && ((rf[r][c+1]>=0) || (rf[r][c-1]>=0))) return;
		var r2=r+ty[d];
		var c2=c+tx[d];
		if (rf[r2][c2]>=0) return;
		if ((d&3) && ((rf[r2+1][c2]>=0) || (rf[r2-1][c2]>=0))) return;
		if ((d&12) && ((rf[r2][c2+1]>=0) || (rf[r2][c2-1]>=0))) return;
		rSet(r,c);
	}
}

function rGrow(ofs) {
	for (var ri=ofs; ri<rOrdR.length; ri++) {
		var r=rOrdR[ri];
		for (var ci=ofs; ci<rOrdC.length; ci++) {
			var c=rOrdC[ci];
			var x=rf[r][c];
			if ((x>=0) && (x<15)) {
				if (c<11) {
					if ((x&1)==0) rGrowLine(r,c,1);
					if ((x&2)==0) rGrowLine(r,c,2);
				}
				else {
					if ((x&2)==0) rGrowLine(r,c,2);
					if ((x&1)==0) rGrowLine(r,c,1);
				}
				if (r<8) {
					if ((x&4)==0) rGrowLine(r,c,4);
					if ((x&8)==0) rGrowLine(r,c,8);
				}
				else {
					if ((x&4)==0) rGrowLine(r,c,4);
					if ((x&8)==0) rGrowLine(r,c,8);
				}
			}
		}
	}
}

function rGrowLine(r,c,d) {
	var dx=tx[d];
	var dy=ty[d];
	var dr=t3[d];
	r+=dy;
	c+=dx;
	while ((rf[r][c]==-1) && (rf[r+dy][c+dx]<0)) {
		if (d&3) {
			if ((rf[r+1][c]>=0) && ((rf[r+1][c]&dr)==0)) return;
			if ((rf[r-1][c]>=0) && ((rf[r-1][c]&dr)==0)) return;
			var c1=c+dx;
			if ((rf[r+1][c1]>=0) && ((rf[r+1][c1]&dr)==0)) return;
			if ((rf[r-1][c1]>=0) && ((rf[r-1][c1]&dr)==0)) return;
		}
		else {
			if ((rf[r][c+1]>=0) && ((rf[r][c+1]&dr)==0)) return;
			if ((rf[r][c-1]>=0) && ((rf[r][c-1]&dr)==0)) return;
			var r1=r+dy;
			if ((rf[r1][c+1]>=0) && ((rf[r1][c+1]&dr)==0)) return;
			if ((rf[r1][c-1]>=0) && ((rf[r1][c-1]&dr)==0)) return;
		}
		rSet(r,c);
		r+=dy;
		c+=dx;
	}
}

function rFillBag(r,c) {
	if ((rf[r][c]==-1) && (rf[r-1][c-1]<0) && (rf[r-1][c]<0) && (rf[r-1][c+1]<0) && (rf[r][c-1]<0) && (rf[r][c+1]<0) && (rf[r+1][c-1]<0) && (rf[r+1][c]<0) && (rf[r+1][c+1]<0)) {
		rSet(r,c);
		if (Math.round()>.7) return;
		var r1=r;
		var c1=c+1;
		while ((rf[r1][c1]==-1) && (c1<18)) {
			if ((rf[r1][c1+1]>=0) || (rf[r1-1][c1+1]>=0) || (rf[r1+1][c1+1]>=0)) break;
			rSet(r1,c1);
			c1++;
		}
		r1=r+1;
		c1=c;
		while ((rf[r1][c1]==-1) && (r1<12)) {
			if ((rf[r1+1][c1]>=0) || (rf[r1+1][c1-1]>=0) || (rf[r1+1][c1+1]>=0)) break;
			rSet(r1,c1);
			r1++;
		}
	}
}

function rSetPill(r,c,sym) {
	if ((rf[r][c]==-1) && (rf[r][1]>0) && (rf[1][c]>0)) {
		f1[r][c]=8;
		setTile(r,c,'pill');
		var sc=21-c;
		if ((sym) && (rf[r][sc]==-1)) {
			f1[r][sc]=8;
			setTile(r,sc,'pill');
		}
	}
	else {
		var dx=(c==2)? +1:-1;
		var dy=(r==2)? +1:-1;
		for (var i=0; i<50; i++) {
			var x=c+getRand(4)*dx;
			var y=r+getRand(4)*dy;
			if (rf[y][x]<0) {
				f1[y][x]=8;
				setTile(y,x,'pill');
				var sx=21-x;
				if ((sym) && (rf[y][sx]==-1)) {
					f1[y][sx]=8;
					setTile(y,sx,'pill');
				}
				break;
			}
		}
	}
}

function rClearWalls(sym) {
	for (var c=3; c<18; c++) {
		var passages=0;
		var lpr=0;
		for (var r=2; r<=13; r++) {
			if (rf[r][c]<=0) {
				lpr=r;
				if (++passages==2) break;
			}
		}
		if (passages<2) {
			var posPassages=new Array();
			for (var r=2; r<=13; r++) {
				if ((Math.abs(lpr-r)>6) && (rf[r][c]>0) && (rf[r][c-1]<=0) && (rf[r][c+1]<=0) && (rf[r-1][c]>0) && (rf[r+1][c]>0)) posPassages[posPassages.length]=r;
			}
			if (posPassages.length==0) {
				for (var r=2; r<=13; r++) {
					if ((rf[r][c]>0) && (rf[r][c-1]<=0) && (rf[r][c+1]<=0) && (rf[r-1][c]>0) && (rf[r+1][c]>0)) posPassages[posPassages.length]=r;
				}
			}
			if (posPassages.length) {
				var pr=posPassages[Math.floor(Math.random()*posPassages.length)];
				rClear(pr,c);
				if ((sym) && (c<11)) {
					var sc=21-c;
					if ((rf[pr][sc-1]<=0) && (rf[pr][sc+1]<=0) && (rf[pr-1][sc]>0) && (rf[pr+1][sc]>0)) rClear(pr,sc);
				}
			}
		}
	}
}

function rParseGrid() {
	food=0;
	for (var r=1; r<=14; r++) {
		for (var c=1; c<=20; c++) {
			f1[r][c]=0;
			var v=rf[r][c];
			if (v<-2) {
				setTile(r,c,'tile0');
			}
			else if (v<0) {
				setTile(r,c,'pnt');
				f1[r][c]=9;
				food++;
			}
			else if (v==0) {
				setTile(r,c,'tile20');
			}
			else if (v>0) {
				if ((v&4) && (r>1)) {
					if ((rf[r-1][c]>0) && (rf[r-1][c]&8) && (c>1) && (rf[r][c-1]>0) && (rf[r][c-1]&4) && (c<20) && (rf[r][c+1]>0) && (rf[r][c+1]&4)) v&=11;
				}
				if ((v&8) && (r<14)) {
					if ((rf[r+1][c]>0) && (rf[r+1][c]&4) && (c>1) && (rf[r][c-1]>0) && (rf[r][c-1]&8) && (c<20) && (rf[r][c+1]>0) && (rf[r][c+1]&8)) v&=7;
				}
				if ((v&1) && (c<20)) {
					if ((rf[r][c+1]>0) && (rf[r][c+1]&2) && (r>1) && (rf[r-1][c]>0) && (rf[r-1][c]&1) && (r<14) && (rf[r+1][c]>0) && (rf[r+1][c]&1)) v&=14;
				}
				if ((v&2) && (c>1)) {
					if ((rf[r][c-1]>0) && (rf[r][c-1]&1) && (r>1) && (rf[r-1][c]>0) && (rf[r-1][c]&2) && (r<14) && (rf[r+1][c]>0) && (rf[r+1][c]&2)) v&=13;
				}
				setTile(r,c,'tile'+v);
			}
			var d=0;
			if ((v<0) && (r>1) && (r<14) && (c>1) && (c<20)) {
				if (rf[r+1][c]<0) d|=8;
				if (rf[r-1][c]<0) d|=4;
				if (rf[r][c+1]<0) d|=1;
				if (rf[r][c-1]<0) d|=2;
				if ((d==12) || (d==3)) d=0;
			}
			f2[r][c]=d;
		}
	}
	setTile(6,12,'tile17');
	setTile(7,12,'tile18');
	setTile(8,12,'tile19');
}

//-->


var defKey = new Array('i', 'j', 'l', 'k');

function showKeySet() {
	return	"\'"+defKey[0]+"\' ... up\n"+
			"\'"+defKey[3]+"\' ... down\n"+
			"\'"+defKey[1]+"\' ... left\n"+
			"\'"+defKey[2]+"\' ... right\n";
}

function setKeys(keyset) {
	var keyConflict=false;
	var keyUndef=false;
	for (var i=0; i<4; i++) {
		if (defKey[i]) {
			keyset[i]=keyset[i].charAt(0);
			keyset[i]=keyset[i].toLowerCase();
			if ((keyset[i]=="n") || (keyset[i]=="p")) keyConflict=true;
			if ((keyset[i]>="0") && (keyset[i]<="9")) keyConflict=true;
		}
		else {
			alert("A key was left undefined!\nNo changes were applied.\n");
			return;
		}
	}
	if (keyConflict) {
		alert("A conflict with reserved keys occurred!\nNo changes were applied.\n");
	}
	else {
		for (var i=0; i<4; i++) defKey[i]=keyset[i];
		alert("New key set applied:\n\n"+
			"\'"+defKey[0]+"\' ... up\n"+
			"\'"+defKey[3]+"\' ... down\n"+
			"\'"+defKey[1]+"\' ... left\n"+
			"\'"+defKey[2]+"\' ... right\n"+
			"-------\n\n");
	}
}

function configKeys() {
	var wargs='width=400,height=300,location=0,menubar=0,resizable=1,scrollbars=0,status=0,toolbar=0';
	if (self.screenX!=null) {
		var w=(self.outerWidth)? parseInt(self.outerWidth) : parseInt(self.width);
		wargs+= ',screenX='+(parseInt(self.screenX)+Math.floor((w-400)/2)) +',screenY='+(parseInt(self.screenY)+40);
	}
	else if ((document.body) && (document.body.clientTop) && (document.body.clientWidth)) {
		wargs+= ',left='+(parseInt(document.body.clientLeft)+Math.floor((parseInt(document.body.clientWidth)-400)/2)) +',top='+(parseint(document.body.clientTop)+40);
	}
	else if ((self.screen) && (self.screen.availWidth)) {
		wargs+= ',left='+Math.floor((parseInt(self.screen.availWidth)-400)/2)+',top='+Math.floor((parseInt(self.screen.availHeight)-400)/2);
	}
	var w=window.open('','jspac_keys',wargs);
	w.document.open();
	w.document.write('<HTML>\n<HEAD>\n<TITLE>JavaScript PacMan: Key Settings<\/TITLE>\n'+
		'<STYLE TYPE="text\/css">\n'+
		'td { font-family: arial,helvetica,sans-serif; font-size: 12px; }\n'+
		'form.input { font-family: arial,helvetica,sans-serif; font-size: 12px; }\n'+
		'.textbox { font-family: arial,helvetica,sans-serif; font-size: 12px; color: #000000; background: #ffffff; padding-left: 2px; }\n'+
		'+<\/STYLE>\n<\/HEAD>\n'+
		'<BODY BGCOLOR="#444444" TEXT="#ffffff">\n<CENTER>\n<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="3">\n'+
		'<FORM METHOD="get" ACTION="#" onsubmit="if ((self.opener) && (self.opener.closed==false)) { self.opener.setKeys([this.up.value, this.left.value, this.right.value, this.down.value]); }; window.setTimeout(\'self.close()\',1); return false;">\n'+
		'<TR><TD ALIGN="center" COLSPAN="3"><B>Optional Key Settings<\/B><\/TD><\/TR>\n'+
		'<TR><TD ALIGN="center" COLSPAN="3">Figures, &quot;n&quot;, &quot;p&quot; are reserved. Cursor keys<BR>and numeric keypad are always active.<BR>&nbsp;<\/TD><\/TR>\n'+
		'<TR><TD ALIGN="center" COLSPAN="3"><INPUT TYPE="text" NAME="up" SIZE="2" VALUE="'+defKey[0]+'" CLASS="textbox"><\/TD><\/TR>\n'+
		'<TR><TD ALIGN="center" COLSPAN="3"><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="3"><TR>\n'+
		'<TD ALIGN="right"><INPUT TYPE="text" NAME="left" SIZE="2" VALUE="'+defKey[1]+'" CLASS="textbox"><\/TD>\n'+
		'<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/TD>\n'+
		'<TD ALIGN="left"><INPUT TYPE="text" NAME="right" SIZE="2" VALUE="'+defKey[2]+'" CLASS="textbox"><\/TD>\n'+
		'<\/TR><\/TABLE><\/TD><\/TR>\n'+
		'<TR><TD ALIGN="center" COLSPAN="3"><INPUT TYPE="text" NAME="down" SIZE="2" VALUE="'+defKey[3]+'" CLASS="textbox"><\/TD><\/TR>\n'+
		'<TR><TD ALIGN="center" COLSPAN="3">&nbsp;<BR><INPUT TYPE="button" VALUE="cancle" onclick="self.close()"> &nbsp; <INPUT TYPE="submit" VALUE="set keys"><\/TD><\/TR>\n'+
		'<\/FORM>\n<\/TABLE>\n<\/BODY>\n<\/HTML>');
	w.document.close();
	if (w.opener==null) w.opener=self;
	if (window.focus) w.focus();
}

function doKeys(keyCode,mkey) {
	mkey=mkey.toLowerCase();
	if ((mkey=="8") || (mkey==defKey[0]) || (keyCode==30)) movedir=4
	else if ((mkey=="4") || (mkey==defKey[1]) || (keyCode==28)) movedir=2
	else if ((mkey=="6") || (mkey==defKey[2]) || (keyCode==29)) movedir=1
	else if ((mkey=="5") || (mkey==defKey[3]) || (keyCode==31)) movedir=8
	else if ((mkey=="2") || (keyCode==98)) movedir=8
	else if ((mkey=="p") || (keyCode==27)) {
		doPause();
	}
	else if (mkey=="n") {
		if (gameOn) {
			if (confirm("End the current game to start a new one?")) {
				if (pacTimer) clearTimeout(pacTimer);
				setTimeout('newGame()',1);
			}
		}
		else newGame();
	}
}

var IE4_keyref;

function IE4_makeKeyref() {
	IE4_keyref= new Array();
	var hex= new Array('A','B','C','D','E','F');
	for (var i=0; i<=15; i++) {
		var high=(i<10)? i:hex[i-10];
		for (var k=0; k<=15; k++) {
			var low=(k<10)? k:hex[k-10];
			var cc=i*16+k;
			if (cc>=32) IE4_keyref[cc]=unescape("%"+high+low);
		}
	}
}

function _ie4_strfrchr(cc) {
	return (cc!=null)? IE4_keyref[cc] : '';
}

function enableKeyboard() {

	if (!String.fromCharCode) {
		IE4_makeKeyref();
		String.fromCharCode=_ie4_strfrchr;
	}
	if (document.addEventListener) document.addEventListener("keypress", keyHandler, true)
	else {
		if ((self.Event) && (self.Event.KEYPRESS)) document.captureEvents(Event.KEYPRESS);
		
		document.onkeypress = keyHandler;
		//document.attachEvent("onkeypress", keyHandler, true);
	}

	 window.document.onkeydown=keyIEFix; 

}
/// PPLong coding 16.05.2008 - 
function disableKeyboard() {
	if(checkweb()) 
	 document.removeEventListener("keypress", keyHandler, true);
	else {
	  //window.document.releaseEvents(Event.KEYPRESS);
	  document.onkeypress = oldkeyHandler;
	  window.document.onkeydown = oldkeyIEFix; 
	  // document.detachEvent("onkeypress",  keyHandler);
	  // document.detachEvent("onkeydown",  keyIEFix);
	}
}
function checkweb(){
	var isNav = navigator.appName == "Netscape";
	return isNav;
}
/// Dispaly Your Statistic
function displaystatistic(){
	doPause();
	hideLayer('statistic');
}
function keyIEFix() {
	if (window.event) {
		if ((window.event.ctrlKey) || (window.event.metaKey) || (window.event.altKey)) return true;
		var ch=window.event.keyCode;
		if (ch==8) keyHandler({which:8})
		else if (ch==37) keyHandler({which:28})
		else if (ch==39) keyHandler({which:29})
		else if (ch==38) keyHandler({which:30})
		else if (ch==40) keyHandler({which:31})
		else if (ch==27) keyHandler({which:27})
		else if ((ch>=57373) && (ch<=57376)) {
			if (ch==57373) keyHandler({which:30})
			else if (ch==57374) keyHandler({which:31})
			else if (ch==57375) keyHandler({which:28})
			else if (ch==57376) keyHandler({which:29});
		}
		else {
			window.event.cancleBubble=false;
			return true;
		}
		if ((window.event) && (window.event.preventDefault)) window.event.preventDefault();
		if ((window.event) && (window.event.stopPropagation)) window.event.stopPropagation();
		window.event.cancleBubble=true;
		return false;
	}
	return true;
}

function keyHandler(e) {
	var ch;
	var ctrl=false;
	if (e) {
		ch=e.which;
		ctrl=((e.ctrlKey) || (e.metaKey) || (e.altKey) || (e.modifiers));
	}
	else if (window.event) {
		ch=window.event.keyCode;
		ctrl= ((window.event.ctrlKey) || (window.event.altKey) || (window.event.metaKey));
	}
	else return true;
	if (ctrl)  return true;
	if ((window.event) && (window.event.preventDefault)) window.event.preventDefault()
	else if ((e) && (e.preventDefault)) e.preventDefault();
	if ((window.event) && (window.event.stopPropagation)) window.event.stopPropagation()
	else if ((e) && (e.stopPropagation)) e.stopPropagation();
	if (ch=='') {
		// map specials
		if (e==null) e=window.event;
		if ((e.charCode==0) && (e.keyCode)) {
			if (e.keyCode==37) ch=28
			else if (e.keyCode==39) ch=29
			else if (e.keyCode==38) ch=30
			else if (e.keyCode==40) ch=31
			else if (e.keyCode==27) ch=27;
		}
	}
	var mkey= ((ch>=32) && (ch<127))? String.fromCharCode(ch):'';
	doKeys(ch,mkey);
	if (window.event) window.event.cancleBubble=true;
	return false;
}

