/***************************************************************************************
 * Copyright (c) 2001, NeoGrid S/A.  Todos os direitos reservados. 
 *
 * Os Programas desta Aplicação (que incluem tanto o software quanto a sua documentação) 
 * contém informações proprietárias da NeoGrid S/A; eles são licenciados de acordo   com 
 * um contrato de licença contendo restrições de uso e confidencialidade, e  são  também 
 * protegidos pela Lei 9609/98 e 9/610/98, respectivamente Lei do  Software  e  Lei  dos 
 * Direitos Autorais. Engenharia reversa, descompilação e desmontagem dos programas  são 
 * proibidos. Nenhuma parte destes  programas pode ser  reproduzida  ou  transmitida  de 
 * nenhuma forma e por nenhum meio, eletrônico ou mecânico,  por  motivo  algum,  sem  a 
 * permissão escrita da NeoGrid S/A.
 **************************************************************************************/
/* Script by George Gastaldi - NeoGrid S.A.*/
/**
 * Initial Parameters
 */

/** Changing DOM properties */
String.prototype.trim = new Function("","return Trim(this)");// String.trim()
String.prototype.isInteger = new Function("","return isInteger(this)");
String.prototype.toDouble = new Function("","return parseDouble(this)");
String.prototype.toDate = new Function("","return parseDate(this)");

/**
 * Array for date parsing. Update when a new locale is defined !
 */
var dateMasks = new Array(); 
dateMasks["pt"] = "dd/MM/yyyy";
dateMasks["en"] = "MM/dd/yyyy";
dateMasks["es"] = "dd-MM-yyyy";
/////////////////////////////////////////////
//var forms = document.forms;
//for (i=0;i<forms.length;i++) {
//  forms[i].submitNG = forms[i].submit;
//  forms[i].submit = new Function("","submitForm(this)");
//}
/**/

var NG_VERSION = "$PRODUCTVERSION$2.00$COMPONENTVERSION$0011$";
//var expdate = new Date ();
//expdate.setTime (expdate.getTime() + (24 * 60 * 60 * 1000)); 	
var wasSubmitted = false;
//if (!document.layers&&!document.all) event="test"
// end.
var exceptionOcurred = false;
var ie4 = (document.all) ? true : false;
var ns4 = (document.layers) ? true : false;
var ns6 = (document.getElementById && !document.all) ? true : false;

function doNothing() {}

function submitForm(frm) {
	if (!wasSubmitted) {
		wasSubmitted = true;
		// WorkAround para verificar se existe algo no onSubmit e executá-lo
		if (frm.onsubmit && !frm.onsubmit()) return;
		// Salvar todo o conteúdo da form (Use Autocomplete=OFF no elemento para não salvar)
		if ( window.external ) {
		   window.external.AutoCompleteSaveForm(frm);
		}
		// fim do workaround
	    //frm.submitNG();
		frm.submit();
	}
}

function positionAtFirstField() {

 for ( var i=0; i<document.forms.length; i++ ) {
   	var f = document.forms[i];
   	if ( f.name.toLowerCase() == "headerform" ) continue;
   	if ( f.elements) {
			for ( var j=0; j<f.elements.length; j++ ) {
				if (f.elements[j].allowableFocus && f.elements[j].allowableFocus == 'false') continue;   	
				if (f.elements[j].type != 'hidden' && f.elements[j].type != 'select-one') {
      			f.elements[j].focus();
      			return;
      		}
			}
		}
	}
}

function comboReadOnly(combo) {
	for ( var i=0; i<combo.options.length; i++ ) {
   	 if (combo.options[i].defaultSelected) {
   		combo.selectedIndex = i;
	  }
	}
}


function selectReadOnly(select) {
	for ( var i=0; i<select.options.length; i++ ) {
		select.options[i].selected=false;   
	}
}

function Trim( str ) {
	var resultStr = "";
	
	resultStr = TrimLeft(str);
	resultStr = TrimRight(resultStr);
	
	return resultStr;
}

function TrimLeft( str ) {
	var resultStr = "";
	var i = len = 0;
	
	if (str+"" == "undefined" || str == null)	
		return null;

	str += "";

	if (str.length == 0) 
		resultStr = "";
	else {	
		len = str.length;
					
  		while ((i <= len) && (str.charAt(i) == " "))
			i++;
	
  		resultStr = str.substring(i, len);
  	}
			
  	return resultStr;
} 
			
