/*
 *funções utilitárias para requisições AJAX
 */

function envia_ajax(metodo, url, usaXml, dados, callback) {
    var httpRequest;

    // Mozilla, Safari, Opera, ...
    if (window.XMLHttpRequest) {
        httpRequest = new XMLHttpRequest();
        if (usaXml && httpRequest.overrideMimeType) {
            httpRequest.overrideMimeType('text/xml');
        }
    } 
    // IE
    else if (window.ActiveXObject) {
        try {
            httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (e) {
            try {
                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } 
            catch (e) {}
        }
    }

    if (!httpRequest) {
        alert('Erro fatal :( Não consigo criar um objeto XMLHttpRequest');
        return false;
    }
    
    httpRequest.open(metodo, url, true);

    if (callback != null) {
        httpRequest.onreadystatechange = function() {
            retorna_ajax(metodo, url, httpRequest, callback);
        };
    }
    
    if (metodo == 'POST' && dados != null) {
        httpRequest.setRequestHeader('Content-Type',
            'application/x-www-form-urlencoded');
    }

    httpRequest.send(dados);
}

function retorna_ajax (metodo, url, httpRequest, callback) {
    if (httpRequest.readyState == 4) {
        if (httpRequest.status == 200) {
            if (callback != null) {
                callback(httpRequest);
            }
        }
        else {
            alert('Erro de AJAX: ' + httpRequest.status + '\n'
                + metodo + ': ' + url);
        }
    }
}

function codifica_form(docForm) {

    var submitContent = '';
    var formElem;
    var lastElemName = '';
    
    for (i = 0; i < docForm.elements.length; i++) {
        
        formElem = docForm.elements[i];
        switch (formElem.type) {
            // Text fields, hidden form elements
            case 'text':
            case 'hidden':
            case 'password':
            case 'textarea':
            case 'select-one':
                submitContent += formElem.name + '=' + escape(formElem.value) + '&'
                break;
                
            // Radio buttons
            case 'radio':
                if (formElem.checked) {
                    submitContent += formElem.name + '=' + escape(formElem.value) + '&'
                }
                break;
                
            // Checkboxes
            case 'checkbox':
                if (formElem.checked) {
                    // Continuing multiple, same-name checkboxes
                    if (formElem.name == lastElemName) {
                        // Strip of end ampersand if there is one
                        if (submitContent.lastIndexOf('&') == submitContent.length-1) {
                            submitContent = submitContent.substr(0, submitContent.length - 1);
                        }
                        // Append value as comma-delimited string
                        submitContent += ',' + escape(formElem.value);
                    }
                    else {
                        submitContent += formElem.name + '=' + escape(formElem.value);
                    }
                    submitContent += '&';
                    lastElemName = formElem.name;
                }
                break;
                
        }
    }
    // Remove trailing separator
    submitContent = submitContent.substr(0, submitContent.length - 1);
    return submitContent;
}
