function createXMLHttpRequest() {
    var req;
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return req;
}
function getUrlParameters(form) {
    var elements = form.elements;
    var urlParameters = '';
    for(i=0; i < elements.length; i++)
    {
       //alert(escape(elements[i].value));
       urlParameters += elements[i].name + '=' + encodeURIComponent(elements[i].value);

       if(i != elements.length - 1) urlParameters += '&';
    }
    return urlParameters;
}

function postDivForm(form, divId, statusDiv) {
    var targetDiv = document.getElementById(divId + 'Div');
    var req = createXMLHttpRequest();
    req.open("POST", form.action, true);
    req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    req.onreadystatechange = function(){
        if (req.readyState == 4) {
            if(req.responseText.match('<title>Login</title>')) {
                signIn();
            } else if(req.status != 200) {
                targetDiv.innerHTML = 'Error! Action failed';
            } else {
                //alert(req.responseText);
                targetDiv.innerHTML = req.responseText;
                if(statusDiv) statusDiv.style.display = 'none';
                initNav(divId);
            }
        } else {
            if(statusDiv) statusDiv.style.display = 'block';
            else targetDiv.innerHTML = 'Processing..';
        }
    };
    var urlParameters = getUrlParameters(form);
    req.send(urlParameters);
}

function asyncFormPost(form, divId, processText, doneText, onSuccess, noHide) {
    var targetDiv = document.getElementById(divId + 'Div');
    var targetLink = document.getElementById(divId + 'Link');
    if(!noHide) hideAsyncLink(divId);
    var req = createXMLHttpRequest();
    req.open("POST", form.action, true);
    req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    req.onreadystatechange = function(){
        if (req.readyState == 4) {
            if(req.responseText.match('<title>Login</title>')) {
                signIn();
            } else if(req.status != 200) {
                alert(req.responseText);
                targetDiv.innerHTML = 'Error! Action failed';
            } else if(req.responseText.match('Please correct the following')) {
                if(!noHide) showAsyncLink(divId);
                alert(req.responseText);
            } else {
                if(onSuccess) onSuccess(req);
                targetDiv.innerHTML = doneText;
            }
        } else {
            targetDiv.innerHTML = processText;
        }
    };
    var urlParameters = getUrlParameters(form);
    req.send(urlParameters);
}

function fetchDivContent(url, divId, statusDiv) {
    //alert(url);
    var targetDiv = document.getElementById(divId + 'Div');
    var req = createXMLHttpRequest();
    req.onreadystatechange = function(){
        if (req.readyState == 4) {
            if(req.responseText.match('<title>Login</title>')) {
                signIn();
            } else if(req.status != 200) {
                targetDiv.innerHTML = 'Error! Loading failed';
            } else {
                targetDiv.innerHTML = req.responseText;
                //targetDiv.appendChild(document.createNode(req.responseText));
                if(statusDiv) statusDiv.style.display = 'none';
                initNav(divId);
            }
        } else {
            if(statusDiv) statusDiv.style.display = 'block';
            else targetDiv.innerHTML = '<h5>Loading..</h5>';
        }
    };
    req.open('GET', url, true);
    req.send(null);
}

function asyncGetUrl(url, statusDivId, callbackFunction) {
    asyncGetUrl(url, statusDivId, callbackFunction, 'inline');
}

function asyncGetUrl(url, statusDivId, callbackFunction, display) {
    statusDiv = document.getElementById(statusDivId);
    statusDiv.innerHTML = 'Loading..';
    statusDiv.style.display = display;
    var req = createXMLHttpRequest();
    req.onreadystatechange = function(){
        if (req.readyState == 4) {
            if(req.responseText.match('<title>Login</title>')) {
                signIn();
            } else if(req.status != 200) {
                statusDiv.innerHTML = 'Error! Loading failed';
            } else {
                statusDiv.style.display = 'none';
                callbackFunction(req);
            }
        } else {
            statusDiv.style.display = display;
        }
    };
    req.open('GET', url, true);
    req.send(null);
}

function getUrl(url) {
    var req;
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        //req.onreadystatechange = processReqChange;
        req.open("GET", url, false);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        isIE = true;
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            //req.onreadystatechange = processReqChange;
            req.open("GET", url, false);
            req.send();
        }
    }
    if(req.status != 200) alert('Operation Failed');
    if(req.responseText.match('j_username')) {
        signIn();
    }
    return req;
}

function postForm(form, asynchronous) {
    var req = createXMLHttpRequest();
    req.open("POST", form.action, asynchronous);
    req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    var urlParameters = getUrlParameters(form);
    if(!asynchronous) {
        req.send(urlParameters);
        if(req.status != 200) alert('Operation Failed');
        if(req.responseText.match('j_username')) {
            signIn();
        }
    } else {
        req.onreadystatechange = function(){
            if (req.readyState == 4) {
                if(req.responseText.match('<title>Login</title>')) {
                    signIn();
                } else if(req.status != 200) {
                    alert(req.responseText);
                    targetDiv.innerHTML = 'Error! Action failed';
                } else if(req.responseText.match('Please correct the following')) {
                    alert(req.responseText);
                }
            }
        };
        req.send(urlParameters);
    }
    return req;
}

function signIn() {
    top.location= '/protected/loginRedirect.do?url=' + escape(top.document.location);
}

function hasSessionExpired() {
    var req = getUrl('/editor/blank.htm');
    return req.responseText.match('j_username');
}

function getUniqueValue(req, tag) {
    var items = req.responseXML.getElementsByTagName(tag)
    if(items.length !=1) alert('Error getting ' + tag + '!');
    return items[0].firstChild.nodeValue;
}
