// FormCheck.js
// Autor: Matthias Eipeldauer, newmagic datensysteme gmbh
// Datum: 22.7.2008
//
// Dr. Mattrix' Universeller Formular Überprüf-Beamter
//
// An den Webdesigner:
// TODO: ALLE Objekte, die geprüft werden sollen, HIER (oder in einem beliebigen Script-Tag) eintragen.
// und zwar jedes in einer eigenen Zeile, der Typ der Prüfung ist dann
//
//  '123'		: ganze Zahlen, positiv/null/negativ
//  '+123'		: positive ganze Zahlen, inkl. null
//  '1.23'		: Kommazahlen, positiv/null/negativ
//  '+1.23'		: Kommazahlen, nur positiv, inkl. null
//  'ABC'		: Text
//  'A@B.C'		: EMail - Checker (etwas aufwändiger).
//
// Der KEY kann (muss aber auch nicht) eine Pipe (-> |) beinhalten und DANACH den (für Normalsterbliche) lesbaren Namen beinhalten.
// Beispiel:
//	oCheck["user_name|Benutzername"] = "ABC";
//	oCheck["user_mail|E-Mail Adresse"] = "A@B.C";
//
// Das Formular MUSS natürlich beim Submit ZUERST die CheckFunktion aufrufen!!

var oCheck = new Object();
var sAllowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.-_!";
// Kann überschrieben werden
var sTexts = {
     '123': "Bitte tragen Sie in das Feld '{FIELD}' eine korrekte Ganzzahl ein!\n",
    '+123': "Bitte tragen Sie in das Feld '{FIELD}' eine korrekte positive Ganzzahl ein!\n",
    '1.23': "Bitte tragen Sie in das Feld '{FIELD}' eine korrekte Kommazahl ein!\n",
  '1.23oS': "Bitte tragen Sie in das Feld '{FIELD}' eine korrekte Kommazahl ein!\n",
   '+1.23': "Bitte tragen Sie in das Feld '{FIELD}' eine korrekte positive Kommazahl ein!\n",
     'ABC': "Das Feld '{FIELD}' darf nicht leer sein!\n",
   'A@B.C': "Bitte tragen Sie in das Feld '{FIELD}' eine korrekte E-Mailadresse ein!\n",
       '*': "Bitte kontrollieren Sie den Wert im Feld '{FIELD}'. Dieser entspricht nicht den Vorgaben!\n",
      '!!': "Bitte geben Sie alle Zeichen des Sicherheitscodes korrekt ein!\n",
     'URL': "Bitte verwenden Sie im Feld '{FIELD}' keine Sonderzeichen!\n",
    'DATE': "Bitte tragen Sie in das Feld '{FIELD}' ein korrektes Datum ein!\n",
'FONDSJAHR': "Bitte geben Sie die Daten im Feld '{FIELD}' in der Form 'TT.MM.JJJJ-TT.MM.JJJJ an'!\n",
   'FONDS': "Bitte geben Sie die ISIN Nummer in der richtigen Form an. ATxxxxxxxxxx 12-stellig!\n"
}

function gueltigesDatum (datum)
{
    //(Schritt 1) Fehlerbehandlung
 if (!datum) return false;
 datum=datum.toString();

    //(Schritt 2) Aufspaltung des Datums
 datum=datum.split(".");
 if (datum.length!=3) return false;

    //(Schritt 3) Entfernung der fuehrenden Nullen und Anpassung des Monats

 datum[0]=parseInt(datum[0],10);
 datum[1]=parseInt(datum[1],10)-1;

    //(Schritt 4) Behandlung Jahr nur zweistellig
 //if (datum[2].length==2) datum[2]="20"+datum[2];
 if (datum[2].length!=4) return false;

    //(Schritt 5) Erzeugung eines neuen Dateobjektes
 var kontrolldatum=new Date(datum[2],datum[1],datum[0]);

    //(Schritt 6) Vergleich, ob das eingegebene Datum gleich dem JS-Datum ist
 if (kontrolldatum.getDate()==datum[0] && kontrolldatum.getMonth()==datum[1] && kontrolldatum.getFullYear()==datum[2])
     return true; else return false;

}

