var gCSSOffset = -8;

var lastX=0;
var lastY=0;
var selPiece;
var selPiece2;
var offw;
var offh;
var mv1,mv2, numSelected;
var piece = [];
var peg = [];
var numpos=7;
var numpeg=5;
var numpieces=20;
var undo = false, started=false;
var nTries=0
var nWins=0;
var MAGENTA=0;
var BLUE=1;
var RED=2;
var GREEN=4;
var YELLOW=3;
var revert;
var highlighted;


function mysetup() {
	document.ondragstart=doDragStart;
	document.onmousedown= new Function('mousePressed(event)');
	//document.onmouseup = new Function('mouseReleased()');
	offw = document.getElementById("mainpic").width;
	offh = document.getElementById("mainpic").height;
	numSelected=0;
	setUpPegs();
	setUpPieces();
	document.getElementById('triesbox').innerText = "Tries: " + nTries 
	document.getElementById('winsbox').innerText = "Wins: " + nWins 
}

function doDragStart() {
        // Don't do default drag operation.
        if ("IMG"==event.srcElement.tagName)
          event.returnValue=false;
      }

function mousePressed(ev) {
	
	if(numSelected==0) {
	//ev.srcElement.isPiece
	//document.getElementById('test').innerText = "pressed";
	if(ev.srcElement.isPiece && ev.srcElement.pos>=peg[ev.srcElement.peg].pieceCount-2) {
		selPiece = ev.srcElement;
		numSelected++;
		highlightPiece(selPiece);
		mv1=selPiece.arrayNum;
		moveToTop(selPiece);
		if(selPiece.pos==peg[selPiece.peg].pieceCount-2) {
			numSelected++;
			mv2 = peg[selPiece.peg].pieceIndex[selPiece.pos+1];
			selPiece2 = piece[mv2];
			highlightPiece(selPiece2);
			moveToTop(selPiece2);
		}
	}
	//document.getElementById('test').innerText = "done pressed";
	lastX = ev.clientX;
	lastY = ev.clientY;
	//alert(lastX + " " + lastY)
	//document.onmousemove = new Function('movePiece(event)')
	//document.getElementById('test').innerText = lastX+ "  " + lastY;
	} else {
	    unHighlightPiece();
		movePiece(event);
		mouseReleased();
		numSelected=0;
	}
	
}

function highlightPiece(p) {
	revert[numSelected] = p.src
	p.src=highlighted[p.col].src
}

function unHighlightPiece() {
	if(numSelected>1) {
		selPiece2.src = revert[2];
	}
	if (numSelected>0) {
		selPiece.src = revert[1];
	}
	
}


function mouseReleased() {
	if(numSelected>0) {
	var near = findNearestPegPos();
	if (isMoveLegal(near)) {
		copyToOld();
		peg[near].pieceIndex[peg[near].pieceCount]=mv1;
		peg[piece[mv1].peg].pieceIndex[piece[mv1].pos]=-1;
		peg[piece[mv1].peg].calcPieceCount();
		piece[mv1].peg=near;
		piece[mv1].pos=peg[near].pieceCount;
		peg[near].pieceCount++;
		
		if(numSelected==2) {
			peg[near].pieceIndex[peg[near].pieceCount]=mv2;
			peg[piece[mv2].peg].pieceIndex[piece[mv2].pos]=-1;
			peg[piece[mv2].peg].calcPieceCount();
			piece[mv2].peg=near;
			piece[mv2].pos=peg[near].pieceCount;
			peg[near].pieceCount++;
		}
		if(!started) {
			started=true;
			nTries++;
		}
		undo = true;
		if (checkSolved()) {
			nWins++;
			undo=false;
			document.getElementById('winsbox').innerText = "Wins: " + nWins
		}
	}
	if (numSelected>0) {
		calcPosFromIndex(selPiece);
		if (numSelected==2) {
			calcPosFromIndex(selPiece2);
		}
	}
	}
	numSelected=0;
	document.onmousemove = null;
}

function findNearestPegPos() {
	var max = 99999;
	var ind=-1;
	for(var i=0;i<numpeg;i++) {
		if(Math.abs((selPiece.style.pixelLeft+selPiece.width/2)-(offw*0.165+i*offw*0.67/4.0))<max) {
			max = Math.abs((selPiece.style.pixelLeft+selPiece.width/2)-(offw*0.165+i*offw*0.67/4.0));
			ind = i;
		}
	}
	return ind;
}

function isMoveLegal(near) {
	if(peg[near].pieceCount>0){
		//alert(selPiece.col + " " + piece[peg[near].pieceIndex[peg[near].pieceCount-1]].col + " " + near)
		if(selPiece.col == piece[peg[near].pieceIndex[peg[near].pieceCount-1]].col && peg[near].pieceCount+numSelected<=numpos && selPiece.peg!=near) {
			return true;
		} else {
			return false;
		}
	} else {
		if(selPiece.col == peg[near].col) {
			return true;
		} else {
			return false;
		}
	}
}


function movePiece(event){
	if(numSelected>0) {
		var newX = selPiece.style.pixelLeft+(event.clientX-lastX);
		var newY = selPiece.style.pixelTop+(event.clientY-lastY);
		if(newX>0 && newX<540 && newY>0 && newY<440) {
			selPiece.style.pixelLeft=newX;
			selPiece.style.pixelTop=newY;
			if(numSelected==2) {
				selPiece2.style.pixelLeft+=(event.clientX-lastX);
				selPiece2.style.pixelTop+=(event.clientY-lastY);
			}
			lastY = event.clientY;
			lastX = event.clientX;
		}
		
	}
}



