﻿/*******************************************************************************
 * Tradução e customização para o portugues das funções do wforms
 ******************************************************************************/
wFORMS.behaviors['validation'].errMsg_required = "Campo obrigatório.";
wFORMS.behaviors['validation'].errMsg_email = "Este não é um endereço do email válido.";
wFORMS.behaviors['validation'].errMsg_Incorreto = "Campo preenchido incorretamente.";
wFORMS.behaviors['validation'].errMsg_notification = "%% erro(s) detectados. Seu formulário ainda não foi submetido.\nPor favor, verifique o(s) dado(s) informado(s) e tente novamente.";
wFORMS.arrErrorMsg[8] = wFORMS.behaviors['validation'].errMsg_notification;

/*******************************************************************************
 * Funções de controle da skin
 ******************************************************************************/
/**
 * Função atualiza o valor do campo hiddem quando se faz uma modificação do
 * input check, afim de que mesmo quando o valor for false(não checado) o campo
 * seja enviado no post. Este arranjo existe pois o checkbox padrão não é
 * enviado quando não é marcado, fazendo com que o dado não seja sobrescrito na
 * sessão
 * 
 * @param {Object}
 *            el Input do tipo check
 */
function skCheckBox(el) {
	/* o atributo alt do input check é o nome do campo hiddem */
	var name=$(el).attr("alt");
	setVal(name, $(el).attr('checked') ? 1 : '');
}

/**
 * Função que atualiza o valor do campo check quando se modifica o valor do
 * campo hidden, {@see skCheckBox()}
 * 
 * @param el
 */
function skCheckBoxReverso(el) {
	setVal($(el).attr('name')+'_box', $(el).val().length>0);
}

/**
 * Escreve o alerta na tela
 * 
 * @param {Integer}
 *            nbTotalErrors
 */
wFORMS.behaviors['validation'].showAlert = function(nbTotalErrors) {
	var placeHolder = document.getElementById('alertMessagePlaceHolder');
	placeHolder.innerHTML = wFORMS.arrErrorMsg[8].replace('%%', nbTotalErrors);
	placeHolder.style.display = 'block';
};

/**
 * Handler que faz a validação dos campos do formulario caso tudo esteja ok
 * retorna true enviando o form
 * 
 * @param {string}
 *            e id do formulario a ser checado
 */
function km_checkForm(e) {
	/*
	 * Submete o formulario para o validador, se ok retorna true para enviar o
	 * formulario
	 */
	if (wFORMS.behaviors.validation.run(e)) {
		return true;
	}
	return false;
}

/**
 * debug ligado
 */
wFORMS.debugLevel = 0;

/*******************************************************************************
 * *****************************************************************************
 * Funções de validação adicionais. As funções de validação personalizadas
 * recebem um parametro contendo o input a ser validado, retornam um array de
 * dois elementos 1. o resultado booleano. 2. string a ser mostrada no caso de
 * erro Ex: \/** * *
 * 
 * @param {Object}
 *            el Input to validate *
 * @return {Array} new Array(false :bool -> "true if ok", 'msg' :string -> "msg
 *         de erro") *\/ function check_x(el) { if (el.value) return new
 *         Array(true) else return new Array(false, 'mensagem de erro') }
 ******************************************************************************/

/**
 * Checa os skEditNumber requeridos
 * 
 * @param {Object}
 *            el
 */
function km_check_number(el) {
	if (el.value == 0) {
		return new Array(false, wFORMS.behaviors['validation'].errMsg_required);
	}
	return new Array(true);
}

/**
 * Checa os skRadioGroup requeridos
 * 
 * @param {Object}
 *            el
 */
function km_check_radio(el) {
	var checked = false;
	for ( var i = 0; i < el.length; i++) {
		if (el[i].checked) {
			field_checked = true;
		}
	}
	if (!checked) {
		return new Array(false, wFORMS.behaviors['validation'].errMsg_required);
	}
	return new Array(true);
}

/**
 * Checa se a data preenchida no skEditDate (estido dd/mm/aaaa) é valida, e se
 * não esta desabilitada usando como base a função km_dateGetDtStatus
 * 
 * @param {Object}
 *            el: input sendo validado
 * @param {String}
 *            value: valor sendo validado
 */
