// aimsMio.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*		dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js, aimsIdentify.js, aimsSelect.js, and aimsLayers.js
*		To be interactive, dependent also on aimsDHTML.js, aimsClick.js, and aimsNavigation.js
*/

aimsMioPresent = true;
// PARH variables globales

// array global para almacenar los ID2 de cada padron involucrado en la consulta
// BUG 1 (4/12/2001): regId2 no se reinicializa en cada nueva consulta.
//					  Por eso, cuando se buscan mismos numeros de padron (sin importar letra depto) en consultas
//					  consecutivas, da cualquier cosa (generalmente un error en tiempo de ejecucion).
// Carga de datos a regId2: en calculoIndProdTodosArr()
// SOLUCION: en calculoIndProdTodosArr() se 'reinicializa' regId2 de la siguiente manera:
//			 	regId2.length = 0
var regId2 = new Array();

// envelope de la imagen devuelta
var envReply = new Array();

var laRespuesta="";

//envelope minimo que incluya a todos los poligonos seleccionados
var envPadConeat = new Array();

// envelope por padron
var envPads = new Array();

// índice de envPads
var envPadsIndex = "";

// envelope de cada poligono seleccionado desplegado
var envPolysPadConeat = new Array();

// campo ID2 para cada poligono de todos los poligonos coneat seleccionados
var id2PadConeat="";
var id2PadConeatArray = new Array();

// campo SC (grupo de suelo Coneat) de cada poligono de todos los poligonos coneat seleccionados
var scPadConeat = new Array();

// coordenas de todos los poligonos seleccionados
var coordPadConeat = new Array();

// regPadConeat es el array que guarda la información de todos los padrones
// obtenidos en la consulta, guarda un reg por padron.
var regPadConeat = new Array();

// total de polygonos seleccionados
var totPolys = 0;

// total de padrones seleccionados
var totPads = 0;

// dirección para la imagen principal del mapa a imprimir
var imsMapImpURLPR ="";

// dirección para la imagen del mapa OV a imprimir
var imsOVMapImpURLPR ="";

// direccion para la imagen de la leyenda
var imsLegendImpURL = "";

// direccion con la imagen del acetato del norte
var imsNorteImpURL = "";


// colores de los poligonos catcon en base a SC
// var scColorIndex = "03.41,10.5,03.3,11.9,03.2,09.4,10.8B,03.52,10.8A,03.51";
//FLA 3/8/2001: los colores para los suelos estan "hardcodeados"??
//OJO! los suelos que no estan en esta lista (suelos K27) no aparecen coloreados en resultado final.
//NOTA FINAL: a scColorIndex no se usa mas. Ahora hay un objeto ColoresSuelos que se encarga del asunto
//			  dependiendo de datos extraidos del campo RGB de tabla SDE.INDPROD.
var scColorIndex = "03.41;210,210,210;10.5;157,192,192;03.3;223,199,170;11.9;161,209,151;03.2;226,166,166;09.4;203,166,203;10.8B;254,164,164;03.52;168,172,209;10.8A;200,216,154;03.51;243,196,216;-;-,-,-;";
// var colorSC = new Array("210,210,210","157,192,192","223,199,170","161,209,151","226,166,166","203,166,203","254,164,164","168,172,209","200,216,154","243,196,216");

// convertidor de codigo de departamento
//FLA 3/8/2001: agregue codigos de todos los departamentos.
var deptoStr = ";F,Rivera;A,Canelones;B,Maldonado;C,Rocha;D,Treinta y Tres;E,Cerro Largo;G,Artigas;H,Salto;I,Paysandu;J,Rio Negro;K,Soriano;L,Colonia;M,San Jose;N,Flores;O,Florida;P,Lavalleja;Q,Durazno;R,Tacuarembo;V,Montevideo;-,-;";

// layer activo
var activeLayerIndexPR = "";

// tamaño de la imagen del mapa para la impresión en pixeles
var impMapiHeight = 600;
var impMapiWidth = 500;

// tamaño de la imagen del mapa de overlay para la impresión en pixeles
var impOVMapiHeight = 200;
//FLA_MODIF 22/8/2003: agrandar el ancho del croquis de ubicacion en un
//	de modo que resulte proporcional al del mapframe.
//var impOVMapiWidth = 300;   //ORIGINAL.
var impOVMapiWidth = 420;

// formato de la imagen devuelta por el servidor
// FLA (7/8/2001). Original.
//var tipoImg = "PNG";
// FLA (7/8/2001). JPG es mas portable.
var tipoImg = "JPG";

