/**
* Possible validation attributes are:
*
*	notEmptyCheck
*	notEmptyOrCheck= "check against field"
*	notEmptyIfNotEmptyCheck= "check against field"
*	emptyIfEmptyCheck= "check against field"
*	notEmptyDependOnFieldValueCheck= "depend o field"
*		notEmptyDependOnFieldValueMatch= "depend on field value to match with"
*
*	minLengthCheck= "min length"
*	maxLengthCheck= "max length"
*
*	floatNumberCheck
*	integerNumberCheck
*	maxValueCheck= "max value"
*	minValueCheck= "min value"
*	minAgainstMaxNumberCheck= "max number field"
*
*	dateValidCheck
*	minAgainstMaxDateCheck= "max date field"
*	dateFromTodayToCheck= "Days to add from today to check against"
*		dateFromTodayToCheckTimeInc= "If time should be included set field here"
*	timeValidCheck
*
*	emailCheck
*	webaddressCheck
*	ircChannelCheck
*
*	pNoCheck
*	regularNameCheck
*
*	addressNameCheck
*	cityNameCheck
*	postnrCheck
*	teleCheck
*
*	fieldMatchCheck= "Field to match"
*	regexMatchCheck= "Regex to match"
**/

function formValidate( frm ){
	var errStr = "";

	// loop through all elements and perform validation
	for( var j = 0 ; j < frm.elements.length ; j++ ) {
		field = frm.elements[j];
		removeClass( field , "errorInput" );

		// skip disabled fields
		if( field.disabled ) continue;

		// For following checks skip all fields exept
		if( field.type != "text" && field.type != "password" && field.type != "select-one" && field.type != "file" && field.type != "textarea" && field.type != "radio" ) continue;

		// validate not empty field
		if( null != field.getAttribute( "notEmptyCheck" ) )
			errStr += checkNotEmpty( field );

		// validate not empty field
		if( null != field.getAttribute( "notEmptyOrCheck" ) )
			errStr += checkNotEmptyOr( field );

		// validate not empty field
		if( null != field.getAttribute( "notEmptyIfNotEmptyCheck" ) )
			errStr += checkNotEmptyIfNotEmpty( field );

		// validate empty field
		if( null != field.getAttribute( "emptyIfEmptyCheck" ) )
			errStr += checkEmptyIfEmpty( field );

		// For following checks skip all fields except
		if( field.type != "text" && field.type != "password" && field.type != "select-one" && field.type != "file" && field.type != "textarea" ) continue;

		// validate not empty field if dependfield matches given value
		if( null != field.getAttribute( "notEmptyDependOnFieldValueCheck" ) )
			errStr += checkNotEmptyDependOnFieldValue( field );

		// validate not empty field with min length
		if( null != field.getAttribute( "minLengthCheck" ) )
			errStr += checkMinLength( field );

		// validate not empty field with min length
		if( null != field.getAttribute( "maxLengthCheck" ) )
			errStr += checkMaxLength( field );

		if( field.type == "text" ) {
			// validate float number
			if( null != field.getAttribute( "floatNumberCheck" ) )
				errStr += checkFloatNumber( field );

			// validate integer number
			if( null != field.getAttribute( "integerNumberCheck" ) )
				errStr += checkIntegerNumber( field );

			// validate max value
			if( null != field.getAttribute( "maxValueCheck" ) )
				errStr += checkMaxValue( field );

			// validate min value
			if( null != field.getAttribute( "minValueCheck" ) )
				errStr += checkMinValue( field );

			// validate date
			if( null != field.getAttribute( "dateValidCheck" ) )
				errStr += checkDateValid( field );

			// validate if min date is before max date
			if( null != field.getAttribute( "minAgainstMaxDateCheck" ) )
				errStr += checkMinAgainstMaxDate( field );

			// validate date from to day and to specified number of days
			if( null != field.getAttribute( "dateFromTodayToCheck" ) )
				errStr += checkDateFromTodayTo( field );

			// validate time
			if( null != field.getAttribute( "timeValidCheck" ) )
				errStr += checkTimeValid( field );

			// validate email
			if( null != field.getAttribute( "emailCheck" ) )
				errStr += checkEmail( field );

			// validate webaddress
			if( null != field.getAttribute( "webaddressCheck" ) )
				errStr += checkWebaddress( field );

			// validate ircChannel
			if( null != field.getAttribute( "ircChannelCheck" ) )
				errStr += checkIrcChannel( field );

			// validate pNo
			if( null != field.getAttribute( "pNoCheck" ) )
				errStr += checkPNo( field );

			// validate regular name
			if( null != field.getAttribute( "regularNameCheck" ) )
				errStr += checkRegularName( field );

			// validate address name
			if( null != field.getAttribute( "addressNameCheck" ) )
				errStr += checkAddressName( field );

			// validate city name
			if( null != field.getAttribute( "cityNameCheck" ) )
				errStr += checkCityName( field );

			// validate postnr
			if( null != field.getAttribute( "postnrCheck" ) )
				errStr += checkPostnr( field );

			// validate tele
			if( null != field.getAttribute( "teleCheck" ) )
				errStr += checkTele( field );

			// validate field match
			if( null != field.getAttribute( "fieldMatchCheck" ) )
				errStr += checkFieldMatch( field );

			// validate regex match
			if( null != field.getAttribute( "regexMatchCheck" ) )
				errStr += checkRegexMatch( field );

		}
	}

	return errStr;
}

