//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////FUNCIONES DE INTERFAZ////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function redimension(ancho,alto,coso){
		if(ancho>150 || alto>150){
		mayor=(Math.max(ancho,alto));
		divisor=mayor/150;
		ancho_final=ancho/divisor;
		alto_final=alto/divisor;
		}
		else{ancho_final=ancho;alto_final=alto;}
		coso.width=ancho_final;
		coso.height=alto_final;
	}

function mostrarMensajeFlotante(mensaje, evento, anchura, id) {
	var e = (window.event) ? window.event : evento;
	var izquierda;
	var arriba;
	document.getElementById("capa_flotante").innerHTML = mensaje;
	izquierda = e.clientX + 6 - anchura / 2;
	if (navigator.appName != "Microsoft Internet Explorer")
		arriba = e.pageY + 20;
	else
		arriba = event.clientY + document.body.scrollTop + 20;
	if (izquierda + anchura > screen.width)
		document.getElementById("capa_flotante").style.right = screen.width + "px";
	else {
		if (izquierda < 0) izquierda = 0;
		document.getElementById("capa_flotante").style.left = izquierda + "px";
	}
	document.getElementById("capa_flotante").style.top = arriba + "px";
	document.getElementById("capa_flotante").style.display = "inline";
}

function ocultarMensajeFlotante() {
	document.getElementById("capa_flotante").style.display = "none";
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////FUNCIONES DE TEXTO//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function quitarEspaciosIzquierda(texto) {
	var longitud = texto.length;
	for (var posicion = 0; posicion <= longitud - 1; posicion++) {
		if (texto.substr(posicion, 1) != " ") break;
	}
	if (posicion > longitud - 1) return "";
	return texto.substr(posicion);
}
	
function quitarEspaciosDerecha(texto) {
	var longitud = texto.length;
	for (var posicion = longitud - 1; posicion >= 0; posicion--) {
		if (texto.substr(posicion, 1) != " ") break;
	}
	if (posicion < 0) return "";
	return texto.substr(0, posicion + 1);
}
	
function quitarEspacios(texto) {
	return quitarEspaciosIzquierda(quitarEspaciosDerecha(texto));
}

function esLetra(letra) {
	//Detecta si un cierto carácter es una letra. Debe tratarse de un carácter ASCII:
	if (letra.length != 1) return false;
	if (letra >= "A" && letra <= "Z") return true;
	if (letra >= "a" && letra <= "z") return true;
	var patron = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ";
	if (patron.indexOf(letra) !== -1) return true;
	return false;
}

function buscar(cadena, subcadena, desde) {
	for (var x = desde; x <= cadena.length; x++)
		if (cadena.substr(x, subcadena.length) == subcadena) return x;
	return false;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////FUNCIONES DE ARCHIVOS////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function extension (p_archivo) {
	var archivo = quitarEspacios(p_archivo);
	var longitud = archivo.length;
	for (var x = longitud - 1; x >= 0; x--) {
		if (archivo.substr(x, 1) == ".") break;
	}
	if (x < 0) return "";
	return archivo.substr(x);
}

function esImagen (p_archivo) {
	var ext = extension (p_archivo);
	switch (ext.toLowerCase()) {
		case ".gif":
		case ".jpg":
		case ".jpeg":
		case ".png":
			return true;
		default:
			return false;
	}
}

function esFlash (p_archivo) {
	var ext = extension (p_archivo);
	if (ext.toLowerCase() == ".swf")
		return true;
	else
		return false;
}

function generarImagen(p_archivo, p_alt, p_title, p_extras) {
	var archivo = quitarEspacios(p_archivo);
	var extras, alt = "", titulo = "";
	if (esImagen(archivo)) {
		if (p_alt != undefined && p_alt != "") alt = " ALT='" + p_alt + "'";
		if (p_title != undefined && p_title != "") titulo = " TITLE='" + p_title + "'";
		if (p_extras != undefined && p_extras != "") {
			extras = quitarEspacios(p_extras);
			if (extras.length != 0) extras = " " + extras;
		}
		else
			extras = "";
		return "<IMG SRC='" + archivo + "'" + alt + titulo + extras + ">";
	}
	else
		return "";
}

