function CreateXMLStringParser(xmlDoc, handShake) {
/*
    try {
        var xmlParser = new DOMParser();
        var xmlDoc = xmlParser.parseFromString(XMLString, "text/xml");
    }
    catch (Err) {
        try {
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = "false";
            xmlDoc.loadXML(xmlDoc.xml);
//            alert(xmlDoc.childNodes)
        }
        catch (Err) {
            window.alert("Browser does not support XML parsing.");
            return false;
        }
    }
*/
    var xml = xmlDoc;
    var val = new validate(xml, handShake);
    if (!val.checkFatal()) return null;
    if (!val.checkErrors()) return null;
    if (!val.validateResponse()) return null;
    return xml;
}

function validate(xml, handShake) {
    this.handShake = handShake
    this.xml = xml;
    this.mustAbort = false;
    this.checkErrors = checkErrors;
    this.checkFatal = checkFatal;
    this.validateResponse = validateResponse;
}

function checkFatal() {
    if (this.xml == null) {
        PMError("Invalid call to validate.");
        return false;
    }
    var nodes = this.xml.getElementsByTagName("fatal");
    for (var i = 0; i <= nodes.length - 1; i++) {
        PMError(nodes[0].firstChild.nodeValue);
    }
    return (i == 0);
}

function validateResponse() {
    if (this.xml == null) {
        PMError("Invalid call to validate.");
        return false;
    }

    if (this.xml.getElementsByTagName("action").length > 0 && this.xml.getElementsByTagName("action")[0].firstChild.nodeValue == "Reconnect") {
        PMError("You have been logged out. Please log back in again.");
        window.location.href = "/Login";
        return false;
    }
    
    if (this.xml.getElementsByTagName("authKey").length == 0) {
        PMError("authKey was not found in the reponse.");
        return false;
    }
    if (this.xml.getElementsByTagName("handShake").length == 0) {
        PMError("handShake was not found in the reponse.");
        return false;
    }

    if (this.xml.getElementsByTagName("handShake")[0].firstChild == null) {
        PMError("handShake was not found in the reponse.");
        return false;
    }
    
    if (this.xml.getElementsByTagName("handShake")[0].firstChild.nodeValue != this.handShake) {
        PMError("handShake mismatch.");
        return false;
    }
    return true;
}

function checkErrors() {
    if (this.xml == null) {
        PMError("Invalid call to validate.");
        return false;
    }

    var nodes = this.xml.getElementsByTagName("error");
    
    for (var i = 0; i <= nodes.length - 1; i++) {
        PMError(nodes[0].text);
    }
    return (i == 0);
}

function CreateAJAXObject() {
    try {//Mozilla, Opera, and Safari
        AJAXObj = new XMLHttpRequest();
    }
    catch (err) {//Internet Explorer
        try {
            AJAXObj = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (err) {
            try {
                AJAXObj = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (err) {
              alert("Your browser does not support AJAX!");
            }
        }
    }
    return AJAXObj;
}


function postParam() {
    this.List = new Array();
    this.addParam = addParam;
    this.getListAsXML = getListAsXML;
    this.getListAsString = getListAsString;
    this.getListAsDoc = getListAsDoc;
}
function addParam(Name, Value) {
    var arr = new Array();
    arr[0] = Name;
    arr[1] = Value;
    this.List[this.List.length] = arr;
}
function getListAsXML() {
    var str = "";
    for (var i = 0; i <= this.List.length - 1; i++) {
        str += "<" + this.List[i][0] + ">" + this.List[i][1] + "</" + this.List[i][0] + ">"
    }
    return str
}
function getListAsDoc() {
    var str = "<root>" + this.getListAsXML() + "</root>";
    return str
}
function getListAsString() {
    var str = "";
    for (var i = 0; i <= this.List.length - 1; i++) {
        str += this.List[i][0] + "=" + this.List[i][1] + "&";
    }
    return str;
}

function talkPost_sync(url, paramList, showDebug) {
    handShake = getHandShake();

    var strParams = "";
    if (paramList == null) {
        paramList = new postParam();
    }
    
    paramList.addParam("handShake", handShake);
    paramList.addParam("loginLoc", 'web');
    strParams = paramList.getListAsString();

    XMLLoader = CreateAJAXObject();
    //    XMLLoader.onreadystatechange = ads
//    XMLLoader = new XMLHttpRequest();
    XMLLoader.open("POST", url, false);
    XMLLoader.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    XMLLoader.setRequestHeader("Content-length", strParams.length);
    XMLLoader.setRequestHeader("Connection", "close");
    XMLLoader.send(strParams);
//    alert('ff' + XMLLoader.status)
    //alert(XMLLoader.responseText)
    if (showDebug != undefined)
        alert(XMLLoader.responseText);

    XMLObj = CreateXMLStringParser(XMLLoader.responseXML, handShake);
    
    return XMLObj;
}

function makeAuthDoc(authKey, authHash) {
    return "<auth><authKey>" + authKey + "</authKey><authHash>" + authHash + "</authHash></auth>";
}