function submitCheck( frm ) {
	var errStr = formValidate( frm );

	if( errStr != "" ) {
		showMsgBox( errStr , "ERR" );

		return false;
	}

	var inputElt = frm.getElementsByTagName("input");
	for( var i = 0 ; i < inputElt.length ; i++ ) {
		if( inputElt[i].type == "button" || inputElt[i].type == "submit" || inputElt[i].type == "reset" ) {
			inputElt[i].disabled = "disabled";
		}
	}

	return true;
}


/*---------------------------------------------------------------------
* 
* Functions for different validations
* All function take a input element as input an returns a string.
* Empty string if validation was ok. Else a string containing error message
*
*--------------------------------------------------------------------*/


function checkNotEmpty( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	if( str == "" ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Detta fält kan ej vara tomt <br />" );
	}

	return "";
}


function checkNotEmptyOr( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	var orIdCheck = field.getAttribute( "notEmptyOrCheck" );
	orField = document.getElementById( orIdCheck );

	if( !orField || !orField.type ) return "";

	var orName = orField.getAttribute("checkName");
	if( orName == null ) orName = "";

	var orStr = orField.value;

	if( ( ( field.type == "text" && str == "" ) || ( field.type == "radio" && field.checked != true ) )
		&& ( ( orField.type == "text" && orStr == "" ) || ( orField.type == "radio" && orField.checked != true ) )
		) {
		addClass( field	, "errorInput" );
		addClass( orField	, "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label> eller <label for= \""+ orField.id +"\">" + orName + "</label> måste ha ett värde <br />" );
	}

	return ""; 
}


function checkNotEmptyIfNotEmpty( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	var ifIdCheck = field.getAttribute( "notEmptyIfNotEmptyCheck" );
	ifField = document.getElementById( ifIdCheck );

	if( !ifField || !ifField.type ) return "";

	var ifName = ifField.getAttribute("checkName");
	if( ifName == null ) ifName = "";

	var ifStr = ifField.value;

	if( ( ( field.type == "text" && str == "" ) || ( field.type == "radio" && field.checked != true ) )
		&& ( ( ifField.type == "text" && ifStr != "" ) || ( ifField.type == "radio" && ifField.checked == true ) )
		) {
		addClass( field	, "errorInput" );
		addClass( ifField	, "errorInput" );
		return ( "<label for= \""+ field.id +"\">"+ name +"</label> får inte vara tomt om <label for= \""+ ifField.id +"\">"+( ifName != "" && ifName != null ? ifName : ifField.id )+"</label> har ett värde <br />" );
	}

	return ""; 
}


