var _baseURL = _baseURL == 'undefined' ? 'http://www.myenergyusage.org' : _baseURL;

function baseURL() {
    this.XMLHandler = _baseURL + '/PMOnline/xmlHandler.php';
    this.GlobalPower = _baseURL + '/PMOnline/GetGlobalPower.php';
    this.PasswordReset = _baseURL + '/PMOnline/PasswordReset.php';
    this.Connect = _baseURL + '/PMOnline/Connect.php';
    this.CreateUser = _baseURL + '/PMOnline/CreateUser.php';
    this.Logout = _baseURL + '/PMOnline/Logout.php';
    this.passwordResetRequest = _baseURL + '/PMOnline/passwordResetRequest.php';
    this.passwordReset = _baseURL + '/PMOnline/passwordReset.php';
    this.countryList = _baseURL + '/PMOnline/COuntryList.php';
    this.publicProfileRank = _baseURL + '/PMOnline/PublicUsers.php';
}
var bu = new baseURL();

function CreateXMLStringParser(xmlDoc, handShake, options) {
/*
    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;
    //    alert('AA' + xml.getElementsByTagName("root").length);
    if (options == null)
        options = {};
    var val = new validate(xml, handShake, options);
    if (!val.checkFatal()) return null;
    if (!val.checkErrors()) return null;
    if (!val.validateResponse()) return null;
    return xml;
}

function validate(xml, handShake, options) {
    this.handShake = handShake
    this.xml = xml;
    this.mustAbort = false;
    this.checkErrors = checkErrors;
    this.checkFatal = checkFatal;
    this.validateResponse = validateResponse;
    this.options = options;
}

function checkFatal() {
    if (this.xml == null) {
        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) {
        return false;
    }

    if (this.xml.getElementsByTagName("DebugPrompt").length > 0) {
        prompt("Debug Prompt", this.xml.getElementsByTagName("DebugPrompt")[0].firstChild.nodeValue);
        return false;
    }

    if (this.options.ignoreReconnect == null) {
        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.");
            PMOLogout();
            window.top.location.href = "/";
            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].firstChild.nodeValue);
    }
    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, options, 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 - 1);
    XMLLoader.setRequestHeader("Connection", "close");
    XMLLoader.send(strParams.replace("+", "%2B"));
    
    //prompt('', strParams.replace("+", "%2B"));
    //    alert(strParams);
    //    window.open(url + "?" + strParams);
    //    alert('ff' + XMLLoader.status)
    //    alert('|' + XMLLoader.responseText + '|')
    if (showDebug != undefined)
        alert("ResponseText:" + XMLLoader.responseText);
    //    alert('yy ' + XMLLoader.responseXML.xml);
    XMLObj = CreateXMLStringParser(XMLLoader.responseXML, handShake, options);

    return XMLObj;
}

function talkPost_async(url, paramList, callBack, 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 = function() {
        if (XMLLoader.readyState == 4) {
            if (XMLLoader.status == 200) {
                if (showDebug != undefined)
                    alert("ResponseText:\n" + XMLLoader.responseText);
                XMLObj = CreateXMLStringParser(XMLLoader.responseXML, handShake);
                eval(callBack + '(XMLObj)');
                //test(XMLObj);
            }
        }
    };
    XMLLoader.open("POST", url, true);
    XMLLoader.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    XMLLoader.setRequestHeader("Content-length", strParams.length - 1);
    XMLLoader.setRequestHeader("Connection", "close");
    XMLLoader.send(strParams);
}

function test(d) {
    alert(d);
}

function talkPost_open(functionList, showDebug) {
    
    if (functionList == undefined)
        throw new Error("Function list not supplied");

    var strParams = 'functions=' + functionList.toString();
    
    XMLLoader = CreateAJAXObject();
    XMLLoader.open("POST", bu.GlobalPower, false);
    XMLLoader.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    XMLLoader.setRequestHeader("Content-length", strParams.length - 1);
    XMLLoader.setRequestHeader("Connection", "close");
    XMLLoader.send(strParams);
    
    if (showDebug != undefined)
        alert("ResponseText:" + XMLLoader.responseText);

    //XMLObj = CreateXMLStringParser(XMLLoader.responseXML, '');

    return XMLLoader.responseXML;
}

function makeAuthDoc() {
    return "<auth><authKey>" + getCookie("authKey")  + "</authKey><authHash>" + getAuthHash() + "</authHash></auth>";
}