// Basic Ajax Framework

// Create ajax object - improved
function createAjaxObject(objectName) {
    var successMessage = (objectName) ? "<h1>Creation of object " + objectName + " successful!</h1>" : "";
    if (window.XMLHttpRequest) {
        objectName =  new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        objectName = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else {
            var errorMessage = (objectName) ? "<h1>Creation of object " + objectName + " failed</h1>" : "";
            document.getElementById('MessagesHere').innerHTML = errorMessage; 
    } 
    return objectName;
}

function requestArray(arrayName, objectName){
    arrayName.push(createAjaxObject(objectName));
}

function addListener(type, callback){
    if(document.addEventListener){
        document.addEventListener(type, callback, false);
    }
    else if (document.attacheEvent) {
    document.attachEvent("on"+type, callback, false);
    }
}

// Fetch data - creates it's own XMLHttpRequestObject
function getDataImproved(dataSource, toDo, extraarg) {
    var putMessageHere = document.getElementById("MessagesHere");
    XMLHttpRequestObject = createAjaxObject();
    if(XMLHttpRequestObject) {
        reqMethod = (toDo == "headers") ? "HEAD" : "GET";
        XMLHttpRequestObject.open(reqMethod, dataSource);
         
        // Listen for change of state
        XMLHttpRequestObject.onreadystatechange=function(){
           // is the download complete?
            if(XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200){
                if (toDo){
                    switch(toDo) {
                        case ("eval"):
                            eval(XMLHttpRequestObject.responseText);
                        break;
                        
                        case("callBack") :
                           extraarg(XMLHttpRequestObject.responseText);
                        break;
                        
                        case("headers"):
                            var targetDiv = document.getElementById("targetDiv");
                            if (extraarg) {
                                targetDiv.innerHTML = "Header: " + extraarg + "<br />Value: " + 
                                XMLHttpRequestObject.getResponseHeader(extraarg);
                            }
                            else {
                                targetDiv.innerHTML = XMLHttpRequestObject.getAllResponseHeaders();
                            }
                        break;
                       
                        case("text"):
                            var targetDiv = document.getElementById(extraarg);
                            targetDiv.innerHTML = XMLHttpRequestObject.responseText;
                        break;
                        
                        default:
                        break;
                    }
                }
            }    
        };
      // no more data to send to server
      XMLHttpRequestObject.send(null);
    }    
}

// Fetch data - creates it's own XMLHttpRequestObject
function fetchInfo(urlToCall, reqMethod, fileFormat, functionToCallBack, extradata) {
    var putMessageHere = document.getElementById("MessagesHere");
    var XMLHttpRequestObject = false; 

    XMLHttpRequestObject = createAjaxObject();

    if(XMLHttpRequestObject) {
        XMLHttpRequestObject.open(reqMethod, urlToCall);
        if (reqMethod == "POST") { 
            XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        }

        XMLHttpRequestObject.onreadystatechange = function() 
        {
            if (XMLHttpRequestObject.readyState == 4 && 
            XMLHttpRequestObject.status == 200) {
                switch (fileFormat){
                    case ("text"):  
                        functionToCallBack(XMLHttpRequestObject.responseText);
                    break;
                
                    case ("xml"):  
                        functionToCallBack(XMLHttpRequestObject.responseXML);
                    break;
                
                    default:  //do nothing
                    break;
                }
                
                delete XMLHttpRequestObject;
                XMLHttpRequestObject = null;
            }
        };
        
     dataToSend = (extradata) ? extradata : "null";
     XMLHttpRequestObject.send(dataToSend); 
    }
}

function readTextWithGet(urlToCall, funcToCallBack) {
    fetchInfo(urlToCall, "GET", "text", funcToCallBack);
}

function readTextWithPost(urlToCall, dataToSend, funcToCallBack) {
    fetchInfo(urlToCall, "POST", "text", funcToCallBack, dataToSend);
}

function readXmlWithPost(urlToCall, dataToSend, funcToCallBack) {
    fetchInfo(urlToCall, "POST", "xml", funcToCallBack, dataToSend);
}

function readXmlWithGet(urlToCall, funcToCallBack) {
    fetchInfo(urlToCall, "GET", "xml", funcToCallBack);
}

// removes whitespace textnodes from XML for easier processing in Mozilla/Firefox
function removeWhitespace(xml) { 
    var loopindex;
    
    for (loopindex = 0; loopindex < xml.childNodes.length; loopindex++){
        var currentNode = xml.childNodes[loopindex];
        
        // if an element - pass back to function to handle all children of that element
        if(currentNode.nodeType == 1){ 
            removeWhitespace(currentNode);
        }
  
		// if a text element and only contains whitespace  
        if((currentNode.nodeType == 3) && ((/^\s+$/.test(currentNode.nodeValue)))){ 
            xml.removeChild(xml.childNodes[loopindex--]); // then remove it
        }
  
            
    }
}

function displayxml(xml) {
    xmlData=xml.getElementsByTagName("data");
    document.getElementById("targetDiv").innerHTML=xmlData[0].firstChild.data;
}

