/*========================================================================*/
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!');
			brilla(obj);
			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;
}



var dragobject={
z: 0, x: 0, y: 0, offsetx : null, offsety : null, targetobj : null, dragapproved : 0,
initialize:function(){
document.onmousedown=this.inspectorgadget
document.onmouseup=function(){this.dragapproved=0}
},
inspectorgadget:function(e){
var evtobj=window.event? window.event : e
this.targetobj=window.event? event.srcElement : e.target
if (this.targetobj.className=="inspectorgadget"){
this.dragapproved=1
if (isNaN(parseInt(this.targetobj.style.left))){this.targetobj.style.left=0}
if (isNaN(parseInt(this.targetobj.style.top))){this.targetobj.style.top=0}
this.offsetx=parseInt(this.targetobj.style.left)
this.offsety=parseInt(this.targetobj.style.top)
this.x=evtobj.clientX
this.y=evtobj.clientY
if (evtobj.preventDefault)
evtobj.preventDefault()
document.onmousemove=dragobject.moveit
}
},
moveit:function(e){
var evtobj=window.event? window.event : e
if (this.dragapproved==1){
this.targetobj.style.left=this.offsetx+evtobj.clientX-this.x+"px"
this.targetobj.style.top=this.offsety+evtobj.clientY-this.y+"px"
return false
}
}
}


function inspectorgadget(mode, data) {
	if(mode=='clearme') {
		document.getElementById('inspectorgadget').innerHTML='';
		document.getElementById('inspectorgadget').style.display='none';
	}
	else {
		ajax.handler.onreadystatechange = 
			function() {
				ajax.showStatus('<img src="images/loading_f.gif" border="0" alt="">');
				if (ajax.ok()) {
					if (ajax.text == '0') alert ("AJAX returned error");
					else {
						document.getElementById('inspectorgadget').innerHTML=ajax.text;
						document.getElementById('inspectorgadget').style.display='block';
						dragobject.initialize();
					}
				}
			};
		ajax.request('POST', 'mode='+mode+'&data='+data, 'ajax/inspectorgadget.php');
	}
}



function showhide(ID) {
	var o = document.getElementById(ID);
	if (o.style.display == 'none') o.style.display = '';
	else o.style.display = 'none';
}

function openPopupWindow(url, w, h) {
	window.open(url, '', 'width=' + w + ',height=' + h + ',resizable=yes,scrollbars=1');
}

/**
*	Ejemplo de uso:
*		<mitag onmousedown="dragDropInit(this)"></mitag>
*		<mitag> debe tener posicion absoluta o relativa
*/

/**
*	@desc	habilitar dragdrop en un objeto. Se requiere global.js
*	@param	object|string	objeto o id de objeto a mover
*/
function dragDropInit(v)
{
	var dragdrop_move = function(o) {
		if (o.getAttribute('dragdropApproved') == 1)
		{
			var posLeft = mouseX - parseInt(o.getAttribute('mouseX')) - parseInt(o.getAttribute('offsetParentX')) - parseInt(o.getAttribute('offsetX'));
			var posTop = mouseY - parseInt(o.getAttribute('mouseY')) - parseInt(o.getAttribute('offsetParentY')) - parseInt(o.getAttribute('offsetY'));
			o.style.left = posLeft + 'px';
			o.style.top = posTop + 'px';
		}
	};
	if (IE) document.onselectstart = function() { return false; }
	o = (typeof v == 'string') ? document.getElementById(v) : v;
	o.setAttribute('dragdropApproved', 1);
	var tmpX = mouseX - getOffset(o)[0];
	var tmpY = mouseY - getOffset(o)[1];
	if (o.getAttribute('offsetX') == null)
	{
		o.setAttribute('offsetX', o.offsetLeft);
		o.setAttribute('offsetY', o.offsetTop);
	}
	o.setAttribute('offsetParentX', getOffset(o.offsetParent)[0]);
	o.setAttribute('offsetParentY', getOffset(o.offsetParent)[1]);
	o.setAttribute('mouseX', tmpX);
	o.setAttribute('mouseY', tmpY);
	if (document.attachEvent)
	{
		document.attachEvent('onmousemove', function() { dragdrop_move(o); });
		document.attachEvent('onmouseup', function() {
			o.setAttribute('dragdropApproved', 0);
			if (IE) document.onselectstart = null;
		});
	}
	else
	{
		document.addEventListener('mousemove', function() { dragdrop_move(o); }, true);
		document.addEventListener('mouseup', function() { o.setAttribute('dragdropApproved', 0); }, true);
	}
}


