// Form validation library v1.0
// author: Simon Häusermann (s.haeusermann@insign.ch)
// (c) by insign gmbh 2001

/* manual:
implementation: <form .... onSubmit="return checkForm(this)">
all fields that need to be checked should be listed in the form-field
fcf_check as string: 
fieldname:outputname:check:p1:p2:p3,fieldname:outputname:check:p1
p1,p2,... are optional parameters which will passed to the function AFTER
the field value

every check-type needs its own function. e.g. :email -> function fcm_email(string)
this function returns boolean, if false it also sets the global var errormsg with
%name% for fieldname

existing field-types are:
- email
- string:min_length
- url:[1]							1: 'http://' required
- tel								(international : +41 (0).....)
- num:[min]:[max]

todo:
- time

exemple
<input type="hidden" name="fcf_check" value="personalizer.data[erwer]:Vorname:url:1,personalizer.data[erwer]:Vorname:url:1,personalizer.data[erwer]:Vorname:url:1,personalizer.data[erwer]:Vorname:url:1,personalizer.data[erwer]:Vorname:url:1,personalizer.data[erwer]:Vorname:url:1">

*/

// global vars ///
		var errormsg = "";
		allReq = "";
		completeLayer = false;
		helpLayer = false;
		help = true;
		showIfComplete = true;
		xdist = 0;
		ydist = 30;
		ydistSelect = 20;
		layerWidth = 300;
		selectComplete = 'Die Bedingung für dieses Feld ist erf&uuml;llt';
		textComplete = 'Die Angaben haben das richtige Format';
		isNs=(document.all)?false:true;