function TrimRight( str ) {
	var resultStr = "";
	var i = 0;
	
	if (str+"" == "undefined" || str == null)	
		return null;

	str += "";
		
	if (str.length == 0) 
		resultStr = "";
	else {
  		i = str.length - 1;
  		while ((i >= 0) && (str.charAt(i) == " "))
 			i--;
			 			
	  		resultStr = str.substring(0, i + 1);
	  	}
	  	
	  	return resultStr;  	
} 

	function selectAllCheckBoxes(form) {
 		selectAllCheckBoxesLike(form,"");
 	}

	function selectAndClickAllCheckBoxes(form) {
 		selectAndClickAllCheckBoxesLike(form,"");
 	}
 	
	function clearAllCheckBoxes(form) {
		clearAllCheckBoxesLike(form,"");
	}

	function clearAndClickAllCheckBoxes(form) {
		clearAndClickAllCheckBoxesLike(form,"");
	}

	function invertAllCheckBoxes(form) {
		invertAllCheckBoxesLike(form,"");
	}

	function invertAndClickAllCheckBoxes(form) {
		invertAndClickAllCheckBoxesLike(form,"");
	}

	function clearAllTextComponents(form) {
		clearAllTextComponentsLike(form,"");
	}

	function invertAllTextComponents(form) {
		invertAllTextComponentsLike(form,"");
	}


	function toggleAllCheckBoxes(form) {
		toggleAllCheckBoxesLike(form,"");
	}

	function toggleAndClickAllCheckBoxes(form) {
		toggleAndClickAllCheckBoxesLike(form,"");
	}

	function toggleAllTextComponents(form) {
		toggleAllTextComponentsLike(form,"");
	}


	
	function clearAllTextComponentsLike(form,str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if ((x.type == 'text' || x.type == 'password' || x.type == 'textarea')
				&& (x.name.indexOf(str) > -1)) x.value = "";
		}
	}
	
        function clearAllTextComponentsExcept(form,str) {
		var elementsLength = form.elements.length;
		for (var i = 0; i < elementsLength; i++) {
                        var x = form.elements[i];
			if (x.type == 'text' || x.type == 'password' || x.type == 'textarea'){
                            if(form.elements[i].name.indexOf(str) == -1){
                                form.elements[i].value = "";
                            }//if
                        }//if
		}//for
		return true;
	}

	function showMessage(type, text) {
		var area = document.getElementById("msgtxt");
		if (area != null && area != '') area.innerHTML = text;
		return true;
	}


	function clearList(list) {
		var size=list.options.length;
      for ( var i=size; i>-1; i-- ) {
            list.options[i] = null;
	  	}
	}

	function setTitle(title) {
		//SetCookie ("pageTitle", title , expdate);
	}

	function getTitle() {
		var title;
		title = getCookie ("pageTitle");
		return title;
	}

	function callPage(ref, title) {
		setTitle(title);
		this.location = ref;
	}

	function callPage3(ref, title) {
		this.parent.location = ref;
		setTitle(title);
	}

	function callModule(ref, title) {
		this.location = ref;
		setTitle(title);
	}

	function callPage2(ref) {
		this.location = ref;
	}

	function clearTextFields(form) {
		var elementsLength = form.elements.length;
		for (var i = 0; i < elementsLength; i++) {
			if (form.elements[i].type == "text") {
				form.elements[i].value = "";
			}
		}
		return true;
	}

	function isAllTextFieldsCleaned(form) {
		var answer = true;
		var elementsLength = form.elements.length;
		for (var i = 0; ( (answer) && (i < elementsLength)); i++) {
			if (form.elements[i].type == "text") {
				if (form.elements[i].value != '') {
					answer = false;
				}
			}
		}
		return answer;
	}

  function validateChars(field) {
	 if ( field.value =="" ) 
    return;   
    var valid = " abcdefghijklmnopqrstuvwxyz";
    var temp;
    var texto=field.value.toLowerCase();

    for (var i = 0; i < texto.length; i++) {
      temp = "" + texto.substring(i, i + 1);
      if (valid.indexOf(temp) == "-1")
      {
        field.focus();
        field.select();
        break;
      }
    }
  }

  function isInteger(value) {
    var valid = "0123456789";
    var temp;
	 if ( value =="" ) return true;   
    if (value.substring(0, 1) != "-") {
      for (var i = 0; i < value.length; i++) {
        temp = "" + value.substring(i, i + 1);
        if (valid.indexOf(temp) == "-1"){
          return false;
        }
      }
    } else {
      for (var i = 1; i < value.length; i++) {
        temp = "" + value.substring(i, i + 1);
        if (valid.indexOf(temp) == "-1"){
          return false;
        }
      }
    } 
    return true;
	}


  function validateInt(field) {
		if (!isInteger(field.value)) {
			field.focus();
			field.select();
		}
  }

	function isReal(value) {
		var valid = ".0123456789";
		var temp;
		var ok = true;
		var dot = 0;
	   if ( value =="" ) return true;   
		if (value.substring(0, 1) == "-") {
			for (var i = 1; i < value.length; i++) {
				temp = "" + value.substring(i, i + 1);
				if (valid.indexOf(temp) == "-1")
					ok = false;
				if (temp == ".")
					dot++;
			}
		} else {
			for (var i = 0; i < value.length; i++) {
				temp = "" + value.substring(i, i + 1);
				if (valid.indexOf(temp) == "-1")
					ok = false;
				if (temp == ".")
					dot++;
			}
		}
		if (!ok || dot > 1) {
			return false;
		}
		return true;
	}

	function validateReal(field) {
		if (!isReal(field.value)) {
   		field.focus();
   		field.select();
		}
	}

	function validateTime(field,type) {
		//  onde: type -> 1 para 24H, 2 para 12H
		var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
		var matchArray = field.value.match(timePat);
		if (field.value == "") {
			return;
		}
		if (matchArray == null && field.value != null) {
			field.focus();
			field.select();
			return;
		}

		hour = matchArray[1];
		minute = matchArray[2];
		second = matchArray[4];
		ampm = matchArray[6];
		if (second == "") {
			second = null;
		}
		if (ampm == "") {
			ampm = null} 
			if (type == 1) {
				if (hour < 0 || hour > 23) {
					field.focus();
					field.select();
					return;
				}
			}
			if (type == 2) {
				if (hour < 0 || hour > 12) {
					field.focus();
					field.select();
					return;
				}
			}
			if (hour <= 12 && ampm == null) {
				if (type == 2) {
					field.focus();
					field.select();
					return;
				}
			}
			if (hour > 12 && ampm != null) {
				if (type == 1)
				field.focus();
				field.select();
				return;
			}
			if (minute < 0 || minute > 59) {
				field.focus();
				field.select();
				return;
			}
			if (second != null && (second < 0 || second > 59)) {
				field.focus();
				field.select();
				return;
			}
		}

	function isEmail(value) {
		var tokens = value.split(";");
		var answer = true;
		for ( var i=0; i<tokens.length; i++ ) {
			var sub = tokens[i];
   		answer &= (sub == "" || sub.search(/^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$/) != -1);
		}
		return answer;
	//	return (value == "" || value.search(/^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$/) != -1);
	}

	function validateEmail(field,message) {
			if (!isEmail(field.value)){
				alert (message);
				field.focus();
				field.select();
				return false;
			}
		    return true;
	}

  function truncate(value,size) {
      if ( size == value.length) {
        return value;
      }
      value=Trim(value);
      if ( value.length > size ) {
        var temp = value.substring(0,size-5);
        temp = temp + ' ... ';
        return temp;
      }
      else {
        var temp= value;
        for ( var i=temp.length; i<size; i++ ) {
          temp+=' ';
        }
        return temp;
      }
    }

    function populate(select, keys, values) {
      var sizeKeys = keys.length;
      var sizeValues = values.length;
      var i=0;
      while (i<sizeKeys) {
        k = keys[i];
        v = values[i];
        o = new Option(v,k,false,false);
        n = select.options.length;
        select.options[n] = o;
        i++;
      }
      return;
    }

  function moveSelectedElement(source,target) {
    if ( source.options.length>-1 ){
      var numOfRegs=0;
      var a=source.options.length;
      var cont=0;
      for ( var i=0; i<a; i++ ) {
        if ( source.options[i].selected )
        {
          var c = source.options[i].text;
          var v = source.options[i].value;
          numOfRegs++;

          var o = new Option(c,v,false,false);
          var n = target.options.length;
          target.options[n] = o;
        }
      }
      while ( cont!=numOfRegs ) {
         for ( var i=0; i<source.options.length; i++ ) {
          if ( source.options[i].selected ){
            source.options[i] = null;
            continue;
          }
        	}
        cont++;
      	}
   	 }  	 
	  }

  function openNewWindow(window) {
	 
	 window.open(window);
	 
	}

  function moveAll(source,target){
		selectOptions(source);
		moveSelectedElement(source,target);		
  }
      
  function selectOptions(select) {
	 var i=0; 
	 while (i<select.length)
    {
      select.options[i].selected=true;
      i++;
    }
   }


	function selectOptionsByText(select, value) {
    for ( var i=0; i<select.options.length; i++ ) {
		if ( Trim(select.options[i].text.toLowerCase()) == Trim(value.toLowerCase()) ) 
		  select.options[i].selected = true;   
		}
	}
	
	function validateDate (field,mask){
		if ( field.value != ""  && parseDate(field.value,mask) == null) {
   		field.focus();
   		field.select();
   		return false;
		}
	}

	function parseDate (value, mask, locale){
	  if ( value=="" ) {
	    return null;
	  }
	  if (mask == null) {
	 	   if ( locale == null && ngLocale == null ) {
   			return null;
			}
   		locale = (locale == null) ? ngLocale : locale;
 	   	mask = dateMasks[locale];
	  } 

	  if (mask.indexOf('-') >-1)
	  {
	    caracterBegin=mask.indexOf('-');
	  }
	  if ( mask.indexOf('/') > -1 )
	  {
	    caracterBegin=mask.indexOf('/');
	  }
	  if ( mask.indexOf('.') > -1) {
	    caracterBegin=mask.indexOf('.');
	  }
	  caracter=mask.charAt(caracterBegin);
	  var day=0;
	  var month=0;
	  var year=0;
	
	  var primChar=mask.charAt(0);
	  var ultChar=mask.charAt(mask.length);

	  var posicaoInicialDia=mask.indexOf('d');
	  var posicaoInicialAno=mask.indexOf('y');
	  var posicaoInicialMes=mask.indexOf('M');

	  if ( caracter=='/' ) {
		var datePat1 = /^(\d{1,2})(\/)(\d{1,2})\2(\d{4})$/; // d/M/yyyy  - M/d/yyyy
		var datePat2 = /^(\d{4})(\/)(\d{1,2})\2(\d{1,2})$/; // yyyy/M/d - yyyy/d/M
		var datePat3 = /^(\d{1,2})(\/)(\d{4})\2(\d{1,2})$/; // d/yyyy/M - M/yyyy/d
		  }
	  if ( caracter=='-' )  {
		var datePat1 = /^(\d{1,2})(\-)(\d{1,2})\2(\d{4})$/; // d-M-yyyy  - M-d-yyyy
		var datePat2 = /^(\d{4})(\-)(\d{1,2})\2(\d{1,2})$/; // yyyy-M-d
		var datePat3 = /^(\d{1,2})(\-)(\d{4})\2(\d{1,2})$/; // d-yyyy-M
		  }
	  if ( caracter=='.' ) {
		var datePat1 = /^(\d{1,2})(\.)(\d{1,2})\2(\d{4})$/; // d.M.yyyy  - M.d.yyyy dd/m/y
		var datePat2 = /^(\d{4})(\.)(\d{1,2})\2(\d{1,2})$/; // yyyy.M.d
		var datePat3 = /^(\d{1,2})(\.)(\d{4})\2(\d{1,2})$/; // d.yyyy.M
		  }
	  if ( posicaoInicialAno== 2 || posicaoInicialAno==3)  // dd/yyyy/MM
	  {
	    var matchArray = value.match(datePat3);
	    if ( matchArray == null && value!= null)
	    {
   	   return null;
	    }
	    if ( primChar=='d' )
	    {
   	   day = matchArray[1];
	      month = matchArray[4];
	      year = matchArray[3];
	    }
   	 else
		   {
      day = matchArray[4];
      month = matchArray[1];
      year = matchArray[3];
    }
  }
  else if (posicaoInicialAno==0)
  {
    var matchArray = field.value.match(datePat2);
    if ( matchArray == null && field.value!= null)
    {
      return null;
    }
    if ( ultChar=='d')
    {
      day = matchArray[4];
      month = matchArray[3];
      year = matchArray[1];
    }
    else
    {
      day = matchArray[3];
      month = matchArray[4];
      year = matchArray[1];
    }

  }
  else if (posicaoInicialAno==4 || posicaoInicialAno==5 || posicaoInicialAno==6  )
  {
    var matchArray = value.match(datePat1);
    if ( matchArray == null && value!= null)
    {
      return null;
    }
    if ( primChar=='d' )
    {
      day = matchArray[1];
      month = matchArray[3];
      year = matchArray[4];
    }
    else
    {
      day = matchArray[3];
      month = matchArray[1];
      year = matchArray[4];
    }

  }

  if (month < 1 || month > 12)
  {
    return null;
  }
  if (day < 1 || day > 31) {
	 return null; 	   
  }
  if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) {
    return null;
  }
  if (month == 2)
  {
    var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    if (day > 29 || (day == 29 && !isleap)) {
      return null;
    }
  }
  return new Date(year,month-1,day);
}

  function validatePosNum(field) {
    var valid = "0123456789";
    var temp;
	 if ( field.value =="" ) 
    return false;   

      for (var i = 0; i < field.value.length; i++) {
        temp = "" + field.value.substring(i, i + 1);
        if (valid.indexOf(temp) == "-1"){
          field.focus();
          field.select();
		    return false;
        }
      }
      return true;
    }

	function closePage(ID) {
		url = "/com/neogrid/arch/web/jsp/close.jsp?formID="+ID;
		location.href= url;
	}

  function moveOptionUp(select) {
    var last = -1;
    for (var i=select.options.length-1;i>=0 && last == -1;i--) {
      if (select.options[i].selected) {
        last = i;
      }
    }
    var first = -1;
    for (var i=0;i<last && first == -1;i++) {
      if (!select.options[i].selected) {
        first = i;
      }
    }
    if (first == -1) return;

    for (var i=first;i<=last;i++) {
      if (select.options[i].selected) {
        var thisIndex = i;
        var prevIndex = thisIndex-1;
        if ( prevIndex > -1) {
          var textoAtual = select.options[thisIndex].text;
          var valorAtual = select.options[thisIndex].value;
          var textoAnterior = select.options[prevIndex].text;
          var valorAnterior = select.options[prevIndex].value;
          var o1 = new Option(textoAtual,valorAtual,false,false);
          var o2 = new Option(textoAnterior,valorAnterior,false,false);
          select.options[prevIndex] = o1;
          select.options[thisIndex] = o2;
          select.options[prevIndex].selected = true;
        }
      }
    }
  }
  
  function moveOptionDown(select) {
    var first = -1;
    var last = -1;

    var i = select.options.length-1;
    while (i>-1 && select.options[i].selected) i--;

    last = i;

    for (i=0;i<last && first == -1;i++) {
      if (select.options[i].selected) {
        first = i;
      }
    }

    if (first== -1 || last == -1) return;
    for (var i=last;i>=first;i--) {
      if (select.options[i].selected) {
        var thisIndex = i;
        var nextIndex = thisIndex+1;
        if ( nextIndex < select.length ) {
          var textoAtual = select.options[thisIndex].text;
          var valorAtual = select.options[thisIndex].value;
          var textoPosterior = select.options[nextIndex].text;
          var valorPosterior = select.options[nextIndex].value;
          var o1 = new Option(textoAtual,valorAtual,false,false);
          var o2 = new Option(textoPosterior,valorPosterior,false,false);
          select.options[thisIndex] = o2;
          select.options[nextIndex] = o1;
          select.options[nextIndex].selected=true;
        }
      }
    }
  }