function km_check_date(el, value) {
	var name = '';

	/* se el esta definido pega as variaveis dele */
	if (el) {
		value = el.value;
		name = el.name;
	}
	if (value) {
		if (!km_isDate(value)) {
			return new Array(false, "Data inválida");
		} else {
			var arr = value.split('/');
			if (km_dateGetDtStatus(null, arr[2], arr[1] - 1, arr[0], name) == true) {
				return new Array(false, "A data selecionada está desabilitada no calendário.");
			}
		}
	}
	return new Array(true);
}

/**
 * Checa se a hora preenchida no skEditTime (estilo hh:mm)
 * 
 * @param {Object}
 *            el: input sendo validado
 */
function km_check_time(el){
	if(!$(el).val()){
		return false;
	}

	var aux=$(el).val().split(':');
	if(!(aux[0]>=0 && aux[0]<=23 && aux[1]>=0 && aux[0]<=59)) {
		alert('Hora inválida');
		$(el).val('');
		$(el).focus();
	}
	return true;
}

/**
 * Função que junda a parte data com a parte hora de um controle date time
 * 
 * @see km_check_datetime
 */
function sk_datetime_join(name) {
	var vData = $(document.getElementById(name + '_data')).val();
	var vHora = $(document.getElementById(name + '_hora')).val();
	var vDataHora = '';

	if (vData.length == 10 && vHora.length == 5) {
		vDataHora = vData + ' ' + vHora;
	}
	$(document.getElementById(name)).val(vDataHora);
	return vDataHora.length == 16;
}

/**
 * Checa os skEditDateTime se foi preenchido corretamente(estido dd/mm/aaaa
 * HH:ii) *
 * 
 * @param {Object}
 *            el: input sendo validado
 */
function km_check_datetime(el) {
	/* testa se el é valido */
	if (!el)
		return new Array(false, 'Erro em km_check_datetime, parametro "el" inválido.');

	/**
	 * @todo remover //juntando os valores de data e hora if
	 *       (!sk_datetime_join(el.name)) { return new Array(false,
	 *       wFORMS.behaviors['validation'].errMsg_Incorreto); }
	 */

	/* se não foi preenchido não precisa validar */
	if (!el.value)
		return new Array(true);

	/*
	 * data no formato 99/99/9999 99:99
	 */
	var regex = /[0-9]{2}\/[0-9]{2}\/[0-9]{4} [0-9]{2}\:[0-9]{2}/;
	if (!regex.test(el.value))
		return new Array(false, wFORMS.behaviors['validation'].errMsg_Incorreto);

	/*
	 * checa se a hora é valida
	 */
	var datahora = el.value.split(" ");
	var hora = Number(datahora[1].split(":")[0]);
	var minuto = Number(datahora[1].split(":")[1]);
	if (!(hora >= 0 && hora <= 23 && minuto >= 0 && minuto <= 59))
		return new Array(false, wFORMS.behaviors['validation'].errMsg_Incorreto);

	/*
	 * checa se a data é valida
	 */
	return km_check_date('', datahora[0]);
}

/*******************************************************************************
 * Funções de formatação geral
 ******************************************************************************/

/**
 * Função para formatar os campos numericos
 * 
 * @param campo :
 *            campo do formulario
 * @param numDecPlace :
 *            qtde de casas decimais, 0 no caso de não querer
 * @param decSep :
 *            separador decimal
 * @param milSep :
 *            separador de milhar
 * @todo fazer update na função para usar a função melhorada do javascript 1.5
 *       http://www.pageresource.com/jscript/j_a_03.htm
 */
