//<![CDATA[
function ValidNonEmptyWOS(elem, alert_msg)
{
	valid_nonempty = false;
	
	if(!isEmpty(elem))
		valid_nonempty = true;
	if(valid_nonempty)
	{
		i = 0;
		while(valid_nonempty && i < elem.value.length)
		{
			ch = elem.value.charAt(i);
			if(!isNonSpecialCase(ch) || isSpace(ch))
				valid_nonempty = false;
			i++;
		}
	}
	if(!valid_nonempty)
	{
		alert(alert_msg);
		elem.focus();
	}
	return valid_nonempty;
}

function ValidNonEmptyWS(elem, alert_msg)
{
	valid_nonempty = false;

	if(!isEmpty(elem))
		valid_nonempty = true;
	if(valid_nonempty)
	{
		i = 0;
		while(valid_nonempty && i < elem.value.length)
		{
			ch = elem.value.charAt(i);
			if(!isNonSpecialCase(ch))
				valid_nonempty = false;
			i++;
		}
	}
	if(!valid_nonempty)
	{
		alert(alert_msg);
		elem.focus();
	}
	return valid_nonempty;
}

function ValidText(elem, alert_msg)
{
	valid_text = true;
	
	i = 0;
	while(valid_text && i < elem.value.length)
	{
		ch = elem.value.charAt(i);
		if(!isLetter(ch) || !isSpace(ch))
			valid_text = false;
		i++;
	}
	if(!valid_text)
	{
		alert(alert_msg);
		elem.focus();
	}
	return valid_text;	
}

function ValidNumeric(elem, alert_msg)
{
	valid_numeric = true;
	
	i = 0;
	while(valid_numeric && i < elem.value.length)
	{
		ch = elem.value.charAt(i);
		if(!isNumber(ch))
			valid_numeric = false;
		i++;
	}
	if(!valid_text)
	{
		alert(alert_msg);
		elem.focus();
	}
	return valid_text;
}

function ValidEMail(value)
{
	valid_email = true;

	at = value.indexOf('@', 0);
	if(at == -1 || at == 0 || at + 4 >= value.length)
		valid_email = false;
	if(valid_email)
	{
		dot = false;
		i = 0
		while(valid_email && i < at)
		{
			ch = value.charAt(i);
			if(!isLetter(ch) && !isNumber(ch) && !isUnderline(ch) && ch != '.')
				valid_email = false;
			if(ch == '.')
				dot ? valid_email = false : dot = true;
			else
				dot = false;
			i++;
		}
	}
	if(valid_email)
	{
		len = 0;
		i = at + 1;
		while(valid_email && i < value.length)
		{
			ch = value.charAt(i);
			if(!isLetter(ch) && !isNumber(ch) && !isUnderline(ch) && ch != '.' && !isDash(ch))
				valid_email = false;
			if(ch == '.')
			{
				valid_email = len > 0;
				len = 0;
			}
			else
				len++;
			i++;
		}
	}
	if(valid_email && (len < 2 || len > 3))
		valid_email = false;
	return valid_email;
}

function ValidPhone(value)
{
	valid_phone = true;
	
	if(value.length == 9)
	{
		i = 0;
		while(valid_phone && i < value.length)
		{
			if(!isNumber(value.charAt(i)))
				valid_phone = false;
			i++;
		}
	}
	else
		valid_phone = false;
	
	return valid_phone;
}

function ValidZipCode(elem, alert_msg)
{
	valid_zipcode = true;
	
	if(elem.value.length == 5)
	{
		i = 0;
		while(valid_zipcode && i < elem.value.length)
		{
			if(!isNumber(elem.value.charAt(i)))
				valid_zipcode = false;
			i++;
		}
	}
	else if(elem.value.length == 6)
	{
		i = 0;
		while(valid_zipcode && i < elem.value.length)
		{
			ch = elem.value.charAt(i);
			if(i == 2)
				if(ch != '-')
					valid_zipcode = false;
				else;
			else if(!isNumber(ch))
				valid_zipcode = false;
			i++;
		}
	}
	else
		valid_zipcode = false;
	if(!valid_zipcode)
	{
		alert(alert_msg);
		elem.focus();
	}
	return valid_zipcode;
}