function initDynLists() {
	for(i=0; i<sortobjects.length; i++) {
		eval(sortobjects[i]+".init()");
	}
}


/**
*	Listita loca by Demián Andrés Rodriguez ©2006
*/

/**
*	@param	string			id de la capa o contenedor de objetos a ordenar
*	@param	string			clase de los elementos a los cuales se les aplicará el dragdrop
*	@param	string|null		clase de los elementos donde comenzará el dragdrop
*	@param	string|null		css outline para los elementos. ej: "2px solid red" (bugeado en IE y Opera)
*	@param	boolean			habilitar sortorder
*	@param	string|null		prefijo del atributo id de los items
*	@param	function		funcion q se llama cuando cambia el orden de los items, recibe cadena para enviar mediante ajax
*							itemid[] y sortorder[]
*/

function DynamicList(listID, itemClassName, dragItemClassName, outline, enableSortOrder, itemIdPrefix, sortOrderHandler)
{
	/*================================================================*/
	var me = this;
	this.list				= listID;
	this.itemClassName		= itemClassName;
	this.dragItemClassName	= (dragItemClassName) ? dragItemClassName : null;
	this.outline			= (outline) ? outline : null;
	this.items				= new Array();
	this.currentItem		= null;

	this.enableSortOrder	= (enableSortOrder) ? enableSortOrder : false;
	this.itemIdPrefix		= (itemIdPrefix) ? itemIdPrefix : 'sortorder_';
	this.sortOrderHandler	= (typeof sortOrderHandler == 'function') ? sortOrderHandler : null;
	/*================================================================*/
	this.init = function() {
        this.list = document.getElementById(this.list);
        if (this.list == null) return;
        var tmp = this.list.getElementsByTagName('*');
        var i, itemIndex = 0;
        for (i=0;i<tmp.length;i++)
        {
        	if (inArray(this.itemClassName, tmp[i].className.split(/\s+/g)))
        	{
        		this.items.push(tmp[i]);
				tmp[i].setAttribute('offsetX', tmp[i].offsetLeft);	// static
				tmp[i].setAttribute('offsetY', tmp[i].offsetTop);	// static
				tmp[i].setAttribute('dynOffsetX', tmp[i].offsetLeft);
				tmp[i].setAttribute('dynOffsetY', tmp[i].offsetTop);
				tmp[i].setAttribute('itemIndex', itemIndex++);		// para sortorder
				tmp[i].style.zIndex = '10';
			}
		}
		try { delete tmp; } catch(e) {}
		
		if (document.attachEvent && window.event)
		{
			for (i=0;i<this.items.length;i++)
			{
				this.getDragItem(this.items[i]).attachEvent('onmousedown', function() {
					// IE no entiende lo q es "this"...
					me.currentItem = me.getContainerByClass(event.srcElement, me.itemClassName);
					dragDropInit(me.currentItem);
					me.updateZindex(me.currentItem);
					});
				this.items[i].attachEvent('onmousemove', function() {
					me.move(me.getContainerByClass(event.srcElement, me.itemClassName));
				});
				document.attachEvent('onmouseup', function() {
					if (me.currentItem == null) return;
					me.stickItem(me.currentItem, 
						parseInt(me.currentItem.getAttribute('dynOffsetX')), 
						parseInt(me.currentItem.getAttribute('dynOffsetY')));
					if (me.enableSortOrder) me.updateSortOrder();
				});
			}
		}
		else if (window.addEventListener)
		{
			for (i=0;i<this.items.length;i++)
			{
				this.getDragItem(this.items[i]).addEventListener('mousedown', function() {
					dragDropInit(me.getContainerByClass(this, me.itemClassName));
					me.updateZindex(me.getContainerByClass(this, me.itemClassName));
				}, false);
				this.items[i].addEventListener('mousemove', function() {
					me.move(me.getContainerByClass(this, me.itemClassName));
				}, true);
				this.items[i].addEventListener('mouseup', function() {
					me.stickItem(this, 
						parseInt(this.getAttribute('dynOffsetX')), 
						parseInt(this.getAttribute('dynOffsetY'))
					);
					if (me.enableSortOrder) me.updateSortOrder();
				}, true);
			}
		}
	};

	this.getContainerByClass = function(o, className) {
		var tmp = o;
		while (tmp && !inArray(className, tmp.className.split(/\s+/g)))
			tmp = tmp.parentNode;
		return (tmp.className.indexOf(className) >= 0) ? tmp : null;
	};
	
	this.getDragItem = function(o) {
		if (me.dragItemClassName == null) return o;
		var tmp = o.getElementsByTagName('*');
		for (var i=0;i<tmp.length;i++)
			if (tmp[i].className.indexOf(me.dragItemClassName) >= 0)
        		return tmp[i];
        return o;
	};

	this.move = function(o) {
		var i, cur;
		if (o.getAttribute('dragdropApproved') == 1)
		{
			for (i=0;i<me.items.length;i++)
			{
				cur = me.items[i]; // item que vamos a intercambiar
				if (cur != o)
				{
					if (o.offsetLeft >= cur.offsetLeft && 
							o.offsetLeft <= (cur.offsetLeft + cur.offsetWidth) || 
						(o.offsetLeft + o.offsetWidth) >= cur.offsetLeft && 
							(o.offsetLeft + o.offsetWidth) <= (cur.offsetLeft + cur.offsetWidth))
					{
						if (o.offsetTop <= (cur.offsetTop + cur.offsetHeight/2) &&
								o.offsetTop > cur.offsetTop || 
							(o.offsetTop + o.offsetHeight) >= (cur.offsetTop + cur.offsetHeight/2) &&
								(o.offsetTop + o.offsetHeight) < (cur.offsetTop + cur.offsetHeight))
						{
							// intercambiar items
							me.stickItem(cur, parseInt(o.getAttribute('dynOffsetX')), parseInt(o.getAttribute('dynOffsetY')));
							me.exchangeAttr(cur, o);
						}
						else if (me.outline && (o.offsetTop > (cur.offsetTop + cur.offsetHeight/2) &&
									o.offsetTop <= (cur.offsetTop + cur.offsetHeight) || 
								(o.offsetTop + o.offsetHeight) < (cur.offsetTop + cur.offsetHeight/2) &&
									(o.offsetTop + o.offsetHeight) >= (cur.offsetTop)))
						{
							cur.style.outline = me.outline;
						}
						else { cur.style.outline = '0px'; }
					}
					else { cur.style.outline = '0px'; }
				}
			}
		}
	};
	
	this.stickItem = function(o, x, y) {
		o.style.left = x - parseInt(o.getAttribute('offsetX')) + 'px';
		o.style.top = y - parseInt(o.getAttribute('offsetY')) + 'px';
		if (me.outline)
			for (var i=0;i<me.items.length;i++)
				me.items[i].style.outline = '0px';
	};
	
	this.exchangeAttr = function(cur, o) {
		var tmpAttrX = cur.getAttribute('dynOffsetX');
		var tmpAttrY = cur.getAttribute('dynOffsetY');
		var tmpItemIndex = cur.getAttribute('itemIndex');
		cur.setAttribute('dynOffsetX', o.getAttribute('dynOffsetX'));
		cur.setAttribute('dynOffsetY', o.getAttribute('dynOffsetY'));
		cur.setAttribute('itemIndex', o.getAttribute('itemIndex'));
		o.setAttribute('dynOffsetX', tmpAttrX);
		o.setAttribute('dynOffsetY', tmpAttrY);
		o.setAttribute('itemIndex', tmpItemIndex);
	};
	
	this.updateZindex = function(o) {
		// buscar z-index mas alto e incrementarlo
		var max = 1;
		for (var i=0;i<me.items.length;i++)
			if (parseInt(me.items[i].style.zIndex) > max)
				max = parseInt(me.items[i].style.zIndex);
		o.style.zIndex = max + 1;
		o.style.position = getStyle(o, 'position'); // IE bug..
	};
	
	this.updateSortOrder = function() {
		var items = '';
		var itemid;
		for (var i=0;i<me.items.length;i++)
		{
			itemid = (me.itemIdPrefix) ? me.items[i].getAttribute('id').substr(me.itemIdPrefix.length) : me.items[i].getAttribute('id');
			items += ('itemid[]=' + itemid + '&sortorder[]=' + me.items[i].getAttribute('itemIndex') + '&')
		}
		if (me.sortOrderHandler) me.sortOrderHandler(items);
	};
}