function NumberFormat(Campo, numDecPlace, decSep, milSep) {
	var i = j = 0;
	var len = 0;
	var strCheck = '0123456789';
	var aux = '';
	var result = '';
	var decPart = '';
	var milPart = '';
	var strVal = '';
	var nMinus = false;

	if (typeof Campo == 'object') {
		var strVal = Campo.value;
	} else {
		var strVal = String(Campo);
	}

	if (numDecPlace > 6) {
		throw "A função de formatação de numeros somente funciona com ate 6 casas decimais";
		return '';
	}
	/**
	 * checa se o valor é negativo ou se existem dois sinais negativos
	 */
	if (strVal.split("-").length == 2) {
		nMinus = true;
		result = '-';
	}

	/**
	 * retira todos os caracteres não numericos da string
	 */
	len = strVal.length;
	for (i = 0; i <= len - 1; i++) {
		if (strCheck.indexOf(strVal.charAt(i)) != -1) {
			aux += strVal.charAt(i);
		}
	}

	/**
	 * se o valor que foi passado for zero retorna ele
	 */
	if (aux == 0) {
		if (nMinus && milSep != '') {
			return '-0';
		} else {
			return '';
		}
	}

	if (numDecPlace > 0) {
		/**
		 * eleva 10 a quantidade de casas decimais e divide aux por isso vai
		 * ficar assim aux=356; numDecPlace=4; resultará em aux=0.0356;
		 */
		var base = Math.pow(10, numDecPlace);
		aux = aux / base;
		var sum = 1 / (base * 100);

		/**
		 * adiciona um numero do tipo 0.(base*100) que dará algo assim base=4
		 * 0.[0000]01 um mumero bem pequeno para nao afetar isso para se que que
		 * se o numero tiver zeros no final eles não sejam ignorados mas
		 * preservados com a ajuda do codigo abaixo
		 */
		aux += sum;

		/**
		 * aux agora vira um array contendo [0] a parte inteira [1] a parte
		 * decimal
		 */
		aux = String(aux).split(".");

		milPart = aux[0];
		if (aux[1].length > 0) {
			/**
			 * retira da variavel somente a parte que interessa no caso o
			 * tamanho de numDecPlace
			 */
			decPart = decSep + aux[1].substr(0, numDecPlace);
		}

	} else {
		milPart = aux;
	}
	/**
	 * multiplica por um caso tenha um zero antes ou algo assim será eliminado e
	 * reconverte para string
	 */
	milPart = new String(milPart * 1);

	/**
	 * na forma que foi feita somente entrará no for se o numero tiver parte
	 * inteira
	 */
	len = milPart.length;
	aux = '';
	for (j = 0, i = len - 1; i >= 0; i--) {
		/**
		 * poe separador de milhar e zera o contador
		 */
		if (j == 3) {
			aux += milSep;
			j = 0;
		}
		aux += milPart.charAt(i);
		j++;
	}

	/**
	 * reordena a variavel aux colocando o resultado para a variavel result
	 */
	len = aux.length;
	for (i = len - 1; i >= 0; i--) {
		result += aux.charAt(i);
	}

	/**
	 * obtem a parte decimal do valor, esta parte não precisa ser reordenada
	 */
	result += decPart;

	if (typeof Campo == 'object') {
		Campo.value = result;
	}

	return result;
}
/**
 * OnLoad dos campos numericos
 */
$(document).ready( function() {
	$('input.numeric').each( function() {
		var aux = $(this).attr('lang');
		if (aux == '') {
			throw 'Não foi possivel adicionar a função NumberFormat ao campo:' + $(this).attr('name');
		}
		NumberFormat(this, aux, ",", ".");
		$(this).keyup( function() {
			this.value = NumberFormat(this, this.lang, ',', '.');
		});
	});
});

/**
 * Registra as validações e formatações para os campos skEditCPF, skEditCPF_CNPJ
 * e skEditCNPJ
 * 
 * @param {Object}
 *            nmInput: Nome do input que ira receber o valor selecionado
 */
