function Vigenere (input, key, forward)
{
	if (key == null)
		key = "";
	var alphabet =   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
					+ "abcdefghijklmnopqrstuvwxyz";

	// Validate key:
	key = key . toUpperCase ();
	var key_len = key . length;
	var i;
	var adjusted_key = "";
	for (i = 0; i < key_len; i ++)
	{
		var key_char = alphabet . indexOf (key . charAt (i));
		if (key_char < 0)
			continue;
		adjusted_key += alphabet . charAt (key_char);
	}
	key = adjusted_key;
	key_len = key . length;
	if (key_len == 0)
	{
		alert ('You forgot to supply a key!');
		key = "a";
		key_len = 1;
	}

	// Transform input:
	var input_len = input . length;
	var output = "";
	var key_index = 0;
	var in_tag = false;
	for (i = 0; i < input_len; i ++)
	{
		var input_char = input . charAt (i);
		if (input_char == "<")
			in_tag = true;
		else if (input_char == ">")
			in_tag = false;
		if (in_tag)
		{
			output += input_char;
			continue;
		}
		var input_char_value = alphabet . indexOf (input_char);
		if (input_char_value < 0)
		{

//If not alphabet
	key_index = (key_index + 1) % key_len;
			output += input_char;

			continue;
		}
		var lowercase = input_char_value >= 26 ? true : false;
		if (forward)
			input_char_value += alphabet . indexOf (key . charAt (key_index));
		else
			input_char_value -= alphabet . indexOf (key . charAt (key_index));
		input_char_value += 26;
		if (lowercase)
			input_char_value = input_char_value % 26 + 26;
		else
			input_char_value %= 26;
		output += alphabet . charAt (input_char_value);
		key_index = (key_index + 1) % key_len;

	}
	return output;
}


function taLimit(ident,maxLength)
{
	if (!document.all)
	{
		return;
	} // allow backspace key in FireFox
  
	taObj=document.getElementById(ident);
	
	if (taObj.value.length==maxLength) 
	{
	  return false;
	}
}

function taCount(ident,displayId,passId,maxLength,type)
{
	taObj=document.getElementById(ident);
	
	if ( displayId != 0 ) 
	{
		dispObj=document.getElementById(displayId);
	}

	passObj=document.getElementById(passId);
	
	if (taObj.value.length>maxLength)
	{
		taObj.value=taObj.value.substring(0,maxLength);
	}
  
	if ( type == 1 ) 
	{
		var ok = '0123456789';
		var tmp = taObj.value.charAt(taObj.value.length-1);

		if ( ok.indexOf(tmp) < 0 ) 
		{
			alert('Only enter digits, ie. 0-9');
			taObj.value=taObj.value.substring(0,taObj.value.length-1);
			taObj.focus();
			return false;
		}
	}

	var tmp = Vigenere( taObj.value, 'tools', 1 );
	tmp = Encrypt( tmp );
	passObj.value = removeSpecialChars( taObj.value ); 
	
	if ( displayId != 0 ) 
	{
		dispObj.innerHTML=tmp;
	}
}		


var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function removeSpecialChars(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}

function Encrypt(theText) {
output = new String;
Temp = new Array();
Temp2 = new Array();
TextSize = theText.length;
for (i = 0; i < TextSize; i++) {
rnd = Math.round(Math.random() * 122) + 68;
Temp[i] = theText.charCodeAt(i) + rnd;	 // return unicode 
Temp2[i] = rnd;
}
for (i = 0; i < TextSize; i++) {
output += String.fromCharCode(Temp[i], Temp2[i]);
}
return output;
}


