var myDate = new Date();

/* AJAX Content LOADER */
function LoadContent(LAYER, REQ_URI, PARAM) {
	$('site').scrollTo();
	var actDate = myDate.getTime();
	new Ajax.Updater(LAYER, REQ_URI+"?"+actDate, { 
		parameters: PARAM,
		method: 'post',
		asynchronous:true,
		evalScripts:true
	})
}

/* Globaler AJAX Listener für z.B. Preloader */
Ajax.Responders.register({
 	onCreate: function(){
    	$('Loader').style.display='block';
  	}, 
  	onComplete: function(){
  		$('Loader').style.display='none';
  	}
});
	
/* Funktion um E-Mailadressen auf Ihre Syntax zu prüfen */
function CheckEmail(s) {
	var a = false;
	var res = false;
	if(typeof(RegExp) == 'function') {
			var b = new RegExp('abc');
			if(b.test('abc') == true){a = true;}
		}
	if(a == true) {
		reg = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)'+
                 '(\\@)([a-zA-Z0-9\\-\\.]+)'+
                 '(\\.)([a-zA-Z]{2,4})$');
		res = (reg.test(s));
	} else {
		res = (s.search('@') >= 1 &&
       s.lastIndexOf('.') > s.search('@') &&
       s.lastIndexOf('.') >= s.length-5)
	}
	return(res);
}

/* Kontakt Formular */
function ContactSubmit(){
	var AuswerteDatei = "inc/auswerte.php";
	var FormularName  = "Bewerbungsformular";
	var RequiredForm  = new Array("Lastname", "Firstname", "EMail");
	var RequiredMail  = new Array("EMail");
	var error		  = "";
	
	/* Überprüfen der Daten */
	for (i=0;i<RequiredForm.length;i++){
		if( !$F(RequiredForm[i]) ){
			error += RequiredForm[i] + "<br />";
		}
	}
	if( $('agbbox').checked!=true){
		error += "<br>as well as our privacy policy at the bottom of the page<br>";
	}
	/* Daten unvollständig, Fehler Layer einblenden */
	if ( error!="" ){
		$('Fehler').setStyle({display: 'block'});
		$('FehlerText').innerHTML="<strong>Please complete the following fields:</strong><br />" + error +"<br />Thank You!";
	} else {
		/* Email Adressen validieren */
		for (i=0;i<RequiredMail.length;i++){
			if( CheckEmail($F(RequiredMail[i]))==false ){
				error += RequiredMail[i] + "<br />";
			}
		}
		/* E-Mailadresse(n) nicht korrekt */
		if ( error!="" ){
			$('Fehler').setStyle({display: 'block'});
			$('FehlerText').innerHTML="<strong>Please complete the following field:</strong><br />" + error +"<br /><br />Thank You!";
		} else {
			/* Daten in Ordnung, AJAX Request mit Übermittlung aller Formulardaten! */
			new Ajax.Request(AuswerteDatei, { 
				method: 'post',
				parameters: $(FormularName).serialize(true),
				onComplete: function(transport) {
					if (transport.responseText=="true"){
						$('Danke').setStyle({display: 'block'});
						$('DankeText').innerHTML="<strong>Your query was submitted:</strong><br />Thank You!";
						$('BTN_SEND').setStyle({display: 'none'});
					} else {
						$('Fehler').setStyle({display: 'block'});
						$('FehlerText').innerHTML="<strong>Es ist zu einem Fehler beim Datenaustausch gekommen:</strong><br />" + transport.responseText;
					}
				}
			});
		}
	}
}
/* Bewerbungsformular Auswerten */
function MyFormSubmit(){
	var AuswerteDatei = "inc/auswerte.php";
	var FormularName  = "Bewerbungsformular";
	var RequiredForm  = new Array("Name", "Vorname", "Geburtsdatum", "Geburtsort", "Staatsangehoerigkeit", "Strasse", "Wohnort", "PLZ", "EMail", "Anschreiben", "Ausbildung");
	var RequiredMail  = new Array("EMail");
	var error		  = "";
	
	/* Überprüfen der Daten */
	for (i=0;i<RequiredForm.length;i++){
		if( !$F(RequiredForm[i]) ){
			error += RequiredForm[i] + "<br />";
		}
	}
	/* Daten unvollständig, Fehler Layer einblenden */
	if ( error!="" ){
		$('Fehler').setStyle({display: 'block'});
		$('FehlerText').innerHTML="<strong>Please complete the following fields:</strong><br />" + error +"<br />thank You!";
	} else {
		/* Email Adressen validieren */
		for (i=0;i<RequiredMail.length;i++){
			if( CheckEmail($F(RequiredMail[i]))==false ){
				error += RequiredMail[i] + "<br />";
			}
		}
		/* E-Mailadresse(n) nicht korrekt */
		if ( error!="" ){
			$('Fehler').setStyle({display: 'block'});
			$('FehlerText').innerHTML="<strong>Please complete the following fields:</strong><br />" + error +"<br /><br />Thank You!";
		} else {
			/* Daten in Ordnung, AJAX Request mit Übermittlung aller Formulardaten! */
			new Ajax.Request(AuswerteDatei, { 
				method: 'post',
				parameters: $(FormularName).serialize(true),
				onComplete: function(transport) {
					if (transport.responseText=="true"){
						$('Danke').setStyle({display: 'block'});
						$('DankeText').innerHTML="<strong>Your query was subbmitted:</strong><br />Thank You!";
						$('BTN_SEND').setStyle({display: 'none'});
					} else {
						$('Fehler').setStyle({display: 'block'});
						$('FehlerText').innerHTML="<strong>Es ist zu einem Fehler beim Datenaustausch gekommen:</strong><br />" + transport.responseText;
					}
				}
			});
		}
	}
}


