var oCheckForm = new validForm();

//Rückwärtskompatibel
function checkForm(frm)
{

    return oCheckForm.goForm(frm);
}

function validForm ()
{
	
        this.checkNames=new Object();
        this.check=new Object();

	this.init = function (oForm)
	{

                

		this.oForm=oForm;
                var sFormID=oForm.id;

                this.waitingForReturn=false;

		this.defaultCheckAlerts = new Object();
		this.defaultCheckAlerts["int"] = "Bitte geben Sie eine Zahl ein";
		this.defaultCheckAlerts["date"] = "Bitte geben Sie eine Datum ein";
		this.defaultCheckAlerts["mail"] = "Bitte geben Sie eine Mailadresse ein";
		this.defaultCheckAlerts["null"] = "Dieses Feld darf nicht leer sein.";
                this.defaultCheckAlerts["extern"] = "Dieses Feld wird auf Inhalt überprüft.";
                this.defaultCheckAlerts["regex"] = "Dieses Feld wird auf Form überprüft.";
		
		this.checkNames[sFormID]=new Object();
		this.check[sFormID]=new Array();
		
		
		
		for(i=0;i<oForm.elements.length;i++)
		{			
			if(oForm.elements[i].getAttribute("checkType")!=null || oForm.elements[i].getAttribute("allowNull")!=null)
			{
				oForm.elements[i].onkeyup = this.blurElement;
                              
				bRet=this.checkElement(oForm.elements[i],sFormID);
				
				this.checkNames[sFormID][oForm.elements[i].name]=i;
				this.check[sFormID][i]=bRet;

			}
			
		}
		
	}
	
	this.goForm = function(oForm)
	{
                

		for(i=0;i<this.check[oForm.id].length;i++)
		{
			
                    if(this.check[oForm.id][i]==false)
                    {

                            alert(i+":Es sind noch Elemente nicht korrekt ausgefüllt. Diese Elemente werden Ihne durch ein rotes Kreuz angezeigt.");
                            return false;
                    }
		}
		return true;
	}
	
	this.blurElement = function (Ereignis)
	{
		
		if(Ereignis)
		{
			var srcElement=Ereignis.target;
		}
		else
		{
			Ereignis=window.event;
			var srcElement=Ereignis.srcElement
		}

                oForm=srcElement.form;
                bRet=oCheckForm.checkElement(srcElement,oForm.id)
		//oCheckForm.check[oForm.id][oCheckForm.checkNames[oForm.id][srcElement.name]]=bRet;
		

	}

	
	this.FormatElement = function (oElement,bOk,sCheckInfo)
	{
		srcElement=oElement;

                if(sCheckInfo==null)
                {
		
                    sCheckVal=srcElement.getAttribute("checkType");

                    if(sCheckVal!=null)
                    {

                            if(sCheckVal.lastIndexOf(":")==-1)
                            {
                                    sCheckType=sCheckVal;
                                    sCheckInfo=this.defaultCheckAlerts[sCheckType];
                            }
                            else
                            {
                                    sCheckType=sCheckVal.substring(0,sCheckVal.lastIndexOf(":"));
                                    sCheckInfo=sCheckVal.substring(sCheckVal.lastIndexOf(":")+1);


                            }
                    }
                    else
                    {
                            sCheckInfo=this.defaultCheckAlerts["null"];
                    }
                }
		
		
		
		
		
		
		bClassNameError=(srcElement.className.substr(srcElement.className.length-5)=="error");

                bClassNameOk=(srcElement.className.substr(srcElement.className.length-2)=="ok");

                
		
		if(bOk)
		{
                    //wenn letzte Klasse error ist diese entfernen
			if(bClassNameError)
			{
				srcElement.className = srcElement.className.substr(0,srcElement.className.length-5);
				
			}
                    //wenn letzte Klasse nicht ok ist diese schreiben
                        if(!bClassNameOk)
                        {
				srcElement.className = srcElement.className+" ok";
                        }

		}
		else
		{
                    //wenn letzte Klasse Ok ist diese entfernen
			if(bClassNameOk)
			{
				srcElement.className = srcElement.className.substr(0,srcElement.className.length-2);

			}
                   //Wenn letzte Klasse nicht error ist diese schreiben
			if(!bClassNameError)
			{
				srcElement.className = srcElement.className+" error";
				
			}
		}

                srcElement.title=sCheckInfo

                oForm=srcElement.form;
                
                oCheckForm.check[oForm.id][oCheckForm.checkNames[oForm.id][srcElement.name]]=bOk;

	
	}
	
	this.checkElement = function (oElement,sFormID)
	{
            
		sCheckVal=oElement.getAttribute("checkType");
		if(sCheckVal!=null)
		{
			if(sCheckVal.lastIndexOf(":")==-1)
			{
				sCheckType=sCheckVal;
		
			}
			else
			{
				sCheckType=sCheckVal.substring(0,sCheckVal.lastIndexOf(":"));
			}
		}
		
			
		if(oElement.getAttribute("allowNull")=="true")
		{
			bAllowNull=true;
		}
		else if(oElement.getAttribute("allowNull")=="false")
		{
			bAllowNull=false;
		}
		else
		{
			bAllowNull=false;		
		}

		
		if(oElement.value.length==0)
		{
			this.FormatElement(oElement,bAllowNull);
			return bAllowNull;
		}
		else if(oElement.value.length>0 && sCheckVal==null)
		{
                        this.FormatElement(oElement,true);
			return true;
		}
		else
		{
			
			switch(sCheckType)
			{
				case "int":
                                        
					bRet = this.isInteger(this.trim(oElement.value))

                                        this.FormatElement(oElement,bRet);
                                        
                                        return bRet;
					break;
					
				case "date":
					
					bRet = this.isDate(this.trim(oElement.value))

                                        this.FormatElement(oElement,bRet);

                                        return bRet;
					break;
					
				case "real":



					oElement.value=oElement.value.replace(/,/g,".");
                                        
                                        

					bRet = this.isDecimal(this.trim(oElement.value))
                                        this.FormatElement(oElement,bRet);

                                        return bRet;
					break;
					
				case "mail":
			
					bRet = this.isMail(this.trim(oElement.value))
                                        this.FormatElement(oElement,bRet);

                                        return bRet;
					break;

			}

                        var sCheckBeforePar=sCheckType.substring(0,sCheckType.indexOf("("));
                        var sCheckInPar=sCheckType.substring(sCheckType.indexOf("(")+1,sCheckType.length-1);

                        if(sCheckBeforePar=="regex")
                        {
                            bRet = this.isRegex(this.trim(oElement.value),sCheckInPar);
                            this.FormatElement(oElement,bRet);

                            return bRet;
                        }

                        if(sCheckBeforePar=="extern")
                        {
                            
                            bRet = this.isExtern(oElement,sCheckInPar,sFormID);
                            this.FormatElement(oElement,bRet,"Warten auf externe Überprüfung");

                            return bRet;
                        }



		}

		return false;

	}

        this.isExtern = function (oElement,sExtern,sFormID)
        {
           
            if(this.waitingForReturn == oElement)
            {
                if(oAjax.XMLHttpRequestObject.readyState < 4)
                {
                    oAjax.XMLHttpRequestObject.abort();
                }
                this.waitingForReturn=false;
            }



            if(this.waitingForReturn!=false)
            {
                alert("Achtung: 2 externe Abragen wurden aufeinmal abgesetzt. Das ist nicht möglich.")
                return false;
            }

            this.waitingForReturn=oElement;


            //absenden mit ajax
            this.sFormIDByExtern=sFormID;
            oAjax.set(sExtern+oElement.value,"oCheckForm.isExternReturn","GET");



            return false;

        }

        this.isExternReturn = function (Val)
        {
            
            
            if(Val.debug!=null)
            {
                alert(Val.debug);
            }

           

            if(Val.status)
            {
                this.check[this.sFormIDByExtern][this.checkNames[this.sFormIDByExtern][this.waitingForReturn.name]]=true;
                this.FormatElement(this.waitingForReturn,true,this.defaultCheckAlerts["extern"]);
            }
            else
            {
                this.check[this.sFormIDByExtern][this.checkNames[this.sFormIDByExtern][this.waitingForReturn.name]]=false;
                this.FormatElement(this.waitingForReturn,false,this.defaultCheckAlerts["extern"]);
                
            }

           

            this.waitingForReturn=false;



        }
	
	this.isInteger = function (Val)
	{
		if (isNaN(Number(Val))==false && Val.length>0)
		{
			if(Val.indexOf(".")==-1)
			{
				return true

			}
		}
		return false;
	}

	this.isDecimal = function (Val)
	{

		if (isNaN(Number(Val))==false && Val.length>0)
		{
			return true;
		}
		return false;
	}

	this.isMail = function (Val)
	{
		
		var Suche = /^(([a-z0-9])+(([\-|\_])+([a-z0-9])+)*(\.([a-z0-9])+([\-|\_]+([a-z0-9])+)*)*\@((([a-z0-9](\-[a-z0-9])*)+\.)*([a-z0-9](\-[a-z0-9])*)+\.([a-z]){2,6}))$/i;
		var Ergebnis;
		Ergebnis = Suche.exec(Val)
		if(Ergebnis!=null)
		{
			if(Ergebnis[0].length!=Val.length)
			{
				return false;
			}
			else
			{
				return true;
			}
		}
		else
		{
			return false;
		}
	
	}
	
	this.isDate = function (Val)
	{
		//(Schritt 1) Fehlerbehandlung
		if (!Val) return false;
		Val=Val.toString();

		//(Schritt 2) Aufspaltung des Vals
		Val=Val.split(".");
		if (Val.length!=3) return false;

		//(Schritt 3) Entfernung der fuehrenden Nullen und Anpassung des Monats
		Val[0]=parseInt(Val[0],10);
		Val[1]=parseInt(Val[1],10)-1;

		//(Schritt 4) Behandlung Jahr nur zweistellig
		if (Val[2].length==2) Val[2]="20"+Val[2];

		//(Schritt 5) Erzeugung eines neuen Dateobjektes
		var kontrollVal=new Date(Val[2],Val[1],Val[0]);

		//(Schritt 6) Vergleich, ob das eingegebene Val gleich dem JS-Val ist
		if (kontrollVal.getDate()==Val[0] && kontrollVal.getMonth()==Val[1] && kontrollVal.getFullYear()==Val[2])

		return true; else return false;

	}


/*##############################
Hilfsfunktionen
################################*/	
	
	this.runde = function (zahl,nachkommastellen)
	{
		if (nachkommastellen<1)
		return Math.round(zahl);

		var retzahl=Math.round(zahl*10*nachkommastellen);
		return retzahl/nachkommastellen/10;
	}

	this.trim = function (str)
	{
		s = str.replace(/^(\s)*/, '');
		s = s.replace(/(\s)*$/, '');
		return s;
	}
	
	
}
