/*========================================================================*/
var OPERA	= (/Opera/i.test(window.navigator.userAgent));
var IE		= (/MSIE/i.test(window.navigator.userAgent) && !OPERA);
var IE6		= (/MSIE 6/i.test(window.navigator.userAgent) && !OPERA);
var IE7		= (/MSIE 7/i.test(window.navigator.userAgent) && !OPERA);
var OLD_IE	= (IE && !IE7); // versiones <= ie 6
var MOZ		= (/(firefox|gecko)/i.test(window.navigator.userAgent));
var SAFARI	= (/safari/i.test(window.navigator.userAgent));
var mouseX	= 0;	// coordenadas del mouse X
var mouseY	= 0;	// coordenadas del mouse Y
/*========================================================================*/
var emailFilter 	= /^[a-z0-9_.-]{2,}@[a-z0-9_.-]{2,}\.[a-z]{2,3}(?:\.[a-z]{2})?$/i;
var dateFilter1		= /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/i; // yyyy-mm-dd (hh:mm:ss)
var dateFilter2		= /^\d{2}\/\d{2}\/\d{4}$/i; // mm/dd/yyyy | dd/mm/yyyy
var dateFilter3		= /^\d{4}-\d{2}-\d{2}$/i; // yyyy-mm-dd
var timeFilter		= /^\d{2}:\d{2}(:\d{2})?$/i; // hh:mm:ss
var phoneFilter		= /^[0-9_.-]+$/i;
var numberFilter	= /^[0-9.]+$/i;
/*========================================================================*/

/**
*	@desc	Alias de document.getElementById()
*
*	@param	string	id del objeto
*	@return	object|null
*/
function get(oID)
{
	if (IE)
	{
		// IE document.all fix!
		var elem = document.getElementsByTagName('*');
		for (var i=0;i<elem.length;i++)
			if (elem[i].getAttribute('id') && elem[i].getAttribute('id') == oID)
				return elem[i];
		return null;
	}
	return document.getElementById(oID);
}