function moveSelectedByValue(value, source, target){
  for ( var i=0; i<source.options.length; i++ ) {
	if ( source.options[i].value == value ) {
	  source.options[i].selected = true;
	}   
  }
  moveSelectedElement(source,target);
}

function fitWindowSize() {
	
	var isNav4, isIE4;
	
	if (parseInt(navigator.appVersion.charAt(0)) >= 4) {
		isNav4 = (navigator.appName == "Netscape") ? 1 : 0;
		isIE4 = (navigator.appName.indexOf("Microsoft") != -1) ? 1 : 0;
	}

	if (isNav4) {
		window.innerWidth = document.layers[0].document.images[0].width;
		window.innerHeight = document.layers[0].document.images[0].height;
	}
	if (isIE4) {
		window.resizeTo(500, 500);
		width = 500 - (document.body.clientWidth -  document.images[0].width);
		height = 500 - (document.body.clientHeight -  document.images[0].height);
		window.resizeTo(width, height);
   }
}

 function loadImages() {
   	if (document.layers) {
			document.hidepage.visibility = 'hidden';
		}
		else {
			document.all.hidepage.style.visibility = 'hidden';
		}
	 }

   function selectAllCheckBoxesLike(form,str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = true;   
						//x.onclick();
					}
			}	
		}
	}

   function selectAndClickAllCheckBoxesLike(form,str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = true;   
						x.onclick();
					}
			}	
		}
	}

	function clearAllCheckBoxesLike(form,str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = false;   
						//x.onclick();
					}
			}	
		}
	}

	function clearAndClickAllCheckBoxesLike(form,str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = false;   
						x.onclick();
					}
			}	
		}
	}

	function invertAllCheckBoxesLike(form,str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = !x.checked;
					}
			}	
		}
	}

	function invertAndClickAllCheckBoxesLike(form,str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = !x.checked;
                                                x.onclick();
					}
			}	
		}
	}


	var toggleArray = new Array();
	
	function toggleAllCheckBoxesLike(form,str) {
		var booleanValue = toggleArray[str];
		if (booleanValue == null) {
			booleanValue = true;
		}//if
		toggleArray[str] = !booleanValue;
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = booleanValue;
					}
			}	
		}
	}

	function toggleAndClickAllCheckBoxesLike(form,str) {
		var booleanValue = toggleArray[str];
		if (booleanValue == null) {
			booleanValue = true;
		}//if
		toggleArray[str] = !booleanValue;
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						x.checked = booleanValue;
			                        x.onclick();
					}
			}	
		}
	}



  function getRandomNum(lbound, ubound) {
    return (Math.floor(Math.random() * (ubound - lbound)) + lbound);
  }

  function getRandomChar(number, lower, upper, other, extra) {
    var numberChars = "0123456789";
    var lowerChars = "abcdefghijklmnopqrstuvwxyz";
    var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var otherChars = "`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/? ";
    var charSet = extra;
    if (number) charSet += numberChars;
    if (lower)  charSet += lowerChars;
    if (upper)  charSet += upperChars;
    if (other)	 charSet += otherChars;
    return charSet.charAt(getRandomNum(0, charSet.length));
  }

  function getPassword(length, extraChars, firstNumber, firstLower, firstUpper, firstOther,
	  latterNumber, latterLower, latterUpper, latterOther) {
    var rc = "";
    if (length > 0)
    rc = rc + getRandomChar(firstNumber, firstLower, firstUpper, firstOther, extraChars);
    for (var idx = 1; idx < length; ++idx) {
      rc = rc + getRandomChar(latterNumber, latterLower, latterUpper, latterOther, extraChars);
    }
    return rc;
  }
  
  function generatePassword(length) {
		return getPassword (length,'',true,true,true,false,true,true,true,false);
	}

	function openReqPage(page) {
		top.newPage = window.open(page, "reqPage", "dependent=no, width=470, height=150, screenX=250, screenY=230, titlebar=no, alwaysRaised=true");
		top.newPage.moveTo(screen.width/2-225,screen.height/2-115);
		top.newPage.focus();
	}

	function openUserDataPage(page) {
		top.newPage = window.open(page, "userDataPage", "dependent=no, width=350, height=230, screenX=250, screenY=230, titlebar=no, alwaysRaised=true");
	   top.newPage.moveTo(screen.width/2-225,screen.height/2-115);
		top.newPage.focus();
	}

	function openSessionsPage(page) {
		top.newPage = window.open(page, "sessionsPage", "dependent=no, width=450, height=300, screenX=250, screenY=230, titlebar=no, alwaysRaised=true");
	   top.newPage.moveTo(screen.width/2-225,screen.height/2-115);
		top.newPage.focus();
	}


	function openPage(page,width,height) {
		top.newPage = window.open(page, "openedPage", "dependent=no, width="+width+" , height="+height+" , screenX=250, screenY=230, titlebar=no, alwaysRaised=true");
		top.newPage.focus();		
	}
	
	function limitField(field, maxlimit) {
		if (field.value.length > maxlimit) // if too long...trim it!
			field.value = Trim(field.value.substring(0, maxlimit));
	}
	
	function formatMessage(pattern, args) {
	// where pattern :String() 
	//       args    :Array()
		var finalMsg="";
		var index =0;
		for ( var i=0; i<args.length; i++ ) {
			var socket = "{"+i+"}";
			var pos = pattern.indexOf(socket);
			if ( pos != -1 ) {
			   finalMsg += pattern.substring(index,pos);
			   finalMsg += args[i];
				index = pos + socket.length;
				}
			}
		finalMsg += pattern.substring(index,pattern.length);
		return finalMsg;
	}
	
	function getParams() {
	// use: xxx = returnedArray["param1"];
     var address = self.location.href;
     var idx = address.indexOf('?');
     var params = new Array();
       if (idx != -1){
          var pairs = address.substring(idx+1, address.length).split('&');
          for (var i=0; i<pairs.length; i++) {
              nameVal = pairs[i].split('=');
              params[nameVal[0]] = nameVal[1];
          }
        }
        return params;
	 }
	 
	 
	function isAllCheckBoxesCleaned(form) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox'){
				if (x.checked) return false;
			}
		}
		return true;
	}

	function isAllCheckBoxesCleanedLike(form, str) {
		for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'checkbox') {
					if ( x.name.indexOf(str) != -1) {
						if (x.checked) return false;   
					}
			}	
		}
		return true;
	}
	
	function getStoredAssignValues(sel1, sel2) {
		var leftTexts = new Array(sel1.options.length);
		var rightTexts = new Array(sel2.options.length);
		var leftKeys = new Array(sel1.options.length);
		var rightKeys = new Array(sel2.options.length);
		for (var i=0; i<sel1.options.length; i++) {
		  leftKeys[i] = sel1.options[i].value;
		  leftTexts[i] = sel1.options[i].text;
		}
		for (var i=0; i<sel2.options.length; i++) {
		  rightKeys[i] = sel2.options[i].value;
		  rightTexts[i] = sel2.options[i].text;
		}
		var array = new Array (
			leftTexts,
			rightTexts,
			leftKeys,
			rightKeys
		);
		return array;
	}
	
	function resetAssign(array,sel1,sel2) {
		var leftTexts = array[0];
		var rightTexts = array[1];
		var leftKeys = array[2];
		var rightKeys = array[3];
		clearList(sel1);
		clearList(sel2);
		populate(sel1,leftKeys,leftTexts);
		populate(sel2,rightKeys,rightTexts);
	}