//Framebreite herauslesen//
		function newWidth()
		{
			frameWidth=document.body.offsetWidth-20;
		}
		function initForm()
		{
			for(i = 0; i <= document.forms.length-1; i++)
			{
				myForm = document.forms[document.forms.length-1];
				if(myForm.fcf_check)
					allReq = myForm.fcf_check.value.split(",");
				if(myForm.help_check)
					allHelp = myForm.help_check.value.split(",");
				else
					allHelp="";
				for(i=0;i<myForm.elements.length;i++)
				{
					myElement = myForm.elements[i];
					if(myElement.type=='text' || myElement.type == 'select-one' || myElement.type=='textarea')
					{
						myElement.required = false;
						for(m=0;m< allReq.length;m++)
						{
							parString = "";
							parts= allReq[m].split(":");
							for (s=3; s<parts.length; s++)
							{
								parString += ","+parts[s];
							}
							if (myElement.name == parts[0])
							{
								myElement.required = true;
								//myElement.disabled = false;
								myElement.check1 = parts[2];
								myElement.check2 = parString;
								myElement.Fieldname = parts[1];
								eval("check = fcm_"+parts[2]+"('"+myElement.value+"'"+parString+");");
								if (!check)
									myElement.className="formempty";
								myElement.helpTitle = "Angaben zum Feld '"+parts[1]+"'";
							}
							if (!myElement.required)
								myElement.className="formfull";
						}
						myElement.helpWanted = false;
						for(k=0;k< allHelp.length;k++)
						{
							parString = "";
							parts= allHelp[k].split(":");
							for (s=3; s<parts.length; s++)
							{
								parString += ","+parts[s];
							}
							if (myElement.name == parts[0] && !myElement.required)
							{
								myElement.helpWanted = true;
								myElement.check1 = parts[2];
								myElement.check2 = parString;
								myElement.helpTitle = "Angaben zum Feld '"+parts[1]+"'";
								myElement.Fieldname = parts[1];
							}
						}
						myElement.onfocus = doFocus;
						myElement.onkeyup= doFocus;
						myElement.onclick= doFocus;
						myElement.onchange= doFocus;
						myElement.onblur= doBlur;
					}
					if(myElement.type=='radio' || myElement.type=='checkbox')
					{
						myElement.required = false;
						for(k=0;k< allReq.length;k++)
						{
							parString = "";
							parts= allReq[k].split(":");
							for (s=3; s<parts.length; s++)
							{
								parString += ","+parts[s];
							}
							if (myElement.name == parts[0])
							{
								myElement.required = true;
								myElement.check1 = parts[2];
								myElement.Fieldname = "'"+parts[1]+"'";
								eval("check = fcm_"+parts[2]+"("+myElement.checked+");");
							}
						}
						myElement.onblur= doFocus;
					}
					
				}
			}
			if (document.all)
			{
				if(document.all.helpLayer)
				{
					theLayer = document.all.helpLayer;
					helpLayer = true;
				}
				if(document.all.completeLayer)
				{
					theCompleteLayer = document.all.completeLayer;
					completeLayer = true;
				}
				frameWidth=document.body.offsetWidth-20;
			}
		}
		
		function addtofcf(formname,string)
		{
			newfcfcheck=document.forms[formname].fcf_check.value;
			newfcfcheck+=","+string;
			document.forms[formname].fcf_check.value=newfcfcheck;
			if(!isNs)
				initForm();
		}

		function removefromfcf(formname,inputname,disable)
		{
			newfcfcheck='';
			myForm=document.forms[formname];
			if(myForm.help_check)
				allHelp = myForm.help_check.value
			allReq = myForm.fcf_check.value.split(",");
			for(k=0;k< allReq.length;k++)
			{
				parString = "";
				parts= allReq[k].split(":");
				for (s=3; s<parts.length; s++)
				{
					parString += ","+parts[s];
				}
				myElement=document.forms[formname].elements[inputname];
				if (myElement.name == parts[0])
				{
					myElement.required = false;
					if(k !=0)
						allHelp +=","+allReq[k];
					else
						allHelp =allReq[k];
				}
				else
				{
					if(k !=0)
						newfcfcheck +=","+allReq[k];
					else
						newfcfcheck = allReq[k];
				}
			}
			myForm.fcf_check.value=newfcfcheck;
			myForm.help_check.value=allHelp;
			if(!isNs)
				initForm();
			if (disable)
				eval('window.setTimeout(\'disablefield(\"'+formname+'\",\"'+inputname+'\",false)\',100);');
		}

		function disablefield(formname,inputname,remove)
		{
			if(remove)
				removefromfcf(formname,inputname,true);
			else
			{
					myElement=document.forms[formname].elements[inputname];
				if(document.all)
					myElement.disabled=true;
				else
					myElement.onfocus = doBlurField;
				if(myElement.type=='text' || myElement.type=='textarea')
					myElement.value='';
				if(myElement.type=='checkbox')
					myElement.checked=false;
				if(myElement.type=='radio')
					myElement.checked=false;
			}
		}
	
		function disableSeveral(formname,first,last,remove)
		{
			if(last=='last')
			last=document.forms[formname].length-2;
			for(k=first; k<=last; k++)
				disablefield(formname,k,remove);
		}

		function disableSeveralOnly(formname,first,last,remove)
		{
			lastelement=document.forms[formname].length;
			for(k=0; k<=lastelement-1; k++)
			{
				myElement=document.forms[formname].elements[k];
				myElement.disabled=false;
			}
			if(last=='last')
				last=document.forms[formname].length-2;
			for(k=first; k<=last; k++)
				disablefield(formname,k,remove);
			if(!isNs)
				initForm();
		}

		function resetFormPart(formname,first,last)
		{
			if(last=='last')
				last=document.forms[formname].length-2;
			myForm = document.forms[formname];
			if(myForm.default_check)
				allDef = myForm.default_check.value.split(",");
			else
				allDef="";
			for(k=first; k<=last; k++)
			{
				myElement=myForm.elements[k];
				if(myElement.type == 'text' || myElement.type=='textarea')
					myElement.value='';
				if(myElement.type == 'select-one')
					myElement.selectedIndex=0;
				if(myElement.type == 'checkbox' || myElement.type == 'radio')
					myElement.checked=false;
				for(m=0;m< allDef.length;m++)
				{
					parts= allDef[m].split(":");					
					if(parts[0]==myElement.name  && myElement.disabled==false)
					{
						if(myElement.type == 'text' || myElement.type=='textarea')
						{
							myElement.value=parts[1];
							myElement.defaultvalue=parts[1];
						}
						if(myElement.type == 'select-one')
							myElement.selectedIndex=parts[1];
						if(myElement.type == 'checkbox')
							myElement.checked=parts[1];
						if(myElement.type == 'radio')
							eval("document."+formname+"."+parts[0]+"["+parts[1]+"].checked=true;");
					}
				}
			}
			if(!isNs)
				initForm();
		}
		
		
		function addtodefault(formname,string)
		{
			newdefaultcheck=document.forms[formname].default_check.value;
			newdefaultcheck+=","+string;
			document.forms[formname].default_check.value=newdefaultcheck;
		}

		function removefromdefault(formname,inputname,disable)
		{
			newdefaultcheck='';
			myForm=document.forms[formname];
			allDef = myForm.default_check.value.split(",");
			for(k=0;k< allDef.length;k++)
			{
				parString = "";
				parts= allDef[k].split(":");
				myElement=document.forms[formname].elements[inputname];
				if (myElement.name != parts[0])
				{
					if(k !=0)
						newfcfcheck +=","+allDef[k];
					else
						newfcfcheck = allDef[k];
				}
			}
			myForm.default_check.value=newdefaultcheck;
		}		
		
		function enableSeveral(formname,first,last)
		{
			if(last=='last')
				last=document.forms[formname].length-2;
			for(k = first; k<=last; k++)
			{
				myElement=document.forms[formname].elements[k];
				myElement.disabled=false;
			}
			myForm = document.forms[formname];
			if(myForm.default_check)
				allDef = myForm.default_check.value.split(",");
			else
				allDef="";
			for(k=first; k<=last; k++)
			{
				myElement=myForm.elements[k];
				for(m=0;m< allDef.length;m++)
				{
					parts= allDef[m].split(":");					
					if(parts[0]==myElement.name && myElement.disabled==false)
					{
						if(myElement.type == 'text' || myElement.type=='textarea')
						{
							myElement.value=parts[1];
							myElement.defaultvalue=parts[1];
						}
						if(myElement.type == 'select-one')
							myElement.selectedIndex=parts[1];
						if(myElement.type == 'checkbox')
							myElement.checked=parts[1];
						if(myElement.type == 'radio')
							eval("document."+formname+"."+parts[0]+"["+parts[1]+"].checked=true;");
					}
				}
			}
			initForm();
		}
			
		function checkPart(formname, first, last)
		{
			if(last=='last')
				last=document.forms[formname].length-2;
			fieldar = document.theform.fcf_check.value.split(",");
			for (i=0; i<fieldar.length; i++)
			{
				parString = "";
				parts = fieldar[i].split(":");
				for (s=3; s<parts.length; s++)
					parString += ","+parts[s];
				if(parts[0]&& parts[2])
				{
					for(l=first; l<=last; l++)
					{
						check = true;
						myElement = document.forms[formname].elements[l];
						if (myElement.check1 && (myElement.type=='radio'||myElement.type=='checkbox') && myElement.required)
							eval("check = fcm_"+myElement.check1+"(myElement.checked);");
						else 
						{	
							if (myElement.check1 && myElement.required)
								eval("check = fcm_"+myElement.check1+"(myElement.value"+myElement.check2+");");				
						}
						if (!check)
							return false;
					}
				}
			}
			return true;
		}
				
		function doBlurField()
		{
			this.blur();
		}
	
		function doFocus()
		{
			if(this.type=='text' ||this.type=='select-one' || this.type=='textarea')
				this.className="formactive";
			check = false;
			if (this.check1 && (this.type=='radio'||this.type=='checkbox'))
				eval("check = fcm_"+this.check1+"(this.checked);");
			else 
			{	
				if (this.check1)
					eval("check = fcm_"+this.check1+"(this.value"+this.check2+");");
				if (this.required==false && this.value=='')
					errormsg = "Das Feld '%name%' muss nicht zwingend ausgefüllt werden";					
			}
			if(document.all && (this.type == 'text' || this.type == 'select-one' || this.type=='textarea')&& help)
			{
				xPos = this.offsetLeft;
				tempEl = this.offsetParent;
			  	while (tempEl != null) {
		  			xPos += tempEl.offsetLeft;
 		 			tempEl = tempEl.offsetParent;
  				}
				yPos =this.offsetTop;
				tempEl =this.offsetParent;
				while (tempEl != null) {
	  				yPos += tempEl.offsetTop;
 	 				tempEl = tempEl.offsetParent;
				}
				for(i = 0; i <= document.forms.length-1; i++)
				{
					for(i=0;i<myForm.elements.length;i++)
					{
						myElement = myForm.elements[i];
						if (myElement == this)
						{
							if (myForm.elements[i+1])
								next=myForm.elements[i+1];
							if (myForm.elements[i-1])
								last=myForm.elements[i-1];
						}
					}
				}
				if(myForm.elements[i+1])
				{
					nextxPos = next.offsetLeft;
					tempEl = next.offsetParent;
			  		while (tempEl != null) {
		  				nextxPos += tempEl.offsetLeft;
 		 				tempEl = tempEl.offsetParent;
  					}
					nextyPos =next.offsetTop;
					tempEl =next.offsetParent;
					while (tempEl != null) {
	  					nextyPos += tempEl.offsetTop;
 	 					tempEl = tempEl.offsetParent;
					}
				}
				if ((this.required || this.helpWanted) && !check && helpLayer)
				{
					if(completeLayer)
					{
						theCompleteLayer.style.pixelLeft=-500;
						theCompleteLayer.style.visibility="hidden";
					}
					errormsg = errormsg.replace(/%name%/g,this.Fieldname);
					document.all.newHelpText.innerHTML=errormsg;
					newx = xPos+xdist;
					if (newx > frameWidth - layerWidth)
						newx= frameWidth - layerWidth;
					theLayer.style.pixelLeft=newx;
					layerHeigth = theLayer.offsetHeight;
					if (this.type == 'select-one'||(next.type=='select-one' && last.type != 'select-one' && Math.abs(xPos-nextxPos)<300 && nextyPos-yPos-layerHeigth-ydist<0))
						newy = yPos - layerHeigth - ydistSelect;
					else
						newy = yPos + ydist;
					theLayer.style.pixelTop=newy;
					theLayer.style.visibility="visible";
				}
				if (showIfComplete && completeLayer &&(this.required || this.helpWanted)&& check)
				{
					if (this.type == 'select-one')
						document.all.completeText.innerHTML=selectComplete;
					else
						document.all.completeText.innerHTML=textComplete;
					newx=xPos+xdist;
					if (newx > frameWidth - layerWidth)
						newx= frameWidth - layerWidth;
						theCompleteLayer.style.pixelLeft= newx;
						completeLayerHeigth = document.all.completeLayer.offsetHeight;
						layerHeigth = theCompleteLayer.offsetHeight;
					if (this.type == 'select-one'||(next.type=='select-one' && last.type != 'select-one' && Math.abs(xPos-nextxPos)<300 && nextyPos-yPos-layerHeigth-ydist<0))
					{
						newy = yPos - layerHeigth - ydistSelect;
					}
					else 
						newy = yPos + ydist;
					theCompleteLayer.style.pixelTop=newy;
					theCompleteLayer.style.visibility="visible";
				}
			}
			if (check && helpLayer)
			{
				theLayer.style.pixelLeft=-500;
				theLayer.style.visibility="hidden";
			}
		}
		
		function doBlur()
		{
			if(!isNs)
			{
				if (showIfComplete && completeLayer)
				{
					theCompleteLayer.style.pixelLeft=-500;
					theCompleteLayer.style.visibility="hidden";
				}
				check = false;
				if (this.check1 && this.check2)
				{
					eval("check = fcm_"+this.check1+"(this.value"+this.check2+");");
					if (check)
						this.className="formfull";
					else
						this.className="formempty";
				}
				if(helpLayer)
				{		
					theLayer.style.pixelLeft=-500;
					theLayer.style.visibility="hidden";
				}
			}
			if(!isNs &&(!(this.required || this.helpWanted)||(this.required==false && (this.value==''||this.value==this.defaultvalue))))
				this.className="formfull";
		}

		function closeLayer()
		{	
			theLayer.style.pixelLeft=-500;
			theLayer.style.visibility="hidden";
		}

		function closeCompleteLayer()
		{
			theCompleteLayer.style.pixelLeft=-500;
			theCompleteLayer.style.visibility="hidden";
		}


