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 != '.')
				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(elem, alert_msg)
{
	valid_phone = true;
	
	if(!valid_phone)
	{
		alert(alert_msg);
		elem.focus();
	}
	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 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;

}