function deleteCharAt(pStr, index) {
	var str = pStr;
	var temp = "";
	temp = str.substring(0,index);
	temp +=str.substring(index+1,str.length);
	return temp;
}

function insertStrAt(pStr, index, otherStr) {
	var str = pStr;
	var slices = new Array(2);
	slices[0] = str.slice(0,index);
	slices[1] = str.slice(index,str.length);
	return slices[0]+otherStr+slices[1];
}

function replaceStrAt(pStr, index, otherStr) {
	var str = pStr;
	var temp ="";
	var lastIndex = otherStr.length;
	temp = str.substring(0,index);
	temp += otherStr + str.substring(index+lastIndex,str.length);
	return temp;
}

function parseDouble(pNumber) {
	return parseLocalizedDouble(pNumber,ngLocale);
}

function parseLocalizedDouble(pNumberString,locale) {
	var invalidValue = Number.NaN;
   var str = pNumberString;
   if ( !unitSeparator ) unitSeparator = ",";
   if ( !thousandSeparator ) thousandSeparator = ".";
    if (pNumberString == null || pNumberString == 'undefined' || locale == null){
      return invalidValue;
    } else {  
	    var isPortuguese = (locale == "pt");
	    var isSpanish = (locale == "es");
	    var isCommaLocale = isPortuguese || isSpanish;
	    
       var indexThousandSeparator = str.indexOf(thousandSeparator);	    
	 	 var indexUnitSeparator = str.indexOf(unitSeparator);
	 	 if (indexUnitSeparator != str.lastIndexOf(unitSeparator)) return invalidValue;
		 var hasDot = (indexThousandSeparator != -1);
       var hasComma = (indexUnitSeparator != -1);
       if (indexUnitSeparator == 0 || indexThousandSeparator == 0) return invalidValue;
       if (hasDot && hasComma) {
            if (indexUnitSeparator < indexThousandSeparator) return invalidValue;
            while (indexThousandSeparator != -1) {
              var nextString = str.substring(indexThousandSeparator+1,str.length);
              var charsBefore = str.substring(0,indexThousandSeparator).length+1;
              var nextThousandSeparator = nextString.indexOf(thousandSeparator);
              if (nextThousandSeparator == -1) break;
              var strBetweenDots = str.substring(indexThousandSeparator+1,nextThousandSeparator+charsBefore);
              var digitsAfterDot = strBetweenDots.length;
              if (digitsAfterDot != 3) return invalidValue;
              indexThousandSeparator = str.indexOf(thousandSeparator);
              str = deleteCharAt(str, indexThousandSeparator);
              indexThousandSeparator = str.indexOf(thousandSeparator);
				}      
            indexThousandSeparator = str.indexOf(thousandSeparator);
            indexUnitSeparator = str.indexOf(unitSeparator);
            if (indexThousandSeparator != -1) {
              var digitsAfterDot = str.substring(indexThousandSeparator+1,indexUnitSeparator).length;
              if (digitsAfterDot != 3) return invalidValue;
              str = deleteCharAt(str,indexThousandSeparator);
            }
            indexUnitSeparator = str.indexOf(unitSeparator);
            if (isCommaLocale) 
              str = replaceStrAt(str, indexUnitSeparator,thousandSeparator);
            return parseFloat(str);
      }
      if (hasDot) {
            if (indexThousandSeparator == 0) return invalidValue;
            while (indexThousandSeparator != -1) {
              var nextString = str.substring(indexThousandSeparator+1,str.length);
              var charsBefore = str.substring(0,indexThousandSeparator).length;
              var nextThousandSeparator = nextString.indexOf(thousandSeparator);
              if (nextThousandSeparator == -1) break;
              var strBetweenDots = str.substring(indexThousandSeparator+1,nextThousandSeparator+charsBefore+1);
              var digitsAfterDot = strBetweenDots.length;
              if (digitsAfterDot != 3) return invalidValue;
              indexThousandSeparator = str.indexOf(thousandSeparator);
              str = deleteCharAt(str, indexThousandSeparator);
              indexThousandSeparator = str.indexOf(thousandSeparator);
            }
            indexThousandSeparator = str.indexOf(thousandSeparator);
            if (indexThousandSeparator != -1) {
              var digitsAfterDot = str.substring(indexThousandSeparator+1,str.length).length;
              if (digitsAfterDot != 3) return invalidValue;
              str = deleteCharAt(str, indexThousandSeparator);
            }
            return parseFloat(str);
     }
     if (hasComma) {
            if (indexUnitSeparator == 0) return invalidValue;
            str = (isCommaLocale)?replaceStrAt(str, indexUnitSeparator,thousandSeparator):str;
            return parseFloat(str);
     }
	} 
    return parseFloat(str);
}

