		var SET_MIN_AGE = 16 ;
		var SET_MAX_AGE = 100 ;


		/*** Return-Constants ***/

		var ERR_EMPTY_STRING = -1 ;
		var ERR_NO_SELECT = -1 ;
		var ERR_DAY_INVALID = -10 ;
		var ERR_MONTH_INVALID = -11 ;
		var ERR_YEAR_INVALID = -12 ;
		var ERR_DATE_INVALID = -13 ;
		var ERR_DATE_NOT_ADULT = -14 ;
		var ERR_DATE_TOO_OLD = -15 ;
		var ERR_DATE_IS_FUTURE = -16 ;

		var ERR_DATE_VALID = 10 ;
		var COMP_DATE_OLDER = 1 ;
		var COMP_DATE_EQUAL = 2 ;
		var COMP_DATE_NEWER = 3 ;

		var ERR_MISSING_HOUSENUMBER = -21 ;

		/*** end Return-Constants ***/

		var CONST_MIN_YEAR = 1902 ;
		var CONST_MAX_YEAR = 2037 ;

		var bSex = 0 ;
		var bNC = navigator.appName.toLowerCase() == 'netscape' ;

		var blnEnableParser = true ;



/*** Form-validate functions ***/

function validateNick(objNick)
{
	var szNick = getValue(objNick,true) ;
	var reNick = /^(([a-z]+\.?\s*-?\s*)+)[a-z]+$/i ;
	if(szNick.length && isAlphaNum(szNick) && szNick.length >= 4)
	{
		if(reNick.test(replaceSpecialChars(szNick)))
			return replaceFieldContent(objNick, szNick) ;
		else
			return InputError(objNick) ;
	}
	else
		return InputError(objNick, ERR_EMPTY_STRING) ;
}

function validateName(objName)
{
	var szName = getValue(objName) ;
	var reName = /^([a-z]{2,}|v.|y|o|o')([\s+\-][a-z]{2,})*(\s+c\/o\s+([a-z]{2,}|v.|y|o|o')([\s+\-][a-z]{2,})*)?$/i ;
	var arrSpecialChars = new Array ("/") ;
	if(szName.length && isAlphaNum(szName, arrSpecialChars))
	{
		if(reName.test(replaceSpecialChars(szName)))
			return replaceFieldContent(objName, szName) ;
		else
			return InputError(objName) ;
	}
	else
		return InputError(objName, ERR_EMPTY_STRING) ;
}

function validateZipCode(objZipCode, objCountry)
{
	var szZipCode = getValue(objZipCode) ;
	var reZipCode = isGermany(objCountry) ? /^(((0[1-9])|([1-9][0-9]))[0-9]{3})$/ : /\d+/ ;
	if(!szZipCode.length)
		return InputError(objZipCode, ERR_EMPTY_STRING) ;
	if(isGermany(objCountry) && isNaN(szZipCode))
		return InputError(objZipCode) ;
	if(reZipCode.test(szZipCode))
		return replaceFieldContent(objZipCode, szZipCode) ;
	else
		return InputError(objZipCode) ;
}

function validateEMail(objEMail)
{
	var szEMail = getValue(objEMail, true).toLowerCase() ;
	if(szEMail.length)
	{
		if(checkMailForm(szEMail))
		{
			var reEMail = /^[0-9a-z_]([-_\.]*[0-9a-z])*@[0-9a-z]([-\._]*[0-9a-z])*\.[a-z]{2,4}$/i ;
			if(reEMail.test(szEMail))
				return replaceFieldContent(objEMail, szEMail) ;
			else
				return InputError(objEMail) ;
		}
		else
			return InputError(objEMail) ;
	}
	else
		return InputError(objEMail, ERR_EMPTY_STRING) ;
}


function validateBirthdate(objDay, objMonth, objYear)
{
	var szDay = getValue(objDay) ;
	var szMonth = getValue(objMonth) ;
	var szYear = getValue(objYear) ;
	if(isEmpty(szDay))
		return InputError(objDay, ERR_EMPTY_STRING) ;
	if(isEmpty(szMonth))
		return InputError(objMonth, ERR_EMPTY_STRING) ;
	if(isEmpty(szYear))
		return InputError(objYear, ERR_EMPTY_STRING) ;
	var mixCheck = checkDate(szYear, szMonth, szDay, objDay, objMonth, objYear) ;
	if(mixCheck == ERR_DATE_VALID)
	{
		if(checkAge(szDay, szMonth, szYear, SET_MAX_AGE) == COMP_DATE_OLDER)
			return InputError(objYear, ERR_DATE_TOO_OLD) ;
		if(checkAge(szDay, szMonth, szYear, SET_MIN_AGE) == COMP_DATE_NEWER)
			return InputError(objYear, ERR_DATE_NOT_ADULT) ;
		var arrDate = new Array(("0"+szDay).match(/[0-9][0-9]$/), ("0"+szMonth).match(/[0-9][0-9]$/), szYear) ;
		if(typeof(objDay) == 'object')
		{
			objDay.value = arrDate[0] ;
			objMonth.value = arrDate[1] ;
			objYear.value = arrDate[2] ;
		}
		return arrDate[0] + "/" + arrDate[1] + "/" + arrDate[2] ;
	}
	else
		return mixCheck ;
}