/* Ecard-Formular */
function EcardPrewiev(){
	var RequiredForm  = new Array("EmpfaengerName", "EmpfaengerEmail", "AbsenderName", "AbsenderEmail");
	var RequiredMail  = new Array("EmpfaengerEmail", "AbsenderEmail");
	var error		  = "";
	
	/* Überprüfen der Daten */
	for (i=0;i<RequiredForm.length;i++){
		if( !$F(RequiredForm[i]) ){
			error += RequiredForm[i] + "<br />";
		}
	}
	/* Daten unvollständig, Fehler Layer einblenden */
	if ( error!="" ){
		$('Fehler').setStyle({display: 'block'});
		$('FehlerText').innerHTML="<strong>Bitte vervollständigen Sie folgende Daten:</strong><br />" + error +"<br />Vielen Dank!";
	} else {
		/* Email Adressen validieren */
		for (i=0;i<RequiredMail.length;i++){
			if( CheckEmail($F(RequiredMail[i]))==false ){
				error += RequiredMail[i] + "<br />";
			}
		}
		/* E-Mailadresse(n) nicht korrekt */
		if ( error!="" ){
			$('Fehler').setStyle({display: 'block'});
			$('FehlerText').innerHTML="<strong>Bitte korrigieren Sie folgende Angabe:</strong><br />" + error +"<br /><br />Vielen Dank!";
		} else {
			document.EcardFormular.submit();
		}
	}
}
function EcardSubmit(){
	var AuswerteDatei = "ecard.php?&MODUL=ecard&DO=send";
	var FormularName  = "EcardFormular";
	var error		  = "";
	/* Daten in Ordnung, AJAX Request mit Übermittlung aller Formulardaten! */
	//alert($(FormularName).serialize(true));
	new Ajax.Request(AuswerteDatei, { 
		method: 'post',
		parameters: $(FormularName).serialize(true),
		onComplete: function(transport) {
			if (transport.responseText=="true"){
				$('Danke').setStyle({display: 'block'});
				$('DankeText').innerHTML="<strong>Ihre E-Card wurde versendet:</strong><br />Vielen Dank!";
				$('BTN_SEND').setStyle({display: 'none'});
			} else {
				$('Fehler').setStyle({display: 'block'});
				$('FehlerText').innerHTML="<strong>Es ist zu einem Fehler beim Datenaustausch gekommen:</strong><br />" + transport.responseText;
			}
		}
	});
}