function skEditCpfCnpjIni(nmInput) {
	var el = document.getElementById(nmInput);

	$(el).keydown( function(event) {
		window.skEditCpfCnpjIni_old = this.value;
		return event;
	}).focus( function(event) {
		window.skEditCpfCnpjIni_old = this.value;
		return event;
	}).keyup( function() {

		/*
		 * remove todos os caracteres não numericos da string
		 */
		var sVal = this.value.replace(/\D/g, "");
		var len = sVal.length;

		/* se a tecla digitada não mexeu no conteudo do campo, ignora */
		if (this.value == window.skEditCpfCnpjIni_old)
			return false;

		/**
		 * o campo sempre terá um tamanho maior que o necessario para os campos
		 * poderem ser formatados com zeros à esquerda não impedindo a digitação
		 * ex: cpf com pontuação => tam. 14 => campo tam. 15
		 */
		if (this.size == this.value.length) {
			/**
			 * se estiver no limite apaga o caracter mais a esquerda
			 */
			this.value = sVal = sVal.substr(1, len);
		}

		/**
		 * verifica se o campo tem espaço pra cnpj e se o tamanho é maior que um
		 * cpf
		 */
		var ehCnpj = sVal.length > 11;
		var ehCpf = null;
		if (ehCnpj) {
			var vTestCnpj = sVal.lpad(14, '0');
			var vTestCpf = vTestCnpj.substr(3, 14);

			/* verifica a string preenchida com '0' a esquerda é um cnpj */
			ehCnpj = isCnpj(vTestCnpj);

			/* verifica se os 11 caracteres mais à direita são um cpf */
			ehCpf = isCpf(vTestCpf);

			if (ehCpf && ehCnpj) {
				var msg = '';
				msg += 'O valor digitado pode ser considerado:\n\n';
				msg += 'CPF: ' + formatCpfCnpj(vTestCpf, true, false) + '\n';
				msg += 'CNPJ: ' + formatCpfCnpj(vTestCnpj, true, true) + '\n\n';
				msg += 'Click "Sim" ou "OK" para tratar o valor como CPF ou \n';
				msg += 'Click "Não" ou "Cancelar" para tratar o valor como CNPJ';
				ehCpf = window.confirm(msg);
			}

			/*
			 * o valor será formatado como CNPJ caso não seja um cpf
			 */
			ehCnpj = !ehCpf;
		}
		/* formata o campo */
		this.value = formatCpfCnpj(sVal, true, ehCnpj);

		/* atualiza o backup feito pelo evento focus */
		window.skEditCpfCnpjIni_old = this.value;
	});
	el.value = formatCpfCnpj(el.value, true, (el.value.length == 14 ? true : false));
}

/**
 * OnSubmit dos campos cpf/cnpj se o campo é valido ou se é permitido estar null
 * 
 * @param {Object}
 *            el
 */
function km_check_cpf_cnpj(el) {
	var value = el.value.replace(/\D/g, "");
	if (value != '' && !isCpfCnpj(value)) {
		return new Array(false, 'Cpf/Cnpj inválido');
	}
	el.value = value;
	return new Array(true);
}

/**
 * DDD defaul para o campo telefone
 */
var skEditTelefoneDDD = '';

/**
 * Registra a formatação para os campos skEditTelefone
 * 
 * @param {Object}
 *            nmInput: Nome do input que ira receber o valor selecionado
 * @param {String}
 *            ddd: O ddd padrão do campo
 */
function skEditTelefoneIni(nmInput, ddd) {
	var el = document.getElementById(nmInput);

	$(el).keyup( function() { 
	  var valor=this.value.replace(/\D/g, "");
	  var tamanho=valor.length;
	  
	  console.log(valor);
	  if(valor.substr(0,2)=='00'){
	  	/**
		 * Telefones internacionais Ex: 00-1(40)4551-7642
		 */
	  	var formato='';
	  	if(tamanho<=13)	
	  		formato='99-9(99)9999-9999-9';
	  	else if(tamanho==14)	 
	  		formato='99-99(99)9999-9999-9';
	  	else 
	  		formato='99-999(99)9999-9999-9';
	  	$(this).setMask( {mask :formato});
	  	
	  }else   if(valor.substr(0,1)=='0'){
	  	/**
		 * Telefones de serviços Ex: 0800-310-102
		 */
	  	var formato='';
	  	if(tamanho<=10)	
	  		formato='9999-99-9999-9';
	  	else if(tamanho==11)	 
	  		formato='9999-999-9999-9';
	  	else if(tamanho==12)	 
	  		formato='9999-9999-9999-9';
	  	else 
	  		formato='9999-9999-9999-99';
	  	$(this).setMask( {mask :formato});
	  } else{ 
	  	/**
		 * Telefones nacionais Ex: (62)3945-1867
		 */
	  	$(this).setMask( {mask :'(99)9999-9999-9999'});
	  }
	}).focus( function() {
		/* se não tiver valor adiciona o ddd ao campo */
		if (!this.value || this.value.replace(/\D/g, "") == skEditTelefoneDDD) {
			this.value = '(' + skEditTelefoneDDD + ')';
		}
	}).blur( function() {
		/* quando sai do campo se o valor for somente o ddd limpa o campo */
		if (this.value.replace(/\D/g, "") == skEditTelefoneDDD) {
			this.value = '';
		}
	}).keyup();

	/* salva o ddd na variavel global */
	skEditTelefoneDDD = ddd.replace(/\D/g, "");
}

