var isIE = (navigator.appName.indexOf("Microsoft")!=-1);

function validateFormElements(frm) {
   for(var i=0; i<frm.length; i++) {
      if (frm[i].validate && !frm[i].validate()) {
         return false;
      }
      
   }
   return true;
}

function loadElementProperties(p_obj,p_element_properties) {
   if (!p_obj || !p_element_properties)
      return;
      
   for (var i=1; i<arguments.length; i++) {
      for (var j=0; j<p_element_properties.length; j++)
         p_obj[p_element_properties[j][0]] = p_element_properties[j][1]; // atribui um valor a uma propriedade do objeto
   }
}

function loadFormElementEvents(frm) {
   if (frm.acao && frm.acao.value=='del')
      return;
   
   for (var i=0; i < frm.length; i++) {
      if (frm[i].v_type)
         frm[i].onkeypress = field_onkeypress;

      if (frm[i].validate) {
         if (frm[i].onchange && frm[i].onchange!=field_validate) {
            frm[i].onvalidate = frm[i].onchange;
         }  
         frm[i].onchange = field_validate;
         frm[i].validate = field_validate;
      }   
   }
}

function loadFormElementProperties(frm) {

   if (frm.acao && frm.acao.value=='del')
      return;

   for (var i=1; i<arguments.length; i++) {
      var val_obj = arguments[i];  // array com validacoes
      if (typeof val_obj[0]=="string")
         var item = frm[val_obj[0]]; // item de formulario a ser validado
      else
         var item = val_obj[0];
      
      if (item) {
         if (!item.validate)
           item.validate = function() { return true };
         
         for (var j=1; j<val_obj.length; j++)
           item[val_obj[j][0]] = val_obj[j][1]; // atribui um valor a uma propriedade do item

		if (item.type != "radio" || item.type != "checkbox"){
		  item.style.backgroundColor = (item.required ? "#d8d8d8" : "");
		}
      }
   }
}

function field_validate() {
   if (this.type=="text" && this.uppercase)
      this.value=trim(this.value.toUpperCase());

   var msg_required = nvl(this.required_error,"Campo obrigatorio");

   if (this.required && !checkRequired(this,msg_required))
      return false;

   if (!isNull(this.value) && this.v_type) {

      var msg = nvl(this.validation_error,null);
      var msg_min = nvl(this.min_error,null);
      var msg_max = nvl(this.max_error,null);
      var msg_integer_size = nvl(this.integer_size_error,null);

      switch(this.v_type) {
         case "usdate" :
            if (!checkUSDate(this,nvl(msg,"Data invalida")) ||
                !checkMinValue(this,nvl(msg_min,"Data deve ser igual ou maior que "+this.min_value)) ||
                !checkMaxValue(this,nvl(msg_max,"Data deve ser igual ou maior que "+this.max_value)))
               return false;
            break;

         case "date" :
            if (!checkDate(this,nvl(msg,"Data inválida")) ||
                !checkMinValue(this,nvl(msg_min,"Data deve ser igual ou maior que "+this.min_value)) ||
                !checkMaxValue(this,nvl(msg_max,"Data deve ser igual ou menor que "+this.max_value)))
               return false;
            break;

         case "shortdate" :
            if (!checkShortDate(this,nvl(msg,"Data inválida")) ||
                !checkMinValue(this,nvl(msg_min,"Data deve ser igual ou maior que "+this.min_value)) ||
                !checkMaxValue(this,nvl(msg_max,"Data deve ser igual ou menor que "+this.max_value)))
               return false;
            break;

         case "time" :
            if (!checkTime(this,nvl(msg,"Hora inválida")) ||
                !checkMinValue(this,nvl(msg_min,"Hora deve ser igual ou maior que "+this.min_value)) ||
                !checkMaxValue(this,nvl(msg_max,"Hora deve ser igual ou menor que "+this.max_value)))
               return false;
            break;
         
         case "shorttime" :
            if (!checkShortTime(this,nvl(msg,"Hora inválida")) ||
                !checkMinValue(this,nvl(msg_min,"Hora deve ser igual ou maior que "+this.min_value)) ||
                !checkMaxValue(this,nvl(msg_max,"Hora deve ser igual ou menor que "+this.max_value)))
               return false;
            break;

         case "integer" :
            if (!checkInteger(this,nvl(msg,"Número inválido")) ||
                !checkMinValue(this,nvl(msg_min,"Valor deve ser igual ou maior que "+this.min_value)) ||
                !checkMaxValue(this,nvl(msg_max,"Valor deve ser igual ou menor que "+this.max_value)))
               return false;
            break;

         case "number":
            this.value=trim(this.value.replace(/\,/g,"."));  // substitui as virgulas pelos pontos

            if (!checkNumber(this,nvl(msg,"Número inválido")) ||
                !checkIntegerSize(this,nvl(msg_integer_size,"Parte inteira deve ter no maximo "+this.integer_size+ " casas")) ||
                !checkMinValue(this,nvl(msg_min,"Valor deve ser igual ou maior que "+this.min_value)) ||
                !checkMaxValue(this,nvl(msg_max,"Valor deve ser igual ou menor que "+this.max_value)))
               return false;

            if (this.decimal_size)
               this.value=formatNumberDecimal(this.value,this.decimal_size);
            break;

         default : return true;
      }
   }

   if (this.onvalidate) {
      return this.onvalidate();
   }  
   else   
      return true;
}

