if (document.ELEMENT_NODE == null) {
  document.ELEMENT_NODE = 1;
  document.TEXT_NODE = 3;
  document.TEXT_COMMENT_NODE = 8;
}

function Browser() {
  var ua, s, i;

  this.isIE    = false;  // Internet Explorer
  this.isNS    = false;  // Netscape
  this.isOpera = false;
  this.version = null;

  ua = navigator.userAgent;

  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
	 this.isIE = true;
	 this.version = parseFloat(ua.substr(i + s.length));
	 return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
	 this.isNS = true;
	 this.version = parseFloat(ua.substr(i + s.length));
	 return;
  }

  // Treat any other "Gecko" browser as NS 6.1.

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
	 this.isNS = true;
	 this.version = 6.1;
	 return;
  }

  s = "Opera";
  if((i = ua.indexOf(s)) >= 0) {
	  this.isOpera = true;
	  this.version = parseFloat(ua.substr(i + s.length));
	  return;
  }
}

var browser = new Browser();

var whtSpEnds = new RegExp("^\\s*|\\s*$", "g");
var whtSpMult = new RegExp("\\s\\s+", "g");

function normalizeString(str) {
	str = str.replace(whtSpMult, " ");  // Collapse any multiple whites space.
	str = str.replace(whtSpEnds, "");   // Remove leading or trailing white space.

	return str;
}

String.prototype.normalize = function() {
	return (this.replace(whtSpMult, " ")).replace(whtSpEnds, "");
}

String.prototype.trim = function() {
	return this.replace(/^\s+/,'').replace(/\s+$/,'');
}

String.prototype.ltrim = function() {
	return this.replace(/^\s+/,'');
}

String.prototype.rtrim = function() {
	return this.replace(/\s+$/,'');
}

//Array.prototype.contains = function(value) {
//	for(var i = 0;i < this.length;i++) {
//		if(this[i] == value)
//			return true;
//	}

//	return false;
//}

Array.prototype.contains = function(value) {
	for(var i=0;i < this.length;i++)
		if(this[i] == value)
				return true;
	return false;
}

Array.indexOf = function(element) {
	for(var i=0;i < this.lenght;i++)
		if(this[i] == element)
			return i;
	return false;
}

function ArrayContains(ar, value) {
	for(var i = 0;i < ar.length;i++)
		if(ar[i] == value)
			return true;

	return false;
}

function getTextValue(el) {
	var i, s;

	// Find and concatenate the values of all text nodes contained
	// within the element.
	s = "";
	for (i = 0; i < el.childNodes.length; i++)
		if (el.childNodes[i].nodeType == document.TEXT_NODE)
			s += el.childNodes[i].nodeValue;
		else if (el.childNodes[i].nodeType == document.ELEMENT_NODE &&
				el.childNodes[i].tagName == "BR")
			s += " ";
		else
			// Use recursion to get text within sub-elements.
			s += getTextValue(el.childNodes[i]);

	return normalizeString(s);
}

function getParamsString(el) {
	if(el.firstChild && el.firstChild.nodeType == document.COMMENT_NODE)
		return el.firstChild.data;
	else
		return "";
}

function libera(objeto) {
	delete objeto;
}

Object.extend(Element, {
	getExpando: function(propiedad) {
		if(this[propiedad])
			return this[propiedad];
		else
			return this.getAttribute(propiedad);
	}
});

function getExpando(el, prop) {
	return el.getAttribute(prop);
//	el = $(el);
//	alert(typeof(el));
		if(el.getAttribute)
			return el.getAttribute(prop);
		else if(el[prop])
			return el[prop];
		else
			return "";
}

function addClass(el, classname) {
	el.className = el.className + " " + classname;
}

function removeClass(el, classname) {
	var classtest = new RegExp(classname, "gi");
	el.className = el.className.replace(classtest, "").normalize();
}

function formatNumber(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? ',' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + '.' + '$2');
	}
	return x1 + x2;
}

function isDate(str) {
	var datemask = /^(\d+)\W(\d+)\W(\d+)$/;
	if (!datemask.exec(str))
		return false;

	if(parseFloat(RegExp.$3) == 0)
		return true;

	with(new Date(RegExp.$3, RegExp.$2-1, RegExp.$1))
		return((getDate() == RegExp.$1) && (getFullYear() == RegExp.$3) && (getMonth() == RegExp.$2-1))	;
}