function generarFlash(p_archivo, p_calidad, p_titulo) {
	var archivo = quitarEspacios(p_archivo);
	var calidad;
	if (esFlash(archivo)) {
		if (p_calidad != undefined) {
			calidad = quitarEspacios(p_calidad);
			if (calidad.length != 0) calidad = '<param name="quality" value="' + calidad + '" />';
		}
		else
			calidad = '<param name="quality" value="high" />';
		var contenido = '<p><object TITLE="' + p_titulo + '" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0">';
		contenido += calidad;
		contenido += ('<param name="src" value="' + archivo + '" /><embed title="' + p_titulo + '" type="application/x-shockwave-flash" width="100" height="100" src="' + archivo + '" quality="high"></embed>');
		contenido += "</OBJECT></p>";
		return contenido;
	}
	else
		return "";
}

function generarEmbed(p_archivo, p_titulo, p_extras) {
	var archivo = quitarEspacios(p_archivo);
	var extras;
	if (archivo.length > 0) {
		if (p_extras != undefined) {
			extras = quitarEspacios(p_extras);
			if (extras.length != 0) extras = " " + extras;
		}
		else
			extras = "";
		return '<EMBED title="' + p_titulo + '" SRC="' + archivo + '"' + extras + '></EMBED>';
	}
	else
		return "";
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////FUNCIONES DE VALIDACIÓN//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function nombreGeograficoLegal(nombre) {
	if (nombre.indexOf("&#9786;") != -1) return false;
	if (nombre.indexOf(">") != -1) return false;
	if (nombre.indexOf("<") != -1) return false;
	if (nombre.indexOf("&gt;") != -1) return false;
	if (nombre.indexOf("&lt;") != -1) return false;
	if (nombre.indexOf("&amp;") != -1) return false;
	if (nombre.indexOf("&") != -1) return false;
	return true;
}

function cpaLegal(p_cpa) {
	var cpa = quitarEspacios(p_cpa.toUpperCase());
	var longitud = cpa.length;
	var posicion, caracter;
	if (longitud != 4 && longitud != 8) return false;
	for (posicion = 0; posicion <= longitud - 1; posicion++) {
		caracter = cpa.charAt(posicion);
		if (caracter == "0") {
			if ((longitud == 4 && posicion == 0) || (longitud == 8 && !(posicion >= 2 && posicion <= 4))) return false;
		}
		else if (caracter >= "1" && caracter <= "9") {
			if (longitud == 8 && (posicion == 0 || (posicion >= 5 && posicion <= 7))) return false;
		}
		else if ((caracter >= "A" && caracter <= "Z") || caracter == "Ñ") {
			if (longitud == 4 || (longitud == 8 && (posicion >= 1 && posicion <= 4))) return false;
		}
		else
			return false;
	}
	return cpa;
}

function digitoVerificadorCuit (p_cuit) {
	var cuit = quitarEspacios(p_cuit);
	var longitud = cuit.length;
	if (longitud != 10) return false;
	var factor = 5;
	var resultado = 0;
	var x;
	for (x = 0; x <= 9; x++) {
		resultado += (cuit.substr(x, 1) * factor);
		factor--;
		if (factor == 1) factor = 7;
	}
	resultado = 11 - (resultado % 11);
	if (resultado == 11) return 0;
	if (resultado == 10) return 9;
	return resultado;
}

function cuitLegal(p_cuit) {
	var cuit = "";
	var x, caracter;
	for (x = 0; x <= p_cuit.length - 1; x++) {
		caracter = p_cuit.substr(x, 1);
		if (caracter >= "0" && caracter <= "9") cuit += String(caracter);
	}
	if (cuit.length < 10 || cuit.length > 11) return false;
	var verificador = digitoVerificadorCuit(cuit.substr(0, 10));
	if (cuit.length == 10) return cuit + String(verificador);
	if (cuit.substr(10, 1) != verificador) return false;
	return cuit;
}

function telefonoInternoLegal(p_interno) {
	var interno = quitarEspacios(p_interno);
	var contenido = "";
	var x, caracter;
	for (x = 0; x <= interno.length - 1; x++) {
		caracter = interno.substr(x, 1);
		if ((caracter >= "0" && caracter <= "9") || caracter == "*" || caracter == "#")
			contenido += caracter;
	}
	return contenido;
}

function telefonoLegal(pais, area, numero, interno) {
	var resultado = new Array();
	resultado[0] = pais;
	resultado[1] = area;
	resultado[2] = numero;
	resultado[3] = interno;
	var contenido, x, y, caracter;
	for (var y = 0; y <= 3; y++) {
		contenido = "";
		for (x = 0; x <= resultado[y].length - 1; x++) {
			caracter = resultado[y].substr(x, 1);
			if ((caracter >= "0" && caracter <= "9") || caracter == "*" || caracter == "#")
				contenido += ("" + caracter);
		}
		resultado[y] = contenido;
	}
	if (resultado[0] != "") {
		resultado[0] = esNumeroEntero(resultado[0]);
		if (resultado[0] === false) return false;
	}
	if (resultado[1] != "") {
		resultado[1] = esNumeroEntero(resultado[1]);
		if (resultado[1] === false) return false;
	}
	if (resultado[2].length == 0) return false;
	return resultado;
}