/**
 * OnSubmit dos campos telefone se o valor do campo é valido, ou se ele é
 * obrigatório
 * 
 * @param {Object}
 *            el
 */
function km_check_telefone(el) {
	/* limpa o */
	var value = el.value.replace(/\D/g, "");

	if (value == skEditTelefoneDDD) {
		/* explode o class do elemento, e depois procura por required */
		if (jQuery.inArray('required', el.className.split(" ")) != -1) {
			return new Array(false, 'Campo obrigatório.');
		}

		/* caso não seja obrigatório limpa o campo */
		el.value = '';
	} else if (value != '' && value.length < 10) {
		/*
		 * se o campo esta preenchido, não aceita menos que 10 caracteres
		 * 
		 * Ex: (62)9999-9999 = OK; (62)123 = False
		 */
		return new Array(false, 'Telefone inválido');
	}
	return new Array(true);
}

/*******************************************************************************
 * Funções que são utilizadas pelos compontentes do sistema
 ******************************************************************************/

/**
 * Guarda o campo que contem o valor que será enviado
 * 
 * @subpackage MultiSelect
 */
var msCampoSubmit = '';

/**
 * Guarda o campo que contem os valores disponiveis
 * 
 * @subpackage MultiSelect
 */
var msCampoDis = '';

/**
 * Guarda o campo que contem os valores selecionados
 * 
 * @subpackage MultiSelect
 */
var msCampoSel = '';

/**
 * Guarda os campos a serem manipulados
 * 
 * @subpackage MultiSelect
 */
function msSetCampo() {
	if (arguments.length != 0) {
		msCampoSubmit = document.getElementById(arguments[0]);
		msCampoDis = document.getElementById(arguments[0] + '_DIS');
		msCampoSel = document.getElementById(arguments[0] + '_SEL');
	}
}

/**
 * Adiciona um valor ao campo selecionado, caso ele já não exista
 * 
 * @subpackage MultiSelect
 * @param value
 *            valor da opção
 * @param text
 *            texto da opção
 */
function msAdd(value, text) {
	index = msCampoSel.options.length;
	if (index != -1) {
		for ( var i = 0; i != index; i++) {
			if (msCampoSel.options[i].value == value) {
				return false;
			}
		}
	}
	msCampoSel.options[index] = new Option(text, value);
	msSetSub();
}

/**
 * Seleciona um valor do campo de disponiveis para o campo de selecionados
 * 
 * @subpackage MultiSelect
 * @param value
 *            indice do campo msCampoDis ou {value} da opção a ser adicionado se
 *            tambem vier o param {text}
 * @param text
 *            {text} da opção a ser adicionado se tambem vier o param {value}
 */
function msAddSel(value, text) {
	var selec = [];

	if (arguments.length == 2) {
		/* se o text e o value vieram passa direto para a função de adicionar */
		msAdd(arguments[0], arguments[1]);
	} else if (selec = $(msCampoDis).val()) {
		/* se não veio argumento nenhum pega o valor selecionado no msCampoDis */

		/**
		 * varre o campo o campo para selecionar o texto dos valores
		 * selecionados
		 */
		var len = msCampoDis.options.length;
		for ( var i = 0; i != len; i++) {
			/**
			 * se o valor atual no indice de opções estiver nos array de valores
			 * selecionado, adiciona
			 */
			if (jQuery.inArray(msCampoDis.options[i].value, selec) != -1) {
				msAdd(msCampoDis.options[i].value, msCampoDis.options[i].text);
			}
		}
	}
}

/**
 * Seleciona todos os valores disponiveis
 * 
 * @subpackage MultiSelect
 */
