/****************************
 * Inicia funções especificas
 * 
 * @author Herberts Cruz
 * @version 1.0
 ****************************/

/**
 * Exibe um Dialog
 * 
 * @param {String} id
 */
function showDialog(id)
{
	dijit.byId(id).show();
}

/**
 * Oculta um Dialog
 * 
 * @param {String} id
 */   
function hideDialog(id)
{
	dijit.byId(id).hide();
}

/**
 * Abre link com Refresh
 * 
 * @param {String} url
 */
function link(url)
{
	window.location=url;
}

/**
 * Atribui uma ação de abertura de Dialog ao objeto Executor
 * 
 * @param {String} idExecutor
 * @param {String} action
 * @param {Integer} tipo
 * @param {Integer} idError
 * @param {String} width
 * @param {String} height
 */
function dialogLoad(idExecutor, action, tipo, idError, width, height)
{
	dojo.addOnLoad(function() {
		dojo.connect(dijit.byId(idExecutor), action, function(){
			_dialog(tipo, idError, width, height);
		});
	});
}

/**
 * Abre um alerta do arquivo mensagens.xml
 * 
 * @param {Integer} idAlert
 * @param {String} width
 * @param {String} height
 */
function dialogAlert(idAlert, width, height)
{
	_dialog(1, idAlert, width, height);
}

/**
 * Abre um erro do arquivo mensagens.xml
 * 
 * @param {Integer} idError
 * @param {String} width
 * @param {String} height
 */
function dialogErro(idError, width, height)
{
	_dialog(2, idError, width, height);
}

/**
 * Busca as informações no arquivo mensagens.xml e chama a abertura do Dialog
 * 
 * @param {Integer} tipo
 * @param {Integer} idError
 * @param {String} width
 * @param {String} height
 */
function _dialog(tipo, idError, width, height)
{
	var xhrArgs = {
            url: httpHost+"/admin/index/dialog/tipo/"+tipo+"/id/"+idError,
            handleAs: "json",
            load: function(json) 
            {
            	dialogMessage(json.title, json.content, width, height);
            },
            error: function(error)
            {
            	jsLog('general.js', '_dialog()', error);
            	alert("Erro #00008, segure a tecla 'Ctrl' e pressione a tecla F5 para recarregar.");
            }
        };
	
	dojo.xhrPost(xhrArgs);
}

/**
 * Abre o Dialog efetivamente
 * 
 * @param {String} title
 * @param {String} content
 * @param {String} width
 * @param {String} height
 */
function dialogMessage(title, content, width, height)
{
	var dialog = dijit.byId("dialog");
	
	try
	{
		dialog.set("title", title);
		dijit.byId('dialog-centro').containerNode.innerHTML = content;
		
		var w = (width != null && width != undefined) ? width : '300px';
		var h = (height != null && height != undefined) ? height : '100px';
		
		dijit.byId('dialog-container').set('style',{'width':w});
		dijit.byId('dialog-container').set('style',{'height':h});
	}
	catch (error) 
	{
		dialog.set("title", title);
		dojo.byId('dialogContent').innerHTML = content;
	}
	
	dialog.show();
}

/**
 * Formata a data do padrão americano para o brasileiro
 * 
 * @param {String} srtDate
 * @returns {String}
 */ 
function formatDate(srtDate)
{
	var srtDt = new String(srtDate);
	
	var arrayDate = srtDt.split("-").reverse();
	
	return arrayDate[0]+"/"+arrayDate[1]+"/"+arrayDate[2];
}

/**
 * Grava o erro de Javascript no log geral
 * 
 * @param {String} strFile
 * @param {String} strFunction
 * @param {String} error
 */
function jsLog(strFile, strFunction, error)
{
	var xhrArgs = {
            url: httpHost+"/admin/index/js-error/error/Erro na função "+strFunction
            				+" do arquivo "+strFile+": "+error,
            handleAs: "text",
            load: function(data)
            {
				if(data != "1")
				{
					throw "";
				}
            },
            error: function(error) {
            	dialogErro(7);
            }
        };
	
	dojo.xhrPost(xhrArgs);
}

/**
 * Atribui ao objeto Executor a ação de mudança de aba
 * 
 * @param {String} idTabContainer
 * @param {String} idObj
 */
function aplicarMudarAba(idTabContainer, idObj)
{
	try
	{
		var handle = dojo.connect(dijit.byId(idObj), 'onKeyPress', function (evt) {
			
			var key = evt.keyCode;
			
			if(key == dojo.keys.TAB) 
			{
				dijit.byId(idTabContainer).forward();
				
				dojo.disconnect(handle);
			}
			
		});
		
		return true;
	}
	catch (error) 
	{
		jsLog('general.js', 'aplicarMudarAba()', error);
	   	dialogErro(9);
		return false;
	}
}

/**
 * Atribui ao objeto Executor a ação de colocar foco no botão salvar
 * quando perder o foco.
 * 
 * @param {String} idButton
 * @param {String} idObj
 */
function aplicarFocoParaButton(idButton, idObj)
{
	try
	{
		dojo.connect(dijit.byId(idObj), 'onKeyPress', function (evt) {
			
			var key = evt.keyCode;
			
			if(key == dojo.keys.TAB) 
			{
				dijit.byId(idButton).domNode.focus();
			}
			
		});
		
		return true;
	}
	catch (error) 
	{
		jsLog('general.js', 'aplicarFocoParaButton()', error);
	   	dialogErro(9);
		return false;
	}
}

