// JavaScript Slider by Robert Carl Brown                              (sdSlider.js)
//==================================================================================
//                     Copyright © 2001 by Snowdog Software, llc
//==================================================================================
//
//	Functions
//	---------
//		slider_BuildHTML()
//		slider_CellClick(iCol, iRow)			
//		slider_CellGet(iCol, iRow)							String
//		slider_CellIsEmpty(iCol, iRow)						boolean
//		slider_CellIsFull(iCol, iRow)						boolean
//		slider_CellSet(iCol, iRow, sCell)	
//		slider_CellSwap(iCol1, iRow1, iCol2, iRow2)
//		slider_CellTry(iCol, iRow)							boolean
//		slider_Image(sCell)									String
//		slider_IsComplete()									boolean
//		slider_RandCol()									int
//		slider_Randomize()
//		slider_RandRow()									int
//		slider_Refresh()
//		slider_Reset()
//
//	Functions
//	---------
//		RandInt(piMin, piMax)								int
//
//==================================================================================
//
//
//==================================================================================

	var slider_CellBad   = 'X';
	var slider_CellEmpty = '';

	var slider_Map       = new Array(slider_Cols * slider_Rows);
	var slider_Locked    = false;
	var slider_Moves     = 0;
	var slider_Turns     = 0;


	function slider_BuildHTML() {
		var iCol;
		var iRow;
		
		for (iRow=0; (iRow < slider_Rows); iRow++) {
			document.writeln("<TR>");
			
			for (iCol=0; (iCol < slider_Cols); iCol++) {
				document.write("<TD>");
				document.write("<A HREF=\"xxx\" ONCLICK=\"slider_CellClick(" + iCol + ", " + iRow + "); return false;\">");
				document.write("<IMG ID=\"imgCell" + iCol + iRow + "\" NAME=\"imgCell" + iCol + iRow + "\" BORDER=0 HEIGHT=" + slider_CellH + " WIDTH=" + slider_CellW + " SRC=\"" + slider_EmptyImg + "\">");
				document.write("</A>");
				document.writeln("</TD>");
			}

			document.writeln("</TR>");
		}
	}

	function slider_CellClick(piCol, piRow) {
	
		if (slider_Locked) {
		//	CONTINUE
		}
		else {
			slider_Locked = true;

			if (slider_CellTry(piCol, piRow)) {
				slider_Refresh();
			
				slider_Turns++;
			
				if (slider_IsComplete()) {
					slider_CellSet(0, 0, '00');
				
					alert("Puzzle Complete in " + slider_Turns + " Turns"); 
				
					slider_Refresh();
				}
			}
			
			slider_Locked = false;
		}
	}
	
	function slider_CellGet(piCol, piRow) {
		var sCell = slider_CellBad;
		
		if (piCol < 0) {
		//	CONTINUE
		}
		else if (piCol >= slider_Cols) {
		//	CONTINUE
		}
		else if (piRow < 0) {
		//	CONTINUE
		}
		else if (piRow >= slider_Rows) {
		//	CONTINUE
		}
		else {
			var iIndex = ((piRow * slider_Cols) + piCol);
			
			sCell = slider_Map[iIndex];
		}
	
		return sCell;
	}

	function slider_CellIsEmpty(piCol, piRow) {
		var bIsEmpty = false;
	
		if (slider_CellGet(piCol, piRow) == slider_CellEmpty) {
			bIsEmpty = true;
		}
		
		return bIsEmpty;
	}

	function slider_CellIsFull(piCol, piRow) {
		var sCell;
		var bIsFull = true;
	
		sCell = slider_CellGet(piCol, piRow);
	
		if (sCell == slider_CellBad) {
			bIsFull = false;
		}
		else if (sCell == slider_CellEmpty) {
			bIsFull = false;
		}
		
		return bIsFull;
	}

	function slider_CellSet(piCol, piRow, psCell) {

		if (piCol < 0) {
		//	CONTINUE
		}
		else if (piCol >= slider_Cols) {
		//	CONTINUE
		}
		else if (piRow < 0) {
		//	CONTINUE
		}
		else if (piRow >= slider_Rows) {
		//	CONTINUE
		}
		else {
			var iIndex = ((piRow * slider_Cols) + piCol);

			slider_Map[iIndex] = psCell;
		}
	}

	function slider_CellSwap(piCol1, piRow1, piCol2, piRow2) {
		var sCell = slider_CellGet(piCol1, piRow1);
		
		slider_Moves++;
		
		slider_CellSet(piCol1, piRow1, slider_CellGet(piCol2, piRow2));
		slider_CellSet(piCol2, piRow2, sCell);
	}
	
	function slider_CellTry(piCol, piRow) {
		var bClick = false;
	
		if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol, piRow-1)) {
			slider_CellSwap(piCol, piRow, piCol, piRow-1);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol, piRow+1)) {
			slider_CellSwap(piCol, piRow, piCol, piRow+1);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol, piRow-2)) {
			slider_CellSwap(piCol, piRow-1, piCol, piRow-2);
			slider_CellSwap(piCol, piRow,   piCol, piRow-1);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol, piRow+2)) {
			slider_CellSwap(piCol, piRow+1, piCol, piRow+2);
			slider_CellSwap(piCol, piRow,   piCol, piRow+1);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol, piRow-3)) {
			slider_CellSwap(piCol, piRow-2, piCol, piRow-3);
			slider_CellSwap(piCol, piRow-1, piCol, piRow-2);
			slider_CellSwap(piCol, piRow,   piCol, piRow-1);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol, piRow+3)) {
			slider_CellSwap(piCol, piRow+2, piCol, piRow+3);
			slider_CellSwap(piCol, piRow+1, piCol, piRow+2);
			slider_CellSwap(piCol, piRow,   piCol, piRow+1);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol-1, piRow)) {
			slider_CellSwap(piCol, piRow, piCol-1, piRow);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol+1, piRow)) {
			slider_CellSwap(piCol, piRow, piCol+1, piRow);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol-2, piRow)) {
			slider_CellSwap(piCol-1, piRow, piCol-2, piRow);
			slider_CellSwap(piCol,   piRow, piCol-1, piRow);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol+2, piRow)) {
			slider_CellSwap(piCol+1, piRow, piCol+2, piRow);
			slider_CellSwap(piCol,   piRow, piCol+1, piRow);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol-3, piRow)) {
			slider_CellSwap(piCol-2, piRow, piCol-3, piRow);
			slider_CellSwap(piCol-1, piRow, piCol-2, piRow);
			slider_CellSwap(piCol,   piRow, piCol-1, piRow);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol+3, piRow)) {
			slider_CellSwap(piCol+2, piRow, piCol+3, piRow);
			slider_CellSwap(piCol+1, piRow, piCol+2, piRow);
			slider_CellSwap(piCol,   piRow, piCol+1, piRow);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol-4, piRow)) {
			slider_CellSwap(piCol-3, piRow, piCol-4, piRow);
			slider_CellSwap(piCol-2, piRow, piCol-3, piRow);
			slider_CellSwap(piCol-1, piRow, piCol-2, piRow);
			slider_CellSwap(piCol,   piRow, piCol-1, piRow);
			bClick = true;
		}
		else if (slider_CellIsFull(piCol, piRow) && slider_CellIsEmpty(piCol+4, piRow)) {
			slider_CellSwap(piCol+3, piRow, piCol+4, piRow);
			slider_CellSwap(piCol+2, piRow, piCol+3, piRow);
			slider_CellSwap(piCol+1, piRow, piCol+2, piRow);
			slider_CellSwap(piCol,   piRow, piCol+1, piRow);
			bClick = true;
		}

		return bClick;
	}

	function slider_Image(psCell) {
		var sImg = null;
		
		if (psCell == slider_CellBad) {
		//	CONTINUE
		}
		else if (psCell == slider_CellEmpty) {
			sImg = slider_EmptyImg;
		}
		else {
		//	var iCol = psCell.substr(0,1);	//	JavaScript 1.2
		//	var iRow = psCell.substr(1,1);	//	JavaScript 1.2
			var iCol = psCell.charAt(0);	//	JavaScript 1.0
			var iRow = psCell.charAt(1);	//	JavaScript 1.0
			
			sImg = slider_ImageRC(iRow, iCol)
		}
		
		return sImg;
	}

	function slider_IsComplete() {
		var sCell;
		var iCol;
		var iCount      = 0;
		var bIsComplete = false;
		var iRow;
		
		for (iRow=0; (iRow < slider_Rows); iRow++) {
			for (iCol=0; (iCol < slider_Cols); iCol++) {
				sCell = '' + iCol + iRow;
				
				if (sCell == slider_CellGet(iCol, iRow)) {
					iCount++;
				}
			}
		}
		
		if (iCount == ((slider_Rows * slider_Cols) - 1)) {
			bIsComplete = true;
		}
		
		return bIsComplete;
	}

	function slider_RandCol() {
		return RandInt(0, slider_Cols-1);
	}

	function slider_Randomize() {
		var iCount    = 0;
		var iTotal    = (slider_Cols * slider_Rows * 5);
		var iTotalTry = (iTotal * 2);
		var iTry      = 0;
		
		slider_Reset();
		
		window.status = 'slider_Randomize(): ...';

		for (; ((iCount < iTotal) && (iTry < iTotalTry)); ) {
			if (slider_CellTry(slider_RandCol(), slider_RandRow())) {
				iCount++;
				window.status = 'slider_Randomize(): ' + iCount + '...';
			}
			else {
				iTry++;
			}
		}
		
		if (iTry == iTotalTry) {
			window.status = 'slider_Randomize(): ATTEMPTED (' + iCount + ')';
		}
		else {
			window.status = 'slider_Randomize(): COMPLETE';
		}
		
		slider_Moves = 0;
		slider_Turns = 0;
		
		slider_Refresh();
	}

	function slider_RandRow() {
		return RandInt(0, slider_Rows-1);
	}

	function slider_Refresh() {
		var sImage;
		var iCol;
		var iRow;
		
		for (iRow=0; (iRow < slider_Rows); iRow++) {
			for (iCol=0; (iCol < slider_Cols); iCol++) {
				sImage = "imgCell" + iCol + iRow;
				
				document.images[sImage].src = slider_Image(slider_CellGet(iCol, iRow));
			}
		}
	}

	function slider_Reset() {
		var sCell;
		var iCol;
		var iRow;
		
		for (iRow=0; (iRow < slider_Rows); iRow++) {
			for (iCol=0; (iCol < slider_Cols); iCol++) {
				sCell = '' + iCol + iRow;
				
				slider_CellSet(iCol, iRow, sCell);
			}
		}

		slider_CellSet(0, 0, slider_CellEmpty);
	}

	function RandInt(piMin, piMax) {
		var iRand = (parseInt(Math.random() * (piMax - piMin + 1)) + piMin);
		
		if (iRand < piMin) piRand = piMin;
		if (iRand > piMax) piRand = piMax;
		
		return iRand;
	}