function formatDouble(nbr,dec) {
	return formatLocalizedDouble(nbr,dec,ngLocale);	
}

function formatLocalizedDouble(nbr, dec, locale) {
	if ( isNaN(nbr) || locale == null || locale == "undefined" ||  nbr == null || String(nbr).length == 0) {
		return "";   
	}
	var negative = (String(nbr).charAt(0) == '-')  ? true : false;
	var integerPart = String(Math.abs(parseInt(nbr)));
	var decimalPart = nbr - integerPart;
	var hasDecimal = (decimalPart != 0);
	var decStr = "00";
	if ( hasDecimal ) {
		var power = Math.pow(10,dec);
		decimalPart = Math.round(decimalPart * power)/power;
		if (decimalPart >= 1) {
   		integerPart++;
		}
		decStr = String(decimalPart).substring(2);
		while (decStr.length < dec  ) {
	   	decStr += "0";
		}
   }
	var cont = 0;
	var size = integerPart.length;
	for ( var i=size; i>0; i-- ) {
		if ( cont == 3) {
	   		cont = 0;
				integerPart = insertStrAt(integerPart, i, thousandSeparator);   					
		}
		cont++;
	}	
	return ((negative) ? '-' : '')+ integerPart + unitSeparator + decStr;
}

function calculate(nbr) {
	var number = eval(nbr);
	var tenToPower=Math.pow(10, 6);
	return (Math.round(number*tenToPower)/tenToPower);
}

