//Copyright (c) 2007 paulgrant.ca
//http://www.paulgrant.ca

var gbStop			= true;
var gbPause			= false;
var gaChars			= new Array();
var giTimeOut		= null;
var giLitter		= 50;
var giSpeed			= 250;
var giMutationCount	= 5;
var giGenerations	= 0;

for(var i = 65; i <= 90; i++)
	gaChars[ i-65 ] = String.fromCharCode(i);

gaChars[ gaChars.length ] = " "; //Space Char

//Function

function CreateRandomString(iLength)
{
	var sString = "";

	for(var i = 0; i < iLength; i++)
	{
		sString += Random_Character();
	}

	return sString;
}

function Random_Character()
{
	var i = Math.floor(Math.random() * gaChars.length);

	var sChar = gaChars[ i ];

	return sChar;
}

function Add_Random_Characters(sText, sWords)
{
	var sChar	= "";
	var iPos	= 0;
	var sString = sText;

	for(var i = 0; i < giMutationCount; i++)
	{
		sText = sString;

		iPos = Math.floor(Math.random() * sText.length);

		if(sWords.charAt(iPos) == sText.charAt(iPos))
			continue;

		sChar	= Random_Character();

		sString	= sText.substr(0, iPos) + sChar + sText.substr(iPos+1);
	}

	return sString;
}

function Count_Matching_Chars(sStart, sText)
{
	var sS		= "";
	var sT		= "";
	var iCount	= 0;

	for(var i = 0; i < sText.length; i++)
	{
		sS	= sStart.charAt(i);
		sT	= sText.charAt(i);

		if(sS == sT)
			iCount++;
	}

	return iCount
}

function CreateOffspring(sParent)
{
	var iMax			= 0;
	var iCount			= 0;
	var aOffspring		= new Array();
	var sBestOffspring	= "";

	var oForm = document.frmForm;
	if(!oForm)
		return false;

	var oWords		= oForm.txtWords;
	var oOffspring	= oForm.txtOffspring;

	oOffspring.value = "";

	for(var i = 0; i < giLitter; i++)
	{
		aOffspring[ i ] = Add_Random_Characters(sParent, oForm.txtWords.value);

		iCount = Count_Matching_Chars(oWords.value, aOffspring[ i ]);

		oOffspring.value += ((i < 9) ? "0" : "") + (i+1) + ") [" + iCount + "] " + aOffspring[ i ] + "\n";

		if(iCount > iMax)
		{
			sBestOffspring = aOffspring[ i ];
			iMax = iCount;
		}
	}

	return sBestOffspring;
}

function DoEvolve()
{
	if(gbStop == true)
		return false;

	if(gbPause == true)
	{
		window.clearTimeout(giTimeOut);
		giTimeOut = window.setTimeout("DoEvolve()", giSpeed*2);
		return true;
	}

	var oForm = document.frmForm;
	if(!oForm)
		return false;

	var oWords			= oForm.txtWords;
	var oHoyle			= oForm.txtHoyle;
	var oDarwin			= oForm.txtDarwin;
	var oGenerations	= oForm.txtGenerations

	oHoyle.value		= CreateRandomString(oHoyle.value.length);

	oDarwin.value		= CreateOffspring(oDarwin.value)

	giGenerations++;
	oGenerations.value	= giGenerations;

	if((oHoyle.value != oWords.value)
	&& (oDarwin.value != oWords.value))
	{
		window.clearTimeout(giTimeOut);
		giTimeOut = window.setTimeout("DoEvolve()", giSpeed);
	}
	else
	{
		gbStop = true;
		alert("done");
	}

	return true;
}

function DoStart()
{
	window.clearTimeout(giTimeOut);

	gbStop	= false;
	gbPause	= false;

	var oForm = document.frmForm;
	if(!oForm)
		return false;

	var oWords			= oForm.txtWords;
	var oHoyle			= oForm.txtHoyle;
	var oDarwin			= oForm.txtDarwin;
	var oGenerations	= oForm.txtGenerations;
	var oLitter			= oForm.txtLitter;
	var oMutation		= oForm.txtMutation;
	var oPause			= oForm.butPause;

	oPause.value		= "Pause";

	oWords.value		= oWords.value.toUpperCase();

	var re = /[^A-Z ]/g;
	oWords.value = oWords.value.replace(re, "");

	oHoyle.value		= CreateRandomString(oWords.value.length);
	oDarwin.value		= oHoyle.value;

	giLitter		= parseInt(oLitter.value);
	if(giLitter > 100)
		giLitter = 100;
	else if(giLitter < 1)
		giLitter = 1;

	oLitter.value = giLitter;

	giMutationCount	= parseInt(oMutation.value);
	if(giMutationCount > oWords.value.length)
		giMutationCount = oWords.value.length;
	else if(giMutationCount < 1)
		giMutationCount = 1;

	oMutation.value = giMutationCount;

	giGenerations		= 0;
	oGenerations.value	= giGenerations;

	DoEvolve();

	return true;
}

function DoStop()
{
	gbPause = false;
	gbStop	= true;

	var oForm = document.frmForm;
	if(!oForm)
		return false;

	var oPause = oForm.butPause;
	if(!oPause)
		return false;

	oPause.value = "Pause";

	return true;
}

function DoPause()
{
	if(gbStop == true)
		return false;

	var oForm = document.frmForm;
	if(!oForm)
		return false;

	var oPause = oForm.butPause;
	if(!oPause)
		return false;

	if(gbPause == true)
	{
		gbPause = false;
		oPause.value = "Pause";
	}
	else
	{
		gbPause = true;
		oPause.value = "Resume";
	}

	return true;
}

function DoClear()
{
	if(gbStop == false)
		return false;

	var oForm = document.frmForm;
	if(!oForm)
		return false;

	var oHoyle			= oForm.txtHoyle;
	var oDarwin			= oForm.txtDarwin;
	var oGenerations	= oForm.txtGenerations;
	var oOffspring		= oForm.txtOffspring;

	oHoyle.value		= "";
	oDarwin.value		= "";
	oGenerations.value	= "";
	oOffspring.value	= "";

	return true;
}

//End.