function ipV4Legal (p_ip) {
	var ip = quitarEspacios(p_ip.toLowerCase());
	if (ip == "localhost") return "127.0.0.1";
	var longitud = ip.length;
	if (longitud < 7) return false;
	var puntos = 0;
	var posicion = 0;
	var caracter;
	var partes = new Array();
	while (posicion <= ip.length - 1) {
		caracter = ip.substr(posicion, 1);
		if (caracter == ".") {
			if (posicion == 0 || posicion == ip.length - 1) return false;
			if (ip.substr(posicion - 1, 1) == "." || ip.substr(posicion + 1, 1) == ".") return false;
			puntos++;
			if (puntos > 3) return false;
			partes[partes.length] = ip.substr(0, posicion) * 1;
			ip = ip.substr(posicion + 1);
			posicion = 0;
		}
		else if (!(caracter >= "0" && caracter <= "9"))
			return false;
		else
			posicion++;
	}
	if (puntos != 3) return false;
	partes[3] = ip * 1;
	ip = "";
	for (var x = 0; x <= 3; x++) {
		if (partes[x] > 255) return false;
		ip += (partes[x] + ".");
	}
	return ip.substr(0, ip.length - 1);
}

function dominioLegal(p_dominio) {
	/*
		Sintaxis 1 = IP
		Sintaxis 2 = dominio
		Sintaxis 2 = parte1.parte2....
		Alfabeto: Letras, números, guiones medios y bajos
		Para el futuro: barras ascendentes, numerales, dos puntos, signos de interrogación, =, &
	*/
	var dominio = quitarEspacios(p_dominio);
	var longitud = dominio.length;
	var caracter;
	if (longitud == 0) return false;
	for (var posicion = 0; posicion <= longitud - 1; posicion++) {
		caracter = dominio.substr(posicion, 1);
		if (caracter == ".") {
			if (posicion == 0 || posicion == longitud - 1) return false;
			if (dominio.substr(posicion - 1, 1) == "." || dominio.substr(posicion + 1, 1) == ".") return false;
		}
		else if (!(esLetra(caracter) || caracter == "_" || caracter == "-" || (caracter >= "0" && caracter <= "9"))) return false;
	}
	return dominio;
}