function validateAgb(objCheckBox)
{
	var bDE = /.de$/.test(window.location.hostname) ;
	if(objCheckBox[0].checked)
	{
		bSex = 1 ;
		return (bDE) ? "weiblich" : "female" ;
	}
	if(objCheckBox[1].checked)
	{
		bSex = 2 ;
		return (bDE) ? "m�nnlich" : "male" ;
	}
	objCheckBox[0].focus() ;
	return ERR_NO_SELECT ;
}


function validateInputField(objField)
{
	var szContent = getValue(objField) ;
	if(szContent.length)
		return replaceFieldContent(objField, szContent) ;
	else
		return InputError(objField, ERR_EMPTY_STRING) ;
}



/*** end Form-validate functions ***/


/*** Common functions ***/

function enableParser()
{
	blnEnableParser = true ;
}

function disableParser()
{
	blnEnableParser = false ;
}

function trimString(szData)
{
	if(szData)
	{
		while(szData.substr(0,1) == " ")
			szData = szData.substr(1) ;
		while(szData.substr(-1) == " ")
			szData = szData.substr(0,szData.length-1) ;
		return replaceString(replaceString(replaceString(szData, "  ", " "), " -", "-"), "- ", "-") ;
	}
	return "" ;
}


function replaceString(szData, szSearch, szReplace)
{
	do
	{
		var iHit = szData.indexOf(szSearch) ;
		if(iHit >= 0)
			szData = szData.substring(0, iHit) + szReplace +  szData.substr(iHit+szSearch.length) ;
	} while(iHit >= 0) ;
	return szData ;
}


function replaceSpecialChars(szData)
{
	for(var i=0; i<szData.length; i++)
		if(szData.charCodeAt(i) > 122)
			szData = szData.substr(0, i) + "x" + szData.substr(i+1) ;
	return szData ;
}


function parseData(szData)
{
	if(!blnEnableParser)
		return trimString(szData) ;
	szData = szData.replace(/\./g,". ") ;
	szData = trimString(szData) ;
	szData = szData.toLowerCase() ;
	if(szData.substr(0, 3) != "von" && szData.substr(0, 2) != "v.")
		szData = szData.substr(0,1).toUpperCase() + szData.substr(1) ;
	for(var i = 0; i < szData.length; i++)
		if((szData.substr(i,1) == " " || szData.substr(i,1) == "-" || szData.substr(i,1) == "/") && !isPronoun(szData.substr(i+1)))
			szData = szData.substring(0,i+1)+szData.substr(i+1,1).toUpperCase()+szData.substring(i+2) ;
	return szData ;
}


function isPronoun(szData)
{
	arrPronouns = new Array("der","die","das","den","dem","am","an","auf","�ber","ueber","unter","von","v.","the","that") ;
	for(var i = 0; i < arrPronouns.length; i++)
		if(szData.substr(0,arrPronouns[i].length + 1) == arrPronouns[i] + " ")
			return true ;
	return false ;
}


function isEmpty(objData)
{
	var szData = getValue(objData) ;
	return szData.length == 0 ;
}

function getValue(objForm, bParse, bValue)
{
	if(typeof(objForm) == 'object')
	{
		objRecent = objForm ;
		if(objForm.type == 'radio' || objForm.type == 'checkbox')
			return objForm.checked ;
		if(objForm.type.substr(0, 6) == 'select')
		{
			var iIndex = objForm.selectedIndex ;
			var szValue = objForm.options[iIndex].text ;
			return (bValue) ? szValue : new Array(iIndex, szValue) ;
		}
		var szData = (bParse) ? trimString(objForm.value) : parseData(objForm.value) ;
		objForm.value = szData ;
		return szData ;
	}
	else
		return (bParse) ? trimString(objForm) : parseData(objForm) ;
}


function replaceFieldContent(objField, szContent)
{
	if(typeof(objField == 'object'))
		objField.value = szContent ;
	return szContent ;
}