function checkEmptyIfEmpty( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	var ifIdCheck = field.getAttribute( "emptyIfEmptyCheck" );
	ifField = document.getElementById( ifIdCheck );

	if( !ifField || !ifField.type ) return "";

	var ifName	= ifField.getAttribute("checkName");
	var ifStr	= ifField.value;

	if( ( ( field.type == "text" && str != "" ) || ( field.type == "radio" && field.checked == true ) )
		&& ( ( ifField.type == "text" && ifStr == "" ) || ( ifField.type == "radio" && ifField.checked != true ) )
		) {
		addClass( field		, "errorInput" );
		addClass( ifField	, "errorInput" );
		return ( "<label for= \""+ field.id +"\">"+ name +"</label> får inte ha ett värde om <label for= \""+ ifField.id +"\">"+( ifName != "" && ifName != null ? ifName : ifField.id )+"</label> är tomt <br />" );
	}

	return ""; 
}


function checkNotEmptyDependOnFieldValue( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var matchValue = field.getAttribute( "notEmptyDependOnFieldValueMatch" );
	if( matchValue == null ) return "";

	var str = field.value;

	var dependCheck = field.getAttribute( "notEmptyDependOnFieldValueCheck" );
	var dependField = getActiveEltByIdOrNAme( dependCheck );

	if( !dependField || !dependField.type ) return "";

	var dependName	= dependField.getAttribute("checkName");
	var dependStr	= dependField.value;

	if( matchValue == dependStr && ( str.length == 0 || str == "" ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Detta fält kan ej vara tomt på grund av värdet i "+( dependName != "" && dependName != null ? dependName : " andra fält " )+".<br />" );
	}

	return ""; 
}


function checkMinLength( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;
	if( str.length == 0 ) return "";

	var fieldMinLenght = field.getAttribute( "minLengthCheck" );
	if( fieldMinLenght < 0 || fieldMinLenght == "" ) {
		fieldMinLenght = 0;
	}

	var str = field.value;

	if( str.length < fieldMinLenght ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Detta fält måste innehålla minst "+fieldMinLenght+" tecken <br />" );
	}

	return "";
}


function checkMaxLength( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;
	if( str.length == 0 ) return "";

	var fieldMaxLenght = field.getAttribute( "maxLengthCheck" );
	if( fieldMaxLenght < 0 || fieldMaxLenght == "" ) {
		fieldMaxLenght = 0;
	}

	var str = field.value;

	if( str.length > fieldMaxLenght ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Detta fält får max innehålla "+fieldMaxLenght+" tecken. Det finns nu "+str.length+" tecken i fältet. <br />" );
	}

	return "";
}


function checkFloatNumber( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;
	if( str.length == 0 ) return "";

	var re1 = new RegExp(",");
	str = str.replace( re1 , ".");

	field.value = str;

	if( isNaN( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: I detta fält kan du endast skriva ett numeriskt värde <br />" );
	}

	return "";
}


function checkIntegerNumber( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;
	if( str.length == 0 ) return "";

	var re1 = new RegExp(",");
	str = str.replace(re1, ".");

	// check for number
	if( isNaN( str ) || str.indexOf(".") != -1 ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: I detta fält kan du endast skriva heltal. <br />" );
	}

	return "";
}


function checkMaxValue( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var max = field.getAttribute( "maxValueCheck" );
	var str = field.value;

	if( str.length == 0 ) return "";
	if( isNaN( max ) ) return "";

	if( isNaN( str ) ) {
		addClass( field , "errorInput" );

		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Är inte ett nummer <br /> ");
	}
	else if( Number( max ) < Number( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Maximalt värde är " + max + " <br /> ");
	}

	return ""; 
}


function checkMinValue( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var min = field.getAttribute( "minValueCheck" );
	var str = field.value;

	if( str.length == 0 ) return "";
	if( isNaN( min ) ) return "";

	if( isNaN( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Är inte ett nummer <br /> ");
	}
	else if( Number( str ) < Number( min ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Minsta värde är " + min + " <br /> ");
	}

	return ""; 
}


function checkMinAgainstMaxNumber( minField ) {
	if( !minField || !minField.type ) return "";

	var minName = field.getAttribute( "checkName" );
	if( minName == null ) minName = "";

	var maxIdCheck = field.getAttribute( "minAgainstMaxNumberCheck" );
	maxField = document.getElementById( maxIdCheck );

	if( !maxField || !maxField.type ) return "";

	var maxName = maxField.getAttribute("checkName");
	if( maxName == null ) maxName = "";

	var minNum = minField.value;
	var maxNum = maxField.value;

	if( minNum.length == 0 || maxNum.length == 0 ) return "";

	if( isNaN( minNum ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + minName + "</label>: Är inte ett nummer <br /> ");
	}
	else if( isNaN( maxNum ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + maxNum + "</label>: Är inte ett nummer <br /> ");
	}
	else if( Number( minNum ) > Number( maxNum ) ) {
		addClass( minField , "errorInput" );
		addClass( maxField , "errorInput" );
		if( maxName ) {
			return ( "<label for= \""+ minField.id +"\">" + minName + "</label>: Måste vara mindre än eller lika med <label for= \""+ maxField.id +"\">" + maxName + "</label> <br /> ");
		}
		else {
			return ( "<label for= \""+ minField.id +"\">" + minName + "</label>: Måste vara mindre än eller lika med motsvarande maxbelopp <br />" );
		}
	}

	return ""; 
}


function checkDateValid( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "Datum";

	var str = field.value;
	if( str.length == 0 ) return "";

	var dtCh		= "-";

	var pos1		= str.indexOf( dtCh );
	var pos2		= str.indexOf( dtCh , pos1 + 1 );

	if( pos1 == -1 || pos2 == -1 ) {
		addClass( field , "errorInput" );
		return ("<label for= \""+ field.id +"\">" + name + "</label>: Datum ska anges i formatet ÅÅÅÅ-MM-DD, ex: 2004-02-12 <br />");
	}

	var strYear		= str.substring( 0 , pos1 );
	var strMonth	= str.substring( pos1 + 1 , pos2 );
	var strDay		= str.substring( pos2 + 1 );

	var year		= parseInt(strYear , 10);
	var month		= parseInt(strMonth , 10);
	var day			= parseInt(strDay , 10);

	var daysInMonth	= getDaysInMonth( month , year );

	if( strMonth.length < 1 || isNaN( month ) || month < 1 || month > 12 ) {
		addClass( field , "errorInput" );
		return ("<label for= \""+ field.id +"\">" + name + "</label>: Vänligen ange en giltig månad <br />");
	}
	if( strYear.length != 4 || isNaN( year ) || year == 0 ) {
		addClass( field , "errorInput" );
		return ("<label for= \""+ field.id +"\">" + name + "</label>: Vänligen ange ett giltigt år, 4-siffrigt <br />");
	}
	else if( strDay.length < 1 || isNaN( day ) || day < 1 || day > daysInMonth ) {
		addClass( field , "errorInput" );
		return ("<label for= \""+ field.id +"\">" + name + "</label>: Vänligen ange en giltig dag <br />");
	}

	return "";
}


function checkMinAgainstMaxDate( minField ){
	if( !minField || !minField.type ) return "";

	var minName = minField.getAttribute("checkName");
	if( minName == null ) minName = "";

	var maxIdCheck = field.getAttribute("minAgainstMaxDateCheck");
	maxField = document.getElementById( maxIdCheck );
	if( !maxField || !maxField.type ) return "";

	var maxName = maxField.getAttribute("checkName");
	if( maxName == null ) maxName = "";

	var minDate = field.value;
	var maxDate = maxField.value;

	if( minDate.length == 0 || maxDate.length == 0 ) return "";

	var errorStr = checkDateValid( minField );
	errorStr += checkDateValid( maxField );

	if( errorStr.length != 0 )
		return errorStr;

	if( minDate > maxDate ){
		addClass( minField , "errorInput");
		addClass( maxField , "errorInput");
		if( maxName ) {
			return ("<label for= \""+ minField.id +"\">" + minName + "</label> måste vara tidigare än eller lika med <label for= \""+ maxField.id +"\">" + maxName + "</label> <br />");
		}
		else {
			return ("<label for= \""+ minField.id +"\">" + minName + "</label>: Måste vara tidigare än eller lika med motsvarande tilldatum <br />");
		}
	}

	return ""; 
}


function checkDateFromTodayTo( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var addDays = field.getAttribute( "dateFromTodayToCheck" );
	if( addDays == null ) addDays = 0;

	var timeInc = field.getAttribute("dateFromTodayToCheckTimeInc");
	var timeField;
	var timeStr = null;
	if( document.getElementById( timeInc ) ) {
		timeField = document.getElementById( timeInc );
		timeStr = timeField.value;
	}

	var str = field.value;

	if( str.length == 0 ) return "";

	var errorStr = checkDateValid( minField );
	if( timeField != null )
		errorStr += checkTimeValid( timeField );

	if( errorStr.length != 0 )
		return errorStr;

	if( timeStr != null && timeStr.length == 0 ) {
		addClass( timeField , "errorInput" );
		return ( "<label for= \""+ timeField.id +"\">" + name + "</label>: En tid måste anges till datumet. <br /> ");
	}

	var dtCh = "-";

	var pos1 = str.indexOf( dtCh );
	var pos2 = str.indexOf( dtCh , pos1 + 1 );

	date1 = new Date( );
	date1.setFullYear( str.substring( 0 , pos1 ) );
	date1.setMonth( str.substring( pos1 + 1 , pos2 ) - 1 );
	date1.setDate( str.substring( pos2 + 1 ) );
	if( timeStr != null ) {
		date1.setHours( timeStr.substring( 0 , timeStr.indexOf(":") ) );
		date1.setMinutes( timeStr.substring( timeStr.indexOf(":") + 1 , timeStr.indexOf(":") + 3 ) );
	}

	date2 = new Date( );

	if( date1 < date2 ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Datumet måste vara satt från idag och framåt. <br /> ");
	}

	date2.setDate( date2.getDate( ) + addDays );

	if( date1 > date2 ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Datumet får inte sättas längre fram än "+addDays+" dagar. <br /> ");
	}

	return "";
}


function checkTimeValid( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	field.value = field.value.replace( " " , "" );

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^[0-9]{1,2}[:]{1}[0-9]{2}$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: En tid skall anges som ex. 20:45 <br /> ");
	}

	return "";
}


function checkEmail( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	field.value = field.value.replace( " " , "" );

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^[A-Za-z0-9_\-][A-Za-z0-9_\-\.]*[A-Za-z0-9_\-]*@[A-Za-z0-9][A-Za-z0-9\-\.]*\.[A-Za-z]{2,}$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte en giltig e-postadress <br /> ");
	}

	return "";
}


function checkWebaddress( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	field.value = field.value.replace( " " , "" );

	var re = new RegExp("http:[\/]*");
	field.value = field.value.replace(re , "");

	var str = field.value;

	if( str.length == 0 ) return "";

	re = new RegExp("^[A-Za-z0-9][A-Za-z0-9\-]*\.[A-Za-z0-9][A-Za-z0-9\.\?\=\,\-\/_~]*[\:]?[0-9]{0,5}$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte en giltigt webbadress <br /> ");
	}

	return "";
}


function checkIrcChannel( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	field.value = field.value.replace( " " , "" );

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^#{1,1}\S+");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte en giltig Irckanal <br /> ");
	}

	return "";
}

function checkPNo( field ){
	if(!field || !field.type) return "";

	var pNo = field.value;

	if( pNo.length == 0 ) return "";

	var name = field.getAttribute("checkName");

	if( name == null ) name = "";

	var pNoCheck		= field.getAttribute( "pNoCheck" );
	var validateSe		= ( pNoCheck.indexOf( "se" ) != -1 ? true : false );
	var validateFi		= ( pNoCheck.indexOf( "fi" ) != -1 ? true : false );
	var validateNo		= ( pNoCheck.indexOf( "no" ) != -1 ? true : false );
	var validateDk		= ( pNoCheck.indexOf( "dk" ) != -1 ? true : false );

	var dateToday		= new Date( );
	var validYearStart	= dateToday.getFullYear() - 100;
	var validYearEnd	= dateToday.getFullYear();

	var dateSeOk		= false;
	var dateFiOk		= false;
	var dateNoOk		= false;
	var dateDkOk		= false;
	var checkSeOk		= false;
	var checkFiOk		= false;
	var checkNoOk		= false;
	var checkDkOk		= false;

	var reSe			= new RegExp("^[0-9]{6,8}[-]{1}[0-9]{4}$");
	var reFi			= new RegExp("^[0-9]{6,8}[-]{1}[0-9ABCDEFHJKLMNOPRSTUVWXY]{4}$");
	var reNo			= new RegExp("^[0-9]{6,8}[ ]{1}[0-9]{5}$");


	var strYear, strMonth, strDay;

	var length = str.indexOf( "-" );
	if( length == -1 )
		length = str.indexOf( " " );
	if( length == -1 )
		return "";

	var yearLength = ( length == 8 ? 4 : 2 );

	if( validateSe ) {
		strYear		= pNo.substr(0,yearLength);
		strMonth	= pNo.substr(yearLength,2);
		strDay		= pNo.substr(yearLength+2,2);
		if( parseInt(strYear) >= validYearStart
			&& parseInt(strYear) <= validYearEnd 
			&& parseInt(strMonth) >= 1 
			&& parseInt(strMonth) <= 12
			&& parseInt(strDay) >= 1
			&& parseInt(strDay) <= checkDayMonth( parseInt(strMonth) , parseInt(strYear) )
			) {
			dateSeOk = true;
		}
	}

	if( validateFi || validateNo || validateDk ) {
		strYear		= pNo.substr(4,yearLength);
		strMonth	= pNo.substr(2,2);
		strDay		= pNo.substr(0,2);

		if( parseInt(strYear) >= validYearStart
			&& parseInt(strYear) <= validYearEnd 
			&& parseInt(strMonth) >= 1 
			&& parseInt(strMonth) <= 12
			&& parseInt(strDay) >= 1
			&& parseInt(strDay) <= checkDayMonth( parseInt(strMonth) , parseInt(strYear) )
			) {
			dateFiOk = dateNoOk = dateDkOk = true;
		}
	}

	if( validateSe && dateSeOk && reSe.exec( pNo ) ) {
		var modulo10 = 0;
		for( var i = 0 , j = 2 ; i < pNo.length - 1 ; i++ ) {
			if( pNo.substr( i , 1 ) != "-" ) {
				var multital = pNo.substr( i , 1 ) * j;
				modulo10 += ( multital >= 10 ? 1 + multital-10 : multital );
				if( modulo10 > 10 ) {
					modulo10 -= 10;
				}
				j = ( j == 2 ? 1 : 2 );
			}
		}

		if( 10 - modulo10 == pNo.substr( pNo.length-1 , 1 ) ) {
			checkSeOk = true;
		}
	}

	if( validateFi && dateFiOk && reFi.exec( pNo ) ) {
		var temp = pNo.substr( 0 , 6 )+""+pNo.substr( 7 , 3 );
		var checknum = Number( temp ) % 31;
		var charcheck = new Array( "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" , "H" , "J" , "K" , "L" , "M" , "N" , "P" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" );

		if( charcheck[checknum] == pNo.substr( 10 , 1 ) ) {
			checkFiOk = true;
		}
	}

	if( validateNo && dateNoOk && reNo.exec( pNo ) ) {
		var check10 = ( 3 * pNo.substr( 0 , 1 ) ) + ( 7 * pNo.substr( 1 , 1 ) ) + ( 6 * pNo.substr( 2 , 1 ) ) + ( 1 * pNo.substr( 3 , 1 ) ) + ( 8 * pNo.substr( 4 , 1 ) ) + ( 9 * pNo.substr( 5 , 1 ) ) + ( 4 * pNo.substr( 7 , 1 ) ) + ( 5 * pNo.substr( 8 , 1 ) ) + ( 2 * pNo.substr( 9 , 1 ) );
		var check11 = ( 5 * pNo.substr( 0 , 1 ) ) + ( 4 * pNo.substr( 1 , 1 ) ) + ( 3 * pNo.substr( 2 , 1 ) ) + ( 2 * pNo.substr( 3 , 1 ) ) + ( 7 * pNo.substr( 4 , 1 ) ) + ( 6 * pNo.substr( 5 , 1 ) ) + ( 5 * pNo.substr( 7 , 1 ) ) + ( 4 * pNo.substr( 8 , 1 ) ) + ( 3 * pNo.substr( 9 , 1 ) ) + ( 2 * pNo.substr( 10 , 1 ) );

		if( check10 % 11 == pNo.substr( 10 , 1 ) && check11 % 11 == pNo.substr( 11 , 1 ) ) {
			checkNoOk = true;
		}
	}

	if(	!( ( checkSeOk && validateSe )
		|| ( checkFiOk && validateFi )
		|| ( checkNoOk && validateNo )
		|| ( checkDkOk && validateDk ) )
		) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Är inte korrekt. Personnummer skall skrivas som ex: " +
					( validateSe ? "Svenskt: \"810317-3225\" " : "" ) +
					( validateFi ? "Finskt: \"170381-852E\" " : "" ) +
					( validateNo ? "Norskt: \"170381 26006\" " : "" ) +
					( validateDk ? "Danskt: \"170381-4682\" " : "" ) +
					"<br />" );
	}

	return "";
}


