function Field()
{
}

Field._ERROR_TAG    = "SPAN"
Field._ERROR_PREFIX = "fieldErr_"

Field.getParam = function (name, format) // optional parameter type, default=string
{
	var n = new String(name)
	n.toLowerCase()

	var f = new String(format)
	f.toLowerCase()

	var t
	if (Field.getParam.arguments.length == 2)
		t = "string"
	else
	{
		t = new String(Field.getParam.arguments[2])
		t.toLowerCase()
	}

	var pos = f.indexOf(n+"=")
	if (pos < 0)
		return null

	var prm = f.substring(pos+n.length+1, f.length)
	pos = prm.indexOf(";")
	if (pos > 0)
		prm = prm.substring(0, pos)

	if (t == "string")
		return prm
	else if (t == "boolean")
	{
		if (prm == "true")
			return true
		else if (prm == "false")
			return false

		return null
	}
	else if (t == "int")
	{
		var intPrm = parseInt(prm)
		if (isNaN(intPrm))
			return false

		return intPrm
	}
	else if (t == "float")
	{
		var floatPrm = parseFloat(prm)
		if (isNaN(floatPrm))
			return false

		return floatPrm
	}

	return null
}

Field.isOptionalEmpty = function (str, format)
{
	if ((Field.getParam("optional", format, "boolean") == true) && Field.isWhite(str))
		return true

	return false
}

Field.isInRange = function (value, format, type)
{
	var min = Field.getParam("min", format, type)
	if (min != null)
	{
		if (value < min)
			return false

		var isMinIn = Field.getParam("minIn", format, "boolean")
		if ((isMinIn == false) && (value == min))
			return false
	}

	var max = Field.getParam("max", format, type)
	if (max != null)
	{
		if (value > max)
			return false

		var isMaxIn = Field.getParam("maxIn", format, "boolean")
		if ((isMaxIn == false) && (value == max))
			return false
	}

	return true
}

Field.isWhite = function (str)
{
	for (var i=0; i<str.length; i++)
		if (str.charAt(i) != ' ')
			return false

	return true
}

Field.trim = function (str)
{
	if (Field.trim.arguments.length == 2)
	{
		var format = Field.trim.arguments[1]
		if (Field.getParam("trim", format, "boolean") == false)
			return str
	}

	var size = 0
	for (var i=0; i<str.length; i++)
	{
		if (str.charAt(i) != ' ')
			break

		size++
	}

	if (size == str.length)
		str = "";
	else if (size > 0)
		str = str.substring(size, str.length)

	size = 0;
	for (i=str.length-1; i>0; i--)
	{
		if (str.charAt(i) != ' ')
			break

		size++
	}

	if (size > 0)
		str = str.substring(0, str.length-size)

	return str
}

Field.trimLeft0 = function (str)
{
	var size = 0;
	for (var i=0; i<str.length; i++)
	{
		if (str.charAt(i) != '0')
			break

		size++
	}

	if (size == str.length)
		str = ""
	else if (size > 0)
		str = str.substring(size, str.length)

	return str
}

Field.trimRight0 = function (str)
{
	var size = 0;
	size = 0;
	for (var i=str.length-1; i>0; i--)
	{
		if (str.charAt(i) != '0')
			break

		size++
	}

	if (size == str.length)
		str = "";
	if (size > 0)
		str = str.substring(0, str.length-size)

	return str
}

Field.isAlphabetic = function (str)
{
	str = Field.trim(str)
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if (!((ch >= "a") && (ch <= "z")) &&
			!((ch >= "A") && (ch <= "Z")))
			return false
	}

	return true
}

Field.isAlphaSpace = function (str)
{
	str = Field.trim(str)
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if (!((ch >= "a") && (ch <= "z")) &&
			!((ch >= "A") && (ch <= "Z")) &&
			 (ch != " "))
			return false
	}

	return true
}

Field.isNumeric = function (str)
{
	str = Field.trim(str)
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if ((ch < "0") || (ch > "9"))
			return false
	}

	return true
}

Field.isAlphaNumeric = function (str)
{
	str = Field.trim(str)
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if (!((ch >= "0") && (ch <= "9")) &&
			!((ch >= "a") && (ch <= "z")) &&
			!((ch >= "A") && (ch <= "Z")))
			return false
	}

	return true
}

Field.isAlphaNumericSpace = function (str)
{
	str = Field.trim(str)
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if (!((ch >= "0") && (ch <= "9")) &&
			!((ch >= "a") && (ch <= "z")) &&
			!((ch >= "A") && (ch <= "Z")) &&
			(ch != " "))
			return false
	}

	return true
}

