/**************************************************************************
 * Funções JavaScript utilizadas na Interface Padrão definida para o TJPR *
 **************************************************************************/

/**
 * Adição das funções trim do String em JavaScript
 */
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

/**
 * Função pra abrir/fechar o detalhe de uma linha da pesquisa
 * @param _row linha do detalhe para mostrar ou esconder
 * @param _icon ícone do detalhe aberto/fechado
 */
function showDetail(_row, _icon){
	// recuperar a linha do detalhe a mostrar/esconder
	var trDetail = document.getElementById(_row);
	// recuperar o ícone de mostrar/esconder
	var trIcon = document.getElementById(_icon);
	// alterar para mostrar (none) ou esconder a linha
	trDetail.style.display = (trDetail.style.display=="none" ? "" : "none");
	// alterar para o ícone de abrir (none) ou fechar a linha
	trIcon.src = (trDetail.style.display=="none" ? trIcon.src.replace("iMinus","iPlus") : trIcon.src.replace("iPlus","iMinus"));
}

/**
 * Função pra abrir uma janela modal
 * @param _url que será aberta
 * @param _title título da janela
 * @param _length comprimento janela
 * @param _height altura janela
 */
function openDialog(_url, _title, _width, _height) {
	var win = new Window({className:"tjpr", title:_title,
                          top:70, left:100, width:_width, height:_height,
                          url:_url, minimizable:false, destroyOnClose:true});
    win.showCenter(true);
}

/**
 * Função pra abrir uma nova janela
 * @param _url que será aberta
 * @param _title título da janela
 */
function openWindow(_url, _title, _length, _height) {
	var largura = parseInt(_length);
	var altura = parseInt(_height);
	var _windowParams = "toolbar=no,status=no,resizable=yes,hotkeys=no,directories=no,location=no,menubar=no,personalbar=no,screenX=0,screenY=0,outerWidth="+ largura +",outerHeight="+ altura +",scrollbars=yes";
	var _window = window.open(_url,_title,_windowParams);	
	_window.resizeTo(0,0);
	_window.moveTo(100,100);
	_window.resizeBy(largura,altura);
	return _window;
}

/**
 * Função pra abrir uma nova janela de download
 * @param _url que será aberta
 */
function downloadWindow(_url) {
	openWindow(_url, "downloading", 85, 25);
	void(0);
}

/**
 * Função pra mostrar ou não um determinado menu
 * @param _divName bloco do menu e submenus que serão mostrados
 * @param _action ação que realizada mostrar (over) ou  esconder ('out')
 */
function menu(_divName, _action){
	var divMenu = document.getElementById('menu' + _divName);
	var divSubMenu = document.getElementById('sub' + _divName);
	// verificar a ação realizada
	if(_action=='over') {
		divSubMenu.style.display = "block";
		divMenu.className = 'menubar_hover'; /*'#B5C8DB';*/
		toggleSelects(false);
		
	} else if(_action=='out') {
		divSubMenu.style.display = "none";
		divMenu.className = 'menubar'; /*'#B5C8DB';*/
		toggleSelects(true);
	}
}

/**
 * Função para remover os combo-box quando o menu é aberto 
 * para não sobrepor o menu aberto
 * @param show boolean (mostrar ou não os combos)
 */
function toggleSelects(show){
	if (navigator.appName == "Microsoft Internet Explorer"){
		var sels = document.getElementsByTagName("SELECT");
	    for (var i = 0; i < sels.length; i++) {
	    	if (show) {
	           	sels[i].style.display = "";
	        } else {
	           	sels[i].style.display = "none";
	        }
		}
	}
}

/**
 * Função pra desabilitar toda a tela (links, botões, campos, ...)
 * @see disableLinks()
 * @see disableFormElement()
 */
function disableScreen() {
	// desabilitar os links
	disableLinks();
	// desabilitar os campos inputs
	var _inputs = document.getElementsByTagName('INPUT');
	if(_inputs != null && "" + _inputs != "undefined"){
		for (var i=0; i<_inputs.length; i++) {
			disableFormElement(_inputs[i]);
		}
	}
	// desabilitar os campos select
	var _selects = document.getElementsByTagName('SELECT');
	if(_selects != null && "" + _selects != "undefined"){
		for (var i=0; i<_selects.length; i++) {
		  	disableFormElement(_selects[i]);
		}
	}
	// desabilitar os campos textarea
	var _textareas = document.getElementsByTagName('TEXTAREA');
	if(_textareas != null && "" + _textareas != "undefined"){
		for (var i=0; i<_textareas.length; i++) {
		  	disableFormElement(_textareas[i]);
		}
	}
}