function field_onkeypress() {
   return eval(this.v_type + "_onkeypress()");
}

function number_onkeypress(evt) {
   if (isIE) {
      evt = window.event;
      var source = evt.srcElement;
      var keyCode = evt.keyCode;
   }
   else {
      var source = evt.target;
      var keyCode = evt.which;
   }

   var keyChar = String.fromCharCode(keyCode);

   if (!source.min_value || parseFloat(source.min_value)<0)
      var char_input = "0123456789-";
   else
      var char_input = "0123456789";

   if (source.decimal_size && parseInt(source.decimal_size,10)>0)
      char_input+=".,";

   if (char_input.indexOf(keyChar)==-1) {
      evt.returnValue=false;
      return false;
   }
}

function date_onkeypress(evt) {
   if (isIE) {
      evt = window.event;
      var source = evt.srcElement;
      var keyCode = evt.keyCode;
   }
   else {
      var source = evt.target;
      var keyCode = evt.which;
   }

   var keyChar = String.fromCharCode(keyCode);

   if ( ("0123456789/").indexOf(keyChar)==-1) {
      evt.returnValue=false;
      return false;
   }

   switch (source.value.length) {
      case 0 :
         if (keyChar=="/") {
            evt.returnValue=false;
            return false;
         }

         break;

      case 1:
         if (keyChar=="/") {
            if (source.value=="0") {
               evt.returnValue=false;
               return false;
            }
            else {
               source.value="0"+source.value;
            }
         }
         else if (source.value >= "4" ||
                 (source.value =="3" && keyChar>="2")) {

            if (keyChar<="1")
               source.value="0"+source.value+"/";
            else
               source.value="0"+source.value+"/0";
         }

         break;

      case 2 :
         if (keyChar!="/") {
            source.value += "/";
         }

         if (keyChar>="2") {
            source.value=source.value.substr(0,3) + "0";

            // valida o mes e o dia
            var dd = parseInt(source.value.substr(0,2),10);
            var mm = parseInt(source.value.substr(3,1)+keyChar,10);

            if (mm==4 || mm==6 || mm==9 || mm==11) {
               if (dd==31) {
                  source.value = "30/"+source.value.substr(3,2);
               }
            }

         }


         break;

      case 3 :
         if (keyChar=="/") {
            evt.returnValue=false;
            return false;
         }

         if (keyChar>="2") {
            source.value=source.value.substr(0,3) + "0";

            // valida o mes e o dia
            var dd = parseInt(source.value.substr(0,2),10);
            var mm = parseInt(source.value.substr(3,1)+keyChar,10);

            if (mm==4 || mm==6 || mm==9 || mm==11) {
               if (dd==31) {
                  source.value = "30/"+source.value.substr(3,1);
               }
            }

         }

         break;

      case 4 :
         if (keyChar=="/") {
            if (source.value.charAt(source.value.length-1)=="0") {
               evt.returnValue=false;
               return false;
            }
            else {
               source.value=(source.value).substr(0,3) + "0" + source.value.substr(3,1) ;
            }
         }

         // valida o mes e o dia
         var dd = parseInt(source.value.substr(0,2),10);
         var mm = parseInt(source.value.substr(3)+keyChar,10);

         if (mm<1 || mm > 12) {
            evt.returnValue = false;
            return false;
         }

         if (mm==4 || mm==6 || mm==9 || mm==11) {
            if (dd==31) {
               source.value = "30/"+source.value.substr(3,1);
            }
         }

         break;

      case 5 :
         if (keyChar=="0") {
            evt.returnValue=false;
            return false;
         }

         if (keyChar!="/") {
            source.value += "/";
         }

         break;


      case 9 :
         if (keyChar=="/") {
            evt.returnValue=false;
         }

         var dd = parseInt(source.value.substr(0,2),10);
         var mm = parseInt(source.value.substr(3,2),10);

         if (mm==2) {
            var aa = parseInt(source.value.substr(6)+keyChar,10)

            if (dd>=29) {
               if (((aa/4)!=parseInt(aa/4,10))) {
                  source.value = "28/02/"+source.value.substr(6);
               }
               else {
                  source.value = "29/02/"+source.value.substr(6);
               }
            }

         }

         break;

      case 6:
         if (keyChar=="0") {
            evt.returnValue=false;
         }

      default :
         if (keyChar=="/") {
            evt.returnValue=false;
            return false;
         }
   }
}

