function init(frmName)
{
   var frmObject = "";
   var frmReturn = true;
   var frmErrorTxt = "";
   var n_frmObject = "";
   var frmValidate = "";
   var color = "";
   var defColor = "#CCCCCC";
   var showColor = 0;

   var fieldData = new Array();
   var frmData = new Array();

   var checkData = new Array();
   checkData[0] = "required";
   checkData[1] = "numeric";
   checkData[2] = "string";
   checkData[3] = "alphanum";
   checkData[4] = "email";
   checkData[5] = "minlen";
   checkData[6] = "maxlen";
   checkData[7] = "float";
   checkData[8] = "noselect";
   checkData[9] = "nochecked";
   checkData[10] = "date";
   checkData[11] = "url";
   checkData[12] = "phone";
   checkData[13] = "fileext";
   checkData[14] = "noequals";
   checkData[15] = "icq";
   checkData[16] = "year";

   var errorMessage = new Array();
   errorMessage[checkData[0]] = "All fields * are required unless noted as optional";
   errorMessage[checkData[1]] = "Value must be numerical";
   errorMessage[checkData[2]] = "Field must contain only letters";
   errorMessage[checkData[3]] = "Field must contain only numbers and letters";
   errorMessage[checkData[4]] = "Field must contain email address";
   errorMessage[checkData[5]] = "A quantity of symbols must be not less %s. Current quantity - %s";
   errorMessage[checkData[6]] = "A quantity of symbols must be not more %s. Current quantity - %s";
   errorMessage[checkData[7]] = "Format of the field: 00.00";
	errorMessage[checkData[8]] = "A field is incorrect, try again.";
//   errorMessage[checkData[8]] = "Select the value, which is differed from \"%s\"";
   errorMessage[checkData[9]] = "Field must be isolated";
   errorMessage[checkData[10]] = "Field must be date. Format of the field: %s";
   errorMessage[checkData[11]] = "Incorrect URL";
   errorMessage[checkData[12]] = "Incorrect number of telephone";
   errorMessage[checkData[13]] = "Sorry, currently we do not support this image format";
   errorMessage[checkData[14]] = "%s you've entered do not match";
   errorMessage[checkData[15]] = "The data are not number ICQ";
   errorMessage[checkData[16]] = "Year must be not less 1901 and not more current year";

   var addErrorMessage = new Array();
   addErrorMessage["incorrectDate"] = "The date does not exist";

   frmObject = document.forms[frmName];

   this.checkText = function(frmTxt)
   {

      var checkedFrmTxt = frmTxt.replace(/(^ +)|( +$)/,"");
      var defaultError = "";
      defaultError = errorMessage[frmValidate];
      frmErrorTxt = (checkedFrmTxt.length > 0)? checkedFrmTxt : defaultError;
      return;
   }


   this.setFocus = function()
   {
   	if(n_frmObject.type != "hidden" && n_frmObject.disabled == false)
   	{
   		n_frmObject.focus();
   	}
   	return;
   }

   this.setColor = function(nCol)
   {
   	color = nCol;
   	return;
   }

	this.showColorer = function(flag)
   {
   	flag = (flag == 0 || flag == 1)? flag : 0;
   	showColor = flag;

   	return;
   }

   this.inColor = function()
   {
   	var nColor = color;
      if(!nColor)
      {
      	nColor = defColor;
      }

   	n_frmObject.style.background = nColor;
   	return;
   }

   this.checkColor = function()
   {
   	var tmpObjColor = n_frmObject.style.background.toString().toLowerCase();

   	var nColor = color;
      if(!nColor)
      {
      	nColor = defColor;
      }
   	var tmpCurrColor = nColor.toLowerCase();

   	if(tmpObjColor == tmpCurrColor)
   	{
   		return true;
   	}
   	return false;
   }

   this.noColor = function()
   {
   	n_frmObject.style.background = "";
   	return;
   }

   this.checkValue = function(value)
   {
   	n_frmObject.value = n_frmObject.value.replace(/(^ +)|( +$)/,"");
   }

   this.addReqField = function(fieldName, frmName)
   {
   	var flag = 0;
   	for(var i in fieldData)
   	{
   		if(fieldData[i] == fieldName)
   		{
   			flag = 1;
   		}
   	}

   	if(flag == 0)
   	{
   		fieldData[fieldData.length] = fieldName;
   		frmData[fieldData.length] = frmName;
   	}
   }

   this.getErrorMessage = function(errorData)
   {
   	var startPoint = 0;
   	var endPoint = 0;
   	var tmpMsg = frmErrorTxt;
   	var endPoint = tmpMsg.search(/\%s/i);
   	var tmpNewMsg = "";
   	var trueMsg = "";

   	if(typeof errorData == "object" && endPoint != -1)
   	{
   		for(i in errorData)
   		{
   			tmpNewMsg = tmpMsg.substring(startPoint, endPoint + 2);
   			tmpMsg = tmpMsg.substr(endPoint + 2, tmpMsg.length);
   			endPoint = tmpMsg.search(/\%s/i);
   			trueMsg += tmpNewMsg.replace("%s", errorData[i]);
   		}

   		startPoint = frmErrorTxt.lastIndexOf("%s");
   		endPoint = frmErrorTxt.length;
   		trueMsg += frmErrorTxt.substring(startPoint + 2, endPoint);

   		frmErrorTxt = trueMsg;
   	}
   	return;
   }

   // Проверяем на обязательное заполнение
   this.addReqValidation = function(frmTxt)
   {
   	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "required";
   	var invalidFields = new Array();
   	var counter = 0;
   	var firstElement = "";

   	for(i in fieldData)
   	{
   		n_frmObject = frmObject[fieldData[i]];
   		this.checkText(frmTxt);
   		this.checkValue();

      	if(n_frmObject.value.length == 0)
      	{
	      	if(showColor == 1)
      		{
      			this.inColor();
      		}
      		firstElement = (firstElement.length == 0)? fieldData[i] : firstElement;
      		invalidFields[counter++] = n_frmObject;
      	}
      	else
      	{
      		//if(this.checkColor() == true)
      		//{
      			this.noColor();
      		//}
      	}
      }

      if(invalidFields.length > 0)
      {
   		n_frmObject = frmObject[firstElement];
			alert(frmErrorTxt);
      	this.setFocus();
      	frmReturn = false;
      	return false;
      }

     	frmReturn = true;

   	fieldData = new Array();
   	frmData = new Array();

     	return true;
   }


   // Проверяем на цифровые значения
   this.addNumValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "numeric";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();
   	searchExpr = /[^0-9 ]/gi;

   	if(n_frmObject.value.length != 0 && n_frmObject.value.search(searchExpr) != -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;
   	return true;
   }

   // Проверяем чтобы в значении были только буквы
   this.addStringValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "string";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();
   	searchExpr = /[^A-Z ]/gi;

   	if(n_frmObject.value.length != 0 && n_frmObject.value.search(searchExpr) != -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;
   	return true;
   }

   // Проверяем наличие букв и цифр
   this.addAlphaNumValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "alphanum";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();
   	searchExpr = /[^0-9A-Z_ ]/gi;

   	if(n_frmObject.value.length != 0 && n_frmObject.value.search(searchExpr) != -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;
   	return true;
   }

   // Проверяем корректность email
   this.addEmailValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "email";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();
   	searchExpr = /^[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*@[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*\.([A-Za-z]){2,4}$/i;

   	if(n_frmObject.value.length != 0 && n_frmObject.value.search(searchExpr) == -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;
   	return true;
   }

   // Проверяем на минимальное кол-во символов
   this.addMinLengthValidation = function(frmName, frmTxt, nLength)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "minlen";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();
   	var valueLength = n_frmObject.value.length;

   	if(valueLength != 0 && valueLength < nLength)
   	{
   		var errorData = new Array(nLength, valueLength);
   		this.getErrorMessage(errorData);

   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }

   // Проверяем на максимальное кол-во символов
   this.addMaxLengthValidation = function(frmName, frmTxt, nLength)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "maxlen";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();
   	var valueLength = n_frmObject.value.length;

   	if(valueLength != 0 && valueLength > nLength)
   	{
   		var errorData = new Array(nLength, valueLength);
   		this.getErrorMessage(errorData);

   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }


// Проверяем значение float
   this.addFloatValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "float";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();
   	searchExpr = /^[0-9]*(\.)?[0-9]*$/ig;

   	if(n_frmObject.value.length != 0 && n_frmObject.value.search(searchExpr) == -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }

   this.addNoSelectValidation = function(frmName, frmTxt, invalidValue)
   {
     	if(frmReturn == false || frmObject[frmName].type != "select-one")
   	{
   		return false;
   	}

   	frmValidate = "noselect";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();

		for(n = 0; n < n_frmObject.options.length; n++)
      {
      	if(n_frmObject.options[n].selected == true)
      	{
      		selectedOption = n_frmObject.options[n];
      	}
      }

   	if(selectedOption.value == invalidValue)
   	{
   		var errorData = new Array(selectedOption.text);
   		this.getErrorMessage(errorData);

   		alert(frmErrorTxt);

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }

   this.addNoCheckedValidation = function(frmName, frmTxt, invalidValue)
   {
     	if(frmReturn == false || frmObject[frmName].type != "checkbox")
   	{
   		return false;
   	}

   	frmValidate = "nochecked";
   	n_frmObject = frmObject[frmName];
   	this.checkText(frmTxt);
   	this.checkValue();

   	if(n_frmObject.checked == false)
   	{
   		alert(frmErrorTxt);

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }

   this.addDateValidation = function(frmName, frmTxt, dateTemplate)
   {

     	if(frmReturn == false)
   	{
   		return false;
   	}

      var a = new Array();
      a["%d"] = "((1|2)\\d|3[01]|0?[1-9])";
	   a["%m"] = "(1[012]|0?[1-9])";
	   a["%y"] = "(19\\d{2}|2(0\\d{2}|1[0]{2}))";
      dMask = dateTemplate;

   	var delimiterData = new Array();
   	frmValidate = "date";
   	n_frmObject = frmObject[frmName];
      tDate = n_frmObject.value;

   	this.checkText(frmTxt);
   	this.checkValue();

   	if(n_frmObject.value.length == 0)
   	{
   		return true;
   	}

      var delimiter = this.searchDelimiter(dMask);
   	var mask = this.searchMask(dMask);
   	var tmpMask = "";

      for(i in mask)
	   {
	      if(tmpMask.length == 0)
	      {
	         tmpMask = a[mask[i]];
	      }
	      else
	      {
	         tmpMask += "\\" + delimiter + a[mask[i]];
	      }
	   }

	   var tMsg = "";
	   var sMask = "^(" + tmpMask+ ")$";

	   var rExp = new RegExp(sMask);

	   if(rExp.exec(tDate) == null)
	   {
         var errorData = new Array(dateTemplate);
   		this.getErrorMessage(errorData);

   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
	   }

	   if(this.searchDate(tDate, dMask) == false)
      {

         alert(addErrorMessage["incorrectDate"]);

         if(showColor == 1)
         {
            this.inColor();
         }

         frmReturn = false;
         return false;
      }

      this.noColor();
   	frmReturn = true;

   	return true;
   }

	this.searchDelimiter = function(dMask)
	{
	   delimiter = dMask.substr(2, 1);
	   return delimiter;
	}

	this.searchMask = function(dMask)
	{
	   var sMask = new Array();
	   sMask[0] = dMask.substr(0, 2);
	   sMask[1] = dMask.substr(3, 2);
	   sMask[2] = dMask.substr(6, 2);
	   return sMask;
	}

   this.checkDayExists = function(tDate, delimiter)
	{
   	var sDate = new Array();

	   i = tDate.search(/\D/);
	   sDate[0] = tDate.substring(0, i);
	   tDate = tDate.substring(i + 1);

	   i = tDate.search(/\D/);
	   sDate[1] = tDate.substring(0, i);
	   tDate = tDate.substring(i + 1);

	   sDate[2] = tDate;

	   return sDate;
	}

	this.searchDate = function(tDate, dMask)
	{
	   var sMask = this.searchMask(dMask);
	   var delimiter = this.searchDelimiter(dMask);
	   var sDate = this.checkDayExists(tDate, delimiter);

	   var sYear = 0;
	   var sMonth = 0;
	   var sDay = 0;

	   for(i in sMask)
	   {
	      switch(sMask[i])
	      {
	         case("%y"):
	            sYear = sDate[i];
	         break;

	         case("%m"):
	            sMonth = (sDate[i] * 1) - 1;
	         break;

	         case("%d"):
	            sDay = (sDate[i] * 1);
	         break;
	      }
	   }

	   var i = new Date(sYear, sMonth, sDay);
	   day = i.getDate();

	   var tMsg = "";

	   if(day != sDay)
	   {
	      return false;
	   }
      return true;
	}

   // Проверяем на корректность URL
   this.addURLValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	n_frmObject = frmObject[frmName];

   	if(n_frmObject.value.length == 0)
   	{
   		return true;
   	}

   	frmValidate = "url";
   	this.checkText(frmTxt);
   	this.checkValue();

      sMask = /^(http:\/\/(www\.)?|www\.)\w*\.([a-z]{2}|[a-z]{3})/;

   	if(n_frmObject.value.search(sMask) == -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }

   // Проверяем на корректность Телефона
   this.addPhoneValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	n_frmObject = frmObject[frmName];

   	if(n_frmObject.value.length == 0)
   	{
   		return true;
   	}

   	frmValidate = "phone";
   	this.checkText(frmTxt);
   	this.checkValue();

      sMask = /^(\+)?[0-9\-() ]*$/;

   	if(n_frmObject.value.search(sMask) == -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }

   this.addEqualField = function(fieldName, frmName)
   {
   	var flag = 0;
   	for(var i in fieldData)
   	{
   		if(fieldData[i] == fieldName)
   		{
   			flag = 1;
   		}
   	}

   	if(flag == 0)
   	{
   		fieldData[fieldData.length] = fieldName;
   		frmData[fieldData.length] = frmName;
   	}
   }

// Проверяем на корректность файлового расширения
   this.addFileExtentionValidation = function(frmName, frmTxt, validExtentions)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	n_frmObject = frmObject[frmName];

   	if(n_frmObject.value.length == 0)
   	{
   		return true;
   	}

      if(validExtentions == "" || validExtentions == null)
      {
      	// По умолчанию присваиваем проверку для изображений.
      	var validExtentions = new Array("jpg", "jpeg", "png");
      }

   	frmValidate = "fileext";
   	this.checkText(frmTxt);
   	//this.checkValue();

      var sMask = /\.(\w*)$/;
      var t = sMask.exec(n_frmObject.value);
      var fExt = RegExp.$1.toLowerCase();

      var nFlag = 0;
      for(i in validExtentions)
      {
      	if(validExtentions[i] == fExt)
         {
         	nFlag = 1;
            break;
         }
      }

   	if(nFlag == 0)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}
   	this.noColor();
   	frmReturn = true;

   	return true;
   }

// Проверяем на обязательное заполнение
   this.addEqualValidation = function(frmTxt)
   {
   	if(frmReturn == false)
   	{
   		return false;
   	}

   	frmValidate = "noequals";
   	var invalidFields = new Array();
   	var counter = 0;
   	var n_counter = 0;
   	var flag = 0;
   	var firstElement = "";

   	for(i in fieldData)
   	{
   		n_frmObject = frmObject[fieldData[i]];
   		this.checkText(frmTxt);
   		this.checkValue();

      	if(n_counter != 0 && a != n_frmObject.value)
      	{
				if(flag == 0)
				{
					firstElement = i;
				}
      		invalidFields[counter++] = n_frmObject;
      		flag = 1;
      	}
   		a = n_frmObject.value;
   		n_counter++;
      }

      if(invalidFields.length > 0)
      {
			for(i in fieldData)
   		{
   			n_frmObject = frmObject[fieldData[i]];
        		if(showColor == 1)
        		{
        			this.inColor();
        		}
         }

   		n_frmObject = frmObject[firstElement];

			var tmpMessage = "";

			for(i in frmData)
   		{
   			if(frmData[i].length > 0)
   			{
					tmpMessage += (tmpMessage.length == 0)? "\"" + frmData[i] + "\"" : ", \"" + frmData[i] + "\"";
				}
         }

   		var errorData = new Array(tmpMessage);
   		this.getErrorMessage(errorData);
			alert(frmErrorTxt);
      	this.setFocus();
      	frmReturn = false;
      	return false;
      }

     	frmReturn = true;

   	fieldData = new Array();
   	frmData = new Array();

     	return true;
	}

   // Проверяем на корректность ICQ номера
   this.addICQValidation = function(frmName, frmTxt)
   {
     	if(frmReturn == false)
   	{
   		return false;
   	}

   	n_frmObject = frmObject[frmName];

   	if(n_frmObject.value.length == 0)
   	{
   		return true;
   	}

   	frmValidate = "icq";
   	this.checkText(frmTxt);
   	this.checkValue();

      sMask = /[^0-9\- ]/;

   	if(n_frmObject.value.search(sMask) != -1)
   	{
   		alert(frmErrorTxt);
   		this.setFocus();

   		if(showColor == 1)
   		{
   			this.inColor();
   		}

   		frmReturn = false;
   		return false;
   	}

      this.noColor();
      frmReturn = true;

   	return true;
   }

   // Проверяем на корректность введённого года
   this.addYearValidation = function(frmName, frmTxt)
   {
      if(frmReturn == false)
      {
         return false;
      }

      n_frmObject = frmObject[frmName];

      if(n_frmObject.value.length == 0)
      {
         return true;
      }

      frmValidate = "year";
      this.checkText(frmTxt);
      this.checkValue();

      var nNow = new Date();
      if(!this.addNumValidation(frmName, ""))
      {
         frmReturn = false;
         return false;
      }

      if(!this.addMinLengthValidation(frmName, "", 4))
      {
         frmReturn = false;
         return false;
      }

      if(!this.addMaxLengthValidation(frmName, "", 4))
      {
         frmReturn = false;
         return false;
      }
      var currYear = (nNow.getYear() < 1900)? nNow.getYear() + 1900 : nNow.getYear();

      if(n_frmObject.value.length > 0 &&
         (n_frmObject.value < 1901 || n_frmObject.value > currYear))
      {
         alert(frmTxt);
         this.setFocus();

         if(showColor == 1)
         {
         	this.inColor();
         }

         frmReturn = false;
         return false;
      }

      this.noColor();
      frmReturn = true;
   	return true;
   }
}