	// ******************* Defino variables globales

	var isNS3 	= (navigator.appName == "Netscape" && parseInt(navigator.appVersion) >= 3);
	var isIE 	= (navigator.appName == "Microsoft Internet Explorer");
	var cats 	= new Array();
	var catsIndex 	= -1;
	var itemsIndex 	= -1;
	var subitemsIndex = -1;

	var cats2 	= new Array();
	var catsIndex2 	= -1;
	var itemsIndex2 	= -1;
	var subitemsIndex2 = -1;

	var catHeading 	   = 'Seleccione-----------';   
	var itemHeading    = 'Seleccione-----------';    
	var subitemHeading = 'Seleccione-----------';   
	var betweenHeading = ' then ';              // "in between" text


	// ******************** Primer Nivel *************************
	
	// Defino un objeto o estructura de objeto (CAT) de nombre igual a "name" e longuitud igual a "0"
	function makeCat(name,value) 
	{
		this.name = name;
		this.value = value;
		this.length = 0;
	}


	// Creo el objeto (CAT) e inicializo a -1 la variable "itemsIndex" e sumo catsIndex++ de uno en uno 
	function newCat(name,value) 
	{
		catsIndex++;
		itemsIndex = -1;
		cats[catsIndex] = new makeCat(name,value);
	}
	function newCat2(name,value) 
	{
		catsIndex2++;
		itemsIndex2 = -1;
		cats2[catsIndex2] = new makeCat(name,value);
	}



	// ******************** Segundo Nivel *************************

	// Defino un objeto o estructura de objeto (ITEM) con dos propiedades
	function makeItem(name,value) 
	{
 		this.name = name;
		this.value = value;
		this.length = 0;
	}


	// Creo el objeto (ITEM) e inicializo a -1 la variable "itemsIndex"
	function newItem(name,value) 
	{
		itemsIndex++;
		subitemsIndex = -1;
		cats[catsIndex][itemsIndex] = new makeItem(name,value);
		cats[catsIndex].length++;
	}
	function newItem2(name,value) 
	{
		itemsIndex2++;
		subitemsIndex2 = -1;
		cats2[catsIndex2][itemsIndex2] = new makeItem(name,value);
		cats2[catsIndex2].length++;
	}



	// ******************** Tercer Nivel *************************

	// Defino un objeto o estructura de objeto (SUBITEM) con dos propiedades
	function makeSubItem(name, value) 
	{
 		this.name = name;
		this.value = value;
	}


	// Creo el objeto (SUBITEM) 
	function newSubItem(name, value) 
	{
		subitemsIndex++;
		cats[catsIndex][itemsIndex][subitemsIndex] = new makeSubItem(name, value);
		cats[catsIndex][itemsIndex].length++;
	}
	function newSubItem2(name, value) 
	{
		subitemsIndex2++;
		cats2[catsIndex2][itemsIndex2][subitemsIndex2] = new makeSubItem(name, value);
		cats2[catsIndex2][itemsIndex2].length++;
	}




	// ******************** Funcion que crea las provincias *************************

	// Funcion que me muestra las provincias del departamento seleccionado
	function relateItems(cat, codprov, coddist)
	{
			// Si el navegador es Netscape y version 3 o superior
			if (cat > 0) 
			{
				// Si la longuitud del array cat es mayor a cero
				catsIndex = cat - 1;
				//catsIndex = cat;
				with (document.m.m2) 
				{
					// Trabajar con el objeto "m2" del documento "m" 
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					var j=0;
					for (var i = 0; i < cats[catsIndex].length; i++) 
					{
						// Desde el inicio hasta la longuitud de la variable array (cojo el indice correspondiente seleccionado)
						// agrego su contenido
						var sName = cats[catsIndex][i].name;
						var sCod = cats[catsIndex][i].value;
						if (sCod == codprov) j=i+1;
						var sName = sName.substring(0,21);
						options[i + 1] = new Option(sName,cats[catsIndex][i].value); 
					}

					options[j].selected = true; // Selecciono la opcion
				}

				//*******************************************************
				with (document.m.m3) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}
					options[0].selected = true; // Selecciono la primera opcion
				}
				if (codprov!='') relateSubItems(cat,j,coddist);
			}
			else
			{
				//reseteo el combo de provincias
				with (document.m.m2) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					options[0].selected = true; // Selecciono la primera opcion
				}

				//reseteo el combo de distritos
				with (document.m.m3) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					options[0].selected = true; // Selecciono la primera opcion
				}
			}

		itemsIndex = 0;
	}



	// ******************** Funcion que crea los distritos *************************

	function relateSubItems(cat,item, coddist) 
	{
			// Si el navegador es Netscape y version 3 o superior

			if (item > 0) 
			{
				// Si la longuitud del array cat es mayor a cero

				//catsIndex  = cat - 1;
				catsIndex  = cat - 1;
				itemsIndex = item - 1;

				with (document.m.m3) 
				{
					for (var i = options.length; i > 1; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					var k=0;
					for (var i = 0; i < cats[catsIndex][itemsIndex].length; i++) 
					{
						// Desde el inicio hasta la longuitud de la variable array (cogo el indice correspondiente seleccionado)
						// agrego su contenido
						var sName = cats[catsIndex][itemsIndex][i].name;
						var sCod = cats[catsIndex][itemsIndex][i].value;
						//alert("scod=" + sName + " nomdist=" + nomdist);
						if (sCod == coddist) k=i+1;
						var sName = sName.substring(0,21);
						options[i + 1] = new Option(sName,cats[catsIndex][itemsIndex][i].value);
					}
					options[k].selected = true; // Selecciono la primera opcion
				}
			}
			else
			{
				//reseteo el combo de distritos
				with (document.m.m3) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					options[0].selected = true; // Selecciono la primera opcion
				}
			}

		itemsIndex = 0;
	}


	// ******************** Funcion que aņade la primera linea a los combos *************************

	function addHeadings() 
	{
		m1.addItem(catHeading);
		for (var i = 0; i < cats.length; i++)
		{
			m1.addItem(cats[i].name);
		}
		m1.listIndex = 0;

		m2.addItem(itemHeading);
		m2.listIndex = 0;

		m3.addItem(subitemHeading);
		m3.listIndex = 0;
	}


	function gotoPage(cat,item,subitem) 
	{

		var nNumero = gotoPage.arguments.length;


		switch (nNumero)
		{
			case 1:
			 	var sCgrfnbr = "";
				var sCgrfnbrHijas = "";
				catsIndex  = cat;
				sCgrfnbr = cats[catsIndex].value;

				//for ( var j = 0 ; j < cats[catsIndex].length ; j++  )
				//for ( var i = 0 ; i < cats[catsIndex][j].length ; i++  )
				//{
				//	if ( sCgrfnbrHijas.length > 0 )
				//	{
				//		sCgrfnbrHijas = sCgrfnbrHijas + ",";
				//	}
				//	sCgrfnbrHijas = sCgrfnbrHijas + cats[catsIndex][j][i].value;
				//}

				//var sUrl = "/webapp/commerce/command/CategoryDisplay?cgmenbr=1&cgrfnbr=" + sCgrfnbr + "&nNumeroPagina=1&nCampoOrdenamiento=2" + "&sFiltroCgrfnbr=" + sCgrfnbrHijas ;
				var sUrl = "/webapp/commerce/command/CategoryDisplay?cgmenbr=1&cgrfnbr=" + sCgrfnbr + "&nNumeroPagina=1&nCampoOrdenamiento=2" + "&sFiltroCgrfnbr=" + sCgrfnbr ;
				//parent.body.location.href = sUrl;
				parent[2].location.href = sUrl;
				break;

			case 3:
				if (subitem > 0) 
				{
				 	var sCgrfnbr = "";
					catsIndex  = cat;
					itemsIndex = item - 1;
					subitemsIndex = subitem - 1;
					sCgrfnbr = cats[catsIndex][itemsIndex][subitemsIndex].value;
	
					var sUrl = "/webapp/commerce/command/CategoryDisplay?cgmenbr=1&cgrfnbr=" + sCgrfnbr +  "&nNumeroPagina=1&nCampoOrdenamiento=2" + "&sFiltroCgrfnbr=";
					//parent.body.location.href = sUrl;
					parent[2].location.href = sUrl;
				}
				break;
		}

	}



	function f_IrCategoria(cat)
	{
	 	var sCgrfnbr = "";
		var sCgrfnbrHijas = "";
		catsIndex  = cat;
		sCgrfnbr = cats[catsIndex].value;

		//for ( var j = 0 ; j < cats[catsIndex].length ; j++  )
		//for ( var i = 0 ; i < cats[catsIndex][j].length ; i++  )
		//{
		//	if ( sCgrfnbrHijas.length > 0 )
		//	{
		//		sCgrfnbrHijas = sCgrfnbrHijas + ",";
		//	}
		//	sCgrfnbrHijas = sCgrfnbrHijas + cats[catsIndex][j][i].value;
		//}
		//var sUrl = "/webapp/commerce/command/ExecMacro/FrameCategoria.d2w/report?cgmenbr=1&cgrfnbr=" + sCgrfnbr + "&sFiltroCgrfnbr=" + sCgrfnbrHijas;

		var sUrl = "/webapp/commerce/command/ExecMacro/FrameCategoria.d2w/report?cgmenbr=1&cgrfnbr=" + sCgrfnbr + "&sFiltroCgrfnbr=" + sCgrfnbr;
		location.href = sUrl;
	}


	// ******************** Funcion que crea las provincias para el segundo combo*************************

	// Funcion que me muestra las provincias del departamento seleccionado
	function relateItems2(cat, codprov, coddist) 
	{
			// Si el navegador es Netscape y version 3 o superior
			if (cat > 0) 
			{
				catsIndex2 = cat - 1;

				with (document.m.m22) 
				{
					// Trabajar con el objeto "m22" del documento "m" 
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					var j=0;
					for (var i = 0; i < cats2[catsIndex2].length; i++) 
					{
						// Desde el inicio hasta la longuitud de la variable array (cogo el indice correspondiente seleccionado)
						// agrego su contenido
						var sName = cats2[catsIndex2][i].name;
						var sCod = cats2[catsIndex2][i].value;
						if (sCod == codprov) j=i+1;
						var sName = sName.substring(0,21);
						options[i + 1] = new Option(sName,cats2[catsIndex2][i].value); 
					}
					options[j].selected = true; // Selecciono la primera opcion
				}

				with (document.m.m33) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					options[0].selected = true; // Selecciono la primera opcion
				}
				if (codprov!='') relateSubItems2(cat,j,coddist);
			}
			else
			{
				//reseteo el combo de provincias
				with (document.m.m22) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					options[0].selected = true; // Selecciono la primera opcion
				}

				//reseteo el combo de distritos
				with (document.m.m33) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					options[0].selected = true; // Selecciono la primera opcion
				}
			}
		itemsIndex = 0;
	}



	// ******************** Funcion que crea los distritos *************************

	function relateSubItems2(cat,item, coddist) 
	{
			// Si el navegador es Netscape y version 3 o superior
			if (item > 0) 
			{
				// Si la longuitud del array cat es mayor a cero

				//catsIndex  = cat - 1;
				catsIndex2  = cat - 1;
				itemsIndex2 = item - 1;

				with (document.m.m33) 
				{
					for (var i = options.length; i > 1; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					var k=0;
					for (var i = 0; i < cats2[catsIndex2][itemsIndex2].length; i++) 
					{
						// Desde el inicio hasta la longuitud de la variable array (cogo el indice correspondiente seleccionado)
						// agrego su contenido
						var sName = cats2[catsIndex2][itemsIndex2][i].name;
						var sCod = cats2[catsIndex2][itemsIndex2][i].value;
						if (sCod == coddist) k=i+1;
						var sName = sName.substring(0,21);
						options[i + 1] = new Option(sName,cats2[catsIndex2][itemsIndex2][i].value); 
					}

					options[k].selected = true; // Selecciono la primera opcion
				}
			}
			else
			{
				//reseteo el combo de distritos
				with (document.m.m33) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}
					options[0].selected = true; // Selecciono la primera opcion
				}
			}
		itemsIndex = 0;
	}



	// ******************** Funcion que crea los productos *************************

	// Funcion que me muestra las provincias del departamento seleccionado
	function relateItemsProds(cat, codprod)
	{
			// Si el navegador es Netscape y version 3 o superior
			if (cat > 0) 
			{
				// Si la longuitud del array cat es mayor a cero
				catsIndex = cat - 1;
				//catsIndex = cat;
				with (document.m.m2) 
				{
					// Trabajar con el objeto "m2" del documento "m" 
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					var j=0;
					for (var i = 0; i < cats[catsIndex].length; i++) 
					{
						// Desde el inicio hasta la longuitud de la variable array (cojo el indice correspondiente seleccionado)
						// agrego su contenido
						var sName = cats[catsIndex][i].name;
						var sCod = cats[catsIndex][i].value;
						if (sCod == codprod) j=i+1;
						var sName = sName.substring(0,21);
						options[i + 1] = new Option(sName,cats[catsIndex][i].value); 
					}
					options[j].selected = true; // Selecciono la opcion
				}

			}
			else
			{
				//reseteo el combo de provincias
				with (document.m.m2) 
				{
					for (var i = options.length; i > 0; i--) 
					{
						// Empezar desde el final (de sus opciones) e ir anulandolas
						options[i] = null; 
					}

					options[0].selected = true; // Selecciono la primera opcion
				}

			}

		itemsIndex = 0;
	}