/**
 * Pega os 12 primeiros dígitos do valor digitado e retorna uma regex 
 * conteudo um cnpj válido para que o dojo possa comparar com o
 * valor digitado.
 * 
 * @param {String} valueCnpj
 * @param {Object} constraints
 * @returns {String}
 */
function regexCnpj(valueCnpj, constraints) 
{
 	var validCnpj = "[\\d]{14}";

 	var newValueCnpj = (valueCnpj.length > 12) ? valueCnpj.substring(0, 12) : valueCnpj;
 	
	var digits = checkCNPJ(newValueCnpj);

	if(!isNaN(digits) && valueCnpj.length > 12)
	{
		digits = (digits.length == 1) ? "0"+digits : digits;
		
		validCnpj = "[\\d]{12}"+digits;
	}
	
    return validCnpj;
}

/**
 * Gera os 2 últimos digitos verificadores a partir de um
 * string de 12 números.
 * 
 * @param {String} vCNPJ
 * @returns {String}
 */
function checkCNPJ(vCNPJ)
{
	var mControle = "";
	var aTabCNPJ = new Array(5,4,3,2,9,8,7,6,5,4,3,2);
	
	for (var i = 1; i <= 2 ; i++)
	{
		mSoma = 0;
		
		for (var j = 0; j < vCNPJ.length ; j++)
	        mSoma = mSoma + (vCNPJ.substring(j,j+1) * aTabCNPJ[j]);
	    	
		if (i == 2 ) mSoma = mSoma + ( 2 * mDigito );
			mDigito = ( mSoma * 10 ) % 11;
		
		if (mDigito == 10 ) mDigito = 0;
	     
		mControle1 = mControle;
	    mControle = mDigito;
	     
	    aTabCNPJ = new Array(6,5,4,3,2,9,8,7,6,5,4,3);
	}
	
	var result = new String(((mControle1 * 10) + mControle));
	
	return result;
}

/**
 * Pega os 9 primeiros dígitos do valor digitado e retorna uma regex 
 * conteudo um cpf válido para que o dojo possa comparar com o
 * valor digitado.
 * 
 * @param {String} valueCpf
 * @param {Object} constraints
 * @returns {String}
 */
function regexCpf(valueCpf, constraints) 
{
 	var validCpf = "[\\d]{11}";

 	var newValueCpf = (valueCpf.length > 9) ? valueCpf.substring(0, 9) : valueCpf;
 	
	var digits = checkCPF(newValueCpf);

	if(!isNaN(digits) && valueCpf.length > 9)
	{
		digits = (digits.length == 1) ? "0"+digits : digits;
		
		validCpf = "[\\d]{9}"+digits;
	}
	
    return validCpf;
}

/**
 * Gera os 2 últimos digitos verificadores a partir de um
 * string de 9 números.
 * 
 * @param {String} vCNPJ
 * @returns {String}
 */
function checkCPF(vCPF)
{
	var mControle = "";
	var mContIni = 2, mContFim = 10, mDigito = 0;
	
	for (var j = 1; j <= 2 ; j++)
	{
		mSoma = 0;
	    
		for (var i = mContIni; i <= mContFim ; i++)
			mSoma = mSoma + (vCPF.substring((i-j-1),(i-j)) * (mContFim + 1 + j - i));
	    
		if (j == 2 ) mSoma = mSoma + ( 2 * mDigito );
	    
		mDigito = ( mSoma * 10 ) % 11;
	    
		if (mDigito == 10) mDigito = 0;
	    
		mControle1 = mControle;
	    mControle = mDigito;
	    mContIni = 3;
	    mContFim = 11;
	}
	
	var result = new String(((mControle1 * 10) + mControle));
	
	return result;
}

/**
 * Executa um refresh do DataGrid ou ComboBox 
 * com novos dados de um novo JSON
 * 
 * @param {String} idDataGridOrComboBox
 * @param {Object} json
 */
function refreshDataGridOrComboBox(idDataGridOrComboBox, json)
{
	try
	{
		var dataGridOrComboBox = dijit.byId(idDataGridOrComboBox);
		
		if(dataGridOrComboBox.store.save) {
			dataGridOrComboBox.store.save();
		}
		
		dataGridOrComboBox.store.close();
		dataGridOrComboBox.store.data = json;
		
		if(dataGridOrComboBox instanceof dojox.grid.DataGrid)
		{
			dataGridOrComboBox._refresh();
		}
		else
		{
			dataGridOrComboBox.store.fetch();
		}
	
		return true;
	}
	catch (error) 
	{
		jsLog('general.js', 'refreshDataGridOrComboBox()', error);
	   	dialogErro(9);
		return false;
	}
}

/**
 * Verifica se existe o valor solicitado no array
 * 
 * @param {String} value
 * @param {Array} array
 * @returns {Boolean}
 */
function arrayValueExists(value, array)
{
	for(var i=0; i<array.length; i++)
	{
		if(array[i]==value)
		{
			return true;
		}
	}
	
	return false;
}

/**
 * Extrai um valor de dentro de um array
 * 
 * @param {String} value
 * @param {Array} array
 * @returns {Array}
 */
function extractValue(value, array)
{
	var newArray = new Array(array.length-1);
	
	var index = 0;
	
	for(var i=0; i<array.length; i++)
	{
		if(array[i]!=value)
		{
			newArray[index] = array[i];
			
			index++;
		}
	}
	
	return newArray;
}

/**
 * Substitui todas as ocorrências do token
 * 
 * @param {String} string
 * @param {String} token
 * @param {String} newtoken
 * @returns {String}
 */
function replaceAll(string, token, newtoken) 
{
	while (string.indexOf(token) != -1) 
	{
 		string = string.replace(token, newtoken);
	}
	
	return string;
}