function ValidNIP(elem, alert_msg)
{
	valid_nip = true;

	if(elem.value.length != 13)
		valid_nip = false;
	if(valid_nip)
	{
		i = 0;
		while(valid_nip && i < elem.value.length)
		{
			ch = elem.value.charAt(i);
			if(i == 3 || i == 6 || i == 9)
				if(ch != '-')
					valid_nip = false;
				else;
			else if(!isNumber(ch))
				valid_nip = false;
			i++;
		}
	}
	if(!valid_nip)
	{
		alert(alert_msg);
		elem.focus();
	}
	return valid_nip;
}

function isLetter(ch)
{
	return ch.toUpperCase() >= 'A' && ch.toUpperCase() <= 'Z';
}

function isNumber(ch)
{
	return ch >= '0' && ch <= '9';
}

function isNonSpecialCase(ch)
{
	return isLetter(ch) || isNumber(ch) || isSpace(ch) || isUnderline(ch);
}

function isSpace(ch)
{
	return ch == ' ';
}

function isUnderline(ch)
{
	return ch == '_';
}

function isDash(ch)
{
	return ch == '-';
}

function isEmpty(elem)
{
	empty = true;
	
	for(i = 0; i < elem.value.length && empty; i++)
		if(!isSpace(elem.value.charAt(i)))
			empty = false;
	return empty;
}