function ValidateForm()
{
	retVal = true;
	sMessage = "";
	for(keyName in oCheck)
	{
		key = keyName;
		sName = keyName;
		sSplit = key.split("|");
		if (sSplit.length > 1)
		{
			key = sSplit[0];
			sName = sSplit[1];
		}
		val = $(key).value.toString();

		switch(oCheck[keyName])
		{
			case "123":
				if (parseInt(val).toString() != val)
				{
					sMessage = GetText("123", sName); //"Bitte tragen Sie in das Feld '" + sName + "' eine gültige Ganzzahl ein!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;
			case "+123":
				if (parseInt(val).toString() != val || parseInt(val) < 0)
				{
					sMessage = GetText("+123", sName); // "Bitte tragen Sie in das Feld '" + sName + "' eine gültige positive Ganzzahl ein!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;
			case "1.23":
				sTest = QReplace(val);
				if (sTest == "" || isNaN(sTest))
				{
					sMessage = GetText("1.23", sName); // "Bitte tragen Sie in das Feld '" + sName + "' eine gültige Kommazahl ein!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;
			case "1.23oS":
				sTest = QReplace(val);
				if (isNaN(sTest))
				{
					sMessage = GetText("1.23oS", sName); // "Bitte tragen Sie in das Feld '" + sName + "' eine gültige Kommazahl ein!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;
			case "+1.23":
				sTest = QReplace(val);
				if (sTest== "" || isNaN(sTest) || parseFloat(sTest) < 0)
				{
					sMessage = GetText("+1.23", sName); // "Bitte tragen Sie in das Feld '" + sName + "' eine gültige positive Kommazahl ein!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;

			case "ABC":
				if (val == "")
				{
					sMessage = GetText("ABC", sName); // "Bitte das Feld '" + sName + "' ausfüllen!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;

			case "DATE":
				var retVal1 = gueltigesDatum (val);
				if (!retVal1)
				{
					sMessage = GetText("DATE", sName); // "Bitte das Feld '" + sName + "' ausfüllen!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}

				break;

			case "A@B.C":
				// schaut geil aus - macht folgendes:
				// überprüft:
				//   1. Zeichen MUSS ein Buchstabe sein, Groß/Klein ist egal.
				//      danach muss (min.) 1 Zeichen oder Zahl kommen, "-", "_", "." sind erlaubt, außer "@".
				//      danach das obligatorische @
				//   nach dem @ MUSS ein Buchstabe kommen, Groß/Klein ist egal.
				//      danach muss (min.) 1 Zeichen oder Zahl kommen, "-", "_", "." sind erlaubt, rest nicht. Punkte sind übrigens auch erlaubt!
				//      nach dem letzten Punkt MUSS ein Buchstabe und danach ein beliebiges Zeichen, aber kein _, - oder . mehr (logo, sonst wär's ja nicht der letzte Punkt!)
				match = val.match("^[a-zA-Z][a-zA-Z0-9\-\_\.]+@[a-zA-Z0-9][a-zA-Z0-9\-\_\.]+\.[a-zA-Z][a-zA-Z0-9]+");
				// geprüft wird ob match != null UND ob match != val ist (dann würde nur ein Teilstring gefunden werden - was das ganze auch ungültig macht).
				if (match == null || match != val)
				{
					sMessage = GetText("A@B.C", sName); // "Bitte geben Sie in das Feld '" + sName + "' eine gültige E-Mailadresse ein!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;
                     case "URL":
                           // prüft auf gültige URL Zeichen
                           for(i=0;i<val.length;i++)
                           {
                             sTest = val.substring(i, 1);
                             if (sAllowedChars.toUpperCase().indexOf(sTest.toUpperCase()) < 0)
                             {
					sMessage = GetText("URL", sName); // "Bitte verwenden Sie im Feld '{FELD}' keine Sonderzeichen!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
                             }
                           }
                           break;
                     case "FILE":
				val = val.substr(val.lastIndexOf("\\")+1);
                           for(i=0;i<val.length;i++)
                           {
				  sTest = val.substring(i,i+1);
				  sTest = sTest.toUpperCase();
                             if (sAllowedChars.indexOf(sTest) < 0)
                             {
					sMessage = GetText("URL", sName); // "Bitte verwenden Sie im Feld '{FELD}' keine Sonderzeichen!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
                             }
                           }
                           break;
			case "FONDS":
				if ((i=0 && val.substring(0,1) != "A") || (i=1 && val.substring(1,2) != "T") || val.length != 12 || val == "")
                             {
					sMessage = GetText("FONDS", sName); // "Bitte geben Sie die ISIN Nummer in der richtigen Form an. 'ATxxxxxxxxxx' 12-stellig!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
                             }
                           break;
			case "FONDSJAHR":
				saDatum = val.split("-");
				Datum1 = gueltigesDatum (saDatum[0]);
				Datum2 = gueltigesDatum (saDatum[1]);
				if (val.length != 21 || val == "" || (!Datum1) || (!Datum2))
                             {
					sMessage = GetText("FONDSJAHR", sName); // "Bitte geben Sie das Geschäftsjahr in der Form "TT.MM.JJJJ-TT.MM.JJJJ an!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
                             }
                           break;
			default:
				// selbst eine prüf-Regex angeben!
				if (!val.match(oCheck[keyName]))
				{
					sMessage = GetText("*", sName); // "Bitte überprüfen sie den Wert im Feld '" + sName + "', der Wert entspricht nicht den Vorgaben!";
					retVal = false;
					$(key).focus();
					alert(sMessage);
					return false;
				}
				break;
		}
	}
	return retVal;
}

function QReplace(val)
{
	return val.replace(",", ".").replace("e", "y").replace("E", "y").replace("x", "y").replace("X", "y");
}

function $(id)
{
	return document.getElementById(id);
}


function GetText(type, field)
{
  if (sTexts[type] != "")
  {
    sTexts[type] = sTexts[type].replace(/%FIELD%/g, "{FIELD}");
    return sTexts[type].replace(/\{FIELD\}/g, field);
  }
  return "";
}

function CheckForm()
{
  // Zuerst: Captcha prüfen
  xElem = document.getElementById("docContactCAPTCHA_Input");
  xCapVerified = false;
  if (xElem.value != "") 
  {
    xResult = mm8AxCore.SGet(mm8WebDbUrl + "/CheckCaptcha?OpenAgent&unid=" + document.getElementById("docContactCAPTCHA_UNID").value + "&inp=" + document.getElementById("docContactCAPTCHA_Input").value.toUpperCase());
    if (xResult && xResult.substring(0,8) == "VERIFIED") 
    {
      xCapVerified = true; 
    }
  }
  if(!xCapVerified)
  {
    alert(GetText("!!", ""));
    return;
  }
  else
  {
    document.getElementById("docContactCAPTCHA_TOKEN").value = xResult.substr(8);
  }
  if (ValidateForm())
  {
    document.forms[0].submit();
  }
}

function CheckFormLoggedIn()
{
  if (ValidateForm())
  {
    document.forms[0].submit();
  }
}

function CheckFormLoggedInSteuerlich()
{
  if (ValidateForm())
  {
    if (document.getElementById("ISNEWDOC").value == "1")
    {
      // setzen des Dateinamens in ein hidden Feld
      val = document.getElementById("Upload").value.toString();
      val = val.substr(val.lastIndexOf("\\")+1);
      document.forms[0].tmpfondsname.value = val;
    }
    document.forms[0].submit();
  }
}

function GetNewCaptcha()
{
  xResult = mm8AxCore.SGet(mm8WebDbUrl + "/CreateCaptcha?OpenAgent&unid=" + document.getElementById("docContactCAPTCHA_UNID").value);
  saSplit = xResult.replace("\n", "").split("|");
  sUNID = saSplit[0];
  sLink = saSplit[1];
  xElem = document.getElementById("CAPTCHA_IMAGE");
  xElem.src = sLink;
  xElem = document.getElementById("docContactCAPTCHA_UNID");
  xElem.value = sUNID;
  xElem = document.getElementById("CAPTCHA_UNID");
  if (xElem) xElem.value = sUNID;
}