function checkRegularName( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^[A-ZÅÄÖa-zåäöïíìéèñõü]+[-\ ]?[A-ZÅÄÖa-zåäöïíìéèñõü]+$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte ett giltigt namn <br /> ");
	}

	return "";
}


function checkAddressName( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^[A-ZÅÄÖa-zåäöïíìéèñõü]+[A-ZÅÄÖa-zåäöïíìéèñõü:\-\s0-9]+$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte ett giltigt gatuadress <br /> ");
	}

	return "";
}


function checkCityName( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^[A-ZÅÄÖa-zåäöïíìéèñõü]+[A-ZÅÄÖa-zåäöïíìéèñõü:\-\s]+$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte ett giltigt ortsnamn <br /> ");
	}

	return "";
}


function checkPostnr( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	field.value = field.value.replace( " " , "" );

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^[1-9]{1}[0-9]{3,}$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte ett giltigt postnummer <br /> ");
	}

	return "";
}


function checkTele( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	field.value = field.value.replace( " " , "" );

	var str = field.value;

	if( str.length == 0 ) return "";

	var re = new RegExp("^[0\+]{1}[0-9]{0,7}[-]{1}[1-9]{1}[0-9]{4,10}$");
	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Inte ett giltigt telefonnummer <br /> ");
	}

	return "";
}


function checkFieldMatch( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	var matchCheck	= field.getAttribute( "fieldMatchCheck" );
	var matchField	= document.getElementById( matchCheck );

	if( !matchField || !matchField.type ) return "";

	var matchstr = matchField.value;

	if( str != matchstr ) {
		addClass( field		, "errorInput" );
		addClass( matchField	, "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Matchar inte med kontrollfältet <br />" );
	}

	return ""; 
}

function checkRegexMatch( field ) {
	if( !field || !field.type ) return "";

	var name = field.getAttribute( "checkName" );
	if( name == null ) name = "";

	var str = field.value;

	var regexMatch = field.getAttribute( "regexMatchCheck" );
	var re = new RegExp(regexMatch);

	if( !re.exec( str ) ) {
		addClass( field , "errorInput" );
		return ( "<label for= \""+ field.id +"\">" + name + "</label>: Fältet innehåller inte ett giltigt värde <br />" );
	}

	return "";
}