function spin(txf,minimum,maximum,unit) {
	var value = txf.value;
	if ( isNaN(value) ) {
		return;
	}
	if ( Trim(value) == "" ) {
   	txf.value = minimum;
   	return;
	}
	value = eval(value);
	if ( value == maximum && unit > 0 ) {
   	return;
	}
	if ( value == minimum && unit < 0 ) {
   	return;
	}
	if ( value > maximum) {
   	txf.value = maximum;
   	return;
	}
	if ( value < minimum ) {
   	txf.value = minimum;
   	return;
	}
   txf.value = eval(value+unit);	
}

function isObjectValid(obj) {
	return ((typeof obj == "object") && (obj.type != null));
}

function setFocus(objNameStr,index) {
	exceptionOcurred = true;
	var obj = eval(objNameStr);
	if (!isObjectValid(obj)) {
		var o = (isNaN(index) || index <0) ? objNameStr : objNameStr+"["+index+"]";
		obj = eval(o);
	}	
	if ( isObjectValid(obj)) {
		obj.focus();
		if (obj.type == 'text' || obj.type == 'password'|| obj.type == 'textarea') {
   		obj.select();
		}
	} else {
		alert("ERRO DE PROGRAMAÇÃO !!! \n\n'"+objNameStr+"' NÃO É UM OBJETO VÁLIDO. VERIFIQUE SUA EXISTÊNCIA E QUANTIDADE.");
	}
}

function resetAllSelect(form) {
	for (var i = 0; i < form.elements.length; i++) {
		var x = form.elements[i];
		if (x.type == 'select-one'){
			x.selectedIndex = 0;
		}
	}
	return false;
}

function showTip(e,text){
	if (document.layers){
   	document.tooltip.document.write('<layer bgColor="#FFFFE1" style="FONT-FAMILY: \'Tahoma\';border:1px solid black;font-size:11px;">'+text+'</layer>');
		document.tooltip.document.close();
		document.tooltip.left=e.pageX+5;
		document.tooltip.top=e.pageY+5;
		document.tooltip.visibility="show";
		return true;
	}
}

function hideTip(){
	if (document.layers) document.tooltip.visibility="hidden";
}

function formatCurrencyBackwards(fld, e, numDecimals, limit) {
	 if ( numDecimals == null ) numDecimals = 2; 
	 var sep = 0;
    var key = '';
    var i = j = 0;
    var len = len2 = 0;
    var strCheck = '0123456789';
    var aux = aux2 = '';
    var code = (window.Event) ? e.which : e.keyCode;
	 if ((e.shiftKey && code != 9) || e.ctrlKey) return false;
	 if ( code == 8 || code == 46 ) {
   	fld.value = "";
	 }
	 if (code == 8 || code == 9 || code == 13 || code == 46) return true; // backspace, tab,enter and delete 
  	 if (code > 95 && code <106) { // hack fornumpad
		code = code - 48;
  	 }
    key = String.fromCharCode(code);  // Get key value from key code
    if (strCheck.indexOf(key) == -1){
    	 return false;  // Not a valid key
    }
    len = fld.value.length; 
    for(i = 0; i < len; i++) {
	    if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != unitSeparator)) 
	   	break;
	 }
    aux = '';
    for(; i < len; i++) {
    	if (strCheck.indexOf(fld.value.charAt(i))!=-1) 
    		aux += fld.value.charAt(i);
    }
    aux += key;
    len = aux.length;
  	 if (len > limit ) return false;
    if (len == 0) fld.value = ''; 
  	 for ( var temp=1; temp<=numDecimals; temp++ ) {
  	   var zeros = '';
  		for ( var z=0; z < (numDecimals - temp); z++ ) {
			zeros +='0';   
		}
   	if (len == temp && numDecimals > 0 ) fld.value = '0' + unitSeparator + zeros + aux;
	 } 
   
    if (len > numDecimals) {
      aux2 = '';
      for (j = 0, i = len - (numDecimals + 1); i >= 0; i--) {
        if (j == 3) {
          aux2 += thousandSeparator;
          j = 0;
        }
        aux2 += aux.charAt(i);
        j++;
      }
      fld.value = '';
      len2 = aux2.length;
      for (i = len2 - 1; i >= 0; i--) {
	      fld.value += aux2.charAt(i);
	   }
	   var sep = (numDecimals > 0) ? unitSeparator:'';
      fld.value += sep + aux.substring(len - numDecimals, len);
    }
    return false;
}

function maskInteger(fld, e, limit) {
	return maskCurrency(fld, e, 0, limit);
}
// The following functions are used to tabulate between components using ENTER key.

netscape = "";
ver = navigator.appVersion; len = ver.length;
for(iln = 0; iln < len; iln++) if (ver.charAt(iln) == "(") break;
netscape = (ver.charAt(iln+1).toUpperCase() != "C");

var initialized = false;
var fullComponents;

var nextField = null;
var actualObj = null;

function setNextField(obj) {
	if ( !initialized ) {
		fullComponents = getObjs(obj.form);
		initialized = true;
	}  
	actualObj = obj;
	index = getIndexFor(fullComponents,obj);
	var nextIndex = index;
	do {
		nextIndex ++;
		if ( nextIndex == fullComponents.length ) {
		// Falta Encontrar um meio ciclico para a tabulação
			return;
		} else {
			nextField = fullComponents[nextIndex];
		}//if
	} while (nextField == null || nextField.disabled)
}

