/******************************************************************************/
/* CONTROLEDORES PARA USO APENAS EM AMBIENTE DE DESENVOLVIMENTO ***************/
var pendingTransmission = false;
var printSentDataInfo = false;
var printKeyValueInfo = false;
var printReceivedDataInfo = false;

var xmlhttp = 0;

function sendMessageToServer(data, callback) {
	xmlhttp = new XMLHttpRequest();
	xmlhttp.onreadystatechange = function() {
		if (xmlhttp.readyState == 4) {
			if (callback == null || callback == undefined)
				parseRespostas();
			else {
				pendingTransmission = false;
				callback(xmlhttp.responseText);
			}
		}
	};

	xmlhttp.open("POST", "ajax.pl", true);
	xmlhttp.setRequestHeader("Content-type",
			"application/x-www-form-urlencoded");
	xmlhttp.setRequestHeader("charset", "utf-8");

	if (printSentDataInfo) {
		alert("size of data: " + data.length + "\ndata: " + data + "\n");
	}
	
	xmlhttp.send(data);
}

function requestOperation(operation, argument) {
	if(!pendingTransmission) {
		pendingTransmission = true;
		var data = '&operation=' + escape(operation) + argument;
		sendMessageToServer(data, null);
	} else {
		alert('Espere um pouco, existe uma operação pendente');
	}
}

function requestOperationWithCallback(operation, argument, callback) {
	if(!pendingTransmission) {
		pendingTransmission = true;
		var data = '&operation=' + escape(operation) + argument;
		sendMessageToServer(data, callback);
	} else {
		alert('Espere um pouco, existe uma operação pendente');
	}
}

function readKeyValue(text, object) {
	text = strtrimstart(text);
	
	var indexOfColon = 0, indexOfNewLine = 0;
	
	if(text == null || ((typeof text).toLowerCase() != "string") || object == null)
		return false;
	
	if(!object.isSizeLimited) { // Portanto o value é limitado por um newline
		indexOfColon = text.indexOf(':');
		
		if(indexOfColon == -1 || indexOfColon == 0)
			return false;
		
		indexOfNewLine = text.indexOf('\n', indexOfColon);
		
		if(indexOfNewLine == 0)
			return false;
		
		if(indexOfNewLine == -1)
			indexOfNewLine = text.length - 1;
		
		object.key = strtrim(text.substring(0, indexOfColon));
		if(object.key.length == 0)
			return false;

		object.value = strtrim(text.substring(indexOfColon + 1, indexOfNewLine));
		
		if (indexOfNewLine < (text.length - 1))
			object.tail = text.substring(indexOfNewLine + 1);
		else
			object.tail = null;
	} else {
		indexOfColon = text.indexOf(':');
		
		if(indexOfColon == -1 || indexOfColon == 0)
			return false;
		
		var keyNotTrimmed = text.substring(0, indexOfColon);
		object.key = strtrim(keyNotTrimmed);
		if(object.key.length == 0)
			return false;
		
		/* OBS.: É 'text.length - keyNotTrimmed.length' MENOS 2 e não MENOS 1 porque python imprime um newline após o texto. */
		if((text.length - keyNotTrimmed.length - 2) != object.size) {
			alert('O tamanho informado pelo servidor não corresponde ao tamanho do objeto recebido!' + '\n' + 'Tamanho real = ' + (text.length - keyNotTrimmed.length - 1) + '\n' + 'Tamanho recebido = ' + text.length + '\n' + 'Conteúdo:: \n' + object.value);
			return false;
		}
		
		object.value = strtrim(text.substring(indexOfColon + 1, indexOfColon + 1 + object.size));
		
		if((indexOfColon + 1 + object.size + 1) < text.length - 1)
			object.tail = text.substring(indexOfColon + 1 + object.size + 1);
		else
			object.tail = null;
	}
	
	if (printKeyValueInfo) 
		alert("object.key = " + object.key + "\n" + "object.value = " + object.value + "\n" + "object.tail = " + object.tail);
	
	return true;
}

function parseRespostas() {
	pendingTransmission = false;
	var resposta = xmlhttp.responseText;
	
	if (printReceivedDataInfo) {
		alert(resposta);
	}
	
	var keyvalue = new Object();
	keyvalue.isSizeLimited = false;
	
	readKeyValue(resposta, keyvalue);
	var operacao = keyvalue.value;
	
	if (operacao == 'load item text') {
		readKeyValue(keyvalue.tail, keyvalue);
		var id_texto = keyvalue.value;
		
		readKeyValue(keyvalue.tail, keyvalue);
		var id_item = keyvalue.value;
		
		readKeyValue(keyvalue.tail, keyvalue);
		var tipo = keyvalue.value;
		
		readKeyValue(keyvalue.tail, keyvalue);
		var versao = keyvalue.value;
		
		readKeyValue(keyvalue.tail, keyvalue);
		var texto_size = keyvalue.value;
		
		keyvalue.isSizeLimited = true;
		keyvalue.size = parseInt(texto_size);
		readKeyValue(keyvalue.tail, keyvalue);
		var texto = keyvalue.value;

		var textdiv = getTextDiv(id_item, tipo);
		
		textdiv.innerHTML = texto;
		
		/* Cuida de marcar esse item como 'já carregado', para que quando clicarem de novo nele o browser não requisitar novamente do servidor o conteúdo que já tem. */
		itensCarregados.push(parseInt(id_item));
		tiposDosItensCarregados.push(parseInt(tipo));
		
		loading_all_hide();
		
		showTextDiv(tipo, id_item, textdiv);
		
		dolayout();
		
		pendingAction = false;
	} else if (operacao == 'save item') {
 		readKeyValue(keyvalue.tail, keyvalue);
 		var suboperacao = keyvalue.value;
		
		readKeyValue(keyvalue.tail, keyvalue);
		var resultado = keyvalue.value;
		
		if(resultado == 'sucesso') {
			if (suboperacao == 'insert'){
				readKeyValue(keyvalue.tail, keyvalue);
				var idGerado = keyvalue.value;
				alert('Item criado com sucesso!\nAnote seu ID: ' + idGerado);
			} else if (suboperacao == 'update') {
				alert('Item criado com sucesso!\nAnote seu ID: ' + idGerado);
			} else {
				alert('Erro 87842');
			}
		} else if (resultado == 'fracasso') {
			if(suboperacao == 'insert')
				alert('Criação mal sucedida');
			else
				alert('Alteração mal sucedida');
		} else {
			alert('Erro 77781');
		}
	} else if (operacao == 'delete item') {
		alert (resposta);
	} else if (operacao == 'save text') {
		alert('coisa e tal');
		qualquer();
		/*
		readKeyValue(keyvalue.tail, keyvalue);
		
 		var resultado = keyvalue.value;
		
		if (resultado == 'sucesso'){
			readKeyValue(keyvalue.tail, keyvalue);
			if (keyvalue.key == 'ID') {
				alert('ID do texto: ' + keyvalue.value);
			} else {
				alert('Atualizado com sucesso');
			}
		} else if (resultado == 'fracasso') {
			var textoDoErro = decodeURIComponent(keyvalue.tail);
			alert('textoDoErro: ' + textoDoErro);
		}*/
		
	} else if (operacao == 'delete text') {
		alert (resposta);
	} else {
		alert (resposta);
//		logging.innerHTML += "resposta desconhecida:<br />" + resposta + "<hr class='lightgray' /><br />";
	}
//  		alert(resposta);
}