function msAddAll() {
	var j = msCampoDis.options.length;
	for ( var i = 0; i != j; i++) {
		msAdd(msCampoDis.options[i].value, msCampoDis.options[i].text);
	}
}

/**
 * Remove um valor selecionado
 * 
 * @subpackage MultiSelect
 */
function msRemSel() {
	/* array com os valores selecionados */
	var selec = $(msCampoSel).val();
	var len = msCampoSel.options.length;

	for ( var i = len - 1; i >= 0; i--) {
		/*
		 * se o valor atual no indice de opções estiver nos array de valores
		 * selecionado, adiciona
		 */
		if (jQuery.inArray(msCampoSel.options[i].value, selec) != -1) {
			msCampoSel.options[i] = null;
		}
	}
	msSetSub();
}

/**
 * Remove todos os valores selecionados
 * 
 * @subpackage MultiSelect
 */
function msRemAll() {
	$(msCampoSel).empty();
	msSetSub();
}

/**
 * Adiciona os valores selecionados ao campo de envio
 * 
 * @subpackage MultiSelect
 */
function msSetSub() {
	var aux = '';
	var j = msCampoSel.options.length;
	for ( var i = 0; i != j; i++) {
		aux += (aux ? ',' : '');
		aux += msCampoSel.options[i].value;
	}
	msCampoSubmit.value = aux;
}

/**
 * Função que será atribuida aos campos do tipo radio do skEditGrid pois serão
 * montados varios campos hiddem para guardar os valores 0 ou 1 para identificar
 * se o campo foi o selecionado em cada um dos registros
 * 
 * @subpackage skEditGrid
 */
function skEditGridFieldRadio() {
	/*
	 * pesquisa todos os campos radio do grupo atual e zera os valores dos
	 * campos input type hidden
	 */
	$('input[name=' + this.name + ']').next('input[type=hidden]').val('0');

	/*
	 * pega o campo hidden que fica logo depois dele e guarda o valor 1
	 * selecionado
	 */
	$(this).next('input[type=hidden]').val('1');
}

/**
 * Função para ordenar data no formato ISO8859 (dd/mm/aaaa) usada pelo plugin
 * jquery {@link http://plugins.jquery.com/project/tablesorter}
 */
if (typeof $.tablesorter != "undefined")
	$.tablesorter.addParser( {
		/* identificador */
		id :'DateISO8859',
		is : function(s) {
		return false;
	},

	/* função em si */
	format : function(s) {
		if (!/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/.test(s)) {
			return -1;
		}

		var parts = s.split("/");
		var d = new Date(0);
		d.setDate(parts[0]);
		d.setMonth(parts[1] - 1);
		d.setFullYear(parts[2]);
		return d.valueOf();
	},

	/* pode ser numeric ou text */
	type :'numeric'
	});

/**
 * Função para ordenar data/hora no formato ISO8859 (dd/mm/aaaa hh:mm) usada
 * pelo plugin jquery {@link http://plugins.jquery.com/project/tablesorter}
 */
if (typeof $.tablesorter != "undefined")
	$.tablesorter.addParser( {
		/* identificador */
		id :'DateTimeISO8859',

		is : function(s) {
		return false;
	},

	/* função em si */
	format : function(s) {
		if (s.length!=16) {
			return 1;
		}

		/*
		 * Transformando uma string 29/11/1985 14:32 em 29-11-1985-14-32 para
		 * submeter para a função split
		 */
		var rExp = /(\/)|(\:)|( )/g;
		s = s.replace(rExp, '-');
		var parts = s.split("-");

		/*
		 * Transformando o array retornado para o formato de data do javascript
		 */
		var d = new Date(0);

		/*
		 * Tirando o zero
		 */
		d.setDate(parts[0]*1);

		/*
		 * Meses começam de 0
		 */
		d.setMonth(parts[1] - 1);
		d.setFullYear(parts[2]);
		d.setHours(parts[3]);

		/*
		 * Tirando o zero
		 */
		d.setMinutes(parts[4]*1);

		return d.valueOf();
	},

	/* pode ser numeric ou text */
	type :'numeric'
	});