function getIndexFor(array,obj) {
	var returnedValue = -1;
	for ( var i=0; i<array.length; i++ ) {
		if ( array[i] == obj  ) {
			returnedValue = i;   
			break;
		}   
	}
	return returnedValue;
}

function getObjs(form) {
 var l = form.elements.length;
 var x = new Array();
 for (i=0;i<l;i++) {
   var obj=form.elements[i];
   if ( obj.type != 'hidden' ) {
   	x[x.length] = obj;
	}  
 }
 return x;
}

function keyDown(DnEvents) { // handles keypress
	// determines whether Netscape or Internet Explorer
	k = (netscape) ? DnEvents.which : window.event.keyCode;
	if (k == 13) { // enter key pressed
		if (nextField == null || actualObj.type == 'textarea') {
			return true; // submit, we finished all fields
		} else { // we're not done yet, send focus to next box
			if ( actualObj != null && actualObj.type == 'button' || actualObj.type ==  'submit' || actualObj.type == 'reset' ) {
				actualObj.focus();
	   		actualObj.click();
	   	} else {		
				nextField.focus();
			}//if
			return false;
      }//if
  }//if 
}

document.onkeydown = keyDown; // work together to analyze keystrokes
if (netscape) document.captureEvents(Event.KEYDOWN|Event.KEYUP);

// The Above Functions are used to tabulate between components using ENTER key

function clearAllRadioButtons(form) {
	clearAllRadioButtonsLike(form,"");
}

function clearAllRadioButtonsLike(form,str) {		
	for (var i = 0; i < form.elements.length; i++) {
			var x = form.elements[i];
			if (x.type == 'radio') {
					if ( x.name.indexOf(str) != -1) {					
						x.checked = false;   
						//x.onclick();
					}
			}	
	}	
}

function changeTblColor(chb, tag, firstRow, row, totalCol) {
	if (!document.getElementById) return;
//	return;
	if ( chb.type == "radio" ) {
		array = eval("document."+chb.form.name+"."+chb.name);
		// para cada linha..
		for ( var i=0; i<array.length; i++ ) {
			counter = 0;
			var o = array[i];
			// para cada coluna...
			for ( var j=0; j<totalCol; j++ ) {
				var obj = document.getElementById(tag+""+i+j);
				if ( obj == null ) continue;
				obj.className = (o.checked) ? "selected" : getCSSClassFor(firstRow,i);   
			}		
		}	
	} else {
		for ( var i=0; i<totalCol; i++ ) {
			var obj = document.getElementById(tag+""+row+i);
			if ( obj == null ) continue;
			obj.className = (chb.checked) ? "selected" : getCSSClassFor(firstRow,row);   
		}		
	}
}
 
 function getCSSClassFor(firstRow, row) {
    var classType = null;
    if ((firstRow % 2) == 0) {
      classType = (row % 2 == 0)? "even" : "odd";
    } else {
      classType = (row % 2 == 0)? "odd" : "even";    
    }
    return classType;
  }

function populatePageParams(form, fp, tp, UC , page) {
	form.fromPage.value = (fp != null)? fp : form.fromPage.value ;   
	form.toPage.value = (tp != null)? tp : form.toPage.value ;   
	form.ucAction.value  = (UC != null)? UC : form.ucAction.value ;
	form.pageAction.value = (page != null)? page : form.pageAction.value ;   
}

function sortColumn(index,field) {
	populatePageParams(field.form,null,null,null,"sort");
	field.value = index;
	submitForm(field.form);
}

function radioReadOnly(radio) {
	var elements = eval("document."+radio.form.name+"."+radio.name);
	for ( var i=0; i<elements.length; i++ ) {
		if (elements[i].defaultChecked) {
			elements[i].checked = true;   
			break;
		}
	}
}

function removeSelectedItems(sel) {
	var x = sel.options;
	for ( var i=x.length-1; i>=0; i-- ) {
		if ( sel.options[i].selected ) {
	   		sel.options[i] = null;
		}
	}	
}

function adjustTextArea(txa){
  if (window.screen.width > 1024){
    txa.cols=80;
  } else {
	  if (window.screen.width > 800){
   	 txa.cols=70;
	  } else {
		  if (window.screen.width > 640) {
		    txa.cols=48;
	     }//if
	  }//if
  }//if
}

function adjustDiv(divid){
  var div = document.getElementById(divid);
  var screenWidth = 1024;
  var divWidth = "550px";
  if (div){
    divWidth = (window.screen.width > 1024)?"650px":divWidth;
    divWidth = (window.screen.width > 800)?"550px":divWidth;
    divWidth = (window.screen.width > 640)?"450px":divWidth;
    if (div.style.width){
      div.style.width = divWidth;
    }//if
  }//if 
  
}

function adjustSpan(id, width640, width800, width1024){
  var spanWidth;
  var span = document.getElementById(id);
  width640 = (width640 == null)?"775px":width640;
  width800 = (width800 == null)?"100%":width800;
  width1024 = (width1024 == null)?"100%":width1024;
  if (span != null){
    spanWidth = (window.screen.width > 640)?width640:spanWidth;
    spanWidth = (window.screen.width > 800)?width800:spanWidth;
    spanWidth = (window.screen.width > 1024)?width1024:spanWidth;
    if (span.style.width){
      span.style.width = spanWidth;
    }//if
  }//if 
}

function showDefaultMessage() {
		showMessage("information", defaultMsg);
		return true;
}


//Used on Text Fields. ONKEYDOWN="return maskDateField(this,event)"
function maskDateField(f, e) {
	if (!f.maxLength) f.maxLength = 10; // hack for netscape
	if (f.readOnly) return false;
	var mask = dateMasks[ngLocale];
	var code = (document.all) ? e.keyCode : e.which;
	if ( code == 8 || code == 46 ) {// backspace (8) & delete (46)
   		//f.value = "";
			return true;
	}
	if (e.ctrlKey && (code == 86 || code == 67)) { // copy (86) & paste (67) 
		return true;
	}
	if ((e.shiftKey && code != 9) || e.ctrlKey) return false;
	if (code == 8 || code == 9 || code == 13 || code == 46) return true; // backspace (8), tab (9) ,enter (13) and delete (46)
	if ( f.maxLength <= f.value.length )  return false;
	if (code > 95 && code <106) { // hack fornumpad
		code = code - 48;
	}
	if (code > 47 && code < 58) {
	 var nextChar = String.fromCharCode(code);
	 var charMask = mask.charAt((f.value.length)% mask.length);
	 if ( charMask != 'd' && charMask != 'M' && charMask != 'y')
		 f.value+= charMask;
	 f.value+=nextChar;
	 f.select();
	}
	return false;
}

