function $ie(ver) {
	if (ver && document.all) {
		var re = new RegExp('MSIE '+ver+'.0');
		return window.navigator.appVersion.match(re);
	} else if (document.all) return true;
	else return false;
}
function $id(id) {
	if ($ie()) return document.all[id];
	else return document.getElementById(id);
}
function $keyCode(event) {
	return event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
}
function $set_innerText(id, text) {
	if (typeof(id)=='string')
		var obj = $id(id);
	else
		var obj = id;
	if (obj.innerText && typeof(obj.innerText)=='string')
		obj.innerText = text;
	else
		obj.textContent = text;
}
function $get_innerText(id) {
	if (typeof(id)=='string')
		var obj = $id(id);
	else
		var obj = id;
	if (obj.innerText)
		return obj.innerText;
	else
		return obj.textContent;
}
function $set_innerHTML(id, html){
	if (document.getElementById && !document.all){
		rng = document.createRange();
		el = document.getElementById(id);
		rng.setStartBefore(el);
		htmlFrag = rng.createContextualFragment(html);
		while (el.hasChildNodes())
			el.removeChild(el.lastChild);
		el.appendChild(htmlFrag);
	} else {
		document.getElementById(id).innerHTML = html;
	}
}
function $append_innerHTML(id, html){
	/*if (document.getElementById && !document.all){
		rng = document.createRange();
		el = document.getElementById(id);
		rng.setStartBefore(el);
		htmlFrag = rng.createContextualFragment(html);
		while (el.hasChildNodes())
			el.removeChild(el.lastChild);
		el.appendChild(htmlFrag);
	} else {
		document.getElementById(id).innerHTML += html;
	}*/
	document.getElementById(id).innerHTML += html;
}
function $get_innerHTML(id){
	if (document.getElementById && !document.all){
		rng = document.createRange();
		el = document.getElementById(id);
		while (el.hasChildNodes())
			el.removeChild(el.lastChild);
	} else {
		return document.getElementById(id).innerHTML;
	}
}
function $get_cursor(obj) {
	return obj.style.cursor;
}
function $set_cursor(obj, cursor) {
	switch (cursor) {
	case "hand":
		if ($ie())
			obj.style.cursor = "hand";
		else
			obj.style.cursor = "pointer";
		break;
	default:
		obj.style.cursor = cursor;
		break;
	}
}
function $isTextNode(node) {
	return (node.nodeType==3 || node.nodeType==8);
}
function $isElementNode(node) {
	return (node.nodeType==1);
}
function $nodeListLength(nodes) {
	var count = nodes.length;
	if (!$ie()) {
		for (var i=0; i<nodes.length; i++) {
			if (!$isElementNode(nodes[i])) count--;
		}
	}
	return count;
}
function $getNode(nodes, nodeName) {
	for (var i=0; i<nodes.length; i++) {
		if ($isElementNode(nodes[i])) {
			if (nodes[i].nodeName==nodeName)
				return nodes[i];
		}
	}
}
function $getText(obj) {
	if ($ie())
		return obj.text;
	else
		return obj.textContent;
}
function $getNodeValue(nodes, nodeName) {
	for (var i=0; i<nodes.length; i++) {
		if ($isElementNode(nodes[i])) {
			if (nodes[i].nodeName==nodeName) {
				if ($ie())
					return nodes[i].text;
				else
					return nodes[i].textContent;
			}
		}
	}
	return null;
}
function $getNodeValues(nodes, nodeName) {
	var values = [];
	for (var i=0; i<nodes.length; i++) {
		if ($isElementNode(nodes[i])) {
			if (nodes[i].nodeName==nodeName) {
				if ($ie())
					values.push(nodes[i].text);
				else
					values.push(nodes[i].textContent);
			}
		}
	}
	return values;
}
function $nodeValue(node) {
	if (node.text)
		return node.text;
	else
		return node.textContent;
}
function $getNodeValueByTagName(nodes, tagName) {
	for (var i=0; i<nodes.length; i++) {
		if ($isElementNode(nodes[i])) {
			if (nodes[i].tagName==tagName) {
				return nodes[i].value;
			}
		}
	}
}
function $attrValue(attrs, attName) {
	return attrs.getNamedItem(attName).value;
}
function $addEvent(obj, evType, fn, useCapture) {
	var capture = (useCapture)?true:false;
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, capture);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be attached");
	}
}
function $removeEvent(obj, evType, fn, useCapture) {
	if (obj.removeEventListener) {
		obj.removeEventListener(evType, fn, useCapture);
		return true;
	} else if (obj.detachEvent) {
		var r = obj.detachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be removed");
	}
}
function $attachEvent(obj, eventName, listener) {
	if (obj.addEventListener) {
		obj.addEventListener(eventName.substring(2), listener, true);
	} else if (obj.attachEvent) {
		obj.attachEvent(eventName, listener);
	}
}
function $detachEvent(obj, eventName, listener) {
	if (obj.removeEventListener) {
		obj.removeEventListener(eventName, listener, false);
	} else if (obj.attachEvent) {
		obj.dettachEvent(eventName, listener);
	}
}
function $loadXML(dname, callback) {
	if (window.ActiveXObject) {
		var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=(callback)?true:false;
		if (callback) {
			xmlDoc.onreadystatechange = function() {
				if (xmlDoc.readyState == 4) {
					callback(xmlDoc);
				}
			}
		}
		xmlDoc.load(dname);
		//if (callback) callback(xmlDoc);
		return xmlDoc;
	} else {
		var request = GXmlHttp.create();
		var asynchronous = (callback)?true:false;
		request.open("GET", dname, asynchronous);
		if (asynchronous) {
			request.onreadystatechange = function() {
				if (request.readyState == 4 && callback) {
					callback(GXml.parse(request.responseText));
				}
			}
		}
		request.send(null);
		return GXml.parse(request.responseText);
	}
}
function $loadXMLString(dname, callback) {
	return GXml.parse(dname);
	if (window.ActiveXObject) {
		var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.loadXML(dname);
		if (callback) callback(xmlDoc);
		return xmlDoc;
	} else {
		return GXml.parse(dname);
	}
}
function $_loadXML(dname, callback) {
	var xmlDoc;
	// code for IE
	if (window.ActiveXObject) {
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		if (callback) callback(xmlDoc);
	} else if (document.implementation && document.implementation.createDocument) {// code for Mozilla, Firefox, Opera, etc.
		xmlDoc = document.implementation.createDocument("","",null);
		if (callback) xmlDoc.onload = callback;
	} else {
		alert(_('Su navegador no soporta el parser XML'));
	}
	xmlDoc.async=false;
	xmlDoc.load(dname);
	return xmlDoc;
}