function InputError(objForm, iError)
{
	if(isNaN(iError))
		iError = false ;
	if(typeof(objForm) == 'object')
	{
		objForm.focus() ;
		objForm.select() ;
	}
	return iError ;
}

/*** end common functions ***/


/*** some special functions ***/


function isGermany(objCountry)
{
	var szCountry = getValue(objCountry,'',true) ;
	return szCountry.toLowerCase() == "de" || szCountry.toLowerCase() == "d" ;
}


function checkMailForm(szData)
{
	for(var i=0; i<szData.length; i++)
	{
		var cCheck = szData.charCodeAt(i) ;
		if(cCheck == 45 || cCheck == 46 || cCheck >= 48 && cCheck <= 57 || cCheck == 64 || cCheck == 95 || cCheck >= 97 && cCheck <= 122)
			bCheck = true ;
		else
			return false ;
	}
	return true ;
}


function checkAge(szDay, szMonth, szYear, iYears)
{
	szYear = parseInt(parseFloat(szYear)) + iYears ;
	var dtGiven = new Date(szYear, szMonth-1, szDay);
	var dtToday = new Date() ;
	szYear = dtToday.getYear() ;
	if(szYear < 1900)
		szYear = parseInt(szYear) + 1900 ;
	var dtToday = new Date(szYear, dtToday.getMonth(), dtToday.getDate()) ;
	if(dtGiven.getTime() <= dtToday.getTime())
		return COMP_DATE_OLDER ;
	if(dtGiven.getTime() == dtToday.getTime())
		return COMP_DATE_EQUAL ;
	if(dtGiven.getTime() >= dtToday.getTime())
		return COMP_DATE_NEWER ;
}


function calculateDays(iMonth, iYear)
{
	if(!iYear || isNaN(iYear))
		iYear = 2000 ;
	if(!iMonth || isNaN(iMonth))
		iMonth = 8 ;
	var iDays = 0 ;
	if(iMonth == 2) { // February
		if(!(iYear%4) && ((iYear%100) && (iYear%400) || !(iYear%100) && !(iYear%400)))
			iDays = 29 ;
		else
			iDays = 28 ; }
	else if(iMonth<8 && iMonth%2 || iMonth>=8 && !(iMonth%2))
		iDays = 31 ;
	else
		iDays = 30 ;
	return iDays ;
}


function checkDate(szYear, szMonth, szDay, objDay, objMonth, objYear)
{
	if(isNaN(szDay) ||  parseInt(parseFloat(szDay)) > 31 || parseInt(parseFloat(szDay)) < 1)
		return InputError(objDay, ERR_DAY_INVALID) ;
	if(isNaN(szMonth) || parseInt(parseFloat(szMonth)) > 12 || parseInt(parseFloat(szMonth)) < 1)
		return InputError(objMonth, ERR_MONTH_INVALID) ;
	if(isNaN(szYear) || szYear.length != 4)
		return InputError(objYear, ERR_YEAR_INVALID) ;
	if(parseInt(szYear) < CONST_MIN_YEAR)
		return InputError(objYear, ERR_DATE_TOO_OLD) ;
	if(calculateDays(szMonth, szYear) < parseInt(parseFloat(szDay)))
		return InputError(objDay, ERR_DATE_INVALID) ;
	if((new Date(szYear, szMonth - 1, szDay)).getTime() > (new Date()).getTime())
		return InputError(objYear, ERR_DATE_IS_FUTURE) ;
	return ERR_DATE_VALID ;
}


function isAlphaNum(szData, arrChars)
{
	szData = szData.toLowerCase() ;
	for(var i=0; i<szData.length; i++)
	{
		var cCheck = szData.charCodeAt(i) ;
		if(cCheck >= 1 && cCheck <= 32 || cCheck == 39 || cCheck == 45 || cCheck == 46 || cCheck >= 47 && cCheck <= 57 || cCheck >= 96 && cCheck <= 122 || cCheck == 154 || cCheck == 156 || cCheck == 158 || cCheck == 165 || cCheck == 180 || cCheck >= 223 && cCheck <= 246 || cCheck >= 248 && cCheck <= 255
		|| compareChar(arrChars, cCheck))
			bCheck = true ;
		else
			return false ;
	}
	return true ;
}

function compareChar(arrChars, cCompare)
{
	if(arrChars)
	{
		for(i = 0; i < arrChars.length; i++)
		{
			if(arrChars[i].charCodeAt(0) == cCompare)
				return true ;
		}
	}
	return false ;
}

