/**
 * Guilherme Berghauser
 *
 * Componente Lista Grid
 */

var arrayGlobal;
var negritoGlobal;

var timeOutList = [];

var cont = 0;

function ListaGrid(titulo, array, container) {

	console.log("Total de dados: " + array.length);

	//adicionar elementos
	var arrayElementos = [];
	var contadorElementos = 0;

	//array global
	arrayGlobal = array;

	negritoGlobal = true;

	//titulo Inicial
	var valorTitulo = [];

	//linhas
	var linhas = [];
	contador = 0;

	//container elemento
	var con;
	(function($) {
		con = $(container);
	})(jQuery);

	//container central interno comp;
	var center;

	//array com valores a serSubistituido
	var valoresSub = [];
	var contadorSub = 0;

	//array com valores de numeros a serem formatados
	var valoresNumerosFormatados = [];
	var contadorNumerosFomatados = 0;

	//cor de fundo
	var coresFundo;

	//cores linhas
	var coresLinhas = [];
	var contadorCoresLinhas = 0;

	//cores linhas
	var coresLinhasOutrLinha = [];
	var contadorCoresLinhasOutrLinha = 0;

	//corTitulo
	var coresTitulo = [];

	var valorFinal = 0;

	//valoresExtras linhas
	var valoresExtras = [];
	contadorValorExtras = 0;

	//sobrescrever cores linhas
	var valoresSobCores = [];
	contadorSobCores = 0;

	//cores Condições
	var coresCondicoes = [];
	contadorCoresCondicoes = 0;

	var valorMaximoLinha = 0;

	var timeA;

	this.adicionarLinhas = adicionarLinhas;
	this.montarCampos = montarCampos;
	this.setTitulo = setTitulo;
	this.adicionarValoresLinhas = adicionarValoresLinhas;
	this.corFundo = corFundo;
	this.gridAcao = gridAcao;
	this.setValorPesquisar = setValorPesquisar;
	this.setCorPalavrasLinhas = setCorPalavrasLinhas;
	this.setCorPalavrasLinhasOutraLinha = setCorPalavrasLinhasOutraLinha;
	this.setCorTituloOutraLinha = setCorTituloOutraLinha;
	this.setNumeroFormatado = setNumeroFormatado;
	this.adicionarValoresExtras = adicionarValoresExtras;
	this.sobrescreverCoresLinha = sobrescreverCoresLinha;
	this.adicionarElemento = adicionarElemento;
	this.setNumerosMaxLinhas = setNumerosMaxLinhas;
	this.setarCorCondicao = setarCorCondicao;
	this.pararGerarGrid = pararGerarGrid;

	function setNegrito(a) {
		negritoGlobal = a;
	}

	function setTitulo(valorTituloV) {
		valorTitulo = valorTituloV;
	}

	function adicionarLinhas(des, valor, desAux, valorAux) {
		linhas[contador] = [des, valor, desAux, valorAux];
		contador++;
	}

	function adicionarElemento(numeroLinha, texto, valorEspaco, floatEle, corEstatica) {
		arrayElementos[contadorElementos] = [numeroLinha, texto, valorEspaco, floatEle, corEstatica];
		contadorElementos++;
	}

	function setNumeroFormatado(linha) {
		valoresNumerosFormatados[contadorNumerosFomatados] = linha;
		contadorNumerosFomatados++;
	}

	function setNumerosMaxLinhas(numero) {
		valorMaximoLinha = numero;
	}

	function montarCampos(idLinha, callback) {

		var rtn = new StringBuilder();

		adicionarCenterDiv();

		center = document.getElementById('centerCadastroo');

		var frag = document.createDocumentFragment();

		var valorMaximo = parseInt(array.length / 20, 10);
		valorMaximo++;
		var valorInicial = 0;

		var valor = valorMaximo;
		var valorZero = 0;
		valorFinal += parseInt(array.length / valor, 10);
		reenviar();

		function reenviar() {
			valorInicial = valorZero * 20;

			for (var i = valorInicial; i < valorFinal; ) {
				if (i < array.length) {
					if (array[i].id != undefined) {
						var cabe = montarCabecalhoId(array[i]);

						if (linhas.length > 0) {
							var linha = montarLinhas(array[i]);
						} else {
							var linha = montarLinhasDinamicas(idLinha, array[i]);
						}

						cabe.appendChild(linha);

						frag.appendChild(cabe);
					}
				}
				i++;
			}

			center.appendChild(frag.cloneNode(true));

			console.log("VALOR FINAL: " + valorFinal);
			if (valorFinal < array.length) {
				frag = null;
				frag = document.createDocumentFragment();
				valorFinal += 20;
				valorZero++;

				var tempo = (valorZero * 10) + 100;

				if (tempo > 1500) {
					tempo = 1500;
				}
				
				timeA = setTimeout(reenviar, tempo);
			} else {
				clearTimeout(timeA);
				callback();
			}

		}

		setarValorFooter();

	}

	function pararGerarGrid() {
		// throw new TypeError();
		clearTimeout(timeA);

		valorFinal = array.length-1;
	}

	function setarValorFooter() {
		remo = jQuery("#branco");
		eventoBotaoClick('.row .linhaContainer');
		if (remo.length > 0) {
			remo.remove();
		}
		document.getElementById("footer").innerHTML = '<div id="branco">Registros: ' + array.length + '</div>';
	}

	function montarLinhasDinamicas(idLinha, a) {
		var fundoLinhaLista = document.createElement('div');
		fundoLinhaLista.setAttribute("id", "fundoLinhaLista");
		fundoLinhaLista.setAttribute("style", inserirCor(a));
		fundoLinhaLista.className = 'col-xs-12 col-sm-12';

		if (valorTitulo != "") {
			var rowTitulo = document.createElement('div');
			var linhaPrincipal = document.createElement('div');
			linhaPrincipal.setAttribute("id", idLinha);
			linhaPrincipal.setAttribute('style', setCorLinhas(a, valorTitulo[0], ''));
			var bTitulo = document.createElement('b');
			var titulo = '';
			var i = -1;
			while (++i < valorTitulo.length) {
				if (jQuery.trim(valorArrayJson(a, valorTitulo[i])) != "") {
					titulo += valorArrayJson(a, valorTitulo[i]);
					if (jQuery.trim(valorArrayJson(a, valorTitulo[(i + 1)])) != "") {
						titulo += " - ";
					}
				}
			};
			var conteudoTitulo = document.createTextNode(titulo);

			bTitulo.appendChild(conteudoTitulo);

			linhaPrincipal.appendChild(bTitulo);

			rowTitulo.appendChild(linhaPrincipal);

			fundoLinhaLista.appendChild(rowTitulo);
		}

		var i = -1;
		while (++i < valorMaximoLinha) {
			var rowConteudo = document.createElement('div');
			rowConteudo.className = 'row';
			var j = -1;
			while (++j < arrayElementos.length) {
				var elemento = arrayElementos[j];
				if (elemento[0] == i) {
					var valor = verificarValorSub(a, elemento[1]);

					//div linha secundaria descricao
					var linhaSecundariaDescricao = document.createElement('div');
					linhaSecundariaDescricao.setAttribute("id", a['id']);
					if (elemento[4] === undefined) {
						linhaSecundariaDescricao.setAttribute("style", setCorLinhas(a, elemento[1], valor) + 'text-align: ' + elemento[3]);
					} else {
						linhaSecundariaDescricao.setAttribute("style", 'color: ' + elemento[4] + '; ' + 'text-align: ' + elemento[3]);
					}
					linhaSecundariaDescricao.className = 'col-xs-' + elemento[2] + ' col-sm-' + elemento[2] + ' ' + elemento[1];

					// linha conteudo UM
					var conteudoUm = verificarElementosEspacos(valor);

					linhaSecundariaDescricao.appendChild(conteudoUm);
					rowConteudo.appendChild(linhaSecundariaDescricao);

				}
			}
			fundoLinhaLista.appendChild(rowConteudo);

		}
		return fundoLinhaLista;
	}

	function valorArrayJson(array, valorLinha) {
		var resul;
		if (jQuery.isArray(valorLinha)) {
			resul = array[valorLinha[0]];
			if (valorLinha.length > 1) {
				for (var i = 1; i < valorLinha.length; i++) {
					if (resul != null) {
						resul = resul[valorLinha[i]];
					} else {
						resul = "";
					}
				};
			}
		} else {
			var resul = array[valorLinha];
		}

		return resul;
	}

	function gridAcao(a) {
	}

	function fecharDivFundo() {
		return '</div>';
	}

	function montarCabecalhoId(a) {

		//div linha Secundario Dinamica AUX
		var linhaContainer = document.createElement('div');
		linhaContainer.setAttribute("onclick", "javascript: gridAcao(this)");
		linhaContainer.setAttribute("id", a.id);
		linhaContainer.className = 'row linhaContainer';

		return linhaContainer;
	}

	function adicionarTituloLinha(a) {
		var rtn = new StringBuilder();

		return rtn.toString();
	}

	function adicionarCenterDiv() {
		//adiciona a div que centraliza os campos ao centro
		con.append('<div id="centerCadastroo" class="row"></div>');
	}

	function adicionarValoresLinhas(linha, valores) {

		valoresSub[contadorSub] = [linha, valores];
		contadorSub++;
	}

	function adicionarValoresExtras(linhaBase, linhaReferencia, valoresArray) {

		valoresExtras[contadorValorExtras] = [linhaBase, linhaReferencia, valoresArray];
		contadorValorExtras++;

	}

	function verificarValorSub(array, valorLinha) {

		if (jQuery.isArray(valorLinha)) {
			var resul = array[valorLinha[0]];
			if (valorLinha.length > 1) {
				for (var i = 1; i < valorLinha.length; i++) {
					if (resul != null) {
						resul = resul[valorLinha[i]];
					} else {
						resul = "";
					}
				};
			}
		} else {
			var resul = array[valorLinha];
		}

		if (resul != undefined) {

			if (valoresSub.length > 0) {
				var i = -1;
				while (++i < valoresSub.length) {

					if (valoresSub[i][0] == valorLinha) {
						resul = array[valorLinha];
						var ar = valoresSub[i][1];

						var j = -1;
						while (++j < valoresSub[i][1].length) {

							if (resul == ar[j][0]) {
								resul = ar[j][1];

								if (valoresExtras.length > 0) {
									var l = -1;
									while (++l < valoresExtras.length) {
										if (valorLinha == valoresExtras[l][0]) {
											var arrayValores = valoresExtras[l][2];
											if (array[valoresExtras[l][1]] == arrayValores[0]) {
												resul = arrayValores[1];
											}
										}
									}
								}
							}
						}
					}
				}
			}
		} else {
			resul = "<b>" + valorLinha + "</b>";
		}

		if (valoresNumerosFormatados.length > 0) {
			var l = -1;
			while (++l < valoresNumerosFormatados.length) {
				if (valorLinha == valoresNumerosFormatados[l]) {
					resul = accounting.formatMoney(resul, "", 2, ".", ",");
				}
			}
		}
		return resul;
	}

	function corFundo(linha, arrayCores) {
		coresFundo = [linha, arrayCores];
	}

	function setCorPalavrasLinhas(linha, arrayValores) {
		coresLinhas[contadorCoresLinhas] = [linha, arrayValores];
		contadorCoresLinhas++;
	}

	function setCorPalavrasLinhasOutraLinha(linhaAPintar, linhaReferencia, arrayValores) {
		coresLinhasOutrLinha[contadorCoresLinhasOutrLinha] = [linhaAPintar, linhaReferencia, arrayValores];
		contadorCoresLinhasOutrLinha++;
	}

	function setCorTituloOutraLinha(linhaReferencia, arrayValores) {
		coresTitulo[0] = [linhaReferencia, arrayValores];

	}

	function sobrescreverCoresLinha(linha, valor, cor) {
		valoresSobCores[contadorSobCores] = [linha, valor, cor];
		contadorSobCores++;
	}

	function setarCorCondicao(linha, linhaMaster, cor, condicao, comparacao) {
		coresCondicoes[contadorCoresCondicoes] = [linha, linhaMaster, cor, condicao, comparacao];
		contadorCoresCondicoes++;
	}

	function corCodicaoMetodo(a, linha) {

		if (coresCondicoes.length > 0) {
			for (var i = 0; i < coresCondicoes.length; i++) {
				var retorno = '';
				var arrayCoresTemp = coresCondicoes[i];
				arrayCoreslinhas = arrayCoresTemp[0];
				var j = -1;

				while (j++ < arrayCoreslinhas.length) {
					if (arrayCoreslinhas[j] + '' == linha + '') {
						if (arrayCoresTemp[3] == '<') {
							if (a[arrayCoresTemp[1]] < arrayCoresTemp[4]) {
								retorno = 'color: ' + arrayCoresTemp[2] + "; ";
								return retorno;
							}
						}

						if (arrayCoresTemp[3] == '>') {
							if (a[arrayCoresTemp[1]] > arrayCoresTemp[4]) {
								retorno = 'color: ' + arrayCoresTemp[2] + "; ";
								return retorno;
							}
						}

						if (arrayCoresTemp[3] == '<=') {
							if (a[arrayCoresTemp[1]] <= arrayCoresTemp[4]) {
								retorno = 'color: ' + arrayCoresTemp[2] + "; ";
								return retorno;
							}
						}

						if (arrayCoresTemp[3] == '>=') {
							if (a[arrayCoresTemp[1]] >= arrayCoresTemp[4]) {
								retorno = 'color: ' + arrayCoresTemp[2] + "; ";
								return retorno;
							}
						}

						if (arrayCoresTemp[3] == '==') {
							if (a[arrayCoresTemp[1]] == arrayCoresTemp[4]) {
								retorno = 'color: ' + arrayCoresTemp[2] + "; ";
								return retorno;
							}
						}

						if (arrayCoresTemp[3] == '!==') {
							if (a[arrayCoresTemp[1]] !== arrayCoresTemp[4]) {
								retorno = 'color: ' + arrayCoresTemp[2] + "; ";
								return retorno;
							}
						}
					}
				}
			}
		}
	}

	function setCorTituloLinha(a) {
		if (coresTitulo.length > 0) {
			var arrayNova = coresTitulo[0][1];
			var j = -1;
			while (++j < arrayNova.length) {
				if (arrayNova[j][0] == a[coresTitulo[0][0]]) {
					return 'color: ' + arrayNova[j][1];
				}
			}
		}
	}

	function setCorLinhas(a, linha, valor) {
		var retorno = '';
		if (coresLinhas.length > 0) {
			var i = -1;
			while (++i < coresLinhas.length) {
				if (coresLinhas[i][0] == linha) {
					var arrayNova = coresLinhas[i][1];
					var j = -1;
					while (++j < arrayNova.length) {
						if (arrayNova[j][0] == valorArrayJson(a, linha)) {
							retorno = 'color: ' + arrayNova[j][1] + '; ';
						}
					}
				}
			}

			if (valoresSobCores.length > 0) {
				var i = -1;
				while (++i < valoresSobCores.length) {
					if (valoresSobCores[i][0] == linha) {
						if (valoresSobCores[i][1] == valor) {
							retorno = 'color: ' + valoresSobCores[i][2] + '; ';
						}
					}
				}
			}
			if (retorno == '') {
				retorno = corCodicaoMetodo(a, linha);
			}
			return retorno;

		} else {
			retorno = corCodicaoMetodo(a, linha);
			return retorno;
		}
	}

	function inserirCor(array) {
		var retorno = new StringBuilder();
		if (coresFundo != undefined) {
			var linha = coresFundo[0];
			var cores = coresFundo[1];

			var i = -1;
			while (++i < cores.length) {
				if (array[linha] == cores[i][0]) {
					retorno.append('background-color: rgb');
					if (cores[i][2] != undefined) {
						retorno.append('a');
					}
					retorno.append('(');
					retorno.append(hexToR(cores[i][1]));
					retorno.append(',');
					retorno.append(hexToG(cores[i][1]));
					retorno.append(',');
					retorno.append(hexToB(cores[i][1]));

					if (cores[i][2] != undefined) {
						retorno.append(',');
						retorno.append(cores[i][2]);
					}

					retorno.append(');');
				}

			}
		}
		return retorno.toString();
	}

	function setValorPesquisar(valor,linha, callback) {
		array = valor;
		arrayGlobal = valor;
		jQuery(container).empty();
		montarCampos(linha, function() {
			callback();
		});
	}

}