function checkForm(theform)
{
	fieldar = theform.fcf_check.value.split(",");
	for (i=0; i<fieldar.length; i++)
	{
		parString = "";
		parts = fieldar[i].split(":");
		for (s=3; s<parts.length; s++)
		{
			parString += ","+parts[s];
		}
		if(parts[0])
		{
			eval("check = fcm_"+parts[2]+"(theform.elements['"+parts[0]+"'].value"+parString+");");
			if (!check)
			{
				error = errormsg.replace(/%name%/,parts[1]);
				alert(error);
				if(theform.elements[parts[0]].type == 'text' || theform.elements[parts[0]].type == 'textarea')
					eval("theform.elements['"+parts[0]+"'].focus();");
				else
				{
					thelocation=window.location.href;
					if(thelocation.indexOf("#"))
					{
						thelocation=thelocation.split("#");
						thelocation=thelocation[0];
					}
					newlocation=thelocation+'#'+parts[0]+'_a';
					location.replace(newlocation);
				}
				return false;
			}
		}
	}
	return true;
}		
		
/////////// validation functions for radiobuttons(fcm_[name](string) -> return boolean) ///////////
function fcm_radio(radiochecked)
{
	if (!radiochecked)
	{
		errormsg = "Bitte wählen Sie bei '%name%' eine Option aus. ";
		return false;
	}
	return true;
}
/////////// validation functions for radiobuttons(fcm_[name](string) -> return boolean) ///////////
function fcm_checkbox(checkboxchecked)
{
	if (!this.checked)
	{
		errormsg = "Bitte wählen Sie bei '%name%' eine Option aus. ";
		return false;
	}
	return true;
}
/////////// validation functions for selectfields(fcm_[name](string) -> return boolean) ///////////
function fcm_select(index,defIndex)
{
	if (index==defIndex)
	{
		errormsg = "Bitte wählen Sie im Feld '%name%' einen Eintrag aus.";
		return false;
	}
	return true;
}
/////////// validation functions for textfields(fcm_[name](string) -> return boolean) ///////////
function fcm_num(text,from,to)
{
	if (text=="")
	{
		errormsg = "Das Feld '%name%' muss einen Zahlenwert enthalten.";
		return false;
	}
	num = text*1;
	if (num != text)
	{
		errormsg = "Das Feld '%name%' muss einen Zahlenwert enthalten.";
		return false;
	}
	if (from!=null && num<from)
	{
		errormsg = "Der Wert von Feld '%name%' muss mindestens "+from+" sein.";
		return false;
	}
	if (to!=null && num>to)
	{
		errormsg = "Der Wert von Feld '%name%' darf maximal "+to+" sein.";
		return false;
	}
	return true;
}

