var xmlHttpFactories = [
    function () { return new XMLHttpRequest(); },
    function () { return new ActiveXObject("Msxml2.XMLHTTP"); },
    function () { return new ActiveXObject("MSxml3.XMLHTTP"); },
    function () { return new ActiveXObject("Microsoft.XMLHTTP"); }
];


function CreateXmlHttpRequest() {
    var xmlHttp = null;
    for (var i=0; i<xmlHttpFactories.length; ++i) {
        try {
            xmlHttp = xmlHttpFactories[i]();
        }
        catch (e) {
            continue;
        }
        break;
    }
    return xmlHttp;
}

//function ajaxPostForm(form, path, callback) {
//    var jsonData = {};
//
//    for (i=0; i<form.elements.length; i=i+1) {
//        if (form.elements.item(i).name) {
//            if (form.elements.item(i).type == "checkbox") {
//                jsonData[form.elements.item(i).name] = form.elements.item(i).checked;
//            } else {
//                jsonData[form.elements.item(i).name] = form.elements.item(i).value;
//            }
//        }
//    }
//
//    if (XMLHttpRequest) {
//        request = new XMLHttpRequest();
//    } else {
//        request = ActiveXObject('Microsoft.XMLHTTP');
//    }
//
//    request.onreadystatechange = function() {
//        if (request.readyState == 4) {
//            if (callback) {
//                callback(request)
//            }
//        }
//    }
//
//    request.open("POST", path, true);
//    request.setRequestHeader("Content-Type", "application/form-data+json"); 
//    request.send(JSONstring.make(jsonData));
//}


postSuccessCodes =  [200, 201, 204, 304, 1223];
getSuccessCodes  =  [200, 201, 204, 304, 1223];

function GetSucceeded(status) {
    return ArrayHasElement(getSuccessCodes, status);
}

function PostSucceeded(status) {
    return ArrayHasElement(postSuccessCodes, status);
}

function EncodeFormElements(form) {
    var params = "";
    for (var i=0; i<form.elements.length; i=i+1) {
        if (form.elements.item(i).name) {
            if (params != "") params += "&";
            if (form.elements.item(i).type == "checkbox") {
                /* Use "on" and "off" to match normal submission */
                if (form.elements.item(i).checked) {
                    params += form.elements.item(i).name + "=on";
                } else {
                    params += form.elements.item(i).name + "=off";
                }
            } else if (form.elements.item(i).type == "radio") {
                if (form.elements.item(i).checked) {
                    params += form.elements.item(i).name + "=" + escape(form.elements.item(i).value);
                }
            } else {
                params += form.elements.item(i).name + "=" + escape(form.elements.item(i).value);
            }
        }
    }
    params = params.replace("+", "%2b")
    params = params.replace("%20", "+")
    return params;
}

function ajaxPostForm(form, path, callback, callbackParams) {
    params = EncodeFormElements(form);

    var request = CreateXmlHttpRequest();

    request.open("POST", path, true);

    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if (callbackParams) {
                callback(request, callbackParams);
            } else {
                callback(request);
            }
        }
    }

    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("Content-length", params.length);
    request.setRequestHeader("Connection", "close"); 
    request.send(params);
}
//    request.open("POST", path, true);
//    request.setRequestHeader("Content-Type", "application/form-data+json"); 



function ajaxPostData (url, data, successHandler, errorHandler, mimeType) {

    var request = CreateXmlHttpRequest();

    request.open("POST", url, true);

    
    request.onreadystatechange=function() {
        if (request.readyState == 4) {
            if (ArrayHasElement(postSuccessCodes, request.status)) {
                if (successHandler) {
                    successHandler(request.responseText);
                }
            } else {
                if (errorHandler) {
                    errorHandler(request.status, request.responseText);
                }
            }
        }
    }
    if (mimeType) {
        request.setRequestHeader("Content-type", mimeType);
    } else {
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    }
    request.setRequestHeader("Content-length", data.length);
    request.setRequestHeader("Connection", "close"); 

    request.send(data);
    return false;
}


function ajaxGet (url, successHandler, errorHandler, callbackParms) {
    var request = CreateXmlHttpRequest();
    request.open("GET", url, true);
    request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if (ArrayHasElement(getSuccessCodes, request.status)) {
                if (successHandler) {
                    if (callbackParms) {
                        successHandler(request.responseText,callbackParms)
                    } else {
                        successHandler(request.responseText)
                    }
                }
            } else {

                if (errorHandler) {
                    if (callbackParms) {
                        errorHandler(request.status,
                                     request.responseText,
                                     callbackParms);
                    } else {
                        errorHandler(request.status,
                                     request.responseText)
                    }
                }
            }
        }
    }
    request.send(null);
}

function HtmlEscape(str) {
    return str. 
        replace(/&/g, "&amp;").
        replace(/</g, "&lt;").
        replace(/>/g, "&gt;").
        replace(/"/g, "&quot;").
        replace(/'/g, "&apos;");
}


var _scriptExecuted = false;

/*
 * Run a script that comes inside an Ajax snippet.  You need to refer
 * to the script by ID for now.
 */
function RunAjaxScript(responseText, ajaxScriptId, pageScriptId) {
    var head = document.getElementsByTagName("head")[0];
    var oldScript = document.getElementById(pageScriptId);
    if (oldScript) {
        head.removeChild(oldScript);
    }

    var fetchScript = document.getElementById(ajaxScriptId);
    if (fetchScript == null) {
    /* 
     * IE can't fetch the script by ID, this can also be executed if there's no matching script.
     * We use a regex to search for the script inside the snippet.  This assumes the snippet is
     * well-formed.
     */
        var re = /<script.*?id=\"([^\"]+)\".*?>([\s\S]*)<\/script>/ig;
        var match;

        while (match = re.exec(responseText)) {
            if (match[1] == ajaxScriptId) {
                eval(match[2]);
                break;
            }
        }
    } else {
    /* 
     * Firefox, Safari end up here if the script exists (they can all find the new items inserted into the DOM)
     */
        _scriptExecuted = false;

        var newScript = document.createElement("script");
        newScript.type = "text/javascript";
        newScript.id = pageScriptId;
        newScript.innerHTML = fetchScript.innerHTML;

        /* Firefox will execute the script here when we do this */
        head.appendChild(newScript);

        /* Safari (and possibly others) won't, so we need to check and execute if not */
        if (!_scriptExecuted) {
            eval(fetchScript.innerText);
        }
    }
}
