/*
 * Returns an new XMLHttpRequest object, or false if the browser
 * doesn't support it
 */
function newXMLHttpRequest() {
  var xmlreq = false;
  // Create XMLHttpRequest object in non-Microsoft browsers
  if (window.XMLHttpRequest) {
    xmlreq = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    try {
      // Try to create XMLHttpRequest in later versions
      // of Internet Explorer
      xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e1) {
      // Failed to create required ActiveXObject
      try {
        // Try version supported by older versions
        // of Internet Explorer
        xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
        // Unable to create an XMLHttpRequest by any means
        xmlreq = false;
      }
    }
  }
  return xmlreq;
}

 /*
	* Returns a function that waits for the specified XMLHttpRequest
	* to complete, then passes it XML response to the given handler function.
  * req - The XMLHttpRequest whose state is changing
  * responseXmlHandler - Function to pass the XML response to
  */
function getReadyStateHandler(req, responseXmlHandler) {
  // Return an anonymous function that listens to the XMLHttpRequest instance
  return function () {
    // If the request's status is "complete"
    if (req.readyState == 4) {
      // Check that we received a successful response from the server
      if((req.status == 200)||(req.status == 0)) {
        // Pass the XML payload of the response to the handler function.
        responseXmlHandler(req.responseXML);;
      } else {
        // An HTTP problem has occurred
        alert("HTTP error "+req.status+": "+req.statusText);
      }
    }
  }
}




/* Functions to handle browser incompatibilites */
function eventElement(event) {
	if(isMoz) {
		return event.currentTarget;
	} else {
		return event.srcElement;
	}
}


function removeKeyListener(element, listener) {
	//alert("a");
	if (isSafari){
		element.removeEventListener("keydown",listener,false);
	}else if (isMoz){
		//alert("a");
		element.removeEventListener("keypress",listener,false);
	}else{
		element.detachEvent("onkeydown",listener);
	}
}

function addKeyListener(element, listener) {
	//alert("a");
	if (isSafari){
		element.addEventListener("keydown",listener,false);
		
	}else if (isMoz){
		//alert("a");
		element.addEventListener("keypress",listener,false);
	}else{
		element.attachEvent("onkeydown",listener);
	}
}

function addListener(element, type, listener) {
	if(element.addEventListener) {
		element.addEventListener(type, listener, false);
	} else {
		element.attachEvent('on' + type, listener);
	}
}

function removeListener(element, type, listener) {
	if(element.removeEventListener) {
		element.removeEventListener(type, listener, false);
	} else {
		element.detachEvent('on' + type, listener);
	}
}
	
/* XML Helper functions */

function innerText(node) {
    // is this a text or CDATA node?
    if (node.nodeType == 3 || node.nodeType == 4) {
        return node.data;
    }
    var i;
    var returnValue = [];
    for (i = 0; i < node.childNodes.length; i++) {
        returnValue.push(innerText(node.childNodes[i]));
    }
    return returnValue.join('');
}


function flatten(node) {
	if(node.nodeType == 1) {
		return '<' + node.nodeName + flattenAttributes(node) + '>' +
		flattenChildren(node.childNodes) + '</' + node.nodeName + '>';
	} else if(node.nodeType == 3) {
		return node.nodeValue;
	}
}

function flattenAttributes(node) {
  var buffer = ''
  for(var i=0;i<node.attributes.length;i++) {
    var attribute = node.attributes[i];
    buffer += ' '+attribute.name+'="'+attribute.value+'"'
  }
  return buffer;
}

function flattenChildren(nodes) {
	var buffer = '';
	if(nodes.length > 0) {
		for (var i=0;i<nodes.length;i++) {
			buffer += flatten(nodes[i]);
		}
	}
	return buffer;
}

function createElements(nodes, nodo_padre){
	if(nodes.length > 0) {
		for (var i=0;i<nodes.length;i++) {
			nodo_padre.appendChild(createElementXML(nodes[i]));
		}
	}
}

function createElementXML(node) {
	if(node.nodeType == 1) {
		var elementObj=document.createElement(node.nodeName);
		setAttributes(node, elementObj) ;
		createElements(node.childNodes, elementObj);
		return elementObj;
	} else if(node.nodeType == 3) {
		return document.createTextNode(node.nodeValue); ;
	}
}

function setAttributes(node, obj) {
  for(var i=0;i<node.attributes.length;i++) {
  	var attribute = node.attributes[i];
    obj.setAttribute(attribute.name, attribute.value);
  }
}




function copyAttributes(source, destination) {
	for(var i=0;i<source.attributes.length;i++) {
		var attribute = source.attributes[i];
		if(attribute.name=="colspan") {
			destination.colSpan = attribute.value;
		} else {
			destination.setAttribute(attribute.name, attribute.value);
		}
	}
	destination.className = source.getAttribute('class');
}