function valoresJquery() {
	$(function ($) {
	$(".linhaContainer").on("touchstart touchend touchmove", function (e) {
	var linha = $(this);
	linha.find('#fundoLinhaLista').toggleClass("tapped");
	linha.toggleClass("tapped");
	});
	})(jQuery);

}

function hexToR(h) {
	return parseInt((cutHex(h)).substring(0, 2), 16);
}

function hexToG(h) {
	return parseInt((cutHex(h)).substring(2, 4), 16);
}

function hexToB(h) {
	return parseInt((cutHex(h)).substring(4, 6), 16);
}

function cutHex(h) {
	return (h.charAt(0) == "#") ? h.substring(1, 7) : h;
}

// metodo que executa o clique em cada um na tela
// implementar no js que esta instanciando
// nam consegui implementar que retorno no methodo que da new
function gridAcao(a) {
	var i = -1;
	while (++i < arrayGlobal.length) {
		if (arrayGlobal[i].id == a.id) {
			retornoGrid(arrayGlobal[i], i);
			break;
		}
	};
}

function verificarElementosEspacos(a) {

	a = a + '';

	if (a.indexOf("<b>") != -1) {
		a = a.replace('<b>', '');
		a = a.replace('</b>', '');
		var textoPuro = document.createTextNode(a);

		//verifica se eh espaço
		if (a.indexOf("&nbsp;") != -1) {
			a = a.replace('&nbsp;', '');
			a = a.replace('&nbsp;', '');
			var espaco = document.createTextNode('\u00A0');

			return espaco;
		} else {
			var b = document.createElement('b');
			b.appendChild(textoPuro);

			return b;
		}
	} else if (a.indexOf("<r>") != -1) {
		a = a.replace('<r>', '');
		a = a.replace('</r>', '');

		var textoPuro = document.createTextNode(a);
		var r = document.createElement('r');
		r.appendChild(textoPuro);
	} else {
		var textoPuro = document.createTextNode(a);
		return textoPuro;
	}
}