function strToDate(str) {
	var datemask = /^(\d+)\W(\d+)\W(\d+)$/;
	if (!datemask.exec(str))
		return null;

	d = new Date(RegExp.$3, RegExp.$2-1, RegExp.$1);
	if((d.getDate() == RegExp.$1) && (d.getFullYear() == RegExp.$3) && (d.getMonth() == RegExp.$2-1))
		return d;
	else
		return null;
}

function togglevisibility(objname) {
	odiv = document.getElementById(objname);
	if(odiv.style.visibility == "hidden")
		odiv.style.visibility = "visible";
	else
		odiv.style.visibility = "hidden";

	return false;
}

function toggledisplay(objname) {
	objp = document.getElementById(objname);
	if(objp.style.display == "none") {
		objp.style.display = lastdisplaystate;
		objp.style.display = lastdisplaystate;
	} else {
		lastdisplaystate = objp.style.display;
		objp.style.display = "none";
		objp.style.display = "none";
	}
	return false;
}

function displayOn() {
  for (var i = 0; i < arguments.length; i++) {
	 var element = arguments[i];
	 if (typeof element == 'string')
		element = document.getElementById(element);

	 element.style.display = "";
  }
}

function displayOff() {
  for (var i = 0; i < arguments.length; i++) {
	 var element = arguments[i];
	 if (typeof element == 'string')
		element = document.getElementById(element);

	 element.style.display = "none";
  }
}

function getXPos(el) {
	var left = el.offsetLeft;
	left -= el.scrollLeft;

	if(el.offsetParent)
		if(el.offsetParent.style.position != "absolute")
			left += getXPos(el.offsetParent);

	return left;
}

function getYPos(el) {
	var top = el.offsetTop;
	top -= el.scrollTop;

	if(el.offsetParent)
		if(el.offsetParent.style.position != "absolute")
			top += getYPos(el.offsetParent);

	return top;
}

function getPageOffsetLeft(el) {
	var x;

// Return the x coordinate of an element relative to the page.

	if(el.style.position == "absolute")
		return 0;

	x = el.offsetLeft;
	if(el.offsetParent != null)
		if(el.offsetParent.style.position != "absolute")
			x += getPageOffsetLeft(el.offsetParent);
		else
			if(!browser.isIE)
				x += el.offsetParent.offsetLeft;

	return x;
}

function IEgetPageOffsetLeft(el) {
	var x;

// Return the x coordinate of an element relative to the page.

	if(el.style.position == "absolute")
		return 0;

	x = el.offsetLeft;
	if(el.offsetParent != null)
		if(el.offsetParent.style.position != "absolute")
			x += IEgetPageOffsetLeft(el.offsetParent);
		else
			x += el.offsetParent.offsetLeft;

	return x;
}


function getPageOffsetTop(el) {
	var y;

	if(el.style.position == "absolute")
		return 0;

	y = el.offsetTop;
	if(el.offsetParent != null)
		if(el.offsetParent.style.position != "absolute")
			y += getPageOffsetTop(el.offsetParent);
		else
			if(!browser.isIE)
				y += el.offsetParent.offsetTop;

	return y;
}

function IEgetPageOffsetTop(el) {
	var y;

	if(el.style.position == "absolute")
		return 0;

	y = el.offsetTop;
	if(el.offsetParent != null)
		if(el.offsetParent.style.position != "absolute")
			y += IEgetPageOffsetTop(el.offsetParent);
		else
			y += el.offsetParent.offsetTop;

	return y;
}

function getParentElement(objeto) {
//	if(browser.isIE)
//		return objeto.parentElement;
//	else
		return objeto.parentNode;
}

function getObj(el) {
	if (typeof el == 'string')
		return document.getElementById(el);
	else
		return el;
}

function getParentTag(obj, tag) {
	while(obj.tagName.toUpperCase() != tag.toUpperCase() && obj  != null)
		obj = obj.parentNode;

	return obj;
}

function getEventObject(evento) {
//	return  evento.srcElement || evento.target || evento.currentTarget;

	if (browser.isIE)
		object = evento.srcElement;
	else
		object = evento.target;

	return object;
}

function getevent(ev) {
	if(window.event)
		return window.event
	else
		return ev;
}

