// Class validateForm ver 1.0
// Taras.Andrussjak@gmail.com
// yAnTar
/*
  num = number (from 1 digit to 2 digit, when 1 digit - to tochne spivpadinnya)
  nem = not empty
  eq = equal - 2 polya vkazuvaty
  em = email
  nat = natural digit (>0)
  reg = regular expression
  chk - is checkbox checked
  fl  = is float and>0
  fl|em  = (is float and>0) or empty
  notn = not null (for select)
  eqne = value must equal and not empty
  less = length muss less then %s symbols
  more = length muss more then %s symbols
  date = check is date
  date|em = check is date or empty

*/

function validateForm(nameForm, arrayId, arrayType, arrayParams, arrayErrorMessages, typeShowError, backCurrent, backError){
   this.idEl       	  = arrayId;
   this.type       	  = arrayType;
   this.params     	  = arrayParams;
   this.messages   	  = arrayErrorMessages;
   this.errorsMsg  	  = new Array();
   this.errorId    	  = new Array();
   this.current    	  = 0;
   this.end        	  = this.idEl.length;
   this.errorMsg      = '';
   this.typeShowError = typeShowError; 	// 1 = showErrors 2 = highlightFields 3 = 1 + 2
   this.backCurrent   = backCurrent;
   this.backError     = backError;
   this.nameForm	  = nameForm;

   this.addError = function(){
      if (this.getType() == 'eqne' || this.getType() == 'eq') {
        this.errorId[this.errorId.length] = this.getParam();
      }
      this.errorId[this.errorId.length] = this.getId();
      this.errorsMsg[this.errorsMsg.length] = this.getMessage();
   }

   this.parseNumber = function(){
      var reg = /^(\d*),(\d*)$/;
      var pattern = (reg.test(this.getParam())) ?  (new RegExp('^(\\d){' + RegExp.$1 + ',' + RegExp.$2 + '}$')) : (new RegExp('^(\\d){' + this.getParam() + '}$'));
      if (!pattern.test(this.getValue(0))){
         this.addError();
      }
   }

   this.checkNumber = function(pattern){
	  this.parseNumber();
   }

   this.checkFloat = function(){
      var value = parseFloat(this.getValue(0));
      if (isNaN(value) || value <=0) this.addError();
   }

   this.checkRegular = function(){
     var pattern = new RegExp(this.getParam());
     if (!pattern.test(this.getValue(0))) this.addError();
   }

   this.checkFloatOrEmpty = function(){
      var value = parseFloat(this.getValue(0));
      if (!this.checkNotEmptyFunc(this.getValue())) return true; else this.checkFloat();
   }

   this.checkNotNull = function(){
      if (this.getValue(0) == 0) this.addError();
   }

   this.checkMoreLength = function(){
   	if (this.getValue(0).length<this.getParam()) this.addError();
   }

   this.checkLessLength = function(){
   	if (this.getValue(0).length>this.getParam()) this.addError();
   }

   this.checkEqualNotEmpty = function(notEmpty){
      var element2 = this.getValue(0);
      var element1 = this.getValue(this.getParam());
      if (element1 != element2){
      	 this.addError();
      } else if (notEmpty) {
      	 if (!this.checkNotEmptyFunc(element1)){
            this.addError();
         }
      }
   }

   this.checkNotEmptyFunc = function(value){
      var pattern = /\S/;
      return (value) ? (pattern.test(value)) : (pattern.test(this.getValue(0)));
   }

   this.checkNotEmpty = function(){
    if (!this.checkNotEmptyFunc()){
     	this.addError();
     }
   }

   this.checkMail = function(){
      var pattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	  if (!pattern.test(this.getValue(0))){
	  	this.addError();
	  }
   }

   this.checkDate = function(){
      var tempDate = this.getValue(0);
      var pattern = new RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$");
      if (pattern.test(tempDate)){
         var year = RegExp.$1;
         var month = RegExp.$2;
         var day = RegExp.$3;
         if (parseInt(month) < 1 || parseInt(month) > 12){
         	this.addError();
         } else if (year>2020 || year < 1900){
         	this.addError();
         } else if (parseInt(day) < 1 || parseInt(day) > 31){
         	this.addError();
         }
      } else {
      	 this.addError();
      }
   }

   this.checkDateOrEmpty = function(){
      if (!this.checkNotEmptyFunc(this.getValue())) return true; else this.checkDate();
   }


   this.naturalNumber = function(){
      var value = parseInt(this.getValue(0));
      if (isNaN(value) || value <=0) this.addError();
   }

   this.checked = function(){
   	 if (!this.$().checked) this.addError();
   }

   this.getType = function(){
   	return this.type[this.current];
   }

   this.getForm = function(){
   	return document.forms[nameForm];
   }

   this.getId = function(){
   	return this.idEl[this.current];
   }

   this.getParam = function(){
   	   return this.params[this.current];
   }

   this.getMessage = function(){
   	   return this.messages[this.current];
   }

   this.getCurrent = function(){
   	   return this.idEl[this.current];
   }


   this.next = function(){
   	   this.current++;
   }

   this.notEnd = function(){
   	   return (this.current < this.end);
   }

   // Yakscho peredayu 0, to beru potochnyi element
   this.$ = function(idElement){
      return (idElement) ? (document.getElementById(idElement)) : (document.getElementById(this.getCurrent()));
   }

   // Yakscho peredayu 0, to beru potochnyi element
   this.getValue = function(idElement){
	   if (!idElement){
	   	  var element = this.$(this.getCurrent());
	   } else {
	      var element = this.$(idElement);
	   }
	   switch(element.type){
	   	 case 'select-one':
	       return element.options[element.selectedIndex].value;
	       break;
	     case 'radio':
	     case 'checkbox':
	       return element.checked;
	       break;
	     case 'text':
	     case 'password':
	     case 'textarea':
	       return element.value;
	       break;
	   }
   }

   this.validate = function(){
     while(this.notEnd()){
     	if (this.$(0)){
          switch(this.getType()){
        	  case 'num':
        	    this.checkNumber();
                break;
              case 'nem':
                this.checkNotEmpty();
                break;
              case 'em':
                this.checkMail();
                break;
              case 'nat':
                this.naturalNumber();
                break;
              case 'chk':
                this.checked();
                break;
              case 'fl':
                this.checkFloat();
                break;
              case 'fl|em':
                this.checkFloatOrEmpty();
                break;
              case 'notn':
                this.checkNotNull();
                break;
              case 'eq':
                this.checkEqualNotEmpty(0);
                break;
              case 'eqne':
                this.checkEqualNotEmpty(1);
                break;
              case 'more':
                this.checkMoreLength();
                break;
              case 'less':
                this.checkLessLength();
                break;
              case 'date':
                this.checkDate(this.getParam());
                break;
              case 'reg':
                this.checkRegular();
                break;
              case 'date|em':
                this.checkDateOrEmpty(this.getParam());
                break;
         }
     	}
     	this.next();
     }

     if (this.errorsMsg.length){
        this.$(this.errorId[0]).focus();
        switch(this.typeShowError){
        	case 1:   this.showErrors();
        	          break;
            case 2:   this.highlightFields();
                      break;
            case 3:   this.showErrors();
            		  this.highlightFields();
            		  break;
        }
        return false;
     } else {
     	return true;
     }
   }


   this.showErrors = function(){
     var countErrors = this.errorsMsg.length;
     for (var i = 0; i < countErrors; i++){
        this.errorMsg += this.errorsMsg[i] + "\n";
     }
     alert (this.errorMsg);
   }

   this.unhighlightFields = function(){
     var form = this.getForm();
     var countElements = form.length;
     for (i = 0; i < countElements; i++){
       	if (form.elements[i].type == 'button' || form.elements[i].type == 'submit' || form.elements[i].type == 'hidden')
       	  continue;
       	else if (form.elements[i].type == 'checkbox')
       	  form.elements[i].parentNode.style.backgroundColor = this.backCurrent;
       	else 
       	  form.elements[i].style.backgroundColor = this.backCurrent;
     }
   }

   this.highlightFields = function(){
     this.unhighlightFields()
     var countErrors = this.errorId.length;
     for (var i = 0; i < countErrors; i++){
		 if (this.$(this.errorId[i]).type == 'checkbox'){
			this.$(this.errorId[i]).parentNode.style.backgroundColor = this.backError;
		 } else {
			this.$(this.errorId[i]).style.backgroundColor = this.backError;
		 }
         
     }
   }
}