function Vigenere(input, clef, output, crypter)
{
	var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_@.";
	input.value = input.value.toUpperCase();

	// Vérification de la clef:
	if (clef.value == null)
		clef.value = "";
	clef.value = clef.value.toUpperCase();
	var clef_long = clef.value.length;
	var clef_correcte = "";
	for (var i = 0; i < clef_long; i ++)
	{
		var clef_char = alphabet.indexOf (clef.value.charAt (i));
		if (clef_char>-1) {clef_correcte += alphabet.charAt (clef_char)};
	}
	clef.value = clef_correcte;
	clef_long = clef.value.length;
	if (clef_long == 0)
	{
		alert ('Entrez votre clef!');
		clef.value = "a";
		clef_long = 1;
	}

	// (Dé)cryptage:
	output.value = "";
	var clef_index = 0;
	var n=0;
	for (i=0; i< input.value.length; i ++)
	{
	   var input_char = input.value.charAt (i);
	   var input_char_value = alphabet.indexOf(input_char);
	   if (input_char_value>-1)  // ne (dé)chiffre que les 26 lettres majuscules
		{
		if (crypter)
			input_char_value += alphabet.indexOf(clef.value.charAt(clef_index));
		else
			input_char_value -= alphabet.indexOf(clef.value.charAt(clef_index));
		input_char_value += 26;
			input_char_value %= 26;
 	  	if ((n%5==0) && (n>0) && (crypter)) {output.value+=" "};
	 	n++;
		output.value += alphabet.charAt(input_char_value);
		clef_index = (clef_index+1) % clef_long;
		}
	}
}

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)
    {
      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 str_rot(chaine) {
   var known_letters = new Array("a","b","c","d","e","f","g","h","i","j","k","l","m","n",
		      "o","p","q","r","s","t","u","v","w","x","y","z","A","B","C",
		      "D","E","F","G","H","I","J","K","L","M","N","O","P","Q",
		      "R","S","T","U","V","W","X","Y","Z","0","1","2","3","4",
		      "5","6","7","8","9","@",".","-");

   var count_known_letters = known_letters.length;
   var key = (chaine.length)%count_known_letters;
   var out = "";
 
   for ( var i=0; i<chaine.length; i++ ) {
      current = chaine.charAt(i);
      if ( isInArray(known_letters,current) ) {
	for ( var j=0; j<count_known_letters; j++ ) {
            if ( known_letters[j] == current ) {
               break;
            }
         }
	 currentIndiceLetter = j;
         newIndiceLetter = (currentIndiceLetter+key)%count_known_letters;
         if ( newIndiceLetter < 0 ) {
            newIndiceLetter += count_known_letters;
         }
         out += known_letters[newIndiceLetter];
      } 
      else {
         out += current;
      }
   }
   return(out);
}





function isInArray(arrayHaystack, needle)
{
	for (x=0; x < arrayHaystack.length; x++)
		if (arrayHaystack[x] == needle) return true;
	return false;
}

function str_unrot(debut, chaine, fin) {
   var known_letters = new Array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q",
		"r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I",
		"J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
		"0","1","2","3","4","5","6","7","8","9","@",".","-");
   var count_known_letters = known_letters.length;
   var key = (chaine.length)%count_known_letters;
   var out = "";
   for ( var i=0; i<chaine.length; i++ ) {
      current = chaine.charAt(i);
      if ( isInArray(known_letters, current) ) {
         for ( var j=0; j<count_known_letters; j++ ) {
            if ( known_letters[j] == current ) {
               break;
            }
         }
         currentIndiceLetter = j;
         newIndiceLetter = (currentIndiceLetter-key)%count_known_letters;
         if ( newIndiceLetter < 0 ) {
            newIndiceLetter += count_known_letters;
         }
         out += known_letters[newIndiceLetter];
      } else {
         out += current;
      }
   }
   document.write(debut+out+fin);
}


var Crypte = function Crypte(chaine)
{
	var clef=RandString(10);
	var bf = new Blowfish(clef);
	var ciphertext = bf.encrypt(chaine);
	return (clef + ciphertext);
}

var UnCrypte = function UnCrypte(chaine)
{
	var clef=chaine.substr(0,10);
	var ciphertext=chaine.substr(10,chaine.length);
	var bf = new Blowfish(clef);
	var plaintext = bf.decrypt(ciphertext);
	return (plaintext);	

}

var RandString = function RandString(nbcar)
{
	var ListeCar = new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
				"X","Y","Z","0","1","2","3","4","5","6","7","8","9");
	var Chaine ='';
	for(i = 0; i < nbcar; i++)
	{
		Chaine = Chaine + ListeCar[Math.floor(Math.random()*ListeCar.length)];
	}
	return Chaine;
}

var MailtoCrypt3 = function MaitoCrypt3(dest,name)
{
	var chaine = new String("ShowInfo(this,\"");
	chaine += Crypte("mailto:"+dest+"$"+name);
	chaine += "\")";
	return chaine;
}

function ShowDecrypt(strdest)
{
	var chaine=UnCrypte(strdest);
	var pos = chaine.indexOf("$",0);
	var dest = chaine.substr(0,pos);
	var name = chaine.substring(pos+1,chaine.length-1);
	document.write("<a href=\"");
	document.write(dest);
	document.write("\">");
	document.write(name);
	document.write("</a>");
}

function ShowInfo(obj,strdest)
{
   var chaine=UnCrypte(strdest);
   var pos = chaine.indexOf("$",0);
   var dest = chaine.substr(0,pos);
   var name = chaine.substring(pos+1,chaine.length);
   var span=obj.parentNode;
   if (span.childNodes.length==2) return;
   var link = document.createElement('a');
   link.innerHTML=name;
   link.setAttribute("href",dest);
   span.appendChild(link);
}

function SendNow(strdest)
{
    location.href=UnCrypte(strdest);
}