/**
*	@desc	Codificar valor para enviar mediante GET/POST con AJAX
*
*	@param	string	valor a codificar
*	@param	string	charset: UTF-8 o ISO-8859-1 (opcional)
*	@return	string
*/
function encode(v, charset)
{
	if (charset && charset.toUpperCase() == 'UTF-8') return encodeURIComponent(v);
	else return escape(v).replace(/\+/ig, '%2B').replace(/\//ig, '%2F');
}

/**
*	@desc	Codificar valor para enviar mediante GET/POST con AJAX
*
*	@param	string	valor a codificar
*/
function UTF8encode(v)
{
	return encodeURIComponent(v)
}

/**
*	@desc	Alias de trim() en PHP - elimina espacios al comienzo y final de una cadena
*
*	@param	string
*	@return	string
*/
function trim(v)
{
	return v.replace(/^\s+/i, '').replace(/\s+$/i, '');
}

/*
*	@desc	Alias de in_array() en  PHP
*
*	@param	mixed	aguja: valor a buscar
*	@param	array	pajar: array donde buscar
*	@return	boolean
*/
function inArray(item, array)
{
	for (var i=0;i<array.length;i++)
		if (array[i] == item) return true;
	return false;
}

/**
*	@desc	Obtener scroll x e y del documento
*
*	@return	array
*/
function getScrollXY()
{
	var dim = new Array();
	if (document.documentElement && IE)
	{
		dim[0] = document.documentElement.scrollLeft + document.body.scrollLeft;
		dim[1] = document.documentElement.scrollTop + document.body.scrollTop;
	}
	else if (MOZ || OPERA)
	{
		dim[0] = window.pageXOffset;
		dim[1] = window.pageYOffset;
	}
	else
	{
		dim[0] = document.body.scrollLeft;
		dim[1] = document.body.scrollTop;
	}
	return dim;
}

/**
*	@desc	Obtener dimensiones de la porcion visible del documento
*
*	@return	array
*/
function getMaxXY()
{
	var dim = new Array();
	if (!IE)
	{
		dim[0] = window.innerWidth;
		dim[1] = window.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientWidth != 0)
	{
		dim[0] = document.documentElement.clientWidth;
		dim[1] = document.documentElement.clientHeight;
	}
	else
	{
		dim[0] = document.body.clientWidth;
		dim[1] = document.body.clientHeight;
	}
	return dim;
}

/**
*	@desc	Obtener las coordenadas de un elemento con respecto al documentElement (<html>)
*
*	@param	object
*	@return	array
*/
function getOffset(o)
{
	var tmp = o;
	var offset = [0,0];
	while (tmp)
	{
		offset[0] += tmp.offsetLeft;
		offset[1] += tmp.offsetTop;
		tmp = tmp.offsetParent;
	}
	return offset;
}

/**
*	@desc	Obtener nodo padre de un nodo por su tagName
*
*	@param	object	objeto de donde buscar
*	@param	string	nombre del tag del parentNode a buscar
*	@return	object|null
*/
function getParent(me, tag)
{
	var tmp = me.parentNode;
	while (tmp && tmp.nodeName.toLowerCase() != tag.toLowerCase())
		tmp = tmp.parentNode;
	return tmp;
}

/**
*	@desc		Obtener estilo computado para un elemento
*
*	@param		object
*	@param		string	propiedad (igual que en CSS)
*	@return		string|null
*/
function getStyle(ob, styleProp)
{
	var o = (typeof ob == 'string') ? document.getElementById(ob) : ob;
	if (o.currentStyle)
	{
		var newProp = '', i = 0;
		while (i < styleProp.length)
		{
			if (styleProp.charAt(i) == '-')
			{
				newProp += styleProp.charAt(i+1).toUpperCase();
				i += 2;
			}
			else newProp += styleProp.charAt(i++);
		}
		return o.currentStyle[newProp];
	}
	else if (window.getComputedStyle)
	{
		return document.defaultView.getComputedStyle(o, null).getPropertyValue(styleProp);
	}
	return null;
}

/**
*	@desc	Inicializar las coordenadas del mouse en variables globales mouseX y mouseY
*
*	@return	void
*/
function initMouseEvent()
{
	var findMouse = function(e)	{
		var scrollXY = getScrollXY();
		if (typeof e == 'undefined') var e = window.event;
		mouseX = e.clientX + scrollXY[0];
		mouseY = e.clientY + scrollXY[1];
	};
	if (document.attachEvent) document.attachEvent('onmousemove', findMouse);
	else window.addEventListener('mousemove', findMouse, true);
}


/*=========================== Validaciones ===========================*/

/**
*	@desc	Validar elementos de formulario y asegurar que tengan valor no nulo
*
*	@param	string	elemID [, elemID [, elemID [,...]]]
*	@return	boolean
*/
function valueTest()
{
	var ids = arguments, i, obj;
	for (i=0;i<ids.length;i++)
	{
		obj = get(ids[i]) ? get(ids[i]) : document.getElementsByName(ids[i])[0];
		if (!trim(obj.value))
		{
			alert('Please fill all the required fields!');
			obj.focus();
			return false;
		}
	}
	return true;
}

/**
*	@desc	Validar extensiones para file upload
*
*	@param	string	id del input file
*	@param	array	extensiones permitidas en minuscula
*	@return	boolean
*/
function fileExtensionTest(fileInputID, allowedExt)
{
	var file = get(fileInputID).value;
	var ext = file.substr(file.lastIndexOf('.')+1).toLowerCase();
	if (!inArray(ext, allowedExt))
    {
    	alert('Please select a valid file type.\n\nAllowed extensions: ' + allowedExt);
    	get(fileInputID).focus();
    	return false;
	}
	return true;
}