Field.isInt = function (str)
{
	var format = ""
	if (Field.isInt.arguments.length == 2)
		format = Field.isInt.arguments[1]

	if (Field.isOptionalEmpty(str, format))
		return true

	var test = new String(str)
	test = Field.trim(test, format)

	var intRes = parseInt(test)
	if (isNaN(intRes))
		return false

	if (test.charAt(0) == '+')
		test = test.substring(1, test.length)

	if (test != String(intRes))
		return false

	return Field.isInRange(intRes, format, "int")
}

Field.isFloat = function (str)
{
	var format = ""
	if (Field.isFloat.arguments.length == 2)
		format = Field.isFloat.arguments[1]

	if (Field.isOptionalEmpty(str, format))
		return true

	var test = new String(str)
	test = Field.trim(test, format)

	var floatRes = parseFloat(test)
	if (isNaN(floatRes))
		return false

	if (test.charAt(0) == '+')
		test = test.substring(1, test.length)

	var pos = test.indexOf('.')
	if (pos < 0)
	{
		if (!Field.isInt(test))
			return false
	}
	else
	{
		if (test.length == 1)
			return false

		if (pos == 0)
		{
			test = test.substring(1, test.length)
			test = Field.isInt(test)
			if ((test.length > 0) && !Field.isInt(test))
				return false
		}
		else if (pos == (test.length-1))
		{
			test = test.substring(0, test.length-1)
			if (!Field.isInt(test))
				return false
		}
		else
		{
			var test1 = test.substring(0, pos)
			  var test2 = test.substring(pos+1, test.length)
			if (!Field.isInt(test1))
				return false

			test2 = Field.trimLeft0(test2)
			if ((test2.length > 0) && !Field.isInt(test2))
				return false
		}
	}

	return Field.isInRange(floatRes, format, "float")
}

Field.isCreditCard = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	if (str.length < 14)
		return false

	if (!Field.isNumeric(str))
		return false

	var sum   = 0
	var start = str.length - 2
	var flag  = true
	for (var i=start; i>=0; i--)
	{
		var code = parseInt(str.charAt(i))
		if (flag)
		{
			code <<= 1
			if (code > 9)
				code -= 9
		}

		sum += code

		flag = !flag
	}

	var sum2 = sum + 9
	sum2 -= (sum2 % 10)

	return (sum2 - sum) == parseInt(str.charAt(str.length-1))
}

Field.isCardSecurityCode = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)

	if (str.length < 3)
		return false

	if (str.length > 4)
		return false

	if (!Field.isNumeric(str))
		return false

	return true
}

Field.isUserName = function (str)
{
	if (!str)
		return false

	return Field.isAlphaSpace(str)
}

Field.isCRSName = function (str)
{
	if (!str)
		return false

	var sum = 0;
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i);
		if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))
			sum++;
		else
		{
			if ((ch != ' ') && (ch != '#') && (ch != '-') && (ch != '.') && (ch != '\''))
				return false;
		}
	}

	return (sum >= 2);
}

Field.isCRSAddress = function (str)
{
	if (!str)
		return false

	var sum = 0;
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i);
		if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))
			sum++;
		else
		{
			if ((ch != ' ') && !((ch >= '0') && (ch <= '9')) && (ch != '#') && (ch != '-') && (ch != '.') && (ch != '\''))
				return false;
		}
	}

	return (sum >= 2);
}

Field.isEmail = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	if (str.length == 0)
		return false

	if (str.indexOf(' ') >= 0)
		return false

	if(str.indexOf(';') >= 0)
		return false

	if(str.indexOf(',') >= 0)
		return false

	var indA = str.indexOf('@')
	if (indA <= 0)
		return false

	var indB = str.lastIndexOf('@')
	if(indA != indB)
		return false

	var indPoint = str.lastIndexOf('.')
	if ((indPoint < (indA+2)) || (indPoint == (str.length-1)))
		return false

	return true
}

Field.isEmailList = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	if (str.length == 0)
		return false

	var email = ""
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if ((ch == ",") || (ch == ";"))
		{
			if (!Field.isEmail(email))
				return false

			email = ""
		}
		else
			email += ch
	}

	return Field.isEmail(email)
}

Field.isPostalCode = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)

	if (str.length == 5)
		return Field.isNumeric(str)

	if (str.length != 10)
		return false

	if (str.charAt(5) != "-")
		return false

	return Field.isNumeric(str.substring(0, 5)) && Field.isNumeric(str.substring(6))
}

Field.isIntlPostalCode = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)

	var sum = 0
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if (ch == ' ')
			continue

		if (((ch >= 'a') && (ch <= 'z')) ||
			((ch >= 'A') && (ch <= 'Z')) ||
			((ch >= '0') && (ch <= '9')))
		{
			sum++
			continue
		}

		return false
	}

	return (sum >= 5) && (sum <= 10)
}

