function so_clearInnerHTML(obj) {
	while(obj.firstChild) obj.removeChild(obj.firstChild);
}

function insertContent(destElementId, htmlText) {
  document.getElementById(destElementId).innerHTML = htmlText;
}

function copyDOMTreeToDocoument(currentElement, domElementDestino)
{
  if (currentElement)
  {
    var newChild;
    var j;
    var tagName=currentElement.tagName;
    
    if (tagName) {
    var tagNamelwrCase = tagName.toLowerCase();
        var attr;
    	newChild = document.createElement(tagName);
	domElementDestino.appendChild(newChild);
	for (var a=0; a < currentElement.attributes.length; a++) 
	{
	     attr = currentElement.attributes[a];
	     attrnamelwrcase = attr.name.toLowerCase();
	     if (attrnamelwrcase == "style") {
		newChild.style.cssText = attr.value; 
	     }
	     /*else if (attrnamelwrcase == "class") {
		if (document.all) {
		   newChild.setAttribute("className", attr.value);
		} else {
		  newChild.setAttribute(attr.name, attr.value);
		}
	     }
	     else if (attrnamelwrcase == "onclick") {
	     	if (newChild.attachEvent) {
		    newChild.attachEvent("onclick", new Function(attr.value));
		} 
		else if (newChild.addEventListener) {				    
		    newChild.addEventListener("click", new Function(attr.value), false);
		}
		else {
		    newChild.onclick = new Function(attr.value);
		}	     
	     }
	     else if (attrnamelwrcase == "ondblclick") {
	     	if (newChild.attachEvent) {
		    newChild.attachEvent("ondblclick", new Function(attr.value));
		} 
		else if (newChild.addEventListener) {				    
		    newChild.addEventListener("dblclick", new Function(attr.value), false);
		}
		else {
		    newChild.ondblclick = new Function(attr.value);
		}	     
	     }
	     else if (attrnamelwrcase == "onmousedown") {
	     	if (newChild.attachEvent) {
		    newChild.attachEvent("onmousedown", new Function(attr.value));
		} 
		else if (newChild.addEventListener) {				    
		    newChild.addEventListener("mousedown", new Function(attr.value), false);
		}
		else {
		    newChild.onmousedown = new Function(attr.value);
		}	     
	     }
	     else if (attrnamelwrcase == "onmousemove") {
	     	if (newChild.attachEvent) {
		    newChild.attachEvent("onmousemove", new Function(attr.value));
		} 
		else if (newChild.addEventListener) {				    
		    newChild.addEventListener("mousemove", new Function(attr.value), false);
		}
		else {
		    newChild.onmousemove = new Function(attr.value);
		}	     
	     }
	     else if (attrnamelwrcase == "onmouseout") {
	     	if (newChild.attachEvent) {
		    newChild.attachEvent("onmouseout", new Function(attr.value));
		} 
		else if (newChild.addEventListener) {				    
		    newChild.addEventListener("mouseout", new Function(attr.value), false);
		}
		else {
		    newChild.onmouseout = new Function(attr.value);
		}	     
	     }
	     else if (attrnamelwrcase == "onmouseover") {
	     	if (newChild.attachEvent) {
		    newChild.attachEvent("onmouseover", new Function(attr.value));
		} 
		else if (newChild.addEventListener) {				    
		    newChild.addEventListener("mouseover", new Function(attr.value), false);
		}
		else {
		    newChild.onmouseover = new Function(attr.value);
		}	     
	     }
	    else if (attrnamelwrcase == "onmouseup") {
	     	if (newChild.attachEvent) {
		    newChild.attachEvent("onmouseup", new Function(attr.value));
		} 
		else if (newChild.addEventListener) {				    
		    newChild.addEventListener("mouseup", new Function(attr.value), false);
		}
		else {
		    newChild.onmouseup = new Function(attr.value);
		}	     
	     }*/
	     else
		newChild.setAttribute(attr.name, attr.value);
	}
    } else if (currentElement.nodeValue) {
	newChild = document.createTextNode(currentElement.nodeValue);
        domElementDestino.appendChild(newChild);
    }

    var i=0;
    var currentElementChild=currentElement.childNodes[i];
    while (currentElementChild)
    {
  	copyDOMTreeToDocoument(currentElementChild, newChild);
        i++;
        currentElementChild=currentElement.childNodes[i];
    }			
  }
}

