/*==============================================================================

PROYECTO  : 11itzulpen
NOMBRE    : js/global.js
FECHA     : 21-AGO-07
AUTOR     : Ricardo Puerto <rpuerto@veoveo.es>
COPYRIGHT : Copyright (c) 2007 11itzulpen

SUMARIO

Funciones JavaScript de uso general para ejecución en cliente.

==============================================================================*/


/*------------------------------------------------------------------------------
Recupera un documento XML.
'url' es la URL (relativa o completa) del archivo XML cuyo Content-Type es un
tipo XML válido (como por ejemplo, 'text/xml'). La URL debe estar en el mismo
dominio que el archivo HTML desde el que se hace la petición.
'fn' es la función a llamar cuando el archivo se haya recuperado (la operación
es asíncrona). A fn le es pasado un objeto req y un valor val. El objeto req
contiene en responseText los datos recuperados en formato texto y en
responseXML los datos recuperados en formato XML.
'val' es un valor a pasar a fn.
Refs: [1] http://developer.apple.com/internet/webcontent/xmlhttpreq.html
------------------------------------------------------------------------------*/

var req, reqfn, reqval;

function loadXMLDoc(url, fn, val){
	reqfn = fn;
	reqval = val;
	if(window.XMLHttpRequest){
		req = new XMLHttpRequest();
		req.onreadystatechange = _reqchange;
		req.open("GET", url, true);
		req.send(null);
	}else
	if(window.ActiveXObject){
		req = new ActiveXObject("Microsoft.XMLHTTP");
		if(req){
			req.onreadystatechange = _reqchange;
			req.open("GET", url, true);
			req.send();
		}
	}
}

function _reqchange(){
	if(req.readyState == 4 && req.status == 200)
		reqfn(req, reqval);
}

/*------------------------------------------------------------------------------
Comprueba que una dirección de e-mail sea sintácticamente correcta.
Nota: Adicionalmente comprueba que los dominios tras la arroba sean al menos
dos y que no haya ninguno vacío.
Nota: Traducción literal de CheckEMailAddr() en inc/fn.php.
Refs: [1] RFC 2822 cap 3.4.1 (http://rfc.net/rfc2822.html)
------------------------------------------------------------------------------*/

function checkEMailAddr(adr){
	return adr.match(new RegExp(
		"^[-!#$%&'*+./0-9=?@A-Z^_`a-z{|}~]+@([-!#$%&'*+/0-9=?@A-Z^_`a-z{|}~]+\\.)+" +
		"[-!#$%&'*+/0-9=?@A-Z^_`a-z{|}~]+$"
	));
}

/*------------------------------------------------------------------------------
Comprueba si una cadena de texto puede convertirse en valor entero con signo.
'str' es la cadena de texto representando el valor numérico en la forma [-]i,
donde i es la parte entera en el rango -2147483648 - 2147483647.
Devuelve el valor numérico o null si no puede convertirse.
Nota: Traducción literal de CheckInt() en inc/fn.php.
------------------------------------------------------------------------------*/

function checkInt(str){
	var n;
	if(str.match(/^-*\d+$/)){
		n = str - 0;
		if(n >= -2147483648 && n <= 2147483647)
	 		return n;
 	}
	return null;
}

/*------------------------------------------------------------------------------
Comprueba si una cadena de texto puede convertirse en valor entero sin signo.
'str' es la cadena de texto representando el valor numérico en la forma i,
donde i es la parte entera en el rango 0 - 4294967295.
Devuelve el valor numérico o null si no puede convertirse.
Nota: Traducción literal de CheckIntUnsigned() en inc/fn.php.
------------------------------------------------------------------------------*/

function checkIntUnsigned(str){
	var n;
	if(str.match(/^\d+$/)){
		n = str - 0;
		if(n <= 4294967295)
	 		return n;
 	}
	return null;
}

/*------------------------------------------------------------------------------
Comprueba si una cadena de texto puede convertirse en un id (entero mayor
que 0).
'str' es la cadena de texto representando el valor numérico en la forma i,
donde i es la parte entera en el rango 1 - 4294967295.
Devuelve el valor numérico o null si no puede convertirse.
Nota: Traducción literal de CheckId() en inc/fn.php.
------------------------------------------------------------------------------*/

function checkId(str){
	var n;
	if((n = checkIntUnsigned(str)) != null && n > 0)
		return n;
	return null;
}

/*------------------------------------------------------------------------------
Comprueba si una fecha es válida.
------------------------------------------------------------------------------*/

function checkDate(month, day, year){
	if(month < 1 || month > 12 || day < 1 || day > 31)
		return false;
	if((month == 4 || month == 6 || month == 9 || month == 11) && day == 31)
		return false;
	if(month == 2 && day > 28 + (!(year % 4) && (year % 100 > 0 || !(year % 400))))
		return false;
	return true;
}

/*------------------------------------------------------------------------------
Elimina los espacios blancos de principio y final de cadena.
Nota: Equivalente a la función trim() de PHP.
------------------------------------------------------------------------------*/

function trim(str){ return str.replace(/^[ \t\n\r\0\x0B]+/g, "").replace(/[ \t\n\r\0\x0B]+$/g, ""); }

/*------------------------------------------------------------------------------
Devuelve el valor seleccionado en un grupo de botones radio o null si
ninguno seleccionado.
'grp' es el elemento que representa el grupo de controles.
------------------------------------------------------------------------------*/

function getRadioValue(grp){
	var j;
	for(j = 0; j < grp.length; j++)
		if(grp[j].checked)
			return grp[j].value;
	return null;
}