function cancelevent(ev) {
	if(window.event)
		window.event.cancelBubble = true;
	else
		ev.stopPropagation();
}

function trMouseIn(evento, newclass) {
	objeto = getParentTag(getEventObject(evento), "TR");

	objeto.oldclassName = objeto.className;

	if(newclass) {
		objeto.className = newclass;
	}

	expMouseIn(objeto);
}

function objMouseIn(objeto, newclass) {
	objeto.oldclassName = objeto.className;

	if(newclass) {
		objeto.className = newclass;
	}

	expMouseIn(objeto);
}

function trMouseOut(evento) {
	objeto = getParentTag(getEventObject(evento), "TR");

	objeto.className = objeto.oldclassName;
	cursorDefault(objeto);
}

function objMouseOut(objeto) {
	objeto.className = objeto.oldclassName;
	cursorDefault(objeto);
}

function expitemclick(objeto) {
	if(getExpando(objeto, "confirmtext"))
		if(!confirm(getExpando(objeto, "confirmtext")))
			return
		else
			if(getExpando(objeto, "reconfirmtext"))
				if(!confirm(getExpando(objeto, "reconfirmtext")))
					return;

	if(getExpando(objeto, "href"))
		window.open(getExpando(objeto, "href"), '_self');
}

function expMouseIn(objeto) {
	if(getExpando(objeto, "href"))
		cursorPointer(objeto);
}

function expMouseOut(objeto) {
	cursorDefault(objeto);
}

function mouseOver(objeto, newclass) {
	objeto.oldclassName = objeto.className;
	objeto.className = newclass;

	cursorPointer(objeto);
}

function mouseOut(objeto) {
	objeto.className = objeto.oldclassName;

	cursorDefault(objeto);
}

function cursorPointer(objeto) {
	if(browser.isIE)
		objeto.style.cursor = 'hand';
	else
		objeto.style.cursor = 'pointer';
}

function cursorDefault(objeto) {
	objeto.style.cursor = 'default';
}

var claseantigua;

function mousein(objeto, clasenueva) {
	if(clasenueva != "") {
		if(!objeto.oldClass)
			objeto.oldClass = objeto.className;

		objeto.className = clasenueva;
	}

	if(objeto.getElementsByTagName("A").item(0)) {
		window.status = objeto.getElementsByTagName("A").item(0);
		cursorPointer(objeto);
	}
}

function mouseout(objeto) {
	window.status = window.defaultStatus;
	cursorDefault(objeto);

	if(objeto.oldClass)
		objeto.className = objeto.oldClass;
}

function itemclick(objeto) {
	anch = objeto.getElementsByTagName("A").item(0);

	if(anch)
		anch.click();
}

function checkdate(objeto) {
	var formatofecha = /^(\d+)\W(\d+)\W(\d+)$/;
	formatofecha.exec(objeto.value);

	var fecha = new Date (RegExp.$3, parseFloat(RegExp.$2)-1, parseFloat(RegExp.$1));
	if(RegExp.$1 > 31 || RegExp.$2 > 12 || RegExp.$1 < 1 || RegExp.$2 < 1 || RegExp.$1 != fecha.getDate() || RegExp.$2 != fecha.getMonth()+1)
		return false;

	return true;
}

function str2date(str_date) {
	var datemask = /^(\d+)\W(\d+)\W(\d+)$/;
	if (!datemask.exec(str_date))
		return null;

	return (new Date(RegExp.$3, RegExp.$2-1, RegExp.$1));
}

function date2str(datevalue) {
	return (new String(datevalue.getDate() + "/" + (datevalue.getMonth()+1) + "/" + datevalue.getFullYear()));
}

function goTo(enlace) {
	window.open(enlace, '_self');
}

function confirmmsg(mensaje, enlace) {
	if(confirm(mensaje))
		window.open(enlace, '_self');
}

function confirmmsgs() {
	for(var i=0; i < arguments.length; i++)
		if(!confirm(arguments[i]))
			return false;

		return true;
}

function removechildnodes(objeto) {
	if(objeto.childNodes)
		nodes = objeto.childNodes;
	else
		nodes = objeto.children;

	while(nodes.length)
		objeto.removeChild(nodes[0]);
}

function imprime() {
	window.print();
}