/**
 * Função para desabilitar todos os links
 */
function disableLinks()	{
	// desabilitar todos os links
	var _links = document.links;
	if(_links != null && "" + _links != "undefined"){
		for(i=0; i<_links.length; i++) {
			document.links[i].style.cursor="wait";
			document.links[i].href="#";
			document.links[i].disabled = true;
			document.links[i].onclick = "javascript:void(0);";
		}
	}
}

/**
 * Função para desabilitar um elemento de formulário
 * @param _element elemento de formulário pra desabilitar
 */
function disableFormElement(_element) {
	// verificar cada elemento de formulário
	switch (_element.type.toLowerCase()) {
   		case 'text': 
	   		_element.readOnly = true;
   			break;
    	case 'password': 
	    	_element.readOnly = true;
    		break;
    	case 'select-one': 
	    	_element.readOnly = true;
    		break;
    	case 'select-multiple': 
	    	_element.readOnly = true;
    		break;
    	case 'radio': 
	    	_element.readOnly = true;
    		break;
   		case 'textarea': 
	   		_element.readOnly = true;
   			break;
   		case 'button': 
   		  	_element.disabled = true;
      		break;
   		case 'reset':
   		  	_element.disabled = true;
      		break;
   		case 'submit':
   		  	_element.disabled = true;
      		break;
   		case 'checkbox':
   			_element.readOnly = true;
    		_element.onclick = "javascript:void(0);"; 		     		
     		break;	   	  	
	}
	// colocar a ampulheta para todos os elementos em espera
	_element.style.cursor= "wait"; 
}

/**
 * Função para limpar as seleçoes de um tela inclusive se existirem campos escondidos
 * @param formName nome do form para remover os seletores escondidos
 * @param selectionName nome do seletor para ser desmarcado
 */
function clearSelection(formName, selectionName){
	// limpar os campos mostrados
	checkAll($(formName)[selectionName], false);
	// remover os campos escondidos de seleção
	$(formName).getInputs('hidden', selectionName).each(Element.remove);
}

/**
 * Função para selecionar/deselecionar checkboxes
 * @param checkbox um ou vários checkbox para serem marcados ou desmarcados
 * @param checked valor booleano indicando se o(s) checkbox(es) devem ser marcados
 */
function checkAll(checkbox, checked) {
	if (checkbox) {
		if (checkbox.length) {
			for (var i=0; i<checkbox.length; i++) {
                checkbox[i].checked = checked;
			}
		} else {
			checkbox.checked = checked; 
		}
	}
}

/**
 * Função que retorna true se algum checkbox estiver selecionado
 * @param checkbox ou um array de checkbox para verificação
 * @return boolean (selecionado ou não)
 */
function isAnyChecked(checkbox) {
    if (checkbox) {
        if (checkbox.length) {
            for (var i=0; i<checkbox.length; i++) {
	            if (checkbox[i].type.toLowerCase() == "checkbox" && checkbox[i].checked) {
                    return true;
                }
            }
            return false;
        } else { 
            return checkbox.checked;
        }
    }
    return false;
}

/**
 * Função que retorna true se todos os checkbox estiverem selecionados
 * @param checkbox ou um array de checkbox para verificação
 * @return boolean ("todos" selecionados ou não)
 */
function isAllChecked(checkbox) {
    if (checkbox) {
        if (checkbox.length) {
            for (var i=0; i<checkbox.length; i++) {
	            if (checkbox[i].type.toLowerCase() == "checkbox" && !checkbox[i].checked) {
                    return false;
                }
            }
            return true;
        } else { 
            return (checkbox[i].type.toLowerCase() == "checkbox" && checkbox[i].checked);
        }
    }
    return false;
}

/**
 * Função para selecionar itens selecionados para a página pai.
 * Todos os objetos devem ter o identificador "id" correspondente ao parâmetro.
 * @param _formName nome do formulário de seleção (atual)
 * @param _parentFormNames nomes dos formulários pai para a seleção
 * @param _formFields array com o nome dos campos do formulário de seleção (atual)
 * @param _parentFormFields array com o nome dos campos do formulário pai para a seleção
 * @see /js/prototype.js#getInputs() 
 * @see /js/window/window.js#getFocusedWindow()
 */