/*
***************************************************************************************

My own functions PARH

***************************************************************************************
*/
function buscarPadConeatForm() {
	if (!parent.MapFrame.g_bCargarFormBusqueda) {
		setLayerFields(ActiveLayerIndex);
	}

	if (useTextFrame) {
		// MODIF 18/2/2002: controlar si se invoca el form de busqueda automaticamente cuando
		//			se carga la aplicacion (desde toc.htm). Se manda el query string BuscarAhora=ingreso para
		//			que el codigo asp pueda determinar si es un posible ingreso a la pagina.
		if (parent.MapFrame.g_bCargarFormBusqueda) {
			parent.TextFrame.document.location= appDir + 'buscarPadConeatForm.asp?BuscarAhora=ingreso';
		} else {
			parent.TextFrame.document.location= appDir + 'buscarPadConeatForm.asp';
		}
	} else {
		// MODIF 18/2/2002: (ver comentario anterior).
		if (parent.MapFrame.g_bCargarFormBusqueda) {
			Win1 = open(appDir + 'buscarPadConeatForm.asp?BuscarAhora=ingreso',"QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
		} else {
			Win1 = open(appDir + 'buscarPadConeatForm.asp',"QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
		}
	}
}


// es llamada desde buscaPadConeatForm.htm para buscar el padron
function buscaPadPR(str, joinstr) {
        var mp = parent.MapFrame

	if (str!="") {
		// sampleList=null;

		XMLMode = 1001;

		// mando el query string
		mp.mySendQueryStringJoinPR(str,joinstr);

		mp=null;

        }
	else {
		//FLA: aca no entra nunca.
		// str nunca esta vacio.
		alert("El string de búsqueda está vacio.\nNo se ha seleccionado ningun padrón.");
	}
}

// mi funcion para hacer un layer activo
function setActiveLayerPR(i) {
	var mp = parent.MapFrame;

	mp.ActiveLayer=mp.LayerID[i];
	mp.ActiveLayerType=mp.LayerType[i];
	mp.ActiveLayerIndex=i;
	// mp.setActiveLayer(i);

}

// funcion para contruir el string del Query en formato XML y mandarlo al servidor
function mySendQueryStringJoinPR(newString, joinstr) {

	// paso el string principal a formato XML compatible
	newString = makeXMLsafe(newString);

	setQueryString=newString;
	selectionMode=1;
	selectData.length=1;
	LayerFields.length=1;
	LayerFieldType.length=1;
	LayerFieldCount=0;
	showBuffer=false;
	showRetrieveData();


	var strRequest = myWriteQueryXMLJoin(newString, joinstr);
	// alert(strRequest);

	// mando el string de consulta formato XML al servidor, para el factor extrinseco

	sendToServer(imsQueryURL,strRequest,1002);

	// de aca ir a aimsXML.js, después de sendToServer va a processXML, este llama a
	// useCustomFunction de aimsCustom.js con XMLMode = 1002
}

// PARH write out XML request to query attributes Uses SPATIALQUERY  con JOIN
function myWriteQueryXMLJoin(queryString, joinstr) {
	if (swapSelectFields) {
		selectFields=selFieldList[ActiveLayerIndex];
	}
	var theString = '<?xml version="1.0" encoding="UTF-8"?><ARCXML version="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="true" envelope="true"';
	theString += ' compact="true" featurelimit="' + maxFeaturesReturned + '" beginrecord="' + queryStartRecord + '">\n';
	// alert("Active Layer type:" + ActiveLayerType);
	var ActiveLayerPR = 0;
	var ActiveLayerTypePR = "polygon";
	theString += '<LAYER id="' + ActiveLayerPR + '" />';
	// alert("selectFields:" + selectFields);

	if (useLimitExtent) {
		// keep this within the limitExtent
		theString += '<SPATIALQUERY subfields="#ALL#" where="' + queryString + '">';
		theString += '<SPATIALFILTER relation="area_intersection">\n';
		theString += '<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
		theString += '</SPATIALFILTER>\n';
		theString += '</SPATIALQUERY>\n';
	} else {
	theString += '<SPATIALQUERY subfields="#ALL#" where="' + queryString + '" ' + joinstr + '/>';
	}
	theString += '</GET_FEATURES>';
	theString += '</REQUEST>';
	theString += '</ARCXML>';
	//alert("writeQueryXML()\nQuery XML Request:\n" + theString);
	selectLayer=ActiveLayer;
	selectType=ActiveLayerType;
	selectCount=0;
	hightlightedOne="";
	selectPoints.length=1;
	selectLeft.length=1;
	selectRight.length=1;
	selectTop.length=1;
	selectBottom.length=1;
	return theString;
}


// PARH contruye el form para mostrar los resultados y mostrar el boton de imprimir
// es el form padConeatImpForm.html
function resultQueryPadConeatForm(replyStr) {
		var mp = parent.MapFrame;
		mp.totPolys = justGetFeatureCount(replyStr);

		// reg es un array que guarda para cada registro (o padron) el depto,
		// el numero de padron, la seccion judicial y el indice de productividad calculado
		// regPadConeat es el array que guarda la información de todos los padrones
		// obtenidos en la consulta, guarda un reg por padron.
		// inicialmente lo voy a hacer considerando que me piden un solo padron siempre

		// FLA (4/12/2001): regPadConeat NO SE USA.
		var reg = new Array(4);
		// var regPadConeat = new Array();

		// alert(replyStr);
		// obtengo el envelope minimo que incluya a todos los poligonos seleccionados
		// devuelve un array con minx,miny,maxx,maxy
		// tambien obtengo cada envelope de cada poligono y lo cargo en la variable
		// globar envPolysPadConeat
		var resultado = getEnvelopePadConeat(replyStr);
		mp.envPadConeat = resultado[0];
		mp.envPolysPadConeat = resultado[1];

		// obtengo el envelope minimo para cada padrón y el identificador ID2
		// resultado = getEnvPads(replyStr);
		// mp.envPadsIndex = resultado[0];
		// mp.envPads = resultado[1];

		// obtengo el ID2 para cada poligono
		//- mp.id2PadConeat = getAllFieldValues(replyStr, "CATCON.ID2", totPolys);

		// obtengo el campo SC (grupo de suelo Coneat) de cada poligono
		// ELIMINADO (21/09/2001): scPadConeat se carga en el primer for de obtengoDatos().
		// Esta inicializacion del array scPadConeat no funcaba ni pa atras.
		//mp.scPadConeat = getAllFieldValues(replyStr, "SC", totPolys);
		//FIN_ELIMINADO

		// obtengo las coordenas de todos los poligonos seleccionados
		// devuelve un array donde cada elto del mismo es un poligono entero del
		// tipo string con "," como separadores
		mp.coordPadConeat = getCoordPadConeat(replyStr);
		//alert("coordPadConeat---antes ---:"+coordPadConeat.toString());

		//OJO: se "reusa" la variable resultado para otra cosa distinta (ver un poco mas atras cuando se declara).
		//     Igualmente no afecta.
		resultado = obtengoDatos(replyStr);

		// calculo los indices de productividad de cada padron
		var resIndProd = calculoIndProdTodosArr(resultado);
		// FLA (18/09/2001): Nota para futuras modificaciones y/o humanos modificadores.
		// Hacer un alert de resIndProd[1] para ver la/las cosas que se retornan (en una consulta
		// con varios padrones se aprecia mejor).
		// La funcion calculoIndProdTodosArr() retorna esa cosa (?) que hace al meollo del asunto.
		//DEBUG
		//alert('resultQueryPadConeatForm()\nIndProdConeat[1] viene de calculoIndProdTodosArr =\n\n' + resIndProd[1]);
		//FIN_DEBUG

		// Ver comentarios finales en calculoIndProdTodosArr para tener mas claro el retorno de esa funcion.
		mp.indProdPadConeat = resIndProd[1]; // NOTA: es un string raro con todos los datos separados por coma.
		mp.totPads = resIndProd[0];			 // NOTA: ojo... es el total de padrones ENCONTRADOS y calculados.
		mp.envPads = resIndProd[2];			 // NOTA: los extents totales para cada padron.

		// muestra los datos en el textFrame y el boton de imprimir, por ahora solo muestra 1 registro (NOTA: ja ja...CUANDO????)
		mostrarDataPadConeatStr(mp.indProdPadConeat, mp.totPads);


		// crear el acetato con los poligonos seleccionados, para el zoom dado por el envelope hallado
		// FLA_MODIF 19/8/2003: mostrar los poligonos de CATCON de los padrones encontrados
		//    con sus colores correspondientes. (antes todo yellow submarine).
		//var polysXMLEnv = makeXMLAcetatePoly("fijo", "255,255, 0", 0.5, "0,125,200", 3);   // ANTES MODIF 19/8/2003.

		// FLA_REVIS 25/8/2003: intentar parametrizar para diferenciar si es acetato para viewer o para croquis.
		//
		var polysXMLEnv = makeXMLAcetatePoly("viewer", "200,200, 200", 1.0, "0,125,200", 3);

		// desplegar la imagen del zoom y el acetato con los poligonos
		// alert(polysXMLEnv);

		//OJO_DEBUG
		//_DebugWin('REQUEST PARA EL CROQUIS ' + polysXMLEnv);
		//FIN_DEBUG

		sendToServer(imsURL, polysXMLEnv, 1003);
}


// mostrar los datos de la consulta y el boton de imprimir
function mostrarDataPadConeatStr(regsStr, totRegs) {
	// FLA (18/09/2001).
	// LLAMADA EN: funcion resultQueryPadConeatForm().
	// PARAMETROS: ver comentarios del 18/09/2001 en funcion resultQueryPadConeatForm().
	//
	// FLA (27/11/2001): PARAMETRO totRegs NO SE USA.

	// regs es un array con todos los registros a mostrar
	// totRegs es el total de registros a mostrar

	// en gobjInfoMae para que en el reporte del frame resultado se reflejen los casos excepcionales de busqueda.
	//OJO_DEBUG: activar el debug siguiente.
	//var strAntes = regsStr;
	//FIN_DEBUG

	//(29/11/2001): modificar regsStr de modo de reflejar los casos segun StatusBusq
	regsStr = IncluirStatusBusq(regsStr, parent.MapFrame.gobjInfoMae, parent.MapFrame.gobjPorcSue);

	//OJO_DEBUG: activar el DEBUG anterior.
	/*
	alert('Funcion mostrarDataPadConeatStr(regsStr, totRegs)\n\nregsStr ORIGINAL=\n' + strAntes +
		  '\n\nLUEGO DE REFORMATEAR regsStr =\n' + regsStr +
		  '\n\ngobjInfoMae.Cant() =' + parent.MapFrame.gobjInfoMae.Cant());
	*/
	//FIN_DEBUG

	var depto,nroPad,seccJud,indProd, nombreDepto, id2;

	// MODIFICACION (18/09/2001): incluir sup. cat. en el reporte.
	var strSupCat;
	// FIN_MODIFICACION
	//MODIFICACION 15/4/2002: incluir IVR.
	var strIVR;
	//FIN_MODIFICACION

	//MODIF_NOTIF 24/6/2004 - agregar Lamina y Coord para la notificacion.
	var strLamina;
	var strCoord;
	//FIN_MODIF_NOTIF

	//MODIF_NOTIF 21/6/2004:
	/* Armado del QuerysString para resultados_indices.asp.
	depto     -> d
	padron    -> p
	sec. jud. -> j
	sup. cat. -> s
	ipf       -> i
	ivr       -> v
	lamina    -> l
	coord     -> c
	total reg -> t [1..n]
	*/
	var strQSresultado = '';  // QueryString.
	var nTotalFilas = 0;	  // total de filas para parametro t= del QueryString.
	//FIN_MODIF_NOTIF

	var start,end;

	regsStr += ",-,";
	start = 0;
	end = regsStr.indexOf(",",start);
	depto = regsStr.substring(start,end);
	while (depto != "-" && start > -1 && end > -1) {
		start = end + 1;
		end = regsStr.indexOf(",",start);
		nroPad = regsStr.substring(start,end);
		start = end + 1;
		end = regsStr.indexOf(",",start);
		seccJud = regsStr.substring(start,end);

		// MODIFICACION (18/09/2001): extraer sup. cat. del string extranio.
		start = end + 1;
		end = regsStr.indexOf(",",start);
		strSupCat = regsStr.substring(start,end);
		// FIN_MODIFICACION

		//MODIF_NOTIF 24/6/2004 - extraer Lamina y Coord para la notificacion.
		start = end + 1;
		end = regsStr.indexOf(",",start);
		strLamina = regsStr.substring(start,end);

		start = end + 1;
		end = regsStr.indexOf(",",start);
		strCoord = regsStr.substring(start,end);
		//FIN_MODIF_NOTIF

		start = end + 1;
		end = regsStr.indexOf(",",start);
		indProd = regsStr.substring(start,end);

		//MODIFICACION 15/4/2002: extraer IVR
		start = end + 1;
		end = regsStr.indexOf(",", start);
		strIVR = regsStr.substring(start, end);
		//FIN_MODIFICACION

		start = end + 1;
		end = regsStr.indexOf(",",start);
		id2 = regsStr.substring(start,end);
		start = end + 1;
		end = regsStr.indexOf(",",start);
		nombreDepto = regsStr.substring(start,end);

		//MODIF_NOTIF 21/6/2004:
		++nTotalFilas;
		strQSresultado = strQSresultado + 'd' + nTotalFilas + '=' + escape(nombreDepto) + '&' +
						 'p' + nTotalFilas + '=' + escape(nroPad) + '&' +
						 'j' + nTotalFilas + '=' + escape(seccJud) + '&' +
						 's' + nTotalFilas + '=' + escape(strSupCat) + '&' +
						 'i' + nTotalFilas + '=' + escape(indProd) + '&' +
						 'v' + nTotalFilas + '=' + escape(strIVR) + '&' +
						 'l' + nTotalFilas + '=' + escape(strLamina) + '&' +
						 'c' + nTotalFilas + '=' + escape(strCoord) + '&';
		//FIN_MODIF_NOTIF:

		start = end + 1;
		end = regsStr.indexOf(",",start);
		depto = regsStr.substring(start,end);
	}
	//MODIF_NOTIF 21/6/2004:
	strQSresultado = strQSresultado + 't=' + nTotalFilas;

	var Win1 = window.open('http://www.prenader.gub.uy/coneat/resultados_indices.asp?' + strQSresultado, 'TextFrame');
	//FIN_MODIF_NOTIF:

	Win1.document.close();

	Win1 = null;
}


// dado un conjunto de elementos separados por algo y en formato string
// devuelve un array con los elementos y la totalidad de elementos
function strToArray(str,separador) {
	var start, end;
	var elto;
	var resultado = new Array(2);
	var resArray = new Array();
	var i = 0;

	str += separador+separador;
	start = 0;
	end = str.indexOf(separador,start);
	while (start > -1 && end > -1 && start != end) {
		elto = str.substring(start, end);
		if (elto != separador) resArray[i] = elto;
		start = end + 1;
		end = str.indexOf(separador,start);
		i++;
	}

	resultado[0] = resArray;

	return resultado;
}

// obtengoDatos
function obtengoDatos(dataStr) {
	// LLAMADA EN: funcion resultQueryPadConeatForm()

	var mp = parent.MapFrame;

	var totRegs = justGetFeatureCount(dataStr);
	// ORIGINAL: antes de expandir el array para incluir SupCat.
	//var resultado = new Array(9);
	// FIN_ORIGINAL
	// MODIFICACION (18/09/2001): Se deja el array abierto a cualquier cantidad de elementos porque se
	//    incluyo array con sup. catastral (y quizas se puedan incluir otros datos en el futuro).
	var resultado = new Array();
	var arrSupCat = new Array(totRegs);   // Se agrega el array con las sup. catastrales tomadas de CONEATMAESTRO.
	// FIN_MODIFICACION

	// MODIFICACION (19/11/2001):         // Se agrega array con los nombres de los suelos CONEAT.
	var arrSueloConeat = new Array(totRegs);
	// FIN_MODIFICACION

	// MODIF_NOTIF 24/6/2004: se agrega arrays de laminas y coords para reporte de notificacion.
	var arrLamina = new Array(totRegs);
	var arrCoord = new Array(totRegs);
	// FIN_MODIF_NOTIF


	var deptoArr = new Array(totRegs);
	var padronArr = new Array(totRegs);
	var seccjudicArr = new Array(totRegs);
	var indprodArr = new Array(totRegs);
	var areaArr = new Array(totRegs);
	var fextArr = new Array(totRegs);
	var id2Arr = new Array(totRegs);
	var envPolysArr = new Array(totRegs);

	// deptoArr = getAllFieldValues(dataStr, "SDE.CATCON.DEPTO", totRegs);
	// obtengo la letra de DEPTO y el ID2
	var start;
	var startEnv;

	// FLA (19/11/2001) Reinicializar objetos:
	//		gobjColores - encargado de mantener la correspondencia suelo-color.
	mp.gobjColores.VaciarObjeto();

	//OJO_DEBUG
	//_DebugWin('poligonos encontrados = ' + totRegs + ' ....Reply de busqueda =\n' + dataStr);
	//FIN_DEBUG

	start = dataStr.indexOf("<FEATURE",0);
	startEnv = dataStr.indexOf("<ENVELOPE",0);
	for (var i = 0; i < totRegs; i++) {
		deptoArr[i] = justGetFieldValue(dataStr,"SDE.CATCON.DEPTO",start);
		id2Arr[i] = justGetFieldValue(dataStr,"SDE.CATCON.ID2",start);
		// MODIFICACION (21/09/2001): cargar gobjColores con los colores de suelos que resulto de la consulta.
		var strColor, strSC;
		strColor = justGetFieldValue(dataStr, "SDE.INDPROD.RGB", start);
		strSC = justGetFieldValue(dataStr, "SDE.INDPROD.SC", start);
		mp.gobjColores.NuevoElem(strSC, strColor);
		// FIN_MODIFICACION

		// MODIFICACION (19/11/2001): cargar arrSueloConeat con nombres de suelos.
		//		Es paralelo al resto de los arrays con info por padron.
		arrSueloConeat[i] = strSC;
		// FIN_MODIFICACION

		// MODIFICACION (21/09/2001): scPadConeat antes se inicializaba mal en resultQueryPadConeatForm().
		// scPadConeat se carga aca.
		mp.scPadConeat[i] = strSC;
		// FIN_MODIFICACION

		start = dataStr.indexOf("</FEATURE",start) + 9;
		envPolysArr[i] = getEnvelopeXYs(dataStr,startEnv);
		startEnv = dataStr.indexOf("<ENVELOPE",startEnv +9);
	}

	//DEBUG
	//alert('funcion obtengoDatos() -- id2Arr[]\n' + id2Arr.toString());
	//alert('funcion obtengoDatos() -- envPolysArr[]\n' + envPolysArr.toString());
	//FIN_DEBUG

	// ORIGINAL: se obtenian datos accesorios (PADRON, SECJUDIC, FEXT) de la tabla interseccion CATCON.
	// Era ineficiente mantener esos datos en CATCON por redundancia y dificultad de mantenimiento en
	// el layer temporario CATCON.
	//padronArr = getAllFieldValues(dataStr, "SDE.CATCON.PADRON", totRegs);			//DESACTIVADO.
	//seccjudicArr = getAllFieldValues(dataStr, "SDE.CATCON.SECCJUDIC", totRegs);   //DESACTIVADO.
	indprodArr = getAllFieldValues(dataStr, "SDE.INDPROD.PROD_SUE", totRegs);
	areaArr = getAllFieldValues(dataStr, "SDE.CATCON.AREA", totRegs);
	//fextArr = getAllFieldValues(dataStr, "SDE.CATCON.FEXT", totRegs);				//DESACTIVADO.
	// id2Arr = getAllFieldValues(dataStr, "SDE.CATCON.ID2", totRegs);   // Comentado originalmente.
	// FIN_ORIGINAL

	//DEBUG: ver como vienen esos malditos arrays padronArr, seccjudicArr, etc para intentar colocar el parche
	//       utilizando gobjInfoMae.
	/*
	var arrFextAdefe = new Array();
	var arrPadronAdefe = new Array();

	arrFextAdefe = gobjInfoMae.GenerarVecAdefesio("FExt", id2Arr);
	arrPadronAdefe = gobjInfoMae.GenerarVecAdefesio("Padron", id2Arr);

	alert("obtengoDatos()" +
		  "\nid2Arr = fabricado en el for misterioso.\n" + id2Arr.toString() +
		  "\nfextArr = original tomado de CATCON.\n" + fextArr.toString() +
		  "\narrFextAdefe = GenerarVecAdefesio('FExt', id2Arr)\n" + arrFextAdefe.toString() +
		  "\narrPadronAdefe = GenerarVecAdefesio('Padron', id2Arr)\n" + arrPadronAdefe.toString() +
		  "\npadronArr = getAllFieldValues(dataStr, 'SDE.CATCON.PADRON', totRegs)\n" + padronArr.toString() +
		  "\nseccjudicArr = getAllFieldValues(dataStr, 'SDE.CATCON.SECCJUDIC', totRegs)\n" + seccjudicArr.toString());
	*/
	//FIN_DEBUG

	// SOLUCION (13/09/2001): imitar padronArr, seccjudicArr, fextArr a como se generaban
	// usando getAllFieldValues() pero con datos tomados de CONEATMAESTRO (usando el objeto gobjInfoMae).
	// MODIFICACION (13/09/2001):
	// Para no afectar el resto del codigo (salado), se opta por generar esos arrays imitando a como
	// se hubieran generado usando getAllFieldValues() es decir... con valores repetidos y en cualquier orden.
	var boolNoEtiq = false;
	var boolEtiq = true;
	padronArr = gobjInfoMae.GenerarVecAdefesio("Padron", id2Arr, boolNoEtiq);		//ACTIVADO.
	seccjudicArr = gobjInfoMae.GenerarVecAdefesio("SeccJudic", id2Arr, boolNoEtiq); //ACTIVADO.
	fextArr = gobjInfoMae.GenerarVecAdefesio("FExt", id2Arr, boolNoEtiq);           //ACTIVADO.
	// MODIFICACION (18/09/2001): incluir las superficies catastrales tomadas de tabla CONEATMAESTRO.
	arrSupCat = gobjInfoMae.GenerarVecAdefesio("SupCat", id2Arr, boolNoEtiq);
	// FIN_MODIFICACION
	// FIN_SOLUCION: Ok.

	// MODIF_NOTIF 24/6/2004: se agrega arrays de laminas y coords para reporte de notificacion.
	arrLamina = gobjInfoMae.GenerarVecAdefesio("Lamina", id2Arr, boolNoEtiq);
	arrCoord = gobjInfoMae.GenerarVecAdefesio("Coord", id2Arr, boolNoEtiq);
	// FIN_MODIF_NOTIF

	// AGREGADO (27/11/2001): Poner status de busqueda segun a lo encontrado en CATCON.
	gobjInfoMae.StatusSegunBusquedaCatcon(id2Arr);
	// FIN_AGREGADO

	//DEBUG (27/11/2001): verificando los status de busqueda.
	/*
	alert('obtengoDatos() -- cuando aplico gobjInfoMae.StatusSegunBusquedaCatcon(id2Arr)\npadronArr =\n' + id2Arr.toString());
	var strDebug = 'obtengoDatos() -- luego de gobjInfoMae.StatusSegunBusquedaCatcon(id2Arr)\n' +
				   'Reporte de gobjInfoMae\n\n';

	strDebug += 'Id2**Depto**Padron**Id2Bolson**Nombre**FExt**CodFicto**DescFicto**Lamina**Coord**IPF_mae**IVR_mae**Carpeta**StatusBusq\n';

	for (objPad in gobjInfoMae.arrPadrones) {
		strDebug += gobjInfoMae.arrPadrones[objPad].Id2 + '**' +
					gobjInfoMae.arrPadrones[objPad].Depto + '**' +
					gobjInfoMae.arrPadrones[objPad].Padron + '**' +
					gobjInfoMae.arrPadrones[objPad].Id2Bolson + '**' +
					gobjInfoMae.arrPadrones[objPad].Nombre + '**' +
					gobjInfoMae.arrPadrones[objPad].FExt + '**' +
					gobjInfoMae.arrPadrones[objPad].CodFicto + '**' +
					gobjInfoMae.arrPadrones[objPad].DescFicto + '**' +
					gobjInfoMae.arrPadrones[objPad].Lamina + '**' +
					gobjInfoMae.arrPadrones[objPad].Coord + '**' +
					gobjInfoMae.arrPadrones[objPad].IPF_mae + '**' +
					gobjInfoMae.arrPadrones[objPad].IVR_mae + '**' +
					gobjInfoMae.arrPadrones[objPad].Carpeta + '**' +
					gobjInfoMae.arrPadrones[objPad].StatusBusq +
					'\n';
	}
	alert(strDebug);
	*/
	//FIN_DEBUG

	// PARCHE (13/09/2001): intentar que las etiquetas sean las correctas (FuNcA!).
	// No me anime a solucionar esto en calculoIndProdTodosArr() porque es una .... &%$|@\& ....
	// NOTA: al generar el vec adefesio por el campo Id2, se etiqueta con el formato letra-depto.
	// NOTA (14/09/2001): al codigo de InfoMaestro.GenerarVecAdefesio se le agrego el caso particular
	//		de generar array por Padron teniendo en cuenta que se usaria como etiquetador. Se hizo ese
	//      parche para el caso de busqueda de dos o mas padrones en el mismo bolson y que la etiqueta
	//		resulte correcta. (Ej.: se etiqueta "3180 - 910" en el caso de que esos 2 padrones caigan
	//		en el mismo bolson.
	id2Arr = gobjInfoMae.GenerarVecAdefesio("Padron", id2Arr, boolEtiq);
	// FIN_PARCHE

	resultado[0] = deptoArr;
	resultado[1] = padronArr;
	resultado[2] = seccjudicArr;
	resultado[3] = indprodArr;
	resultado[4] = areaArr;
	resultado[5] = fextArr;
	resultado[6] = id2Arr;
	resultado[7] = envPolysArr;
	resultado[8] = totRegs;

	// MODIFICACION (18/09/2001): agregar un elemento extra al resultado: array con sup. catastrales.
	resultado[9] = arrSupCat;
	// FIN_MODIFICACION
	// MODIFICACION (19/11/2001): agregar un elemento extra al resultado: array con nombre de suelos CONEAT.
	resultado[10] = arrSueloConeat;
	// FIN_MODIFICACION
	// MODIF_NOTIF 24/6/2004: agregar 2 elementos extra al resultado: arrays con laminas y coords.
	resultado[11] = arrLamina;
	resultado[12] = arrCoord;
	// FIN_MODIF_NOTIF

	return resultado;
}


// calculo los indices de productividad y devuelvo un array con los datos prontos para
// desplegar en página
function calculoIndProdTodosArr(datos) {
	// LLAMADA EN: funcion resultQueryPadConeatForm()

	// FLA (28/11/2001): El nombre de esta funcion es enganioso. No solo se calculan los indices
	//		de productividad (como lo indica su nombre) sino que ... (!)... tambien se preparan
	//		los arrays con datos auxiliares para cada padron!! Ej: letra depto, nombre depto, sec judic, etc.


	// FLA (12/09/2001) descifrando se interpreta que:
	// PARAMETRO datos - es el extranio array de arrays resultado[] retorno de obtengoDatos().
	// Los arrays locales a esta funcion se cargan de la siguiente manera:
	//
	// deptoArr       = datos[0] - codigos de depto.
	// padronArr      = datos[1] - numeros de padron.
	// seccjudicArr   = datos[2] - secciones judiciales.
	// indprodArr     = datos[3] - indices de productividad.
	// areaArr        = datos[4] - areas de los poligonos.
	// fextArr        = datos[5] - factor extrinseco.
	// id2Arr         = datos[6] - codigos id2 (letra-padron)
	// envPolysArr    = datos[7] - extents de los poligonos.
	// totRegs        = datos[8] - total de registros (poligonos) retornados en la consulta.
	// arrSupCat      = datos[9] - superficies catastrales del maestro.
	// arrSueloConeat = datos[10] - nombres de los suelos CONEAT. (AGREGADO: 19/11/2001).
	// arrLamina      = datos[11] - laminas.     (AGREGADO: 24/6/2004).
	// arrCoord       = datos[12] - coordenadas. (AGREGADO: 24/6/2004).


	var mp = parent.MapFrame;

	var totRegs = datos[8];
	var deptoArr = new Array(totRegs);
	var padronArr = new Array(totRegs);
	var seccjudicArr = new Array(totRegs);
	var indprodArr = new Array(totRegs);
	var areaArr = new Array(totRegs);
	var fextArr = new Array(totRegs);
	var id2Arr = new Array(totRegs);
	var envPolysArr = new Array(totRegs);

	// MODIFICACION (18/09/2001): array con las superficies catastrales tomadas de CONEATMAESTRO.
	var arrSupCat = new Array(totRegs);
	arrSupCat = datos[9];  // Ver comentarios al principio de la funcion para deducir
						   // los numeros magicos de indices de array.
	// FIN_MODIFICACION
	// MODIFICACION (19/11/2001); array con los nombres de suelos.
	var arrSueloConeat = new Array(totRegs);
	arrSueloConeat = datos[10]; // Ver comentarios al principio de la funcion para deducir
								// los numeros magicos de indices de array.
	// FIN_MODIFICACION
	// MODIF_NOTIF 24/6/2004; arrays con las laminas y las coords.
	var arrLamina = new Array(totRegs);
	arrLamina = datos[11];
	var arrCoord = new Array(totRegs);
	arrCoord = datos[12];
	// FIN_MODIF_NOTIF


	deptoArr = datos[0];
	padronArr = datos[1];
	seccjudicArr = datos[2];
	indprodArr = datos[3];
	areaArr = datos[4];
	fextArr = datos[5];
	id2Arr = datos[6];
	envPolysArr = datos[7];

	// FLA (19/11/2001) Reinicializar objeto PorcentajeSuelos.
	//		gobjPorcSue - mantiene las correspondencias padron-suelo-porcentaje-indprod (del suelo).
	mp.gobjPorcSue.VaciarObjeto();

	// MODIFICACION (23/11/2001): cargar elementos a gobjPorcSue.
	for (var i = 0; i < padronArr.length; i++) {
		var arrNumPad = new Array();

		// Nota: GenerarArrayPorSeparador es un parche para contemplar padrones que caen en el mismo bolson.
		arrNumPad = GenerarArrayPorSeparador(padronArr[i], '<BR>');

		for (var x = 0; x < arrNumPad.length; x++) {
			// Uso del metodo: PorcentajesSuelos.NuevoElem(strPadron, strSC, nArea, nIndProd)
			mp.gobjPorcSue.NuevoElem(arrNumPad[x], arrSueloConeat[i], areaArr[i], indprodArr[i]);
		}
	}
	// FIN_MODIFICACION

	//DEBUG
	//alert('funcion calculoIndProdTodosArr - padronArr[]\n' + padronArr.toString() + '\n\nfuncion calculoIndProdTodosArr - areaArr[]\n' + areaArr.toString() + '\n\nfuncion calculoIndProdTodosArr - indprodArr[]\n' + indprodArr.toString());
	//FIN_DEBUG

	var i;

	var regArea = new Array();
	var regAreaTot = new Array();
	var id2 = "";
	var start, end;
	var indicePad = 0;
	var indicePadFind = 0;
	var regFext = new Array();
	var resultado = new Array(3);
	var regDeptoArr  = new Array();
	var regPadronArr  = new Array();
	var regSeccJudicArr  = new Array();
	var regIndProdArr  = new Array();
	var regNombreDeptoArr  = new Array();
	// MODIFICACION (18/09/2001): incluir sup. cat. en el reporte.
	// Se sigue imitando el codigo ya hecho.
	var regSupCatArr = new Array();
	// FIN_MODIFICACION.
	// MODIF_NOTIF 24/6/2004: incluir lamina y coord en el reporte.
	var regLaminaArr = new Array();
	var regCoordArr = new Array();
	// FIN_MODIF_NOTIF.


	var regEnv = new Array();
	var env = new Array(4);
	var envaux = new Array(4);

	// MODIFICACION (18/09/2001): se incluye la superficie catastral (arrSupCat) en el reporte.

	// NOTAS: arrays regXxxxArr  - arrays paralelos, se inician vacios.
	// - Se recorren los arrays (paralelos) xxxxArr hasta totRegs (cant. de poligonos encontrados en CATCON).
	// - Se van dando altas en los regXxxxArr con info por padron.
	// - Cuando un padron esta dado de alta y se encuentra mas info en los xxxxArr, solo se recalcula
	//   el indice de produc. segun la info del poligono nuevo.
	// - El indice de los regXxxxArr es indicePad (max. indicePad = total de padrones distintos).

	// depto, padron,  secc. judic, indice de prod total del padron, id2, nombre del departamento


	// SOLUCION BUG 1: reinicializar regId2. (ver comentarios en la declaracion de las globales).
	regId2.length = 0;
	//DEBUG
	//alert('BUSCANDO BUG 1. Funcion calculoIndProdTodosArr(). luego del delete...\nregId2 = \n' + regId2.toString());
	//FIN_DEBUG

	for (i = 0; i < totRegs; i++) {
		id2 = id2Arr[i];
		indicePadFind = findElementArr(regId2, id2);

		if (indicePadFind == -1) {
			// agrego ese elemento porque no existe
			regDeptoArr[indicePad] = deptoArr[i];
			regPadronArr[indicePad] = padronArr[i];
			regSeccJudicArr[indicePad] = seccjudicArr[i];
			regIndProdArr[indicePad] = indprodArr[i];

			// MODIFICACION (18/09/2001): incluir sup. cat. en el reporte.
			// Se sigue imitando el codigo ya hecho.
			regSupCatArr[indicePad] = arrSupCat[i];
			// FIN_MODIFICACION

			// MODIF_NOTIF 24/6/2004: incluir lamina y coord en el reporte.
			// Se sigue imitando el codigo ya hecho.
			regLaminaArr[indicePad] = arrLamina[i];
			regCoordArr[indicePad] = arrCoord[i];
			// FIN_MODIF_NOTIF

			// obtengo el nombre del departamento
			//FLA 6/8/2001:
			// BUG: buscando padrones "R-nnnn" (Tacuarembo) caia en el primer "R" (mayuscula)
			//      y el indexOf caia en "R"ocha. Conclusion: extraia "cha" como nombre de depto.
			//ORIGINAL
			//start = mp.deptoStr.indexOf(deptoArr[i],0);
			//end = mp.deptoStr.indexOf(";",start);
			//regNombreDeptoArr[indicePad] = mp.deptoStr.substring(start + 2, end);

			//SOLUCION BUG: 1 - var deptoStr = ";A-Canelones;etc...etc" (se incluyo ";" al inicio del string).
			//              2 - start = busqueda de indexOf hacer con el substring ";X".
			//              3 - end = obtener posicion del proximo ";".
			//              4 - mp.deptoStr.substring(start + 2, end);
			start = mp.deptoStr.indexOf(";" + deptoArr[i], 0);
			end = mp.deptoStr.indexOf(";", ++start);
			regNombreDeptoArr[indicePad] = mp.deptoStr.substring(start + 2, end);
			//FIN SOLUCION BUG.

			regArea[indicePad] = areaArr[i] * indprodArr[i];
			regAreaTot[indicePad] = 1 * areaArr[i];

			mp.regId2[indicePad] = id2;

			regFext[indicePad] = fextArr[i];
			regEnv[indicePad] = envPolysArr[i];
			indicePad++;
		} else {
			regArea[indicePadFind] += areaArr[i] * indprodArr[i];
			regAreaTot[indicePadFind] += 1 * areaArr[i];
			env = regEnv[indicePadFind];
			envaux = envPolysArr[i];

			env[0] = Math.min(env[0],envaux[0]);
			env[1] = Math.min(env[1],envaux[1]);	// BUG 1 * SOLUCIONADO *: se obtenia un NaN (ver datos_prueba.txt).
			env[2] = Math.max(env[2],envaux[2]);
			env[3] = Math.max(env[3],envaux[3]);
			regEnv[indicePadFind] = env;
		}
	}

	// hago el calculo final del indice de productividad

	i = 0;
	// ORIGINAL
	//var datosIndProd = regDeptoArr[i] + "," + regPadronArr[i] + "," + regSeccJudicArr[i]; // DESACTIVADO
	// MODIFICACION (18/09/2001): incluir sup. cat. (luego de sec. jud.) en el reporte.
	// MODIF_NOTIF 24/6/2004: incluir lamina y coord p/ notificacion.
	var datosIndProd = regDeptoArr[i] + "," + regPadronArr[i] + "," + regSeccJudicArr[i] +
					   "," + regSupCatArr[i] + "," + regLaminaArr[i] + "," + regCoordArr[i];
	// FIN_MODIFICACION

	regIndProdArr[i] = parseInt(regArea[i] / regAreaTot[i]);
	// BUG (6/12/2001): parseInt se queda con la parte entera y NO redondea.
	// ORIGINAL
	//regIndProdArr[i] = parseInt(regIndProdArr[i] * (( regFext[i] / 100 ) + 1 ));  // ELIMINADO.
	// SOLUCION (6/12/2001).

	regIndProdArr[i] = Math.round(regIndProdArr[i] * (( regFext[i] / 100 ) + 1 ));

	// MODIFICACION 8/4/2002: calcular indice de productividad final (correctamente).
	//       Se deshecha regIndProdArr y el calculo de ind. prod. original.

	// Nota: GenerarArrayPorSeparador es un parche para contemplar padrones que caen en el mismo bolson.
	var nIPF = mp.gobjPorcSue.CalcularIPF(GenerarArrayPorSeparador(regPadronArr[i], '<BR>')[0], regFext[i]);

	//DEBUG
	//alert("regPadronArr[i] = " + regPadronArr[i]);
	//alert("GenerarArrayPorSeparador(regPadronArr[i], '<BR>')[0] = " + GenerarArrayPorSeparador(regPadronArr[i], '<BR>')[0]);
	//alert("i = " + i + "\nstrPadron = " + strPadron + "\nregFext[i] = " + regFext[i] + "\nnIPF = " + nIPF);
	//FIN_DEBUG

	datosIndProd += "," + nIPF + "," + mp.regId2[i] + "," + regNombreDeptoArr[i];
	// FIN_MODIFICACION

	// ELIMINADO 8/4/2002: ver comentario MODIFICACION anterior.
	//datosIndProd += ","+regIndProdArr[i] + "," + mp.regId2[i] + "," + regNombreDeptoArr[i];

	for (i = 1; i < indicePad; i++) {
		//datosIndProd += "," + regDeptoArr[i] + "," + regPadronArr[i] + "," + regSeccJudicArr[i]; // DESACTIVADO
		// MODIFICACION (18/09/2001): incluir sup. cat.
		// MODIF_NOTIF 24/6/2004: incluir lamina y coord para notificaciones.
		datosIndProd += "," + regDeptoArr[i] + "," + regPadronArr[i] + "," + regSeccJudicArr[i] +
					    "," + regSupCatArr[i] + "," + regLaminaArr[i] + "," + regCoordArr[i];
		// FIN_MODIF

		regIndProdArr[i] = parseInt(regArea[i] / regAreaTot[i]);
		// BUG (6/12/2001): parseInt se queda con la parte entera y NO redondea.
		// ORIGINAL
		//regIndProdArr[i] = parseInt(regIndProdArr[i]  * ( ( regFext[i] / 100 ) + 1 ));   // ELIMINADO.
		// SOLUCION (6/12/2001).
		regIndProdArr[i] = Math.round(regIndProdArr[i]  * ( ( regFext[i] / 100 ) + 1 ));

		// MODIFICACION 8/4/2002: calcular indice de productividad final (correctamente).
		//       Se deshecha regIndProdArr y el calculo de ind. prod. original.
		var nIPF = mp.gobjPorcSue.CalcularIPF(GenerarArrayPorSeparador(regPadronArr[i], '<BR>')[0], regFext[i]);
		datosIndProd += "," + nIPF + "," + mp.regId2[i] + "," + regNombreDeptoArr[i];
		// FIN_MODIFICACION

		//DEBUG
		//alert("regPadronArr[i] = " + regPadronArr[i]);
		//alert("GenerarArrayPorSeparador(regPadronArr[i], '<BR>')[0] = " + GenerarArrayPorSeparador(regPadronArr[i], '<BR>')[0]);
		//FIN_DEBUG

		// ELIMINADO 8/4/2002: ver comentario MODIFICACION anterior.
		//datosIndProd += "," + regIndProdArr[i] + "," + mp.regId2[i] + "," + regNombreDeptoArr[i];
	}
	//DEBUG
	//alert("datosIndProd =\n" + datosIndProd);
	//FIN_DEBUG

	resultado[0] = indicePad;		// NOTA: total de padrones distintos (!).
	resultado[1] = datosIndProd;	// NOTA: string extranio con los datos separados por comas.
	resultado[2] = regEnv;			// NOTA: extent total calculado para cada padron.

	return resultado;
}


// buscar un elto en un array y devolver su ubicación o índice, devuelve -1 si no está
function findElementArr(datoArr, dato) {
	var i = 0;
	var indice = -1;
	if (datoArr.length > 0) {
		while (i<datoArr.length && indice == -1) {
			if (datoArr[i] == dato) {
				indice = i;
			}
			i++;
		}
	}

	return indice;
}

// ETIQUETAR PADRONES.
// agrego los textos sobre cada poligono de padron
function makeXMLTextPad() {
	// usa las siguientes variables globales:
	// envPadConeat, coordPadConeat, totPolys, envPolysPadConeat

	// OJO (13/09/2001): usa otras globales que no se mencionaron,  por ej: regId2[], mp.totPads...
	//					 ... el resto de las globales usadas queda como ejercicio.

	var mp = parent.MapFrame;
	var pWidth, pHeight, pminx, pminy, txtX, txtY;
	var env = new Array(4);

	var textPolyXML = "";

	// agrego cabezal de polyXML
	textPolyXML += '<LAYER type="acetate" name="textpolys">\n';
	var j = 0;
	var z = 0;

	for (var i = 0; i < mp.totPads; i++ ) {
		// determino las coordenas del texto, cruce de diagonales del envelope
		// del poligono
		env = mp.envPads[i];
		pWidth = env[2] - env[0];
		pHeight = env[3] - env[1];
		pminx = env[0];
		pminy = env[1];
		z += 4;
		txtX = pminx + (pWidth/2);

		// PARCHE 21/8/2003: subir unos 200 algo? las etiquetas para solapar con el nombre del depto.
		//txtY = pminy + (pHeight/2);
		txtY = pminy + (pHeight/2) - 200;   //PARCHE.

		textPolyXML += '<OBJECT units="DATABASE">\n';
		textPolyXML += '<TEXT coord="' + txtX + ' ' + txtY + '" label="' + mp.regId2[i] + '">\n';
		textPolyXML += '      <TEXTMARKERSYMBOL font="Arial" halignment="center" valignment="center"/>\n</TEXT>\n';
		textPolyXML += '</OBJECT>\n';
		j += 3;
	}

	// agrego fin de polyXML
	textPolyXML += '</LAYER>';

	return textPolyXML;
}

// creo la parte LAYER del acetato con los poligonos seleccionados, devuelve un string XML con las instrucciones
function makeXMLLayerAcetatePoly(tipoColor, colorRelleno, transparency, bdryColor, bdryWidth) {
	// FLA NOTA 10/7/2002: se invoca para crear el croquis principal (colores) y
	//					   para el croquis de ubicacion.

	// FLA_MODIF 25/9/2003: cambio en valores y finalidad de parametro tipoColor.
	//     Valores: "viewer" - para desplegar en el MapFrame, colores pero transparente para
	//						   visualizar la capa de relieve del terreno.
	//				"croquis" - para la pagina del croquis, colores pero opacos de modo que
	//							coincidan con la leyenda.
	//				"ubicacion" - gris oscuro pero transparente para poder ver la capa de
	//							  relieve del terreno.

	// usa las siguientes variables globales:
	// envPadConeat, coordPadConeat, totPolys
	var mp = parent.MapFrame;

	var polyXML = "";

	// FLA_MODIF 10/7/2002: color gris.
	//var strGris = "160,160,160";   // TEST 16/9/2003: Cuando esta el DEM no se ven los polis.
	var strGris = "120,120,120";
	var strTransparencia = 1.0;  // no transparente por defecto (se cambia segun el caso).

	// agrego cabezal de polyXML
	polyXML += '<LAYER type="acetate" name="poligonos">\n';

	// var colorRelleno = "255,130,170";
	for (var i=0; i<mp.totPolys; i++) {
		// especififo el poligono en formato XML
		if ((tipoColor == "viewer") || (tipoColor == "croquis")) {
			colorRelleno = getColorSC(i);

			// bdryColor = colorRelleno;

			if (tipoColor == "viewer") {
				strTransparencia = 0.4;
			} else {
				// tipoColor == "croquis"... opaco.
				strTransparencia = 1.0;
			}

			polyXML += makePolyXMLStr(mp.coordPadConeat[i], colorRelleno, strTransparencia, bdryColor, bdryWidth);

		// FLA_MODIF 25/9/2003: tipoColor = 'ubicacion' cuando se hace el croquis de ubicacion.
		//      Los colores de relleno y del borde se ponen a gris oscuro transparente para lograr una
		//						apariencia mas solida y permitir ver el modelo de relieve.
		} else if (tipoColor == "ubicacion") {
			strTransparencia = 0.7;

			polyXML += makePolyXMLStr(mp.coordPadConeat[i], strGris, strTransparencia, strGris, bdryWidth);
		}
	}

	// agrego fin de polyXML
	polyXML += '</LAYER>';

	// agrego las leyendas
	// polyXML += '\n'+ makeXMLTextPad();

	return polyXML;
}


// obtiene el color correspondiente al poligono segun SC
function getColorSC(i) {
	// LLAMADA EN: makeXMLLayerAcetatePoly()
	var mp = parent.MapFrame;

	var sc = mp.scPadConeat[i];

	/* DESACTIVADO
	var start = scColorIndex.indexOf(sc,0);
	start = scColorIndex.indexOf(";",start);
	var end = scColorIndex.indexOf(";",start + 1);

	var colorRelleno = scColorIndex.substring(start + 1, end);

	return colorRelleno;
	FIN_DESACTIVADO */

	return mp.gobjColores.ColorDeSuelo(sc);
}


// creo el acetato con los poligonos seleccionados, devuelve un string XML con las instrucciones
function makeXMLAcetatePoly(tipoColor, colorRelleno, transparency, bdryColor, bdryWidth) {
	// usa las siguientes variables globales:
	// envPadConeat, coordPadConeat, totPolys
	var mp = parent.MapFrame;

	var polyXML = "";
	//-var i;

	// seteo el nuevo extent del mapa
	mp.setExtent(mp.envPadConeat[0], mp.envPadConeat[3], mp.envPadConeat[2], mp.envPadConeat[1]);
	// agrego cabezal de polyXML
	polyXML = '<?xml version="1.0" encoding="UTF-8"?><ARCXML version="1.1">\n<REQUEST>\n<GET_IMAGE>\n<PROPERTIES>\n';
	polyXML += '<ENVELOPE maxx="' + mp.envPadConeat[2] + '" maxy="' + mp.envPadConeat[3] + '" minx="' + mp.envPadConeat[0] + '" miny="' + mp.envPadConeat[1] + '" />\n';
	polyXML += '<OUTPUT type="'+ mp.tipoImg +'" />\n';
	polyXML += '<IMAGESIZE height="' + iHeight + '" width="' + iWidth + '" />\n';
	polyXML += '</PROPERTIES>\n';

	polyXML += makeXMLLayerAcetatePoly(tipoColor, colorRelleno, transparency, bdryColor, bdryWidth);

	// agrego las leyendas
	polyXML += '\n'+ makeXMLTextPad();

	// pongo el norte y el copyright
	// FLA_MODIF 21/8/2003: se agrega un texto con la direc de la aplic en writeNorteXMLPadConeat().
	polyXML += '\n'+ writeNorteXMLPadConeat() +'\n';

	// la escala
	polyXML += writeScaleBarXMLPadConeat() + '\n</GET_IMAGE>\n</REQUEST>\n</ARCXML>';

	return polyXML;
}


// hace el poligono en formato XML
function makePolyXMLStr(poly, colorRelleno, transparency, bdryColor, bdryWidth) {
	var strPolyXML = "";

	// agrego cabezal para el poligono
	// ERROR (22/1/2002): units=database | pixel
	//strPolyXML = '<OBJECT units="featureclass">\n<POLYGON coords="';
	strPolyXML = '<OBJECT units="database">\n<POLYGON coords="';

	// agrego las coordenadas
	strPolyXML += poly;

	// agrego el final del poligono
	//ORIGINAL
	//strPolyXML += '">\n<SIMPLEPOLYGONSYMBOL fillcolor="'+colorRelleno+'" filltransparency="'+transparency +
	//			  '" boundary="true" boundarytype="solid" boundarycolor="' + bdryColor + '" boundarywidth="' +
	//			  bdryWidth+'"/>\n</POLYGON>\n</OBJECT>\n';

	//TEST (22/1/2002): buscando solucion al bug que no muestra los holes en acetatos ya que no se permiten rings.
	// 1- Se agrega atributo 'transparency=1.0' a ver si se pueden visualizar las islas.

	// PROBANDO alterando la transparencia para solucionar el bug.
	strPolyXML += '">\n<SIMPLEPOLYGONSYMBOL antialiasing="true" fillcolor="'+ colorRelleno +'" filltransparency="' + transparency +
				  '" boundary="true" boundarytype="solid" boundarycolor="' + bdryColor + '" boundarywidth="' +
				  bdryWidth+'" filltype="solid" overlap="true"/>\n</POLYGON>\n</OBJECT>\n';

	return strPolyXML;
}

// obtengo las coordenas de todos los poligonos seleccionados
// devuelve un array donde cada elto del mismo es un poligono entero del
// tipo string con "," como separadores

function getCoordPadConeat(replyStr) {
	var start = 0;
	var end, i;
	var totPolys = justGetFeatureCount(replyStr);
	var poly="";
	var coordPadConeat = new Array();

	start = replyStr.indexOf('<POLYGON>', 0);
	start = replyStr.indexOf('<COORDS>', start) + 8;
	end = replyStr.indexOf("</COORDS>",start);

	i = 0;
	while (start > -1 && end > -1) {
		// BUG 28/12/2001: Caso padrones 'chorreados' luego de generar el ultimo CATCON a esta fecha.
		//	Con end-1 se comia el ultimo digito de la ultima coord Y.
		//poly = replyStr.substring(start,end-1);
		// SOLUCION BUG 28/12/2001.
		poly = replyStr.substring(start, end);

		coordPadConeat[i] = poly;
		start = replyStr.indexOf('</POLYGON>', end) + 10;
		start = replyStr.indexOf('<POLYGON>', start);
		if (start > -1) {
			start = replyStr.indexOf('<COORDS>', start) + 8;
			end = replyStr.indexOf("</COORDS>",start);
		}
		i++;
	}

	return coordPadConeat;
}


// obtiene el envelope minimo que incluye a todos los poligonos seleccionados
function getEnvelopePadConeat(replyStr) {
	var start = 0;
	var end, i;
	var env = new Array(4);
	var totPolys = justGetFeatureCount(replyStr);
	var resultado = new Array();
	var envPolys = new Array();

	// en envPadConeat guardo los minx, miny, maxx, maxy en ese orden, que va a
	// retornar la función como limites absolutos
	var envPadMin = getEnvelopeXYs(replyStr,start);
	envPolys[0] = envPadMin;


	start = 0;
	start = replyStr.indexOf('<ENVELOPE', start) + 9;
	start = replyStr.indexOf('/>', start) + 2;

	for (i=0; i<totPolys-1; i++) {
		env = getEnvelopeXYs(replyStr,start);
		envPolys[i] = env;
		envPadMin[0] = Math.min(env[0],envPadMin[0]);
		envPadMin[1] = Math.min(env[1],envPadMin[1]);
		envPadMin[2] = Math.max(env[2],envPadMin[2]);
		envPadMin[3] = Math.max(env[3],envPadMin[3]);
		start = replyStr.indexOf('<ENVELOPE', start) + 9;
		start = replyStr.indexOf('/>', start) + 2;
	}

	// genero un envelope 5% más grande
	var factorEnv = 0.05;
	var mWidth = envPadMin[2] - envPadMin[0];
	var mHeight = envPadMin[3] - envPadMin[1];
	envPadMin[0] -= (factorEnv * mWidth);
	envPadMin[2] += (factorEnv * mWidth);
	envPadMin[1] -= (factorEnv * mHeight);
	envPadMin[3] += (factorEnv * mHeight);

	resultado[0] = envPadMin;
	resultado[1] = envPolys;
	return resultado;
}


// despliega en el TextForm el form de crear pagina coneat para imprimir
function crearPagConeatForm() {
	var mp = parent.MapFrame;

	//DEBUG: acceder al objeto gobjInfoMae.
	//alert('crearPagConeatForm()\nparent.MapFrame.gobjInfoMae.tot_elem = ' + parent.MapFrame.gobjInfoMae.tot_elem);
	//alert('crearPagConeatForm()\nparent.MapFrame.gobjInfoMae.arrPadrones.arrPadrones[0].Padron = ' + parent.MapFrame.gobjInfoMae.arrPadrones[0].Padron);
	//alert('crearPagConeatForm()\nparent.MapFrame.gobjInfoMae.arrPadrones.arrPadrones.length = ' + parent.MapFrame.gobjInfoMae.arrPadrones.length);
	//alert('crearPagConeatForm()\nparent.MapFrame.gobjInfoMae.Cant() = ' + parent.MapFrame.gobjInfoMae.Cant());
	//FIN_DEBUG

	if (useTextFrame) {
		parent.TextButtonFrame.document.location= appDir + "crearPagConeatImpr.htm";
	} else {
		Win1 = open(appDir + "crearPagConeatImp.htm","QueryWindow","width=575,height=150,scrollbars=yes,resizable=yes");
	}
}


// va a crear la pagina de impresion
function crearPaginaConeatImp() {
	// usa las siguientes variables globales:
	// envPadConeat, id2PadConeat, scPadConeat, coordPadConeat, regPadConeat
	// URL de la leyenda, URL del mapa, URL del Mapa OV, imagen del logo
	// datos de la leyenda asociada al campo SC para pintar los poligonos de suelo
	//alert ("crear pagina coneat imp");
	var mp = parent.MapFrame;
	var blankMapXML = makeBlankMapXMLConeat();
	//- alert("blankMapXML:"+blankMapXML+" imsURL:"+ mp.imsURL);

	//OJO_DEBUG
	//_DebugWin('antes de crear pagina de imprimir -- sendToServer ESTO ......: ' + blankMapXML);
	//FIN_DEBUG

	mp.sendToServer(mp.imsURL,blankMapXML,1004);

}


// CROQUIS DE IMPRESION: generar acetato.
// pido un mapa en blanco solamente con el acetato para la impresión
// retorna un string XML con la instrucción para mandar al servidor
// con el norte y la escala
function makeBlankMapXMLConeat() {
	var mp = parent.MapFrame;
	var blankMapXML = '<?xml version="1.0" encoding="UTF-8"?><ARCXML version="1.1">\n<REQUEST>\n<GET_IMAGE>\n<PROPERTIES>\n';

	// El envelope ya viene 5% más grande
	//var factorEnv = 0.05;
	//var mWidth = mp.envPadConeat[2] - mp.envPadConeat[0];
	//var mHeight = mp.envPadConeat[3] - mp.envPadConeat[1];
	//var minx = mp.envPadConeat[0] - (factorEnv * mWidth);
	//var maxx = mp.envPadConeat[2] + (factorEnv * mWidth);
	//var miny = mp.envPadConeat[1] - (factorEnv * mHeight);
	//var maxy = mp.envPadConeat[3] + (factorEnv * mHeight);

	blankMapXML += '<ENVELOPE minx="' + mp.envPadConeat[0] + '" miny="' + mp.envPadConeat[1] + '" maxx="' + mp.envPadConeat[2] + '" maxy="' + mp.envPadConeat[3] + '" />\n';
	blankMapXML += '<OUTPUT type="'+ mp.tipoImg +'" />\n';
	blankMapXML += '<IMAGESIZE height="' + mp.impMapiHeight + '" width="' + mp.impMapiWidth + '" />\n';

	// tell the server which layers are to be visible
	if (mp.aimsLayersPresent) {
		blankMapXML += '<LAYERLIST >\n';
		for (var i=0;i<mp.layerCount;i++) {
			blankMapXML += '<LAYERDEF name="' + mp.LayerName[i] + '" visible="false" />\n';
		}
		blankMapXML += '</LAYERLIST>\n';
	}
	blankMapXML += '</PROPERTIES>\n';
	blankMapXML += makeXMLLayerAcetatePoly("croquis","",1,"30,30,30",1) + '\n';

	// pongo los ids sobre los poligonos
	blankMapXML += makeXMLTextPad() + '\n';

	// el norte
	blankMapXML += writeNorteXMLPadConeat() +'\n';

	// la escala
	var mWidth = mp.envPadConeat[2] - mp.envPadConeat[0];
	blankMapXML += addScaleBar(mWidth, mp.impMapiWidth,mp.impMapiHeight) +'</GET_IMAGE>\n</REQUEST>\n</ARCXML>';
	return blankMapXML;

}



// crear y muestra la pagina coneat para imprimirse en una ventana aparte
function makeShowConeatPageImp1() {
	// usa las siguientes variables globales:
	// envPadConeat, id2PadConeat, scPadConeat, coordPadConeat, regPadConeat
	// URL de la leyenda, URL del mapa, URL del Mapa OV, imagen del logo
	// datos de la leyenda asociada al campo SC para pintar los poligonos de suelo
	//alert ("crear pagina coneat imp");

	var mp = parent.MapFrame;
	var OVMapXML = writeOVXMLPadConeat();
	//-alert("XML para el OV de impresion:"+OVMapXML);

	//OJO_DEBUG
	//_DebugWin('sendToServer CROQUIS DE UBICACION...................: ' + OVMapXML);
	//FIN_DEBUG

	mp.sendToServer(mp.imsURL,OVMapXML,1005);
}

function makeShowConeatPageImp2() {
	// usa las siguientes variables globales:
	// envPadConeat, id2PadConeat, scPadConeat, coordPadConeat, regPadConeat
	// URL de la leyenda, URL del mapa, URL del Mapa OV, imagen del logo
	// datos de la leyenda asociada al campo SC para pintar los poligonos de suelo

	var mp = parent.MapFrame;

	// apago todos los layers y solo dejo prendido el catcon

	var legendMapXML = writeLegendXMLPadConeat();

	//DEBUG
	//alert("XML para la leyenda de impresion:" + legendMapXML);
	//FIN_DEBUG
	mp.sendToServer(mp.imsURL,legendMapXML,1006);
}


// contruyo el XML string para el scalebar
function writeScaleBarXMLPadConeat() {
	var imsScaleBarImpXML ="";
	var mp = parent.MapFrame;

	// la escala
	imsScaleBarImpXML += '<LAYER type="ACETATE" name="theScaleBar">\n';
	imsScaleBarImpXML += '<OBJECT units="PIXEL">\n';
	imsScaleBarImpXML += '<SCALEBAR coords="' + parseInt(mp.iWidth * 0.60) + ' 2" outline="' + mp.ScaleBarBackColor + '" ';
	imsScaleBarImpXML += 'font="' + mp.ScaleBarFont + '" fontcolor="' + mp.ScaleBarFontColor + '" style="' + mp.ScaleBarStyle + '" barcolor="' + mp.ScaleBarColor + '" ';

	imsScaleBarImpXML += 'mapunits="' + mp.MapUnits + '" ';

	imsScaleBarImpXML += 'scaleunits="' + mp.ScaleBarUnits + '" antialiasing="True" ';
	var sDistance = getScaleBarDistancePR();
	if (sDistance<1) theString += 'precision="' + ScaleBarPrecision + '" ';

	imsScaleBarImpXML += 'distance="' + sDistance + '" ';
	imsScaleBarImpXML += 'fontsize="' + mp.ScaleBarSize + '" fontstyle="regular" barwidth="5" overlap="false"  />\n</OBJECT>\n';
	imsScaleBarImpXML += '</LAYER>';

	return imsScaleBarImpXML;
}

// genero el scalebar
function addScaleBar(mapWidth, imgWidth, imgHeight){
	var scaleBarXML ="";
	var x,y, largo;

	x = parseInt(0.6 * imgWidth);
	y = parseInt(0.02 * imgHeight);
	largo = parseInt( 600 / (mapWidth / imgWidth) );
	if ((largo > imgWidth/4)||(largo < imgWidth/10)) largo = parseInt(imgWidth/4);

	scaleBarXML = '<LAYER type="acetate" name="ScaleBar">\n';
	scaleBarXML += '<OBJECT units="pixel">\n';
	scaleBarXML += '<SCALEBAR coord="'+x+' '+y+'" antialiasing="true" barcolor="150,150,150" barwidth="5" mapunits="Meters" precision="2" scaleunits="kilometers" screenlength="'+largo+'" />\n';
	scaleBarXML += '</OBJECT>\n';
	scaleBarXML += '</LAYER>\n';

	return scaleBarXML;
}


// calculo del tamaño del scalebar
function getScaleBarDistancePR() {
	// get distance from left and right values in map units
	// convert to ScaleBar units then clip to ScaleBar size
	var mp = parent.MapFrame;
	var mUnits = mp.MapUnits;
	var mDistance = mp.eRight - mp.eLeft;
	var sbDistance = 0;
	if (mp.MapUnits=="DEGREES") {
		// if DEGREES then convert to feet
			// first get mid y point
		var midY = mp.eBottom + (mp.eTop-mp.eBottom)/2;
		var Lon1 = mp.eLeft * Math.PI / 180;
		var Lon2 = mp.eRight * Math.PI / 180;
		var Lat1 = midY * Math.PI / 180;
		var Lat2 = midY * Math.PI / 180;
		var LonDist = Math.abs(Lon1-Lon2);
		var LatDist = Math.abs(Lat1-Lat2);
		var A = Math.pow(Math.sin(LatDist / 2),2) + Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(LonDist /2),2);
		var C = 2 * Math.asin(Math.min(1, Math.sqrt(A)));
		var D = (3963 - 13 * Math.sin((Lat1 + Lat2) / 2)) * C
		mDistance = D * 5280;
		mUnits = "FEET";
	}
	if (mUnits != mp.ScaleBarUnits) {
		var theDist = mDistance
		mDistance = mp.convertUnits(theDist,mUnits,mp.ScaleBarUnits);
	}

	sbDistance = mDistance/5;
	// /*
	var num1 = 0;
	var num2 = sbDistance;
	if (sbDistance>10000000) {
		num1 = parseInt(sbDistance/5000000);
		num2 = num1 * 5000000;
	} else if (sbDistance>1000000) {
		num1 = parseInt(sbDistance/500000);
		num2 = num1 * 500000;
	} else if (sbDistance>100000) {
		num1 = parseInt(sbDistance/50000);
		num2 = num1 * 50000;
	} else if (sbDistance>10000) {
		num1 = parseInt(sbDistance/5000);
		num2 = num1 * 5000;
	} else if (sbDistance>1000) {
		num1 = parseInt(sbDistance/500);
		num2 = num1 * 500;
	} else if (sbDistance>100) {
		num1 = parseInt(sbDistance/50);
		num2 = num1 * 50;
	} else if (sbDistance>10) {
		num1 = parseInt(sbDistance/5);
		num2 = num1 * 5;
	} else if (sbDistance>1) {
		num1 = parseInt(sbDistance/0.25);
		num2 = num1 * 0.25;
	} else if (sbDistance>0.1) {
		num1 = parseInt(sbDistance/0.025);
		num2 = num1 * 0.025;
	}
	sbDistance = num2;
	// */
	if (sbDistance > 2) {
		mp.ScaleBarPrecision = "0";
	} else if (sbDistance > 1) {
		mp.ScaleBarPrecision = "1";
	} else if (sbDistance > 0.1) {
		mp.ScaleBarPrecision = "2";
	} else if (sbDistance > 0.01) {
		mp.ScaleBarPrecision = "3";
	} else {
		mp.ScaleBarPrecision = "4";
	}

	//alert(mDistance);
	return sbDistance;
}

// contruyo el XML string para solicitar el acetato del norte
// FLA_MODIF 21/8/2003: se agrega texto con la direc. de la aplic. (www.prenader.gub.uy/coneat).

function writeNorteXMLPadConeat() {
	var imsNorteImpXML ="";
	var mp = parent.MapFrame;

	imsNorteImpXML += '<LAYER type="ACETATE" name="theNorthArrow">\n';
	imsNorteImpXML += '<OBJECT units="PIXEL">\n<NORTHARROW type="3" size="' + mp.NorthArrowSize + '" coord="' + mp.NorthArrowCoords + '" shadow="32,32,32" ';
	imsNorteImpXML += 'angle="' + mp.NorthArrowAngle + '" antialiasing="True" overlap="False" />\n</OBJECT>\n';
	imsNorteImpXML += '</LAYER>';

	// FLA_MODIF 21/8/2003:
	var strDirecAplic = "www.prenader.gub.uy/coneat";

	var imsTextoDirec = '<LAYER type="acetate" name="TextoDirec" id="TextoDirec">\n';
	imsTextoDirec += '<OBJECT units="pixel">\n';
	imsTextoDirec += '<TEXT coords="4 4" label="' + strDirecAplic + '">\n';
	imsTextoDirec += '<TEXTMARKERSYMBOL fontstyle="regular" fontsize="14" font="Arial" />\n';
	imsTextoDirec += '</TEXT> </OBJECT> </LAYER>\n';
	// FIN_FLA_MODIF 21/8/2003.

	return imsNorteImpXML + imsTextoDirec;
}


// preparo el XML para solicitar la leyenda
function writeLegendXMLPadConeat() {
	var legendMApXML = "";
	var mp = parent.MapFrame;
	var legendMApXML = '<?xml version="1.0" encoding="UTF-8"?><ARCXML version="1.1">\n<REQUEST>\n<GET_IMAGE>\n';

	legendMApXML += '<PROPERTIES>\n';
	// FLA (16/8/2001): intentar filtrar la leyenda solo para los suelos de los padrones encontrados.
	//legendMApXML += '<LAYER type="featureclass" name="SDE.CATCON" visible="true">\n';
	//legendMApXML += '<DATASET fromlayer="SDE.CATCON" />\n';
	//legendMApXML += '<QUERY where="' + mp.gstrConsultaPads + '" />\n';
	//legendMApXML += '</LAYER>\n';
	// FLA_FIN

	legendMApXML += '<LEGEND title="Grupos de Suelo CONEAT" titlefontsize="10" font="Arial" autoextend="true" columns="2" width="160" height="110" cansplit="true" background="255,255,255" layerfontsize="8" valuefontsize="8"/>\n';
	legendMApXML += '<ENVELOPE minx="' + mp.envPadConeat[0] + '" miny="' + mp.envPadConeat[1] + '" maxx="' + mp.envPadConeat[2] + '" maxy="' + mp.envPadConeat[3] + '" />\n';
	legendMApXML += '<OUTPUT type="'+ mp.tipoImg +'" />\n';


	legendMApXML += '<IMAGESIZE height="' + mp.iHeight + '" width="' + mp.iWidth + '" />\n';

	//FLA_TEST: deshabilite esto para ver si funciona el filtro para mostrar legenda de los suelos que interesan.
	// tell the server which layers are to be visible
	if (mp.aimsLayersPresent) {
		legendMApXML += '<LAYERLIST >\n';
		for (var i=0;i<mp.layerCount;i++) {
			// solo muestro los rios y caminos por ahora
			if (mp.LayerName[i] == "SDE.CATCON") {
				// FLA (7/8/2001): original Pablo. Genera leyenda con todos los SC del layer.
				legendMApXML += '<LAYERDEF name="' + mp.LayerName[i] + '" visible="true" />\n';
				// FLA (7/8/2001): construir el LAYERDEF intentando filtrar para solo los suelos
				//                 de los padrones encontrados.
				// RESULTADO: por ahora no funca.
				//legendMApXML += '<LAYERDEF name="' + mp.LayerName[i] + '" visible="true" >\n';
				//legendMApXML += '	<QUERY where="' + mp.gstrConsultaPads + '" />\n';
				//legendMApXML += '</LAYERDEF>\n';
			}else{
				legendMApXML += '<LAYERDEF name="' + mp.LayerName[i] + '" visible="false" />\n';
			}
		}
		legendMApXML += '</LAYERLIST>\n';
	}
	//FLA_FINTEST

	legendMApXML += '</PROPERTIES>\n';
	legendMApXML += '</GET_IMAGE>\n</REQUEST>\n</ARCXML>';

	return legendMApXML;
}

// CROQUIS DE UBICACION.
// prepare the request in xml format for overview map for PadConeat
function writeOVXMLPadConeat() {
	var mp = parent.MapFrame;
	var OVMapXML= '<?xml version="1.0" encoding="UTF-8"?><ARCXML version="1.1">\n<REQUEST>\n<GET_IMAGE>\n<PROPERTIES>\n';

	// genero un envelope 200% más grande (2 veces más grande)
	var factorEnv = 0.0;  // FLA_MODIF 22/8/2003: cambie a 0% para que coincida con lo que sale en el mapframe.
	var mWidth = mp.envPadConeat[2] - mp.envPadConeat[0];
	var mHeight = mp.envPadConeat[3] - mp.envPadConeat[1];
	var minx = mp.envPadConeat[0] - (factorEnv * mWidth);
	var maxx = mp.envPadConeat[2] + (factorEnv * mWidth);
	var miny = mp.envPadConeat[1] - (factorEnv * mHeight);
	var maxy = mp.envPadConeat[3] + (factorEnv * mHeight);

	// OVMapXML += '<ENVELOPE minx="' + mp.envPadConeat[0] + '" miny="' + mp.envPadConeat[1] + '" maxx="' + mp.envPadConeat[2] + '" maxy="' + mp.envPadConeat[3] + '" />\n';
	OVMapXML += '<ENVELOPE minx="' + minx + '" miny="' + miny + '" maxx="' + maxx + '" maxy="' + maxy + '" />\n';
	OVMapXML += '<OUTPUT type="'+ mp.tipoImg +'" />\n';
	OVMapXML += '<IMAGESIZE height="' + mp.impOVMapiHeight + '" width="' + mp.impOVMapiWidth + '" />\n';

	// tell the server which layers are to be visible
	if (mp.aimsLayersPresent) {
		OVMapXML += '<LAYERLIST >\n';     // FLA_MODIF 22/8/2003:
		//OVMapXML += '<LAYERLIST dynamicfirst="true">\n'; // FLA_TEST: 16/9/2003. ojo que con el dem no se ve el acetato de polis.

		for (var i=0;i<mp.layerCount;i++) {
			// solo muestro los rios y caminos por ahora
			// FLA_MODIF 21/8/2003: ... y limites departamentales y demas cartografia basica.
			if (mp.LayerName[i] == "Hidrografia" || mp.LayerName[i] == "Modelo de Relieve" || mp.LayerName[i] == "Lagunas" || mp.LayerName[i] == "Caminos" || mp.LayerName[i] == "Capitales" || mp.LayerName[i] == "Cerros" || mp.LayerName[i] == "Poblados" || mp.LayerName[i] == "Rutas Principales" || mp.LayerName[i] == "Rutas Secundarias" || mp.LayerName[i] == "Departamentos") {
				OVMapXML += '<LAYERDEF name="' + mp.LayerName[i] + '" visible="true" />\n';
			}else{
				OVMapXML += '<LAYERDEF name="' + mp.LayerName[i] + '" visible="false" />\n';
			}
		}
		OVMapXML += '</LAYERLIST>\n';
	}
	OVMapXML += '</PROPERTIES>\n';

	// creo el acetato con los poligonos y los pinto de color fijo

	//FLA_MODIF 10/7/2002: parametro nuevo con valor "ubicacion" para el croquis de ubicacion.
	OVMapXML += makeXMLLayerAcetatePoly("ubicacion","200,150,100",1.0,"0,0,0",1);
	OVMapXML += '\n</GET_IMAGE>\n</REQUEST>\n</ARCXML>';

	return OVMapXML
}


// finalmente crear y muestra la pagina coneat para imprimirse en una ventana aparte
function finCreateConeatPageImp(regsStr, totRegs) {
	// usa las siguientes variables globales:
	// envPadConeat, id2PadConeat, scPadConeat, coordPadConeat, regPadConeat
	// URL de la leyenda, URL del mapa, URL del Mapa OV, imagen del logo
	// datos de la leyenda asociada al campo SC para pintar los poligonos de suelo

	// FLA (19/11/2001):
	// AGREGADO: Se abre un segundo browser con el detalle de los porcentajes de suelos por padron.
	// FLA (27/11/2001): PARAMETRO totRegs NO SE USA.

	var mp = parent.MapFrame;
	var regs = new Array();

	var tabW = mp.impMapiWidth + mp.impOVMapiWidth;
	var tabH = mp.impMapiHeight;
	var relMap = mp.impMapiWidth/mp.impMapiHeight;
	var ovIMapW = 210;
	var ovIMapH = ovIMapW / relMap;
	var nombreDepto="";
	var oviHeight = mp.impOVMapiHeight + 50;

	//OJO_DEBUG: activar el DEBUG siguiente.
	//var strAntes = regsStr;
	//FIN_DEBUG

	// MODIFICACION (29/11/2001): modificar regsStr de modo de reflejar los casos segun StatusBusq
	// en gobjInfoMae para que en el reporte final se reflejen los casos excepcionales de busqueda.
	regsStr = IncluirStatusBusq(regsStr, mp.gobjInfoMae, mp.gobjPorcSue);

	//OJO_DEBUG: activar el DEBUG anterior.
	/*
	alert('Funcion mostrarDataPadConeatStr(regsStr, totRegs)\n\nregsStr ORIGINAL=\n' + strAntes +
		  '\n\nLUEGO DE REFORMATEAR regsStr =\n' + regsStr +
		  '\n\ngobjInfoMae.Cant() =' + mp.gobjInfoMae.Cant());
	*/
	//FIN_DEBUG

	// creamos la pagina ya!!!!
	var Win1 = open("","PrintPage", "toolbar=no,status=yes,locationbar=no,resizable=yes,menubar=yes,scrollbars=yes");
	//Win1.document.open();
	Win1.document.writeln('<html>');

	// MODIFICACION (25/10/2001): colocar titulo en la barra de titulo del IE.
	Win1.document.writeln('<TITLE>Croquis de suelos CONEAT</TITLE>');
	// FIN_MODIFICACION

	Win1.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
	Win1.document.writeln('<FONT FACE="Arial"><B>');
	Win1.document.writeln('<table border="0" width="' + tabW +'" height="' + tabH +'" cellspacing="5" cellpadding="0" NOWRAP>');

	// titulo e imagen del mapa principal
	Win1.document.writeln('<tr>');
    Win1.document.writeln('<td width="'+mp.impMapiWidth+'" rowspan="3" height="'+mp.impMapiHeight+'" valign="top" align="left">');
    Win1.document.writeln('<b>CROQUIS DE GRUPOS DE SUELOS CONEAT</b>');
    Win1.document.writeln('<br>');
    Win1.document.writeln('<img border="1" alt="Croquis CONEAT" src="' + mp.imsMapImpURLPR +'" width="' + mp.impMapiWidth + '" height="'+ mp.impMapiHeight +'">');

    // AGREGADO 3/12/2001: Incluir significado de la simbologia de los status de busqueda.
    Win1.document.writeln('<BR>');
	MostrarSimbologiaStatusBusq(Win1, mp.gobjInfoMae);
	// FIN_AGREGADO
    Win1.document.writeln('</td>');

	// mapa OV
    Win1.document.writeln('<td align="left" colspan="2" width="'+mp.impOVMapiWidth+'" height="' + mp.impOVMapiHeight + '" valign="top">');
    Win1.document.writeln('<FONT FACE="Arial" SIZE="-2"><b>CROQUIS DE UBICACION</b></FONT>');
    Win1.document.writeln('<br>');
    Win1.document.writeln('<img border="1" alt="Mapa de ubicacion" src="' + mp.imsOVMapImpURLPR + '" width="' + mp.impOVMapiWidth + '" height="' + mp.impOVMapiHeight + '">');

    Win1.document.writeln('</td>');
  	Win1.document.writeln('</tr>');

	// INICIO LEYENDA
  	Win1.document.writeln('<tr>');

  	// MODIFICACION (22/10/2001).
	// Se deshabilito la muestra de la leyenda segun ArcIms para hacer la leyenda
    // personalizada pero usando una tabla en lugar de una imagen.

    // ORIGINAL: tomaba la leyenda automatica de arcIMS que mostraba los colores de todos los suelos.
    //Win1.document.writeln('<td width="'+110+'" height="150" valign="top">');
    //Win1.document.writeln('<img border="0" src="' + mp.imsLegendImpURL + '" width="150" height="130">');
    //Win1.document.writeln('</td>');
    // FIN_ORIGINAL

    // INICIO: la tabla con la leyenda.
	Win1.document.writeln('<TD valign="top">');

	// Hacer una tabla de una celda para tener solo un borde exterior.
	Win1.document.writeln('<TABLE border="1" cellspacing="0"><TR><TD valign="top">');

	// Hacer la tabla 'verdadera'.
	Win1.document.writeln('<TABLE border="0">');

	var nCeldasPorFila = 3;	// Cantidad de celdas de colores de suelos para desplegar por fila.

	// Calcular el numero de columnas que va a tener la leyenda para centrar el titulo de la tabla.
	var nColSpan;
	if (mp.gobjColores.Cant() >= nCeldasPorFila) {
		nColSpan = nCeldasPorFila * 2;
	} else {
		nColSpan = mp.gobjColores.Cant() * 2;
	}
	Win1.document.writeln('<TH bgcolor="#CCCCCC" colspan="' + nColSpan +  '"> Suelos </TH>');

	Win1.document.write('<TR>');
	for (var i = 0; i < mp.gobjColores.Cant(); i++) {
		Win1.document.write('<TD BGCOLOR="' + ColorNum2Hexa(mp.gobjColores.arrColores[i]) + '" WIDTH="20">&nbsp;</TD>');
		Win1.document.writeln('<TD WIDTH="70"><FONT FACE="Arial" SIZE="1">' + mp.gobjColores.arrSC[i] + '</FONT></TD>');

		if (((i + 1) % nCeldasPorFila) == 0) {
			Win1.document.writeln('</TR><TR>');
		}
	}

	Win1.document.writeln('</TR>');
	Win1.document.writeln('</TABLE>');

	// Cerrar el borde de la tabla ficticia
	Win1.document.writeln('</TD></TR></TABLE>');
	Win1.document.writeln('</TD>');

	// HASTA ACA: la tabla con la leyenda.

  	Win1.document.writeln('</tr>');
	// FIN LEYENDA.

	// el la lista de datos
  	Win1.document.writeln('<tr>');
    //Win1.document.writeln('<td width="'+mp.impOVMapiWidth+'" height="251" valign="top" colspan="2">');
    Win1.document.writeln('<td width="'+mp.impOVMapiWidth+'" valign="top" colspan="2">'); // elimine el 'height'.

	Win1.document.writeln('<table border="1" width="'+mp.impOVMapiWidth+'" cellspacing="0">');
	Win1.document.writeln('<tr>');
	Win1.document.writeln('<td valign="top">');

	Win1.document.writeln('<table border="0" width="' + mp.impOVMapiWidth + '">');
    Win1.document.writeln('<tr  bgcolor="#CCCCCC">');
	Win1.document.writeln('<td valign="top"><FONT FACE="Arial" SIZE="-2"><b>DEPARTAMENTO</b></FONT></td>');
	Win1.document.writeln('<td valign="top"><FONT FACE="Arial" SIZE="-2"><b>NRO. PADRON</FONT></b></td>');
	Win1.document.writeln('<td valign="top"><FONT FACE="Arial" SIZE="-2"><b>SECC. JUDICIAL</FONT></b></td>');
	// MODIFICACION (18/09/2001): incluir las sup. catastrales en el reporte impreso.
	Win1.document.writeln('<td valign="top"><FONT FACE="Arial" SIZE="-2"><b>SUP. CATASTRAL (Has.)</FONT></b></td>');
	// MODIFICACION
	Win1.document.writeln('<td valign="top"><FONT FACE="Arial" SIZE="-2"><b>IND. PROD.</FONT></b></td>');
	Win1.document.writeln('</tr>');

	var start,end;
	// MODIFICACION (18/09/2001): incluir las sup. catastrales en el reporte impreso.
	var strSupCat;
	// MODIFICACION

	regsStr += ",-,";
	start = 0;
	end = regsStr.indexOf(",",start);
	depto = regsStr.substring(start,end);
	while (depto != "-" && start > -1 && end > -1) {
		start = end + 1;
		end = regsStr.indexOf(",",start);
		nroPad = regsStr.substring(start,end);
		start = end + 1;
		end = regsStr.indexOf(",",start);
		seccJud = regsStr.substring(start,end);

		// MODIFICACION (18/09/2001): incluir las sup. catastrales en el reporte impreso.
		start = end + 1;
		end = regsStr.indexOf(",",start);
		strSupCat = regsStr.substring(start,end);
		// MODIFICACION

		//MODIF_NOTIF 24/6/2004: evitar lamina y coord.
		start = end + 1;
		end = regsStr.indexOf(",",start);
		start = end + 1;
		end = regsStr.indexOf(",",start);
		//FIN_MODIF_NOTIF

		start = end + 1;
		end = regsStr.indexOf(",",start);
		indProd = regsStr.substring(start,end);

		//AGREGADO 14/5/2002: evitar el IVR (se pide que no se muestre en el croquis).
		start = end + 1;
		end = regsStr.indexOf(",",start);
		//FIN_AGREGADO

		start = end + 1;
		end = regsStr.indexOf(",",start);
		id2 = regsStr.substring(start,end);
		start = end + 1;
		end = regsStr.indexOf(",",start);
		nombreDepto = regsStr.substring(start,end);

		Win1.document.writeln('<tr>');
		Win1.document.writeln('<TD><FONT FACE="Arial" SIZE="1">' + nombreDepto + '</FONT></TD>');
		Win1.document.writeln('<TD ALIGN="right"><FONT FACE="Arial" SIZE="1">' + nroPad + '</FONT></TD>');
		Win1.document.writeln('<TD ALIGN="right"><FONT FACE="Arial" SIZE="1">' + seccJud + '</FONT></TD>');
		// MODIFICACION (18/09/2001): incluir las sup. catastrales en el reporte impreso.
		Win1.document.writeln('<TD ALIGN="right"><FONT FACE="Arial" SIZE="1">' + strSupCat + '</FONT></TD>');
		//MODIFICACION
		Win1.document.writeln('<TD ALIGN="right"><FONT FACE="Arial" SIZE="1">' + indProd + '</FONT></TD>');
		Win1.document.writeln('</tr>');

		start = end + 1;
		end = regsStr.indexOf(",",start);
		depto = regsStr.substring(start,end);
	}

    Win1.document.writeln('</table>');
    Win1.document.writeln('</td>');
  	Win1.document.writeln('</tr>');
  	Win1.document.writeln('</table>');
	Win1.document.writeln('</td>');
	Win1.document.writeln('</tr>');
	Win1.document.writeln('</TABLE>');

	Win1.document.writeln('</B></FONT>');

	// Logo MGAP, aclaracion de NO oficial y fecha-hora.
	//Win1.document.writeln('<BR>');
	MostrarLogoFechaHora(Win1);

	Win1.document.writeln('</body></html>');
	Win1.document.close();

	Win1=null;

	// ****************************************************************************************************
	// MODIFICACION (19/11/2001): abrir otro browser con el reporte detallado de porcentajes de suelos.

	nAnchoMax = screen.availWidth - 1;
	nAltoMax  = screen.availHeight - 1;

	var Win2 = open("", "IndicesPorcentajes", "toolbar=no,status=yes,locationbar=no,resizable=yes,menubar=yes,scrollbars=yes");
	// SOLO MENU visible: "toolbar=no,status=yes,locationbar=no,resizable=yes,menubar=yes,scrollbars=yes"

	Win2.document.writeln('<HTML>');
	Win2.document.writeln('<TITLE>Porcentajes de suelos</TITLE>');
	Win2.document.writeln('<BODY BGCOLOR="White" TEXT="Black" LEFTMARGIN="0" TOPMARGIN="0">');
	Win2.document.writeln('<FONT FACE="Arial" SIZE="4">Porcentajes de Suelos CONEAT</FONT>');
	Win2.document.writeln('<P>');

	Win2.document.writeln('<TABLE CELLSPACING="10">');

	// POR PADRON: tabla de porcentajes
	var bNuevaFila = true;
	Win2.document.writeln('<TR>');

	var nCont = 0;
	var cnCantCol = 4;   // Cantidad de tablas de porcentajes por fila.

	for (var i = 0; i < mp.gobjInfoMae.Cant(); i++) {
		// -- Se hacen cnCantCol columnas de tablas de porcentajes. --
		var arrPorcPadron = new Array();
		var strPadron = mp.gobjInfoMae.arrPadrones[i].Padron;

		// AGREGADO 10/12/2001: agregar el nombre de depto a cada tabla de porcentajes de suelos.
		var strDepto  = mp.gobjInfoMae.arrPadrones[i].Depto;

		arrPorcPadron = mp.gobjPorcSue.SuelosPorcentajesDePadron(strPadron);

		var arrSue = arrPorc = new Array();
		arrSue = arrPorcPadron[0];
		arrPorc = arrPorcPadron[1];

		// MODIFICACION 5/12/2001: no mostrar tablas vacias de porcentajes para los padrones que no
		//						   se encontraron en CATCON.
		if (arrPorc.length > 0) {
			Win2.document.writeln('<TD VALIGN="Top">');

			// INICIO_TABLA de porcentajes de suelos del padron.
			Win2.document.writeln('<TABLE BORDER="0" WIDTH="220">');
			// Primer cabezal.
			Win2.document.writeln('<TR><TD ALIGN="Center" COLSPAN="4" BGCOLOR="#CCCCCC"><FONT FACE="Arial">' + DeptoPorLetra(strDepto) + ' - <B>' + strPadron + '</B></FONT></TD></TR>');
			// AGREGADO 18/4/2002: Segundo cabezal. (indice de productividad de cada grupo de suelo).
			Win2.document.writeln('<TR>');
			Win2.document.writeln('<TD WIDTH="20"><FONT FACE="Arial" SIZE=-2><B>&nbsp;</B></FONT></TD>');
			Win2.document.writeln('<TD WIDTH="80" ALIGN="Center"><FONT FACE="Arial" SIZE=-2><B>Grupo</B></FONT></TD>');
			Win2.document.writeln('<TD WIDTH="40" ALIGN="Center"><FONT FACE="Arial" SIZE=-2><B>Indice</B></FONT></TD>');
			Win2.document.writeln('<TD WIDTH="80" ALIGN="Center"><FONT FACE="Arial" SIZE=-2><B>Porc.</B></FONT></TD>');
			Win2.document.writeln('</TR>');
			// Datos de celdas.
			for (x = 0; x < arrSue.length; x++) {
				Win2.document.writeln('<TR>');
				Win2.document.writeln('<TD WIDTH="20" BGCOLOR="' + ColorNum2Hexa(mp.gobjColores.ColorDeSuelo(arrSue[x])) + '">&nbsp;</TD>');
				Win2.document.writeln('<TD WIDTH="80"><FONT FACE="courier"><B>' + arrSue[x] + '</B></FONT></TD>');
				// AGREGADO 18/4/2002: indice de productividad de cada grupo de suelo.
				Win2.document.writeln('<TD WIDTH="40" ALIGN="Right"><FONT FACE="courier">' + mp.gobjPorcSue.IndProdDeSuelo(arrSue[x]) + '</FONT></TD>');
				Win2.document.writeln('<TD WIDTH="80" ALIGN="Right"><FONT FACE="courier">' + FormatearNumConPrecision(arrPorc[x], 2) + ' %</FONT></TD>');
				Win2.document.writeln('</TR>');
			}
			Win2.document.writeln('</TABLE>');
			// FIN_TABLA porcentajes.

			Win2.document.writeln('</TD>');

			// Hacer cnCantCol columnas de tablas de porcentajes.
			bNuevaFila = (((nCont + 1) % cnCantCol) == 0);
			if (bNuevaFila && (nCont != 0)) {
				// cerrar nueva fila y abrir otra nueva.
				Win2.document.writeln('</TR>');
				Win2.document.writeln('<TR>');
			}
			nCont++;
		}
	}
	Win2.document.writeln('</TR>');
	Win2.document.writeln('</TABLE>');

	// ********************************************************************************************
	// AGREGADO (21/1/2002): DESCRIPCIONES DE LOS SUELOS.

	Win2.document.writeln('<P>');
	Win2.document.writeln('<TABLE CELLSPACING="10">');
	Win2.document.writeln('<TR><TD ALIGN="Center" COLSPAN="2" BGCOLOR="#CCCCCC"><FONT FACE="Arial"><B> Descripcion de grupos de suelos CONEAT </B></FONT></TD></TR>');
	for (var i = 0; i < mp.gobjDescrip.Cant(); i++) {
		var strSC = mp.gobjDescrip.arrSC[i];
		var strDescrip = mp.gobjDescrip.DescripDeSuelo(strSC);

		Win2.document.writeln('<TR>');
		Win2.document.writeln('<TD VALIGN="Top"><FONT FACE="courier"><B>' + strSC + '</B></FONT></TD>');
		Win2.document.writeln('<TD>' + strDescrip + '</TD>');
		Win2.document.writeln('</TR>');
	}
	Win2.document.writeln('</TABLE>');
	// FIN_AGREGADO_DESCRIPCIONES_SUELOS.

    // Logo del MGAP, aclacracion de NO oficial y fecha-hora.
	Win2.document.writeln('<BR>');
	MostrarLogoFechaHora(Win2);

	Win2.document.writeln('</BODY>');
	Win2.document.writeln('</HTML>');
	Win2.document.close();
	Win2 = null;

	// FIN (19/11/2001): browser aparte con tablas de porcentajes de suelos.
	// ****************************************************************************************************

	hideRetrieveMap();
}

