/**
 * MosaicBuilder.js
 * You can find more about this function at
 * http://nagoon97.com/ajax-mosaic-builder/
 *
 * Copyright (c) 2008 Andy G.P. Na <nagoon97@naver.com>
 * The source code is freely distributable under the terms of an MIT-style license.
 */
function MosaicBuilder(fileNamePrefix, numFiles){
	var sFileNamePrefix = fileNamePrefix;
	var iNumFiles = numFiles;

	var oCanvas = document.body;
	var iSmallPicSize = 15;

	var aBmpInfo = [];

	function loadAllImgs(){
		for(var fileNum=0; fileNum<iNumFiles; fileNum++){
			document.title = "Loading "+(fileNum+1)+"/"+iNumFiles+" images...";

			aBmpInfo[fileNum] = {};
			aBmpInfo[fileNum].filename = sFileNamePrefix+" ("+fileNum+").bmp"

			var bmpFile = new BinFileReader(aBmpInfo[fileNum].filename);

			bmpFile.movePointerTo(18);
			var width = bmpFile.readNumber(4);
			var height = bmpFile.readNumber(4);

			bmpFile.movePointerTo(54);

			var dimen = width*height;
			var gLevel=0
			for(var i=0; i<dimen; i++){
				gLevel += bmpFile.readNumber();
				bmpFile.movePointer(2);
			}

			gLevel /= dimen;
			aBmpInfo[fileNum].gLevel = gLevel;
		}
	}

	function findClosest(gLevel){
		var result = 0;
		var bestDist = 255;
		var tmpDist;

		for(var fileNum=0; fileNum<iNumFiles; fileNum++){
			tmpDist = Math.abs(aBmpInfo[fileNum].gLevel - gLevel);
			if(tmpDist < bestDist){
				bestDist = tmpDist;
				result = fileNum;
			}
		}

		return result;
	}

	this.buildMosaic = function buildMosaic(targetImg){
		document.title = targetImg;
		oCanvas.innerHTML = "";
		var bmpFile = new BinFileReader(targetImg);

		bmpFile.movePointerTo(18);
		var width = bmpFile.readNumber(4);
		var height = bmpFile.readNumber(4);
		var padding = width%4;

		var dimen = width*height;
		var gLevel=0
		var tmpImg, prevNode = null;

		bmpFile.movePointerTo(54);

		for(var i=0; i<dimen; i++){
			var tmpImgIdx = findClosest(bmpFile.readNumber());
			var tmpImg = document.createElement("IMG");
			tmpImg.src = sFileNamePrefix+" ("+tmpImgIdx+").bmp";
			tmpImg.style.width = iSmallPicSize+"px";
			tmpImg.style.height = iSmallPicSize+"px";
			tmpImg.className = tmpImgIdx;
			tmpImg.onclick = function(){buildMosaic(sFileNamePrefix+" ("+this.className+").bmp");};
			try{tmpImg.style.cursor = "pointer";}catch(e){tmpImg.style.cursor = "hand";}

			if(prevNode && prevNode.tagName.toUpperCase() == "IMG")
				oCanvas.insertBefore(tmpImg, prevNode.nextSibling);
			else
				oCanvas.insertBefore(tmpImg, prevNode);

			prevNode = tmpImg;

			if((i+1)%width==0 && i != dimen-1){
				var oBr = document.createElement("BR")
				oCanvas.insertBefore(oBr, oCanvas.firstChild);
				prevNode = oBr;
				bmpFile.movePointer(padding);
			}

			bmpFile.movePointer(2);
		}
	}

	loadAllImgs();
}