var fromr = -1;
var fromc = -1;
var tor = -1;
var toc = -1;
var startX = 0;
var startY = 0;
var stopX = 0;
var stopY = 0;

function tdmousedown(r, c) {
	fromr = r;
	fromc = c;
	startX = tmpX;
	startY = tmpY;
}

function tdmouseup() {
	stopX = tmpX;
	stopY = tmpY;
	if (puzzle[fromr][fromc]>0) {
	if (Math.abs(stopX-startX)>Math.abs(stopY-startY)) {
		if (stopX>startX) {
			AddToLine(fromr, fromc, 1);
		} else {
			AddToLine(fromr, fromc, 2);
		}
	} else {
		if (stopY>startY) {
			AddToLine(fromr, fromc, 3);
		} else {
			AddToLine(fromr, fromc, 4);
		}
	}
	checkCellStatus(fromr, fromc);
	checkCellStatus(tor, toc);
}

}

var IE = document.all?true:false

if (!IE) document.captureEvents(Event.MOUSEMOVE)
document.onmousemove = getMouseXY;

var tmpX = 0
var tmpY = 0

function getMouseXY(e) {
  if (IE) { 
    tmpX = event.clientX + document.body.scrollLeft
    tmpY = event.clientY + document.body.scrollTop
  } else {  
    tmpX = e.pageX
    tmpY = e.pageY
  }  
  return true
}

function AddToLine(r, c, direction) {
	tor = -1;
	toc = -1;

	isfull = isFullCell(r, c);
	if (direction==3) {
		for(var r2=r+1;r2<sizer;r2++) {
			if (puzzle[r2][c]>0) {
				tor = r2;
				toc = c;
				isfull2 = isFullCell(r2, c);
				for(var r3=r+1;r3<r2;r3++) {
					AddToCell(r3, c, 2, isfull|isfull2);
				}
				return;
			} else if (puzzle[r2][c]<0 && puzzle[r2][c]>=-2) {
				return;
			}
		}
	} else if (direction==4) {
		for(r2=r-1;r2>=0;r2--) {
			if (puzzle[r2][c]>0) {
				tor = r2;
				toc = c;
				isfull2 = isFullCell(r2, c);
				for(r3=r2+1;r3<r;r3++) {
					AddToCell(r3, c, 2, isfull|isfull2);
				}
				return;
			} else if (puzzle[r2][c]<0 && puzzle[r2][c]>=-2) {
				return;
			}
		}
	} else if (direction==1) {
		for(c2=c+1;c2<sizec;c2++) {
			if (puzzle[r][c2]>0) {
				tor = r;
				toc = c2;
				isfull2 = isFullCell(r, c2);
				for(c3=c+1;c3<c2;c3++) {
					AddToCell(r, c3, 1, isfull|isfull2);
				}
				return;
			} else if (puzzle[r][c2]<-2) {
				return;
			}
		}
	} else if (direction==2) {
		for(c2=c-1;c2>=0;c2--) {
			if (puzzle[r][c2]>0) {
				tor = r;
				toc = c2;
				isfull2 = isFullCell(r, c2);
				for(c3=c2+1;c3<c;c3++) {
					AddToCell(r, c3, 1, isfull|isfull2);
				}
				return;
			} else if (puzzle[r][c2]<-2) {
				return;
			}
		}
	}
}

function AddToCell(r, c, direction, isfull) {
	if (isfull) {
		puzzle[r][c] = 0;
	} else {
		puzzle[r][c]--;
		if (direction==1 && puzzle[r][c]<-2) { puzzle[r][c] = 0; }
		if (direction==2 && puzzle[r][c]>-3) { puzzle[r][c] = -3; }
		if (puzzle[r][c]<-4) { puzzle[r][c] = 0; }
	}

	switch(puzzle[r][c]) {
		case 0:	res = "0"; break;
		case -1: res = "A"; break;
		case -2: res = "B"; break;
		case -3: res = "C"; break;
		case -4: res = "D"; break;
		default: res = "0";
	}
	td = getTDElement(r, c);
	field = getFieldElement(r, c);
	field.value = res;
	if (res=="0") {
		td.className = "white";
	} else {
		td.className = "type"+res;
	}
}

function checkCellStatus(r, c) {
	if (puzzle[r][c]<1) { return; }
	td = getTDElement(r, c);
	if (isFullCell(r, c)) {
		td.className = "ringfilled";
	} else {
		td.className = "ring";
	}
}

function isFullCell(r, c) {
	if (puzzle[r][c]<1) { return false; }
	var bridgecount = 0;
	if (r>0) {
		if (puzzle[r-1][c]<-2) {
			bridgecount += getBridgeCount(puzzle[r-1][c]);
		}
	}
	if (r<sizer-1) {
		if (puzzle[r+1][c]<-2) {
			bridgecount += getBridgeCount(puzzle[r+1][c]);
		}
	}
	if (c>0) {
		if (puzzle[r][c-1]<0 && puzzle[r][c-1]>=-2) {
			bridgecount += getBridgeCount(puzzle[r][c-1]);
		}
	}
	if (c<sizec-1) {
		if (puzzle[r][c+1]<0 && puzzle[r][c+1]>=-2) {
			bridgecount += getBridgeCount(puzzle[r][c+1]);
		}
	}
	if (bridgecount==puzzle[r][c]) {
		return true;
	} else {
			return false;
	}
}

function getBridgeCount(num) {
	switch(num) {
		case 0: return 0;
		case -1: return 1;
		case -2: return 2;
		case -3: return 1;
		case -4: return 2;
		default: return 0;
	}
}

function getTDElement(r, c) {
	fr = r.toString();
	fc = c.toString();
	sizelen = size.toString().length;
	while(fr.length<sizelen) { fr = "0"+fr; }
	while(fc.length<sizelen) { fc = "0"+fc; }
	return document.getElementById("td"+fr+fc);
}

function getFieldElement(r, c) {
	fr = r.toString();
	fc = c.toString();
	sizelen = size.toString().length;
	while(fr.length<sizelen) { fr = "0"+fr; }
	while(fc.length<sizelen) { fc = "0"+fc; }
	return document.getElementById("field"+fr+fc);
}

function doInit() {
	for(r=0;r<sizer;r++) {
		for(c=0;c<sizec;c++) {
			checkCellStatus(r, c);
		}
	}
}	