function isAccordantToRegularExp(value, regular_exp){
	ok = true;
	i = 0;
	type = 0;
	useDefinedChars = false;
	varIsLetter = false;
	varIsNumber = false;
	varIsNonSpecialCase = false;
	setCases = false;
	lengthObj = false;
	stringObj = '';
	validationObjectsArr = new Array();
	while(ok && i < regular_exp.length)
	{
		switch(regular_exp.charAt(i))
		{
			case '*':
				if(type == 1)
					ok = false;
				if(ok)
				{
					if(type > 0)
						validationObjectsArr[validationObjectsArr.length] = new ValidationObject(type, useDefinedChars, varIsLetter, varIsNumber, varIsNonSpecialCase, setCases, lengthObj, stringObj);
					type = 1;
					i++;
					useDefinedChars = false;
					setCases = false;
					lengthObj = false;
				}
				break;
			case '"':
				if(type > 0)
					validationObjectsArr[validationObjectsArr.length] = new ValidationObject(type, useDefinedChars, varIsLetter, varIsNumber, varIsNonSpecialCase, setCases, lengthObj, stringObj);
				type = 2;
				i++;
				stringObj = ''
				while(i < regular_exp.length && regular_exp.charAt(i) != '"')
				{
					stringObj += regular_exp.charAt(i);
					i++;
				}
				if(i < regular_exp.length)
					i++;
				else
					ok = false;
				if(ok)
					validationObjectsArr[validationObjectsArr.length] = new ValidationObject(type, useDefinedChars, varIsLetter, varIsNumber, varIsNonSpecialCase, setCases, lengthObj, stringObj);
				type = 0;
				break;
			case '(':
				if(type > 0)
				{
					varIsLetter = false;
					varIsNumber = false;
					varIsNonSpecialCase = false;
					useDefinedChars = true;
					i++;
					while(i < regular_exp.length && regular_exp.charAt(i) != ')')
					{	
						switch(regular_exp.charAt(i))
						{
							case 'L':
								varIsLetter = true;
								break;
							case 'N':
								varIsNumber = true;
								break;
							case 'S':
								varIsNonSpecialCase = true;
								break;
							default:
								i = regular_exp.length;
								ok = false;
								break;
						}
						i++;
					}
					if(i < regular_exp.length)
						i++;
					else
					 ok = false;
				}
				else
					ok = false;
				break;
			case '[':
				if(type > 0)
				{
					setCases = new Array();
					lowRangeLimit = false;
					highRangeLimit = false;
					rangeType = 0;
					i++;
					while(i < regular_exp.length && regular_exp.charAt(i) != ']')
					{
						switch(regular_exp.charAt(i))
						{
							case '"':
								if(rangeType == 0)
								{
									if(i + 2 < regular_exp.length && regular_exp.charAt(i + 2) == '"')
									{
										lowRangeLimit = regular_exp.charAt(i + 1);
										i += 3;
										rangeType = 1;
									}
									else
										ok = false;
								}
								else if (rangeType == 2)
								{
									if(i + 2 < regular_exp.length && regular_exp.charAt(i + 2) == '"')
									{
										highRangeLimit = regular_exp.charAt(i + 1);
										i += 3;
										rangeType = 3;
									}
									else
										ok = false;
								}
								else
									ok = false;
								break;
							case '.':
								if(rangeType >= 0 && rangeType <=1)
									if(i + 1 < regular_exp.length && regular_exp.charAt(i + 1) == '.')
									{
										rangeType = 2;
										i += 2;
									}
									else
										ok = false;
								else
									ok = false;
								break;
							case ',':
								if(rangeType > 0)
								{
									setCases[setCases.length] = new RangeObject(lowRangeLimit, highRangeLimit);
									i++;
								}
								else
									ok = false;
								lowRangeLimit = false;
								highRangeLimit = false;
								rangeType = 0;
								break;
							default:
								i = regular_exp.length;
								ok = false;
								break;
						}
					}
					if(i < regular_exp.length)
					{
						if(rangeType > 0)
						{
							setCases[setCases.length] = new RangeObject(lowRangeLimit, highRangeLimit)
							i++;
						}
						else
							ok = false;
					}
				}
				else
					ok = false;
				break;
			case '{':
				if(type > 0)
				{
					i++;
					lowRangeLimit = false;
					highRangeLimit = false;
					rangeType = 0;
					while(ok && i < regular_exp.length && regular_exp.charAt(i) != '}')
					{ 
						if(!isNaN(parseInt(regular_exp.charAt(i))))
						{
							if(rangeType == 0 || rangeType == 2)
							{
								rangeLimit = parseInt(regular_exp.charAt(i));
								i++;
								while(i < regular_exp.length && !isNaN(parseInt(regular_exp.charAt(i))))
								{
									rangeLimit = rangeLimit * 10 + parseInt(regular_exp.charAt(i));
									i++;
								}
								if(i < regular_exp.length)
									if(rangeType == 0)
									{
										lowRangeLimit = rangeLimit;
										rangeType = 1;
									}
									else
									{
										highRangeLimit = rangeLimit;
										rangeType = 3;
									}
								else
									ok = false;
							}
							else
								ok = false;
						}
						else if(regular_exp.charAt(i) == '.')
						{
							if(rangeType >= 0 && rangeType <= 1)
								if(i + 1 < regular_exp.length && regular_exp.charAt(i) == '.')
								{
									highRangeLimit = -1;
									rangeType = 2;
									i += 2;
								}
								else
									ok = false;
							else
								ok = false;
						}
						else
							ok = false;
					}
					if(ok && i < regular_exp.length)
					{
						if(rangeType > 0)
						{
							lengthObj = new RangeObject(lowRangeLimit, highRangeLimit)
							i++;
						}
						else
							ok = false;
					}
					else
						ok = false;
				}
				else
					ok = false;
				break;
			default:
				ok = false;
				break;
		}
	}
	if(type > 0)
	{
		if(type == 1 && validationObjectsArr.length > 1 && validationObjectsArr[validationObjectsArr.length - 1].type == 1)
			ok = false;
		if(ok)
			validationObjectsArr[validationObjectsArr.length] = new ValidationObject(type, useDefinedChars, varIsLetter, varIsNumber, varIsNonSpecialCase, setCases, lengthObj, stringObj);
	}
	if(ok)
	{
		i = 0;
		j = 0;
		type == 0;
		useDefinedChars = false;
		setCases = false;
		highRangeLimit = false;
		while(ok && i < validationObjectsArr.length && j < value.length)
		{
			type = validationObjectsArr[i].type;
			if(type == 1)
			{
				useDefinedChars = validationObjectsArr[i].useDefinedChars;
				if(useDefinedChars)
				{
					varIsLetter = validationObjectsArr[i].varIsLetter;
					varIsNumber = validationObjectsArr[i].varIsNumber;
					varIsNonSpecialCase = validationObjectsArr[i].varIsNonSpecialCase;
				}
				setCases = validationObjectsArr[i].setCases;
				highRangeLimit = -1;
				if(validationObjectsArr[i].lengthObj != false)
				{
					if(validationObjectsArr[i].lengthObj.lowRangeLimit != false)
					{
						if(j + validationObjectsArr[i].lengthObj.lowRangeLimit <= value.length)
							for(k = 0; ok && k < validationObjectsArr[i].lengthObj.lowRangeLimit; k++)
							{
								if(useDefinedChars)
								{
									ok = false;
									if(varIsLetter)
										ok = ok || isLetter(value.charAt(j + k));
									if(varIsNumber)
										ok = ok || isNumber(value.charAt(j + k));
									if(varIsNonSpecialCase)
										ok = ok || isNonSpecialCase(value.charAt(j + k));
								}
								if(setCases != false)
								{
									oldOk = ok;
									ok = (setCases.length > 0 ? true : ok);
									for(l = 0; ok && l < setCases.length; l++)
									{
										if(setCases[l].lowRangeLimit != false && setCases[l].highRangeLimit != false)
											ok = (value.charAt(j + k) >= setCases[l].lowRangeLimit && value.charAt(j + k) <= setCases[l].highRangeLimit);
										else if(setCases[l].lowRangeLimit != false)
											ok = value.charAt(j + k) >= setCases[l].lowRangeLimit;
										else if(setCases[l].highRangeLimit != false)
											ok = value.charAt(j + k) <= setCases[l].highRangeLimit;
										else
											ok = false;
									}
									ok = oldOk || ok;
								}
							}
						else
							ok = false;
						if(ok)
						{
							if(validationObjectsArr[i].lengthObj.highRangeLimit != false)
								if(validationObjectsArr[i].lengthObj.highRangeLimit != -1)
								{
									highRangeLimit = validationObjectsArr[i].lengthObj.highRangeLimit - validationObjectsArr[i].lengthObj.lowRangeLimit;
									if(highRangeLimit < 0)
										ok = false;
								}
								else
									highRangeLimit = -1;
						}
					}
					else
					{
						if(validationObjectsArr[i].lengthObj.highRangeLimit == false)
							ok = false;
						else if(validationObjectsArr[i].lengthObj.highRangeLimit != -1)
							highRangeLimit = validationObjectsArr[i].lengthObj.highRangeLimit;
						else
							highRangeLimit = -1;
					}
				}
				i++;
			}
			else
			{
				found = false;
				while(ok && !found && j < value.length)
					if(j + stringObj.length <= value.length)
					{
						k = 0;
						while(k < stringObj.length && stringObj.charAt(k) == value.charAt(j + k))
							k++;
						if(k < stringObj.length)
						{
							if(highRangeLimit == false)
								ok = false;
							else if (highRangeLimit == -1 || highRangeLimit > 0)
							{
								if(useDefinedChars)
								{
									ok = false;
									if(varIsLetter)
										ok = ok || isLetter(value.charAt(j));
									if(varIsNumber)
										ok = ok || isNumber(value.charAt(j));
									if(varIsNonSpecialCase)
										ok = ok || isNonSpecialCase(value.charAt(j));
								}
								if(setCases != false)
								{
									oldOk = ok;
									ok = (setCases.length > 0 ? true : ok);
									for(l = 0; ok && l < setCases.length; l++)
									{
										if(setCases[l].lowRangeLimit != false && setCases[l].highRangeLimit != false)
											ok = (value.charAt(j) >= setCases[l].lowRangeLimit && value.charAt(j) <= setCases[l].highRangeLimit);
										else if(setCases[l].lowRangeLimit != false)
											ok = value.charAt(j) >= setCases[l].lowRangeLimit;
										else if(setCases[l].highRangeLimit != false)
											ok = value.charAt(j) <= setCases[l].highRangeLimit;
										else
											ok = false;
									}
									ok = oldOk || ok;
								}
								if(highRangeLimit > 0)
									highRangeLimit=highRangeLimit-1;
								j++;
							}
							else
								ok = false;
						}
						else
						{
							j += k;
							i++;
							found = true;
						}
					}
					else
						ok = false;
				useDefinedChars = false;
				setCases = false;
				highRangeLimit = false;
			}
		}
		if(ok && type > 0)
		{
			if(j < value.length)
			{
				if(type == 1)
				{
					if(highRangeLimit == false)
						ok = false;
					else if(highRangeLimit != -1)
						ok = (j + highRangeLimit >= value.length);
					for(; ok && j < value.length; j++)
					{
						if(useDefinedChars)
						{
							ok = false;
							if(varIsLetter)
								ok = ok || isLetter(value.charAt(j));
							if(varIsNumber)
								ok = ok || isNumber(value.charAt(j));
							if(varIsNonSpecialCase)
								ok = ok || isNonSpecialCase(value.charAt(j));
						}
						if(setCases != false)
						{
							oldOk = ok;
							ok = (setCases.length > 0 ? true : ok);
							for(k = 0; ok && k < setCases.length; k++)
							{
								if(setCases[k].lowRangeLimit != false && setCases[k].highRangeLimit != false)
									ok = (value.charAt(j) >= setCases[k].lowRangeLimit && value.charAt(j) <= setCases[k].highRangeLimit);
								else if(setCases[k].lowRangeLimit != false)
									ok = value.charAt(j) >= setCases[k].lowRangeLimit;
								else if(setCases[k].highRangeLimit != false)
									ok = value.charAt(j) <= setCases[k].highRangeLimit;
								else
									ok = false;
							}
							ok = oldOk || ok;
						}
					}
				}
				else
					ok = false;
			}
			if(ok && i < validationObjectsArr.length)
			{
				while(ok && i < validationObjectsArr.length)
				{
					if(validationObjectsArr[i].type == 1)
					{
						if(validationObjectsArr[i].lengthObj != false)
							if(validationObjectsArr[i].lengthObj.lowRangeLimit != false && validationObjectsArr[i].lengthObj.lowRangeLimit > 0)
								ok = false;
					}
					else
						ok = false;
					i++;
				}
			}
		}
	}
	return ok;
}

function RangeObject(lowRangeLimit, highRangeLimit){
	this.lowRangeLimit = lowRangeLimit;
	this.highRangeLimit = highRangeLimit;
}
					
function ValidationObject(type, useDefinedChars, varIsLetter, varIsNumber, varIsNonSpecialCase, setCases, lengthObj, stringObj)
{
	this.type = type;
	this.useDefinedChars = useDefinedChars;
	this.varIsLetter = varIsLetter;
	this.varIsNumber = varIsNumber;
	this.varIsNonSpecialCase = varIsNonSpecialCase;
	this.setCases = setCases;
	this.lengthObj = lengthObj;
	this.stringObj = stringObj;
}
//]]>