/* Werte und Algorithmen für RSA */
// var m = 0;
// var e = 0, d = 0;
var m = 29329;
var d = 23711;
var e = 11;
//var BlkLen = 0; /* Bitanzahl in einem Block */
var BlkLen = bitLength(m);
/* Initialisierung der Primzahlen. Die Größe ist sogewählt, dass mindestens */
/* ein Zeichen des Alphabetes verschlüsselt werden kann, aber dabei nicht   */
/* die maximale Größe für Ganzzahlen überschritten wird.                    */
 var Primzahlen = new Array (
                  101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157,
                  163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227,
                  229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
                  293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367,
                  373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
                  443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509,
                  521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
                  601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661,
                  673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751,
                  757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829,
                  839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919,
                  929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
 );

 function bitLength(intZahl) {
    /* Ermittelt die Bitlänge des ganzzahligen Anteils des Übergabewertes. */
    var i = 0;

    while (intZahl > 0) {
          intZahl = Math.floor(intZahl / 2);
          i++;
    }
    return i;
 }/* bitLength */

 function RSA_crypt(basis, exponent, modulus) {
    /* Berechnet die nte-Potenz einer Zahl (basis) unter einem Modulus. */
    var sum      = 0;  /* Dient zur Kontrolle, ob der Exponent vollständig berechnet wurde.*/
    var ergebnis = 1;  /* Nimmt das Ergebnis der Berechnung auf.                           */
    var mask     = 1;  /* Maske zur Bestimmung, ob 2er-Potenz Teil des Exponenten ist.     */

    if (isFinite(modulus*modulus)) {
       while (sum < exponent) {
          if ((exponent&mask) != 0) {
             ergebnis = (ergebnis*basis) % modulus;
             sum = sum + (exponent&mask);
          }
          basis = (basis*basis) % modulus;
          mask = mask << 1;
       }
       return ergebnis;
    } else return 0;
 }/* RSA_crypt */

 function ggT(a,b) {
    /* Berechnet zunächst das kleinste gemeinsame Vielfache (kgV), um dann */
    /* aus der Umkehrung den größten gemeinsamen Teiler (ggT) zu ermitteln.*/
    var x = a;
    var y = b;

    while (x < y || x > y)
        if (x-y < 0)
           x = x + a;
        else
           y = y + b;

    return (a*b/x);
 }/* ggT */

 function PublicKey (phi) {
    /* Sucht die kleinste relativ prime Zahl zu phi = (p-1)*(q-1) ist. */
    var akT = 0; /* aktueller Teiler                        */
    var e   = 2; /* Letztlich die relative Primzahl zu phi. */

    while ((akT != 1) && (akT != -1)) {
          e = e + 1;
          if (isFinite(e*phi))
             akT = ggT(e, phi);
          else return -1;
    }

    return e;
 }/* PublicKey */

 function SecretKey (e, phi) {
    /* Sucht den Faktor für phi, um die Umkehrung der Exponention zu ermöglichen */
    var i = 0;

    do {
       i = i + 1;
       if (!isFinite(i*phi)) return -1;
    } while ((1+i*phi)%e != 0);

    return (1+i*phi)/e;
 }/* SecretKey */

 function keygen_RSA(p, q) {
    var phi = (p-1) * (q-1);

    m = p * q;
    e = PublicKey(phi);
    d = SecretKey(e, phi);
 }/* keygen_RSA */

 function RSA_keys(form) {
    /* Generierung des Schlüsselpaares für die Beispielermittlung. */
    var P = form.p.options[form.p.selectedIndex].value;
    var Q = form.q.options[form.q.selectedIndex].value;

    keygen_RSA(P, Q);

    form.n.value   = m;
    form.phi.value = (P-1)*(Q-1);
    form.e.value   = e;
    form.d.value   = d;
 }/* RSA_keys */


 function RSA_keygen(form) {
    var P, Q;

    // P = 887; Q = 997;
    /* Generierung des Schlüsselpaares für die Beispielverschlüsselung. */
    do {
       P = Primzahlen[Math.round(Math.random()*100)%Primzahlen.length];
       Q = Primzahlen[Math.round(Math.random()*100)%Primzahlen.length];
    } while (!isFinite(P*P*Q*Q));

    keygen_RSA(P, Q);
    BlkLen = bitLength(m);

//    e = e + ", " + m;
//    d = d + ", " + m;
//    form.geheimtext.value = "";
 }/* RSA_keygen */

 function fillNull (Zeichenwert, len) {
    var temp = String(Zeichenwert);

    while (temp.length < len)
          temp = "0" + temp;
    alert(temp+"  "+parseInt(temp));
    return temp;
 }/* fillNull */

 function RSA_encode (Klartext) {
    var Chiffre  = "";

    while ((Klartext.length % Math.floor((BlkLen-1)/8)) != 0)
           Klartext = Klartext + " ";

    for (i=0; i < Klartext.length; i++) {
        tmp = Klartext.charCodeAt(i);
        j = 1;
        while (((j+1)*8) < BlkLen) {
              tmp = tmp << 8;
              tmp = tmp + Klartext.charCodeAt(i+j);
              j++;
        }
        if (j > 0) i = i + (j-1);
        Chiffre = Chiffre + String(RSA_crypt(parseInt(tmp), e, m)) + " ";
    }
    return Chiffre;
 }/* RSA_encode */


 function num_decode (Num) {
    var temp   = Num;
    var result = "";

    Num = Num >> 8;
    if (Num > 0)
       result = num_decode(Num);
    return result + String.fromCharCode(temp & 255);
 }/* num_decode */

 function RSA_decode (Geheimtext) {
    var Chiffre  = Geheimtext.split(" ");
    var Klartext = "";

    for (i=0; i < Chiffre.length; i++)
        if (Chiffre[i] != "") {
           Klarnum  = RSA_crypt(parseInt(Chiffre[i]), d, m);
           Klartext = Klartext + num_decode(Klarnum);
        }
    return Klartext;
 }/* RSA_decode */

 function kodierenRSA (form) {
    if (BlkLen == 0)
       alert("Das erzeugte Schlüsselpaar ist zu klein,\n verschlüsseln ist nicht möglich.");
    else if ((e == 0) || (m == 0))
       alert("Bitte erst ein Schlüsselpaar erzeugen.");
//    else if (form.klartext.value.length == 0)
//       alert("Bitte den zu verschlüsselnden Text eingeben.");
//    else form.geheimtext.value = RSA_encode(form.klartext.value);
    else return RSA_encode(form);
 }/* RSA_encode */

 function dekodierenRSA (form) {
    if (BlkLen == 0)
       alert("Das erzeugte Schlüsselpaar ist zu klein,\n entschlüsseln ist nicht möglich.");
    else if ((d == 0) || (m == 0))
       alert("Bitte erst ein Schlüsselpaar erzeugen.");
//    else if (form.geheimtext.value.length == 0)
//       alert("Bitte erst einen Chiffretext erzeugen.");
    else return RSA_decode(form);
 }/* RSA_decode */