/**
 * Função para ordenar numeros no padrão pt_BR (13.456,78 , R$ 10,54) usada pelo
 * plugin jquery {@link http://plugins.jquery.com/project/tablesorter}
 */
if (typeof $.tablesorter != "undefined")
	$.tablesorter.addParser( {
		/* identificador */
		id :'NumberLatin',

		is : function(s) {
		return false;
	},

	/* função em si */
	format : function(s) {
		return parseFloat(s.replace(/[^0-9,]/g, '').replace(/,/, '.'));
	},

	/* pode ser numeric ou text */
	type :'numeric'
	});

/**
 * Função para ordenar string que ignora a diferença entre caracteres normais e
 * caracteres acentuados,cedilha e maiusculos/minusculos usada pelo plugin
 * jquery {@link http://plugins.jquery.com/project/tablesorter}
 */
if (typeof $.tablesorter != "undefined")
	$.tablesorter.addParser( {
		/* identificador */
		id :'CaseInsensitiveString',

		is : function(s) {
		return false;
	},

	/* função em si */
	format : function(s) {
		/**
		 * retirando os espaços no inicio
		 */
		while (/[* ]/.test(s.substring(0, 1))) {
			s = s.substring(1, s.length);
		}

		/**
		 * removendo caracteres acentuados
		 */
		s = s.toUpperCase().replace(/[ÀÁÂÃÄÅ]/g, 'A');
		s = s.replace(/[ÈÉÊË]/g, 'E');
		s = s.replace(/[ÌÍÎÏ]/g, 'I');
		s = s.replace(/[ÒÓÔÕÖ]/g, 'O');
		s = s.replace(/[ÙÚÛÜ]/g, 'U');
		s = s.replace(/[ÝŸ]/g, 'Y');
		s = s.replace(/[Ç]/g, 'C');
		s = s.replace(/[Ñ]/g, 'N');

		return s;
	},

	/* pode ser numeric ou text */
	type :'text'
	});

/**
 * Trata o resultado da chamada em caso de sucesso
 * 
 * @param json
 * @return void
 */
function skValidationOnSuccess(json) {
	if (json == "1") {
		/* o resultado é um booleano true */
		skValidation_checado = true;
	} else if (json) {
		/* o resultado é uma string, então mostra como mensagem */
		sMsg = json;
	}
}
		
/**
 * Seleciona todos os campos via jQuery e serializa excluindo do resultado os
 * campos de controle
 * 
 * @return array
 * @return void
 */
function skValidationPhpSerializeForm() {
	var aQuery = $("form").serializeArray();
	var aRetorno = new Array();
	for (i in aQuery) {
		if (typeof aQuery[i].name != 'undefined')
			if (jQuery.inArray(aQuery[i].name,
					[ 'KMP', 'KMF', 'KMA', 'doctype' ]) == -1)
				aRetorno[i] = aQuery[i];
	}
	return aRetorno;
}


/**
 * Trata o resultado da chamada em caso de sucesso
 * 
 * @param {String}json
 *            resultado da requisição
 * @param {Array}
 *            aFields: campos do resultado mapeado nos campos do formulario
 * @param {String}
 *            winName : Nome da janela, para ser sobreposta com a abertura de
 *            outra
 * 
 * @return void
 */
function skUpdateOnSuccess(json, aFields, nomeJanela) {
	if (typeof json == 'string'){
	  	return alert(json);
	}
	
	if(!nomeJanela)
		nomeJanela=window;
	
	if (aFields) {
		/**
		 * caso os campos tenham nome local/remoto diferentes, então foram
		 * mapeados
		 */
		for (fLocal in aFields) {
			var fRemoto=aFields[fLocal];
			setVal(nomeJanela.document.getElementById(fLocal), json[fRemoto]);
		}
	} else {
		/**
		 * os campos local/remoto tem o mesmo nome
		 */
		for (fCampo in json) {
			setVal(nomeJanela.document.getElementById(fCampo), json[fCampo]);
		}
	}
}


/**
 * Trata o resultado da chamada em caso de falha
 * 
 * @param XMLHttpRequest
 * @param textStatus
 * @param errorThrown
 * @return
 */
function skUpdateOnError(XMLHttpRequest, textStatus, errorThrown) {
	alert(XMLHttpRequest.responseText);
}