function setParentSelection(_formName, _parentFormNames, _formFields, _parentFormFields){
  // formulário da página de seleção aberta (atual)
  var _form = $(_formName);
  // o primeiro campo é o de seleção com um arrays de radio ou checkbox
  var _selection = _form.getInputs('', _formFields[0]);
  // verificar cada formulário pai que poderia ser selecionado
  for(i=0; i<_parentFormNames.length; i++){
    // formulário pai que pode ser selecionado
  	var _parentForm = window.parent.$(_parentFormNames[i]);
  	// verificar se o formulário pai foi encontrado
  	if(_parentForm != null && "" + _parentForm != undefined){
  	  // verificar todos os campos de seleção
  	  for(j=0; j<_selection.length; j++){
    	// verificar se o campo de seleção está selecionado
      	if(_selection[j].checked){
		  // atribuir para cada valor do formulário da página de seleção o valor correspondente na página pai 
      	  for(k=0; k<_formFields.length; k++){
        	// recuperar o valor do campo da página de seleção (atual) do índice do campo de seleção
        	var _formFieldValue = _form.getInputs('', _formFields[k])[j].value;
        	// recuperar o campo do formulário da página pai 
        	var _parentFormField = _parentForm.getInputs('', _parentFormFields[k]);
        	// verificar se o campo da página pai foi encontrado (array preenchido)
        	if(_parentFormField.length > 0){
        		// atribuir o valor ao primeiro campo encontrado
        		_parentFormField[0].value = _formFieldValue;
        	}
        	// recuperar o elemento do formulário da página pai (no caso de um bloco DIV, SPAN, ...)
        	var _parentFormBlock = window.parent.$(_parentFormFields[k]);
        	// verificar se o bloco foi encontrado
        	if(_parentFormBlock != null && "" + _parentFormBlock != undefined){
        		// atualizar o valor do bloco
        		_parentFormBlock.update(_formFieldValue);
        	}
      	  }
      	  break;
      	}
  	  }
  	}
  }
  // fecha a janela atual após a seleção
  window.parent.Windows.getFocusedWindow().close();
}

/**
 * Função para selecionar itens selecionados para a página pai submetendo.
 * Todos os objetos devem ter o identificador "id" correspondente ao parâmetro.
 * @param _formName nome do formulário de seleção (atual)
 * @param _parentFormNames array de nomes dos formulários pai para a seleção
 * @param _formURLs array de urls possíveis para submeter os dados do form atual
 * @param _parentFormURLs array de urls para submeter as páginas pai para atualização
 * @see /js/prototype.js#request() 
 */
function submitParentSelection(_formName, _parentFormNames, _formURLs, _parentFormURLs){
  // formulário da página de seleção aberta (atual)
  var _form = $(_formName);
  // verificar cada formulário pai que poderia ser selecionado
  for(i=0; i<_parentFormNames.length; i++){
    // formulário pai que pode ser selecionado
  	var _parentForm = window.parent.$(_parentFormNames[i]);
  	if(_parentForm != null && "" + _parentForm != undefined){
  	  // definir a ação para submeter a página atual no mesmo índice do form pai
	  _form.action = _formURLs[i];
	  _form.request({
	    onSuccess: function() {
	      // definir a ação para submeter o form pai para atualizar
	      _parentForm.action = _parentFormURLs[i];
	      _parentForm.submit();
	    }
	  });
	  break;
  	}
  }  
}

/*
 * Função para alterar a aba selecionada por submit (_tabName) ou não (_tabIndex) do form
 * @param _url URL para submeter o formulário
 * @param _tabName nome da aba para submeter por formulário
 * @param _tabIndex índice da nova aba para selecionar
 * @see /js/prototype.js#Element.removeClassName()
 * @see /js/prototype.js#Element.hide()
 * @see /js/prototype.js#Element.addClassName()
 * @see /js/prototype.js#Element.show()
 */