function formatDate(date,format) {
	LZ = new Function("x","return(x<0||x>9?\"\":\"0\")+x");
	format = (format == null) ? dateMasks[ngLocale] : format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=monthArray[M-1];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
 }

function maskCurrency(f, e, numDecimals, limit) {
	if ( !document.all && !document.layers ) {
	   	return true;
	}
	if (f.readOnly) {
		return false;
	}
	if ( numDecimals == null ) {
		numDecimals = 2;
	}
	var code = (document.all) ? e.keyCode : e.which;
	f.nextDecimal = ( f.nextDecimal  == null) ? 0 : f.nextDecimal;
	if ((e.shiftKey && code != 9) || e.ctrlKey) {
		return false;
	}
	if (code == 9 || code == 13 || code == 27) {
		return true; // tab,enter and ESC
	}
 	if ( code == 8 || code == 46) {	// backspace, delete was pressed, clean field
   		f.value = "";
   		f.unitSeparatorTyped = false;
   		f.nextDecimal = 0;
   		f.mustDelete = false;
   		return false;
	}

	if (code > 95 && code <106) { // hack for numpad
		code = code - 48;
	}
	if ( code == 188 || code == 190 || code == 110 ) { // , and .
   		code = unitSeparator.charCodeAt(0);
	}
	if ( f.mustDelete) {
		f.unitSeparatorTyped = false;
		f.nextDecimal = 0;
	   	f.value = "";
	}
	//f.form.tst.value = "Code: "+code+" - "+String.fromCharCode(code);
	var a = f.value.split(unitSeparator);
   var integerPart = (a[0] == "") ? "0" : a[0];
   var decimalPart = (a[1] == null) ? "" : a[1];
   for ( var i=0; i<integerPart.length; i++ ) {
   	if ( integerPart.charAt(i) == thousandSeparator ) {
   		integerPart = deleteCharAt(integerPart,i--);
		}
	}
   if ( decimalPart == "") {
		for ( var i=0; i<numDecimals; i++ ) {
			decimalPart+="0";
		}
	}



	// Discover next decimal available position;
	for ( var i=decimalPart.length-1; i>=0 && f.nextDecimal ==-1; i-- ) {
		if(decimalPart.charAt(i) != '0') {
			f.nextDecimal= i+1;
		}
	}
	
	// check if is already full.
	if (numDecimals != 0 && (f.nextDecimal >= numDecimals)) {
		return false;  	
	}

   var c = String.fromCharCode(code);
	if (code > 47 && code < 58) { // is integer
		if ( !f.unitSeparatorTyped || numDecimals == 0) {
			if (integerPart == '0') {
				if (c != '0') integerPart =c;
			} else {
				var integerSize = limit - numDecimals;
				if ( integerPart.length < integerSize ) {
					integerPart +=c;
				}
			}
		} else {   		
		   decimalPart = replaceStrAt(decimalPart, f.nextDecimal++, c);
		}		
		var counter = 0;
	   for ( var i=0; i<integerPart.length; i++ ) {
   		if ( counter == 3) {
   			integerPart = insertStrAt(integerPart, (integerPart.length-i), thousandSeparator);
   			counter = -1;
			}
			counter++;
		}
		f.value = integerPart +((numDecimals != 0) ? unitSeparator : "") +decimalPart;
		f.select();
		f.mustDelete = false;
	} else if (unitSeparator == c) { // separator
			if ( !f.unitSeparatorTyped) {
			   f.unitSeparatorTyped = true;   
			}
	} 
	
	return false;
}

function keepRange(f, dec, minValue, maxValue) {
	  //usar somente com evento onBlur
	  if ((f.value == null) || (f.value.trim().length == 0))
	  		return;
	  var val = parseDouble(f.value);
	  if ( minValue != null ) {
        val = Math.max(val,minValue);
   }
	  if ( maxValue != null ) {
				 val = Math.min(val,maxValue);
		}
		f.value = formatDouble(val, dec);
		if (dec == 0 ) {
			f.value = Math.round(val);
   }

}

function storeTempValue(comp) {
	comp.mustDelete = true;
	comp.defaultTempValue = comp.value;
	comp.select();
}

function checkTempValue(comp) {
	if ( comp.value != comp.defaultTempValue && comp.onchange ) {
   	comp.onchange();
	}
	comp.mustDelete = false;
}

function hideLayer(lay) {
	if (ie4) {document.all[lay].style.visibility = "hidden";}
	if (ns4) {document.layers[lay].visibility = "hide";}
	if (ns6) {document.getElementById([lay]).style.display = "none";}
}

function showLayer(lay) {
	if (ie4) {document.all[lay].style.visibility = "visible";}
	if (ns4) {document.layers[lay].visibility = "show";}
	if (ns6) {document.getElementById([lay]).style.display = "block";}
}

function writeToLayer(lay,txt,form) {
	if (ie4) {
		document.all[lay].innerHTML = txt;
	}
	if (ns4) {
		document[lay].document.write(txt);
		document[lay].document.close();
	}
	if (ns6) {
		var over = document.getElementById([lay]);
		var range = document.createRange();
		range.setStartBefore(over);
		var domfrag = range.createContextualFragment(txt);
		while (over.hasChildNodes()) {
			over.removeChild(over.lastChild);
		}
		over.appendChild(domfrag);
   }
   // Check hidden field
   var token = "unique";
   var hidValue = form[lay.substring(lay.indexOf(token) + token.length)];
//   var hidValue = form["hid"+lay];
   if (isObjectValid(hidValue)) {
        hidValue.value = txt;
   }
}

function copyColumnValues(){
  var sampleObject = actualObj;
  if ((isObjectValid(sampleObject)) && (sampleObject.type == 'text' || sampleObject.type == 'textarea')) {
    var form = sampleObject.form.name;
    var objName = sampleObject.name;
	var actualTemp = eval("document." + form + "." + objName);	
    var objValue = sampleObject.value;
    var lastIndex = objName.lastIndexOf('_') + 1;
    var indexA = objName.substring(lastIndex);
    objName = objName.substring(0, lastIndex);
    while (isObjectValid((sampleObject = sampleObject.form[objName+(++indexA)]))) {
	  sampleObject.focus();
      sampleObject.value = objValue;
    }
	actualTemp.focus();
  }
}