function mailLegal(p_mail) {
	/*
	Reglas RFC 2822:
		partelocal@dominio
		partelocal.length <= 64 (pero está bien visto que haya más de 64)
		partelocal (sintaxis 1) = letras en mayúsculas o minúsculas, dígitos del 0 al 9, puntos (no puede ser el primer ni el último carácter; no pueden aparecer dos puntos seguidos) ! # $ % * / ? | ^ { } ` ~ & ' + - = _
		partelocal (sintaxis 2) = "cualesquier caracteres" (aunque se desaconseja bastante) Si se incluyen comillas dobles dentro de comillas dobles, tienen que ir precedidas de \ (carácter de escape).
		partelocal es sensible a mayúsculas y a minúsculas.
		dominio.length <= 255
		dominio (sintaxis 1) = [IP]
		dominio (sintaxis 2) = Ver la función "dominio_legal".
	*/
	var mail = quitarEspacios(p_mail);
	var longitud = mail.length;
	var cod, caracter;
	//1) La longitud, debe ser de 3 caracteres, como mínimo:
	if (longitud < 3) return false;
	//2) Rastrear la arroba separadora de las partes (de atrás para adelante):
	var posicion = mail.lastIndexOf("@");
	//Si no hay arroba o está ubicada en algún extremo...
	if (posicion == -1 || posicion == 0 || posicion == longitud - 1) return false;
	//3) Separar al mail en dos partes:
	var parteLocal = mail.substr(0, posicion);
	var dominio = mail.substr(posicion + 1);
	//4) Validar la parte local:
	longitud = parteLocal.length;
	if (parteLocal.substr(0, 1) == '"' && parteLocal.substr(longitud - 1, 1) == '"') {
		//4a) Caso "a": La parte local está encerrada por comillas dobles. Debe tener una longitud de 3 caracteres, como mínimo:
		if (longitud < 3) return false;
		//Dentro de las comillas, puede ir cualquier cosa, pero si hay otra comilla, debe estar precedida por un carácter de escape:
		posicion = 1;
		longitud -= 2;
		while (posicion <= longitud) {
			//¿Qué ocurre si hay una comilla, pero no se encuentra el carácter de escape?:
			cod = parteLocal.substr(posicion - 1, 1);
			cod = cod.charCodeAt(0);
			if (parteLocal.substr(posicion, 1) == '"' && cod != 92) {
				//El carácter de escape no está, pero es una falta menor y se subsana:
				parteLocal = parteLocal.substr(0, posicion) + "\\" + parteLocal.substr(posicion);
				longitud++;
				posicion += 2;
			}
			else
				posicion++;  //Sólo es necesario incrementar la posición.
		}
	}
	else {
		//4b) La parte local no está entrecomillada. Será necesario verificar carácter por carácter:
		for (posicion = 0; posicion <= longitud - 1; posicion++) {
			caracter = parteLocal.substr(posicion, 1);
			/*
				Se admiten letras mayúsculas o minúsculas, dígitos del 0 al 9, puntos (no pueden ser el primer ni el último carácter; no pueden 
				aparecer dos puntos seguidos) ! # $ % * / ? | ^ { } ` ~ & ' + - = _
			*/
			if (caracter == ".") {
				if (posicion == 0 || posicion == longitud - 1) return false;
				if (parteLocal.substr(posicion - 1, 1) == "." || parteLocal.substr(posicion + 1, 1) == ".") return false;
			}
			//else if (!(esLetra(caracter) || (caracter >= "0" && caracter <= "9") || buscar("!#$%*/?|^{}`~&'+-=_", caracter, 0) !== false))
			else if (!(esLetra(caracter) || (caracter >= "0" && caracter <= "9") || buscar("!#$%*/?|^{}`~'+-=_", caracter, 0) !== false))
				return false;
		}
	}
	//5) Validar el domonio:
	longitud = dominio.length;
	//5a) No puede tener más de 255 caracteres:
	if (longitud > 255) return false;
	//5b) ¿Es una IP?:
	if (dominio.substr(0, 1) == "[" && dominio.substr(longitud - 1, 1) == "]") {
		//Parece serlo...
		if (longitud < 9) return false;
		dominio = ipV4Legal(dominio.substr(1, dominio.length - 2));
		if (dominio === false) return false;
		dominio = "[" + dominio + "]";
	}
	else {
		//5c) Es Normal: Estará sujeto al dictamen de la función dominio_legal.
		dominio = dominioLegal(dominio);
		if (dominio === false) return false;
	}
	//Fin de las comprobaciones: El mail es legal.
	return parteLocal + "@" + dominio;
}

function protocoloLegal(p_protocolo) {
	var protocolo = quitarEspacios(p_protocolo);
	var longitud = protocolo.length;
	var caracter;
	if (longitud == 0) return false;
	for (var x = 0; x <= longitud - 1; x++) {
		caracter = protocolo.substr(x, 1);
		if (!(esLetra(caracter) || (caracter >= "0" && caracter <= "9"))) return false;
	}
	return protocolo;
}

function marcadorLegal(p_marcador) {
	var marcador = quitarEspacios(p_marcador);
	var longitud = marcador.length;
	var caracter;
	if (longitud == 0) return true;
	for (var x = 0; x <= longitud - 1; x++) {
		caracter = marcador.substr(x, 1);
		caracter = caracter.toLowerCase();
		if (x == 0 && !(caracter >= "a" && caracter <= "z")) return false;
		if (!((caracter >= "a" && caracter <= "z") || (caracter >= "0" && caracter <= "9") || caracter == "-" || caracter == "_" || caracter == ":" || caracter == "."))
			return false;
	}
	return marcador;
}

function puertoLegal(p_puerto) {
	var puerto = quitarEspacios(p_puerto);
	var longitud = puerto.length;
	if (longitud == 0) return false;
	var numero = esNumeroEntero(puerto);
	if (numero === false) return false;
	if (numero < 0 || numero > 65535) return false;
	return numero;
}