function openwndprn(enlace) {
	window.open(enlace, "wndprn", "height=600, width=800, status=no, toolbar=no, menubar=no, location=no");
}

function openwnd(enlace) {
	window.open(enlace, "wnd", "height=600, width=800, status=no, toolbar=no, menubar=no, location=no");
}

var DOMViewerObj;

function DisplayDOM(objeto) {
	DOMViewerObj=objeto;
	window.open('domviewer.html');
}

function cancelclick(ev) {
	if(window.event)
		window.event.cancelBubble = true;
	else
		ev.stopPropagation();
}

function propagatecheckbox(ev, checkbox) {
	cancelclick(ev);

	var chksarray = document.getElementsByTagName("INPUT");
	for(var i=0;i < chksarray.length;i++) {
		if(chksarray[i].type == "checkbox" && chksarray[i].id.substr(0, checkbox.id.length) == checkbox.id) {
			chksarray[i].checked = checkbox.checked;
		}
	}
}

function changealpha(obj, alpha) {
	if(browser.isIE)
		obj.filters[0].opacity=alpha;
	else
		obj.MozOpacity=alpha+"%"
}

function chkassigndate(source, target) {
	checkbox = source;
	dateinput = document.getElementById(target);

	hoy = new Date();

	if(checkbox.checked) {
		dateinput.value = hoy.getDate() + "/" + (hoy.getMonth() + 1) + "/" + hoy.getFullYear();
	} else {
		dateinput.value = "00/00/0000";
	}
}

function chkassignuser(source, target, username) {
	checkbox = source;
	textinput = document.getElementById(target);
	nmecombo = eval(target+"Handler");

	if(checkbox.checked)
		textinput.value = username;
	else
		textinput.selectedIndex = 0;

	nmecombo.displayvalue();
}

function radioassigndate(source, target) {
	radiobutton = source;
	dateinput = document.getElementById(target);

	hoy = new Date();

	if(radiobutton.value != 0) {
		dateinput.value = hoy.getDate() + "/" + (hoy.getMonth() + 1) + "/" + hoy.getFullYear();
	} else {
		dateinput.value = "00/00/0000";
	}
}

function radioassignuser(source, target, username) {
	radiobutton = source;
	textinput = document.getElementById(target);
	nmecombo = eval(target+"Handler");

	if(radiobutton.value != 0) {
		textinput.value = username;
	} else {
		textinput.selectedIndex = 0;
	}
	nmecombo.displayvalue();
}

function formatnumber(number, decimals) {
	potencia = Math.pow(10, decimals);

	if(isNaN(number))
		return "0";

	number = Math.round(number * potencia);
	decimales = number % potencia;
	entero = Math.floor(number / potencia);

	return (entero + "." + decimales);
}

function enableinputs() {
	var inputs = document.getElementsByTagName("INPUT");

	for(var i = 0;i < inputs.length; i++)
		inputs[i].disabled = false;

	var selects = document.getElementsByTagName("SELECT");
	for(var i=0;i < selects.length; i++)
		selects[i].disabled = false;

	return true;
}

function enableElementByName(target) {
	atarget = document.getElementsByName(target);

	for( i=0; i < atarget.length; i++)
		atarget[i].disabled = false;
}


function disableElementByName(target) {
	atarget = document.getElementsByName(target);

	for( i=0; i < atarget.length; i++)
		atarget[i].disabled = true;
}

function getValueByName(target) {
	atarget = document.getElementsByName(target);

	for( i=0; i < atarget.length; i++)
		if(atarget[i].checked)
			return atarget[i].value;

	return null;
}

var preimgs = new Array();
var preimgsurl = new Array();

function preloadimgs() {
	if(document.images) {
		for(var i=0; i < preloadimgs.arguments.length; i++) {
//			if(preimgs.contains(preloadimgs.arguments[i]))
			if(ArrayContains(preimgsurl, preloadimgs.arguments[i]))
				continue;	//si la misma url ha sido cargada continua
			var image = new Image();
			image.src = preloadimgs.arguments[i];
			preimgs.push(image);
			preimgsurl.push(preloadimgs.arguments[i]);
		}
	}
}


function popinmessage(el, texto) {

}

