
function xmlreq()
{
    var req = false;
    /* branch for native XMLHttpRequest object */
    if(window.XMLHttpRequest) {
    	try {
            req = new XMLHttpRequest();
        } catch(e) {
            req = false;
        }
    /* branch for IE/Windows ActiveX version */
    } else if(window.ActiveXObject) {
       	try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                req = false;
            }
        }
    }
    return req;
}

function _xmlSend(method, url, e)
{
    var req = xmlreq();
    req.open(method, url, true);
    req.onreadystatechange = function() {
        /* only if req shows "loaded" */
        if (req.readyState == 4) {
            /* only if "OK" */
            if (req.status == 200) {
                e.innerHTML = req.responseText;
            }
        }
    }
    req.send("");
}

function sendPhp(url, e)
{
    _xmlSend("GET", url, e);
}

function urlencode(str) {
    return escape(str).replace(/[+]/g, '%2B');
}

String.prototype.urlencode = urlencode; 

function urldecode(str) {
    return unescape(str).replace(/%2B/g,'+');
}

String.prototype.urldecode = urldecode;

function xmlPost(form, elt, async)
{
    var req = xmlreq();
    req.open("POST", form.action, async);
    req.onreadystatechange = function() {
        /* only if req shows "loaded" */
        if (req.readyState == 4) {
            /* only if "OK" */
            if (req.status == 200) {
                if (elt) elt.innerHTML = req.responseText;
            }
        }
    }
    req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

    var data = "";
    for( var i=0; i<form.length; i++)
    {
        var e = form.elements[i];
        if (!e.name.length)
            continue;

        if (data.length)
            data += "&";

        if (e.type == "select-multiple") {
            for(var i=0; i<e.options.length; i++)
                if (e.options[i].selected) {
                    if (data.length)
                        data += "&";
                    data += e.name + "=" + urlencode(e.options[i].value);
                }
        } else {
            data += e.name + "=" + urlencode(e.value);
        }
    }

    req.send(data);
}

function xmlfetch(url, elt, async)
{
    var req = xmlreq();
    req.open("GET", url, async);
    req.onreadystatechange = function() {
        /* only if req shows "loaded" */
        if (req.readyState == 4) {
            /* only if "OK" */
            if (req.status == 200) {
                elt.innerHTML = req.responseText;
            }
        }
    }
    req.send(null);
}

function xmlGet(url, e)
{
    _xmlSend("GET", url, e);
}

function xmlsend(url,divId,iframeId,callback,async)
{
    var req = xmlreq();
    if (req) {
        req.onreadystatechange = function() {
            /* only if req shows "loaded" */
            if (req.readyState == 4) {
                var div = document.getElementById(divId);

                if (req.status == 404) {
                    div.innerHTML = "<h3>The content you requested was not found on the server.</h3>";
                }                    

                /* only if "OK" */
                if (req.status == 200) {

                    /* Find any <script> tags in the new content and exec them */
                    var scriptPat = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
                    var match    = new RegExp(scriptPat, 'img');
                    var response = req.responseText.replace(match, '');
                    div.innerHTML = response;

                    var scripts  = req.responseText.match(match);
                    if (scripts != null) {
                        match = new RegExp(scriptPat, 'im');
                        setTimeout(
                            function() {
                                for (var i = 0; i < scripts.length; i++) {
                                    var theMatches = scripts[i].match(match);
                                    if (theMatches[1].length) {
                                        var theScript = theMatches[1].replace(/\/\*.*\*\//,"").
                                            replace(/\/\/.*\n/," ").replace(/\n/g," ");
                                        eval(theScript);
                                    } else {
                                        /* Its an external file; load it and eval it */
                                        var srcPat = 'src="([^"]+)"';
                                        var srcMatch = new RegExp(srcPat, 'i');
                                        var srcFile = theMatches[0].match(srcMatch);

                                        /* Do an async request for the file and eval it */
                                        var srcReq = xmlreq();
                                        if (srcReq) {
                                            srcReq.onreadystatechange = function() {
                                                if (srcReq.readyState == 4) {
                                                    if (srcReq.status == 200 ) {
                                                        eval(srcReq.responseText);
                                                    }
                                                }
                                            }
                                            srcReq.open("GET",srcFile[1],true);
                                            srcReq.send("");
                                        } else
                                            alert("no srcReq!");
                                    }
                                }
                            }, 10);
                    }

                    if (callback)
                        callback();
                }
            }
        }
        var div = document.getElementById(divId);
        div.innerHTML = "Loading...";
        req.open("GET", url, true);
        req.send("");
    } else {
        var iframe = document.getElementById(iframeId);
        iframe.src = url;
        if (callback)
            callback();
    }
}

/* An AJAX method that results in XML from the server.
   The XML response includes information about where to put the returned
   content 
*/
function xmlupdate(url)
{
    var req = xmlreq();
    if (req) {
        req.onreadystatechange = function() {
            /* only if req shows "loaded" */
            if (req.readyState == 4) {
                /* only if "OK" */
                if (req.status == 200) {
                    /* Do something with the XML returned in */
                    /* req.responseXML */
                    var elements = req.responseXML.getElementsByTagName("item");
                    for(var i=0; i < elements.length; i++)
                    {
                        var elt = elements[i];
                        var tag = elt.getElementsByTagName("tag");
                        var content = elt.getElementsByTagName("content");

                        var target = document.getElementById(tag[0].childNodes[0].nodeValue);
                        var newP = document.createElement('p');
                        var newT = document.createTextNode(content[0].childNodes[0].nodeValue);
                        newP.appendChild(newT);
                        target.appendChild(newP);

/*                        target.innerHTML = content[0].childNodes[0].nodeValue; */
                    }
                }
            }
        }
        req.open("GET", url, true);
        req.send(null);
    }
}