function get_decimal_size(p_value) {
   p_value = trim(p_value);

   var p = p_value.indexOf(".");

   if (p==-1) {
      var decimals = 0;
   }
   else
      var decimals = p_value.length - p - 1;

   return decimals;
}
function usdate_onkeypress(evt) {
   if (isIE) {
      evt = window.event;
      var source = evt.srcElement;
      var keyCode = evt.keyCode;
   }
   else {
      var source = evt.target;
      var keyCode = evt.which;
   }

   var keyChar = String.fromCharCode(keyCode);

   if ( ("0123456789/").indexOf(keyChar)==-1) {
      evt.returnValue=false;
      return false;
   }

   switch (source.value.length) {
      case 0 :
      	 if (keyChar=="/") {
            evt.returnValue=false;
            return false;
         }
	 
         if (keyChar>="2") 
            source.value="0";
         
         break;

      case 1:
         if (keyChar=="/") {
            if (source.value=="0") {
               evt.returnValue=false;
               return false;
            }
            else {
               source.value = "0"+source.value;
            }
         }
         else if (source.value=="0") {
            if (keyChar=="0") {
               evt.returnValue=false;
               return false;
            }
         }
         else if (source.value=="1" && keyChar>="3" ||
                  source.value>="2") {
				
            if (keyChar>="4") 
               source.value="0"+source.value+"/0";
            else 
               source.value="0"+source.value+"/";
            	
         }

         break;

      case 2 :
         if (keyChar!="/") 
            source.value += "/";
         
         if (keyChar>="4" ||
             (keyChar=="3" && source.value=="02/")) 
            source.value += "0";
         
         break;

      case 3:
         if (keyChar=="/") {
            evt.returnValue=false;
            return false;
         }
         else if (keyChar>="4"||
                  (keyChar=="3" && source.value=="02/")) {
            source.value += "0";
         }
      	
      	 break;
      
      case 4 :
         if (keyChar=="/") {
            if (source.value.charAt(3)=="0") {
               evt.returnValue=false;
               return false;
            }   
            else {  
               source.value = source.value.substring(0,3) + "0" + source.value.charAt(3);
               evt.returnValue=true;
               return true;
            }   
         }	
      	 else if (source.value.charAt(3)>="4" ||
      	          (source.value.charAt(3)=="3" && keyChar>="2")) {
      	    source.value = source.value.substring(0,3) + "0" + source.value.charAt(3) + "/";
	 }
	 
	 // valida o mes e o dia
	 var mm = parseInt(source.value.substring(0,2),10);
	 var dd = parseInt(source.value.charAt(3)+keyChar,10);

	 if (mm<1 || mm > 12) {
	    evt.returnValue = false;
	    return false;
	 }

	 if (dd > 31 || dd < 1) {
	    evt.returnValue=false;
	    return false;
	 }

	 if (mm==4 || mm==6 || mm==9 || mm==11) {
	    if (dd==31) {
	       source.value += "0";
	       evt.returnValue=false;
	       return false;
	    }
	 }

         break;
		
      case 5 :
         if (keyChar=="0") {
            evt.returnValue=false;
            return false;
         } else if (keyChar!="/") {
            source.value += "/";
         }
		
         break;
      
      case 6:
         if (keyChar=="0" || keyChar=="/") {
            evt.returnValue=false;
            return false;
         }
         
         break;
		
      case 9 :
         if (keyChar=="/") {
            evt.returnValue=false;
            return false;
         }
		
         var mm = parseInt(source.value.substr(0,2),10);
         var dd = parseInt(source.value.substr(3,2),10);

         if (mm==2) {
            var aa = parseInt(source.value.substr(6)+keyChar,10)

            if (dd>=29) {
               if (((aa/4)!=parseInt(aa/4,10))) {
                  source.value = "02/28/"+source.value.substr(6);
               }
               else {
                  source.value = "02/29/"+source.value.substr(6);
               }
            }
         }

         break;

      default :
         if (keyChar=="/" || source.value.length>=10) {
            evt.returnValue=false;
            return false;
         }
   }

}

function shortdate_onkeypress(evt) {
   if (isIE) {
      evt = window.event;
      var source = evt.srcElement;
      var keyCode = evt.keyCode;
   }
   else {
      var source = evt.target;
      var keyCode = evt.which;
   }

   var keyChar = String.fromCharCode(keyCode);

   if ( ("0123456789/").indexOf(keyChar)==-1) {
      evt.returnValue=false;
      return false;
   }

   switch (source.value.length) {
      case 0 :
         if (keyChar=="/") {
            evt.returnValue=false;
            return false;
         }
         
         break;

      case 1 :
         if (keyChar=="/") {
            if (source.value=="0") {
               evt.returnValue=false;
               return false;
            }
            else {
               source.value="0"+source.value;
            }
         }
         else if (source.value>="2" || (source.value=="1" && keyChar>="3")) 
            source.value="0"+source.value+"/";
         
         break;

      case 2 :
         if (keyChar!="/") {
            if (keyChar=="0") {
               evt.returnValue=false;
               return false;
            }
            else 
               source.value+="/";
         }
         break;

      case 3 :
         if (keyChar=="/" || keyChar=="0") {
            evt.returnValue=false;
            return false;
         }
         break;

      default :
         if (keyChar=="/" || source.value.length>=7) {
            evt.returnValue=false;
            return false;
         }
   }

}
