function validateEmail(str) {

	var strLength = str.length
	var invalidChars = '\/\'\\ ";:?!()[]\{\}^|'
	var i
	var invalidCharPos
	var invalidChar

	for (i=0; i<invalidChars.length; i++) {
		invalidCharPos = str.indexOf(invalidChars.charAt(i), 0)
		if (invalidCharPos > -1) {
			invalidChar = str.substring(invalidCharPos, invalidCharPos + 1)
			if (invalidChar == ' ') {
				return "An email address must not contain spaces."
			} else {
				return "An email address must not contain the invalid character " + invalidChar
			}
		}
	}
	for (i=0; i<strLength; i++) {
		if (str.charCodeAt(i)>127) {
		  return "An email address must not contain non ascii characters.";
		}
	}

	var atPos        = str.indexOf('@')
	var dotPosFromAt = str.indexOf('.', atPos)
	var invalidChars = '\/\'\\ ";:?!()[]\{\}^|'

	if (atPos == -1) {
	   return "An email address must contain an @"
	}
	if (atPos == 0) {
	   return "An email address must not start with @"
	}
	if (atPos == strLength) {
	   return "An email address must not end with @"
	}
	if (str.indexOf('@', atPos + 1) > - 1) {
	   return "An email address must contain only one @"
	}

	if (dotPosFromAt == -1) {
	   return "An email address must contain a dot character (.) in the domain name after the @ character."
	}
	if (dotPosFromAt == 0) {
	   return "A domain name must not start with a dot character (.)"
	}
	if (str.indexOf('.@',0) != -1) {
	   return "A dot character (.) must not immediately precede @ in an email address."
	}

	var suffix = str.substring(str.lastIndexOf('.') + 1)
	if (suffix.length < 2) {
	   return "A domain name suffix must be 2 characters or more in length."
	}

	 return ""
}

