
function FormValidator() {

  function isEmpty(textfield) {
  	if (textfield.length > 0) {
		var count = 0;
		for (i = 0; i < textfield.length; i++) {
			if (textfield.charAt(i) == " ") {
				count = count + 1;
			}
		}
		if (count == textfield.length) {
			return true;
		}
		return false;
	} else {
		return true;
	}
  }

  function isEmail(email) {
	if (this.isEmpty(email) || email.indexOf("@") < 1 || email.indexOf(".") == -1 || email.length < 5 || email.length - 1 == email.lastIndexOf(".")) {
		return false;
	}
	if (this.countOccurences(' ', email) > 0) {
		return false;
	}
	if (this.countOccurences("\\", email) > 0) {
		return false;
	}
	var cnt = 0;
	for (i = 0; i < email.length; i++) {
		if (email.charAt(i) == "@") {
			cnt++;
		}
	}
	if (cnt != 1) {
		return false;
	}
	return true;
  }

  function isNumber() {
  	var set = "0123456789+-.";
  	if (arguments.length < 1 || arguments.length > 3) {
		return false;
	}
	if (this.isEmpty(arguments[0])) {
		return false;
	}
	var text = arguments[0];
	var real = false;
	// sign:  1: +, 2: -, 3:+-
	var sign = 3;
	if (arguments.length >= 2) {
		real = arguments[1];
	}
	if (arguments.length == 3) {
		sign = arguments[2];
	}
	for (i = 0; i < text.length; i++) {
		if (set.search(text.charAt(i)) == -1) {
			return false;
		}
	}
	if (real) {
		if (text.lastIndexOf('.') == text.length - 1) {
			return false;
		}
	} else {
		if (text.indexOf('.') != -1) {
			return false;
		}
	}
	if (text.indexOf('+') > 0 || text.indexOf('-') > 0) {
		return false;
	}
	if (sign == 1) {
		if (text.indexOf('-') != -1) {
			return false;
		}
	}
	if (sign == 2) {
		if (text.indexOf('-') == -1) {
			return false;
		}
	}
	if (text.indexOf('.') != text.lastIndexOf('.') || text.indexOf('+') != text.lastIndexOf('+') || text.indexOf('-') != text.lastIndexOf('-')) {
		return false;
	}
	if (real) {
		if (isNaN(parseFloat(text))) {
			return false;
		}
	} else {
		if (isNaN(parseInt(text))) {
			return false;
		}
	}
	return true;
  }

  function isAlpha(string) {
  	var charSet = "abcdefghijklmnopqrstuvwxyz ";
	var text = string.toLowerCase();
	if (this.isEmpty(string)) {
		return false;
	}
	for (i = 0; i < text.length; i++) {
		if (charSet.indexOf(text.charAt(i)) == -1) {
			return false;
		}
	}
	return true;
  }

  function isFirstChar(text, character) {
	if (this.isEmpty(text) || this.isEmpty(character)) {
		return false;
	}
	if (text.charAt(0) == character) {
		return true;
	}
	return false;
  }

  function isAlphaNumeric(string) {
  	var charSet = "abcdefghijklmnopqrstuvwxyz0123456789 _";
	var text = string.toLowerCase();
	if (this.isEmpty(string)) {
		return false;
	}
	for (i = 0; i < text.length; i++) {
		if (charSet.indexOf(text.charAt(i)) == -1) {
			return false;
		}
	}
	return true;
  }

  function isValidPassword(string) {
	if (this.isEmpty(string)) {
//		alert('EMPTY->'+string);
		return false;
	}
	if (!this.isAlphaNumeric(string)) {
//		alert('NONALPHANUM->'+string);
		return false;
	}
 	for (i = 0; i < string.length; i++) {
		if (string.indexOf(' ') != -1) {
			return false;
		}
	}
	if (!this.isLong(string, 'between', 6, 15)) {
		return false;
	}
	return true;
  }

  function isValidUsername(string) {
	if (this.isEmpty(string)) {
		return 2;
	}
	if (this.isFirstChar(string, "_")) {
		return 3;
	}
	if (this.countOccurences(' ', string) > 0) {
		return 3;
	}
	if (!this.isAlphaNumeric(string)) {
		return 4;
	}
	if (this.isNumeric(string.charAt(0))) {
		return 3;
	}
	if (!this.isLong(string, 'between', 6, 15)) {
		return 2;
	}
	if (string.indexOf('__') != -1) {
	    return 3;
	}
	return 1;
  }

  function isNumeric(text) {
  	var charSet = "0123456789";
	if (this.isEmpty(text)) {
		return false;
	}
	for (i = 0; i < text.length; i++) {
		if (charSet.indexOf(text.charAt(i)) == -1) {
			return false;
		}
	}
	return true;
  }

  function isYear(text) {
  	if (this.isEmpty(text) || text.length != 4 || !this.isNumeric(text)) {
		return false;
	}
	return true;
  }

  function isMonth(text) {
	if (this.isEmpty(text)) {
		return false;
	}
  	var months = new Array('january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december');
	var found = false;
	for (i = 0; i < 12; i++) {
		if (text.toLowerCase() == months[i]) {
			found = true;
		}
	}
	if (found) {
		return true;
	}
	return false;
  }

  function isDayOfWeek(text) {
	if (this.isEmpty(text)) {
		return false;
	}
  	var dows = new Array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday');
	var found = false;
	for (i = 0; i < 7; i++) {
		if (text.toLowerCase() == dows[i]) {
			found = true;
		}
	}
	if (found) {
		return true;
	}
	return false;
  }

  function isWithinRange(text, min, max, real) {
	if (this.isEmpty(text) || !this.isNumber(text, real)) {
		return false;
	}
	if (real) {
		if (parseFloat(text) < min || parseFloat(text) > max) {
			return false;
		}
	} else {
		if (parseInt(text) < min || parseInt(text) > max) {
			return false;
		}
	}
	return true;
  }

  function isLong() {
	if (arguments.length < 1 || arguments.length == 2 || arguments.length > 4) {
		return false;
	}
	var text = arguments[0];
	var min = 0;
	var max = text.length;
	if (arguments.length == 3) {
		if (arguments[1] == 'at_least') {
			min = arguments[2];
		}
		if (arguments[1] == 'at_most') {
			max = arguments[2];
		}
	}
	if (arguments.length == 4) {
		if (arguments[2] > arguments[3]) {
			return false;
		}
		if (arguments[1] == 'between') {
			min = arguments[2];
			max = arguments[3];
		}
	}
//	alert('min = '+min+', max = '+max+', text.length = '+text.length);
	if (min < 0) {
		min = 0;
	}
	if (max < 0) {
		max = 0;
	}
	if (min > text.length) {
		return false;
	}
	if (max < text.length) {
		return false;
	}
	if (text.length < min || text.length > max) {
		return false;
	}
	return true;
  }

  function isRadioChecked(radioButton) {
  	for (i = 0; i < radioButton.length; i++) {
		if (radioButton[i].checked) {
			return true;
		}
	}
	return false;
  }

  function isCheckboxChecked() {
  	if (arguments.length < 1 || arguments.length == 2|| arguments.length > 4) {
		return false;
	}
	var checkbox = arguments[0];
	var mode = arguments[1];
	var min = 0;
	var max = checkbox.length;;
	if (arguments.length == 3) {
		if (arguments[1] == 'at_least') {
			min = arguments[2];
		}
		if (arguments[1] == 'at_most') {
			max = arguments[2];
		}
	}
	if (arguments.length == 4) {
		if (arguments[2] > arguments[3]) {
			return false;
		}
		if (arguments[1] == 'between') {
			min = arguments[2];
			max = arguments[3];
		}
	}
	if (min < 0) {
		min = 0;
	}
	if (min > checkbox.length) {
		min = checkbox.length;
	}
	if (max > checkbox.length) {
		max = checkbox.length;
	}
	if (max < 0) {
		max = 0;
	}
	var count = 0;
	for (i = 0; i < checkbox.length; i++) {
		if (checkbox[i].checked) {
			count = count + 1;
		}
	}
	if (count < min || count > max) {
		return false;
	}
	return true;
  }

  function isItemSelected() {
	if (arguments.length < 1 || arguments.length == 2 || arguments.length > 3) {
		return false;
	}
	var list = arguments[0];
	var min = 0;
	var num = 0;
	while (list[num]) {
		num = num + 1;
	}
	var max = num;
	if (arguments.length == 3) {
		min = arguments[1];
		max = arguments[2];
	}
	var i = 0;
	var count = 0;
	while (list[i]) {
		if (list[i].selected) {
			count = count + 1;
		}
		i = i + 1;
	}
	if (min < 0) {
		min = 0;
	}
	if (max < 0) {
		max = 0;
	}
	if (min > num) {
		min = num;
	}
	if (max > num) {
		max = num;
	}
	if (min > max || count < min || count > max) {
		return false;
	}
	return true;
  }

  function isIP(text) {
  	var IPvalue = text;
	var ipArray=IPvalue.split(".");
	if (IPvalue == "0.0.0.0" || IPvalue == "255.255.255.255") {
		return false;
	}
	if (!ipArray || !ipArray[0] || !ipArray[1] || !ipArray[2] || !ipArray[3] || ipArray.length > 4) {
		return false;
	} else {
  		for (i = 0; i < 4; i++) {
    			thisSegment = ipArray[i];
    			if (thisSegment > 255) {
				return false;
    			}
  		}
	}
  	return true;
  }
  
  function checkAgainstSet(text, set) {
  	var charSet = set;
	for (i = 0; i < text.length; i++) {
		if (charSet.indexOf(text.charAt(i)) == -1) {
			return false;
		}
	}
	return true;
  }
  
  function countOccurences(single, text) {
	var count = 0;
	for (i = 0; i < text.length; i++) {
		if (text.charAt(i) == single) {
			count = count + 1;
		}
	}
	return count;
  }

  function isAddressNumber(text) {
  	var charSet = "0123456789/ -";
	if (this.isEmpty(text)) {
		return true;
	}
	return this.checkAgainstSet(text, charSet);
  }

  function isAddressStreet(txt) {
  	var charSet = "abcdefghijklmnopqrstuvwxyz0123456789 '-.";
	if (this.isEmpty(txt)) {
		return true;
	}
	var text = txt.toLowerCase();
	return this.checkAgainstSet(text, charSet);
  }
  
  function isAddressCity(txt) {
  	var charSet = "abcdefghijklmnopqrstuvwxyz0123456789 '-.";
	if (this.isEmpty(txt)) {
		return true;
	}
	var text = txt.toLowerCase();
	return this.checkAgainstSet(text, charSet);
  }
  
  function isAddressPostalCode(txt) {
  	var charSet = "abcdefghijklmnopqrstuvwxyz0123456789 -";
	if (this.isEmpty(txt)) {
		return true;
	}
	var text = txt.toLowerCase();
	return this.checkAgainstSet(text, charSet);
  }
  
  function isId(string) {
  	var charSet = "abcdefghijklmnopqrstuvwxyz0123456789 '&(),.-/";
	var text = string.toLowerCase();
	if (this.isEmpty(string)) {
		return false;
	}
	if (this.isFirstChar(string, " ")) {
		return false;
	}
	if (!this.isAlpha(string.charAt(0))) {
		return false;
	}
	for (i = 0; i < text.length; i++) {
		if (charSet.indexOf(text.charAt(i)) == -1) {
			return false;
		}
	}
	return true;
  }
  
  this.form = false;
  if (arguments.length == 1) {
	this.form = arguments[0];
  }
  // date validation
  // meetings inputs
  this.isEmpty = isEmpty;
  this.isEmail = isEmail;
  this.isNumber = isNumber;
  this.isNumeric = isNumeric;
  this.isAlpha = isAlpha;
  this.isFirstChar = isFirstChar;
  this.isAlphaNumeric = isAlphaNumeric;
  this.isValidPassword = isValidPassword;
  this.isValidUsername = isValidUsername;
  this.isYear = isYear;
  this.isMonth = isMonth;
  this.isDayOfWeek = isDayOfWeek;
  this.isWithinRange = isWithinRange;
  this.isLong = isLong;
  this.isRadioChecked = isRadioChecked;
  this.isCheckboxChecked = isCheckboxChecked;
  this.isItemSelected = isItemSelected;
  this.isIP = isIP;
  this.isAddressNumber = isAddressNumber;
  this.isAddressStreet = isAddressStreet;
  this.isAddressCity = isAddressCity;
  this.isAddressPostalCode = isAddressPostalCode;
  this.checkAgainstSet = checkAgainstSet;
  this.isId = isId;
  this.countOccurences = countOccurences;
}