function fcm_tel(text)
{
	if (text.length<11 || text.substring(0,1)!="+" || text.indexOf(" ")>0 || text.indexOf("/")>0)
	{
		errormsg = "Das Feld '%name%' enthält keine gültige Telefonnummer";
		return false;
	}
	return true;
}

function fcm_email(text)
{
	if (text.length<8 || text.indexOf("@")<1 || text.lastIndexOf(".")<5)
	{
		errormsg = "Das Feld '%name%' enthält keine gültige E-Mail Adresse";
		return false;
	}
	return true;
}

function fcm_string(text,minLength)
{
	if (text.length<minLength)
	{
		errormsg = "Das Feld '%name%' muss mindestens "+minLength+" Zeichen enthalten";
		return false;
	}

	return true;
}

function fcm_textstring(text,minLength)
{
	if (text != escape(text))
	{
		errormsg = "Im Feld '%name%' dürfen keine Sonderzeichen vorkommen.";
		return false;
	}
	for (k=0;k<=text.length-1;k++)
	{
		if(text.substring(k,k+1)==(1*text.substring(k,k+1)))
		{
			errormsg = "Das Feld '%name%' darf keine Zahlen enthalten.";
			return false;
		}
	}
	if (text.length<minLength)
	{
		errormsg = "Das Feld '%name%' muss mindestens "+minLength+" Zeichen enthalten";
		return false;
	}
	return true;
}