function loadinframe(objeto) {
//	DisplayDOM(window.parent.document.getElementById("frmform"));
	if(getExpando(objeto, "confirmtext"))
		if(!confirm(getExpando(objeto, "confirmtext")))
			return
		else
			if(getExpando(objeto, "reconfirmtext"))
				if(!confirm(getExpando(objeto, "reconfirmtext")))
					return;

	if(getExpando(objeto, "href")) {
		var frmform = parent.document.getElementById("frmform");
		var frmlist = parent.document.getElementById("frmlist");
		frmform.src = getExpando(objeto, "href");
//		frmform.style.display = "";
//		frmlist.style.display = "none";
	}
//		window.open(getExpando(objeto, "href"), '_self');
}

//
// Formularios
//

function getFormElements(formulario, funcion) {
	form = document.getElementById(formulario);

	controles = form.elements;
	for(i=0; i < controles.length; i++)
		funcion(controles[i]);
}

function enableFormElement(elemento) {
	switch(elemento.tagName) {
		default:
			elemento.disabled = false;
			break;
	}
}

function disableFormElement(elemento) {
	switch(elemento.tagName) {
		default:
			elemento.disabled = true;
			break;
	}
}

function enableForm(formulario) {
	getFormElements(formulario, enableFormElement);
}

function disableForm(formulario) {
	getFormElements(formulario, disableFormElement);
}

function getForm(formulario) {
	form = document.getElementById(formulario);

	resultado = "form="+formulario;
	controles = form.elements;
	for(i=0; i < controles.length; i++) {
		switch(controles[i].type) {
			case 'checkbox':
				resultado += "&" + controles[i].name + "=" + (controles[i].checked ? "1" : "0");
				break;
			default:
				resultado += "&" + controles[i].name + "=" + escape(controles[i].value);
				break;
		}
	}

	return resultado;
}

function clearForm(formulario) {
	form = document.getElementById(formulario);

	for(i=0; i < controles.length; i++)
		controles[i].value = "";
}

//
// Posicionamiento
//

function posTopLeft(el, margin) {
	if(!margin) margin = 5;
	el = getObj(el);

	el.style.bottom = "";
	el.style.right = "";
	el.style.top = (((window.pageYOffset) ? window.pageYOffset : (document.documentElement) ? document.documentElement.scrollTop : document.body.scrollTop) + margin) + "px";
	el.style.left = (((window.pageXOffset) ? window.pageXOffset : (document.documentElement) ? document.documentElement.scrollLeft : document.body.scrollLeft) + margin) + "px";
	return el;
}

function posTopRight(el, margin) {
	if(!margin) margin = 5;
	el = getObj(el);

	el.style.bottom = "";
	el.style.left = "";
	el.style.top = (((window.pageYOffset) ? window.pageYOffset : (document.documentElement) ? document.documentElement.scrollTop : document.body.scrollTop) + margin) + "px";
	el.style.right = (((window.pageXOffset) ? window.pageXOffset : (document.documentElement) ? document.documentElement.scrollLeft : document.body.scrollLeft) + margin) + "px";
	return el;
}

function posCenter(el, margin) {
	if(!margin) margin = 5;
	el = getObj(el);

	el.style.bottom = "";
	el.style.right = "";
//	DisplayDOM(document);
//	alert(window.pageYOffset + " - " + document.documentElement.scrollTop + " - " + document.body.scrollTop + " - " + document.height + " - " + el.offsetHeight + " " + document.documentElement.height);
	el.style.top = (((window.pageYOffset) ? window.pageYOffset : (document.documentElement) ? document.documentElement.scrollTop : document.body.scrollTop) + ((document.body.offsetHeight - el.offsetHeight) / 2)) + "px";
	el.style.left = (((window.pageXOffset) ? window.pageXOffset : (document.documentElement) ? document.documentElement.scrollLeft : document.body.scrollLeft) + ((document.body.offsetWidth - el.offsetWidth) / 2)) + "px";
	return el;
}

function inspect(el) {
	buffer = "";

	if(el) {
//		buffer += Object.inspect(el);

		for(x in Object.keys(el)) {
				buffer += x;
				buffer += "\n";
		}
	}

	return buffer;
}

/*
function inspect(el) {
	buffer = "";

	if(el) {
		buffer += Object.inspect(el);

//		for(x in el)
//			if(el[x])
//				buffer += x+" = "+typeof(el[x])+" "+el[x]+"\n";
				buffer += "\n";
	}

	return buffer;
}*/
