var commonValidatorGlobalErrors = "";
var commonValidatorFocusField="";
var bFunctionPrefix ="";
function validateRequired(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oRequired = eval('new ' + bFunctionPrefix  + 'required()');
   for (x in oRequired) {
   	var field = form[oRequired[x][0]];
   
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'file' ||
           field.type == 'select-one' ||
           field.type == 'select-multiple' ||
           field.type == 'radio' ||
           field.type == 'password') {
           
           var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           
           if (trim(value).length == 0) {
           
	           if (i == 0) {
	               focusField = field;
	           }
	           fields[i++] = oRequired[x][1];
	           isValid = false;
           }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
            }
            
            // Trim whitespace from left and right sides of s.
function trim(s) {
   return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
            }
function validateMinLength(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oMinLength = eval('new ' + bFunctionPrefix  + 'minlength();');
   for (x in oMinLength) {
       var field = form[oMinLength[x][0]];
       
       if (field.type == 'text' ||
           field.type == 'textarea') {
           
           var iMin = parseInt(oMinLength[x][2]("minlength"));
           if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
               if (i == 0) {
      focusField = field;
               }
               fields[i++] = oMinLength[x][1];
               isValid = false;
           }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
            }
function validateMaxLength(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oMaxLength = eval('new ' + bFunctionPrefix  + 'maxlength()');
   for (x in oMaxLength) {
       var field = form[oMaxLength[x][0]];
       if (field != null){
	       if (field.type == 'text' ||
	           field.type == 'textarea') {
	           
	           var iMax = parseInt(oMaxLength[x][2]("maxlength"));
	           if (field.value.length > iMax) {
	               if (i == 0) {
	      focusField = field;
	               }
	               fields[i++] = oMaxLength[x][1];
	               isValid = false;
	           }
	       }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
   }
function validateMask(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oMasked = eval('new ' + bFunctionPrefix  + 'mask()');
   for (x in oMasked) {
       var field = form[oMasked[x][0]];
       
       if ((field.type == 'text' || 
            field.type == 'textarea') && 
            (field.value.length > 0)) {
           
           if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
               if (i == 0) {
      focusField = field;
               }
               fields[i++] = oMasked[x][1];
               isValid = false;
           }
       }
   }
   
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
            }

function matchPattern(value, mask) {
  return mask.exec(value);
            }
            
function validateByte(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oByte = eval('new ' + bFunctionPrefix  + 'ByteValidations()');
   for (x in oByte) {
   	var field = form[oByte[x][0]];
   	
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'select-one' ||
						field.type == 'radio') {

						var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           
           if (value.length > 0) {
               if (!isAllDigits(value)) {
      bValid = false;
      if (i == 0) {
          focusField = field;
      }
      fields[i++] = oByte[x][1];

               } else {

	               var iValue = parseInt(value);
	               if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
	      if (i == 0) {
	          focusField = field;
	      }
	      fields[i++] = oByte[x][1];
	      bValid = false;
	               }
               }
						}
						
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
            }
            
function validateShort(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oShort = eval('new ' + bFunctionPrefix  + 'ShortValidations()');
   for (x in oShort) {
   	var field = form[oShort[x][0]];
   	
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'select-one' ||
           field.type == 'radio') {
           
           var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           
           if (value.length > 0) {
               if (!isAllDigits(value)) {
      bValid = false;
      if (i == 0) {
          focusField = field;
      }
      fields[i++] = oShort[x][1];

               } else {
           
	               var iValue = parseInt(value);
	               if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
	      if (i == 0) {
	          focusField = field;
	      }
	      fields[i++] = oShort[x][1];
	      bValid = false;
	               }
	          }
          }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
            }


function validateInteger(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oInteger = eval('new ' + bFunctionPrefix  + 'IntegerValidations()');
   for (x in oInteger) {
   	var field = form[oInteger[x][0]];   
   	 
   	if (field != null){
	       if (field.type == 'text' ||
	           field.type == 'textarea' ||
	           field.type == 'select-one' ||
	           field.type == 'radio') {
	           var value = '';						
							
							// get field's value
							if (field.type == "select-one") {           
								var si = field.selectedIndex;
							    if (si >= 0) {
								    value = field.options[si].value;
							    }
							} else {
								value = field.value;
							}						
	           if (value.length > 0) {
	           
	               if (!isAllDigits(value)) {
	      bValid = false;
	      if (i == 0) {
		      focusField = field;
		               }
							        fields[i++] = oInteger[x][1];
							        
	               } else {
		               var iValue = parseInt(value);
		               if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
		      if (i == 0) {
		          focusField = field;
		      }
		      fields[i++] = oInteger[x][1];
		      bValid = false;
		              }
	              }
	          }          
	       }
       }        
   }
   
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
            }

function isAllDigits(argvalue) {
   argvalue = argvalue.toString();
   var validChars = "0123456789";
   var startFrom = 0;
   if (argvalue.substring(0, 2) == "0x") {
      validChars = "0123456789abcdefABCDEF";
      startFrom = 2;
   } else if (argvalue.charAt(0) == "0") {
      validChars = "01234567";
      startFrom = 1;
   } else if (argvalue.charAt(0) == "-") {
       startFrom = 1;
   }
   
   for (var n = startFrom; n < argvalue.length; n++) {
       if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
   }
   return true;
            }
            
function validateFloat(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oFloat = eval('new ' + bFunctionPrefix  + 'FloatValidations()');
   for (x in oFloat) {
   	var field = form[oFloat[x][0]];
   	
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'select-one' ||
           field.type == 'radio') {
           
       	var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
							    value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           
           if (value.length > 0) {
               // remove '.' before checking digits
               var tempArray = value.split('.');
               var joinedString= tempArray.join('');

               if (!isAllDigits(joinedString)) {
      bValid = false;
      if (i == 0) {
          focusField = field;
      }
      fields[i++] = oFloat[x][1];

               } else {
	               var iValue = parseFloat(value);
	               if (isNaN(iValue)) {
	      if (i == 0) {
	          focusField = field;
	      }
	      fields[i++] = oFloat[x][1];
	      bValid = false;
	               }
               }
           }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
            }
function validateDouble(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oFloat = eval('new ' + bFunctionPrefix  + 'DoubleValidations()');
   for (x in oFloat) {
   	var field = form[oFloat[x][0]];
   	
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'select-one' ||
           field.type == 'radio') {
           
       	var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
							    value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           
           if (value.length > 0) {
               // remove '.' before checking digits
               var tempArray = value.split('.');
               var joinedString= tempArray.join('');

               if (!isAllDigits(joinedString)) {
      bValid = false;
      if (i == 0) {
          focusField = field;
      }
      fields[i++] = oFloat[x][1];

               } else {
	               var iValue = parseFloat(value);
	               if (isNaN(iValue)) {
	      if (i == 0) {
	          focusField = field;
	      }
	      fields[i++] = oFloat[x][1];
	      bValid = false;
	               }
               }
           }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
            }
            
function validateDate(form) {
  var bValid = true;
  var focusField = null;
  var i = 0;
  var fields = new Array();
  oDate = eval('new ' + bFunctionPrefix  + 'DateValidations()');
  
  
  for (x in oDate) {
      var value = form[oDate[x][0]].value;
					
				    //ubacio djuRa, da bi ovo radilo dobro, ispred jednocifrenih brojeva (dan, mesec, treba ubaciti 0)
				    var separator =findDateSeparator(value);

					pos  = value.indexOf(separator);
					pos1 = value.indexOf(separator,pos+1);
					if (!( (pos<=0) || (pos1<=0) || (pos1!=(value.length-4-1)) )) {
						dan    = value.substr(0,pos);
						mesec  = value.substring(pos+1,value.length-5);
						godina = value.substr(pos1+1, value.length);
						if (dan.length<2)
							dan = '0'+dan;
						if (mesec.length<2)
							mesec = '0'+mesec;
							value = dan + separator+mesec+separator+godina;
					}
      var datePattern = oDate[x][2]("datePatternStrict");
										
				    //ubacio djuRa sledeca 4 reda, da bi ovo radilo dobro
      if (datePattern==null)
	      datePattern = oDate[x][2]("datePattern");

					var djT = "js.";
					if (datePattern.length>djT.length && datePattern.substring(0,djT.length)==djT) {
						djX = datePattern.substring(djT.length);
						datePattern = eval(djX);
					}
						
					// ako treba raditi dodatne validacije datuma, ubaciti ih ovde
						
      if ((form[oDate[x][0]].type == 'text' ||
           form[oDate[x][0]].type == 'textarea') &&
          (value.length > 0) &&
          (datePattern.length > 0)) {
        var MONTH = "MM";
        var DAY = "dd";
        var YEAR = "yyyy";
        var orderMonth = datePattern.indexOf(MONTH);
        var orderDay = datePattern.indexOf(DAY);
        var orderYear = datePattern.indexOf(YEAR);
        
        if ((orderDay < orderYear && orderDay > orderMonth)) {

            var iDelim1 = orderMonth + MONTH.length;
            var iDelim2 = orderDay + DAY.length;
            var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
            var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
            if (iDelim1 == orderDay && iDelim2 == orderYear) {
               dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
            } else if (iDelim1 == orderDay) {
               dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
            } else if (iDelim2 == orderYear) {
               dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
            } else {
               dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
            }
            var matched = dateRegexp.exec(value);
            if(matched != null) {
               if (!isValidDate(matched[2], matched[1], matched[3])) {
     if (i == 0) {
         focusField = form[oDate[x][0]];
     }
     fields[i++] = oDate[x][1];
     bValid =  false;
               }
            } else {
               if (i == 0) {
      focusField = form[oDate[x][0]];
               }
               fields[i++] = oDate[x][1];
               bValid =  false;
            }
        } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
        
            var iDelim1 = orderDay + DAY.length;
            var iDelim2 = orderMonth + MONTH.length;
            var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
            var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
            if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
            } else if (iDelim1 == orderMonth) {
                dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
            } else if (iDelim2 == orderYear) {
                dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
            } else {
                dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
            }
            var matched = dateRegexp.exec(value);
            
            if(matched != null) {
                if (!isValidDate(matched[1], matched[2], matched[3])) {
       if (i == 0) {
           focusField = form[oDate[x][0]];
       }
       fields[i++] = oDate[x][1];
       bValid =  false;
    }    
            } else {
                if (i == 0) {
       focusField = form[oDate[x][0]];
                }
                fields[i++] = oDate[x][1];
                bValid =  false;
            }
        } else if ((orderMonth > orderYear && orderMonth < orderDay)) {

            var iDelim1 = orderYear + YEAR.length;
            var iDelim2 = orderMonth + MONTH.length;
            var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
            var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
            if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
            } else if (iDelim1 == orderMonth) {
                dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
            } else if (iDelim2 == orderDay) {
                dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
            } else {
                dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
            }
            var matched = dateRegexp.exec(value);
            if(matched != null) {
                if (!isValidDate(matched[3], matched[2], matched[1])) {
       if (i == 0) {
           focusField = form[oDate[x][0]];
        }
        fields[i++] = oDate[x][1];
        bValid =  false;
    }
             } else {
    if (i == 0) {
        focusField = form[oDate[x][0]];
    }
    fields[i++] = oDate[x][1];
    bValid =  false;
             }
        } else {

            if (i == 0) {
                focusField = form[oDate[x][0]];
            }
            fields[i++] = oDate[x][1];
            bValid =  false;
        }        
     }    
  }

  if (fields.length > 0) {
     if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
     commonValidatorGlobalErrors +=fields.join('\n');
  }

  return bValid;
            }

	    function isValidDate(day, month, year) {
	        	if (month < 1 || month > 12) {
       return false;
   }
   if (day < 1 || day > 31) {
       return false;
   }
   if ((month == 4 || month == 6 || month == 9 || month == 11) &&
       (day == 31)) {
       return false;
   }
   if (month == 2) {
       var leap = (year % 4 == 0 &&
     (year % 100 != 0 || year % 400 == 0));
       if (day>29 || (day == 29 && !leap)) {
           return false;
       }
   }   
   return true;
            }

function validateRange(form) {
   return validateIntRange(form);
            }

function validateIntRange(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oRange = eval('new ' + bFunctionPrefix  + 'intRange()');
   for (x in oRange) {
       var field = form[oRange[x][0]];
       
       if ((field.type == 'text' ||
            field.type == 'textarea') &&
           (field.value.length > 0)) {
           
           var iMin = parseInt(oRange[x][2]("min"));
           var iMax = parseInt(oRange[x][2]("max"));
           var iValue = parseInt(field.value);
           if (!(iValue >= iMin && iValue <= iMax)) {
               if (i == 0) {
      focusField = field;
               }
               fields[i++] = oRange[x][1];
               isValid = false;
           }
       }
   }
   if (fields.length > 0) {
       if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
       commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
            }
            
function validateFloatRange(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oRange = eval('new ' + bFunctionPrefix  + 'floatRange()');
   for (x in oRange) {
       var field = form[oRange[x][0]];
       
       if ((field.type == 'text' ||
            field.type == 'textarea') &&
           (field.value.length > 0)) {
           
           var fMin = parseFloat(oRange[x][2]("min"));
           var fMax = parseFloat(oRange[x][2]("max"));
           var fValue = parseFloat(field.value);
           if (!(fValue >= fMin && fValue <= fMax)) {
               if (i == 0) {
      focusField = field;
               }
               fields[i++] = oRange[x][1];
               isValid = false;
           }
       }
   }
   if (fields.length > 0) {
       if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
       commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
            }
            
function validateCreditCard(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oCreditCard = eval('new ' + bFunctionPrefix  + 'creditCard()');
   for (x in oCreditCard) {
       if ((form[oCreditCard[x][0]].type == 'text' ||
            form[oCreditCard[x][0]].type == 'textarea') &&
           (form[oCreditCard[x][0]].value.length > 0)) {
           if (!luhnCheck(form[oCreditCard[x][0]].value)) {
               if (i == 0) {
      focusField = form[oCreditCard[x][0]];
               }
               fields[i++] = oCreditCard[x][1];
               bValid = false;
           }
       }
   }
   if (fields.length > 0) {
       if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
       commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
            }

            /**
             * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
             */
function luhnCheck(cardNumber) {
   if (isLuhnNum(cardNumber)) {
       var no_digit = cardNumber.length;
       var oddoeven = no_digit & 1;
       var sum = 0;
       for (var count = 0; count < no_digit; count++) {
           var digit = parseInt(cardNumber.charAt(count));
           if (!((count & 1) ^ oddoeven)) {
               digit *= 2;
               if (digit > 9) digit -= 9;
           };
           sum += digit;
       };
       if (sum == 0) return false;
       if (sum % 10 == 0) return true;
   };
   return false;
            }

function isLuhnNum(argvalue) {
   argvalue = argvalue.toString();
   if (argvalue.length == 0) {
       return false;
   }
   for (var n = 0; n < argvalue.length; n++) {
       if ((argvalue.substring(n, n+1) < "0") ||
           (argvalue.substring(n,n+1) > "9")) {
           return false;
       }
   }
   return true;
            }
            
function validateEmail(form) {
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oEmail = eval('new ' + bFunctionPrefix  + 'email()');
   for (x in oEmail) {
       if ((form[oEmail[x][0]].type == 'text' ||
            form[oEmail[x][0]].type == 'textarea') &&
           (form[oEmail[x][0]].value.length > 0)) {
           if (!checkEmail(form[oEmail[x][0]].value)) {
               if (i == 0) {
      focusField = form[oEmail[x][0]];
               }
               fields[i++] = oEmail[x][1];
               bValid = false;
           }
       }
   }
   if (fields.length > 0) {
       if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
       commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
            }

            /**
             * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
             * http://javascript.internet.com
             */
function checkEmail(emailStr) {
  if (emailStr.length == 0) {
      return true;
  }
  var emailPat=/^(.+)@(.+)$/;
  var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
  var validChars="\[^\\s" + specialChars + "\]";
  var quotedUser="(\"[^\"]*\")";
  var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
  var atom=validChars + '+';
  var word="(" + atom + "|" + quotedUser + ")";
  var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
  var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
  var matchArray=emailStr.match(emailPat);
  if (matchArray == null) {
      return false;
  }
  var user=matchArray[1];
  var domain=matchArray[2];
  if (user.match(userPat) == null) {
      return false;
  }
  var IPArray = domain.match(ipDomainPat);
  if (IPArray != null) {
      for (var i = 1; i <= 4; i++) {
         if (IPArray[i] > 255) {
            return false;
         }
      }
      return true;
  }
  var domainArray=domain.match(domainPat);
  if (domainArray == null) {
      return false;
  }
  var atomPat=new RegExp(atom,"g");
  var domArr=domain.match(atomPat);
  var len=domArr.length;
  if ((domArr[domArr.length-1].length < 2) ||
      (domArr[domArr.length-1].length > 3)) {
      return false;
  }
  if (len < 2) {
      return false;
  }
  return true;
            }
            
            
function validateJMBG(form) {
            	var greska= "";
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oJmbg = eval('new ' + bFunctionPrefix  + 'jmbg()');
   for (x in oJmbg) {
   	var field = form[oJmbg[x][0]];
   	
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'file' ||
           field.type == 'select-one' ||
           field.type == 'radio' ||
           field.type == 'password') {
           
           var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           if (trim(value).length > 0) 
	           greska= proveraJMBG(value, oJmbg[x][0]);
           if (greska!='') {
           
	           if (i == 0) {
	               focusField = field;
	           }
	           fields[i++] = oJmbg[x][1];
	           isValid = false;
           }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=greska+'\n';
   }
   return isValid;
            }

function isteCifre(jmbg){
  prvaCifra = parseInt(jmbg.substr(0 , 1));	
  for (count = 1; count < jmbg.length; count++)  {
	  if ( prvaCifra != parseInt(jmbg.substr(count , 1)) )
	  	 return false;
  }	  
  return true;
}

function vestackiJMBG(jmbg){
	return ( parseInt(jmbg.substr(7 , 1))== 6 )	;
}

function ispravanJMBGPoModulu(jmbg) {
	   ostatak = (
	   			  parseInt(jmbg.substr(0 , 1))  * 7 +
				  parseInt(jmbg.substr(1 , 1))  * 6 +
				  parseInt(jmbg.substr(2 , 1))  * 5 +
				  parseInt(jmbg.substr(3 , 1))  * 4 +
				  parseInt(jmbg.substr(4 , 1))  * 3 +
				  parseInt(jmbg.substr(5 , 1))  * 2 +
				  parseInt(jmbg.substr(6 , 1))  * 7 +
				  parseInt(jmbg.substr(7 , 1))  * 6 +
				  parseInt(jmbg.substr(8 , 1))  * 5 +
				  parseInt(jmbg.substr(9 , 1))  * 4 +
				  parseInt(jmbg.substr(10, 1))  * 3 +
				  parseInt(jmbg.substr(11, 1))  * 2   )%11;
						 				 				 				 
       if (ostatak == 1) 
       		return false;
       if (ostatak == 0) 
     	   zadnjaCifra = 0;
	   else 
       	   // dozvoljen ostatak po modulu
           zadnjaCifra =  11 - ostatak;

	   if (parseInt(jmbg.substr(12 , 1)) != zadnjaCifra)
	      return false;
 	   else 
     	 return true;
}

function proveraJMBG(jmbg, nazivPolja){
   		var errors="";

    	// provera da li je na osmom mestu jmbg cifra 6
	    if ( vestackiJMBG( jmbg ) )
		 	errors += "- Polje " + nazivPolja + " ne sme imati cifru 6 na osmom mestu. \n";    	
	
    	// provera da li je jmbg po modulu 11
    	if (! ( ispravanJMBGPoModulu( jmbg ) ) )
     		errors += "- Polje " + nazivPolja + " mora biti po modulu 11. \n";    
    
	    // provera da li je duzina polja jmbg 13
    	if ( jmbg.length != 13 )
 	   		errors += "- Polje " + nazivPolja + " mora biti du\u017Eine 13. \n";

	 	// provera da li je sadrzaj polja jmbg broj
    	if ( isNaN ( jmbg )  ) 
 	   		errors += "- Polje " + nazivPolja + " mora biti broj. \n";
	 	else { // provera da li su svi brojevi isti
			if ( isteCifre( jmbg ) && ( jmbg.length == 13 ) )
				errors += "- Polje " + nazivPolja + " ne sme sadr\u017Eati iste cifre. \n";			 	
	 	} 
	 	return errors;
}

function showCommonValidatorErrors(errors) {
	if ( errors.length > 0 ){        
		msg =  "________________________________\n\n";
		msg += "Errors:\n"
		msg += "________________________________\n\n";
		
		alert(msg + errors );
		errors = "";
	}
}

function validateNasaSlova(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oNasaSlova = eval('new ' + bFunctionPrefix  + 'nasaSlova()');
   for (x in oNasaSlova) {
   	var field = form[oNasaSlova[x][0]];
   	
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'file' ||
           field.type == 'select-one' ||
           field.type == 'radio' ||
           field.type == 'password') {
           
           var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           
           if (!testNasaSlova(value)) {
           
	           if (i == 0) {
	               focusField = field;
	           }
	           fields[i++] = oNasaSlova[x][1];
	           isValid = false;
           }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
}

function testNasaSlova(s) {
	var pattern = /[^ertu iopasdfghjklzcvbnm??????????-]/i;
    return ( pattern.test(s) ) ? false : true;
} 
function testNasaIStranaSlova(s) {
	var pattern = /[^qw yxertuiopasdfghjklzcvbnm??????????-]/i;
    return ( pattern.test(s) ) ? false : true;
}

function validateNasaIStranaSlova(form) {
   var isValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oNasaIStranaSlova = eval('new ' + bFunctionPrefix  + 'nasaIStranaSlova()');
   for (x in oNasaIStranaSlova) {
   	var field = form[oNasaIStranaSlova[x][0]];
   	
       if (field.type == 'text' ||
           field.type == 'textarea' ||
           field.type == 'file' ||
           field.type == 'select-one' ||
           field.type == 'radio' ||
           field.type == 'password') {
           
           var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
           
           if (!testNasaIStranaSlova(value)) {
           
	           if (i == 0) {
	               focusField = field;
	           }
	           fields[i++] = oNasaIStranaSlova[x][1];
	           isValid = false;
           }
       }
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return isValid;
}
function validateVeciDate(form) {
  var bValid = true;
  var focusField = null;
  var i = 0;
  var fields = new Array();
  oDate = eval('new ' + bFunctionPrefix  + 'veciDate()');
  
  
  for (x in oDate) {
      var valueDatum1 = form[oDate[x][0]].value;
      var valueDatum2 = form[oDate[x][2]("secondProperty")].value;
      if ( (isDate(valueDatum1, form[oDate[x][0]])=='') && (isDate(valueDatum2, form[oDate[x][2]("secondProperty")])=='') ) {
	      if (veciDatum(valueDatum1, valueDatum2)) {
	           if (i == 0) {
      focusField = form[oDate[x][2]("secondProperty")];
               }
               fields[i++] = oDate[x][1];
               bValid = false; 
           }
	    }
      
  }
  if (fields.length > 0) {
     if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
     commonValidatorGlobalErrors +=fields.join('\n');
  }
  return bValid;
}
function validateVeciOdDanasnjeg(form) {
  var bValid = true;
  var focusField = null;
  var i = 0;
  var fields = new Array();
  oDate = eval('new ' + bFunctionPrefix  + 'veciDateOdDanasnjeg()');
  
  
  for (x in oDate) {
      var valueDatum1 = form[oDate[x][0]].value;
     
      if ( (isDate(valueDatum1, form[oDate[x][0]])=='') ) {
	      if (veciDatum(valueDatum1, getCurrentDateAsString())) {
	           if (i == 0) {
      focusField = form[oDate[x][0]];
      
               }
               fields[i++] = oDate[x][1];
               bValid = false; 
           }
	    }
      
  }
  if (fields.length > 0) {
     if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
     commonValidatorGlobalErrors +=fields.join('\n');
  }
  return bValid;
}
function validateBarJedanReq(form) {
            var isValid = false;
            var focusField = null;
            var i = 0;
            var fields = new Array();
            oBarJedanReq = eval('new ' + bFunctionPrefix  + 'barJedanReq()');
            for (x in oBarJedanReq) {
            	var field = form[oBarJedanReq[x][0]];
            	if (field.type == 'text' ||
       field.type == 'textarea' ||
       field.type == 'file' ||
       field.type == 'select-one' ||
       field.type == 'radio' ||
       field.type == 'password') {
       
       var value = '';
					// get field's value
					if (field.type == "select-one") {
						var si = field.selectedIndex;
						if (si >= 0) {
							value = field.options[si].value;
						}
					} else {
						value = field.value;
					}
       
       if (trim(value).length > 0) {
						return true;
					} else {
						if (i == 0) {
               focusField = field;
           }
           var j=1;
           while(form[oBarJedanReq[x][2]("var" + j)] != null ) {
           	var prom = form[oBarJedanReq[x][2]("var" + j)];
           	var promvalue = prom.value;
           	if (trim(promvalue).length > 0) 
									return true; 
							j++;
           }
           fields[i++] = oBarJedanReq[x][1];
					}
   }
            }
          if (fields.length > 0) {
              if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
              commonValidatorGlobalErrors +=fields.join('\n');
          }      
          return isValid;    
}		
function validateSlovaPremaJeziku(form) {
   var sc = "\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0408\u0402\u0409\u040A\u040B\u040F ";
   var sr = "ABVGDEZIJKLMNOPRSTUFHC\u0160\u0110\u0106\u010C\u017D";
   var en = "QWERTYUIOPASDFGHJKLZXCVBNM ";
   var sq = "A\u00C1BCDE\u00C9FGHI\u00CDJKLMNO\u00D3\u00D6\u0150PRSTU\n00DA\n00DC\n0170VZ ";
   var bg = "\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042C\u042E\u042F ";
   var fr = "AZERTYUIOPQSDFGHJKLMWXCVBN\u00C7 ";
   var de = "QWERTZUIOP\n00DCASDFGHJKL\u00D6\u00C4YXCVBNM ";
   var hu = "A\u00C1BCDE\u00C9FGHI\u00CDJKLMNO\u00D3\u00D6\u0150PRSTU\u00DA\u00DC\u0170VZ\u0139Y ";
   var mk = "\u0410\u0411\u0412\u0413\u0414\u0403\u0415\u0416\u0417\u0405\u0418\u0408\u041A\u041B\u0409\u041C\u041D\u040A\u041E\u041F\u0420\u0421\u0422\u040C\u0423\u0424\u0425\u0426\u0427\u040F\u0428 ";
   var ro = "A\u0102\u00C2BCDEFGHI\u00CEJKLMNOPRS\u015ET\u0162UVXZ ";
   var sk = "A\u00C1\u00C4BC\u010CD\u010EE\u00C9FGHI\u00CDJKL\u0139\u013DMN\u0147O\u00D3\u00D4PR\u0154S\u0160T\u0164U\u00DAVY\u00DDZ\u017D ";
   var sl = "QWERTZUIOPASDFGHJKLYXCVBNM\u0160\u0110\u0106\u010C\u017D ";
   var es = "QWERTYUIOPASDFGHJKL\n00D1ZXCBNM ";
   var uk = "\u0410\u0411\u0412\u0413\u0490\u0414\u0415\u0404\u0416\u0417\u0418\u0406\u0407\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042C\u042E\u042F ";
   var val = "";
   
   var bValid = true;
   var focusField = null;
   var i = 0;
   var fields = new Array();
   oSlova = eval('new ' + bFunctionPrefix  + 'slovaJezika()');
   
   
   for (x in oSlova) {
       var param = form[oSlova[x][0]].value;
       var jezik = form[oSlova[x][2]("jezik")].value;
       
       if ( trim(param).length > 0) {
       	    if (jezik=="SR")
		    	val=sr;
		    else if (jezik=="EN")
		    	val=en;	
		  	else if (jezik=="SQ")
		    	val=sq;
		    else if (jezik=="BG")
		    	val=bg;
		    else if (jezik=="FR")
		    	val=fr;
		    else if (jezik=="DE")
		    	val=de;
		    else if (jezik=="HU")
		    	val=hu;
		    else if (jezik=="MK")
		    	val=mk;
		    else if (jezik=="RO")
		    	val=ro;
		    else if (jezik=="SK")
		    	val=sk;
		    else if (jezik=="SL")
		    	val=sl;
		    else if (jezik=="ES")
		    	val=es;
		    else if (jezik=="UK")
		    	val=uk;
		    else if (jezik=="SC")
    			val=sc;
    		
//    	   alert("azbuka=" + val);
//    	   alert("jezik=" + jezik);
//    	   alert("param=" + param);
    	   var parmUpp = param.toUpperCase();	
           for (j=0; j<parmUpp.length; j++) {
			   if (val.indexOf(parmUpp.charAt(j),0) == -1) {
			   		if (i == 0) {
	       focusField = form[oSlova[x][2]("jezik")];
	   }
	   fields[i++] = oSlova[x][1];
	   bValid = false; 
	   break;
	            }
			}
          
         }
       
   }
   if (fields.length > 0) {
      if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
   }
   return bValid;
}  

function validateTwoFields(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oTwoFields = eval('new ' + bFunctionPrefix  + 'twofields()');
    for (x in oTwoFields) {
    	var field = form[oTwoFields[x][0]];
        var secondField = form[oTwoFields[x][2]("secondProperty")];
    	
        if (field.type == 'text' ||
            field.type == 'textarea' ||
            field.type == 'select-one' ||
            field.type == 'radio' ||
            field.type == 'password') {
            
            var value;
            var secondValue;
			// get field's value
			if (field.type == "select-one") {
				var si = field.selectedIndex;
				value = field.options[si].value;
   secondValue = secondField.options[si].value;
			} else {
				value = field.value;
   secondValue = secondField.value;
			}
            
            if (value != secondValue) {
            
   if (i == 0) {
       focusField = field;
   }
   fields[i++] = oTwoFields[x][1];
   bValid = false;
            }
        }
    }
    if (fields.length > 0) {
       if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
	   commonValidatorGlobalErrors +=fields.join('\n');
    }
    return bValid;
}

// trazi separator koji je koriscen za datume - metodom eliminacije
function findDateSeparator(datum) {
    var separator = '.';
	pos  = datum.indexOf(separator);
	// separator moze biti za sada jedan od znakova:   . \ /
	if (pos==-1) {
		separator="\\";
		pos  = datum.indexOf(separator);
	}
	if (pos==-1) {
		separator="/";
		pos  = datum.indexOf(separator);
	}
	if (pos==-1) {
		separator=" ";
		pos  = datum.indexOf(separator);
	}
	return pos!=-1 ? separator : "";
}

// ubacio djuRa - validacije za afterToday
function getDateAsNumber(datum) {
    var separator = findDateSeparator(datum);
	pos1 = datum.indexOf(separator,pos+1);
  
	dan    = datum.substr(0,pos);
	mesec  = datum.substring(pos+1,datum.length-5);
	godina = datum.substr(pos1+1, datum.length);
	
	if (dan.length==1) dan="0"+dan;
	if (mesec.length==1) mesec="0"+mesec;

	return godina+mesec+dan;
}
function getCurrentDateAsString() {
	today = new Date();
	dToday='';
	if (today.getDate()<10) dToday += "0";
	dToday += today.getDate()+'.';

	if ((today.getMonth()+1)<10)  dToday += "0";
	dToday += (today.getMonth()+1)+'.';

	dToday += today.getYear();
	
	return  dToday;
}

function getCurrentDateAsNumber() {
	today = new Date();
	dToday = ""+today.getYear();
	
	if ((today.getMonth()+1)<10)  dToday += "0";
	dToday += (today.getMonth()+1);
	
	if (today.getDate()<10) dToday += "0";
	dToday += today.getDate();
	
	return  dToday;
}

function veciDatum(datum1, datum2){
	return getDateAsNumber(datum1)>getDateAsNumber(datum2);
}

function validateAfterToday(form) {
  var bValid = true;  
  var focusField = null;
  var i = 0;
  var fields = new Array();
  oDate = new AfterToday();
  
  
  for (x in oDate) {
      var valueDatum1 = form[oDate[x][0]].value;
     
      if (veciDatum(valueDatum1, getCurrentDateAsString())) {
           if (i == 0) {
               focusField = form[oDate[x][0]];
           }
           fields[i++] = oDate[x][1];
           bValid = false; 
      }
              }
  
  if (fields.length > 0) {
			       if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
      commonValidatorGlobalErrors +=fields.join('\n');
  }

  return bValid;
            }

// dejanr: provera datuma i vremena - da li je vreme "od" manje od vremena "do"            
function validateVeciDateAndTime(form){
	var focusField = null;
	var bValid = true;	
	var fields = new Array();        
	var i = 0;
	oDate = eval('new ' + bFunctionPrefix  + 'VeciDateAndTime()');

	for (x in oDate) {		
		var field = form[oDate[x][0]];		
		if (field.type == 'text' && i < 1){
			++i;			
	    	var valueDatum1 = form[oDate[x][0]].value;
    		var valueDatum2 = form[oDate[x][2]("dateTo")].value;
			
			if (valueDatum1.length == 0 || valueDatum2.length == 0){
				return true;
			}
			if (getDateAsNumber(valueDatum2) < getDateAsNumber(valueDatum1)) {
				focusField = form[oDate[x][0]];
				fields[i++] = oDate[x][1];
				bValid = false;
			}
			if ((form[oDate[x][2]("hourFrom")] == null) && (form[oDate[x][2]("hourTo")] == null) && (form[oDate[x][2]("timeTo")] == null) && (form[oDate[x][2]("timeFrom")] == null)
				&& (getDateAsNumber(valueDatum1) == getDateAsNumber(valueDatum2))) {
				focusField = form[oDate[x][0]];
				fields[i++] = oDate[x][1];
				bValid = false;
			}
			if ((form[oDate[x][2]("hourFrom")] != null) && (form[oDate[x][2]("hourTo")] != null) && (getDateAsNumber(valueDatum1) == getDateAsNumber(valueDatum2))) {
				var valueHourFrom = form[oDate[x][2]("hourFrom")].value;
        		var valueHourTo = form[oDate[x][2]("hourTo")].value;
				var valueMinuteFrom = form[oDate[x][2]("minuteFrom")].value;		
		        var valueMinuteTo = form[oDate[x][2]("minuteTo")].value;
				if (valueHourFrom > valueHourTo) {	
					focusField = form[oDate[x][0]];
					fields[i++] = oDate[x][1];
					bValid = false;
				}
				if (valueHourFrom == valueHourTo) {
					if (valueMinuteFrom >= valueMinuteTo) {
						focusField = form[oDate[x][0]];
						fields[i++] = oDate[x][1];
						bValid = false;
					}
				}
			}
			//dodao djuRa za podrsku novog formata vrmena (u istom polju)
			if ((form[oDate[x][2]("timeFrom")] != null) && (form[oDate[x][2]("timeTo")] != null) && (getDateAsNumber(valueDatum1) == getDateAsNumber(valueDatum2))) {
				var valueTimeFrom = form[oDate[x][2]("timeFrom")].value;
        		var valueTimeTo = form[oDate[x][2]("timeTo")].value;
				var valueHourFrom = "0";
        		var valueHourTo = "0";
				var valueMinuteFrom = "0";
		        var valueMinuteTo = "0";

        		var q = valueTimeFrom.indexOf(":");
        		if (q!=-1) {
					valueHourFrom = valueTimeFrom.substring(0,q);
					valueMinuteFrom = valueTimeFrom.substring(q+1, valueTimeFrom.length);
        		} else {
					valueHourFrom = valueTimeFrom;
				}

        		q = valueTimeTo.indexOf(":");
        		if (q!=-1) {
					valueHourTo = valueTimeTo.substring(0,q);
					valueMinuteTo = valueTimeTo.substring(q+1, valueTimeTo.length);
        		} else {
					valueHourTo = valueTimeTo;
				}
        		

				if (valueHourFrom > valueHourTo) {	
					focusField = form[oDate[x][0]];
					fields[i++] = oDate[x][1];
					bValid = false;
				}
				if (valueHourFrom == valueHourTo) {
					if (valueMinuteFrom >= valueMinuteTo) {
						focusField = form[oDate[x][0]];
						fields[i++] = oDate[x][1];
						bValid = false;
					}
				}
			}


		}
    }
    
	if (fields.length > 0) {
       if (commonValidatorFocusField=='') commonValidatorFocusField= focusField;
		commonValidatorGlobalErrors +=fields.join('\n');
	}

	return bValid;
}            


function validateTime(form){
return true;
}
function validateMustBeTodayOrAfterToday(form){
return true;
}
function validateMustBeAfterToday(form){
return true;
}