function setTab(_url, _tabName, _tabIndex){
  // verificar se a aba está escondida para mostrar por JavaScript
  var tabBlock = document.getElementById('tab' + _tabIndex);
  if(tabBlock != null && "" + tabBlock != "undefined"){
	var index = 0;
	// esconder as abas e seus blocos
	do {
	  Element.removeClassName('tabItem' + index, 'currentTab');
	  Element.hide('tab' + index);
	  tabBlock = document.getElementById('tab' + (++index));
	} while(tabBlock != null && "" + tabBlock != "undefined");
  	// mostrar a aba selecionada e seu bloco
  	Element.addClassName('tabItem' + _tabIndex, 'currentTab');
  	Element.show('tab' + _tabIndex);
  	// configurar o form se existir com a tab atual
  	var _form = document.forms[0];
 	if(_form != null && "" + _form != "undefined"){
  	  _form.selectedIcon.value = _tabName;
  	}  	
  // mostrar as abas por submit do form
  } else {
  	var _form = document.forms[0];
 	if(_form != null && "" + _form != "undefined"){
 	  if(_url != null && _url != "null" && _url != ""){
 	  	_form.action = _url;
 	  }
  	  _form.selectedIcon.value = _tabName;
  	  _form.submit();
  	}
  }
}

/**
 * Função para alternar a visibilidade dos campos de pesquisa avançada
 * @param linkId ID do link que abre a pesquisa avançada
 * @param className classe das linhas que pertencem à pesquisa avançada
 */
function toggleVisibility(linkId, className) {
    var elements = $$("." + className);
    for (var i=0; i<elements.length; i++) {
        elements[i].toggle();
    }
    var element = $(linkId);
    if (element) {
        if ($(element).hasClassName("openedAdvancedSearch")) {
            $(element).className = "closedAdvancedSearch";
        } else {
            $(element).className = "openedAdvancedSearch";
        }
    }
}

/**
 * Função para limpar os campos de um formulário
 * Exemplo: &lt;input type="button" onclick="formReset($('form'))"&gt;
 * @param form Formulário que contém os campos a serem limpos
 */
function formReset(form) {
  for (i in $(form).elements) {
    var element = $(form).elements[i];
    var type = $(element).type;
    if (type == "text" || type == "textarea" || type == "hidden")
      $(element).value = "";
    if (type == "select-one")
      $(element).selectedIndex = 0;
    if (type == "select-multiple")
      $(element).selectedIndex = -1;
    if (type == "radio" || type == "checkbox")
      $(element).checked = false;
  }
}

/**
 * Função para confirmar se itens foram selecionados para executar uma determinada ação
 * @param checkbox campo(s) de seleção a ser verificado (array ou não)
 * @param confirmMsg mensagem de confirmação da ação
 * @param errorMsg mensagem de erro se não existirem itens selecionados
 * @return boolean (confirma seleção ou não)
 */
function confirmSelection(checkbox, confirmMsg, errorMsg){
	if( isAnyChecked(checkbox) ) { 
		return confirm(confirmMsg); 
	} else { 
		alert(errorMsg);
		return false; 
	}
}

/**
 * Função para enviar comandos para as árvores
 * @param cmd comando a ser enviado, ex. select / expand / collapse / unSelect
 * @param nodeId id do nodo que será afetado
 */
function treeCommand(cmd, nodeId){
	var field = document.createElement('input');
	field.name = cmd;
	field.value = nodeId;
	field.type = "hidden";
	document.forms[0].appendChild(field);
	document.forms[0].submit();
}

/**
 * Função para adicionar o calendário ao campo
 * @param field campo que utiliza o calendário
 */
function openCalendar(field) {
	var calendar = new Calendar(field);
	calendar.year_scroll = true;
	calendar.time_comp = false;
	calendar.popup();
}

/**
 * Função para exportar o relatório em uma nova janela por uma URL
 * @param url que deverá ser submetida com todos os parâmetros
 */
function generateReport(url){
  	openWindow(url, 'Report'+(new Date()).getTime(), 700, 500);
}

/**
 * Função para exportar o relatório em uma nova janela
 * com os parâmetros do formulário de filtro
 * @param form objeto de formulário para submeter com os parâmetros
 */
function submitReport(form){
	submitReport(form, null);
}

/**
 * Função para exportar o relatório em uma nova janela
 * com os parâmetros do formulário de filtro
 * @param form objeto de formulário para submeter com os parâmetros
 * @param url da nova janela (para o form)
 */
function submitReport(form, url){
  	var reportWindow = openWindow('', 'Report'+(new Date()).getTime(), 700, 500);
	var reportForm = form;
  	if(url != null){
  	  	// nova url para submeter
	  	reportForm.action = url;
	}
	// nome da janela para submeter
	reportForm.target = reportWindow.name;
	reportForm.submit();
}
