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";
   checkData[17] = "time";
   checkData[18] = "passwdmatch";

   var errorMessage = new Array();
   errorMessage[checkData[0]] = "Field %s is mandatory.";
   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.\nPassword must be between eight(8) and ten(10) characters long. No spaces are permitted and passwords are not case sensitive.\nPlease try again.";
   errorMessage[checkData[15]] = "The data are not number ICQ";
   errorMessage[checkData[16]] = "Year must be not less 1901 and not more current year";
   errorMessage[checkData[17]] = "Time must be have format hh:mm";
   errorMessage[checkData[18]] = "Passwords do not match";

   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;
      n_frmObject.style.borderColor = "red";
      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.backgroundColor = "";
      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[frmData.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)
      {

         var tmpMessage = new Array();

         var mErr = (frmTxt.length > 0)? frmTxt : errorMessage["required"];

         for(i in invalidFields)
         {
            for(j in fieldData)
            {
               if(invalidFields[i].name == fieldData[j] && frmData[j].length > 0)
               {
                  tmpMessage[tmpMessage.length] = mErr.replace(/%s/, "'" + frmData[j] + "'");
               }
            }
         }

         alert(tmpMessage.join("\n"));

         n_frmObject = frmObject[firstElement];
         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.addIntValidation = 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;
   }

   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;
   }

   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;
   }

   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;
   }

   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;
   }

   this.addTimeValidation = function(frmName, frmTxt)
   {
      if(frmReturn == false)
      {
         return false;
      }

      n_frmObject = frmObject[frmName];

      if(n_frmObject.value.length == 0)
      {
         return true;
      }

      frmValidate = "time";
      this.checkText(frmTxt);
      this.checkValue();

      sMask = /(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])/;

      if(n_frmObject.value.search(sMask) == -1)
      {
         alert(frmTxt);
         this.setFocus();

         if(showColor == 1)
         {
            this.inColor();
         }

         frmReturn = false;
         return false;
      }

      this.noColor();
      frmReturn = true;
      return true;
   }

   this.addPasswordMatchValidation = function(frmName, frmNameConfirm, frmTxt)
   {
      if(frmReturn == false)
      {
         return false;
      }

      frmValidate = "passwdmatch";
      n_frmObject = frmObject[frmName];
      m_frmObject = frmObject[frmNameConfirm];

      this.checkText(frmTxt);
      this.checkValue();

      if(n_frmObject.value.length < 1 || n_frmObject.value != m_frmObject.value)
      {
         alert(frmErrorTxt);
         this.setFocus();

         if(showColor == 1)
         {
            this.inColor();
         }

         frmReturn = false;
         return false;
      }
      this.noColor();
      frmReturn = true;
      return true;
   }
}