function uriLegal(p_uri) {
	var uri = quitarEspacios(p_uri);
	var longitud = uri.length;
	var interrogacion;
	var url;
	var get;
	var protocolo;
	if (longitud == 0) return false;
	var posicion = uri.indexOf("?");
	if (posicion == 0) return false;
	if (posicion == -1) {
		interrogacion = false;
		url = uri;
		get = "";
	}
	else {
		interrogacion = true;
		url = quitarEspacios(uri.substr(0, posicion));
		get = quitarEspacios(uri.substr(posicion + 1));
	}
	posicion = url.indexOf("://");
	if (posicion == -1)
		protocolo = "";
	else {
		protocolo = protocoloLegal(url.substr(0, posicion));
		if (protocolo === false) return false;
		url = quitarEspacios(url.substr(posicion + 3));
	}
	var partes = new Array();
	partes = url.split("/");
	url = "";
	var marcador = "";
	var puerto = "";
	var cantidad = partes.length - 1;
	var subindice = 0;
	var numeral = false;
	for (var x = 0; x <= cantidad; x++) {
		posicion = partes[x].indexOf("#");
		if (posicion != -1) {
			numeral = true;
			if (posicion == 0 || x < cantidad) return false;
			marcador = marcadorLegal(partes[x].substr(posicion + 1));
			if (marcador === false) return false;
			partes[x] = quitarEspacios(partes[x].substr(0, posicion));
		}
		posicion = partes[x].indexOf(":");
		if (posicion != -1) {
			if (posicion == 0 || posicion == partes[x].length - 1 || x > 0) return false;
			puerto = puertoLegal(partes[x].substr(posicion + 1));
			if (puerto === false) return false;
			partes[x] = quitarEspacios(partes[x].substr(0, posicion));
		}
		if (dominioLegal(partes[x]) === false) return false;
		//subindice++;
	}
	if (protocolo == "") uri = "http://" + uri;
	return uri;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////FUNCIONES MATEMÁTICAS////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function esNumero(valor) {
	if (isNaN(valor)) return false;
	var numero = parseFloat(valor);
	if (isNaN(numero)) return false;
	return numero;
}

function esNumeroEntero(valor) {
	var longitud = valor.length;
	var caracter;
	for (var x = 0; x <= longitud - 1; x++) {
		caracter = valor.substr(x, 1);
		if (caracter == "-" && x > 0) return false;
		if ((caracter < "0" || caracter > "9") && caracter != "-") return false;
	}
	return valor * 1;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////FUNCIONES DE CONVERSIÓN//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function destraducirEspeciales(p_texto) {
	var texto = p_texto.replace("&lt;", "<");
	texto = texto.replace("&gt;", ">");
	texto = texto.replace("&gt;", ">");
	texto = texto.replace("&#38;", "&");
	return texto;
}

function reemplazarEspeciales(p_texto) {
	alert(p_texto);
	var resultado = "";
	var x;
	var caracter;
	for (x = 0; x <= p_texto.length - 1; x++) {
		caracter = p_texto.substr(x, 1);
		if (caracter.charCodeAt(0) > 127)
			resultado += ("&#" + caracter.charCodeAt(0) + ";");
		else if (caracter == ">")
			resultado += "&gt;";
		else if (caracter == "<")
			resultado += "&lt;";
		//else if (caracter.charCodeAt(0) == 38)
			//resultado += "&#38;";
		else
			resultado += caracter;
	}
	alert(resultado);
	return resultado;
}
	
function aTelefono(pais, area, numero, interno, tipo) {
	var texto;
	if (tipo != undefined)
		texto = tipo + ": ";
	else
		texto = "";
	texto += (pais + "(" + area + ")" + numero);
	if (interno != undefined && interno != "") texto += (" (int. " + interno + ")");
	
	return texto;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////FUNCIONES DE FECHA Y HORA/////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function diasDelMes(mes, anno) {
	switch (mes) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return 31;
		case 2:
			if (anno === undefined) return 28;
			if (anno % 4 == 0) return 29;
			return 28;
		default:
			return 30;
	}
}


function separarMails(p_listado) {
	var listado = quitarEspacios(p_listado);
	if (listado.length == 0) return false;
	var mails = new Array;
	var texto = "";
	var x = 0;
	var comillasAbiertas = false;
	var caracter;
	var codigo;
	while (x <= listado.length - 1) {
		caracter = listado.substr(x, 1);
		if (caracter == '"') {
			if (x == 0)
				comillasAbiertas = true;
			else if (comillasAbiertas) {
				codigo = listado.substr(x - 1, 1);
				codigo = codigo.charCodeAt(0);
				if (codigo != 92) comillasAbiertas = false;
			}
			else
				return false;
			x++;
		}
		else if (caracter == ",") {
			mails[mails.length] = listado.substr(0, x);
			listado = listado.substr(x + 1);
			x = 0;
		}
		else
			x++;
	}
	mails[mails.length] = listado;
	for (x = 0; x <= mails.length - 1; x++) {
		mails[x] = mailLegal(mails[x] + "");
		if (mails[x] === false) return false;
	}
	return mails;
}