function CreateAjax(url, containerid, showLoadingMsg, loadingMsg, waitGIF, callbackFunc, callbackFuncSessionExpired) {
    var ie = false;
    var request = false;
    if (window.XMLHttpRequest) // if Mozilla, Safari etc
        request = new XMLHttpRequest();
    else if (window.ActiveXObject) { // if IE
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
            ie = true;    
        }  catch (e){
            try{
                request = new ActiveXObject("Microsoft.XMLHTTP");
                ie = true;
            } catch (e) {
            }
        }
    } else {
        return false;
    }

    if (request) {
        request.open("GET", url, true); // false indica una petición síncrona, true será asíncrona
        request.onreadystatechange = function() { ShowRequestData(request, containerid, showLoadingMsg, loadingMsg, waitGIF, callbackFunc, callbackFuncSessionExpired); }
        request.send(null);
    } 

    return request;
}

function ShowRequestData(request, containerid, showLoadingMsg, loadingMsg, waitGIF, callbackFunc, callbackFuncSessionExpired) {
    if (request.readyState == 4 && request.status == 200) {
        var expiredEle = null;
        if (request.responseXML != null && request.responseXML.documentElement != null)
            expiredEle = request.responseXML.documentElement.getElementsByTagName('sessionExpired');
        if (expiredEle != null && expiredEle.length > 0) {
            var formIdEle = expiredEle[0].getElementsByTagName('formId');
            var theForm = document.getElementById(formIdEle[0].firstChild.nodeValue);
            if (callbackFuncSessionExpired) {
                callbackFuncSessionExpired(theForm);
            }
            else {
                /*
                    Sesión expirada entonces hace un submit de la página
                    para que se vuelva a cargar
                */	
                theForm.submit();
            }
        }
        else if (callbackFunc == null && containerid) {
           var divTMP = document.createElement("div");
           copyDOMTreeToDocoument(request.responseXML.documentElement, divTMP);
           var domContainer = document.getElementById(containerid);
           so_clearInnerHTML(domContainer);
           domContainer.innerHTML = divTMP.innerHTML;
        } else {
            /*
                Llama a la función que se encarga de desplegar la informacion
            */
            callbackFunc(request, containerid);	
        }
    } else if (request.readyState == 4 && request.status != 200 && containerid) {
        insertContent(containerid, '<span style="color:#f00; font-weight:bold; font-family:Arial">Ocurri&oacute; un error!</span>');
    } else if (request.readyState == 1 && showLoadingMsg && containerid) {
        if (loadingMsg == null)
            loadingMsg = "Cargando...";
        var msg = '<span style="color:#000; font-weight:bold; font-family:Arial">';
        if (waitGIF)
            msg = msg + '<img src="resources/img/wait.gif" style="vertical-align:middle; margin-right:3px"></img>';
        msg = msg + loadingMsg + '</span>';
        insertContent(containerid, msg);
    }
}

function RequestFromAJAX(containerid, requestString, showLoadingMsg, loadingMsg, waitGIF, callbackFunc, callbackFuncSessionExpired) {
   if (requestString.indexOf("?") < 0)
   	requestString += "?" + new Date().getTime();
   else
   	requestString += "&" + new Date().getTime();
   url = "http://www.347software.com/347softemailaccount/" + requestString;
   CreateAjax(url, containerid, showLoadingMsg, loadingMsg, waitGIF, callbackFunc, callbackFuncSessionExpired);
}