function checkSolved() {
	for(var i=0;i<numpeg;i++) {
		if (peg[i].pieceCount!=4) {
			return false;
		} else {
			for(j=0;j<4;j++) {
				if (peg[i].col!=piece[peg[i].pieceIndex[j]].col) return false;
			}
		}
		
	}
	return true;
}

function setUpPegs() {
	peg = new Array(numpeg);
	for (var i=0;i<numpeg;i++){
		peg[i]=new Peg();
		peg[i].makeIndexArray(numpos);
		if(i==0) {
			peg[i].col = GREEN;
		} else if(i==1) {
			peg[i].col = YELLOW;
		} else if(i==2) {
			peg[i].col = RED;
		} else if(i==3) {
			peg[i].col = BLUE;
		} else if(i==4) {
			peg[i].col = MAGENTA;
		}
	}
}

function setUpPieces() {
	piece = new Array(numpieces);
	var c1;
	for (var i=0;i<numpeg;i++) {
		for (var j=0;j<4;j++) {

			c1=i*4+j;
			piece[c1] = document.createElement('img')
			piece[c1].style.position='absolute';
			setIndex(piece[c1],i,j);
			piece[c1].isPiece=true;
			piece[c1].onclick = new Function('void(0)');
			piece[c1].arrayNum=c1;
			piece[c1].style.left=i*40;
			piece[c1].style.zIndex=c1+1;
			piece[c1].style.top=j*60
			peg[i].pieceIndex[j]=c1;
			if(c1%5==0) {
				piece[c1].col = MAGENTA;
				piece[c1].src = "images/magentapiece.png";
			} else if(c1%5==1) {
				piece[c1].col = BLUE;
				piece[c1].src = "images/bluepiece.png";
			} else if(c1%5==2) {
				piece[c1].col = RED;
				piece[c1].src = "images/redpiece.png";
			} else if(c1%5==3) {
				piece[c1].col = YELLOW;
				piece[c1].src = "images/yellowpiece.png";
			} else if(c1%5==4) {
				piece[c1].col = GREEN;
				piece[c1].src = "images/greenpiece.png";
			}
			document.getElementById('game').appendChild(piece[c1])
			calcPosFromIndex(piece[c1]);
		}
		
	}
	revert=new Array();
	highlighted= new Array();
	for (var i=0;i<numpeg;i++) {
		peg[i].calcPieceCount();
		highlighted[i] = new Image();
	}
	highlighted[0].src = "images/magentapiecesel.png";
	highlighted[1].src = "images/bluepiecesel.png";
	highlighted[2].src = "images/redpiecesel.png";
	highlighted[3].src = "images/yellowpiecesel.png";
	highlighted[4].src = "images/greenpiecesel.png";
}

function setIndex(p, i, j) {
	p.peg = i;
	p.pos = j;
	p.sel=false;
}

function calcPosFromIndex(p) {
	p.style.pixelLeft = gCSSOffset + offw*0.10+p.peg*offw*0.67/4.0;
	p.style.pixelTop = offh*0.776-p.pos*offh*0.10;
}

function moveToTop(p) {
	
	for (var i=0;i<numpieces;i++) {
		if(piece[i].style.zIndex>p.style.zIndex) {
			piece[i].style.zIndex--;
		}
	}
	
	p.style.zIndex=numpieces;
}


function Peg() {
    var col;
    var pieceIndex = [];
    var oldPieceIndex =[];
    var pieceCount;
	var oldPieceCount;
    this.calcPieceCount=calcPieceCount;
	this.makeIndexArray=makeIndexArray;
    
    function makeIndexArray(a) {
       this.pieceIndex = new Array(a);
       this.oldPieceIndex = new Array(a);
        for(var i = 0;i<a;i++) {
            pieceIndex[i]=-1;
        } 
    }
	
	function calcPieceCount() {
		this.pieceCount = 0;
        for(var j=0;j<this.pieceIndex.length;j++) {
            if (this.pieceIndex[j]>-1) this.pieceCount++;
        }
	}
    
}

function myUndo() {
	if(undo) {
		copyFromOld();
		undo =false;
	}
}

function copyToOld() {
	for(var i=0;i<numpieces;i++) {
		piece[i].oldpos = piece[i].pos;
		piece[i].oldpeg = piece[i].peg;
	}
	for(var i=0;i<numpeg;i++) {
		peg[i].oldPieceCount = peg[i].pieceCount;
		for(j=0;j<numpos;j++) {
			peg[i].oldPieceIndex[j]=peg[i].pieceIndex[j];
		}
	}
}

function copyFromOld() {
	for(var i=0;i<numpieces;i++) {
		piece[i].pos = piece[i].oldpos;
		piece[i].peg = piece[i].oldpeg;
		calcPosFromIndex(piece[i]);
	}
	for(var i=0;i<numpeg;i++) {
		peg[i].pieceCount = peg[i].oldPieceCount;
		for(var j=0;j<numpos;j++) {
			peg[i].pieceIndex[j]=peg[i].oldPieceIndex[j];
		}
	}
}

function reset() {
	var c1;
	for (var i=0;i<numpeg;i++) {
		peg[i].makeIndexArray(numpos);
	}
	for (var i=0;i<numpeg;i++) {
		for (var j=0;j<4;j++) {
			c1=i*4+j;
			setIndex(piece[c1],i,j);
			piece[c1].style.zIndex=c1+1;
			peg[i].pieceIndex[j]=c1;
			calcPosFromIndex(piece[c1]);
		}
	}
	for (var i=0;i<numpeg;i++) {
		peg[i].calcPieceCount();
	}
	started=false;
	document.getElementById('triesbox').innerText = "Tries: " + nTries 
	document.getElementById('winsbox').innerText = "Wins: " + nWins 
}
