//Internal function

function checkInt(item) {
		 var count = 0;
		 for (i = 0;i<item.value.length;i++) {
		 	 myChar = item.value.charAt(i);
			 if (((myChar>="0") && (myChar<="9"))||myChar==" ") {
			 	if (myChar!=" ")count+=1;;
			 }
			 else return 0;
		}
		return count;
}

//Internal function
function checkNo(item) {
		 var openLevel=0;
		 var closedLevel=0;
		 var plusCount=0;
		 if (item.value.length<5 || item.value.length>24) return 1; 
		 for (i=0;i<item.value.length;i++) {
		 	 myChar = item.value.charAt(i);
			 if ((myChar >="0") && (myChar <= "9") || myChar == "-" || myChar=="(" || myChar==")"|| myChar=="+" || myChar==" ") {
			  	if (myChar == "+") {
				   plusCount+=1;
				   if (i>2) return 1;
				   if (plusCount>1) return 1;
				}
			  	else if (myChar=="(") openLevel+=1;
				else if (myChar==")") closedLevel+=1;
				if (openLevel>1 || closedLevel>1) return 1;
			 }
			 else return 1;
		}
		return 0;
}
//Internal function
function notNull(item) {
		 if (item.value.length == 0) return 1;
		 for (i=0;i<item.value.length; i++) {
		 	 if (item.value.charAt(i) !=" ")  return 0;
		 }
		 return 1;
}

//Internal function
function validWebsite(item) {
		 dotNo = 0;
		 httpCheck = 0;
		 httpExists = 0;
		 lastchar = "";
		 len = item.value.length;
		 if (len<5) return 1;
		 for (i=0;i<len;i++) {		 
		 	 myChar = item.value.charAt(i);
			 if (httpCheck==0) {
			 	switch(i) {
				   case 0: if (myChar!='h') httpCheck = 1;break; 
				   case 1: if (myChar!='t') httpCheck = 1;break; 
				   case 2: if (myChar!='t') httpCheck = 1;break; 
				   case 3: if (myChar!='p') httpCheck = 1;break; 
				   case 4: if (myChar!=':') httpCheck = 1;break; 
				   case 5: if (myChar!='/') httpCheck = 1;break; 
				   case 6: if (myChar!='/') httpCheck = 1;break; 
				   case 7: httpExists = 1;break;
				   default: httpCheck = 1;
			 	}
			 }
			 if (httpCheck==1) {
			 	if (!( myChar >= 'A' &&  myChar <= 'Z') && !( myChar >= 'a' &&  myChar <= 'z') && !( myChar >= '0' &&  myChar <= '9')&& !myChar=='/' && !myChar=='_' && !myChar=='.' && !myChar=='-') return 1;
			 	if (myChar==".") {
			 	   dotNo+=1;
				   if (lastChar == '.'||lastChar=='/') return 1;
			 	}
			 	if(myChar=='/') {
			 	   if (lastChar == '.'||lastChar=='/') return 1;
			 	}
			 }
			 lastChar = myChar;
		 }
		 if (dotNo<2) return 1;
		 return 0;
}


//Internal function
function validEmail(item) {
		 lastChar = "";
		 dotNo = 0;
		 
		 dotAfter = 0;
		 atNo = 0;
		 len=item.value.length;
		 if (len<5) return 1;
		 for (i=0;i<len;i++) {
		 	 myChar = item.value.charAt(i);
			 if (!( myChar >= 'A' &&  myChar <= 'Z') && !( myChar >= 'a' &&  myChar <= 'z') && !( myChar >= '0' &&  myChar <= '9')&& !myChar=='@' && !myChar=='_' && !myChar=='.' && !myChar=='-') return 1;
			 if (myChar=="@") {
			 	if (lastChar==".") return 1;
			 	atNo+=1;
			 }
			 else if (myChar=="."){
			 	  if ((lastChar=="@")||(lastChar==".")) return 1;
			 	  if (atNo==0) dotNo+=1;
				  else dotAfter+=1;
			 }
			 if (i==0||i==len-1) {
			 	if (!((myChar>="a"&&myChar<="z")||(myChar>="A"&&myChar<="Z"))) return 1;
			 }
			 lastChar = myChar;
		 }
		 if (atNo!=1 || dotAfter<1 || dotAfter>3) return 1;
		 return 0;
}

//Call to check valid website
function checkWebsite(item,name) {
		if (notNull(item)==0) {
		   if (validWebsite(item)==0) {
		   	  return 0;
		   }
		}
		this.addError(name);
}

//Call to check valid email address
function checkEmail(item,name) {
		 if (notNull(item)==0) {
		 	 if (validEmail(item)==0) {
			    return 0;
			 }
		 }
		 this.addError(name);
		 
}

//Call to check valid text input 
function checkText(item,name) {
		 if (notNull(item)>0) {
		 	 this.addError(name);
   		 }
}
//Call to check valid Zip code
function checkZip(item,name) {
		 if (notNull(item)==0) {
		 	var len = item.value.length;
		 	if ((len>2) && (len<8)) if (checkInt(item)>0) return 0;
		}
		this.addError(name);
}

//Call to check valid phone number (allows brackets & '+' for international number
function checkTelNo(item,name) {
		 if (notNull(item)==0) {
		 	 if (checkNo(item)==0) {
		 	 	return 0;	
		 	 }
		 }
		 this.addError(name);
}

//Call to check valid integer;
function checkNumber(item,name) {
		 if (notNull(item)==0) {
		 	if (checkInt(item)>0) return 0;
		 }
		 this.addError(name);
}

function addError(name) {
		 if (this.errorVal==0) this.errorString +=(" " + name);
		 else this.errorString+=(", " + name);
		 this.errorVal+=1;
}

//Call to report back any errors
function getErrorString(form,submit) {
		 if (this.errorVal>0) { 
		 	if (this.lang == "eng") alert("There were "+this.errorVal+" errors.\n"+ this.errorString);
			else alert("Es sind "+this.errorVal+" Fehler aufgetreten.\n"+ this.errorString);
			if (submit==0)return 0;
		 }
		 else {
		 	if (submit==0) return 1;
			form.submit();
		}
}

//Main object function called
function formValidator(lang) {
		 this.lang = lang;
		 if (lang=="eng") this.errorString = "The following fields require a valid input:";
		 else this.errorString = "Die folgende Felder benötigen eine gültige Eingabe:";
		 this.errorVal = 0;
		 
		 //Main functions
		 this.checkTelNo = checkTelNo;
		 this.checkText = checkText;
		 this.checkEmail = checkEmail;
		 this.checkWebsite = checkWebsite;
		 this.checkNumber = checkNumber;
		 this.checkZip = checkZip;
		 this.addError = addError;
		 this.getErrorString = getErrorString;
		 
		 //For internal use - don't call from outside object
		 this.notNull = notNull;
		 this.checkNo = checkNo;
		 this.checkInt = checkInt;
		 this.validEmail = validEmail;
		 this.validWebsite = validWebsite;
		 
}
