
/**
* Performs an encryption upon a string.
*
* @author James Burt (JamesBurt@JamesBurt.com)
* @version $Revision: 1.1 $ $Date: 2003/03/04 00:39:30 $
*/

	var alphaString1	= "zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba_./:-9876543210 ZYXWVUTSRQPONMLKJIHGFEDCBA";
	var alphaString2	= stringReverse(alphaString1);
	var keyDigit					= 0;
	var keyModulus		= 1070; // larger values yield longer key, but increase possibility of obvious repeats



	/**
	* Performs the decryption.
	* 	Accept an input string to be decoded.
	* 	Accept another string which generates
	* 	an intermediate decoding key.  This key
	* 	is generated by a cumulative base-10 modulus.
	*		The input string is then decoded with
	*		this key, on a rotating character substitution
	*		scheme.
	*
	* @param keyString the keystring
	* @param rawString the string to be decoded
	*
	* @since 1.0
	*/
	function doDecryption(keyString, rawString)
		{
		var key						= keyBuild(keyString,10,alphaString1);
		var keyString2	= ""+key;
		var encString		= stringCrypt(rawString,alphaString2,keyString2);
		return encString;
		}
	//endMethod



	/**
	* Performs the encryption.
	* 	Accept an input string to be encoded.
	* 	Accept another string which generates
	* 	an intermediate decoding key.  This key
	* 	is generated by a cumulative base-10 modulus.
	*		The input string is then decoded with
	*		this key, on a rotating character substitution
	*		scheme.
	*
	* @param keyString the keystring
	* @param rawString the string to be encoded
	*
	* @since 1.0
	*/
	function doEncryption(keyString,rawString)
		{
		var key						= keyBuild(keyString,10,alphaString1);
		var keyString2	= ""+key;
		var encString		= stringCrypt(rawString,alphaString1,keyString2);
		var encString;
		return encString;
		}
	//endMethod



	/**
	* Performs a test of the bean
	*
	*
	* @since 1.0
	*/
	function doTest ()
		{
		//var testString		= "hello, this is a test message.";
		var testString				= "aklmwowzerlkwp";
		var testPassword	= "password";
		var result1					= doEncryption(testPassword,testString);
		var result2					= doDecryption(testPassword,result1);
		var alertString			=("-----Starting Test-----\n");

		alertString=alertString+("Original = "+testString+"\n");
		alertString=alertString+("Encrypted= "+result1+"\n");
		alertString=alertString+("Decrypted= "+result2+"\n");
		alert(alertString);
		document.getElementById("writeBox").innerText=alertString;
		}
	//endMethod



	function keyBuild(inputString, base, transformString)
		{
		/////////////////////////////////////////////////////////////////////////
		//   keyBuild(String inputString,int base,String transformString)
		//   Author:  James Burt
		//   Created: 2002.07.02
		//   Purpose:
		//        Used to generate the intermediate key value (integer).
		//
		/////////////////////////////////////////////////////////////////////////

		var letter		= "";
		var index	= 0;
		var hash		= 0;


		for (var i=0;i<inputString.length;i++)
			{
			letter	= inputString.substring(i,i+1);
			index	= transformString.indexOf(letter,0)+1;
			hash		= (hash*base+index)%keyModulus;
			}
		//endFor

		return hash;
		}
	//endMethod



	function stringCrypt( inputString, transformString, keyString)
		{
		/////////////////////////////////////////////////////////////////////////
		//   stringCrypt()
		//   Author:  James Burt
		//   Created: 2002.07.02
		//   Purpose:
		//        Used to employ a rolling substitution encryption/decryption.
		//
		/////////////////////////////////////////////////////////////////////////

		var tempString		= "";
		var result					= "";
		var keyDigit				= 0;
		var tempInt				= 0;
		var tempChar;
		var transformIndex;

		for (var i=0;i<inputString.length;i++)
			{
			// grab a letter from the inputString, get its index number
			//////////////////////////////////////////////////////////////
			tempChar					= inputString.charAt(i);
			tempString				= ""+tempChar;
			transformIndex	= transformString.indexOf(tempString);

			if (transformIndex>=0)
				{
				// subtract value of one digit from the key to get new index
				////////////////////////////////////////////////////////////////////////
				tempChar					= keyString.charAt(keyDigit);
				tempString				= ""+tempChar;
				tempInt						= parseInt(tempString);
				transformIndex		= transformIndex-tempInt;

				// increment which digit of key we use
				////////////////////////////////////////////////////////////
				if (keyDigit==keyString.length-1)
					keyDigit=0;
				else
					keyDigit++;
				//endIf-Else

				// check to see we went below the zero-th character of transformString,
				// if so restart at end of transformString
				////////////////////////////////////////////////////////////////////////
				if (transformIndex<0)
					transformIndex+=transformString.length;
				//endIf

				// add this en/decrypted letter to the result
				/////////////////////////////////////////////////
				result+=(""+transformString.charAt(transformIndex));
				}
			else
				{
				result+=tempString;
				}
			//endIf-Else
			}
		//endFor
		return result;
		}
	//endMethod



	function stringReverse( inputString)
		{
		/////////////////////////////////////////////////////////////////////////
		//   stringReverse()
		//   Author:  James Burt
		//   Created: 2002.07.02
		//   Purpose:
		//        Used to reverse a string
		//
		/////////////////////////////////////////////////////////////////////////

		var result= inputString.split("").reverse().join("");
		return result;
		}
	//endMethod