Field.isCAPostalCode = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	if ((str.length < 6) || (str.length > 7))
		return false

	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if (ch == ' ')
		{
			if (i != 3)
				return false

			continue
		}

		if (((ch >= 'a') && (ch <= 'z')) ||
			((ch >= 'A') && (ch <= 'Z')) ||
			((ch >= '0') && (ch <= '9')))
			continue

		return false
	}

	return true
}

Field.isARCNumber = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	if (str.length != 8)
		return false

	return Field.isNumeric(str)
}

Field.getDigitsNum = function (str)
{
	if (!str)
		return 0

	str = Field.trim(str)

	var num = 0
	for (var i=0; i<str.length; i++)
	{
		if (Field.isNumeric(str.charAt(i)))
			num++
	}

	return num
}

Field.getAlphaNumericNum = function (str)
{
	if (!str)
		return 0

	str = Field.trim(str)

	var num = 0
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		if (Field.isNumeric(ch) || Field.isAlphabetic(ch))
			num++
	}

	return num
}

Field.isCRSPhone = function (str, minAlphaNumerics)
{
	if (!str)
		return false

	str = Field.trim(str)
	var sum = 0;
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i);
		if ((ch == ' ') || (ch == '-'))
			continue;

		if (!((ch >= '0') && (ch <= '9')) && !((ch >= 'a') && (ch <= 'z')) && !((ch >= 'A') && (ch <= 'Z')))
			return false;

	   sum++;
	}

	return sum >= minAlphaNumerics;
}

Field.isPhone = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	return Field.isAlphaNumeric(str) && (str.length >= 7)
}

Field.isPhoneCountry = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	return Field.isNumeric(str)
}

Field.isPhoneArea = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	return Field.isNumeric(str)
}

Field.isPhoneExt = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	return Field.isNumeric(str)
}

Field.clearAllErrors = function (span)
{
	if (!document.getElementById)
		return

	var objs = document.getElementsByTagName(Field._ERROR_TAG)
	if (!objs)
		return

	for (var i=0; i<objs.length; i++)
	{
		var obj = objs[i]
		if (obj.id.indexOf(Field._ERROR_PREFIX) != 0)
			continue

		var name = obj.id.substring(Field._ERROR_PREFIX.length, obj.id.length)
		Field.clearError(name)
	}
}

Field.clearError = function (span)
{
	if (!document.getElementById)
		return

		span = Field._ERROR_PREFIX + span
		var obj = document.getElementById(span)
		if (obj)
			obj.style.color = ""
}

Field.setError = function (span)
{
	if (!document.getElementById)
		return

	span = Field._ERROR_PREFIX + span
	var obj = document.getElementById(span)
	if (obj)
		obj.style.color = "#CC0000"
}

Field.escape = function (str)
{
	if ((str == null) || (str == ""))
		return str

	str = escape(str)

	var res = ""
	for (var i=0; i<str.length; i++)
	{
		var ch = str.charAt(i)
		switch (ch)
		{
			case "+": res += "%2B"; break
			case "/": res += "%2F"; break
			default:  res += ch
		}
	}

	return res
}

Field._onEnterEvent = function (e)
{
	var key = 0
	var obj = null
	if (document.all)
	{
		key = window.event.keyCode
		obj = window.event.srcElement
	}
	else
	{
		key = e.which
		obj = e.target
	}

	if ((key == 13) && obj && obj._FieldOnEnterAction)
	{
		eval(obj._FieldOnEnterAction)
		return false
	}
}

Field.onEnter = function (formId, fieldId, action)
{
	var field = document.forms[formId][fieldId]
	field.onkeydown = Field._onEnterEvent
	field._FieldOnEnterAction = action
}

Field.toPrice = function (floatVal)
{
	floatVal = Math.round(floatVal*100) / 100

	var str = "" + floatVal
	var pos = str.indexOf(".")
	if (pos < 0)
		str += ".00"
	else if (pos == 0)
		str = "0" + str
	else if (pos == (str.length-1))
		str += "00"
	else if (pos == (str.length-2))
		str += "0"
	else if (pos < (str.length-3))
		str = str.substring(0, pos+3)

	pos = str.indexOf(".")

	var res = ""
	for (var i=0; i<pos; i++)
	{
		if ((i != 0) && !(i%3))
			res = "," + res
		res = str.charAt(pos-i-1) + res
	}

	return res + str.substring(pos)
}

Field.isPassportNumber = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	if (!str || (str.length < 5) || (str.length > 18))
		return false

	return Field.isAlphaNumeric(str)
}

Field.isFrequentFlyerNumber = function (str)
{
	if (!str)
		return false

	str = Field.trim(str)
	if (!str || (str.length < 6) || (str.length > 11))
		return false

	return Field.isAlphaNumeric(str)
}
