	/*****************************************************************************
	CLASE:	XHCConn (ajax)
	UTILIDAD:	Permite llevar a cabo consultas asíncrons
	MÉTODOS:	
		connect(sURL, sMethod, sVars, fnDone)-> LLeva a cabo la visita a la página indicada
	ATRIBUTOS:
		responseText ->	Al regresar de la visita, contiene el texto de la página
		xmlhttp ->		instancia de la clase ActiveXObject ó XMLHttpRequest, según el navegador
		bComplete ->	Variable boolena que indica si ya se llevó a cabo la conexión
	*****************************************************************************/
	function XHConn()
	{
	  var xmlhttp, bComplete = false;
	  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
	  catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
	  catch (e) { try { xmlhttp = new XMLHttpRequest(); }
	  catch (e) { xmlhttp = false; }}}
	  if (!xmlhttp) return null;
	  // Método connect
	  this.connect = function(sURL, sMethod, sVars, fnDone)
	  {
		if (!xmlhttp) return false;
		bComplete = false;
		sMethod = sMethod.toUpperCase();
	
		try {
		  if (sMethod == "GET")
		  {
			xmlhttp.open(sMethod, sURL+"?"+sVars, true);
			sVars = "";
		  }
		  else
		  {
			xmlhttp.open(sMethod, sURL, true);
			xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
			xmlhttp.setRequestHeader("Content-Type",
			  "application/x-www-form-urlencoded");
		  }
		  xmlhttp.onreadystatechange = function(){
			if (xmlhttp.readyState == 4 && !bComplete)
			{
			  bComplete = true;
			  fnDone(xmlhttp);
			}};
		  xmlhttp.send(sVars);
		}
		catch(z) { return false; }
		return true;
	  };
	  return this;
	}
	
	/*****************************************************************************
	FUNCION:	resultado de validar dominio
	UTILIDAD:	En funcion del tipo de operación que se está llevando a cabo, 
				imprime la validez del dominio o no
	ENTRADAS:
		dominio	-> cadena con el dominio a buscar
		ext		-> cadena con la extension a buscar
		tipo	-> tipo de operación que se está llevando a cabo
	SALIDAS:
		ninguna
	*****************************************************************************/
	function result_validar_dominio(dominio, ext, tipo){
		// Letrero de búsqueda
		document.getElementById("dvdisponibilidad").innerHTML = 
		'<div style="margin:5px; padding:3px; background-color:#FAEA32;" align="center"><div style="background-color:#FFF; border:1px solid #EF9B52; padding:5px;">'+
		' Verificando la existencia del Dominio '+dominio+'.'+ext+', por favor espere.</div></div>';	
		
		// Conexión asíncrona
		var myConn = new XHConn();
		// Si no se pudo conectar: avisar
		if (!myConn)
			mensaje('dvdisponibilidad',
					'XMLHTTP no se pudo cargar Intenta con un navegador mas reciente', 'rojo');
		// Acciones al regreso de la solcitud
		var peticion = function (oXML) {
			if(oXML.responseText != "")
				document.getElementById('dvdisponibilidad').innerHTML = oXML.responseText; 
			else
				mensaje('dvdisponibilidad',
								'Problemas con la conexión. Favor de volver a hacer clic en validar.','rojo');
			// Verifica el color de la respuesta regresada
			if(esVerde(oXML.responseText)){
				dominio_ok = true;
				requisitosEspeciales(dominio, ext,'verde',tipo);
			}
			else{
				dominio_ok = false;
				requisitosEspeciales(dominio, ext,'rojo',tipo);
			}
			
			// Cambiar el estado del botón
			verificaBoton();
		};
		// Llamar  a validar dominio
		myConn.connect("contratar_validar_dominio.php?dominio="+
					   dominio+"&ext="+ext+"&tipo="+tipo,"POST", "", peticion);	
	}
	
	/*****************************************************************************
	FUNCION:	busca color
	UTILIDAD:	Valida si una consulta whois hecha por result_validar_dominio halla sido
				exitosa, a través del color del diálogo (verde o rojo)
	ENTRADAS:
		cadena ->	Contiene el texto regresado por la consulta de ajax
	SALIDAS:
		verdadero si es verde, falso si no lo es
	*****************************************************************************/
	function esVerde(cadena){
		var verde = "load1";
		
		// Si la cadena contiene verde indicar éxito
		if(cadena.match(verde))
			return true;
		return false;
	}
	
	/*****************************************************************************
	FUNCION:	cambia Tiempo Dominio
	UTILIDAD:	Cambia las frases de "por X años" en las opciones de dominio
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cambiaTiempoDom(){
		var meses = document.paso1.tiempo_dom[document.paso1.tiempo_dom.selectedIndex].value;
		
		switch(meses){
			case "60":
				// Indicar el tiempo
				document.getElementById('t_dom1').innerHTML = "por cinco a&ntilde;os";
				document.getElementById('t_dom2').innerHTML = "por cinco a&ntilde;os";
				document.getElementById('t_dom3').innerHTML = "por cinco a&ntilde;os";
				document.getElementById('t_dom4').innerHTML = "por cinco a&ntilde;os";
				break;
			case "48":
				// Indicar el tiempo
				document.getElementById('t_dom1').innerHTML = "por cuatro a&ntilde;os";
				document.getElementById('t_dom2').innerHTML = "por cuatro a&ntilde;os";
				document.getElementById('t_dom3').innerHTML = "por cuatro a&ntilde;os";
				document.getElementById('t_dom4').innerHTML = "por cuatro a&ntilde;os";
				break;
			case "36":
				// Indicar el tiempo
				document.getElementById('t_dom1').innerHTML = "por tres a&ntilde;os";
				document.getElementById('t_dom2').innerHTML = "por tres a&ntilde;os";
				document.getElementById('t_dom3').innerHTML = "por tres a&ntilde;os";
				document.getElementById('t_dom4').innerHTML = "por tres a&ntilde;os";
				break;
			case "24":
				// Indicar el tiempo
				document.getElementById('t_dom1').innerHTML = "por dos a&ntilde;os";
				document.getElementById('t_dom2').innerHTML = "por dos a&ntilde;os";
				document.getElementById('t_dom3').innerHTML = "por dos a&ntilde;os";
				document.getElementById('t_dom4').innerHTML = "por dos a&ntilde;os";
				break;
			default:
				// Indicar el tiempo
				document.getElementById('t_dom1').innerHTML = "por un a&ntilde;o";
				document.getElementById('t_dom2').innerHTML = "por un a&ntilde;o";
				document.getElementById('t_dom3').innerHTML = "por un a&ntilde;o";
				document.getElementById('t_dom4').innerHTML = "por un a&ntilde;o";
		}
		// Colocar los montos en los divs
		cambiaCostosTipo();
		// Prsentar en una ventana el monto ahorrado
		//calculaAhorro();
	}
	
	/*****************************************************************************
	FUNCION:	calcula Ahorro
	UTILIDAD:	presenta en una ventana el cálculo del ahorro en total
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function calculaAhorro(){
		var tipo = parseInt(getSelected(document.paso1.tipo));
		var precio_promo, multi_sin, precio_multi_anual, precio_normal, anios, meses, ahorro = 0;

		// Si no es aúntar el dominio
		if(tipo != 3){
			var meses = document.paso1.tiempo_dom[document.paso1.tiempo_dom.selectedIndex].value;
			var anios = meses/12;

			precio_promo = costosDom[dom_sel][tipo];
			precio_multi_anual = precioMultiAnual(dom_sel,tipo,anios);
			precio_normal = costosDom[dom_sel][13];
			anios=parseInt(document.paso1.tiempo_dom[document.paso1.tiempo_dom.selectedIndex].value)/12;

			// Ahorro basado en si esta la promoción del 1er año gratis
			ahorro += precio_normal - precio_promo;
			// Ahorro po número de años del dominio
			ahorro += precio_normal*anios - precio_multi_anual;
		}
		// Si hay hosying seleccionado
		if(host_sel != -1){
			// Precio normal, anual
			precio_normal = costosHost[host_sel][5];
			// Tiempo elegido
			meses = parseInt(getSelected(document.paso1.tiempo));
			// Obtener numero de años elegido
			anios = meses/12;
			// Obtener precio multianual sin descuento
			multi_sin = precio_normal*anios;
			// Obtener precio multianual con descuento
			precio_multi_anual = dameCostoPlan(meses);
			// Ahorro total por número de años del hosting o promoción de temporada
			ahorro += (multi_sin - precio_multi_anual);
		}
		
		if(ahorro>0)
			// Indicar el ahorro
			mensaje('div_ahorro', 'Estas ahorrando $'+ahorro+' pesos!!', 'verde');	
	}

	/*****************************************************************************
	FUNCION:	calcula Total
	UTILIDAD:	Imprime en el div "total_dominio" el total seleccionado
	ENTRADAS:
		cadena ->	Contiene el texto regresado por la consulta de ajax
	ENTRADAS EXTERNAS:
		dominio -> Indica el costo actual del dominio
		hosting -> Indica el costo actual del hosting
		activ 	-> Indica el costo actual de activación
		dom_sel -> Indica si hay un dominio seleccionado cuando es dif a -1
		host_sel-> Indica si hay un host seleccionado cuando es dif a -1
		planesMostrados-> Indica si esta presenta la seleccion de plan
	SALIDAS:
		ninguna
	*****************************************************************************/
	function calculaTotal(){
		var tipo = parseInt(getSelected(document.paso1.tipo));

		// Si ya seleccionó extension
		if(dom_sel != -1){
			dominio = "$"+Number(dameCostoTipo(tipo)).toLocaleString();
		}
		
		if(planesMostrados){
			if(host_sel != -1){
				var plan = document.paso1.plan.value;
				var tiempo =  parseInt(getSelected(document.paso1.tiempo));
	
				hosting = "$"+Number(dameCostoPlan(tiempo)).toLocaleString();
				activ = "$"+Number(dameCostoActivacion()).toLocaleString();
			}
		}
		
		// Si ya hay algo seleccionado
		if( (dom_sel != -1) || (host_sel != -1) ){
			var text = "Total seleccionado: ";

			// Si ya se seleccionó dominio y tipo
			if(dom_sel != -1) text += dominio+" del dominio ";
			if(host_sel != -1){
				if(tiempo<12)
					text += " ,"+hosting+" del hosting y "+activ+" de activaci&oacute;n";
				else
					text += "y "+hosting+" del hosting.";
			}
			document.getElementById("total_dominio").innerHTML = text;
	
			//calculaAhorro();
		}
		else
			document.getElementById("total_dominio").innerHTML = "";
		
	}
	
	/*****************************************************************************
	FUNCION:	calcula Total
	UTILIDAD:	Imprime en el div "total_dominio" el total seleccionado
	ENTRADAS:
		cadena ->	Contiene el texto regresado por la consulta de ajax
	ENTRADAS EXTERNAS:
		costosHost[] -> Arreglo bidimencional con los costos de cada paquete por tipo
	SALIDAS:
		costo de activación del host actualmente seleccionado
	*****************************************************************************/
	function dameCostoActivacion(){
		return costosHost[host_sel][4]; 
	}
	
	/*****************************************************************************
	FUNCION:	get Selected
	UTILIDAD:	Obtiene el valor selecionado de un grupo de radios
	ENTRADAS:
		ctrl -> Grupo de radios
	SALIDAS:
		valor del radio actualmente seleccionado
	*****************************************************************************/
	function getSelected(ctrl){
		for(var i=0;i<ctrl.length;i++){
			if(ctrl[i].checked) 
				return ctrl[i].value;
		}
	}

	/*****************************************************************************
	FUNCION:	dame costo tipo
	UTILIDAD:	Regresa el costo, según el tipo, del dominio actualmente seleccionado
	ENTRADAS:
		tipo ->	Tipo de contratación del dominio (registrar, transferir,..)
	ENTRADAS EXTERNAS:
		costosHost[] -> Arreglo bidimencional con los costos de cada paquete por tipo
		dom_sel 	 -> Dominio actualmente seleccionado
	SALIDAS:
		costo de la operación o -1 si no hay ningún dominio seleccionado
	*****************************************************************************/
	function dameCostoTipo(tipo){
		if(dom_sel > -1){
			var precio_promo, total,precio_un_anio;
			var meses = document.paso1.tiempo_dom[document.paso1.tiempo_dom.selectedIndex].value;
			var anios = meses/12,tld;
			if(tipo == 3)	return 0;	// Apuntar

			precio_promo = costosDom[dom_sel][tipo];
			total = precioMultiAnual(dom_sel,tipo,anios);
			
			return total;
		}
		return -1;
	}
	
	/*****************************************************************************
	FUNCION:	precioMultiAnual
	UTILIDAD:	Calcula el costo de un dominio con base al numero de años seleccionados.
		Toma en cuanta el mismo costo para resellers y no resellers y respeta la promoción
		del primer año gratis
	ENTRADAS:
		tipo 			->	Tipo de contratación del dominio (registrar, transferir,..)
		dom_sel 	->	Dominio actualmente seleccionado
		anios			->	Numero de años a contratar
	ENTRADAS EXTERNAS:
		costosHost[] -> Arreglo bidimencional con los costos de cada paquete por tipo
	SALIDAS:
		costo de la operación o -1 si no hay ningún dominio seleccionado
	*****************************************************************************/
	function precioMultiAnual(dom_sel,tipo,anios){
		if(dom_sel > -1){
			var tld = costosDom[dom_sel][6];							// tld
			var un_anio_escalar = costosDom[dom_sel][tipo];		// precio por un año según el tipo
			var precio_reseller = costosDom[dom_sel][14];	//n_res
			var precio_normal = costosDom[dom_sel][13];		//r_sin
			var es_mx = /mx$/;
			var modo, precio3, precio_total;
			
			if(tipo == 3) return 0;
			
			// Si el primer año es gratis, tomar el precio de renovación
			if(un_anio_escalar == 0)
				precio_base = precio_normal;
			else
				precio_base = un_anio_escalar;
					
			// Ver si es com o mx
			if(es_mx.test(tld)) //Si es x.mx
			{
				es_mx = /^mx$/; //Si es mx puro
				if(es_mx.test(tld))
					modo = 'manual';
				else if((tipo==1 || tipo==4) && desc_mx == 'manual')
					modo = 'manual';			
				else
					modo = 'escalar';
			}
			else{
				if((tipo==1 || tipo==4) && desc_com == 'manual')
					modo = 'manual';
				else
					modo = 'escalar';
			}
			
			// Hard coded, promo
			//if(tipo==1 || tipo==4)
				//if(tld == 'mobi' || tld == 'info')	
					//modo = 'manual';
			
			switch(anios){
				case 1:
					if(modo == 'escalar')
						precio_total = precio_base;
					// manual
					else{
						// Si registrar con hosting y está activa la promo del 1er año gratis
						//if(tipo==1 && un_anio_escalar == 0)
						//	precio_total = 0;
						if(tipo == 1 ||tipo == 2)
							precio_total = costosDom[dom_sel][15]; // precio manual por un año con hosting
						else
							precio_total = costosDom[dom_sel][7]; // precio manual por un año sin hosting
					}
					break;
				case 2:
					// Si es escalar es el equivalente a dos años del precio de reseller (descuento máximo)
					if(modo == 'escalar'){
						precio3 = Math.round((precio_base + precio_reseller)/2);
						precio_total = Math.round((precio_base + precio3)/2);
						precio_total *= anios;
					}			
					else{
						// Si registrar, o tranferir con hosting y está activa la promo del 1er año
						//if(tipo<3 && un_anio_escalar == 0)
						//	precio_total = costosDom[dom_sel][7];		
						if(tipo == 1 ||tipo == 2)
							precio_total = costosDom[dom_sel][16];		// dos años con hosting manual
						else
							precio_total = costosDom[dom_sel][8];			// dos años sin hosting manual
					}
					break;
				case 3:
					// Si es escalar es el equivalente a dos años del precio de reseller (descuento máximo)
					if(modo == 'escalar'){
						precio_total = Math.round((precio_base + precio_reseller)/2);
						precio_total *= anios;
					}			
					else{
						// Si registrar, o tranferir con hosting y está activa la promo del 1er año
						//if(tipo<3 && un_anio_escalar == 0)
						//	precio_total = costosDom[dom_sel][8];
						if(tipo == 1 ||tipo == 2)
							precio_total = costosDom[dom_sel][17];
						else
							precio_total = costosDom[dom_sel][9];
					}
					break;
				case 4:
					// Si es escalar es el equivalente a dos años del precio de reseller (descuento máximo)
					if(modo == 'escalar'){
						precio3 = Math.round((precio_base + precio_reseller)/2);
						precio_total = Math.round((precio_reseller + precio3)/2);
						precio_total *= anios;
					}			
					else{
						// Si registrar, o tranferir con hosting y está activa la promo del 1er año
						//if(tipo<3 && un_anio_escalar == 0)
						//	precio_total = costosDom[dom_sel][9];
						if(tipo == 1 ||tipo == 2)
							precio_total = costosDom[dom_sel][18];
						else
							precio_total = costosDom[dom_sel][10];
					}
					break;
				case 5:
					if(modo == 'escalar'){
						precio_total = precio_reseller;
						precio_total *= anios;
					}
					else{
						// Si registrar, o tranferir con hosting y está activa la promo del 1er año
						//if(tipo<3 && un_anio_escalar == 0)
						//	precio_total = costosDom[dom_sel][10];
						if(tipo == 1 ||tipo == 2)
							precio_total = costosDom[dom_sel][19];
						else
							precio_total = costosDom[dom_sel][11];
					}
			}
			
			// Si es escalar con hosting, y está activa la promo: quitar el costo de un año
			if(tipo<3 && modo == 'escalar' && un_anio_escalar == 0){
				// Descontar el costo de un año
				precio_total -= precio_base;
			}
			
			
			return  precio_total;
		}
	}
	
	/*****************************************************************************
	FUNCION:	dame Extension
	UTILIDAD:	Obtiene la extensión actualmente seleccionada
	ENTRADAS:	ninguna
	SALIDAS:	extensión del dominio actualmente seleccionado
	*****************************************************************************/
	function dameExtension(){
		if(dom_sel > -1){
			return costosDom[dom_sel][6];
		}
	}
	
	/*****************************************************************************
	FUNCION:	dame Dominio
	UTILIDAD:	Extrae el texto del input dominio
	ENTRADAS:	ninguna
	SALIDAS:	texto del input "dominio"
	*****************************************************************************/
	function dameDominio(){
		return document.paso1.dominio.value;
	}
	
	/*****************************************************************************
	FUNCION:	cambia costos tipo
	UTILIDAD:	Imprime los costos de cada tipo de operación para el dominio 
				actualmente seleccionado
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	SALIDAS EXTERNAS:
		dom_sel ->	Id, base cero, del dominio actualmente seleccionado (base cero)
	*****************************************************************************/
	function cambiaCostosTipo(){
		// Obtener el id del dominio seleccionado
		var val_ext = document.paso1.extension.value;
		
		// Si hay un dominio seleccionado
		if(val_ext != "0"){
			// Obtener su posición en el arreglo
			dom_sel = dameIndiceDominios(val_ext);
			
			document.getElementById("registrar_con").innerHTML = 
			"$"+Number(dameCostoTipo(1)).toLocaleString();
			document.getElementById("transferir_con").innerHTML = 
			"$"+Number(dameCostoTipo(2)).toLocaleString();
			document.getElementById("apuntar").innerHTML = 
			"$"+Number(dameCostoTipo(3)).toLocaleString();
			document.getElementById("registrar_sin").innerHTML = 
			"$"+Number(dameCostoTipo(4)).toLocaleString();
			document.getElementById("transferir_sin").innerHTML = 
			"$"+Number(dameCostoTipo(5)).toLocaleString();
			
			// Si el tipo es edu.mx o gob.mx deshabilitar sin hosting
			if(val_ext == 'gob.mx' || val_ext == 'edu.mx'){
				document.paso1.tipo[3].disabled = true;
				document.paso1.tipo[4].disabled = true;
			}
			else{
				document.paso1.tipo[3].disabled = false;
				document.paso1.tipo[4].disabled = false;
			}
			
			// Cambiar total
			calculaTotal();
			return true;
		}
		dom_sel = -1;
		
		// Poner en blanco
		document.getElementById("registrar_con").innerHTML = "";
		document.getElementById("transferir_con").innerHTML = "";
		document.getElementById("apuntar").innerHTML = "";
		document.getElementById("registrar_sin").innerHTML = "";
		document.getElementById("transferir_sin").innerHTML = "";

		// Cambiar total
		calculaTotal();
		return false;		
	}
	
	/*****************************************************************************
	FUNCION:	cambia costos host
	UTILIDAD:	Imprime los costos del host actualmente seleccionado para cada tiempo
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	SALIDAS EXTERNAS:
		host_sel ->	Id, base cero, del host actualmente seleccionado (base cero)
		host_ok	 -> Indica si hay un host seleccionado
	*****************************************************************************/
	function cambiaCostosHost(){
		// Obtener le plan seleccionado
		var id_plan = document.paso1.plan.value;
		var mensual, semestral;
			
		// Si hay un plan seleccionado
		if(id_plan != "0"){
			// Obtener su posición en el arreglo
			host_sel = dameIndiceHost(id_plan);
			host_ok = true;
			
			// Obtener costos menores a un año
			mensual = dameCostoPlan(1);
			if(mensual > 0)  document.paso1.tiempo[0].disabled = false;
			else document.paso1.tiempo[0].disabled = true;
			semestral = dameCostoPlan(6);
		
			// Cambiar textos
			document.getElementById("costo1").innerHTML = 
			"$"+Number(mensual).toLocaleString();
			document.getElementById("costo6").innerHTML = 
			"$"+Number(semestral).toLocaleString();
			document.getElementById("costo12").innerHTML = 
			"$"+Number(dameCostoPlan(12)).toLocaleString();
			document.getElementById("costo24").innerHTML = 
			"$"+Number(dameCostoPlan(24)).toLocaleString();
			document.getElementById("costo36").innerHTML = 
			"$"+Number(dameCostoPlan(36)).toLocaleString();
			document.getElementById("costo48").innerHTML = 
			"$"+Number(dameCostoPlan(48)).toLocaleString();
			document.getElementById("costo60").innerHTML = 
			"$"+Number(dameCostoPlan(60)).toLocaleString();
			document.getElementById("costo_activacion").innerHTML = "$"+dameCostoActivacion();
			
			cambiaMensaje();	// Mensaje de promoción del nb300
		}
		else{
			host_sel = -1;
			host_ok = false;
			
			// Poner en blanco
			document.getElementById("costo1").innerHTML = "";
			document.getElementById("costo6").innerHTML = "";
			document.getElementById("costo12").innerHTML = "";
			document.getElementById("costo24").innerHTML = "";
			document.getElementById("costo36").innerHTML = "";
			document.getElementById("costo48").innerHTML = "";
			document.getElementById("costo60").innerHTML = "";

			mensaje('dvmensaje',
			'Selecciona tu plan o elige la opci&oacute;n "S&oacute;lo dominio"','rojo');
		}
		calculaTotal();		// Cambia el total
		verificaBoton();	// Activa/Desactiva el botón de siguiente
	}	

	/*****************************************************************************
	FUNCION:	dame Índice Dominios
	UTILIDAD:	Obtiene el índice, base cero, dela rreglo de costos de dominio
	ENTRADAS:
		id		  -> Valor que se buscará en el arreglo
	SALIDAS:	Índice base cero del valor.
	*****************************************************************************/
	function dameIndiceDominios(val){
		for(var j=0; j<costosDom.length; j++){
			if(costosDom[j][6] == val)
				return j;
		}	
		return -1;
	}

	/*****************************************************************************
	FUNCION:	dame Índice Host
	UTILIDAD:	Obtiene el índice, base cero, dela rreglo de costos de hosting
	ENTRADAS:
		id		  -> Valor que se buscará en el arreglo
	SALIDAS:	Índice base cero del valor.
	*****************************************************************************/
	function dameIndiceHost(val){
		for(var j=0; j<costosHost.length; j++){
			if(costosHost[j][0] == val)
				return j;
		}	
		return -1;
	}

	/*****************************************************************************
	FUNCION:	dame Costo plan
	UTILIDAD:	Regersa el costo del plan actualmente seleccionado, durante el tiempo
				de contratación indicado.
	ENTRADAS:	
		tiempo	-> Tiempo, en meses que se contratará
	ENTRADAS_EXTERNAS:
		host_sel-> host actualemente seleccionado (base cero)
	SALIDAS:	Costo de contratación del plan actual durante los meses indicados
	*****************************************************************************/
	function dameCostoPlan(tiempo){
		var costo;
		
		if(host_sel == -1) return;
		switch(tiempo){
		case 1:
			return parseInt(costosHost[host_sel][1]);
		case 6:
			return parseInt(costosHost[host_sel][2]);
		case 12:
			return parseInt(costosHost[host_sel][3]);
		case 24:
			return descuento(2); // dos años (24 meses)
		case 36:
			return descuento(3);
		case 48:
			return descuento(4);
		default:
			return descuento(tiempo/12);
		}
	}
	
	/*****************************************************************************
	FUNCION:	descuento
	UTILIDAD:	Calcula el precio con descuento del hosting según los años contratados
	ENTRADAS:	
		anios -> Número de años ques e desea contratar el host
	ENTRADAS EXTERNAS:
		costosHost[][]-> Arreglo con los costos de cada plan en cada tiempo
		host_sel ->	Plan actualemnete seleccionado
	SALIDAS:	precio con descuento del host
	*****************************************************************************/
	function descuento(anios){
		var costo_anual = parseFloat(costosHost[host_sel][3]);
		switch(anios){
		case 2:
			// Costo anual, por años, con descuento, redondeado hacia arriba
			return Math.round(costo_anual*2*0.95);
		case 3:
			return Math.round(costo_anual*3*0.90);
		case 4:
			return Math.round(costo_anual*4*0.85);
		default:
			return Math.round(costo_anual*anios*0.80);
		}
	}


	/*****************************************************************************
	FUNCION:	validar Dominio
	UTILIDAD:	verifica las condiciones adecuadas para hacer la consulta asíncrona
	ENTRADAS:	niguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function validarDominio(){
		var dom = dameDominio();
		var ext = dameExtension();
		var type = parseInt(getSelected(document.paso1.tipo));
		document.paso1.enviar.disabled="disabled";
		if(dom == "" || dom == -1) 
			mensaje('dvdisponibilidad','Escribe un dominio, por favor...','rojo');
		else if(ext == "" || ext == -1) 
			mensaje('dvdisponibilidad','Selecciona una extensi&oacute;n','rojo');
		else{
			if(escritoCorrecto(dom))
				result_validar_dominio(dom, ext, type);
			else
				mensaje('dvdisponibilidad',
					'<div align="left">'+
					'El dominio que has escrito es incorrecto:'+
					'<ul>'+
						'<li>Solo puede contener numeros, letras y guiones altos.</li>'+
						'<li>No puede haber dos giones seguidos.</li>'+
						'<li>No puede empezar o terminar en gui&oacute;n.</li>'+
						'<li>Debe tener al menos tres caracteres.</li>'+
						'</ul></div>','rojo'
				);
		}
	}
	
	/*****************************************************************************
	FUNCION:	escrito Correctos
	UTILIDAD:	verifica que un dominio esté escrito sintácticamente bien
	ENTRADAS:	
		dominio -> Cadena con el dominio sin extensión
	SALIDAS:	true, si está bien ecrita, false si no.
	*****************************************************************************/
	function escritoCorrecto(dominio) {
		// obtener la extension seleccionada
		var extension = dameExtension();
		var ereg = /\.mx/;
		
		
		if ( !ereg.test(extension) ) {
			if ( dominio.length < 3 ) return false;
		}
		
		if(/^[a-zA-Z0-9]+(\-[a-zA-Z0-9]|[a-zA-Z0-9])*$/.test(dominio))
			return true;
		else
			 return false;
	}	
	
	/*****************************************************************************
	FUNCION:	Verifica botón
	UTILIDAD:	En caso de estar adecuadas las condiciones, activa el botón de siguiente
	ENTRADAS:	
	ENTRADAS EXTERNAS:
		dominio_ok	-> Bandera indicando si el dominio está correcto
		host_ok		-> Bandera indicando si el hosting está correcto
	SALIDAS:	
	*****************************************************************************/
	function verificaBoton(){
		if(dominio_ok)
			if(host_ok){
				document.paso1.enviar.disabled = false;
				return;
			}
		document.paso1.enviar.disabled = true;
	}
	
	/*****************************************************************************
	FUNCION:	cambia Mensaje
	UTILIDAD:	Imprime mensaje de promoción para el nb600 en el div "dvmensaje"
	ENTRADAS:	
	ENTRADAS EXTERNAS:
		costoHost[][]	-> Arreglo de costos de los hosting
		host_sel		-> Índice del host actualmente seleccionado
	SALIDAS:	
	*****************************************************************************/
	function cambiaMensaje(){
		var nb300 = 
		"<div class='load'>Has seleccionado el plan nbPersonal, puedes "+
		"<b>incrementar al doble</b> la capacidad de almacenamiento y transferencia "+
		"si seleccionas el plan nbNegocio que cuesta <b>sólo $200 pesos anuales más</b>.</div>";

	if(costosHost[host_sel][0] == 11) //Plan nb300
		document.getElementById("dvmensaje").innerHTML = nb300;
	else
			document.getElementById("dvmensaje").innerHTML = "";
	}
	
	/*****************************************************************************
	FUNCION:	Incializa
	UTILIDAD:	Craga los valores de los divs en caso de traer valores previos al cargar esta página
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function inicializa(){
		var tipo = parseInt(getSelected(document.paso1.tipo));
		ocultaMultiAnual();
		cambiaCostosTipo();	
		if(tipo <4){
			liberaPlanes(true);	// Habilitar la capacidad de elegir plan
			cargaTipoHost();
			cambiaCostosHost();	// Cargar los costos del plan elegido, si lo hay
		}
		else{
			host_ok = true;
		}
		validarDominio();
		liberaPaso1();
		//calculaAhorro();	// Presenta el ahorro según el tipo seleccionado
	}

	function liberaPaso1(){
		document.paso1.dominio.disabled = false;
		document.paso1.extension.disabled = false;
		document.paso1.Validar.disabled = false;
		document.paso1.tipo[0].disabled = false;
		document.paso1.tipo[1].disabled = false;
		document.paso1.tipo[2].disabled = false;
		// Si aun no se sabe el tipo de la extensión
		if(typeof val_ext == 'undefined'){
			document.paso1.tipo[3].disabled = false;
			document.paso1.tipo[4].disabled = false;
		}
		else{
			// Si la extension es gratuita
			if(val_ext == 'gob.mx' || val_ext == 'edu.mx'){
				document.paso1.tipo[3].disabled = true;
				document.paso1.tipo[4].disabled = true;
			}
		}
	}

	/*****************************************************************************
	FUNCION:	liberar campos factura
	UTILIDAD:	Habilita o deshabilita los campos para solicitar factura
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function liberarCamposFactura(){
		// Si reqiere factura
		if(document.paso2.quieroFactura.checked){
			// Liberar después de buscar
			document.paso2.rfc.disabled = false;
			if(document.paso2.existe)
				document.paso2.existe.disabled = false;
			document.paso2.nombre_facturacion.disabled = false;
			document.paso2.dir_facturacion.disabled = false;
			document.paso2.ext_facturacion.disabled = false;
			document.paso2.int_facturacion.disabled = false;
			document.paso2.col_facturacion.disabled = false;
			document.paso2.ciudad_facturacion.disabled = false;
			document.paso2.estado_facturacion.disabled = false;
			document.paso2.localidad_facturacion.disabled = false;
			document.paso2.cp_facturacion.disabled = false;
			validarFacturaLlena();
		}
		// Si no requiere factura
		else{
			factura_ok = true;
			document.paso2.rfc.disabled = true;
			if(document.paso2.existe)
				document.paso2.existe.disabled = true;
			document.paso2.nombre_facturacion.disabled = true;
			document.paso2.dir_facturacion.disabled = true;
			document.paso2.ext_facturacion.disabled = true;
			document.paso2.int_facturacion.disabled = true;
			document.paso2.col_facturacion.disabled = true;
			document.paso2.ciudad_facturacion.disabled = true;
			document.paso2.estado_facturacion.disabled = true; 
			document.paso2.localidad_facturacion.disabled = true; 
			document.paso2.cp_facturacion.disabled = true;
			validarBoton2();
		}
		
	}
	
	/*****************************************************************************
	FUNCION:	activa Tipo Cliente
	UTILIDAD:	Habilita o deshabilita los campos de los datos del cliente, según 
				si es cliente registrado o no
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function activaTipoCliente(){
		// Si es cliente registrado
		if(document.paso2.cliente[0].checked){
			document.getElementById('div_cliente').innerHTML = '';
			// Habilitar cliente registrado
			document.paso2.email.disabled = false;
			document.paso2.clave.disabled = false;
			document.paso2.resend.disabled = false;
			document.paso2.verificar.disabled = false;
			// Deshabilitar registro de cliente		
			document.paso2.nombre.disabled = true;
			document.paso2.apellidos.disabled = true;
			document.paso2.email_n.disabled = true;
			document.paso2.email_n2.disabled = true;
			document.paso2.empresa.disabled = true;
			document.paso2.direccion.disabled = true;
			document.paso2.pais.disabled = true;
			document.paso2.estado.disabled = true;
			document.paso2.ciudad.disabled = true;
			document.paso2.cp.disabled = true;
			document.paso2.telefono.disabled = true;

			// Si es pago mensual, pedir datos, tarjeta
			if(document.paso2.cuentahabiente){
				if(document.paso2.tiempo.value == "1"){
					document.paso2.cuentahabiente.disabled = true;
					document.paso2.tarjeta.disabled = true;					
				}
			}
	
			validarCliente();
		}
		else{
			document.getElementById('validarPass').innerHTML = '';
			// Deshabilitar cliente registrado
			document.paso2.email.disabled = true;
			document.paso2.clave.disabled = true;
			document.paso2.resend.disabled = true;
			document.paso2.verificar.disabled = true;
			// Habilitar registro de cliente		
			document.paso2.nombre.disabled = false;
			document.paso2.apellidos.disabled = false;
			document.paso2.email_n.disabled = false;
			document.paso2.email_n2.disabled = false;
			document.paso2.empresa.disabled = false;
			document.paso2.direccion.disabled = false;
			document.paso2.pais.disabled = false;
			document.paso2.estado.disabled = false;
			document.paso2.ciudad.disabled = false;
			document.paso2.cp.disabled = false;
			document.paso2.telefono.disabled = false;
			document.paso2.es_reseller.value = "false";
			document.paso2.descuento.value=0;

			// Si es pago mensual, pedir datos, tarjeta
			if(document.paso2.cuentahabiente){
				if(document.paso2.tiempo.value == "1"){
					document.paso2.cuentahabiente.disabled = false;
					document.paso2.tarjeta.disabled = false;					
				}
			}

			es_reseller = false;			// Clientes nuevos no son resellers
			cargaTotalActual();				// Cargar montos para no resellers
			limpiaFormaCliente();			// Limpiar los datos del cliente
			verificaDatosCompletos();	// Deshabilitar los botones de siguiente
		}
	}
	
	function limpiaFormaCliente(){
		document.paso2.nombre.value = "";
		document.paso2.apellidos.value = "";
		document.paso2.email_n.value = "";
		document.paso2.email_n2.value = "";
		document.paso2.empresa.value = "";
		document.paso2.direccion.value = "";
		document.paso2.pais.options[0].selected = true;
		if(document.paso2.estado.options)
			document.paso2.pais.options[0].selected = true;
		else
			document.paso2.pais.value = "";
		document.paso2.ciudad.value = "";
		document.paso2.cp.value = "";
		document.paso2.telefono.value = "";
	}
	
	/*****************************************************************************
	FUNCION:	recordar Clave
	UTILIDAD:	Habilita o deshabilita los campos de los datos del cliente, según 
				si es cliente registrado o no
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function recordar_clave(){
		var email = document.paso2.email.value;
		
		if(email == "")
			mensaje('validarPass','Escribe un tu email para enviarte una clave nueva','rojo');
		else{
			mensaje('validarPass','Se está reenviando tu contraseña','amarillo');
			
			// Conexión asíncrona
			var myConn = new XHConn();
			// Si no se pudo conectar: avisar
			if (!myConn) 
			mensaje('validarPass',
					'XMLHTTP no se pudo cargar Intenta con un navegador mas reciente', 'rojo');
			// Acciones al regreso de la solcitud
			var peticion = function (oXML) {  
				// Letrero de búsqueda
				document.getElementById("validarPass").innerHTML = oXML.responseText;
			};
			// Llamar  a regenera pass
			myConn.connect("contratar_regenera_pass.php?email="+email,"POST", "", peticion);				
		}
	}
	
	/*****************************************************************************
	FUNCION:	Validar cliente
	UTILIDAD:	Verifica que el correo y password estén introducidos y que sean correctos
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function validarCliente(){
		var email = document.paso2.email.value;
		var pass = document.paso2.clave.value;
		var msg = "";
		
		user_ok = false;
		validarBoton2();

		if(email == ""){
			msg = "Necesitas introuducir tu email.";
		}
		else if(pass == ""){
			msg = "Necesitas introuducir tu password.";
		}
		
		if(msg == ""){
			// Letrero de búsqueda
			document.getElementById("validarPass").innerHTML = 
			'<div style="margin: 5px; padding: 3px; background-color: #FAEA32; ><img src="images/lod.gif"/>'+
			'<div style="border: 1px solid #EF9B52; padding: 5px; background-color: #fff;">Estamos busc&aacute;ndote en la base de datos</div></div>';
			
			// Conexión asíncrona
			var myConn = new XHConn();
			// Si no se pudo conectar: avisar
			if (!myConn)
			mensaje('validarPass',
			'XMLHTTP no se pudo cargar Intenta con un navegador mas reciente', 'rojo');
				// Acciones al regreso de la solcitud
				var peticion = function (oXML) {  
				// Letrero de búsqueda
				document.getElementById("validarPass").innerHTML = oXML.responseText;

				
				if(esVerde(oXML.responseText)){
					
					obtieneDescuento();
					validarReseller();
					buscaDatosCliente();
				}
				else{
					user_ok = email_ok = false;
					validarBoton2();
				}
			};
			// Llamar  a regenera pass
			myConn.connect("contratar_validar_usr.php?email="+email+"&pass="+pass,
						   "POST", "", peticion);				
			
		}
		else
			mensaje('validarPass',msg, 'rojo');
	}
	
/*****************************************************************************
	FUNCION:	Validar Reseller
	UTILIDAD:	Verifica si un cliente validado es reseller
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function validarReseller(){
		var email = document.paso2.email.value;
		var pass = document.paso2.clave.value;
		var es_mx = /\.mx/;
		
		// Conexión asíncrona
		var myConn = new XHConn();
		// Si no se pudo conectar: avisar
		if (!myConn)
		mensaje('validarPass',
		'XMLHTTP no se pudo cargar Intenta con un navegador mas reciente', 'rojo');
			// Acciones al regreso de la solcitud
			var peticion = function (oXML) {  
				if(oXML.responseText == "true"){
					document.paso2.es_reseller.value = "true";
					es_reseller = true;
					// Si es tipo 4 ó 5 (sólo dominio) y SI es dominio mx
					if( (contratacion_tipo == 4 || contratacion_tipo == 5) && es_mx.test(extension))
							// Mostrar forma de pago a crédito
							mostrarPagoCredito(false);
					else
						// Ocultar forma de pago a crédito
						mostrarPagoCredito(false);
				}
				else{
					document.paso2.es_reseller.value = "false";
					es_reseller = false;
					// No mostrar forma de pago a crédito
					mostrarPagoCredito(false);
				}
				cargaTotalActual();	// Una vez que sabemos si es reseller o no, cargamos los montos
				validarBoton2();		// una vez que cargamos los montos, liberamos el botón, si es posible
		};
		// Llamar  a regenera pass
		myConn.connect("contratar_validar_reseller.php?email="+email+"&pass="+pass,"POST","",peticion);				
	}
	
	/*****************************************************************************
	FUNCION:	validar Factura llena
	UTILIDAD:	Verifica que todos los campos estén completos.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function validarFacturaLlena(){
		
		document.paso2.rfc.value = trim_js(document.paso2.rfc.value);
		document.paso2.nombre_facturacion.value = trim_js(document.paso2.nombre_facturacion.value);
		document.paso2.dir_facturacion.value = trim_js(document.paso2.dir_facturacion.value);
		document.paso2.ext_facturacion.value = trim_js(document.paso2.ext_facturacion.value);
		document.paso2.int_facturacion.value = trim_js(document.paso2.int_facturacion.value);
		document.paso2.col_facturacion.value = trim_js(document.paso2.col_facturacion.value);
		document.paso2.ciudad_facturacion.value = trim_js(document.paso2.ciudad_facturacion.value);
		document.paso2.estado_facturacion.value = trim_js(document.paso2.estado_facturacion.value);
		document.paso2.cp_facturacion.value = trim_js(document.paso2.cp_facturacion.value);
		if(document.paso2.rfc.value != "")
		if(document.paso2.nombre_facturacion.value != "")
		if(document.paso2.dir_facturacion.value != "")
		if(document.paso2.ext_facturacion.value != "")
		if(document.paso2.col_facturacion.value != "")
		if(document.paso2.ciudad_facturacion.value != "")
		if(document.paso2.estado_facturacion.value != "")
		if(document.paso2.cp_facturacion.value != ""){
			//mensaje('result_rfc','La factura está completa','verde');			
			factura_ok = true;
			validarBoton2();
			return;
		}
		factura_ok = false;
		validarBoton2();
	}

	
	/*****************************************************************************
	FUNCION:	validar Botón 2
	UTILIDAD:	Verifica la validez de los campos del paso 2, para pasar al paso 3.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function validarBoton2(){
		if(plan_ok)
			if(dom_ok)
				if(user_ok)
					if(factura_ok)
						if(email_ok){
							document.paso2.siguiente.disabled = false;
							return;
						}
		document.paso2.siguiente.disabled = true;
	}
	
	/*****************************************************************************
	FUNCION:	Siguiente
	UTILIDAD:	Verifica que se aceptaron los terminos y condiciones
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function avanzar_paso_3(){
		if(plan_ok)
			if(dom_ok)
				if(user_ok)
					if(factura_ok)
						if(email_ok)
							if(document.paso2.terminos.checked == false)
							{
								alert("Para continuar seleccione la casilla de \n\"He leído y acepto el Contrato General de Servicios\"");
							}
							else{
								document.paso2.submit();
							}
		return;
	}
	
	
	/*****************************************************************************
	FUNCION:	carga Facturas anteriores
	UTILIDAD:	Solicita una búsqueda en la base de datos, de compras on factura anteriores del cliente
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargaFacturasAnteriores(){
		var cliente = parseInt(getSelected(document.paso2.cliente));
		var email = document.paso2.email.value;
		var pass = document.paso2.clave.value;
		var rfc;

		// Limpiar el div
		mensaje('result_rfc','','');
		if(!user_ok){
			mensaje('result_rfc',
					'No te has validado como cliente, o tus datos aún no están completos', 'rojo');
			document.paso2.quieroFactura.checked = false;
		}
		// Si requiere factura
		else if(document.paso2.quieroFactura.checked)
		{
			// Si es cliente registrado
			if(document.paso2.cliente[0].checked){
				cargaTotalActual();
				// Letrero de búsqueda
				document.getElementById("rfc_div").innerHTML = 
				'<input type="text"  class="input_text" name="rfc" disabled />'+
				'<img src="lod.gif" /> Buscando facturas anteriores';
				
				// Conexión asíncrona
				var myConn = new XHConn();
				// Si no se pudo conectar: avisar
				if (!myConn)
					mensaje('rfc_div', 
					'XMLHTTP no esta disponible. Intenta con un navegador mas reciente.','rojo');
				// Acciones al regreso de la solcitud
				var peticion = function (oXML) {  
					// Letrero de búsqueda
					document.getElementById("rfc_div").innerHTML = oXML.responseText;	
					// Si se cargó la lista desplegable
					if(!cargarFacturaDesdeLista()){
						// Liberar los campos para que se envíen
						liberarCamposFactura();
					}
				};
				// Llamar  a regenera pass
				myConn.connect("contratar_busca_rfc.php?email="+email+"&pass="+pass,
							   "POST", "", peticion);				
			}
		}
		cargaTotalActual();
		liberarCamposFactura();
	}
	
	/*****************************************************************************
	FUNCION:	busca datos cliente
	UTILIDAD:	Solicita una búsqueda en la base de datos de los datos del cliente.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function buscaDatosCliente(){
		var email = document.paso2.email.value;
		
		if(email != ""){
			// Letrero de búsqueda
			document.getElementById("div_cliente").innerHTML = 
			'<img src="lod.gif" /> Cargando';
			
			// Conexión asíncrona
			var myConn = new XHConn();
			// Si no se pudo conectar: avisar
			if (!myConn) 
				mensaje('div_cliente','XMLHTTP no esta disponible. Intenta con un navegador mas reciente.','rojo');
			// Acciones al regreso de la solcitud
			var peticion = function (oXML) {  
				// Separa la cadena recibida y cárgala
				cargaClienteDesdeCadena(oXML.responseText);
			};
			// Llamar  a regenera pass
			myConn.connect("contratar_carga_datos_cliente.php?email="+email,"POST", "", peticion);							
		}
	}

	/*****************************************************************************
	FUNCION:	carga cliente desde cadena
	UTILIDAD:	Recibe una cadena con los datos separados por signos mas (+) y los carga
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargaClienteDesdeCadena(cad){
		var arreglo = cad.split("+");

		if(arreglo[0] !=""){
			// Quitar la imagen de "buscando"
			document.getElementById("div_cliente").innerHTML = "";

			// Cargar los datos
			document.paso2.nombre.value = arreglo[0];
			document.paso2.apellidos.value = arreglo[1];	
			document.paso2.email_n.value = arreglo[2];
			document.paso2.email_n2.value = arreglo[2];
			document.paso2.empresa.value = arreglo[3];
			document.paso2.direccion.value = arreglo[4];
			seleccionaElemento(document.paso2.pais, arreglo[5]);
			//cambiarLlenadoEstado(arreglo[6]);
			document.paso2.estado.value = arreglo[6];
			document.paso2.ciudad.value = arreglo[7];
			document.paso2.cp.value = arreglo[8];
			document.paso2.telefono.value = arreglo[9];
			if(document.paso2.cuentahabiente){
				if(arreglo[11]!=''){
					document.paso2.cuentahabiente.disabled = true;
					document.paso2.tarjeta.disabled = true;
					document.paso2.cuentahabiente.value = arreglo[11];
					document.paso2.tarjeta.value = arreglo[12];
					user_ok = email_ok = true;
					validarBoton2();
				}
				else{
					document.paso2.cuentahabiente.value = '';
					document.paso2.tarjeta.value = '';
					document.paso2.cuentahabiente.disabled = false;
					document.paso2.tarjeta.disabled = false;
					email_ok = true;
					user_ok = false;
					validarBoton2();
				}
			}
			else{
				user_ok = email_ok = true;
				validarBoton2();
			}
		}
		else
			document.getElementById("div_cliente").innerHTML = "No se ha encontrado al cliente";				
	}

	/*****************************************************************************
	FUNCION:	validar Botón 2
	UTILIDAD:	Solicita la búsqueda del RFC actual en la base de datos.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargarDatosRFC(rfc){
		if(rfc != ""){
				// Letrero de búsqueda
				document.getElementById("datos_div").innerHTML = '<img src="lod.gif" />';
				
				// Conexión asíncrona
				var myConn = new XHConn();
				// Si no se pudo conectar: avisar
				if (!myConn) 
				mensaje('datos_div','XMLHTTP no esta disponible. Intenta con un navegador mas reciente.','rojo');
				// Acciones al regreso de la solcitud
				var peticion = function (oXML) {
						// Borrar la imagen de "buscando"
						document.getElementById("datos_div").innerHTML = "";
						// Cargar por medio de texto separado por punto y coma's
						cargarFacturaDesdeCadena(oXML.responseText);
				};
				// Llamar  a regenera pass
				myConn.connect("contratar_carga_rfc.php?rfc="+rfc,"POST", "", peticion);							
		}
	}

	/*****************************************************************************
	FUNCION:	carga Factura desde Cadena
	UTILIDAD:	Recibe una cadena separada por punto y comas (;) y la carga en los datos del RFC
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargarFacturaDesdeCadena(cad){
		var arreglo = cad.split(";");

		mensaje('result_rfc','','');
		if(arreglo[0] !=""){
			// Cargar los datos
			document.paso2.nombre_facturacion.value = arreglo[0];
			document.paso2.ciudad_facturacion.value = arreglo[2];
			seleccionaElemento(document.paso2.estado_facturacion, arreglo[3]);
			document.paso2.cp_facturacion.value = arreglo[4];
			document.paso2.col_facturacion.value = arreglo[6];
			document.paso2.ext_facturacion.value = arreglo[7];
			document.paso2.int_facturacion.value = arreglo[8];
			document.paso2.localidad_facturacion.value = arreglo[10];
			document.getElementById("msg_inf").innerHTML = "";
			if(arreglo[6]==""){
				document.paso2.dir_facturacion.value = arreglo[1];
				document.getElementById("msg_inf").innerHTML = "Favor de separar la calle, colonia y n&uacute;mero."
			}
			else{
				document.paso2.dir_facturacion.value = arreglo[9];
			}
			validarFacturaLlena();
		}
/*		else{
			mensaje('result_rfc','No se ha encontrado el RFC','rojo');
		}
*/	}
	
	/*****************************************************************************
	FUNCION:	selecciona Elemento
	UTILIDAD:	Marca como seleccionado el elemento indicado de la lista.
	ENTRADAS:
		list 		->	La lista de elementos
		estado	->	El valore de la lista que se seleccionará
	SALIDAS:	ninguna
	*****************************************************************************/
	function seleccionaElemento(list, estado){
		for(var i=0;i<list.length;i++){
			if(list.options[i].value==estado)
				list.options[i].selected = true;
		}
	}
	
	/*****************************************************************************
	FUNCION:	Pon botón validar
	UTILIDAD:	Llamada en caso de no poder cargar la lista e RFC's usados. Carga un campo
						input para introducir el RFC desde teclado y un checkbox para buscarlo si
						se cree que existe.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function ponBotonValidar(){
		var input = 
		'<input type="text"  class="input_text" name="rfc" onblur="cargarFacturaDesdeInput();validarFacturaLlena();" onkeypress="return validar_texto_rfc(event);" maxlength="13"/>';
		
		document.getElementById("rfc_div").innerHTML = input;
		
		document.paso2.rfc.focus();
	}
	
	/*****************************************************************************
	FUNCION:	carga Factura desde Input
	UTILIDAD:	Obtiene el valor actual del input RFC para buscarlo en la base de datos
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargarFacturaDesdeInput(){
		rfc = document.paso2.rfc.value;
		
		cargarDatosRFC(rfc);
	}
	
	/*****************************************************************************
	FUNCION:	 carga Factura desde Lista
	UTILIDAD:	Obtiene el valor actual del RFC selecionado (en una lista) para buscarlo 
						en la base de datos.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargarFacturaDesdeLista(){
		// Si el campo RFC es una lista
		if(document.paso2.rfc.options){
			// Obtener el valor del RFC seleccionado
			rfc = document.paso2.rfc.options[document.paso2.rfc.selectedIndex].value;
			// Si el valor no es vacío ("Otro RFC" seleccionado)
			if(rfc != "")
				// Cargar los datos
				cargarDatosRFC(rfc);
			// Sino
			else{
				// Cargar escritura a mano del RFC
				mensaje('result_rfc','','');
				ponBotonValidar();
				limpiarFormaFactura();
				validarFacturaLlena();
				liberarCamposFactura();
			}
			return true;
		}
		return false;
	}

	/*****************************************************************************
	FUNCION:	limpiar Forma Factura
	UTILIDAD:	Deja en blanco todos los campos refercentes al RFC y la factura.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function limpiarFormaFactura(){
		document.paso2.rfc.value = "";
		document.paso2.nombre_facturacion.value = "";
		document.paso2.dir_facturacion.value = "";
		document.paso2.ext_facturacion.value = "";
		document.paso2.int_facturacion.value = "";
		document.paso2.col_facturacion.value = "";
		document.paso2.ciudad_facturacion.value = "";
		document.paso2.localidad_facturacion.value = "";
		document.paso2.estado_facturacion.options[0].selected = true;
		document.paso2.cp_facturacion.value = "";
	}
	
	/*****************************************************************************
	FUNCION:	carga Total Actual
	UTILIDAD:	Calcula el total con base en los elementos seleccionados y si es 
						reseller o no y lo carga en los divs correspondientes.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargaTotalActual(){
		// Subtotal inicial es la suma de lso tres montos
		var subtotal;
		var monto_iva = 0, envio, total, costo_envio = 0, costo_postal = postal;
		var msgDesc = '';
		// Validar si es reseller y que no sea contratción de hosting
		var productoDesc = 0; 
		var descuento = document.paso2.descuento.value;
		if(es_reseller){
			subtotal = activacion;
			//-1 = Productos con precio diferente para reseller's
			if(producto_reseller!=producto){
				subtotal += producto_reseller;
				document.paso2.plan.value = document.paso2.producto.value = id_prod_reseller;
				//Reviza si se realizara un descuento por ser distribuidor
				productoDesc = producto_reseller;
				if (document.paso2.realizarDesc.value=='si'){
					descuentoDis = producto_reseller * descuento;
					subtotal = subtotal - descuentoDis;
					productoDesc = producto_reseller - descuentoDis;
					msgDesc = (descuento * 100);
				}
			}
			else
				subtotal += producto;
				//Reviza si se realizara un descuento por ser distribuidor
				productoDesc = producto;
				if (document.paso2.realizarDesc.value=='si'){
					descuentoDis = producto * descuento;
					subtotal = subtotal - descuentoDis;
					productoDesc = producto - descuentoDis;
					msgDesc = (descuento * 100);
				}
			if(dominio!=0)
				subtotal += dominio_reseller;
		}
		else{
			subtotal = producto + dominio + activacion;
			//Reviza si se realizara un descuento por ser distribuidor
			productoDesc = producto;
			if (document.paso2.realizarDesc.value=='si'){
				descuentoDis = producto * descuento;
				subtotal = subtotal - descuentoDis;
				productoDesc = producto - descuentoDis;
				msgDesc = (descuento * 100);
			}
		}
			
		
		// Si pidió factura o es un pago mensual (iva obligatorio)
		/*if(document.paso2.quieroFactura.checked || esMensualProducto == "1"){
			// Si fué solicitada, cobrar el envío
			if(document.paso2.quieroFactura.checked){
				// Obtener el tipo de envio
				//envio = getSelected(document.paso2.envio_facturacion);
				envio = 'p';
		
				// Si es postal
				if(envio == 'p'){
					// Sumarle el costo de envio postal, sólo si está bajo el umbral
					if(subtotal<umbral){
						subtotal += postal;
						costo_envio = postal;
					}
					else
						costo_envio = 0;
				}
				// Si es mensajeria
				else{
					// Agregarle el costo de envio al subtotal
					subtotal += estafeta;
					costo_envio = estafeta;
				}
			}
			// Sumar el iva al total
			monto_iva = subtotal*iva;
		}*/
		
		monto_iva = subtotal*iva;
		
		// Actualizar costo de envio
		document.paso2.costo_envio.value = costo_envio;

		// Actuializar el costo de envio postal
		if(subtotal>=umbral){
			costo_postal = 0;
		}
				
		total = subtotal + monto_iva;
		// Actualizar variable oculta con el monto total
		document.paso2.total.value = total;
		
		// Validar que sea reseller y que no sea contratación nueva de hosting
		if(es_reseller){
			if(producto_reseller!=0){
				// Cambiar los valores de los divs
				if(document.getElementById("total_producto"))
				document.getElementById("total_producto").innerHTML = 
				moneda_simbolo+Number(productoDesc).toLocaleString();
			}
			else{
				// Cambiar los valores de los divs
				if(document.getElementById("total_producto"))
				document.getElementById("total_producto").innerHTML = 
				moneda_simbolo+Number(productoDesc).toLocaleString();
			}
			if(dominio!=0){
				if(document.getElementById("total_dominio"))
					document.getElementById("total_dominio").innerHTML = 
					moneda_simbolo+Number(dominio_reseller).toLocaleString();
			}
		}
		else{
			// Cambiar los valores de los divs
			if(document.getElementById("total_producto"))
			document.getElementById("total_producto").innerHTML = 
			moneda_simbolo+Number(producto).toLocaleString();

			if(document.getElementById("total_dominio"))
				document.getElementById("total_dominio").innerHTML = 
				moneda_simbolo+Number(dominio).toLocaleString();
		}
		if(document.getElementById("descuentoElemen")){
			document.getElementById("descuentoElemen").innerHTML = '';
		}
		if (msgDesc!='' && msgDesc!=0){
			document.getElementById("descuentoElemen").innerHTML =' -' + msgDesc + '% de descuento';
		}
		if(document.getElementById("total_activacion"))
			document.getElementById("total_activacion").innerHTML = 
			moneda_simbolo+Number(activacion).toLocaleString();
		document.getElementById("total_envio").innerHTML = 
			moneda_simbolo+Number(costo_envio).toLocaleString();
		document.getElementById("subtotal").innerHTML = 
			moneda_simbolo+Number(Math.round(subtotal*100)/100).toLocaleString();
		document.getElementById("total_iva").innerHTML = 
			moneda_simbolo+Number(Math.round(monto_iva*100)/100).toLocaleString();
		document.getElementById("gran_total").innerHTML = 
			moneda_simbolo+Number(Math.round(total*100)/100).toLocaleString();
	}
	
	
	/*****************************************************************************
	FUNCION:	cambiar llenado estado
	UTILIDAD:	Cambia la forma en que se introduce el estado, según el país, y pone
						el valor seleccionado, si este es enviado (estado).
	ENTRADAS:	
		estado ->	Valor seleccionado de estado
	SALIDAS:	ninguna
	*****************************************************************************/
	function cambiarLlenadoEstado(estado){
		var pais = document.paso2.pais.options[document.paso2.pais.selectedIndex].value;
		
		// Si hay un país seleccionado
		if(pais!=""){
			// Imágen denpotando búsqueda
			document.getElementById("dvpais").innerHTML = '<img src="lod.gif" /> Cargando Estados';
			// Conexión asíncrona
			var myConn = new XHConn();
			// Si no se pudo conectar: avisar
			if (!myConn) 
				mensaje('dvpais',
								'XMLHTTP no esta disponible. Intenta con un navegador mas reciente.','rojo');
			// Acciones al regreso de la solcitud
			var peticion = function (oXML) {
					// Borrar la imagen de "buscando"
					document.getElementById("dvpais").innerHTML = oXML.responseText;
					//activaTipoCliente();		// Habilita o deshabilita el nuevo campo
					if(document.paso2.cliente[0].checked){
						if(document.paso2.estado)
							document.paso2.estado.disabled = true;
					}
					else{
						if(document.paso2.estado)
							document.paso2.estado.disabled = false;
					}
					verificaDatosCompletos();	// Habilita o deshabilita el botón de sig
			};
			// Llamar  a regenera pass
			myConn.connect("contratar_carga_estados.php?pais="+pais+"&estado="+estado,"POST", "", peticion);	
		}
	}
	
	/*****************************************************************************
	FUNCION:	verifica datos completos
	UTILIDAD:	Checa cada uno de los campos de los datos del cliente y si están 
						todos llenos, indica completado el usario.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function verificaDatosCompletos(){
		var vEstado = document.paso2.estado;
		var tel = document.paso2.telefono;
		var pais = document.paso2.pais;
		var cp = document.paso2.cp;
		var ciudad = document.paso2.ciudad;
		var dir = document.paso2.direccion;
		var empresa = document.paso2.empresa;
		var email = document.paso2.email_n;
		var email2 = document.paso2.email_n2;
		var app = document.paso2.apellidos;
		var nombre = document.paso2.nombre; 
		
		nombre.value = trim_js(nombre.value);
		document.paso2.empresa.value = trim_js(document.paso2.empresa.value);
		if(nombre.value != ""){
			alert2('div_cliente','');
			app.value = trim_js(app.value);
			if(app.value != ""){
				alert2('div_app','');
				email.value = trim_js(email.value);
				if(email.value != "" && validarEmail(email.value)){
					alert2('div_email','');
					email2.value = trim_js(email2.value);
					if(email.value == trim_js(email2.value)){
						alert2('div_email2','');
						//if(empresa.value != ""){
							if(true){ // empresa ya no es obligatorio
							if(document.paso2.cliente[1].checked)	emailOK();
							alert2('div_empresa','');
							dir.value = trim_js(dir.value);
							if(dir.value != ""){
								alert2('div_dir','');
								if(pais.options[pais.selectedIndex].value != ""){
									alert2('div_pais','');
									// Si el estado es una lista
									if(vEstado.options){
										if(vEstado.options[vEstado.selectedIndex].value!=""){
											alert2('div_estado','');
											ciudad.value = trim_js(ciudad.value);
											if(ciudad.value != ""){
												alert2('div_ciudad','');
												cp.value = trim_js(cp.value);
												if(cp.value != ""){
													alert2('div_cp','');
													tel.value = trim_js(tel.value);
													if(tel.value != ""){
														alert2('div_tel','');
														// Si es pago mensual, pedir datos de tarjeta
														if(document.paso2.cuentahabiente){
															if(document.paso2.tiempo.value == "1"){
																document.paso2.cuentahabiente.value = trim_js(document.paso2.cuentahabiente.value);
																if(document.paso2.cuentahabiente.value != ""){
																	alert2('dv_cuentahabiente','');
																	document.paso2.tarjeta.value = trim_js(document.paso2.tarjeta.value);
																	if(document.paso2.tarjeta.value != ""){
																		alert2('dv_tarjeta','');
																		user_ok = true;
																		validarBoton2();
																	}
																	else{
																		alert2('dv_tarjeta','Instroduce por favor el n&uacute;mero de tarjeta');
																		user_ok = false;
																		validarBoton2();
																	}
																}
																else{ 
																	alert2('dv_cuentahabiente','Introduce el nombre del cuentahabiente');
																	user_ok = false;
																	validarBoton2();
																}
															}
														}
														// Si no es pago mensual, ya no pedir datos
														else{
															user_ok = true;
															validarBoton2();
														}
														return;
													}//tel
													else{
														alert2('div_tel','Indica tu tel&eacute;fono');
														//tel.focus();
													}
												}//cp
												else{
												alert2('div_cp','Indica tu C&oacute;digo s&oacute;lo con numeros y letras');
												//cp.focus();
												}
											}//ciudad
											else{
												alert2('div_ciudad','Indica tu ciudad por favor');
												//ciudad.focus();
											}
										}	//estado
										else{
											alert2('div_estado','Indica tu estado por favor');
											//vEstado.focus();
										}
									} // fin "si estado es lista"
									// Si el estado es un input
									else if(trim_js(vEstado.value) != ""){
										vEstado.value = trim_js(vEstado.value);
										alert2('div_estado','');
										if(trim_js(ciudad.value) != ""){
											ciudad.value = trim_js(ciudad.value);
											alert2('div_ciudad','');
											if(trim_js(cp) != ""){
												alert2('div_cp','');
												if(trim_js(tel) != ""){
													alert2('div_tel','');
													user_ok = true;
													validarBoton2();
													return;
												}//tel
												else{
													alert2('div_tel','Indica tu tel s&oacute;lo con n&uacute;meros');
													//tel.focus();
												}
											}//cp
											else{
											alert2('div_cp','Indica tu C&oacute;digo s&oacute;lo con numeros y letras.');
											//cp.focus();
											}
										}// ciudad
										else{
											alert2('div_ciudad','Indica tu ciudad por favor');
											//ciudad.focus();
										}
									}//estado
									else{
										alert2('div_estado','Indica tu estado por favor');
										//vEstado.focus();
									}
								}// pais
								else{
									alert2('div_pais','Indica tu pa&iacute;s por favor');
									//pais.focus();
								}
							}// direccion
							else{
								alert2('div_dir','Indica tu direcci&oacute;n por favor');
								//dir.focus();
							}
						}// empresa
						else{
							alert2('div_empresa','Indica tu empresa por favor');
							//empresa.focus();
						}
					}// email confirm
					else{
						alert2('div_email2','El email y su confirmaci&oacute;n deben coincidir');
						//email2.focus();
					}
				}// email
				else{
					alert2('div_email','Introduce un email v&aacute;lido');
					//email.focus();
				}
			}// apellidos
			else{
				alert2('div_app','Indica tu apellido por favor');
				//app.focus();
			}
		}// nombre del cliente
		else{
			alert2('div_cliente','Indica tu nombre por favor');
			//nombre.focus();
		}
												
		user_ok = false;
		validarBoton2();		
	}
	
	/*****************************************************************************
	FUNCION:	regresa Paso 1
	UTILIDAD:	Envía los datos guardados en una forma oculta, hacia el paso 1, para que 
						al regresar tenga los datos previamente seleccionados.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function regresarPaso1(){
		document.paso1.submit();
	}
	
	/*****************************************************************************
	FUNCION:	cancelar
	UTILIDAD:	En caso de cancelar, redirige a la página principal.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cancelar(){
		document.location.href = 'index.php';
	}
	
	/*****************************************************************************
	FUNCION:	inicializar Paso 2
	UTILIDAD:	Carga datos inciales del paso 2, en caso de existir
	ENTRADAS:	
		estado ->	Valor incial del estado
	SALIDAS:	ninguna
	*****************************************************************************/
	function inicializarPaso2(estado){
		if(document.paso2.clave.value != "" && document.paso2.email.value != "")
			validarCliente();
		else
			cambiarLlenadoEstado(estado);
		cargaTotalActual();
	}
	
	/*****************************************************************************
	FUNCION:	mensaje
	UTILIDAD:	Carga el texto indicado, en el div indicado, con el color indicado
	ENTRADAS:	
		div		->  tag de tipo div (u otra, span, por ejemplo) donde se colocará el texto
		msg		->	Texto a insertar en formato HTML
		color	->	"verde", "rojo", o "amarillo" en formato texo.
	SALIDAS:	ninguna
	*****************************************************************************/
	function mensaje(div, msg, color){
		if(msg == "")
			document.getElementById(div).innerHTML = "";
		else if(color == "amarillo")
			document.getElementById(div).innerHTML = 
			'<div style="margin:5px; padding:3px; background-color:#FAEA32;" align="center"><div style="background-color:#FFF; border:1px solid #EF9B52; padding:5px;"><img src="images/lod.gif"/> '+msg+'</div></div>';	
		else if(color == "rojo")
			document.getElementById(div).innerHTML = 
			'<div style="margin:5px; padding:3px; background-color:#D02626;" align="center"><div style="background-color:#FFF; border:1px solid #D05616; padding:5px;">'+msg+'</div></div>';	
		else
			document.getElementById(div).innerHTML = 
			'<div style="margin:5px; padding:3px; background-color:#5FA83C;" align="center"><div style="background-color:#FFF; border:1px solid #9CD65E; padding:5px;">'+msg+'</div></div>';	
	}

	/*****************************************************************************
	FUNCION:	alert 2
	UTILIDAD:	Alternativa a la función anterior con otro estilo únicamente de advertencia
	ENTRADAS:	
		div		->  tag de tipo div (u otra, span, por ejemplo) donde se colocará el texto
		msg		->	Texto a insertar en formato HTML
		color	->	"verde", "rojo", o "amarillo" en formato texo.
	SALIDAS:	ninguna
	*****************************************************************************/
	function alert2(div, msg){
		if(msg == "")
			document.getElementById(div).innerHTML = "";
		else
			document.getElementById(div).innerHTML = 
			'<div class="rojo" align="center">*'+msg+'</div>';	
	}

	/*****************************************************************************
	FUNCION:	Validar Email
	UTILIDAD:	Parsea una cadena para validar que tenga formato correcto de email
	ENTRADAS:	
		email	-> Cadena con el email
	SALIDAS:	ninguna
	*****************************************************************************/
	function validarEmail(email)
	{
		if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email))
			return (true);
		else 
			return (false);
	}
	
	/*****************************************************************************
	FUNCION:	libera si no existe Email
	UTILIDAD:	Solicita la búsqueda de un email en la base de datos y marca como 
						correcto en caso de que no exista tal correo
	ENTRADAS:	
		email	-> Cadena con el email a buscar
	SALIDAS:	ninguna
	*****************************************************************************/
	function liberaSiNoExisteMail(email){
		// Conexión asíncrona
		var myConn = new XHConn();
		// Si no se pudo conectar: avisar
		if (!myConn) 
		mensaje('validarPass','XMLHTTP no esta disponible. Intenta con un navegador mas reciente.',
						'rojo');
		// Acciones al regreso de la solcitud
		var peticion = function (oXML) {
				// Borrar la imagen de "buscando"
				if(oXML.responseText == "false"){
					// Usuario correcto
					email_ok = true;
					mensaje('validarPass','','');
				}
				else{
					email_ok = false;
					mensaje('validarPass','El email introuducido ya existe','rojo');
				}
				validarBoton2();
				return;
		};
		// Llamar  a regenera pass
		myConn.connect("contratar_existe_email.php?email="+email,"POST", "", peticion);							
	}
	
	/*****************************************************************************
	FUNCION:	email OK
	UTILIDAD:	Verifica que todo esté correcto con el email para seguir adelante.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function emailOK(){
		// Si no está vació el campo mail
		if(trim_js(document.paso2.email_n.value) != "" && trim_js(document.paso2.email_n2.value) != ""){
			// Si son iguales los dos cmapos
			if(document.paso2.email_n2.value == document.paso2.email_n.value){
				// Limpiar mensaje de error, de "el email no coincide"
				mensaje('validarPass','','');
				// Si el email es válido sintácticamente
				if(validarEmail(document.paso2.email_n2.value)){
					// Limpiar mensaje de error, de "el email no es válido"
					mensaje('validarPass','','');
					// Buscar y liberar si no existe el emal escrito
					liberaSiNoExisteMail(document.paso2.email_n2.value);
					return;
				}// si el mai es válido
			}
		}
		email_ok = false;
		validarBoton2();
	}
	
	/*****************************************************************************
	FUNCION:	carga Productos
	UTILIDAD:	Busca en la base de datos los productos del tipo indicado y los 
						carga en un div llamado div_productos
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargaProductos(){
		var cont = 0;
		// Buscar el tipo actual seleccionado
		var tipo = document.ppal.tipo.options[document.ppal.tipo.selectedIndex].value;
		var contenido = '<select name="plan" id="plan" onChange="cargaTiempos()" style="width:250px;">\n';
		var sel;
		
		for(var i=0; i<productos[1].length;i++){
			sel = '';
			if(productos[1][i] == tipo){
				if(prod == productos[0][i]) sel = 'selected';
				contenido += '<option value="'+productos[0][i]+'" '+sel+'>'+
				productos[2][i]+'</option>\n';
			}
		}	
		contenido += '</select>';
		
		document.getElementById('div_productos').innerHTML = contenido;
		cargaTiempos();
		
	}
	
	/*****************************************************************************
	FUNCION:	carga Tiempos
	UTILIDAD:	Con base al prodcuto seleccionado, carga los tiempos en los que se 
						puede contratar
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargaTiempos() {		
		// Buscar el tipo actual seleccionado
		var plan = document.ppal.plan.options[document.ppal.plan.selectedIndex].value;
		var contenido = '<table width="100%" border="0" cellspacing="0">\n';
		
		for(var i=0; i<productos[1].length;i++){
			// Si este es el plan del que quiero los datos
			if(productos[0][i] == plan){
				// Si hay costo de activación (costo único) o el producto es gratuito
				if(productos[7][i] != 0){
					contenido += convierteEnCheck(productos[2][i], productos[7][i], productos[9][i]);
				}
				// Sino, (si hay varios costos)
				else{
					// Si tiene costo anual
					if(productos[3][i] != 0)
						contenido += 
						convierteEnRadio(productos[2][i], productos[3][i], 
						'un a&ntilde;o', 12,productos[9][i]);
					// Si tiene costo bianual
					if(productos[4][i] != 0)
						contenido += convierteEnRadio(productos[2][i], productos[4][i], 
						'dos a&ntilde;os', 24,productos[9][i]);
					// Si tiene costo semestral
					if(productos[5][i] != 0)
						contenido += convierteEnRadio(productos[2][i], productos[5][i], 
						'seis meses', 6,productos[9][i]);
					// Si tiene costo mensual
					if(productos[6][i] != 0)
						contenido += convierteEnRadio(productos[2][i], productos[6][i], 
						'un mes', 1, productos[9][i]);
								
				}
				
				// Validar si necesita información extra
				solicitaExtra(plan,productos[8][i]);
				
				break; // Terminar el ciclo
			}
		}
		
		contenido += '</table>';
		
		document.getElementById('div_tiempos').innerHTML = contenido;
		
		// si existe el checkbox, marcarlo
		if ( document.getElementById('check') ) {
			document.getElementById('check').checked = "checked";
			document.getElementById('enviar').disabled="";
		}
	}

	/*****************************************************************************
	FUNCION:	carga Tiempos 2
	UTILIDAD:	Con base al prodcuto seleccionado, carga los tiempos en los que se 
						puede contratar.
						Se diferencia de "carga Tiempos 1" en que no toma el valor de "activación"
						como pago único.
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargaTiempos2(){		
		// Buscar el tipo actual seleccionado
		var plan = document.ppal.plan.options[document.ppal.plan.selectedIndex].value;
		var contenido = '<table width="100%" border="0" cellspacing="0">\n';
		var lenght = productos[1].length;
		
		for(var i=0; i<lenght;i++){
			// Si este es el plan del que quiero los datos
			if(productos[0][i] == plan){
					// Si tiene costo bianual
					if(productos[4][i] != 0)
						contenido += 
						convierteEnRadio(productos[2][i], productos[4][i], 
						'dos a&ntilde;os', 24,productos[9][i]);
					// Si tiene costo anual
					if(productos[3][i] != 0)
						contenido += 
						convierteEnRadio(productos[2][i], productos[3][i],
						'un a&ntilde;o', 12, productos[9][i]);
					// Si tiene costo semestral
					if(productos[5][i] != 0)
						contenido += 
						convierteEnRadio(productos[2][i], productos[5][i], 
						'seis meses', 6, productos[9][i]);
					// Si tiene costo mensual
					if(productos[6][i] != 0)
						contenido += 
						convierteEnRadio(productos[2][i], productos[6][i], 
						'un mes', 1, productos[9][i]);		
					// Si hay costo de activación, inidicarlo
					if(productos[7][i] != 0)
						contenido += agregaCostosActivacion(productos[7][i], productos[9][i]);
					// Validar si necesita información extra
					solicitaExtra(plan,productos[8][i]);
					
					break; // Terminar el ciclo
				}				
			}
		
		contenido += '</table>';
		
		document.getElementById('div_tiempos').innerHTML = contenido;
		document.ppal.tiempo[0].checked = true;	// Marcar la primera opción
}


	/*****************************************************************************
	FUNCION:	solicitaExtra
	UTILIDAD:	Con base al prodcuto seleccionado, carga los tiempos en los que se 
						puede contratar
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function solicitaExtra(idproducto,necesita){		
		var ex;
		var prod = parseInt(idproducto);
		
		if( prod != 133 && prod != 58 && prod != 144){
			ex = ' ' + 
			'<table width="100%" border="0" cellspacing="0">' +
			'	<tr bgcolor="#eeeeee" class="style1">' +
			'		<td width="442" align="left" class="style1" colspan="4" >' +
			'		Selecciona aqu&iacute; el dominio al que aplicaremos tu compra: </td>' +
			'	</tr>' +
			'	<tr bgcolor="#eeeeee" class="style1">' +
			'		<td align="left" class="sty" width="125" valign="bottom">' +
			'			Deseo aplicar mi compra al siguiente dominio:</td>' +
			'		<td align="left" class="sty" valign="bottom">http://www.</td>' +
			'		<td align="left" class="sty" valign="bottom">' +
			'			<input name="txtExtra" id="txtExtra" type="text"  class="input_text" maxlength="500" onkeydown="liberaBotonPpal()" onkeyup="valor_a_input(\'txtExtra\',\'cmbExtra\',\'extra\')" value="'+extra+'" />' + 
			'			<input type="hidden" name="extra" id="extra" value="'+extra+'" />' + 
			'		</td>' +
			'		<td align="left" class="sty" width="100" valign="bottom">.' +
						crea_select_extensiones('cmbExtra','valor_a_input(\'txtExtra\',\'cmbExtra\',\'extra\')') +
			'		</td>' +
			'	</tr>' +
			'</table>';
		}
		else{
			redireccion = 'todo';
			if ( prod == 133 ) {
				redireccion = 'mx'; }
			if ( prod == 144 ) {
				redireccion = 'tld'; }
			ex = '' +
			'<table width="100%" border="0" cellspacing="0">' +
			'	<tr bgcolor="#eeeeee" class="style1">' +
			'		<td width="442" align="left" class="style1" colspan="4" >' +
			'			Selecciona aqu&iacute; el dominio al que aplicaremos tu compra: </td>' +
			'	</tr>' + 
			'	<tr bgcolor="#eeeeee" class="style1">' +
			'		<td align="left" class="sty" width="125">' +
			'			Deseo que el dominio:</td>' +
			'		<td align="right" class="sty" valign="bottom">www.</td>' +
			'		<td align="left" class="sty" valign="bottom">' +
			'			<input name="txtDominio2" id="txtDominio2" type="text"  class="input_text" maxlength="500" onkeydown="liberaBotonPpal()" onkeyup="valor_a_input(\'txtDominio2\',\'cmbDominio2\',\'dominio2\')" value="'+dominio2+'" />' +
			'			<input name="dominio2" id="dominio2" type="hidden" />' +
			'		</td>' +
			'		<td align="left" class="sty" width="100" valign="bottom">.' +
						crea_select_extensiones('cmbDominio2','valor_a_input(\'txtDominio2\',\'cmbDominio2\',\'dominio2\')',redireccion) +
			'		</td>' +
			'	</tr>' + 
			'	<tr bgcolor="#eeeeee" class="style1">' +
			'		<td align="left" class="sty">' +
			'		Se redirija a la direcci&oacute;n:</td>' +
			'		<td align="right" class="sty" valign="bottom">http://www.</td>' +
			'		<td align="left" class="sty" colspan="2" valign="bottom">' +
			'			<input name="extra" id="extra" type="text" class="input_text" maxlength="500" onkeydown="liberaBotonPpal();" value="'+extra+'" />'+
			'		</td>' + 
			'	</tr>' +
			'</table>';
		}
		
		if(necesita == 'si')
			document.getElementById('dv_extra').innerHTML = ex;
		else
			document.getElementById('dv_extra').innerHTML = '';
	}
	
	/*****************************************************************************
	FUNCION:	valor_a_input
	UTILIDAD:	modifica el valor de la informacion que se enviara, segun lo que escribe el usuario
	ENTRADAS:	texto: id del textbox con el que se formara la cadena
				combo: combobox con el que se formara la cadena
				destino: id del input
	SALIDAS:	nunguna
	*****************************************************************************/
	function valor_a_input(texto,combo,destino)
	{
		var valor = "";
		valor += document.getElementById(texto).value + document.getElementById(combo).value;
		document.getElementById(destino).value = valor;
		liberaBotonPpal();
	}
	
	/*****************************************************************************
	FUNCION:	crea_select_extensiones
	UTILIDAD:	crea el cuadro combinado con todas las extensiones posibles
	ENTRADAS:	id: id que tendra el combo
				evento: el nombre de la funcion que ejecutara el evento onchange
				rediraccion: indica si es redireccion MX o TLD para decidir los elementos a imprimir
	SALIDAS:	la cadena con el HTML para imprimir el combo de extensiones
	*****************************************************************************/
	function crea_select_extensiones(id,evento,redireccion)
	{
		var extensiones = ' ' +
		'<select name="'+id+'" id="'+id+'" onchange="'+evento+'">';
			if ( redireccion != 'tld' ) {
				extensiones += '' +
				'<option value=".mx">mx</option>' +
				'<option value=".com.mx" selected="selected">com.mx</option>' +
				'<option value=".net.mx">net.mx</option>' +
				'<option value=".org.mx">org.mx</option>' +
				'<option value=".edu.mx">edu.mx</option>' +
				'<option value=".gob.mx">gob.mx</option>';
			}
			if ( redireccion != 'mx' ) {
				extensiones += '' +
				'<option value=".com">com</option>' +
				'<option value=".net">net</option>' +
				'<option value=".org">org</option>' +
				'<option value=".tv">tv</option>' +
				'<option value=".info">info</option>' +
				'<option value=".ws">ws</option>' +
				'<option value=".us">us</option>' +
				'<option value=".cc">cc</option>' +
				'<option value=".biz">biz</option>' +
				'<option value=".name">name</option>' +
				'<option value=".eu">eu</option>' +
				'<option value=".me">me</option>' +
				'<option value=".in">in</option>' +
				'<option value=".asia">asia</option>';
			}
		'</select>';
		return (extensiones);
	}
	
	/***********************************************************************************************
	FUNCION:		valida_redireccion
	DESCRIPCION:	verifica que la redireccion sea correcta
	PARAMETROS:		redir: redireccion a validar
	SALIDAS:		true: si es valido el dominio; false si no es correcto
	***********************************************************************************************/
	function valida_redireccion(redir)
	{
		//var ereg = /^[A-Za-z0-9\-]+\.[A-Za-z]{2,4}(\.[A-Za-z]{2})?[\/[A-Za-z0-9\-]+]*$/;
		var ereg = /^[A-Za-z0-9\-]+\.[A-Za-z]{2,4}(\.[A-Za-z]{2})?(\/[A-Za-z0-9\-_\.]+)?$/;
		return ( ereg.test(redir) );
	}
	/***********************************************************************************************
	FUNCION:		valida_dominio
	DESCRIPCION:	verifica que el dominio tenga una sintaxis correcta
	PARAMETROS:		dominio: dominio a validar
	SALIDAS:		true: si es valido el dominio; false si no es correcto
	***********************************************************************************************/
	function valida_dominio(dominio)
	{
		//var ereg = /^[A-Za-z0-9\-]+\.[A-Za-z]{2,4}(\.[A-Za-z]{2})?[\/[A-Za-z0-9\-]+]*$/;
		var ereg = /^[A-Za-z0-9\-]+$/;
		return ( ereg.test(dominio) );
	}
	
	/*****************************************************************************
	FUNCION:	convierte en check
	UTILIDAD:	Convierte los datos en un renglón con texto y un checkbox
	ENTRADAS:	
		prod	->	Nombre del producto
		costo ->	Costo del producto
	SALIDAS:	cadena con renglón y checkbox
	*****************************************************************************/
	function convierteEnCheck(prod, costo, iso_moneda){
		var sel = '';
		var total;
		if(chk != ''){
			sel = 'checked';
			document.ppal.enviar.disabled = false;
		}
		
		total = costo_moneda(costo, iso_moneda);
			
		return '<tr bgcolor="#eeeeee" class="style1">'+
			'<td align="left" class="sty" >'+
			'<input type="checkbox" onClick="liberaBotonPpal()" name="check" id="check" '+sel+'/>'+
			'Contratar '+prod+'</td>'+
			'<td align="right">'+total+'</td>'+
			'</tr>';
	}
	
	function costo_moneda(costo, iso_moneda){
		var total;
		
		switch(iso_moneda){
			// Dólares
			case 'USD':
				total = 'USD $'+Number(costo).toLocaleString();
				break;
			case 'ECU':
				// Euros
				total = '&euro;'+Number(costo).toLocaleString();
				break;
			default:
				// Pesos
				total = '$'+Number(costo).toLocaleString();
		}
		
		return total;
	}

	/*****************************************************************************
	FUNCION:	agreca costos activación
	UTILIDAD:	Convierte los datos en un renglón con texto y un checkbox
	ENTRADAS:	
		prod	->	Nombre del producto
		costo ->	Costo del producto
	SALIDAS:	cadena con renglón y checkbox
	*****************************************************************************/
	function agregaCostosActivacion(costo, iso_moneda){
		var 	total = costo_moneda(costo, iso_moneda);

		return '<tr bgcolor="#eeeeee" class="style1">'+
			'<td align="left" class="sty" >'+
			'*Aplican costos de activaci&oacute;n</td>'+
			'<td align="right">'+total+'</td>'+
			'</tr>';
	}


	/*****************************************************************************
	FUNCION:	convierte en check
	UTILIDAD:	Convierte los datos en un renglón con texto y un radio button
	ENTRADAS:
		prod		->	Nombre del producto
		costo 	->	Costo del producto
		tiempo	->	Tiempo a contratar en formato cadena
	SALIDAS:	cadena con renglón y radio button
	*****************************************************************************/
	function convierteEnRadio(prod, costo, tiempo, tiempo_numero, iso_moneda){
		var sel = '';
		var total;
		
		if(time != '' )
			if(tiempo_numero == parseInt(time) ){
				sel = 'checked';
				document.ppal.enviar.disabled = false;
			}
			
		total = costo_moneda(costo, iso_moneda);


		return '<tr bgcolor="#eeeeee" class="style1">'+
			'<td align="left" class="sty" >'+
			'<input type="radio" name="tiempo" value="'+tiempo_numero+'" '+
			'onClick="liberaBotonPpal()" '+sel+' id="'+tiempo_numero+'" />'+
			'<label for="'+tiempo_numero+'">Contratar '+prod+' por '+tiempo+'</label></td>'+
			'<td align="left">'+total+'</td></tr>';
	}
	
	/*****************************************************************************
	FUNCION:	inicializa Principal
	UTILIDAD:	Carga datos inciales para el paso 1 principal 
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function inicializaPpal(){
			cargaProductos();
			mensaje('div_loading','','');		// Borrar el mensaje de "cargando"
	}
	
	/*****************************************************************************
	FUNCION:	calcula Total Principal
	UTILIDAD:	Calcula el monto a pagar con base en los elementos seleccionados
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function liberaBotonPpal(){
		// Si requiere info extra
		if(document.ppal.extra)
			// Si no ha introducido la información
			if(document.ppal.extra.value == '' )
				return;
		
		// Si existe el checkbox
		if(document.ppal.check){
			if(document.ppal.check.checked)
				document.ppal.enviar.disabled = false;
			else
				document.ppal.enviar.disabled = true;
		}
		else{
			// Si no hay ningun radio elegido, elegir el primero
			if(noHayElegido(document.ppal.tiempo))			
				document.ppal.tiempo.checked = true;
			document.ppal.enviar.disabled = false;
		}
	}	
	
	function noHayElegido(radioCtrl){		
		for(var j=0;j<radioCtrl.length;j++)
        	if(radioCtrl[j].checked) 			
			 	return false;
				
		for (var i=0;i<radioCtrl.length;i++)
			if(radioCtrl[i].checked) 			
					return false;
			else{			
				radioCtrl[i].checked = true;			
				return false;
			}
		return true;
	}
	
	/*****************************************************************************
	FUNCION:	requisitos Especiales
	UTILIDAD:	Muestra requisitos especiales para dominios mx
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function requisitosEspeciales(dominio, ext, color, tipo){
		var msg;
		var dom = dominio+'.'+ext;
		
		if(ext== "net.mx" || ext == "org.mx" || ext=="edu.mx" ||ext=="gob.mx" ||ext=="eu"){
			switch(tipo){
				case 1:
				case 4:
					if(color == 'verde')
						mensaje('dvdisponibilidad',
										'El dominio '+dom+' est&aacute; disponible para ser registrado.<br>'+
										'<b>Importante:</b> Aplican requisitos especiales'+
										'<a href="requisitos.php#'+ext+'" class="orangelink" target="_blank"> '+
										'Ver m&aacute;s</a>',
										color);
					else
						mensaje('dvdisponibilidad',
										'El dominio '+dom+' <b>no</b> est&aacute; disponible para ser registrado.<br>'+
										'<b>Importante:</b> Aplican requisitos especiales'+
										'<a href="requisitos.php#'+ext+'" class="orangelink" target="_blank"> '+
										'Ver m&aacute;s</a>',
										color);
				break;
			}
		}
	}
	
	/*****************************************************************************
	FUNCION:	mostrarPagoCredito
	UTILIDAD:	Muestra una opción para adquirir a crédito el dominio
	ENTRADAS:	
		mostrar	-> Bandera true false que indica si se mostrará o se quitará la ocpión
	SALIDAS:	ninguna
	*****************************************************************************/
	function mostrarPagoCredito(mostrar){
		if(mostrar){
			document.getElementById("div_pago_credito").innerHTML = 
			'<img src="../images_es/bullet_nuevo.gif" width="41" height="14" />'+
			'<input type="checkbox" name="credito" value="credito" />'+
			'Comprar a cr&eacute;dito (30 d&iacute;as)';
		}
		else{
			document.getElementById("div_pago_credito").innerHTML = '';			
		}
	}
	
	/*****************************************************************************
	FUNCION:	cargaTipoHost
	UTILIDAD:	Dependiendo del tipo de host, carga los planes con ese tipo en una
		lista desplegable, en contratar_paso1.php
	ENTRADAS:	ninguna
	SALIDAS:	ninguna
	*****************************************************************************/
	function cargaTipoHost(){
		var selTipo = document.paso1.tipoHost;
		if(selTipo){
			var tipo = selTipo[selTipo.selectedIndex].value;
			var selHost = document.paso1.plan;
			var opt;
	
			// Vaciar el select actual
			selHost.length = 0;
	
			// Agregar al select todos los hotings con ese tipo
			for(var i=0;i<costosHost.length;i++){
				if(costosHost[i][6] == tipo){
					opt = document.createElement('option');
					opt.text = costosHost[i][7];
					opt.value = costosHost[i][0];
					
					try {
						selHost.add(opt, null); // Para todos menos IE
					}
					catch(ex) {
						selHost.add(opt); // IE 
					}	
				}
			}
			// Cargar los costos del primer plan q aparece
			cambiaCostosHost();
		}
	}
	
	/*****************************************************************************
	FUNCION:	obtieneDescuento
	UTILIDAD:	Obtiene el porcentaje de descueto al que se hace acreedor el cliente
		
	ENTRADAS:	ninguna
	SALIDAS:	% de descuento
	*****************************************************************************/
	function obtieneDescuento(){
		var email = document.paso2.email.value;
		
		if(email != ""){
			// Letrero de búsqueda
			document.getElementById("div_cliente").innerHTML = 
			'<img src="lod.gif" /> Cargando';
			
			// Conexión asíncrona
			var myConn = new XHConn();
			// Si no se pudo conectar: avisar
			if (!myConn) 
				mensaje('div_cliente','XMLHTTP no esta disponible. Intenta con un navegador mas reciente.','rojo');
			// Acciones al regreso de la solcitud
			var peticion = function (oXML) {  
				// Separa la cadena recibida y cárgala
				document.paso2.descuento.value = oXML.responseText;
				total_descuento = parseFloat(document.paso2.descuento.value) + mas_descuento;
				document.paso2.descuento.value = total_descuento;
			};
			// Llamar  a regenera pass
			myConn.connect("contratar_obtiene_descuento.php?email="+email,"POST", "", peticion);							
		}
	}
	
	/*****************************************************************************
	FUNCION:	al cargar
	UTILIDAD:	Obtiene los datos necesarios cuando termina de cargar la página
						para el servidor dedicado que se utlizara.
		
	ENTRADAS:	ninguna
	SALIDAS:	Datos necesarios
	*****************************************************************************/
	function alcargar(){
		document.frm_opc.ser_sop["0"].checked = true;
		document.frm_opc.ser_pnl["3"].checked = true;
		calcular();
	}
	
	/*****************************************************************************
	FUNCION:	calcular
	UTILIDAD:	Obtiene los datos necesarios cuando termina de cargar la página
						para el servidor dedicado que se utlizara.
		
	ENTRADAS:	ninguna
	SALIDAS:	Datos necesarios
	*****************************************************************************/
	function calcular(){
		var cadena;
		var total=0;
		var tds_periodicidad = document.getElementById('dts_periodicidad').value;
		
		document.getElementById("siguiente").disabled=true;
		document.getElementById("serivor").innerHTML= "USD $ " + costo_servidor;
		document.getElementById("instalacion").innerHTML= "USD $ " + instalacion;
		if (document.frm_opc.ser_sop["0"].checked == true){
			document.frm_opc.ser_pnl["0"].disabled = false;
			document.frm_opc.ser_pnl["1"].disabled = false;
			document.frm_opc.ser_pnl["2"].disabled = true;
			document.frm_opc.ser_pnl["3"].disabled = true;
			cadena=document.frm_opc.ser_sop["0"].value;
			if (document.frm_opc.ser_pnl["2"].checked==true || document.frm_opc.ser_pnl["3"].checked==true){
				document.frm_opc.ser_pnl["0"].checked = true;
			}
		}
		else{
			document.frm_opc.ser_pnl["0"].disabled = true;
			document.frm_opc.ser_pnl["1"].disabled = true;
			document.frm_opc.ser_pnl["2"].disabled = false;
			document.frm_opc.ser_pnl["3"].disabled = false;
			if(document.frm_opc.ser_sop["1"].checked == true){
				cadena=document.frm_opc.ser_sop["1"].value;
			}
			else{
				cadena=document.frm_opc.ser_sop["2"].value;
			}
			if (document.frm_opc.ser_pnl["0"].checked==true || document.frm_opc.ser_pnl["1"].checked==true){
				document.frm_opc.ser_pnl["2"].checked = true;
			}
		}
		var sistope =cadena.split('|');
		
		if (document.frm_opc.ser_pnl["0"].checked==true){
			cadena=document.frm_opc.ser_pnl["0"].value;
		}
		
		if (document.frm_opc.ser_pnl["1"].checked==true){
			cadena=document.frm_opc.ser_pnl["1"].value;
		}
		
		if (document.frm_opc.ser_pnl["2"].checked==true){
			cadena=document.frm_opc.ser_pnl["2"].value;
		}
		
		if (document.frm_opc.ser_pnl["3"].checked==true){
			cadena=document.frm_opc.ser_pnl["3"].value;
		}
		var panel =cadena.split('|');
		switch(Number(tds_periodicidad)){
			case 1:
				var cargo = "Cargo mensual";
			break;
			case 6:
				var cargo = "Cargo semestral";
			break;
			case 12:
				var cargo = "Cargo anual";
			break;
		}
		sistope[0] = Number(sistope[0]) * Number(tds_periodicidad);
		panel[0] = Number(panel[0]) * Number(tds_periodicidad);
		total=Number(sistope[0])+Number(panel[0])+Number(costo_servidor)+Number(instalacion);
		document.getElementById("InfSO").innerHTML= "Sistema operativo:&nbsp;"+sistope[2]+"&nbsp;("+cargo+")";
		document.getElementById("Infpanel").innerHTML= "Panel de contro:&nbsp;"+panel[2]+"&nbsp;("+cargo+")";
		document.getElementById("dviSO").innerHTML= "USD $ " + sistope[0];
		document.getElementById("dvipanel").innerHTML= "USD $ " + panel[0];		
		document.getElementById("dvitotal").innerHTML= "USD $ " + total;
		document.getElementById("total").value = total;
		document.getElementById("panel").value = panel[1];
		document.getElementById("SO").value = sistope[1];

		if (dominio == true){ 
			document.getElementById("siguiente").disabled=false;
		}
	}
	/*****************************************************************************
	TERMINA FUNCION
	*****************************************************************************/
	
	function validarDominioServer(){
		var valDom = document.frm_opc.dextra.value;
		var arrDom = '';

		if(valDom != ""){
			arrDom = valDom.split('.');
			if(arrDom[1]){
					if(arrDom[1].length<2){
						mensaje('div_msg','Por favor ingresa una extenci&oacute;n de dos caracteres o m&aacute;s.', 'rojo');
						return;
					}
					if(arrDom[2]){
						if(arrDom[2].length<2){
							mensaje('div_msg','Por favor ingresa una extenci&oacute;n  de dos caracteres o m&aacute;s.', 'rojo');
							return;
						}					
					}
					
					if (/^[a-zA-Z0-9]+(\-[a-zA-Z0-9]|[a-zA-Z0-9])*$/.test(arrDom[0])){
						mensaje('div_msg','', '');
						// No hay error
					}
					else{
						mensaje('div_msg',
								"El dominio que has escrito es incorrecto:\n  * Solo puede contener numeros, letras y guiones altos.\n  * No puede haber dos giones seguidos.\n  * No puede empezar o terminar en guión.\n", 'rojo');
						return;
					}
				
			}
			else{
				mensaje('div_msg','Por favor ingresa un dominio valido.', 'rojo');
				return;
			}
		}
		else{
			mensaje('div_msg','Por favor ingresa un dominio valido.', 'rojo');
			return;
		}
		
		document.getElementById("siguiente").disabled=false;
	}
	
	function avanzar_paso_2(llave){
		document.getElementById('llave_publica').value = llave;
		// Conexión asíncrona
		var myConn = new XHConn();
		// Si no se pudo conectar: avisar
		if (!myConn) 
			mensaje('div_cliente','XMLHTTP no esta disponible. Intenta con un navegador mas reciente.','rojo');
		// Acciones al regreso de la solcitud
		var peticion = function (oXML) {  
			document.getElementById('llave_crypt').value =  oXML.responseText;
			document.paso1.submit();
		};
		// Llamar  a regenera pass
		myConn.connect("includes/contratar/crypt.php?llave="+llave,"POST", "", peticion);
	}
	
	function avanzar_paso_2_otros(llave){
		var avanzar = false;
		var error = "";
		document.getElementById('llave_publica').value = llave;
		// Conexión asíncrona
		var myConn = new XHConn();
		// Si no se pudo conectar: avisar
		if (!myConn) 
			mensaje('div_cliente','XMLHTTP no esta disponible. Intenta con un navegador mas reciente.','rojo');
		// Acciones al regreso de la solcitud
		var peticion = function (oXML) {  
			document.getElementById('llave_crypt').value =  oXML.responseText;
			document.ppal.submit();
		};
		// Llamar  a regenera pass
		
		// verifica que el dominio este correcto
		if ( document.getElementById('txtExtra') ) {
			if ( document.getElementById('txtExtra').value != '' ) {
				if ( valida_dominio(document.getElementById('txtExtra').value) ) {
					avanzar = true; }
				else {
					error += "El formato del dominio no es correcto.\n";
				}
			}
			else {
				avanzar = true;
			}
		}
		// si es redireccion, verifica que dominio y redireccion sean correctos
		if ( document.getElementById('txtDominio2') ) {
			if ( valida_dominio(document.getElementById('txtDominio2').value) ) {
				if ( valida_redireccion(document.getElementById('extra').value) ) {
					avanzar = true; }
				else {
					error += "El formato de la redireccion no es correcto\n";
				}
			}
			else {
				error += "El formato del dominio no es correcto\n";
			}
		}
		// si no hay errores, avanzar
		if ( error == "" ) {
			myConn.connect("includes/contratar/crypt.php?llave="+llave,"POST", "", peticion); }
		else { // desplegar los errores
			alert ( error ); }
	}
	
	/******************************************************
	FUNCION:		trim
	ENTRADAS:
		cadena		->	Cadena de caracteres a evaluar
	SALIDAS:
		cadena		->	Sin espacios en las orillas
	DESCRIPCIÓN:
		Quita los espacios al principio y al final sde una cadena
	******************************************************/
	function trim_js(cadena){
		for(i=0; i<cadena.length; ){
			if(cadena.charAt(i)==" ")
				cadena=cadena.substring(i+1, cadena.length);
			else
				break;
		}
		for(i=cadena.length-1; i>=0; i=cadena.length-1){
			if(cadena.charAt(i)==" ")
				cadena=cadena.substring(0,i);
			else
				break;
		}
		return(cadena);
	}