function fcm_url(text,absolute)
{
	if (text.substring(0,7)!="http://")
	{
		errormsg = "Das Feld '%name%' muss mit http:// beginnen";
		return false;
	}
	else
	{
		text = text.substring(7,text.length);
	}
	if (text != escape(text))
	{
		errormsg = "Die URL im Feld '%name%' enthält Sonderzeichen, die in einer URL nicht vorkommen dürfen.";
		return false;
	}
	tmp = text.replace(/[\.|\/]/,"$");
	if (text.length<3 || tmp.length - tmp.lastIndexOf("$") < 3 || tmp.lastIndexOf("$")<1)
	{
		errormsg = "Das Feld '%name%' enthält keine gültige URL";
		return false;
	}
	return true;
}

function fcm_stringexact(text,textLength)
{
	if (text.length!=textLength)
	{
		errormsg = "Das Feld '%name%' muss genau "+textLength+" Zeichen enthalten";
		return false;
	}
	return true;
}

function fcm_date(dateString, full)
{
	thedate=dateString.split(".");
	if(thedate.length<3)
	{
		if(full==true)
			errormsg="Das Feld '%name%' muss folgendes Format haben:\nTT.MM.JJJJ";
		else
			errormsg="Das Feld '%name%' muss folgendes Format haben:\nTT.MM.JJ";
		return false;
	}
	for(k=0;k<thedate.length;k++)
	{
		if (thedate[k]!=1*thedate[k])
		{
			if(full==true)
				errormsg="Das Feld '%name%' muss folgendes Format haben:\nTT.MM.JJJJ";
			else
				errormsg="Das Feld '%name%' muss folgendes Format haben:\nTT.MM.JJ";
			return false;
		}
	}
	if(thedate[0].length>2 ||thedate[1].length>2 || thedate[0].length<1 ||thedate[1].length<1 ||(thedate[2].length!=2 && full==false)||(thedate[2].length!=4 && full==true))
	{
		if(full==true)
			errormsg="Das Feld '%name%' muss folgendes Format haben:\nTT.MM.JJJJ";
		else
			errormsg="Das Feld '%name%' muss folgendes Format haben:\nTT.MM.JJ";
		return false;
	}
	if(thedate[0]>31 ||thedate[1]>12 || thedate[0]<1 ||thedate[1]<1 ||thedate[2]<0)
	{
		errormsg="Das Feld '%name%' enthätlt kein gültiges Datum";
		return false;
	}
	return true;
}
